1 /* { dg-do compile } */
2 /* { dg-require-effective-target powerpc_p8vector_ok } */
3 /* { dg-require-effective-target int128 } */
4 /* { dg-options "-mpower8-vector -O2" } */
8 /* Test POWER8 vector built-ins added for version 1.1 of ELFv2 ABI. */
10 vector
signed char vsca
, vscb
, vscc
;
11 vector
unsigned char vuca
, vucb
, vucc
;
12 vector
signed short vssa
, vssb
;
13 vector
bool char vbca
, vbcb
;
14 vector
unsigned short vusa
, vusb
;
15 vector
bool short vbsa
, vbsb
;
16 vector
signed int vsia
, vsib
, vsic
;
17 vector
unsigned int vuia
, vuib
, vuic
;
18 vector
bool int vbia
, vbib
;
19 vector
signed long long vsla
, vslb
;
20 vector
unsigned long long vula
, vulb
, vulc
;
21 vector
bool long long vbla
, vblb
, vblc
;
22 vector
signed __int128 vsxa
, vsxb
, vsxc
;
23 vector
unsigned __int128 vuxa
, vuxb
, vuxc
;
24 vector
double vda
, vdb
;
26 void foo (vector
signed char *vscr
,
27 vector
unsigned char *vucr
,
28 vector
bool char *vbcr
,
29 vector
signed short *vssr
,
30 vector
unsigned short *vusr
,
31 vector
bool short *vbsr
,
32 vector
signed int *vsir
,
33 vector
unsigned int *vuir
,
34 vector
bool int *vbir
,
35 vector
unsigned long long *vulr
,
36 vector
bool long long *vblr
,
37 vector
signed __int128
*vsxr
,
38 vector
unsigned __int128
*vuxr
,
41 *vsir
++ = vec_addc (vsia
, vsib
);
42 *vuir
++ = vec_addc (vuia
, vuib
);
43 *vsxr
++ = vec_addc (vsxa
, vsxb
);
44 *vuxr
++ = vec_addc (vuxa
, vuxb
);
45 *vsir
++ = vec_adde (vsia
, vsib
, vsic
);
46 *vuir
++ = vec_adde (vuia
, vuib
, vuic
);
47 *vsxr
++ = vec_adde (vsxa
, vsxb
, vsxc
);
48 *vuxr
++ = vec_adde (vuxa
, vuxb
, vuxc
);
49 *vsir
++ = vec_addec (vsia
, vsib
, vsic
);
50 *vuir
++ = vec_addec (vuia
, vuib
, vuic
);
51 *vsxr
++ = vec_addec (vsxa
, vsxb
, vsxc
);
52 *vuxr
++ = vec_addec (vuxa
, vuxb
, vuxc
);
53 *vscr
++ = vec_adds (vsca
, vscb
);
54 *vucr
++ = vec_adds (vuca
, vucb
);
55 *vsir
++ = vec_adds (vsia
, vsib
);
56 *vuir
++ = vec_adds (vuia
, vuib
);
57 *vssr
++ = vec_adds (vssa
, vssb
);
58 *vusr
++ = vec_adds (vusa
, vusb
);
59 *vscr
++ = vec_adds (vbca
, vscb
);
60 *vscr
++ = vec_adds (vsca
, vbcb
);
61 *vucr
++ = vec_adds (vbca
, vucb
);
62 *vucr
++ = vec_adds (vuca
, vbcb
);
63 *vsir
++ = vec_adds (vbia
, vsib
);
64 *vsir
++ = vec_adds (vsia
, vbib
);
65 *vuir
++ = vec_adds (vbia
, vuib
);
66 *vuir
++ = vec_adds (vuia
, vbib
);
67 *vssr
++ = vec_adds (vbsa
, vssb
);
68 *vssr
++ = vec_adds (vssa
, vbsb
);
69 *vusr
++ = vec_adds (vbsa
, vusb
);
70 *vusr
++ = vec_adds (vusa
, vbsb
);
71 *vucr
++ = vec_bperm (vuca
, vucb
);
72 *vulr
++ = vec_bperm (vuxa
, vucb
);
73 *vbcr
++ = vec_eqv (vbca
, vbcb
);
74 *vbir
++ = vec_eqv (vbia
, vbib
);
75 *vblr
++ = vec_eqv (vbla
, vblb
);
76 *vbsr
++ = vec_eqv (vbsa
, vbsb
);
77 *vucr
++ = vec_gb (vuca
);
78 *vbcr
++ = vec_nand (vbca
, vbcb
);
79 *vbir
++ = vec_nand (vbia
, vbib
);
80 *vblr
++ = vec_nand (vbla
, vblb
);
81 *vbsr
++ = vec_nand (vbsa
, vbsb
);
82 *vbcr
++ = vec_orc (vbca
, vbcb
);
83 *vbir
++ = vec_orc (vbia
, vbib
);
84 *vblr
++ = vec_orc (vbla
, vblb
);
85 *vbsr
++ = vec_orc (vbsa
, vbsb
);
86 *vblr
++ = vec_perm (vbla
, vblb
, vucc
);
87 *vusr
++ = vec_pmsum_be (vuca
, vucb
);
88 *vuir
++ = vec_pmsum_be (vusa
, vusb
);
89 *vulr
++ = vec_pmsum_be (vuia
, vuib
);
90 *vuxr
++ = vec_pmsum_be (vula
, vulb
);
91 *vuir
++ = vec_shasigma_be (vuia
, 0, 1);
92 *vulr
++ = vec_shasigma_be (vula
, 0, 1);
93 *vsir
++ = vec_subc (vsia
, vsib
);
94 *vuir
++ = vec_subc (vuia
, vuib
);
95 *vsxr
++ = vec_subc (vsxa
, vsxb
);
96 *vuxr
++ = vec_subc (vuxa
, vuxb
);
97 *vsir
++ = vec_sube (vsia
, vsib
, vsic
);
98 *vuir
++ = vec_sube (vuia
, vuib
, vuic
);
99 *vsxr
++ = vec_sube (vsxa
, vsxb
, vsxc
);
100 *vuxr
++ = vec_sube (vuxa
, vuxb
, vuxc
);
101 *vsir
++ = vec_subec (vsia
, vsib
, vsic
);
102 *vuir
++ = vec_subec (vuia
, vuib
, vuic
);
103 *vsxr
++ = vec_subec (vsxa
, vsxb
, vsxc
);
104 *vuxr
++ = vec_subec (vuxa
, vuxb
, vuxc
);
105 *vscr
++ = vec_subs (vsca
, vscb
);
106 *vucr
++ = vec_subs (vuca
, vucb
);
107 *vsir
++ = vec_subs (vsia
, vsib
);
108 *vuir
++ = vec_subs (vuia
, vuib
);
109 *vssr
++ = vec_subs (vssa
, vssb
);
110 *vusr
++ = vec_subs (vusa
, vusb
);
111 *vsir
++ = vec_sum2s (vsia
, vsib
);
112 *vsir
++ = vec_sum4s (vsca
, vsib
);
113 *vsir
++ = vec_sum4s (vssa
, vsib
);
114 *vuir
++ = vec_sum4s (vuca
, vuib
);
118 /* { dg-final { scan-assembler-times "vaddcuq" 2 } } */
119 /* { dg-final { scan-assembler-times "vaddeuqm" 2 } } */
120 /* { dg-final { scan-assembler-times "vaddecuq" 2 } } */
121 /* { dg-final { scan-assembler-times "vaddcuw" 6 } } */
122 /* { dg-final { scan-assembler-times "vadduwm" 4 } } */
123 /* { dg-final { scan-assembler-times "vsubcuq" 2 } } */
124 /* { dg-final { scan-assembler-times "vsubeuqm" 2 } } */
125 /* { dg-final { scan-assembler-times "vsubecuq" 2 } } */
126 /* { dg-final { scan-assembler-times "vsubcuw" 4 } } */
127 /* { dg-final { scan-assembler-times "vsubuwm" 4 } } */
128 /* { dg-final { scan-assembler-times "vbpermq" 2 } } */
129 /* { dg-final { scan-assembler-times "xxleqv" 4 } } */
130 /* { dg-final { scan-assembler-times "vgbbd" 1 } } */
131 /* { dg-final { scan-assembler-times "xxlnand" 4 } } */
132 /* { dg-final { scan-assembler-times "xxlorc" 4 } } */
133 /* { dg-final { scan-assembler-times "vperm" 1 } } */
134 /* { dg-final { scan-assembler-times "vpmsumb" 1 } } */
135 /* { dg-final { scan-assembler-times "vpmsumh" 1 } } */
136 /* { dg-final { scan-assembler-times "vpmsumw" 1 } } */
137 /* { dg-final { scan-assembler-times "vpmsumd" 1 } } */
138 /* { dg-final { scan-assembler-times "vshasigmaw" 1 } } */
139 /* { dg-final { scan-assembler-times "vshasigmad" 1 } } */
140 /* { dg-final { scan-assembler-times "vsubsbs" 1 } } vec_subs */
141 /* { dg-final { scan-assembler-times "vsububs" 1 } } vec_subs */
142 /* { dg-final { scan-assembler-times "vsubsws" 1 } } vec_subs */
143 /* { dg-final { scan-assembler-times "vsubuws" 1 } } vec_subs */
144 /* { dg-final { scan-assembler-times "vsubshs" 1 } } vec_subs */
145 /* { dg-final { scan-assembler-times "vsubuhs" 1 } } vec_subs */
146 /* { dg-final { scan-assembler-times "vsum2sws" 1 } } vec_sum2s */
147 /* { dg-final { scan-assembler-times "vsum4sws" 0 } } vec_sum4s */
148 /* { dg-final { scan-assembler-times "vsum4shs" 1 } } vec_sum4s */
149 /* { dg-final { scan-assembler-times "vsum4ubs" 1 } } vec_sum4s */