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