1 /* { dg-do compile } */
2 /* { dg-require-effective-target powerpc_p8vector_ok } */
3 /* { dg-options "-mdejagnu-cpu=power8 -O0 -mno-fold-gimple -dp" } */
4 /* { dg-prune-output "gimple folding of rs6000 builtins has been disabled." } */
5 
6 #include <altivec.h>
7 
8 vector double y = { 2.0, 4.0 };
9 vector double z;
10 
main()11 int main ()
12 {
13   vector float fa = {1.0, 2.0, 3.0, -4.0};
14   vector float fb = {-2.0, -3.0, -4.0, -5.0};
15   vector float fd = vec_and (fa, fb);
16   vector float fc = vec_cpsgn (fa, fb);
17   vector float fe = vec_mergeh (fa, fb);
18   vector float ff = vec_mergel (fa, fb);
19 
20   vector double da = {1.0, 2.0};
21   vector double db = {-2.0, -3.0};
22   vector double dz = vec_and (da, db);
23 
24   vector signed int si_a = {1, 2, 3, 4};
25   vector unsigned int ui_a = {1, 2, 3, 4};
26 
27   vector long long la = {5L, 14L};
28   vector long long lb = {3L, 86L};
29   vector long long lc = vec_and (la, lb);
30   vector bool long long ld = {0, -1};
31   vector long long le = vec_and (la, ld);
32   vector long long lf = vec_and (ld, lb);
33 
34   vector unsigned long long ua = {5L, 14L};
35   vector unsigned long long ub = {3L, 86L};
36   vector unsigned long long uc = vec_and (ua, ub);
37   vector bool long long ud = {0, -1};
38   vector unsigned long long ue = vec_and (ua, ud);
39   vector unsigned long long uf = vec_and (ud, ub);
40 
41   vector long long lg = vec_andc (la, lb);
42   vector long long lh = vec_andc (la, ld);
43   vector long long li = vec_andc (ld, lb);
44 
45   vector unsigned long long ug = vec_andc (ua, ub);
46   vector unsigned long long uh = vec_andc (ua, ud);
47   vector unsigned long long ui = vec_andc (ud, ub);
48 
49   vector double de = {1.0, -4.0};
50   vector double df = {-2.0, 5.0};
51   vector double dg = vec_cpsgn (de, df);
52   vector double dzw = vec_mergeh (de, df);
53   vector double dze = vec_mergel (de, df);
54 
55   vector long long lj = vec_mergeh (la, lb);
56   vector long long lk = vec_mergeh (la, ld);
57   vector long long ll = vec_mergeh (ld, la);
58 
59   vector unsigned long long uj = vec_mergeh (ua, ub);
60   vector unsigned long long uk = vec_mergeh (ua, ud);
61   vector unsigned long long ul = vec_mergeh (ud, ua);
62 
63   vector pixel pa = {9, 16, 25, 36, 1, 2, 3, 4};
64   vector pixel pb = {25, 36, 1, 2, 45, 3, 4, 99};
65   vector pixel pc = vec_mergeh (pa, pb);
66   vector pixel pd = vec_mergel (pa, pb);
67 
68   vector long long lm = vec_mergel (la, lb);
69   vector long long ln = vec_mergel (la, ld);
70   vector long long lo = vec_mergel (ld, la);
71 
72   vector unsigned long long um = vec_mergel (ua, ub);
73   vector unsigned long long un = vec_mergel (ua, ud);
74   vector unsigned long long uo = vec_mergel (ud, ua);
75 
76   vector long long lp = vec_nor (la, lb);
77   vector long long lq = vec_nor (la, ld);
78   vector long long lr = vec_nor (ld, la);
79 
80   vector unsigned long long up = vec_nor (ua, ub);
81   vector unsigned long long uq = vec_nor (ua, ud);
82   vector unsigned long long ur = vec_nor (ud, ua);
83 
84   vector unsigned char ca = {0,4,8,1,5,9,2,6,10,3,7,11,15,12,14,13};
85   vector unsigned char cbb = {5,4,8,3,1,9,2,6,10,3,7,11,15,12,14,13};
86 
87   vector unsigned char ucba = {5,4,8,3,1,9,2,6,10,3,7,11,15,12,14,13};
88   vector unsigned char ucbb = {5,4,8,3,1,9,2,6,10,3,7,11,15,12,14,13};
89   vector unsigned char ucbc = {5,4,8,3,1,9,2,6,10,3,7,11,15,12,14,13};
90 
91   vector long long lv = vec_perm (la, lb, ca);
92 
93   vector unsigned char  ucm = vec_and (ca, cbb);
94   vector unsigned char  ucn = vec_andc (ca, cbb);
95   vector unsigned char  uco = vec_mergel (ca, cbb);
96 
97   vector unsigned long long uv = vec_perm (ua, ub, ca);
98 
99   vector long long lx = vec_sel (la, lb, uc);
100   vector long long ly = vec_sel (la, lb, ld);
101 
102   vector unsigned long long uw = vec_sel (ua, ub, lc);
103   vector unsigned long long ux = vec_sel (ua, ub, uc);
104   vector unsigned long long uy = vec_sel (ua, ub, ld);
105 
106   vector long long lz = vec_xor (la, lb);
107   vector long long l0 = vec_xor (la, ld);
108   vector long long l1 = vec_xor (ld, la);
109 
110   vector unsigned long long uz = vec_xor (ua, ub);
111   vector unsigned long long u0 = vec_xor (ua, ud);
112   vector unsigned long long u1 = vec_xor (ud, ua);
113 
114   int ia = vec_all_eq (ua, ub);
115   int ib = vec_all_ge (ua, ub);
116   int ic = vec_all_gt (ua, ub);
117   int id = vec_all_le (ua, ub);
118   int ie = vec_all_lt (ua, ub);
119   int ig = vec_all_ne (ua, ub);
120 
121   int ih = vec_any_eq (ua, ub);
122   int ii = vec_any_ge (ua, ub);
123   int ij = vec_any_gt (ua, ub);
124   int ik = vec_any_le (ua, ub);
125   int il = vec_any_lt (ua, ub);
126   int im = vec_any_ne (ua, ub);
127 
128   vector short ssa = {9, 16, 25, 36, 1, 2, 3, 4};
129   vector short ssb = {-8, -27, -64, -125, 2, 3, 5, 3};
130   vector short sscc = vec_and (ssa, ssb);
131   vector short sscd = vec_mergeh (ssa, ssb);
132   vector short ssce = vec_mergel (ssa, ssb);
133 
134   vector int sia = {9, 16, 25, 36};
135   vector int sib = {-8, -27, -64, -125};
136   vector int sicc = vec_and (sia, sib);
137   vector int sicd = vec_andc (sia, sib);
138   vector int sig = vec_mergel (sia, sib);
139 
140   vector unsigned int uia = {9, 16, 25, 36};
141   vector unsigned int uib = {8, 27, 64, 125};
142   vector unsigned int uicc = vec_and (uia, uib);
143   vector unsigned int uidd = vec_andc (uia, uib);
144   vector unsigned int uig = vec_mergel (uia, uib);
145 
146   vector bool char bca = {0, 1, 4, 7};
147   vector bool char bcb = {-8, 9, 2, 9};
148   vector bool char bcc = vec_and (bca, bcb);
149   vector bool char bcd = vec_andc (bca, bcb);
150   vector bool char bce = vec_mergel (bca, bcb);
151 
152   vector bool short bsa = {0, -1, -1, 0, 3, 4, 6, 7};
153   vector bool short bsb = {-1, -1, 0, -1, 0, 0, 0, 0};
154   vector bool short bscc = vec_and (bsa, bsb);
155   vector bool short bscd = vec_andc (bsa, bsb);
156   vector bool short bsce = vec_mergel (bsa, bsb);
157 
158   vector bool int bia = {0, -1, -1, 0};
159   vector bool int bib = {-1, -1, 0, -1};
160   vector bool int bicc = vec_and (bia, bib);
161   vector bool int bicd = vec_andc (bia, bib);
162   vector bool int bide = vec_mergel (bia, bib);
163 
164   vector unsigned int uie = vec_packsu (ua, ub);
165 
166   vector long long l2 = vec_cntlz (la);
167   vector unsigned long long u2 = vec_cntlz (ua);
168   vector int sie = vec_cntlz (sia);
169   vector unsigned int uif = vec_cntlz (uia);
170   vector short sszz = vec_cntlz (ssa);
171 
172   vector unsigned short usa = {81, 72, 63, 54, 45, 36, 27, 18};
173   vector unsigned short usb = {81, 72, 63, 54, 45, 36, 27, 18};
174   vector unsigned short usd = vec_and (usa, usb);
175   vector unsigned short use = vec_andc (usa, usb);
176   vector unsigned short usc = vec_cntlz (usa);
177   vector unsigned short uscd = vec_mergeh (usa, usb);
178   vector unsigned short usce = vec_mergel (usa, usb);
179 
180   vector signed char sca = {-4, 3, -9, 15, -31, 31, 0, 0,
181 		            1, 117, -36, 99, 98, 97, 96, 95};
182   vector signed char scb = vec_cntlz (sca);
183   vector signed char scc = vec_mergel (sca, scb);
184 
185   vector unsigned char uca = {4, 3, 9, 15, 30, 31, 0, 0,
186 			      1, 117, 36, 99, 98, 97, 96, 95};
187   vector unsigned char cb = vec_cntlz (ca);
188 
189   vector double dd = vec_xl (0, &y);
190   vec_xst (dd, 0, &z);
191 
192   vector double dzz = vec_round (dd);
193   vector double dzz1 = vec_rsqrt (dd);
194   vector double dzz2 = vec_rsqrte (dd);
195 
196   vector float ff1 = vec_round (fa);
197   vector float ff2 = vec_rsqrt (fa);
198   vector float ff3 = vec_rsqrte (fa);
199 
200   vector double dff = vec_splat (de, 0);
201   vector double dgg = vec_splat (de, 1);
202   vector long long l3 = vec_splat (l2, 0);
203   vector long long l4 = vec_splat (l2, 1);
204   vector unsigned long long u3 = vec_splat (u2, 0);
205   vector unsigned long long u4 = vec_splat (u2, 1);
206   vector bool long long l5 = vec_splat (ld, 0);
207   vector bool long long l6 = vec_splat (ld, 1);
208   vector bool long long l10 = vec_mergee (ld, ld);
209   vector bool long long l11 = vec_mergeo (ld, ld);
210   vector bool long long l15 = vec_and (ld, ld);
211 
212   vector long long l7 = vec_div (l3, l4);
213   vector unsigned long long u5 = vec_div (u3, u4);
214   vector long long l12 = vec_mergee (la, lb);
215   vector long long l13 = vec_mergeo (la, lb);
216   vector unsigned long long u8 = vec_mergee (u3, u4);
217   vector unsigned long long u9 = vec_mergeo (u3, u4);
218 
219   vector long long l8 = vec_mul (l3, l4);
220   vector unsigned long long u6 = vec_mul (u3, u4);
221 
222   vector int sz = vec_cts (fa, 0x1F);
223   vector unsigned int usz = vec_ctu (fa, 0x1F);
224 
225   vector float f1 = vec_mergee (fa, fb);
226   vector float f2 = vec_mergeo (fa, fb);
227 
228   vector double d1 = vec_mergee (da, db);
229   vector double d2 = vec_mergeo (da, db);
230 
231   vector float f3 = vec_ctf (si_a, 1);
232   vector float f4 = vec_ctf (ui_a, 2);
233 
234   vector bool char z_vbc2 = vec_splat (bca, 0);
235   vector signed char z_vsc1 = vec_splat (sca, 1);
236   vector unsigned char z_vuc1 = vec_splat (ucbc, 2);
237 
238   vector bool int z_vbi1 = vec_splat (bia, 3);
239   vector signed int z_vsi1 = vec_splat (sia, 1);
240   vector unsigned int z_vui1 = vec_splat (uia, 2);
241 
242   vector bool int z_bi2 = vec_mergee (bia, bib);
243   vector signed int z_si2 = vec_mergee (sia, sib);
244   vector unsigned int z_ui2 = vec_mergee (uia, uib);
245 
246   vector bool char z_bc2 = vec_mergeh (bca, bcb);
247   vector signed char z_sc2 = vec_mergeh (sca, scb);
248   vector bool int z_bi3 = vec_mergeh (bia, bib);
249   vector signed int z_si3 = vec_mergeh (sia, sib);
250   vector unsigned int z_ui3 = vec_mergeh (uia, uib);
251   vector bool short z_bs1 = vec_mergeh (bsa, bsb);
252 
253   vector bool int z_bi4 = vec_mergeo (bia, bib);
254   vector signed int z_si4 = vec_mergeo (sia, sib);
255   vector unsigned int z_ui4 = vec_mergeo (uia, uib);
256 
257   vector pixel int z_vp1 = vec_splat (pa, 1);
258   vector bool short z_bs2 = vec_splat (bsa, 0);
259   vector short signed int z_vss1 = vec_splat (ssa, 2);
260   vector unsigned short int z_vuss1 = vec_splat (usa, 1);
261 
262   return 0;
263 }
264 
265 /* Expected results:
266    vec_all_eq          vcmpequd.
267    vec_all_ge          vcmpgtud.
268    vec_all_ne          vcmpequd.
269    vec_any_eq          vcmpequd.
270    vec_any_ne          vcmpequd.
271    vec_all_gt          vcmpgtud.
272    vec_all_le          vcmpgtud.
273    vec_all_lt          vcmpgtud.
274    vec_any_ge          vcmpgtud.
275    vec_any_gt          vcmpgtud.
276    vec_any_lt          vcmpgtud.
277    vec_any_le          vcmpgtud.
278    vec_and             xxland
279    vec_andc            xxlandc
280    vec_cntlz           vclzd, vclzb, vclzw, vclzh
281    vec_cpsgn           xvcpsgnsp
282    vec_ctf             xvmuldp
283    vec_cts             vctsxs
284    vec_ctu             vctuxs
285    vec_div             divd, divdu | __divdi3(), __udivdi3()
286    vec_mergel          vmrghb, vmrghh, xxmrghw
287    vec_mergeh          xxmrglw, vmrglh, vmrglb
288    vec_mul             mulld | mullw, mulhwu
289    vec_nor             xxlnor
290    vec_packsu          vpkudus
291    vec_perm            vperm
292    vec_round           xvrdpi
293    vec_sel             xxsel
294    vec_xor             xxlxor
295    vec_rsqrt           xvrsqrtesp
296    vec_rsqrte          xvrsqrtesp
297    vec_xl              lxvd2x
298    vec_xst             stxvd2x
299    vec_splat           xxspltb, xxspltw, vsplth
300    vec_mergee          xxmrgld, vmrgow
301    vec_mergeo          xxmrghd, vmrgew  */
302 
303 /* { dg-final { scan-assembler-times "vcmpequd" 8 } } */
304 /* { dg-final { scan-assembler-times "vcmpgtud" 16 } } */
305 /* { dg-final { scan-assembler-times "xxland" 30 } } */
306 /* { dg-final { scan-assembler-times "xxlandc" 13 } } */
307 /* { dg-final { scan-assembler-times "vclzb" 2 } } */
308 /* { dg-final { scan-assembler-times "vclzd" 2 } } */
309 /* { dg-final { scan-assembler-times "vclzw" 2 } } */
310 /* { dg-final { scan-assembler-times "vclzh" 2 } } */
311 /* { dg-final { scan-assembler-times "xvcpsgnsp" 1 } } */
312 /* { dg-final { scan-assembler-times "xvcpsgndp" 1 } } */
313 /* { dg-final { scan-assembler-times "xvmuldp" 2 } } */
314 /* { dg-final { scan-assembler-times "xvcvdpsxds" 0 } } */
315 /* { dg-final { scan-assembler-times "vctsxs" 2 } } */
316 /* { dg-final { scan-assembler-times "xvcvdpuxds" 0 } } */
317 /* { dg-final { scan-assembler-times "vctuxs" 2 } } */
318 
319 /* { dg-final { scan-assembler-times "vmrghb" 4 { target be } } } */
320 /* { dg-final { scan-assembler-times "vmrghb" 5 { target le } } } */
321 /* { dg-final { scan-assembler-times "vmrghh" 8 } } */
322 /* { dg-final { scan-assembler-times "xxmrghw" 8 } } */
323 /* { dg-final { scan-assembler-times "xxmrglw" 8 } } */
324 /* { dg-final { scan-assembler-times "vmrglh" 8 } } */
325 /* { dg-final { scan-assembler-times "xxlnor" 6 } } */
326 /* { dg-final { scan-assembler-times {\mvpkudus\M} 1 } } */
327 /* { dg-final { scan-assembler-times "vperm" 4 } } */
328 /* { dg-final { scan-assembler-times "xvrdpi" 2 } } */
329 /* { dg-final { scan-assembler-times "xxsel" 10 } } */
330 /* { dg-final { scan-assembler-times "xxlxor" 6 } } */
331 /* { dg-final { scan-assembler-times "divd" 8  { target lp64 } } } */
332 /* { dg-final { scan-assembler-times "divdu" 2  { target lp64 } } } */
333 /* { dg-final { scan-assembler-times "mulld" 4  { target lp64 } } } */
334 /* check for .__divdi3 (AIX), __divdi3 (Linux) and ___divdi3 (Darwin) */
335 /* { dg-final { scan-assembler-times {\mbl \.?_?__divdi3\M} 2   { target { ilp32 } } } } */
336 /* check for both .__udivdi3 (AIX), __udivdi3 (Linux) and ___udivdi3 (Darwin) */
337 /* { dg-final { scan-assembler-times {\mbl \.?_?__udivdi3\M} 2  { target { ilp32 } } } } */
338 /* { dg-final { scan-assembler-times "mullw" 12  { target ilp32 } } } */
339 /* { dg-final { scan-assembler-times "mulhwu" 4  { target ilp32 } } } */
340 /* { dg-final { scan-assembler-times "xxmrgld" 0 } } */
341 /* { dg-final { scan-assembler-times "xxmrghd" 0 } } */
342 /* { dg-final { scan-assembler-times "xvrsqrtesp" 2 } } */
343 /* { dg-final { scan-assembler-times "xvrsqrtedp" 2 } } */
344 /* { dg-final { scan-assembler-times "xxspltd" 8 } } */
345 /* { dg-final { scan-assembler-times "vcfsx" 2 } } */
346 /* { dg-final { scan-assembler-times "vcfux" 2 } } */
347 /* { dg-final { scan-assembler-times "vspltb" 6 } } */
348 /* { dg-final { scan-assembler-times "vspltw" 0 } } */
349 /* { dg-final { scan-assembler-times "vmrgow" 8 } } */
350 /* { dg-final { scan-assembler-times "vmrglb" 5 { target le } } } */
351 /* { dg-final { scan-assembler-times "vmrglb" 6 { target be } } } */
352 /* { dg-final { scan-assembler-times "vmrgew" 8 } } */
353 /* { dg-final { scan-assembler-times "vsplth" 8 } } */
354 /* { dg-final { scan-assembler-times "vcmpequd." 8 } } */
355 /* { dg-final { scan-assembler-times "vcmpgtud." 16 } } */
356 /* { dg-final { scan-assembler-times "vrfin" 2 } } */
357 
358