xref: /llvm-project/clang/test/CodeGen/PowerPC/builtins-ppc-32bit-vec-ll.c (revision 39db5e1ed87363a9ffea81e53520b542201b3262)
1 // REQUIRES: powerpc-registered-target
2 // RUN: %clang_cc1 -flax-vector-conversions=none -target-feature +altivec \
3 // RUN: -target-feature +power8-vector -triple powerpc-unknown-unknown -emit-llvm %s -o - | FileCheck %s
4 
5 #include <altivec.h>
6 vector signed long long vsll1, vsll2, vsll3;
7 vector unsigned long long vull1, vull2, vull3;
8 vector signed char vsc;
9 vector unsigned char vuc;
10 vector bool long long vbll;
11 
12 void dummy();
test()13 void test() {
14   vec_abs(vsll1);
15 // CHECK: call <2 x i64> @llvm.ppc.altivec.vmaxsd
16   dummy();
17 // CHECK-NEXT: call void @dummy()
18   vec_add(vsll1, vsll2);
19 // CHECK: add <2 x i64>
20   dummy();
21 // CHECK: call void @dummy()
22   vec_and(vsll1, vsll2);
23 // CHECK: and <2 x i64>
24   dummy();
25 // CHECK: call void @dummy()
26   vec_vand(vsll1, vsll2);
27 // CHECK: and <2 x i64>
28   dummy();
29 // CHECK: call void @dummy()
30   vec_andc(vsll1, vsll2);
31 // CHECK: xor <2 x i64>
32 // CHECK: and <2 x i64>
33   dummy();
34 // CHECK: call void @dummy()
35   vec_vandc(vsll1, vsll2);
36 // CHECK: xor <2 x i64>
37 // CHECK: and <2 x i64>
38   dummy();
39 // CHECK: call void @dummy()
40   vec_cmpeq(vsll1, vsll2);
41 // CHECK: call <2 x i64> @llvm.ppc.altivec.vcmpequd
42   dummy();
43 // CHECK: call void @dummy()
44   vec_cmpne(vsll1, vsll2);
45 // CHECK: call <2 x i64> @llvm.ppc.altivec.vcmpequd
46 // CHECK: xor <2 x i64>
47   dummy();
48 // CHECK: call void @dummy()
49   vec_cmpgt(vsll1, vsll2);
50 // CHECK: call <2 x i64> @llvm.ppc.altivec.vcmpgtsd
51   dummy();
52 // CHECK: call void @dummy()
53   vec_cmpge(vsll1, vsll2);
54 // CHECK: call <2 x i64> @llvm.ppc.altivec.vcmpgtsd
55 // CHECK: xor <2 x i64>
56   dummy();
57 // CHECK: call void @dummy()
58   vec_cmple(vsll1, vsll2);
59 // CHECK: call <2 x i64> @llvm.ppc.altivec.vcmpgtsd
60 // CHECK: xor <2 x i64>
61   dummy();
62 // CHECK: call void @dummy()
63   vec_cmplt(vsll1, vsll2);
64 // CHECK: call <2 x i64> @llvm.ppc.altivec.vcmpgtsd
65   dummy();
66 // CHECK: call void @dummy()
67   vec_popcnt(vsll1);
68 // CHECK: call <2 x i64> @llvm.ctpop.v2i64
69   dummy();
70 // CHECK: call void @dummy()
71   vec_cntlz(vsll1);
72 // CHECK: call <2 x i64> @llvm.ctlz.v2i64
73   dummy();
74 // CHECK: call void @dummy()
75   vec_float2(vsll1, vsll2);
76 // CHECK: sitofp i64 %{{.*}} to float
77   dummy();
78 // CHECK: call void @dummy()
79   vec_floate(vsll1);
80 // CHECK: call <4 x float> @llvm.ppc.vsx.xvcvsxdsp
81   dummy();
82 // CHECK: call void @dummy()
83   vec_floato(vsll1);
84 // CHECK: call <4 x float> @llvm.ppc.vsx.xvcvsxdsp
85   dummy();
86 // CHECK: call void @dummy()
87   vec_double(vsll1);
88 // CHECK: sitofp <2 x i64> %{{.*}} to <2 x double>
89   dummy();
90 // CHECK: call void @dummy()
91   vec_div(vsll1, vsll2);
92 // CHECK: sdiv <2 x i64>
93   dummy();
94 // CHECK: call void @dummy()
95   vec_eqv(vsll1, vsll2);
96 // CHECK: call <4 x i32> @llvm.ppc.vsx.xxleqv
97   dummy();
98 // CHECK: call void @dummy()
99   vec_max(vsll1, vsll2);
100 // CHECK: call <2 x i64> @llvm.ppc.altivec.vmaxsd
101   dummy();
102 // CHECK: call void @dummy()
103   vec_mergeh(vsll1, vsll2);
104 // CHECK: call <4 x i32> @llvm.ppc.altivec.vperm
105   dummy();
106 // CHECK: call void @dummy()
107   vec_mergel(vsll1, vsll2);
108 // CHECK: call <4 x i32> @llvm.ppc.altivec.vperm
109   dummy();
110 // CHECK: call void @dummy()
111   vec_mergee(vsll1, vsll2);
112 // CHECK: call <4 x i32> @llvm.ppc.altivec.vperm
113   dummy();
114 // CHECK: call void @dummy()
115   vec_mergeo(vsll1, vsll2);
116 // CHECK: call <4 x i32> @llvm.ppc.altivec.vperm
117   dummy();
118 // CHECK: call void @dummy()
119   vec_min(vsll1, vsll2);
120 // CHECK: call <2 x i64> @llvm.ppc.altivec.vminsd
121   dummy();
122 // CHECK: call void @dummy()
123   vec_mul(vsll1, vsll2);
124 // CHECK: mul <2 x i64>
125   dummy();
126 // CHECK: call void @dummy()
127   vec_nand(vsll1, vsll2);
128 // CHECK: and <2 x i64>
129 // CHECK: xor <2 x i64>
130   dummy();
131 // CHECK: call void @dummy()
132   vec_nor(vsll1, vsll2);
133 // CHECK: or <2 x i64>
134 // CHECK: xor <2 x i64>
135   dummy();
136 // CHECK: call void @dummy()
137   vec_or(vsll1, vsll2);
138 // CHECK: or <2 x i64>
139   dummy();
140 // CHECK: call void @dummy()
141   vec_orc(vsll1, vsll2);
142 // CHECK: xor <2 x i64>
143 // CHECK: or <2 x i64>
144   dummy();
145 // CHECK: call void @dummy()
146   vec_vor(vsll1, vsll2);
147 // CHECK: or <2 x i64>
148   dummy();
149 // CHECK: call void @dummy()
150   vec_pack(vsll1, vsll2);
151 // CHECK: call <4 x i32> @llvm.ppc.altivec.vperm
152   dummy();
153 // CHECK: call void @dummy()
154   vec_vpkudum(vsll1, vsll2);
155 // CHECK: call <4 x i32> @llvm.ppc.altivec.vperm
156   dummy();
157 // CHECK: call void @dummy()
158   vec_packs(vsll1, vsll2);
159 // CHECK: call <4 x i32> @llvm.ppc.altivec.vpksdss
160   dummy();
161 // CHECK: call void @dummy()
162   vec_vpkudus(vull1, vull2);
163 // CHECK: call <4 x i32> @llvm.ppc.altivec.vpkudus
164   dummy();
165 // CHECK: call void @dummy()
166   vec_packsu(vsll1, vsll2);
167 // CHECK: call <4 x i32> @llvm.ppc.altivec.vpksdus
168   dummy();
169 // CHECK: call void @dummy()
170   vec_rl(vull1, vull2);
171 // CHECK: call <2 x i64> @llvm.ppc.altivec.vrld
172   dummy();
173 // CHECK: call void @dummy()
174   vec_sel(vsll1, vsll2, vbll);
175 // CHECK: xor <2 x i64>
176 // CHECK: and <2 x i64>
177 // CHECK: and <2 x i64>
178 // CHECK: or <2 x i64>
179   dummy();
180 // CHECK: call void @dummy()
181   vec_sl(vull1, vull2);
182 // CHECK: shl <2 x i64>
183   dummy();
184 // CHECK: call void @dummy()
185   vec_sld(vsll1, vsll2, 2);
186 // CHECK: call <4 x i32> @llvm.ppc.altivec.vperm
187   dummy();
188 // CHECK: call void @dummy()
189   vec_sldw(vsll1, vsll2, 2);
190 // CHECK: call <4 x i32> @llvm.ppc.altivec.vperm
191   dummy();
192 // CHECK: call void @dummy()
193   vec_sll(vsll1, vuc);
194 // CHECK: call <4 x i32> @llvm.ppc.altivec.vsl
195   dummy();
196 // CHECK: call void @dummy()
197   vec_slo(vsll1, vsc);
198 // CHECK: call <4 x i32> @llvm.ppc.altivec.vslo
199   dummy();
200 // CHECK: call void @dummy()
201   vec_splat(vsll1, 2);
202 // CHECK: call <4 x i32> @llvm.ppc.altivec.vperm
203   dummy();
204 // CHECK: call void @dummy()
205   vec_sr(vull1, vull2);
206 // CHECK: lshr <2 x i64>
207   dummy();
208 // CHECK: call void @dummy()
209   vec_sra(vsll1, vull2);
210 // CHECK: ashr <2 x i64>
211   dummy();
212 // CHECK: call void @dummy()
213   vec_srl(vsll1, vuc);
214 // CHECK: call <4 x i32> @llvm.ppc.altivec.vsr
215   dummy();
216 // CHECK: call void @dummy()
217   vec_sro(vsll1, vsc);
218 // CHECK: call <4 x i32> @llvm.ppc.altivec.vsro
219   dummy();
220 // CHECK: call void @dummy()
221   vec_sub(vsll1, vsll2);
222 // CHECK: sub <2 x i64>
223   dummy();
224 // CHECK: call void @dummy()
225   vec_xor(vsll1, vsll2);
226 // CHECK: xor <2 x i64>
227   dummy();
228 // CHECK: call void @dummy()
229   vec_vxor(vsll1, vsll2);
230 // CHECK: xor <2 x i64>
231   dummy();
232 // CHECK: call void @dummy()
233   vec_extract(vsll1, 2);
234 // CHECK: extractelement <2 x i64>
235   dummy();
236 // CHECK: call void @dummy()
237   vec_all_eq(vsll1, vsll2);
238 // CHECK: call i32 @llvm.ppc.altivec.vcmpequd.p
239   dummy();
240 // CHECK: call void @dummy()
241   vec_all_ge(vsll1, vsll2);
242 // CHECK: call i32 @llvm.ppc.altivec.vcmpgtsd.p
243   dummy();
244 // CHECK: call void @dummy()
245   vec_all_gt(vsll1, vsll2);
246 // CHECK: call i32 @llvm.ppc.altivec.vcmpgtsd.p
247   dummy();
248 // CHECK: call void @dummy()
249   vec_all_le(vsll1, vsll2);
250 // CHECK: call i32 @llvm.ppc.altivec.vcmpgtsd.p
251   dummy();
252 // CHECK: call void @dummy()
253   vec_all_lt(vsll1, vsll2);
254 // CHECK: call i32 @llvm.ppc.altivec.vcmpgtsd.p
255   dummy();
256 // CHECK: call void @dummy()
257   vec_all_ne(vsll1, vsll2);
258 // CHECK: call i32 @llvm.ppc.altivec.vcmpequd.p
259   dummy();
260 // CHECK: call void @dummy()
261   vec_any_eq(vsll1, vsll2);
262 // CHECK: call i32 @llvm.ppc.altivec.vcmpequd.p
263   dummy();
264 // CHECK: call void @dummy()
265   vec_any_ge(vsll1, vsll2);
266 // CHECK: call i32 @llvm.ppc.altivec.vcmpgtsd.p
267   dummy();
268 // CHECK: call void @dummy()
269   vec_any_gt(vsll1, vsll2);
270 // CHECK: call i32 @llvm.ppc.altivec.vcmpgtsd.p
271   dummy();
272 // CHECK: call void @dummy()
273   vec_any_le(vsll1, vsll2);
274 // CHECK: call i32 @llvm.ppc.altivec.vcmpgtsd.p
275   dummy();
276 // CHECK: call void @dummy()
277   vec_any_lt(vsll1, vsll2);
278 // CHECK: call i32 @llvm.ppc.altivec.vcmpgtsd.p
279   dummy();
280 // CHECK: call void @dummy()
281   vec_any_ne(vsll1, vsll2);
282 // CHECK: call i32 @llvm.ppc.altivec.vcmpequd.p
283   dummy();
284 // CHECK: call void @dummy()
285   vec_gbb(vsll1);
286 // CHECK: call <16 x i8> @llvm.ppc.altivec.vgbbd
287   dummy();
288 // CHECK: call void @dummy()
289   vec_reve(vsll1);
290 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 0>
291   dummy();
292 // CHECK: call void @dummy()
293   vec_revb(vsll1);
294 // CHECK: call <4 x i32> @llvm.ppc.altivec.vperm
295 }
296