1 /* { dg-do compile { target { powerpc64le-*-* } } } */
2 /* { dg-options "-mcpu=power8 -O0" } */
3 
4 /* Test that a number of newly added builtin overloads are accepted
5    by the compiler.  */
6 
7 #include <altivec.h>
8 
9 vector double y = { 2.0, 4.0 };
10 vector double z;
11 
main()12 int main ()
13 {
14   vector float fa = {1.0, 2.0, 3.0, -4.0};
15   vector float fb = {-2.0, -3.0, -4.0, -5.0};
16   vector float fc = vec_cpsgn (fa, fb);
17 
18   vector long long la = {5L, 14L};
19   vector long long lb = {3L, 86L};
20   vector long long lc = vec_and (la, lb);
21   vector bool long long ld = {0, -1};
22   vector long long le = vec_and (la, ld);
23   vector long long lf = vec_and (ld, lb);
24 
25   vector unsigned long long ua = {5L, 14L};
26   vector unsigned long long ub = {3L, 86L};
27   vector unsigned long long uc = vec_and (ua, ub);
28   vector bool long long ud = {0, -1};
29   vector unsigned long long ue = vec_and (ua, ud);
30   vector unsigned long long uf = vec_and (ud, ub);
31 
32   vector long long lg = vec_andc (la, lb);
33   vector long long lh = vec_andc (la, ld);
34   vector long long li = vec_andc (ld, lb);
35 
36   vector unsigned long long ug = vec_andc (ua, ub);
37   vector unsigned long long uh = vec_andc (ua, ud);
38   vector unsigned long long ui = vec_andc (ud, ub);
39 
40   vector double da = {1.0, -4.0};
41   vector double db = {-2.0, 5.0};
42   vector double dc = vec_cpsgn (da, db);
43 
44   vector long long lj = vec_mergeh (la, lb);
45   vector long long lk = vec_mergeh (la, ld);
46   vector long long ll = vec_mergeh (ld, la);
47 
48   vector unsigned long long uj = vec_mergeh (ua, ub);
49   vector unsigned long long uk = vec_mergeh (ua, ud);
50   vector unsigned long long ul = vec_mergeh (ud, ua);
51 
52   vector long long lm = vec_mergel (la, lb);
53   vector long long ln = vec_mergel (la, ld);
54   vector long long lo = vec_mergel (ld, la);
55 
56   vector unsigned long long um = vec_mergel (ua, ub);
57   vector unsigned long long un = vec_mergel (ua, ud);
58   vector unsigned long long uo = vec_mergel (ud, ua);
59 
60   vector long long lp = vec_nor (la, lb);
61   vector long long lq = vec_nor (la, ld);
62   vector long long lr = vec_nor (ld, la);
63 
64   vector unsigned long long up = vec_nor (ua, ub);
65   vector unsigned long long uq = vec_nor (ua, ud);
66   vector unsigned long long ur = vec_nor (ud, ua);
67 
68   vector long long ls = vec_or (la, lb);
69   vector long long lt = vec_or (la, ld);
70   vector long long lu = vec_or (ld, la);
71 
72   vector unsigned long long us = vec_or (ua, ub);
73   vector unsigned long long ut = vec_or (ua, ud);
74   vector unsigned long long uu = vec_or (ud, ua);
75 
76   vector unsigned char ca = {0,4,8,1,5,9,2,6,10,3,7,11,15,12,14,13};
77   vector long long lv = vec_perm (la, lb, ca);
78   vector unsigned long long uv = vec_perm (ua, ub, ca);
79 
80   vector long long lw = vec_sel (la, lb, lc);
81   vector long long lx = vec_sel (la, lb, uc);
82   vector long long ly = vec_sel (la, lb, ld);
83 
84   vector unsigned long long uw = vec_sel (ua, ub, lc);
85   vector unsigned long long ux = vec_sel (ua, ub, uc);
86   vector unsigned long long uy = vec_sel (ua, ub, ld);
87 
88   vector long long lz = vec_xor (la, lb);
89   vector long long l0 = vec_xor (la, ld);
90   vector long long l1 = vec_xor (ld, la);
91 
92   vector unsigned long long uz = vec_xor (ua, ub);
93   vector unsigned long long u0 = vec_xor (ua, ud);
94   vector unsigned long long u1 = vec_xor (ud, ua);
95 
96   int ia = vec_all_eq (ua, ub);
97   int ib = vec_all_ge (ua, ub);
98   int ic = vec_all_gt (ua, ub);
99   int id = vec_all_le (ua, ub);
100   int ie = vec_all_lt (ua, ub);
101   int ig = vec_all_ne (ua, ub);
102 
103   int ih = vec_any_eq (ua, ub);
104   int ii = vec_any_ge (ua, ub);
105   int ij = vec_any_gt (ua, ub);
106   int ik = vec_any_le (ua, ub);
107   int il = vec_any_lt (ua, ub);
108   int im = vec_any_ne (ua, ub);
109 
110   vector int sia = {9, 16, 25, 36};
111   vector int sib = {-8, -27, -64, -125};
112   vector int sic = vec_mergee (sia, sib);
113   vector int sid = vec_mergeo (sia, sib);
114 
115   vector unsigned int uia = {9, 16, 25, 36};
116   vector unsigned int uib = {8, 27, 64, 125};
117   vector unsigned int uic = vec_mergee (uia, uib);
118   vector unsigned int uid = vec_mergeo (uia, uib);
119 
120   vector bool int bia = {0, -1, -1, 0};
121   vector bool int bib = {-1, -1, 0, -1};
122   vector bool int bic = vec_mergee (bia, bib);
123   vector bool int bid = vec_mergeo (bia, bib);
124 
125   vector unsigned int uie = vec_packsu (ua, ub);
126 
127   vector long long l2 = vec_cntlz (la);
128   vector unsigned long long u2 = vec_cntlz (ua);
129   vector int sie = vec_cntlz (sia);
130   vector unsigned int uif = vec_cntlz (uia);
131   vector short ssa = {20, -40, -60, 80, 100, -120, -140, 160};
132   vector short ssb = vec_cntlz (ssa);
133   vector unsigned short usa = {81, 72, 63, 54, 45, 36, 27, 18};
134   vector unsigned short usb = vec_cntlz (usa);
135   vector signed char sca = {-4, 3, -9, 15, -31, 31, 0, 0,
136 		            1, 117, -36, 99, 98, 97, 96, 95};
137   vector signed char scb = vec_cntlz (sca);
138   vector unsigned char cb = vec_cntlz (ca);
139 
140   vector double dd = vec_xl (0, &y);
141   vec_xst (dd, 0, &z);
142 
143   vector double de = vec_round (dd);
144 
145   vector double df = vec_splat (de, 0);
146   vector double dg = vec_splat (de, 1);
147   vector long long l3 = vec_splat (l2, 0);
148   vector long long l4 = vec_splat (l2, 1);
149   vector unsigned long long u3 = vec_splat (u2, 0);
150   vector unsigned long long u4 = vec_splat (u2, 1);
151   vector bool long long l5 = vec_splat (ld, 0);
152   vector bool long long l6 = vec_splat (ld, 1);
153 
154   vector long long l7 = vec_div (l3, l4);
155   vector unsigned long long u5 = vec_div (u3, u4);
156 
157   vector long long l8 = vec_mul (l3, l4);
158   vector unsigned long long u6 = vec_mul (u3, u4);
159 
160   vector double dh = vec_ctf (la, -2);
161   vector double di = vec_ctf (ua, 2);
162   vector long long l9 = vec_cts (dh, -2);
163   vector unsigned long long u7 = vec_ctu (di, 2);
164 
165   return 0;
166 }
167