1 | // REQUIRES: systemz-registered-target |
2 | // RUN: %clang_cc1 -target-cpu z14 -triple s390x-linux-gnu \ |
3 | // RUN: -O -fzvector -fno-lax-vector-conversions \ |
4 | // RUN: -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck %s |
5 | // RUN: %clang_cc1 -target-cpu z14 -triple s390x-linux-gnu \ |
6 | // RUN: -O -fzvector -fno-lax-vector-conversions \ |
7 | // RUN: -Wall -Wno-unused -Werror -S %s -o - | FileCheck %s --check-prefix=CHECK-ASM |
8 | |
9 | #include <vecintrin.h> |
10 | |
11 | volatile vector signed char vsc; |
12 | volatile vector signed short vss; |
13 | volatile vector signed int vsi; |
14 | volatile vector signed long long vsl; |
15 | volatile vector unsigned char vuc; |
16 | volatile vector unsigned short vus; |
17 | volatile vector unsigned int vui; |
18 | volatile vector unsigned long long vul; |
19 | volatile vector bool char vbc; |
20 | volatile vector bool short vbs; |
21 | volatile vector bool int vbi; |
22 | volatile vector bool long long vbl; |
23 | volatile vector float vf; |
24 | volatile vector double vd; |
25 | |
26 | volatile signed char sc; |
27 | volatile signed short ss; |
28 | volatile signed int si; |
29 | volatile signed long long sl; |
30 | volatile unsigned char uc; |
31 | volatile unsigned short us; |
32 | volatile unsigned int ui; |
33 | volatile unsigned long long ul; |
34 | volatile float f; |
35 | volatile double d; |
36 | |
37 | const void * volatile cptr; |
38 | const signed char * volatile cptrsc; |
39 | const signed short * volatile cptrss; |
40 | const signed int * volatile cptrsi; |
41 | const signed long long * volatile cptrsl; |
42 | const unsigned char * volatile cptruc; |
43 | const unsigned short * volatile cptrus; |
44 | const unsigned int * volatile cptrui; |
45 | const unsigned long long * volatile cptrul; |
46 | const float * volatile cptrf; |
47 | const double * volatile cptrd; |
48 | |
49 | void * volatile ptr; |
50 | signed char * volatile ptrsc; |
51 | signed short * volatile ptrss; |
52 | signed int * volatile ptrsi; |
53 | signed long long * volatile ptrsl; |
54 | unsigned char * volatile ptruc; |
55 | unsigned short * volatile ptrus; |
56 | unsigned int * volatile ptrui; |
57 | unsigned long long * volatile ptrul; |
58 | float * volatile ptrf; |
59 | double * volatile ptrd; |
60 | |
61 | volatile unsigned int len; |
62 | volatile int idx; |
63 | int cc; |
64 | |
65 | void test_core(void) { |
66 | // CHECK-ASM-LABEL: test_core |
67 | vector float vf2; |
68 | vector double vd2; |
69 | |
70 | f = vec_extract(vf, 0); |
71 | // CHECK: extractelement <4 x float> %{{.*}}, i32 0 |
72 | // CHECK-ASM: vstef |
73 | f = vec_extract(vf, idx); |
74 | // CHECK: extractelement <4 x float> %{{.*}}, i32 %{{.*}} |
75 | // CHECK-ASM: vlgvf |
76 | d = vec_extract(vd, 0); |
77 | // CHECK: extractelement <2 x double> %{{.*}}, i32 0 |
78 | // CHECK-ASM: vsteg |
79 | d = vec_extract(vd, idx); |
80 | // CHECK: extractelement <2 x double> %{{.*}}, i32 %{{.*}} |
81 | // CHECK-ASM: vlgvg |
82 | |
83 | vf2 = vf; |
84 | vf = vec_insert(f, vf2, 0); |
85 | // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0 |
86 | // CHECK-ASM: vlef |
87 | vf = vec_insert(0.0f, vf, 1); |
88 | // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 1 |
89 | // CHECK-ASM: vleif %{{.*}}, 0, 1 |
90 | vf = vec_insert(f, vf, idx); |
91 | // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 %{{.*}} |
92 | // CHECK-ASM: vlvgf |
93 | vd2 = vd; |
94 | vd = vec_insert(d, vd2, 0); |
95 | // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0 |
96 | // CHECK-ASM: vleg |
97 | vd = vec_insert(0.0, vd, 1); |
98 | // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i32 1 |
99 | // CHECK-ASM: vleig %{{.*}}, 0, 1 |
100 | vd = vec_insert(d, vd, idx); |
101 | // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 %{{.*}} |
102 | // CHECK-ASM: vlvgg |
103 | |
104 | vf = vec_promote(f, idx); |
105 | // CHECK: insertelement <4 x float> undef, float %{{.*}}, i32 %{{.*}} |
106 | // CHECK-ASM: vlvgf |
107 | vd = vec_promote(d, idx); |
108 | // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 %{{.*}} |
109 | // CHECK-ASM: vlvgg |
110 | |
111 | vf = vec_insert_and_zero(cptrf); |
112 | // CHECK: insertelement <4 x float> <float 0.000000e+00, float undef, float 0.000000e+00, float 0.000000e+00>, float %{{.*}}, i32 1 |
113 | // CHECK-ASM: vllezf |
114 | vd = vec_insert_and_zero(cptrd); |
115 | // CHECK: insertelement <2 x double> <double undef, double 0.000000e+00>, double %{{.*}}, i32 0 |
116 | // CHECK-ASM: vllezg |
117 | |
118 | vf = vec_perm(vf, vf, vuc); |
119 | // CHECK: call <16 x i8> @llvm.s390.vperm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
120 | // CHECK-ASM: vperm |
121 | vd = vec_perm(vd, vd, vuc); |
122 | // CHECK: call <16 x i8> @llvm.s390.vperm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
123 | // CHECK-ASM: vperm |
124 | |
125 | vul = vec_bperm_u128(vuc, vuc); |
126 | // CHECK: call <2 x i64> @llvm.s390.vbperm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
127 | // CHECK-ASM: vbperm |
128 | |
129 | vf = vec_sel(vf, vf, vui); |
130 | // CHECK-ASM: vsel |
131 | vf = vec_sel(vf, vf, vbi); |
132 | // CHECK-ASM: vsel |
133 | vd = vec_sel(vd, vd, vul); |
134 | // CHECK-ASM: vsel |
135 | vd = vec_sel(vd, vd, vbl); |
136 | // CHECK-ASM: vsel |
137 | |
138 | vf = vec_gather_element(vf, vui, cptrf, 0); |
139 | // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 0 |
140 | vf = vec_gather_element(vf, vui, cptrf, 1); |
141 | // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 1 |
142 | vf = vec_gather_element(vf, vui, cptrf, 2); |
143 | // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 2 |
144 | vf = vec_gather_element(vf, vui, cptrf, 3); |
145 | // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 3 |
146 | vd = vec_gather_element(vd, vul, cptrd, 0); |
147 | // CHECK-ASM: vgeg %{{.*}}, 0(%{{.*}},%{{.*}}), 0 |
148 | vd = vec_gather_element(vd, vul, cptrd, 1); |
149 | // CHECK-ASM: vgeg %{{.*}}, 0(%{{.*}},%{{.*}}), 1 |
150 | |
151 | vec_scatter_element(vf, vui, ptrf, 0); |
152 | // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 0 |
153 | vec_scatter_element(vf, vui, ptrf, 1); |
154 | // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 1 |
155 | vec_scatter_element(vf, vui, ptrf, 2); |
156 | // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 2 |
157 | vec_scatter_element(vf, vui, ptrf, 3); |
158 | // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 3 |
159 | vec_scatter_element(vd, vul, ptrd, 0); |
160 | // CHECK-ASM: vsceg %{{.*}}, 0(%{{.*}},%{{.*}}), 0 |
161 | vec_scatter_element(vd, vul, ptrd, 1); |
162 | // CHECK-ASM: vsceg %{{.*}}, 0(%{{.*}},%{{.*}}), 1 |
163 | |
164 | vf = vec_xl(idx, cptrf); |
165 | // CHECK-ASM: vl |
166 | vd = vec_xl(idx, cptrd); |
167 | // CHECK-ASM: vl |
168 | |
169 | vec_xst(vf, idx, ptrf); |
170 | // CHECK-ASM: vst |
171 | vec_xst(vd, idx, ptrd); |
172 | // CHECK-ASM: vst |
173 | |
174 | vd = vec_load_bndry(cptrd, 64); |
175 | // CHECK: call <16 x i8> @llvm.s390.vlbb(i8* %{{.*}}, i32 0) |
176 | // CHECK-ASM: vlbb |
177 | vf = vec_load_bndry(cptrf, 64); |
178 | // CHECK: call <16 x i8> @llvm.s390.vlbb(i8* %{{.*}}, i32 0) |
179 | // CHECK-ASM: vlbb |
180 | vf = vec_load_bndry(cptrf, 128); |
181 | // CHECK: call <16 x i8> @llvm.s390.vlbb(i8* %{{.*}}, i32 1) |
182 | // CHECK-ASM: vlbb |
183 | vf = vec_load_bndry(cptrf, 256); |
184 | // CHECK: call <16 x i8> @llvm.s390.vlbb(i8* %{{.*}}, i32 2) |
185 | // CHECK-ASM: vlbb |
186 | vf = vec_load_bndry(cptrf, 512); |
187 | // CHECK: call <16 x i8> @llvm.s390.vlbb(i8* %{{.*}}, i32 3) |
188 | // CHECK-ASM: vlbb |
189 | vf = vec_load_bndry(cptrf, 1024); |
190 | // CHECK: call <16 x i8> @llvm.s390.vlbb(i8* %{{.*}}, i32 4) |
191 | // CHECK-ASM: vlbb |
192 | vf = vec_load_bndry(cptrf, 2048); |
193 | // CHECK: call <16 x i8> @llvm.s390.vlbb(i8* %{{.*}}, i32 5) |
194 | // CHECK-ASM: vlbb |
195 | vf = vec_load_bndry(cptrf, 4096); |
196 | // CHECK: call <16 x i8> @llvm.s390.vlbb(i8* %{{.*}}, i32 6) |
197 | // CHECK-ASM: vlbb |
198 | |
199 | vf = vec_load_len(cptrf, idx); |
200 | // CHECK: call <16 x i8> @llvm.s390.vll(i32 %{{.*}}, i8* %{{.*}}) |
201 | // CHECK-ASM: vll |
202 | vd = vec_load_len(cptrd, idx); |
203 | // CHECK: call <16 x i8> @llvm.s390.vll(i32 %{{.*}}, i8* %{{.*}}) |
204 | // CHECK-ASM: vll |
205 | |
206 | vec_store_len(vf, ptrf, idx); |
207 | // CHECK: call void @llvm.s390.vstl(<16 x i8> %{{.*}}, i32 %{{.*}}, i8* %{{.*}}) |
208 | // CHECK-ASM: vstl |
209 | vec_store_len(vd, ptrd, idx); |
210 | // CHECK: call void @llvm.s390.vstl(<16 x i8> %{{.*}}, i32 %{{.*}}, i8* %{{.*}}) |
211 | // CHECK-ASM: vstl |
212 | |
213 | vuc = vec_load_len_r(cptruc, 0); |
214 | // CHECK: call <16 x i8> @llvm.s390.vlrl(i32 0, i8* %{{.*}}) |
215 | // CHECK-ASM: vlrl %{{.*}}, 0(%{{.*}}), 0 |
216 | vuc = vec_load_len_r(cptruc, idx); |
217 | // CHECK: call <16 x i8> @llvm.s390.vlrl(i32 %{{.*}}, i8* %{{.*}}) |
218 | // CHECK-ASM: vlrlr |
219 | |
220 | vec_store_len_r(vuc, ptruc, 0); |
221 | // CHECK: call void @llvm.s390.vstrl(<16 x i8> %{{.*}}, i32 0, i8* %{{.*}}) |
222 | // CHECK-ASM: vstrl %{{.*}}, 0(%{{.*}}), 0 |
223 | vec_store_len_r(vuc, ptruc, idx); |
224 | // CHECK: call void @llvm.s390.vstrl(<16 x i8> %{{.*}}, i32 %{{.*}}, i8* %{{.*}}) |
225 | // CHECK-ASM: vstrlr |
226 | |
227 | vf = vec_splat(vf, 0); |
228 | // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> undef, <4 x i32> zeroinitializer |
229 | // CHECK-ASM: vrepf |
230 | vf = vec_splat(vf, 1); |
231 | // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> |
232 | // CHECK-ASM: vrepf |
233 | vd = vec_splat(vd, 0); |
234 | // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> undef, <2 x i32> zeroinitializer |
235 | // CHECK-ASM: vrepg |
236 | vd = vec_splat(vd, 1); |
237 | // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> undef, <2 x i32> <i32 1, i32 1> |
238 | // CHECK-ASM: vrepg |
239 | |
240 | vf = vec_splats(f); |
241 | // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> undef, <4 x i32> zeroinitializer |
242 | // CHECK-ASM: vlrepf |
243 | vd = vec_splats(d); |
244 | // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> undef, <2 x i32> zeroinitializer |
245 | // CHECK-ASM: vlrepg |
246 | |
247 | vf = vec_mergeh(vf, vf); |
248 | // shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 0, i32 4, i32 1, i32 5> |
249 | // CHECK-ASM: vmrhf |
250 | vd = vec_mergeh(vd, vd); |
251 | // shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 0, i32 2> |
252 | // CHECK-ASM: vmrhg |
253 | |
254 | vf = vec_mergel(vf, vf); |
255 | // shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <i32 2, i32 6, i32 3, i32 7> |
256 | // CHECK-ASM: vmrlf |
257 | vd = vec_mergel(vd, vd); |
258 | // shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <i32 1, i32 3> |
259 | // CHECK-ASM: vmrlg |
260 | } |
261 | |
262 | void test_compare(void) { |
263 | // CHECK-ASM-LABEL: test_compare |
264 | |
265 | vbi = vec_cmpeq(vf, vf); |
266 | // CHECK: fcmp oeq <4 x float> %{{.*}}, %{{.*}} |
267 | // CHECK-ASM: vfcesb |
268 | vbl = vec_cmpeq(vd, vd); |
269 | // CHECK: fcmp oeq <2 x double> %{{.*}}, %{{.*}} |
270 | // CHECK-ASM: vfcedb |
271 | |
272 | vbi = vec_cmpge(vf, vf); |
273 | // CHECK: fcmp oge <4 x float> %{{.*}}, %{{.*}} |
274 | // CHECK-ASM: vfchesb |
275 | vbl = vec_cmpge(vd, vd); |
276 | // CHECK: fcmp oge <2 x double> %{{.*}}, %{{.*}} |
277 | // CHECK-ASM: vfchedb |
278 | |
279 | vbi = vec_cmpgt(vf, vf); |
280 | // CHECK: fcmp ogt <4 x float> %{{.*}}, %{{.*}} |
281 | // CHECK-ASM: vfchsb |
282 | vbl = vec_cmpgt(vd, vd); |
283 | // CHECK: fcmp ogt <2 x double> %{{.*}}, %{{.*}} |
284 | // CHECK-ASM: vfchdb |
285 | |
286 | vbi = vec_cmple(vf, vf); |
287 | // CHECK: fcmp ole <4 x float> %{{.*}}, %{{.*}} |
288 | // CHECK-ASM: vfchesb |
289 | vbl = vec_cmple(vd, vd); |
290 | // CHECK: fcmp ole <2 x double> %{{.*}}, %{{.*}} |
291 | // CHECK-ASM: vfchedb |
292 | |
293 | vbi = vec_cmplt(vf, vf); |
294 | // CHECK: fcmp olt <4 x float> %{{.*}}, %{{.*}} |
295 | // CHECK-ASM: vfchsb |
296 | vbl = vec_cmplt(vd, vd); |
297 | // CHECK: fcmp olt <2 x double> %{{.*}}, %{{.*}} |
298 | // CHECK-ASM: vfchdb |
299 | |
300 | idx = vec_all_eq(vf, vf); |
301 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
302 | // CHECK-ASM: vfcesbs |
303 | idx = vec_all_eq(vd, vd); |
304 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
305 | // CHECK-ASM: vfcedbs |
306 | |
307 | idx = vec_all_ne(vf, vf); |
308 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
309 | // CHECK-ASM: vfcesbs |
310 | idx = vec_all_ne(vd, vd); |
311 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
312 | // CHECK-ASM: vfcedbs |
313 | |
314 | idx = vec_all_ge(vf, vf); |
315 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
316 | // CHECK-ASM: vfchesbs |
317 | idx = vec_all_ge(vd, vd); |
318 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
319 | // CHECK-ASM: vfchedbs |
320 | |
321 | idx = vec_all_gt(vf, vf); |
322 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
323 | // CHECK-ASM: vfchsbs |
324 | idx = vec_all_gt(vd, vd); |
325 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
326 | // CHECK-ASM: vfchdbs |
327 | |
328 | idx = vec_all_le(vf, vf); |
329 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
330 | // CHECK-ASM: vfchesbs |
331 | idx = vec_all_le(vd, vd); |
332 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
333 | // CHECK-ASM: vfchedbs |
334 | |
335 | idx = vec_all_lt(vf, vf); |
336 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
337 | // CHECK-ASM: vfchsbs |
338 | idx = vec_all_lt(vd, vd); |
339 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
340 | // CHECK-ASM: vfchdbs |
341 | |
342 | idx = vec_all_nge(vf, vf); |
343 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
344 | // CHECK-ASM: vfchesbs |
345 | idx = vec_all_nge(vd, vd); |
346 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
347 | // CHECK-ASM: vfchedbs |
348 | |
349 | idx = vec_all_ngt(vf, vf); |
350 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
351 | // CHECK-ASM: vfchsbs |
352 | idx = vec_all_ngt(vd, vd); |
353 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
354 | // CHECK-ASM: vfchdbs |
355 | |
356 | idx = vec_all_nle(vf, vf); |
357 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
358 | // CHECK-ASM: vfchesbs |
359 | idx = vec_all_nle(vd, vd); |
360 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
361 | // CHECK-ASM: vfchedbs |
362 | |
363 | idx = vec_all_nlt(vf, vf); |
364 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
365 | // CHECK-ASM: vfchsbs |
366 | idx = vec_all_nlt(vd, vd); |
367 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
368 | // CHECK-ASM: vfchdbs |
369 | |
370 | idx = vec_all_nan(vf); |
371 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15) |
372 | // CHECK-ASM: vftcisb |
373 | idx = vec_all_nan(vd); |
374 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15) |
375 | // CHECK-ASM: vftcidb |
376 | |
377 | idx = vec_all_numeric(vf); |
378 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15) |
379 | // CHECK-ASM: vftcisb |
380 | idx = vec_all_numeric(vd); |
381 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15) |
382 | // CHECK-ASM: vftcidb |
383 | |
384 | idx = vec_any_eq(vf, vf); |
385 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
386 | // CHECK-ASM: vfcesbs |
387 | idx = vec_any_eq(vd, vd); |
388 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
389 | // CHECK-ASM: vfcedbs |
390 | |
391 | idx = vec_any_ne(vf, vf); |
392 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
393 | // CHECK-ASM: vfcesbs |
394 | idx = vec_any_ne(vd, vd); |
395 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
396 | // CHECK-ASM: vfcedbs |
397 | |
398 | idx = vec_any_ge(vf, vf); |
399 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
400 | // CHECK-ASM: vfchesbs |
401 | idx = vec_any_ge(vd, vd); |
402 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
403 | // CHECK-ASM: vfchedbs |
404 | |
405 | idx = vec_any_gt(vf, vf); |
406 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
407 | // CHECK-ASM: vfchsbs |
408 | idx = vec_any_gt(vd, vd); |
409 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
410 | // CHECK-ASM: vfchdbs |
411 | |
412 | idx = vec_any_le(vf, vf); |
413 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
414 | // CHECK-ASM: vfchesbs |
415 | idx = vec_any_le(vd, vd); |
416 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
417 | // CHECK-ASM: vfchedbs |
418 | |
419 | idx = vec_any_lt(vf, vf); |
420 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
421 | // CHECK-ASM: vfchsbs |
422 | idx = vec_any_lt(vd, vd); |
423 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
424 | // CHECK-ASM: vfchdbs |
425 | |
426 | idx = vec_any_nge(vf, vf); |
427 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
428 | // CHECK-ASM: vfchesbs |
429 | idx = vec_any_nge(vd, vd); |
430 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
431 | // CHECK-ASM: vfchedbs |
432 | |
433 | idx = vec_any_ngt(vf, vf); |
434 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
435 | // CHECK-ASM: vfchsbs |
436 | idx = vec_any_ngt(vd, vd); |
437 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
438 | // CHECK-ASM: vfchdbs |
439 | |
440 | idx = vec_any_nle(vf, vf); |
441 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
442 | // CHECK-ASM: vfchesbs |
443 | idx = vec_any_nle(vd, vd); |
444 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
445 | // CHECK-ASM: vfchedbs |
446 | |
447 | idx = vec_any_nlt(vf, vf); |
448 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}}) |
449 | // CHECK-ASM: vfchsbs |
450 | idx = vec_any_nlt(vd, vd); |
451 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}}) |
452 | // CHECK-ASM: vfchdbs |
453 | |
454 | idx = vec_any_nan(vf); |
455 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15) |
456 | // CHECK-ASM: vftcisb |
457 | idx = vec_any_nan(vd); |
458 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15) |
459 | // CHECK-ASM: vftcidb |
460 | |
461 | idx = vec_any_numeric(vf); |
462 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15) |
463 | // CHECK-ASM: vftcisb |
464 | idx = vec_any_numeric(vd); |
465 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15) |
466 | // CHECK-ASM: vftcidb |
467 | } |
468 | |
469 | void test_integer(void) { |
470 | // CHECK-ASM-LABEL: test_integer |
471 | |
472 | vf = vec_andc(vf, vf); |
473 | // CHECK-ASM: vnc |
474 | vd = vec_andc(vd, vd); |
475 | // CHECK-ASM: vnc |
476 | |
477 | vf = vec_nor(vf, vf); |
478 | // CHECK-ASM: vno |
479 | vd = vec_nor(vd, vd); |
480 | // CHECK-ASM: vno |
481 | |
482 | vsc = vec_nand(vsc, vsc); |
483 | // CHECK-ASM: vnn |
484 | vuc = vec_nand(vuc, vuc); |
485 | // CHECK-ASM: vnn |
486 | vbc = vec_nand(vbc, vbc); |
487 | // CHECK-ASM: vnn |
488 | vss = vec_nand(vss, vss); |
489 | // CHECK-ASM: vnn |
490 | vus = vec_nand(vus, vus); |
491 | // CHECK-ASM: vnn |
492 | vbs = vec_nand(vbs, vbs); |
493 | // CHECK-ASM: vnn |
494 | vsi = vec_nand(vsi, vsi); |
495 | // CHECK-ASM: vnn |
496 | vui = vec_nand(vui, vui); |
497 | // CHECK-ASM: vnn |
498 | vbi = vec_nand(vbi, vbi); |
499 | // CHECK-ASM: vnn |
500 | vsl = vec_nand(vsl, vsl); |
501 | // CHECK-ASM: vnn |
502 | vul = vec_nand(vul, vul); |
503 | // CHECK-ASM: vnn |
504 | vbl = vec_nand(vbl, vbl); |
505 | // CHECK-ASM: vnn |
506 | vf = vec_nand(vf, vf); |
507 | // CHECK-ASM: vnn |
508 | vd = vec_nand(vd, vd); |
509 | // CHECK-ASM: vnn |
510 | |
511 | vsc = vec_orc(vsc, vsc); |
512 | // CHECK-ASM: voc |
513 | vuc = vec_orc(vuc, vuc); |
514 | // CHECK-ASM: voc |
515 | vbc = vec_orc(vbc, vbc); |
516 | // CHECK-ASM: voc |
517 | vss = vec_orc(vss, vss); |
518 | // CHECK-ASM: voc |
519 | vus = vec_orc(vus, vus); |
520 | // CHECK-ASM: voc |
521 | vbs = vec_orc(vbs, vbs); |
522 | // CHECK-ASM: voc |
523 | vsi = vec_orc(vsi, vsi); |
524 | // CHECK-ASM: voc |
525 | vui = vec_orc(vui, vui); |
526 | // CHECK-ASM: voc |
527 | vbi = vec_orc(vbi, vbi); |
528 | // CHECK-ASM: voc |
529 | vsl = vec_orc(vsl, vsl); |
530 | // CHECK-ASM: voc |
531 | vul = vec_orc(vul, vul); |
532 | // CHECK-ASM: voc |
533 | vbl = vec_orc(vbl, vbl); |
534 | // CHECK-ASM: voc |
535 | vf = vec_orc(vf, vf); |
536 | // CHECK-ASM: voc |
537 | vd = vec_orc(vd, vd); |
538 | // CHECK-ASM: voc |
539 | |
540 | vsc = vec_eqv(vsc, vsc); |
541 | // CHECK-ASM: vnx |
542 | vuc = vec_eqv(vuc, vuc); |
543 | // CHECK-ASM: vnx |
544 | vbc = vec_eqv(vbc, vbc); |
545 | // CHECK-ASM: vnx |
546 | vss = vec_eqv(vss, vss); |
547 | // CHECK-ASM: vnx |
548 | vus = vec_eqv(vus, vus); |
549 | // CHECK-ASM: vnx |
550 | vbs = vec_eqv(vbs, vbs); |
551 | // CHECK-ASM: vnx |
552 | vsi = vec_eqv(vsi, vsi); |
553 | // CHECK-ASM: vnx |
554 | vui = vec_eqv(vui, vui); |
555 | // CHECK-ASM: vnx |
556 | vbi = vec_eqv(vbi, vbi); |
557 | // CHECK-ASM: vnx |
558 | vsl = vec_eqv(vsl, vsl); |
559 | // CHECK-ASM: vnx |
560 | vul = vec_eqv(vul, vul); |
561 | // CHECK-ASM: vnx |
562 | vbl = vec_eqv(vbl, vbl); |
563 | // CHECK-ASM: vnx |
564 | vf = vec_eqv(vf, vf); |
565 | // CHECK-ASM: vnx |
566 | vd = vec_eqv(vd, vd); |
567 | // CHECK-ASM: vnx |
568 | |
569 | vuc = vec_popcnt(vsc); |
570 | // CHECK: call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %{{.*}}) |
571 | // CHECK-ASM: vpopctb |
572 | vuc = vec_popcnt(vuc); |
573 | // CHECK: call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %{{.*}}) |
574 | // CHECK-ASM: vpopctb |
575 | vus = vec_popcnt(vss); |
576 | // CHECK: call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %{{.*}}) |
577 | // CHECK-ASM: vpopcth |
578 | vus = vec_popcnt(vus); |
579 | // CHECK: call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %{{.*}}) |
580 | // CHECK-ASM: vpopcth |
581 | vui = vec_popcnt(vsi); |
582 | // CHECK: call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %{{.*}}) |
583 | // CHECK-ASM: vpopctf |
584 | vui = vec_popcnt(vui); |
585 | // CHECK: call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %{{.*}}) |
586 | // CHECK-ASM: vpopctf |
587 | vul = vec_popcnt(vsl); |
588 | // CHECK: call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %{{.*}}) |
589 | // CHECK-ASM: vpopctg |
590 | vul = vec_popcnt(vul); |
591 | // CHECK: call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %{{.*}}) |
592 | // CHECK-ASM: vpopctg |
593 | |
594 | vf = vec_slb(vf, vsi); |
595 | // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
596 | // CHECK-ASM: vslb |
597 | vf = vec_slb(vf, vui); |
598 | // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
599 | // CHECK-ASM: vslb |
600 | vd = vec_slb(vd, vsl); |
601 | // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
602 | // CHECK-ASM: vslb |
603 | vd = vec_slb(vd, vul); |
604 | // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
605 | // CHECK-ASM: vslb |
606 | |
607 | vf = vec_sld(vf, vf, 0); |
608 | // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 0) |
609 | // CHECK-ASM: vsldb |
610 | vf = vec_sld(vf, vf, 15); |
611 | // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 15) |
612 | // CHECK-ASM: vsldb |
613 | vd = vec_sld(vd, vd, 0); |
614 | // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 0) |
615 | // CHECK-ASM: vsldb |
616 | vd = vec_sld(vd, vd, 15); |
617 | // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 15) |
618 | // CHECK-ASM: vsldb |
619 | |
620 | vf = vec_srab(vf, vsi); |
621 | // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
622 | // CHECK-ASM: vsrab |
623 | vf = vec_srab(vf, vui); |
624 | // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
625 | // CHECK-ASM: vsrab |
626 | vd = vec_srab(vd, vsl); |
627 | // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
628 | // CHECK-ASM: vsrab |
629 | vd = vec_srab(vd, vul); |
630 | // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
631 | // CHECK-ASM: vsrab |
632 | |
633 | vf = vec_srb(vf, vsi); |
634 | // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
635 | // CHECK-ASM: vsrlb |
636 | vf = vec_srb(vf, vui); |
637 | // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
638 | // CHECK-ASM: vsrlb |
639 | vd = vec_srb(vd, vsl); |
640 | // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
641 | // CHECK-ASM: vsrlb |
642 | vd = vec_srb(vd, vul); |
643 | // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
644 | // CHECK-ASM: vsrlb |
645 | |
646 | idx = vec_test_mask(vf, vui); |
647 | // CHECK: call i32 @llvm.s390.vtm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
648 | // CHECK-ASM: vtm |
649 | idx = vec_test_mask(vd, vul); |
650 | // CHECK: call i32 @llvm.s390.vtm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) |
651 | // CHECK-ASM: vtm |
652 | |
653 | vuc = vec_msum_u128(vul, vul, vuc, 0); |
654 | // CHECK: call <16 x i8> @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <16 x i8> %{{.*}}, i32 0) |
655 | // CHECK-ASM: vmslg |
656 | vuc = vec_msum_u128(vul, vul, vuc, 4); |
657 | // CHECK: call <16 x i8> @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <16 x i8> %{{.*}}, i32 4) |
658 | // CHECK-ASM: vmslg |
659 | vuc = vec_msum_u128(vul, vul, vuc, 8); |
660 | // CHECK: call <16 x i8> @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <16 x i8> %{{.*}}, i32 8) |
661 | // CHECK-ASM: vmslg |
662 | vuc = vec_msum_u128(vul, vul, vuc, 12); |
663 | // CHECK: call <16 x i8> @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <16 x i8> %{{.*}}, i32 12) |
664 | // CHECK-ASM: vmslg |
665 | } |
666 | |
667 | void test_float(void) { |
668 | // CHECK-ASM-LABEL: test_float |
669 | |
670 | vf = vec_abs(vf); |
671 | // CHECK: call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{.*}}) |
672 | // CHECK-ASM: vflpsb |
673 | vd = vec_abs(vd); |
674 | // CHECK: call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{.*}}) |
675 | // CHECK-ASM: vflpdb |
676 | |
677 | vf = vec_nabs(vf); |
678 | // CHECK: [[ABS:%[^ ]+]] = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{.*}}) |
679 | // CHECK-NEXT: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, [[ABS]] |
680 | // CHECK-ASM: vflnsb |
681 | vd = vec_nabs(vd); |
682 | // CHECK: [[ABS:%[^ ]+]] = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{.*}}) |
683 | // CHECK-NEXT: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, [[ABS]] |
684 | // CHECK-ASM: vflndb |
685 | |
686 | vf = vec_max(vf, vf); |
687 | // CHECK: call <4 x float> @llvm.s390.vfmaxsb(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i32 0) |
688 | // CHECK-ASM: vfmaxsb |
689 | vd = vec_max(vd, vd); |
690 | // CHECK: call <2 x double> @llvm.s390.vfmaxdb(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i32 0) |
691 | // CHECK-ASM: vfmaxdb |
692 | |
693 | vf = vec_min(vf, vf); |
694 | // CHECK: call <4 x float> @llvm.s390.vfminsb(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i32 0) |
695 | // CHECK-ASM: vfminsb |
696 | vd = vec_min(vd, vd); |
697 | // CHECK: call <2 x double> @llvm.s390.vfmindb(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i32 0) |
698 | // CHECK-ASM: vfmindb |
699 | |
700 | vf = vec_madd(vf, vf, vf); |
701 | // CHECK: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}) |
702 | // CHECK-ASM: vfmasb |
703 | vd = vec_madd(vd, vd, vd); |
704 | // CHECK: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}) |
705 | // CHECK-ASM: vfmadb |
706 | |
707 | vf = vec_msub(vf, vf, vf); |
708 | // CHECK: [[NEG:%[^ ]+]] = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %{{.*}} |
709 | // CHECK: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]]) |
710 | // CHECK-ASM: vfmssb |
711 | vd = vec_msub(vd, vd, vd); |
712 | // CHECK: [[NEG:%[^ ]+]] = fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %{{.*}} |
713 | // CHECK: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]]) |
714 | // CHECK-ASM: vfmsdb |
715 | |
716 | vf = vec_nmadd(vf, vf, vf); |
717 | // CHECK: [[RES:%[^ ]+]] = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}) |
718 | // CHECK: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, [[RES]] |
719 | // CHECK-ASM: vfnmasb |
720 | vd = vec_nmadd(vd, vd, vd); |
721 | // CHECK: [[RES:%[^ ]+]] = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}) |
722 | // CHECK: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, [[RES]] |
723 | // CHECK-ASM: vfnmadb |
724 | |
725 | vf = vec_nmsub(vf, vf, vf); |
726 | // CHECK: [[NEG:%[^ ]+]] = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %{{.*}} |
727 | // CHECK: [[RES:%[^ ]+]] = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]]) |
728 | // CHECK: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, [[RES]] |
729 | // CHECK-ASM: vfnmssb |
730 | vd = vec_nmsub(vd, vd, vd); |
731 | // CHECK: [[NEG:%[^ ]+]] = fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %{{.*}} |
732 | // CHECK: [[RES:%[^ ]+]] = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]]) |
733 | // CHECK: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, [[RES]] |
734 | // CHECK-ASM: vfnmsdb |
735 | |
736 | vf = vec_sqrt(vf); |
737 | // CHECK: call <4 x float> @llvm.sqrt.v4f32(<4 x float> %{{.*}}) |
738 | // CHECK-ASM: vfsqsb |
739 | vd = vec_sqrt(vd); |
740 | // CHECK: call <2 x double> @llvm.sqrt.v2f64(<2 x double> %{{.*}}) |
741 | // CHECK-ASM: vfsqdb |
742 | |
743 | vd = vec_doublee(vf); |
744 | // CHECK: fpext <2 x float> %{{.*}} to <2 x double> |
745 | // CHECK-ASM: vldeb |
746 | vf = vec_floate(vd); |
747 | // CHECK: fptrunc <2 x double> %{{.*}} to <2 x float> |
748 | // CHECK-ASM: vledb |
749 | |
750 | vd = vec_double(vsl); |
751 | // CHECK: sitofp <2 x i64> %{{.*}} to <2 x double> |
752 | // CHECK-ASM: vcdgb |
753 | vd = vec_double(vul); |
754 | // CHECK: uitofp <2 x i64> %{{.*}} to <2 x double> |
755 | // CHECK-ASM: vcdlgb |
756 | |
757 | vsl = vec_signed(vd); |
758 | // CHECK: fptosi <2 x double> %{{.*}} to <2 x i64> |
759 | // CHECK-ASM: vcgdb |
760 | vul = vec_unsigned(vd); |
761 | // CHECK: fptoui <2 x double> %{{.*}} to <2 x i64> |
762 | // CHECK-ASM: vclgdb |
763 | |
764 | vf = vec_roundp(vf); |
765 | // CHECK: call <4 x float> @llvm.ceil.v4f32(<4 x float> %{{.*}}) |
766 | // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 6 |
767 | vf = vec_ceil(vf); |
768 | // CHECK: call <4 x float> @llvm.ceil.v4f32(<4 x float> %{{.*}}) |
769 | // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 6 |
770 | vd = vec_roundp(vd); |
771 | // CHECK: call <2 x double> @llvm.ceil.v2f64(<2 x double> %{{.*}}) |
772 | // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 6 |
773 | vd = vec_ceil(vd); |
774 | // CHECK: call <2 x double> @llvm.ceil.v2f64(<2 x double> %{{.*}}) |
775 | // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 6 |
776 | |
777 | vf = vec_roundm(vf); |
778 | // CHECK: call <4 x float> @llvm.floor.v4f32(<4 x float> %{{.*}}) |
779 | // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 7 |
780 | vf = vec_floor(vf); |
781 | // CHECK: call <4 x float> @llvm.floor.v4f32(<4 x float> %{{.*}}) |
782 | // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 7 |
783 | vd = vec_roundm(vd); |
784 | // CHECK: call <2 x double> @llvm.floor.v2f64(<2 x double> %{{.*}}) |
785 | // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 7 |
786 | vd = vec_floor(vd); |
787 | // CHECK: call <2 x double> @llvm.floor.v2f64(<2 x double> %{{.*}}) |
788 | // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 7 |
789 | |
790 | vf = vec_roundz(vf); |
791 | // CHECK: call <4 x float> @llvm.trunc.v4f32(<4 x float> %{{.*}}) |
792 | // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 5 |
793 | vf = vec_trunc(vf); |
794 | // CHECK: call <4 x float> @llvm.trunc.v4f32(<4 x float> %{{.*}}) |
795 | // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 5 |
796 | vd = vec_roundz(vd); |
797 | // CHECK: call <2 x double> @llvm.trunc.v2f64(<2 x double> %{{.*}}) |
798 | // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 5 |
799 | vd = vec_trunc(vd); |
800 | // CHECK: call <2 x double> @llvm.trunc.v2f64(<2 x double> %{{.*}}) |
801 | // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 5 |
802 | |
803 | vf = vec_roundc(vf); |
804 | // CHECK: call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %{{.*}}) |
805 | // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 0 |
806 | vd = vec_roundc(vd); |
807 | // CHECK: call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %{{.*}}) |
808 | // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 0 |
809 | |
810 | vf = vec_rint(vf); |
811 | // CHECK: call <4 x float> @llvm.rint.v4f32(<4 x float> %{{.*}}) |
812 | // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 0, 0 |
813 | vd = vec_rint(vd); |
814 | // CHECK: call <2 x double> @llvm.rint.v2f64(<2 x double> %{{.*}}) |
815 | // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 0, 0 |
816 | |
817 | vf = vec_round(vf); |
818 | // CHECK: call <4 x float> @llvm.s390.vfisb(<4 x float> %{{.*}}, i32 4, i32 4) |
819 | // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 4 |
820 | vd = vec_round(vd); |
821 | // CHECK: call <2 x double> @llvm.s390.vfidb(<2 x double> %{{.*}}, i32 4, i32 4) |
822 | // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 4 |
823 | |
824 | vbi = vec_fp_test_data_class(vf, 0, &cc); |
825 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 0) |
826 | // CHECK-ASM: vftcisb |
827 | vbi = vec_fp_test_data_class(vf, 4095, &cc); |
828 | // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 4095) |
829 | // CHECK-ASM: vftcisb |
830 | vbl = vec_fp_test_data_class(vd, 0, &cc); |
831 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 0) |
832 | // CHECK-ASM: vftcidb |
833 | vbl = vec_fp_test_data_class(vd, 4095, &cc); |
834 | // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 4095) |
835 | // CHECK-ASM: vftcidb |
836 | } |
837 | |