1 // REQUIRES: systemz-registered-target
2 // RUN: %clang_cc1 -target-cpu z14 -triple s390x-linux-gnu \
3 // RUN: -O2 -fzvector -flax-vector-conversions=none \
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: -O2 -fzvector -flax-vector-conversions=none \
7 // RUN: -Wall -Wno-unused -Werror -S %s -o - | FileCheck %s --check-prefix=CHECK-ASM
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
;
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
;
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
;
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
;
61 volatile unsigned int len
;
65 void test_core(void) {
66 // CHECK-ASM-LABEL: test_core
70 f
= vec_extract(vf
, 0);
71 // CHECK: extractelement <4 x float> %{{.*}}, i64 0
73 f
= vec_extract(vf
, idx
);
74 // CHECK: extractelement <4 x float> %{{.*}}, i32 %{{.*}}
76 d
= vec_extract(vd
, 0);
77 // CHECK: extractelement <2 x double> %{{.*}}, i64 0
79 d
= vec_extract(vd
, idx
);
80 // CHECK: extractelement <2 x double> %{{.*}}, i32 %{{.*}}
84 vf
= vec_insert(f
, vf2
, 0);
85 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
87 vf
= vec_insert(0.0f
, vf
, 1);
88 // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i64 1
89 // CHECK-ASM: vleif %{{.*}}, 0, 1
90 vf
= vec_insert(f
, vf
, idx
);
91 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 %{{.*}}
94 vd
= vec_insert(d
, vd2
, 0);
95 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
97 vd
= vec_insert(0.0, vd
, 1);
98 // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i64 1
99 // CHECK-ASM: vleig %{{.*}}, 0, 1
100 vd
= vec_insert(d
, vd
, idx
);
101 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 %{{.*}}
104 vf
= vec_promote(f
, idx
);
105 // CHECK: insertelement <4 x float> poison, float %{{.*}}, i32 %{{.*}}
107 vd
= vec_promote(d
, idx
);
108 // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 %{{.*}}
111 vf
= vec_insert_and_zero(cptrf
);
112 // CHECK: insertelement <4 x float> <float 0.000000e+00, float poison, float 0.000000e+00, float 0.000000e+00>, float %{{.*}}, i64 1
114 vd
= vec_insert_and_zero(cptrd
);
115 // CHECK: insertelement <2 x double> <double poison, double 0.000000e+00>, double %{{.*}}, i64 0
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> %{{.*}})
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> %{{.*}})
125 vul
= vec_bperm_u128(vuc
, vuc
);
126 // CHECK: call <2 x i64> @llvm.s390.vbperm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
137 // CHECK-ASM: {{vperm|vpdi}}
139 vf
= vec_sel(vf
, vf
, vui
);
141 vf
= vec_sel(vf
, vf
, vbi
);
143 vd
= vec_sel(vd
, vd
, vul
);
145 vd
= vec_sel(vd
, vd
, vbl
);
148 vf
= vec_gather_element(vf
, vui
, cptrf
, 0);
149 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 0
150 vf
= vec_gather_element(vf
, vui
, cptrf
, 1);
151 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 1
152 vf
= vec_gather_element(vf
, vui
, cptrf
, 2);
153 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 2
154 vf
= vec_gather_element(vf
, vui
, cptrf
, 3);
155 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 3
156 vd
= vec_gather_element(vd
, vul
, cptrd
, 0);
157 // CHECK-ASM: vgeg %{{.*}}, 0(%{{.*}},%{{.*}}), 0
158 vd
= vec_gather_element(vd
, vul
, cptrd
, 1);
159 // CHECK-ASM: vgeg %{{.*}}, 0(%{{.*}},%{{.*}}), 1
161 vec_scatter_element(vf
, vui
, ptrf
, 0);
162 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 0
163 vec_scatter_element(vf
, vui
, ptrf
, 1);
164 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 1
165 vec_scatter_element(vf
, vui
, ptrf
, 2);
166 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 2
167 vec_scatter_element(vf
, vui
, ptrf
, 3);
168 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 3
169 vec_scatter_element(vd
, vul
, ptrd
, 0);
170 // CHECK-ASM: vsceg %{{.*}}, 0(%{{.*}},%{{.*}}), 0
171 vec_scatter_element(vd
, vul
, ptrd
, 1);
172 // CHECK-ASM: vsceg %{{.*}}, 0(%{{.*}},%{{.*}}), 1
174 vf
= vec_xl(idx
, cptrf
);
176 vd
= vec_xl(idx
, cptrd
);
179 vec_xst(vf
, idx
, ptrf
);
181 vec_xst(vd
, idx
, ptrd
);
184 vd
= vec_load_bndry(cptrd
, 64);
185 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 0)
187 vf
= vec_load_bndry(cptrf
, 64);
188 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 0)
190 vf
= vec_load_bndry(cptrf
, 128);
191 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 1)
193 vf
= vec_load_bndry(cptrf
, 256);
194 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 2)
196 vf
= vec_load_bndry(cptrf
, 512);
197 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 3)
199 vf
= vec_load_bndry(cptrf
, 1024);
200 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 4)
202 vf
= vec_load_bndry(cptrf
, 2048);
203 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 5)
205 vf
= vec_load_bndry(cptrf
, 4096);
206 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 6)
209 vf
= vec_load_len(cptrf
, idx
);
210 // CHECK: call <16 x i8> @llvm.s390.vll(i32 %{{.*}}, ptr %{{.*}})
212 vd
= vec_load_len(cptrd
, idx
);
213 // CHECK: call <16 x i8> @llvm.s390.vll(i32 %{{.*}}, ptr %{{.*}})
216 vec_store_len(vf
, ptrf
, idx
);
217 // CHECK: call void @llvm.s390.vstl(<16 x i8> %{{.*}}, i32 %{{.*}}, ptr %{{.*}})
219 vec_store_len(vd
, ptrd
, idx
);
220 // CHECK: call void @llvm.s390.vstl(<16 x i8> %{{.*}}, i32 %{{.*}}, ptr %{{.*}})
223 vuc
= vec_load_len_r(cptruc
, 0);
224 // CHECK: call <16 x i8> @llvm.s390.vlrl(i32 0, ptr %{{.*}})
225 // CHECK-ASM: vlrl %{{.*}}, 0(%{{.*}}), 0
226 vuc
= vec_load_len_r(cptruc
, idx
);
227 // CHECK: call <16 x i8> @llvm.s390.vlrl(i32 %{{.*}}, ptr %{{.*}})
230 vec_store_len_r(vuc
, ptruc
, 0);
231 // CHECK: call void @llvm.s390.vstrl(<16 x i8> %{{.*}}, i32 0, ptr %{{.*}})
232 // CHECK-ASM: vstrl %{{.*}}, 0(%{{.*}}), 0
233 vec_store_len_r(vuc
, ptruc
, idx
);
234 // CHECK: call void @llvm.s390.vstrl(<16 x i8> %{{.*}}, i32 %{{.*}}, ptr %{{.*}})
237 vf
= vec_splat(vf
, 0);
238 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> poison, <4 x i32> zeroinitializer
240 vf
= vec_splat(vf
, 1);
241 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
243 vd
= vec_splat(vd
, 0);
244 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> zeroinitializer
246 vd
= vec_splat(vd
, 1);
247 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> undef, <2 x i32> <i32 1, i32 1>
251 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> poison, <4 x i32> zeroinitializer
254 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> zeroinitializer
257 vf
= vec_mergeh(vf
, vf
);
258 // shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
260 vd
= vec_mergeh(vd
, vd
);
261 // shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 0, i32 2>
264 vf
= vec_mergel(vf
, vf
);
265 // shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <i32 2, i32 6, i32 3, i32 7>
267 vd
= vec_mergel(vd
, vd
);
268 // shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <i32 1, i32 3>
272 void test_compare(void) {
273 // CHECK-ASM-LABEL: test_compare
275 vbi
= vec_cmpeq(vf
, vf
);
276 // CHECK: fcmp oeq <4 x float> %{{.*}}, %{{.*}}
278 vbl
= vec_cmpeq(vd
, vd
);
279 // CHECK: fcmp oeq <2 x double> %{{.*}}, %{{.*}}
282 vbi
= vec_cmpge(vf
, vf
);
283 // CHECK: fcmp oge <4 x float> %{{.*}}, %{{.*}}
284 // CHECK-ASM: vfchesb
285 vbl
= vec_cmpge(vd
, vd
);
286 // CHECK: fcmp oge <2 x double> %{{.*}}, %{{.*}}
287 // CHECK-ASM: vfchedb
289 vbi
= vec_cmpgt(vf
, vf
);
290 // CHECK: fcmp ogt <4 x float> %{{.*}}, %{{.*}}
292 vbl
= vec_cmpgt(vd
, vd
);
293 // CHECK: fcmp ogt <2 x double> %{{.*}}, %{{.*}}
296 vbi
= vec_cmple(vf
, vf
);
297 // CHECK: fcmp ole <4 x float> %{{.*}}, %{{.*}}
298 // CHECK-ASM: vfchesb
299 vbl
= vec_cmple(vd
, vd
);
300 // CHECK: fcmp ole <2 x double> %{{.*}}, %{{.*}}
301 // CHECK-ASM: vfchedb
303 vbi
= vec_cmplt(vf
, vf
);
304 // CHECK: fcmp olt <4 x float> %{{.*}}, %{{.*}}
306 vbl
= vec_cmplt(vd
, vd
);
307 // CHECK: fcmp olt <2 x double> %{{.*}}, %{{.*}}
310 idx
= vec_all_eq(vf
, vf
);
311 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
312 // CHECK-ASM: vfcesbs
313 idx
= vec_all_eq(vd
, vd
);
314 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
315 // CHECK-ASM: vfcedbs
317 idx
= vec_all_ne(vf
, vf
);
318 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
319 // CHECK-ASM: vfcesbs
320 idx
= vec_all_ne(vd
, vd
);
321 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
322 // CHECK-ASM: vfcedbs
324 idx
= vec_all_ge(vf
, vf
);
325 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
326 // CHECK-ASM: vfchesbs
327 idx
= vec_all_ge(vd
, vd
);
328 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
329 // CHECK-ASM: vfchedbs
331 idx
= vec_all_gt(vf
, vf
);
332 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
333 // CHECK-ASM: vfchsbs
334 idx
= vec_all_gt(vd
, vd
);
335 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
336 // CHECK-ASM: vfchdbs
338 idx
= vec_all_le(vf
, vf
);
339 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
340 // CHECK-ASM: vfchesbs
341 idx
= vec_all_le(vd
, vd
);
342 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
343 // CHECK-ASM: vfchedbs
345 idx
= vec_all_lt(vf
, vf
);
346 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
347 // CHECK-ASM: vfchsbs
348 idx
= vec_all_lt(vd
, vd
);
349 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
350 // CHECK-ASM: vfchdbs
352 idx
= vec_all_nge(vf
, vf
);
353 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
354 // CHECK-ASM: vfchesbs
355 idx
= vec_all_nge(vd
, vd
);
356 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
357 // CHECK-ASM: vfchedbs
359 idx
= vec_all_ngt(vf
, vf
);
360 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
361 // CHECK-ASM: vfchsbs
362 idx
= vec_all_ngt(vd
, vd
);
363 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
364 // CHECK-ASM: vfchdbs
366 idx
= vec_all_nle(vf
, vf
);
367 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
368 // CHECK-ASM: vfchesbs
369 idx
= vec_all_nle(vd
, vd
);
370 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
371 // CHECK-ASM: vfchedbs
373 idx
= vec_all_nlt(vf
, vf
);
374 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
375 // CHECK-ASM: vfchsbs
376 idx
= vec_all_nlt(vd
, vd
);
377 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
378 // CHECK-ASM: vfchdbs
380 idx
= vec_all_nan(vf
);
381 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)
382 // CHECK-ASM: vftcisb
383 idx
= vec_all_nan(vd
);
384 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)
385 // CHECK-ASM: vftcidb
387 idx
= vec_all_numeric(vf
);
388 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)
389 // CHECK-ASM: vftcisb
390 idx
= vec_all_numeric(vd
);
391 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)
392 // CHECK-ASM: vftcidb
394 idx
= vec_any_eq(vf
, vf
);
395 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
396 // CHECK-ASM: vfcesbs
397 idx
= vec_any_eq(vd
, vd
);
398 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
399 // CHECK-ASM: vfcedbs
401 idx
= vec_any_ne(vf
, vf
);
402 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
403 // CHECK-ASM: vfcesbs
404 idx
= vec_any_ne(vd
, vd
);
405 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
406 // CHECK-ASM: vfcedbs
408 idx
= vec_any_ge(vf
, vf
);
409 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
410 // CHECK-ASM: vfchesbs
411 idx
= vec_any_ge(vd
, vd
);
412 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
413 // CHECK-ASM: vfchedbs
415 idx
= vec_any_gt(vf
, vf
);
416 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
417 // CHECK-ASM: vfchsbs
418 idx
= vec_any_gt(vd
, vd
);
419 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
420 // CHECK-ASM: vfchdbs
422 idx
= vec_any_le(vf
, vf
);
423 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
424 // CHECK-ASM: vfchesbs
425 idx
= vec_any_le(vd
, vd
);
426 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
427 // CHECK-ASM: vfchedbs
429 idx
= vec_any_lt(vf
, vf
);
430 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
431 // CHECK-ASM: vfchsbs
432 idx
= vec_any_lt(vd
, vd
);
433 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
434 // CHECK-ASM: vfchdbs
436 idx
= vec_any_nge(vf
, vf
);
437 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
438 // CHECK-ASM: vfchesbs
439 idx
= vec_any_nge(vd
, vd
);
440 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
441 // CHECK-ASM: vfchedbs
443 idx
= vec_any_ngt(vf
, vf
);
444 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
445 // CHECK-ASM: vfchsbs
446 idx
= vec_any_ngt(vd
, vd
);
447 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
448 // CHECK-ASM: vfchdbs
450 idx
= vec_any_nle(vf
, vf
);
451 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
452 // CHECK-ASM: vfchesbs
453 idx
= vec_any_nle(vd
, vd
);
454 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
455 // CHECK-ASM: vfchedbs
457 idx
= vec_any_nlt(vf
, vf
);
458 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})
459 // CHECK-ASM: vfchsbs
460 idx
= vec_any_nlt(vd
, vd
);
461 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})
462 // CHECK-ASM: vfchdbs
464 idx
= vec_any_nan(vf
);
465 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)
466 // CHECK-ASM: vftcisb
467 idx
= vec_any_nan(vd
);
468 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)
469 // CHECK-ASM: vftcidb
471 idx
= vec_any_numeric(vf
);
472 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)
473 // CHECK-ASM: vftcisb
474 idx
= vec_any_numeric(vd
);
475 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)
476 // CHECK-ASM: vftcidb
479 void test_integer(void) {
480 // CHECK-ASM-LABEL: test_integer
482 vf
= vec_andc(vf
, vf
);
484 vd
= vec_andc(vd
, vd
);
487 vf
= vec_nor(vf
, vf
);
489 vd
= vec_nor(vd
, vd
);
492 vsc
= vec_nand(vsc
, vsc
);
494 vuc
= vec_nand(vuc
, vuc
);
496 vbc
= vec_nand(vbc
, vbc
);
498 vss
= vec_nand(vss
, vss
);
500 vus
= vec_nand(vus
, vus
);
502 vbs
= vec_nand(vbs
, vbs
);
504 vsi
= vec_nand(vsi
, vsi
);
506 vui
= vec_nand(vui
, vui
);
508 vbi
= vec_nand(vbi
, vbi
);
510 vsl
= vec_nand(vsl
, vsl
);
512 vul
= vec_nand(vul
, vul
);
514 vbl
= vec_nand(vbl
, vbl
);
516 vf
= vec_nand(vf
, vf
);
518 vd
= vec_nand(vd
, vd
);
521 vsc
= vec_orc(vsc
, vsc
);
523 vuc
= vec_orc(vuc
, vuc
);
525 vbc
= vec_orc(vbc
, vbc
);
527 vss
= vec_orc(vss
, vss
);
529 vus
= vec_orc(vus
, vus
);
531 vbs
= vec_orc(vbs
, vbs
);
533 vsi
= vec_orc(vsi
, vsi
);
535 vui
= vec_orc(vui
, vui
);
537 vbi
= vec_orc(vbi
, vbi
);
539 vsl
= vec_orc(vsl
, vsl
);
541 vul
= vec_orc(vul
, vul
);
543 vbl
= vec_orc(vbl
, vbl
);
545 vf
= vec_orc(vf
, vf
);
547 vd
= vec_orc(vd
, vd
);
550 vsc
= vec_eqv(vsc
, vsc
);
552 vuc
= vec_eqv(vuc
, vuc
);
554 vbc
= vec_eqv(vbc
, vbc
);
556 vss
= vec_eqv(vss
, vss
);
558 vus
= vec_eqv(vus
, vus
);
560 vbs
= vec_eqv(vbs
, vbs
);
562 vsi
= vec_eqv(vsi
, vsi
);
564 vui
= vec_eqv(vui
, vui
);
566 vbi
= vec_eqv(vbi
, vbi
);
568 vsl
= vec_eqv(vsl
, vsl
);
570 vul
= vec_eqv(vul
, vul
);
572 vbl
= vec_eqv(vbl
, vbl
);
574 vf
= vec_eqv(vf
, vf
);
576 vd
= vec_eqv(vd
, vd
);
579 vuc
= vec_popcnt(vsc
);
580 // CHECK: call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %{{.*}})
581 // CHECK-ASM: vpopctb
582 vuc
= vec_popcnt(vuc
);
583 // CHECK: call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %{{.*}})
584 // CHECK-ASM: vpopctb
585 vus
= vec_popcnt(vss
);
586 // CHECK: call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %{{.*}})
587 // CHECK-ASM: vpopcth
588 vus
= vec_popcnt(vus
);
589 // CHECK: call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %{{.*}})
590 // CHECK-ASM: vpopcth
591 vui
= vec_popcnt(vsi
);
592 // CHECK: call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %{{.*}})
593 // CHECK-ASM: vpopctf
594 vui
= vec_popcnt(vui
);
595 // CHECK: call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %{{.*}})
596 // CHECK-ASM: vpopctf
597 vul
= vec_popcnt(vsl
);
598 // CHECK: call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %{{.*}})
599 // CHECK-ASM: vpopctg
600 vul
= vec_popcnt(vul
);
601 // CHECK: call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %{{.*}})
602 // CHECK-ASM: vpopctg
604 vf
= vec_slb(vf
, vsi
);
605 // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
607 vf
= vec_slb(vf
, vui
);
608 // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
610 vd
= vec_slb(vd
, vsl
);
611 // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
613 vd
= vec_slb(vd
, vul
);
614 // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
617 vf
= vec_sld(vf
, vf
, 0);
618 // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 0)
620 vf
= vec_sld(vf
, vf
, 15);
621 // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 15)
623 vd
= vec_sld(vd
, vd
, 0);
624 // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 0)
626 vd
= vec_sld(vd
, vd
, 15);
627 // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 15)
630 vf
= vec_srab(vf
, vsi
);
631 // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
633 vf
= vec_srab(vf
, vui
);
634 // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
636 vd
= vec_srab(vd
, vsl
);
637 // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
639 vd
= vec_srab(vd
, vul
);
640 // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
643 vf
= vec_srb(vf
, vsi
);
644 // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
646 vf
= vec_srb(vf
, vui
);
647 // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
649 vd
= vec_srb(vd
, vsl
);
650 // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
652 vd
= vec_srb(vd
, vul
);
653 // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
656 idx
= vec_test_mask(vf
, vui
);
657 // CHECK: call i32 @llvm.s390.vtm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
659 idx
= vec_test_mask(vd
, vul
);
660 // CHECK: call i32 @llvm.s390.vtm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
663 vuc
= vec_msum_u128(vul
, vul
, vuc
, 0);
664 // CHECK: call <16 x i8> @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <16 x i8> %{{.*}}, i32 0)
666 vuc
= vec_msum_u128(vul
, vul
, vuc
, 4);
667 // CHECK: call <16 x i8> @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <16 x i8> %{{.*}}, i32 4)
669 vuc
= vec_msum_u128(vul
, vul
, vuc
, 8);
670 // CHECK: call <16 x i8> @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <16 x i8> %{{.*}}, i32 8)
672 vuc
= vec_msum_u128(vul
, vul
, vuc
, 12);
673 // CHECK: call <16 x i8> @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <16 x i8> %{{.*}}, i32 12)
677 void test_float(void) {
678 // CHECK-ASM-LABEL: test_float
681 // CHECK: call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{.*}})
684 // CHECK: call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{.*}})
688 // CHECK: [[ABS:%[^ ]+]] = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{.*}})
689 // CHECK-NEXT: fneg <4 x float> [[ABS]]
692 // CHECK: [[ABS:%[^ ]+]] = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{.*}})
693 // CHECK-NEXT: fneg <2 x double> [[ABS]]
696 vf
= vec_max(vf
, vf
);
697 // CHECK: call <4 x float> @llvm.s390.vfmaxsb(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i32 0)
698 // CHECK-ASM: vfmaxsb
699 vd
= vec_max(vd
, vd
);
700 // CHECK: call <2 x double> @llvm.s390.vfmaxdb(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i32 0)
701 // CHECK-ASM: vfmaxdb
703 vf
= vec_min(vf
, vf
);
704 // CHECK: call <4 x float> @llvm.s390.vfminsb(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i32 0)
705 // CHECK-ASM: vfminsb
706 vd
= vec_min(vd
, vd
);
707 // CHECK: call <2 x double> @llvm.s390.vfmindb(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i32 0)
708 // CHECK-ASM: vfmindb
710 vf
= vec_madd(vf
, vf
, vf
);
711 // CHECK: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})
713 vd
= vec_madd(vd
, vd
, vd
);
714 // CHECK: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})
717 vf
= vec_msub(vf
, vf
, vf
);
718 // CHECK: [[NEG:%[^ ]+]] = fneg <4 x float> %{{.*}}
719 // CHECK: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]])
721 vd
= vec_msub(vd
, vd
, vd
);
722 // CHECK: [[NEG:%[^ ]+]] = fneg <2 x double> %{{.*}}
723 // CHECK: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]])
726 vf
= vec_nmadd(vf
, vf
, vf
);
727 // CHECK: [[RES:%[^ ]+]] = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})
728 // CHECK: fneg <4 x float> [[RES]]
729 // CHECK-ASM: vfnmasb
730 vd
= vec_nmadd(vd
, vd
, vd
);
731 // CHECK: [[RES:%[^ ]+]] = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})
732 // CHECK: fneg <2 x double> [[RES]]
733 // CHECK-ASM: vfnmadb
735 vf
= vec_nmsub(vf
, vf
, vf
);
736 // CHECK: [[NEG:%[^ ]+]] = fneg <4 x float> %{{.*}}
737 // CHECK: [[RES:%[^ ]+]] = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]])
738 // CHECK: fneg <4 x float> [[RES]]
739 // CHECK-ASM: vfnmssb
740 vd
= vec_nmsub(vd
, vd
, vd
);
741 // CHECK: [[NEG:%[^ ]+]] = fneg <2 x double> %{{.*}}
742 // CHECK: [[RES:%[^ ]+]] = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]])
743 // CHECK: fneg <2 x double> [[RES]]
744 // CHECK-ASM: vfnmsdb
747 // CHECK: call <4 x float> @llvm.sqrt.v4f32(<4 x float> %{{.*}})
750 // CHECK: call <2 x double> @llvm.sqrt.v2f64(<2 x double> %{{.*}})
753 vd
= vec_doublee(vf
);
754 // CHECK: fpext <2 x float> %{{.*}} to <2 x double>
757 // CHECK: fptrunc <2 x double> %{{.*}} to <2 x float>
760 vd
= vec_double(vsl
);
761 // CHECK: sitofp <2 x i64> %{{.*}} to <2 x double>
763 vd
= vec_double(vul
);
764 // CHECK: uitofp <2 x i64> %{{.*}} to <2 x double>
767 vsl
= vec_signed(vd
);
768 // CHECK: fptosi <2 x double> %{{.*}} to <2 x i64>
770 vul
= vec_unsigned(vd
);
771 // CHECK: fptoui <2 x double> %{{.*}} to <2 x i64>
775 // CHECK: call <4 x float> @llvm.ceil.v4f32(<4 x float> %{{.*}})
776 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 6
778 // CHECK: call <4 x float> @llvm.ceil.v4f32(<4 x float> %{{.*}})
779 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 6
781 // CHECK: call <2 x double> @llvm.ceil.v2f64(<2 x double> %{{.*}})
782 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 6
784 // CHECK: call <2 x double> @llvm.ceil.v2f64(<2 x double> %{{.*}})
785 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 6
788 // CHECK: call <4 x float> @llvm.floor.v4f32(<4 x float> %{{.*}})
789 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 7
791 // CHECK: call <4 x float> @llvm.floor.v4f32(<4 x float> %{{.*}})
792 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 7
794 // CHECK: call <2 x double> @llvm.floor.v2f64(<2 x double> %{{.*}})
795 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 7
797 // CHECK: call <2 x double> @llvm.floor.v2f64(<2 x double> %{{.*}})
798 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 7
801 // CHECK: call <4 x float> @llvm.trunc.v4f32(<4 x float> %{{.*}})
802 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 5
804 // CHECK: call <4 x float> @llvm.trunc.v4f32(<4 x float> %{{.*}})
805 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 5
807 // CHECK: call <2 x double> @llvm.trunc.v2f64(<2 x double> %{{.*}})
808 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 5
810 // CHECK: call <2 x double> @llvm.trunc.v2f64(<2 x double> %{{.*}})
811 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 5
814 // CHECK: call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %{{.*}})
815 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 0
817 // CHECK: call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %{{.*}})
818 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 0
821 // CHECK: call <4 x float> @llvm.rint.v4f32(<4 x float> %{{.*}})
822 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 0, 0
824 // CHECK: call <2 x double> @llvm.rint.v2f64(<2 x double> %{{.*}})
825 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 0, 0
828 // CHECK: call <4 x float> @llvm.s390.vfisb(<4 x float> %{{.*}}, i32 4, i32 4)
829 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 4
831 // CHECK: call <2 x double> @llvm.s390.vfidb(<2 x double> %{{.*}}, i32 4, i32 4)
832 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 4
834 vbi
= vec_fp_test_data_class(vf
, 0, &cc
);
835 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 0)
836 // CHECK-ASM: vftcisb
837 vbi
= vec_fp_test_data_class(vf
, 4095, &cc
);
838 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 4095)
839 // CHECK-ASM: vftcisb
840 vbl
= vec_fp_test_data_class(vd
, 0, &cc
);
841 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 0)
842 // CHECK-ASM: vftcidb
843 vbl
= vec_fp_test_data_class(vd
, 4095, &cc
);
844 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 4095)
845 // CHECK-ASM: vftcidb