Fix Windows test failure with triple instead of using the native OS
[oota-llvm.git] / test / CodeGen / X86 / avx512-cvt.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx --show-mc-encoding | FileCheck %s
2
3 ; CHECK-LABEL: sitof32
4 ; CHECK: vcvtdq2ps %zmm
5 ; CHECK: ret
6 define <16 x float> @sitof32(<16 x i32> %a) nounwind {
7   %b = sitofp <16 x i32> %a to <16 x float>
8   ret <16 x float> %b
9 }
10
11 ; CHECK-LABEL: sltof864
12 ; CHECK: vcvtqq2pd
13 define <8 x double> @sltof864(<8 x i64> %a) {
14   %b = sitofp <8 x i64> %a to <8 x double>
15   ret <8 x double> %b
16 }
17
18 ; CHECK-LABEL: sltof464
19 ; CHECK: vcvtqq2pd
20 define <4 x double> @sltof464(<4 x i64> %a) {
21   %b = sitofp <4 x i64> %a to <4 x double>
22   ret <4 x double> %b
23 }
24
25 ; CHECK-LABEL: sltof2f32
26 ; CHECK: vcvtqq2ps
27 define <2 x float> @sltof2f32(<2 x i64> %a) {
28   %b = sitofp <2 x i64> %a to <2 x float>
29   ret <2 x float>%b
30 }
31
32 ; CHECK-LABEL: sltof4f32_mem
33 ; CHECK: vcvtqq2psy (%rdi)
34 define <4 x float> @sltof4f32_mem(<4 x i64>* %a) {
35   %a1 = load <4 x i64>, <4 x i64>* %a, align 8
36   %b = sitofp <4 x i64> %a1 to <4 x float>
37   ret <4 x float>%b
38 }
39
40 ; CHECK-LABEL: f64tosl
41 ; CHECK: vcvttpd2qq
42 define <4 x i64> @f64tosl(<4 x double> %a) {
43   %b = fptosi <4 x double> %a to <4 x i64>
44   ret <4 x i64> %b
45 }
46
47 ; CHECK-LABEL: f32tosl
48 ; CHECK: vcvttps2qq
49 define <4 x i64> @f32tosl(<4 x float> %a) {
50   %b = fptosi <4 x float> %a to <4 x i64>
51   ret <4 x i64> %b
52 }
53
54 ; CHECK-LABEL: sltof432
55 ; CHECK: vcvtqq2ps 
56 define <4 x float> @sltof432(<4 x i64> %a) {
57   %b = sitofp <4 x i64> %a to <4 x float>
58   ret <4 x float> %b
59 }
60
61 ; CHECK-LABEL: ultof432
62 ; CHECK: vcvtuqq2ps 
63 define <4 x float> @ultof432(<4 x i64> %a) {
64   %b = uitofp <4 x i64> %a to <4 x float>
65   ret <4 x float> %b
66 }
67
68 ; CHECK-LABEL: ultof64
69 ; CHECK: vcvtuqq2pd
70 define <8 x double> @ultof64(<8 x i64> %a) {
71   %b = uitofp <8 x i64> %a to <8 x double>
72   ret <8 x double> %b
73 }
74
75 ; CHECK-LABEL: fptosi00
76 ; CHECK: vcvttps2dq %zmm
77 ; CHECK: ret
78 define <16 x i32> @fptosi00(<16 x float> %a) nounwind {
79   %b = fptosi <16 x float> %a to <16 x i32>
80   ret <16 x i32> %b
81 }
82
83 ; CHECK-LABEL: fptoui00
84 ; CHECK: vcvttps2udq
85 ; CHECK: ret
86 define <16 x i32> @fptoui00(<16 x float> %a) nounwind {
87   %b = fptoui <16 x float> %a to <16 x i32>
88   ret <16 x i32> %b
89 }
90
91 ; CHECK-LABEL: fptoui_256
92 ; CHECK: vcvttps2udq
93 ; CHECK: ret
94 define <8 x i32> @fptoui_256(<8 x float> %a) nounwind {
95   %b = fptoui <8 x float> %a to <8 x i32>
96   ret <8 x i32> %b
97 }
98
99 ; CHECK-LABEL: fptoui_128
100 ; CHECK: vcvttps2udq
101 ; CHECK: ret
102 define <4 x i32> @fptoui_128(<4 x float> %a) nounwind {
103   %b = fptoui <4 x float> %a to <4 x i32>
104   ret <4 x i32> %b
105 }
106
107 ; CHECK-LABEL: fptoui01
108 ; CHECK: vcvttpd2udq
109 ; CHECK: ret
110 define <8 x i32> @fptoui01(<8 x double> %a) nounwind {
111   %b = fptoui <8 x double> %a to <8 x i32>
112   ret <8 x i32> %b
113 }
114
115 ; CHECK-LABEL: sitof64
116 ; CHECK: vcvtdq2pd %ymm
117 ; CHECK: ret
118 define <8 x double> @sitof64(<8 x i32> %a) {
119   %b = sitofp <8 x i32> %a to <8 x double>
120   ret <8 x double> %b
121 }
122
123 ; CHECK-LABEL: fptosi01
124 ; CHECK: vcvttpd2dq %zmm
125 ; CHECK: ret
126 define <8 x i32> @fptosi01(<8 x double> %a) {
127   %b = fptosi <8 x double> %a to <8 x i32>
128   ret <8 x i32> %b
129 }
130
131 ; CHECK-LABEL: fptosi03
132 ; CHECK: vcvttpd2dq %ymm
133 ; CHECK: ret
134 define <4 x i32> @fptosi03(<4 x double> %a) {
135   %b = fptosi <4 x double> %a to <4 x i32>
136   ret <4 x i32> %b
137 }
138
139 ; CHECK-LABEL: fptrunc00
140 ; CHECK: vcvtpd2ps %zmm
141 ; CHECK-NEXT: vcvtpd2ps %zmm
142 ; CHECK-NEXT: vinsertf
143 ; CHECK: ret
144 define <16 x float> @fptrunc00(<16 x double> %b) nounwind {
145   %a = fptrunc <16 x double> %b to <16 x float>
146   ret <16 x float> %a
147 }
148
149 ; CHECK-LABEL: fptrunc01
150 ; CHECK: vcvtpd2ps %ymm
151 define <4 x float> @fptrunc01(<4 x double> %b) {
152   %a = fptrunc <4 x double> %b to <4 x float>
153   ret <4 x float> %a
154 }
155
156 ; CHECK-LABEL: fptrunc02
157 ; CHECK: vcvtpd2ps %ymm0, %xmm0 {%k1} {z}
158 define <4 x float> @fptrunc02(<4 x double> %b, <4 x i1> %mask) {
159   %a = fptrunc <4 x double> %b to <4 x float>
160   %c = select <4 x i1>%mask, <4 x float>%a, <4 x float> zeroinitializer
161   ret <4 x float> %c
162 }
163
164 ; CHECK-LABEL: fpext00
165 ; CHECK: vcvtps2pd %ymm0, %zmm0
166 ; CHECK: ret
167 define <8 x double> @fpext00(<8 x float> %b) nounwind {
168   %a = fpext <8 x float> %b to <8 x double>
169   ret <8 x double> %a
170 }
171
172 ; CHECK-LABEL: fpext01
173 ; CHECK: vcvtps2pd %xmm0, %ymm0 {%k1} {z}
174 ; CHECK: ret
175 define <4 x double> @fpext01(<4 x float> %b, <4 x double>%b1, <4 x double>%a1) {
176   %a = fpext <4 x float> %b to <4 x double>
177   %mask = fcmp ogt <4 x double>%a1, %b1
178   %c = select <4 x i1>%mask,  <4 x double>%a, <4 x double>zeroinitializer
179   ret <4 x double> %c
180 }
181
182 ; CHECK-LABEL: funcA
183 ; CHECK: vcvtsi2sdq (%rdi){{.*}} encoding: [0x62
184 ; CHECK: ret
185 define double @funcA(i64* nocapture %e) {
186 entry:
187   %tmp1 = load i64, i64* %e, align 8
188   %conv = sitofp i64 %tmp1 to double
189   ret double %conv
190 }
191
192 ; CHECK-LABEL: funcB
193 ; CHECK: vcvtsi2sdl (%{{.*}} encoding: [0x62
194 ; CHECK: ret
195 define double @funcB(i32* %e) {
196 entry:
197   %tmp1 = load i32, i32* %e, align 4
198   %conv = sitofp i32 %tmp1 to double
199   ret double %conv
200 }
201
202 ; CHECK-LABEL: funcC
203 ; CHECK: vcvtsi2ssl (%{{.*}} encoding: [0x62
204 ; CHECK: ret
205 define float @funcC(i32* %e) {
206 entry:
207   %tmp1 = load i32, i32* %e, align 4
208   %conv = sitofp i32 %tmp1 to float
209   ret float %conv
210 }
211
212 ; CHECK-LABEL: i64tof32
213 ; CHECK: vcvtsi2ssq  (%{{.*}} encoding: [0x62
214 ; CHECK: ret
215 define float @i64tof32(i64* %e) {
216 entry:
217   %tmp1 = load i64, i64* %e, align 8
218   %conv = sitofp i64 %tmp1 to float
219   ret float %conv
220 }
221
222 ; CHECK-LABEL: fpext
223 ; CHECK: vcvtss2sd {{.*}} encoding: [0x62
224 ; CHECK: ret
225 define void @fpext() {
226 entry:
227   %f = alloca float, align 4
228   %d = alloca double, align 8
229   %tmp = load float, float* %f, align 4
230   %conv = fpext float %tmp to double
231   store double %conv, double* %d, align 8
232   ret void
233 }
234
235 ; CHECK-LABEL: fpround_scalar
236 ; CHECK: vmovsd {{.*}} encoding: [0x62
237 ; CHECK: vcvtsd2ss {{.*}} encoding: [0x62
238 ; CHECK: vmovss {{.*}} encoding: [0x62
239 ; CHECK: ret
240 define void @fpround_scalar() nounwind uwtable {
241 entry:
242   %f = alloca float, align 4
243   %d = alloca double, align 8
244   %tmp = load double, double* %d, align 8
245   %conv = fptrunc double %tmp to float
246   store float %conv, float* %f, align 4
247   ret void
248 }
249
250 ; CHECK-LABEL: long_to_double
251 ; CHECK: vmovq {{.*}} encoding: [0x62
252 ; CHECK: ret
253 define double @long_to_double(i64 %x) {
254    %res = bitcast i64 %x to double
255    ret double %res
256 }
257
258 ; CHECK-LABEL: double_to_long
259 ; CHECK: vmovq {{.*}} encoding: [0x62
260 ; CHECK: ret
261 define i64 @double_to_long(double %x) {
262    %res = bitcast double %x to i64
263    ret i64 %res
264 }
265
266 ; CHECK-LABEL: int_to_float
267 ; CHECK: vmovd {{.*}} encoding: [0x62
268 ; CHECK: ret
269 define float @int_to_float(i32 %x) {
270    %res = bitcast i32 %x to float
271    ret float %res
272 }
273
274 ; CHECK-LABEL: float_to_int
275 ; CHECK: vmovd {{.*}} encoding: [0x62
276 ; CHECK: ret
277 define i32 @float_to_int(float %x) {
278    %res = bitcast float %x to i32
279    ret i32 %res
280 }
281
282 ; CHECK-LABEL: uitof64
283 ; CHECK: vcvtudq2pd
284 ; CHECK: vextracti64x4
285 ; CHECK: vcvtudq2pd
286 ; CHECK: ret
287 define <16 x double> @uitof64(<16 x i32> %a) nounwind {
288   %b = uitofp <16 x i32> %a to <16 x double>
289   ret <16 x double> %b
290 }
291
292 ; CHECK-LABEL: uitof64_256
293 ; CHECK: vcvtudq2pd
294 ; CHECK: ret
295 define <4 x double> @uitof64_256(<4 x i32> %a) nounwind {
296   %b = uitofp <4 x i32> %a to <4 x double>
297   ret <4 x double> %b
298 }
299
300 ; CHECK-LABEL: uitof32
301 ; CHECK: vcvtudq2ps
302 ; CHECK: ret
303 define <16 x float> @uitof32(<16 x i32> %a) nounwind {
304   %b = uitofp <16 x i32> %a to <16 x float>
305   ret <16 x float> %b
306 }
307
308 ; CHECK-LABEL: uitof32_256
309 ; CHECK: vcvtudq2ps
310 ; CHECK: ret
311 define <8 x float> @uitof32_256(<8 x i32> %a) nounwind {
312   %b = uitofp <8 x i32> %a to <8 x float>
313   ret <8 x float> %b
314 }
315
316 ; CHECK-LABEL: uitof32_128
317 ; CHECK: vcvtudq2ps
318 ; CHECK: ret
319 define <4 x float> @uitof32_128(<4 x i32> %a) nounwind {
320   %b = uitofp <4 x i32> %a to <4 x float>
321   ret <4 x float> %b
322 }
323
324 ; CHECK-LABEL: @fptosi02
325 ; CHECK: vcvttss2si {{.*}} encoding: [0x62
326 ; CHECK: ret
327 define i32 @fptosi02(float %a) nounwind {
328   %b = fptosi float %a to i32
329   ret i32 %b
330 }
331
332 ; CHECK-LABEL: @fptoui02
333 ; CHECK: vcvttss2usi {{.*}} encoding: [0x62
334 ; CHECK: ret
335 define i32 @fptoui02(float %a) nounwind {
336   %b = fptoui float %a to i32
337   ret i32 %b
338 }
339
340 ; CHECK-LABEL: @uitofp02
341 ; CHECK: vcvtusi2ss
342 ; CHECK: ret
343 define float @uitofp02(i32 %a) nounwind {
344   %b = uitofp i32 %a to float
345   ret float %b
346 }
347
348 ; CHECK-LABEL: @uitofp03
349 ; CHECK: vcvtusi2sd
350 ; CHECK: ret
351 define double @uitofp03(i32 %a) nounwind {
352   %b = uitofp i32 %a to double
353   ret double %b
354 }
355
356 ; CHECK-LABEL: @sitofp_16i1_float
357 ; CHECK: vpmovm2d
358 ; CHECK: vcvtdq2ps
359 define <16 x float> @sitofp_16i1_float(<16 x i32> %a) {
360   %mask = icmp slt <16 x i32> %a, zeroinitializer
361   %1 = sitofp <16 x i1> %mask to <16 x float>
362   ret <16 x float> %1
363 }
364
365 ; CHECK-LABEL: @sitofp_16i8_float
366 ; CHECK: vpmovsxbd
367 ; CHECK: vcvtdq2ps
368 define <16 x float> @sitofp_16i8_float(<16 x i8> %a) {
369   %1 = sitofp <16 x i8> %a to <16 x float>
370   ret <16 x float> %1
371 }
372
373 ; CHECK-LABEL: @sitofp_16i16_float
374 ; CHECK: vpmovsxwd
375 ; CHECK: vcvtdq2ps
376 define <16 x float> @sitofp_16i16_float(<16 x i16> %a) {
377   %1 = sitofp <16 x i16> %a to <16 x float>
378   ret <16 x float> %1
379 }
380
381 ; CHECK-LABEL: @sitofp_8i16_double
382 ; CHECK: vpmovsxwd
383 ; CHECK: vcvtdq2pd
384 define <8 x double> @sitofp_8i16_double(<8 x i16> %a) {
385   %1 = sitofp <8 x i16> %a to <8 x double>
386   ret <8 x double> %1
387 }
388
389 ; CHECK-LABEL: sitofp_8i8_double
390 ; CHECK: vpmovzxwd
391 ; CHECK: vpslld
392 ; CHECK: vpsrad
393 ; CHECK: vcvtdq2pd
394 define <8 x double> @sitofp_8i8_double(<8 x i8> %a) {
395   %1 = sitofp <8 x i8> %a to <8 x double>
396   ret <8 x double> %1
397 }
398
399
400 ; CHECK-LABEL: @sitofp_8i1_double
401 ; CHECK: vpmovm2d
402 ; CHECK: vcvtdq2pd
403 define <8 x double> @sitofp_8i1_double(<8 x double> %a) {
404   %cmpres = fcmp ogt <8 x double> %a, zeroinitializer
405   %1 = sitofp <8 x i1> %cmpres to <8 x double>
406   ret <8 x double> %1
407 }
408
409 ; CHECK-LABEL: @uitofp_16i8
410 ; CHECK:  vpmovzxbd  
411 ; CHECK: vcvtudq2ps
412 define <16 x float> @uitofp_16i8(<16 x i8>%a) {
413   %b = uitofp <16 x i8> %a to <16 x float>
414   ret <16 x float>%b
415 }
416
417 ; CHECK-LABEL: @uitofp_16i16
418 ; CHECK: vpmovzxwd
419 ; CHECK: vcvtudq2ps
420 define <16 x float> @uitofp_16i16(<16 x i16>%a) {
421   %b = uitofp <16 x i16> %a to <16 x float>
422   ret <16 x float>%b
423 }
424