1 /* { dg-do compile } */
2 /* { dg-require-effective-target powerpc_vsx_ok } */
3 /* { dg-options "-mvsx -mno-power8-vector -O2" } */
4
5 #include <altivec.h>
6
7 /* Test VSX built-ins added for version 1.1 of ELFv2 ABI. */
8
9 vector bool long long vbla, vblb, vblc;
10 vector bool char vbca, vbcb, vbcc;
11 vector bool int vbia, vbib, vbic;
12 vector signed char vsca, vscb, vscc;
13 vector unsigned char vuca, vucb, vucc;
14 vector signed int vsia, vsib, vsic;
15 vector unsigned int vuia, vuib, vuic;
16
17 vector unsigned long long vulla, vullb, vullc;
18 vector signed long long vslla, vsllb, vsllc;
19 vector bool long long vblla, vbllb, vbllc;
20 vector bool short int vbsia, vbsib, vbsic;
21 vector signed short int vssia, vssib, vssic;
22 vector unsigned short int vusia, vusib, vusic;
23 vector double vda, vdb;
24 vector float vfa, vfb;
25
foo(vector bool long long * vblr,vector double * vdr,vector unsigned long long * vullz,vector double * vdz,vector bool char * vbcz,vector signed char * vscz,vector unsigned char * vucz,vector bool int * vbiz,vector int * viz,vector unsigned int * vuiz,vector signed long long int * vslliz,vector bool short int * vbsiz,vector signed short int * vssiz,vector unsigned short int * vusiz,vector float * vfz)26 void foo (vector bool long long *vblr,
27 vector double *vdr, vector unsigned long long *vullz,
28 vector double *vdz, vector bool char *vbcz,
29 vector signed char *vscz, vector unsigned char *vucz,
30 vector bool int *vbiz, vector int *viz,
31 vector unsigned int *vuiz, vector signed long long int *vslliz,
32 vector bool short int *vbsiz, vector signed short int *vssiz,
33 vector unsigned short int *vusiz, vector float *vfz)
34 {
35 *vblr++ = vec_andc (vbla, vblb);
36 *vdr++ = vec_double (vslla);
37 *vdr++ = vec_double (vulla);
38
39 *vblr++ = vec_mergeh (vbla, vblb);
40 *vblr++ = vec_mergel (vbla, vblb);
41 *vblr++ = vec_nor (vbla, vblb);
42 *vblr++ = vec_or (vbla, vblb);
43 *vblr++ = vec_sel (vbla, vblb, vblc);
44 *vblr++ = vec_sel (vbla, vblb, vullc);
45 *vblr++ = vec_xor (vbla, vblb);
46
47 *vullz++ = vec_sel (vulla, vullb, vbllc);
48 *vullz++ = vec_sel (vulla, vullb, vullc);
49
50 *vdz++ = vec_sel(vda, vdb, vullc);
51
52 *vbcz++ = vec_sel (vbca, vbcb, vbcc);
53 *vbcz++ = vec_sel (vbca, vbcb, vucc);
54 *vbcz++ = vec_xor (vbca, vbcb);
55 *vscz++ = vec_sel (vsca, vscb, vbcc);
56 *vscz++ = vec_sel (vsca, vscb, vucc);
57 *vucz++ = vec_sel (vuca, vucb, vbcc);
58 *vucz++ = vec_sel (vuca, vucb, vucc);
59
60 *vbiz++ = vec_sel (vbia, vbib, vbic);
61 *vbiz++ = vec_sel (vbia, vbib, vuic);
62 *vbiz++ = vec_xor (vbia, vbib);
63 *viz++ = vec_sel (vsia, vsib, vbic);
64 *viz++ = vec_sel (vsia, vsib, vuic);
65 *vuiz++ = vec_sel (vuia, vuib, vbic);
66 *vuiz++ = vec_sel (vuia, vuib, vuic);
67
68 *vslliz++ = vec_sel(vslla, vsllb, vbllc);
69 *vslliz++ = vec_sel(vslla, vsllb, vullc);
70
71 *vssiz++ = vec_sel(vssia, vssib, vbsic);
72 *vssiz++ = vec_sel(vssia, vssib, vusic);
73 *vusiz++ = vec_sel(vusia, vusib, vbsic);
74 *vusiz++ = vec_sel(vusia, vusib, vusic);
75
76 *vbsiz++ = vec_sel (vbsia, vbsib, vbsic);
77 *vbsiz++ = vec_sel (vbsia, vbsib, vusic);
78 *vbsiz++ = vec_xor (vbsia, vbsib);
79
80 *vdz++ = vec_sel (vda, vdb, vbllc);
81 *vfz++ = vec_sel (vfa, vfb, vbic);
82 *vfz++ = vec_sel (vfa, vfb, vuic);
83 *vfz++ = vec_xor (vfa, vfb);
84 }
85
86 /* { dg-final { scan-assembler-times "xxlandc" 1 } } */
87 /* { dg-final { scan-assembler-times "xvcvsxddp" 1 } } */
88 /* { dg-final { scan-assembler-times "xvcvuxddp" 1 } } */
89 /* { dg-final { scan-assembler-times "xxpermdi .*,.*,.*,3" 1 } } */
90 /* { dg-final { scan-assembler-times "xxpermdi .*,.*,.*,0" 1 } } */
91 /* { dg-final { scan-assembler-times "xxlnor" 1 } } */
92 /* { dg-final { scan-assembler-times "xxlor" 1 } } */
93 /* { dg-final { scan-assembler-times "xxsel" 28 } } */
94 /* { dg-final { scan-assembler-times "xxlxor" 5 } } */
95