1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK32 --check-prefix=AVX512_32
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK64 --check-prefix=AVX512_64
4 ; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK32 --check-prefix=SSE2_32
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK64 --check-prefix=SSE2_64
6 ; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=-sse | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK32 --check-prefix=X87
8 ; Verify that scalar integer conversions to FP compile successfully
9 ; (at one time long double failed with avx512f), and that reasonable
10 ; instruction sequences are selected based on subtarget features.
12 define float @u32_to_f(i32 %a) nounwind {
13 ; AVX512_32-LABEL: u32_to_f:
15 ; AVX512_32-NEXT: pushl %eax
16 ; AVX512_32-NEXT: vcvtusi2ssl {{[0-9]+}}(%esp), %xmm0, %xmm0
17 ; AVX512_32-NEXT: vmovss %xmm0, (%esp)
18 ; AVX512_32-NEXT: flds (%esp)
19 ; AVX512_32-NEXT: popl %eax
20 ; AVX512_32-NEXT: retl
22 ; AVX512_64-LABEL: u32_to_f:
24 ; AVX512_64-NEXT: vcvtusi2ssl %edi, %xmm0, %xmm0
25 ; AVX512_64-NEXT: retq
27 ; SSE2_32-LABEL: u32_to_f:
29 ; SSE2_32-NEXT: pushl %eax
30 ; SSE2_32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
31 ; SSE2_32-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
32 ; SSE2_32-NEXT: orpd %xmm0, %xmm1
33 ; SSE2_32-NEXT: subsd %xmm0, %xmm1
34 ; SSE2_32-NEXT: xorps %xmm0, %xmm0
35 ; SSE2_32-NEXT: cvtsd2ss %xmm1, %xmm0
36 ; SSE2_32-NEXT: movss %xmm0, (%esp)
37 ; SSE2_32-NEXT: flds (%esp)
38 ; SSE2_32-NEXT: popl %eax
41 ; SSE2_64-LABEL: u32_to_f:
43 ; SSE2_64-NEXT: movl %edi, %eax
44 ; SSE2_64-NEXT: cvtsi2ssq %rax, %xmm0
47 ; X87-LABEL: u32_to_f:
49 ; X87-NEXT: pushl %ebp
50 ; X87-NEXT: movl %esp, %ebp
51 ; X87-NEXT: andl $-8, %esp
52 ; X87-NEXT: subl $8, %esp
53 ; X87-NEXT: movl 8(%ebp), %eax
54 ; X87-NEXT: movl %eax, (%esp)
55 ; X87-NEXT: movl $0, {{[0-9]+}}(%esp)
56 ; X87-NEXT: fildll (%esp)
57 ; X87-NEXT: movl %ebp, %esp
60 %r = uitofp i32 %a to float
64 define float @s32_to_f(i32 %a) nounwind {
65 ; AVX512_32-LABEL: s32_to_f:
67 ; AVX512_32-NEXT: pushl %eax
68 ; AVX512_32-NEXT: vcvtsi2ssl {{[0-9]+}}(%esp), %xmm0, %xmm0
69 ; AVX512_32-NEXT: vmovss %xmm0, (%esp)
70 ; AVX512_32-NEXT: flds (%esp)
71 ; AVX512_32-NEXT: popl %eax
72 ; AVX512_32-NEXT: retl
74 ; AVX512_64-LABEL: s32_to_f:
76 ; AVX512_64-NEXT: vcvtsi2ssl %edi, %xmm0, %xmm0
77 ; AVX512_64-NEXT: retq
79 ; SSE2_32-LABEL: s32_to_f:
81 ; SSE2_32-NEXT: pushl %eax
82 ; SSE2_32-NEXT: cvtsi2ssl {{[0-9]+}}(%esp), %xmm0
83 ; SSE2_32-NEXT: movss %xmm0, (%esp)
84 ; SSE2_32-NEXT: flds (%esp)
85 ; SSE2_32-NEXT: popl %eax
88 ; SSE2_64-LABEL: s32_to_f:
90 ; SSE2_64-NEXT: cvtsi2ssl %edi, %xmm0
93 ; X87-LABEL: s32_to_f:
95 ; X87-NEXT: pushl %eax
96 ; X87-NEXT: movl {{[0-9]+}}(%esp), %eax
97 ; X87-NEXT: movl %eax, (%esp)
98 ; X87-NEXT: fildl (%esp)
101 %r = sitofp i32 %a to float
105 define double @u32_to_d(i32 %a) nounwind {
106 ; AVX512_32-LABEL: u32_to_d:
108 ; AVX512_32-NEXT: pushl %ebp
109 ; AVX512_32-NEXT: movl %esp, %ebp
110 ; AVX512_32-NEXT: andl $-8, %esp
111 ; AVX512_32-NEXT: subl $8, %esp
112 ; AVX512_32-NEXT: vcvtusi2sdl 8(%ebp), %xmm0, %xmm0
113 ; AVX512_32-NEXT: vmovsd %xmm0, (%esp)
114 ; AVX512_32-NEXT: fldl (%esp)
115 ; AVX512_32-NEXT: movl %ebp, %esp
116 ; AVX512_32-NEXT: popl %ebp
117 ; AVX512_32-NEXT: retl
119 ; AVX512_64-LABEL: u32_to_d:
121 ; AVX512_64-NEXT: vcvtusi2sdl %edi, %xmm0, %xmm0
122 ; AVX512_64-NEXT: retq
124 ; SSE2_32-LABEL: u32_to_d:
126 ; SSE2_32-NEXT: pushl %ebp
127 ; SSE2_32-NEXT: movl %esp, %ebp
128 ; SSE2_32-NEXT: andl $-8, %esp
129 ; SSE2_32-NEXT: subl $8, %esp
130 ; SSE2_32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
131 ; SSE2_32-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
132 ; SSE2_32-NEXT: orpd %xmm0, %xmm1
133 ; SSE2_32-NEXT: subsd %xmm0, %xmm1
134 ; SSE2_32-NEXT: movsd %xmm1, (%esp)
135 ; SSE2_32-NEXT: fldl (%esp)
136 ; SSE2_32-NEXT: movl %ebp, %esp
137 ; SSE2_32-NEXT: popl %ebp
140 ; SSE2_64-LABEL: u32_to_d:
142 ; SSE2_64-NEXT: movl %edi, %eax
143 ; SSE2_64-NEXT: cvtsi2sdq %rax, %xmm0
146 ; X87-LABEL: u32_to_d:
148 ; X87-NEXT: pushl %ebp
149 ; X87-NEXT: movl %esp, %ebp
150 ; X87-NEXT: andl $-8, %esp
151 ; X87-NEXT: subl $8, %esp
152 ; X87-NEXT: movl 8(%ebp), %eax
153 ; X87-NEXT: movl %eax, (%esp)
154 ; X87-NEXT: movl $0, {{[0-9]+}}(%esp)
155 ; X87-NEXT: fildll (%esp)
156 ; X87-NEXT: movl %ebp, %esp
157 ; X87-NEXT: popl %ebp
159 %r = uitofp i32 %a to double
163 define double @s32_to_d(i32 %a) nounwind {
164 ; AVX512_32-LABEL: s32_to_d:
166 ; AVX512_32-NEXT: pushl %ebp
167 ; AVX512_32-NEXT: movl %esp, %ebp
168 ; AVX512_32-NEXT: andl $-8, %esp
169 ; AVX512_32-NEXT: subl $8, %esp
170 ; AVX512_32-NEXT: vcvtsi2sdl 8(%ebp), %xmm0, %xmm0
171 ; AVX512_32-NEXT: vmovsd %xmm0, (%esp)
172 ; AVX512_32-NEXT: fldl (%esp)
173 ; AVX512_32-NEXT: movl %ebp, %esp
174 ; AVX512_32-NEXT: popl %ebp
175 ; AVX512_32-NEXT: retl
177 ; AVX512_64-LABEL: s32_to_d:
179 ; AVX512_64-NEXT: vcvtsi2sdl %edi, %xmm0, %xmm0
180 ; AVX512_64-NEXT: retq
182 ; SSE2_32-LABEL: s32_to_d:
184 ; SSE2_32-NEXT: pushl %ebp
185 ; SSE2_32-NEXT: movl %esp, %ebp
186 ; SSE2_32-NEXT: andl $-8, %esp
187 ; SSE2_32-NEXT: subl $8, %esp
188 ; SSE2_32-NEXT: cvtsi2sdl 8(%ebp), %xmm0
189 ; SSE2_32-NEXT: movsd %xmm0, (%esp)
190 ; SSE2_32-NEXT: fldl (%esp)
191 ; SSE2_32-NEXT: movl %ebp, %esp
192 ; SSE2_32-NEXT: popl %ebp
195 ; SSE2_64-LABEL: s32_to_d:
197 ; SSE2_64-NEXT: cvtsi2sdl %edi, %xmm0
200 ; X87-LABEL: s32_to_d:
202 ; X87-NEXT: pushl %eax
203 ; X87-NEXT: movl {{[0-9]+}}(%esp), %eax
204 ; X87-NEXT: movl %eax, (%esp)
205 ; X87-NEXT: fildl (%esp)
206 ; X87-NEXT: popl %eax
208 %r = sitofp i32 %a to double
212 define x86_fp80 @u32_to_x(i32 %a) nounwind {
213 ; AVX512_32-LABEL: u32_to_x:
215 ; AVX512_32-NEXT: pushl %ebp
216 ; AVX512_32-NEXT: movl %esp, %ebp
217 ; AVX512_32-NEXT: andl $-8, %esp
218 ; AVX512_32-NEXT: subl $8, %esp
219 ; AVX512_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
220 ; AVX512_32-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
221 ; AVX512_32-NEXT: vorpd %xmm0, %xmm1, %xmm1
222 ; AVX512_32-NEXT: vsubsd %xmm0, %xmm1, %xmm0
223 ; AVX512_32-NEXT: vmovsd %xmm0, (%esp)
224 ; AVX512_32-NEXT: fldl (%esp)
225 ; AVX512_32-NEXT: movl %ebp, %esp
226 ; AVX512_32-NEXT: popl %ebp
227 ; AVX512_32-NEXT: retl
229 ; AVX512_64-LABEL: u32_to_x:
231 ; AVX512_64-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
232 ; AVX512_64-NEXT: vmovd %edi, %xmm1
233 ; AVX512_64-NEXT: vpor %xmm0, %xmm1, %xmm1
234 ; AVX512_64-NEXT: vsubsd %xmm0, %xmm1, %xmm0
235 ; AVX512_64-NEXT: vmovsd %xmm0, -{{[0-9]+}}(%rsp)
236 ; AVX512_64-NEXT: fldl -{{[0-9]+}}(%rsp)
237 ; AVX512_64-NEXT: retq
239 ; SSE2_32-LABEL: u32_to_x:
241 ; SSE2_32-NEXT: pushl %ebp
242 ; SSE2_32-NEXT: movl %esp, %ebp
243 ; SSE2_32-NEXT: andl $-8, %esp
244 ; SSE2_32-NEXT: subl $8, %esp
245 ; SSE2_32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
246 ; SSE2_32-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
247 ; SSE2_32-NEXT: orpd %xmm0, %xmm1
248 ; SSE2_32-NEXT: subsd %xmm0, %xmm1
249 ; SSE2_32-NEXT: movsd %xmm1, (%esp)
250 ; SSE2_32-NEXT: fldl (%esp)
251 ; SSE2_32-NEXT: movl %ebp, %esp
252 ; SSE2_32-NEXT: popl %ebp
255 ; SSE2_64-LABEL: u32_to_x:
257 ; SSE2_64-NEXT: movl %edi, %eax
258 ; SSE2_64-NEXT: movq %rax, -{{[0-9]+}}(%rsp)
259 ; SSE2_64-NEXT: fildll -{{[0-9]+}}(%rsp)
262 ; X87-LABEL: u32_to_x:
264 ; X87-NEXT: pushl %ebp
265 ; X87-NEXT: movl %esp, %ebp
266 ; X87-NEXT: andl $-8, %esp
267 ; X87-NEXT: subl $8, %esp
268 ; X87-NEXT: movl 8(%ebp), %eax
269 ; X87-NEXT: movl %eax, (%esp)
270 ; X87-NEXT: movl $0, {{[0-9]+}}(%esp)
271 ; X87-NEXT: fildll (%esp)
272 ; X87-NEXT: movl %ebp, %esp
273 ; X87-NEXT: popl %ebp
275 %r = uitofp i32 %a to x86_fp80
279 define x86_fp80 @s32_to_x(i32 %a) nounwind {
280 ; CHECK32-LABEL: s32_to_x:
282 ; CHECK32-NEXT: pushl %eax
283 ; CHECK32-NEXT: movl {{[0-9]+}}(%esp), %eax
284 ; CHECK32-NEXT: movl %eax, (%esp)
285 ; CHECK32-NEXT: fildl (%esp)
286 ; CHECK32-NEXT: popl %eax
289 ; CHECK64-LABEL: s32_to_x:
291 ; CHECK64-NEXT: movl %edi, -{{[0-9]+}}(%rsp)
292 ; CHECK64-NEXT: fildl -{{[0-9]+}}(%rsp)
294 %r = sitofp i32 %a to x86_fp80
298 define float @u64_to_f(i64 %a) nounwind {
299 ; AVX512_32-LABEL: u64_to_f:
301 ; AVX512_32-NEXT: pushl %ebp
302 ; AVX512_32-NEXT: movl %esp, %ebp
303 ; AVX512_32-NEXT: andl $-8, %esp
304 ; AVX512_32-NEXT: subl $16, %esp
305 ; AVX512_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
306 ; AVX512_32-NEXT: vmovlps %xmm0, {{[0-9]+}}(%esp)
307 ; AVX512_32-NEXT: xorl %eax, %eax
308 ; AVX512_32-NEXT: cmpl $0, 12(%ebp)
309 ; AVX512_32-NEXT: setns %al
310 ; AVX512_32-NEXT: fildll {{[0-9]+}}(%esp)
311 ; AVX512_32-NEXT: fadds {{\.LCPI.*}}(,%eax,4)
312 ; AVX512_32-NEXT: fstps {{[0-9]+}}(%esp)
313 ; AVX512_32-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
314 ; AVX512_32-NEXT: vmovss %xmm0, (%esp)
315 ; AVX512_32-NEXT: flds (%esp)
316 ; AVX512_32-NEXT: movl %ebp, %esp
317 ; AVX512_32-NEXT: popl %ebp
318 ; AVX512_32-NEXT: retl
320 ; AVX512_64-LABEL: u64_to_f:
322 ; AVX512_64-NEXT: vcvtusi2ssq %rdi, %xmm0, %xmm0
323 ; AVX512_64-NEXT: retq
325 ; SSE2_32-LABEL: u64_to_f:
327 ; SSE2_32-NEXT: pushl %ebp
328 ; SSE2_32-NEXT: movl %esp, %ebp
329 ; SSE2_32-NEXT: andl $-8, %esp
330 ; SSE2_32-NEXT: subl $16, %esp
331 ; SSE2_32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
332 ; SSE2_32-NEXT: movlps %xmm0, {{[0-9]+}}(%esp)
333 ; SSE2_32-NEXT: xorl %eax, %eax
334 ; SSE2_32-NEXT: cmpl $0, 12(%ebp)
335 ; SSE2_32-NEXT: setns %al
336 ; SSE2_32-NEXT: fildll {{[0-9]+}}(%esp)
337 ; SSE2_32-NEXT: fadds {{\.LCPI.*}}(,%eax,4)
338 ; SSE2_32-NEXT: fstps {{[0-9]+}}(%esp)
339 ; SSE2_32-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
340 ; SSE2_32-NEXT: movss %xmm0, (%esp)
341 ; SSE2_32-NEXT: flds (%esp)
342 ; SSE2_32-NEXT: movl %ebp, %esp
343 ; SSE2_32-NEXT: popl %ebp
346 ; SSE2_64-LABEL: u64_to_f:
348 ; SSE2_64-NEXT: testq %rdi, %rdi
349 ; SSE2_64-NEXT: js .LBB6_1
350 ; SSE2_64-NEXT: # BB#2:
351 ; SSE2_64-NEXT: cvtsi2ssq %rdi, %xmm0
353 ; SSE2_64-NEXT: .LBB6_1:
354 ; SSE2_64-NEXT: movq %rdi, %rax
355 ; SSE2_64-NEXT: shrq %rax
356 ; SSE2_64-NEXT: andl $1, %edi
357 ; SSE2_64-NEXT: orq %rax, %rdi
358 ; SSE2_64-NEXT: cvtsi2ssq %rdi, %xmm0
359 ; SSE2_64-NEXT: addss %xmm0, %xmm0
362 ; X87-LABEL: u64_to_f:
364 ; X87-NEXT: pushl %ebp
365 ; X87-NEXT: movl %esp, %ebp
366 ; X87-NEXT: andl $-8, %esp
367 ; X87-NEXT: subl $16, %esp
368 ; X87-NEXT: movl 8(%ebp), %eax
369 ; X87-NEXT: movl 12(%ebp), %ecx
370 ; X87-NEXT: movl %ecx, {{[0-9]+}}(%esp)
371 ; X87-NEXT: movl %eax, {{[0-9]+}}(%esp)
372 ; X87-NEXT: xorl %eax, %eax
373 ; X87-NEXT: testl %ecx, %ecx
374 ; X87-NEXT: setns %al
375 ; X87-NEXT: fildll {{[0-9]+}}(%esp)
376 ; X87-NEXT: fadds {{\.LCPI.*}}(,%eax,4)
377 ; X87-NEXT: fstps {{[0-9]+}}(%esp)
378 ; X87-NEXT: flds {{[0-9]+}}(%esp)
379 ; X87-NEXT: movl %ebp, %esp
380 ; X87-NEXT: popl %ebp
382 %r = uitofp i64 %a to float
386 define float @s64_to_f(i64 %a) nounwind {
387 ; AVX512_32-LABEL: s64_to_f:
389 ; AVX512_32-NEXT: pushl %eax
390 ; AVX512_32-NEXT: fildll {{[0-9]+}}(%esp)
391 ; AVX512_32-NEXT: fstps (%esp)
392 ; AVX512_32-NEXT: flds (%esp)
393 ; AVX512_32-NEXT: popl %eax
394 ; AVX512_32-NEXT: retl
396 ; AVX512_64-LABEL: s64_to_f:
398 ; AVX512_64-NEXT: vcvtsi2ssq %rdi, %xmm0, %xmm0
399 ; AVX512_64-NEXT: retq
401 ; SSE2_32-LABEL: s64_to_f:
403 ; SSE2_32-NEXT: pushl %eax
404 ; SSE2_32-NEXT: fildll {{[0-9]+}}(%esp)
405 ; SSE2_32-NEXT: fstps (%esp)
406 ; SSE2_32-NEXT: flds (%esp)
407 ; SSE2_32-NEXT: popl %eax
410 ; SSE2_64-LABEL: s64_to_f:
412 ; SSE2_64-NEXT: cvtsi2ssq %rdi, %xmm0
415 ; X87-LABEL: s64_to_f:
417 ; X87-NEXT: fildll {{[0-9]+}}(%esp)
419 %r = sitofp i64 %a to float
423 define float @s64_to_f_2(i64 %a) nounwind {
424 ; AVX512_32-LABEL: s64_to_f_2:
426 ; AVX512_32-NEXT: pushl %ebp
427 ; AVX512_32-NEXT: movl %esp, %ebp
428 ; AVX512_32-NEXT: andl $-8, %esp
429 ; AVX512_32-NEXT: subl $16, %esp
430 ; AVX512_32-NEXT: movl 8(%ebp), %eax
431 ; AVX512_32-NEXT: movl 12(%ebp), %ecx
432 ; AVX512_32-NEXT: addl $5, %eax
433 ; AVX512_32-NEXT: adcl $0, %ecx
434 ; AVX512_32-NEXT: vmovd %eax, %xmm0
435 ; AVX512_32-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0
436 ; AVX512_32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp)
437 ; AVX512_32-NEXT: fildll {{[0-9]+}}(%esp)
438 ; AVX512_32-NEXT: fstps {{[0-9]+}}(%esp)
439 ; AVX512_32-NEXT: flds {{[0-9]+}}(%esp)
440 ; AVX512_32-NEXT: movl %ebp, %esp
441 ; AVX512_32-NEXT: popl %ebp
442 ; AVX512_32-NEXT: retl
444 ; AVX512_64-LABEL: s64_to_f_2:
446 ; AVX512_64-NEXT: addq $5, %rdi
447 ; AVX512_64-NEXT: vcvtsi2ssq %rdi, %xmm0, %xmm0
448 ; AVX512_64-NEXT: retq
450 ; SSE2_32-LABEL: s64_to_f_2:
452 ; SSE2_32-NEXT: pushl %ebp
453 ; SSE2_32-NEXT: movl %esp, %ebp
454 ; SSE2_32-NEXT: andl $-8, %esp
455 ; SSE2_32-NEXT: subl $16, %esp
456 ; SSE2_32-NEXT: movl 8(%ebp), %eax
457 ; SSE2_32-NEXT: movl 12(%ebp), %ecx
458 ; SSE2_32-NEXT: addl $5, %eax
459 ; SSE2_32-NEXT: adcl $0, %ecx
460 ; SSE2_32-NEXT: movd %ecx, %xmm0
461 ; SSE2_32-NEXT: movd %eax, %xmm1
462 ; SSE2_32-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
463 ; SSE2_32-NEXT: movq %xmm1, {{[0-9]+}}(%esp)
464 ; SSE2_32-NEXT: fildll {{[0-9]+}}(%esp)
465 ; SSE2_32-NEXT: fstps {{[0-9]+}}(%esp)
466 ; SSE2_32-NEXT: flds {{[0-9]+}}(%esp)
467 ; SSE2_32-NEXT: movl %ebp, %esp
468 ; SSE2_32-NEXT: popl %ebp
471 ; SSE2_64-LABEL: s64_to_f_2:
473 ; SSE2_64-NEXT: addq $5, %rdi
474 ; SSE2_64-NEXT: cvtsi2ssq %rdi, %xmm0
477 ; X87-LABEL: s64_to_f_2:
479 ; X87-NEXT: pushl %ebp
480 ; X87-NEXT: movl %esp, %ebp
481 ; X87-NEXT: andl $-8, %esp
482 ; X87-NEXT: subl $8, %esp
483 ; X87-NEXT: movl 8(%ebp), %eax
484 ; X87-NEXT: movl 12(%ebp), %ecx
485 ; X87-NEXT: addl $5, %eax
486 ; X87-NEXT: adcl $0, %ecx
487 ; X87-NEXT: movl %eax, (%esp)
488 ; X87-NEXT: movl %ecx, {{[0-9]+}}(%esp)
489 ; X87-NEXT: fildll (%esp)
490 ; X87-NEXT: movl %ebp, %esp
491 ; X87-NEXT: popl %ebp
494 %r = sitofp i64 %a1 to float
498 define double @u64_to_d(i64 %a) nounwind {
499 ; AVX512_32-LABEL: u64_to_d:
501 ; AVX512_32-NEXT: pushl %ebp
502 ; AVX512_32-NEXT: movl %esp, %ebp
503 ; AVX512_32-NEXT: andl $-8, %esp
504 ; AVX512_32-NEXT: subl $8, %esp
505 ; AVX512_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
506 ; AVX512_32-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
507 ; AVX512_32-NEXT: vsubpd {{\.LCPI.*}}, %xmm0, %xmm0
508 ; AVX512_32-NEXT: vhaddpd %xmm0, %xmm0, %xmm0
509 ; AVX512_32-NEXT: vmovlpd %xmm0, (%esp)
510 ; AVX512_32-NEXT: fldl (%esp)
511 ; AVX512_32-NEXT: movl %ebp, %esp
512 ; AVX512_32-NEXT: popl %ebp
513 ; AVX512_32-NEXT: retl
515 ; AVX512_64-LABEL: u64_to_d:
517 ; AVX512_64-NEXT: vcvtusi2sdq %rdi, %xmm0, %xmm0
518 ; AVX512_64-NEXT: retq
520 ; SSE2_32-LABEL: u64_to_d:
522 ; SSE2_32-NEXT: pushl %ebp
523 ; SSE2_32-NEXT: movl %esp, %ebp
524 ; SSE2_32-NEXT: andl $-8, %esp
525 ; SSE2_32-NEXT: subl $8, %esp
526 ; SSE2_32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
527 ; SSE2_32-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
528 ; SSE2_32-NEXT: subpd {{\.LCPI.*}}, %xmm0
529 ; SSE2_32-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
530 ; SSE2_32-NEXT: addpd %xmm0, %xmm1
531 ; SSE2_32-NEXT: movlpd %xmm1, (%esp)
532 ; SSE2_32-NEXT: fldl (%esp)
533 ; SSE2_32-NEXT: movl %ebp, %esp
534 ; SSE2_32-NEXT: popl %ebp
537 ; SSE2_64-LABEL: u64_to_d:
539 ; SSE2_64-NEXT: movq %rdi, %xmm1
540 ; SSE2_64-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
541 ; SSE2_64-NEXT: subpd {{.*}}(%rip), %xmm1
542 ; SSE2_64-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
543 ; SSE2_64-NEXT: addpd %xmm1, %xmm0
546 ; X87-LABEL: u64_to_d:
548 ; X87-NEXT: pushl %ebp
549 ; X87-NEXT: movl %esp, %ebp
550 ; X87-NEXT: andl $-8, %esp
551 ; X87-NEXT: subl $16, %esp
552 ; X87-NEXT: movl 8(%ebp), %eax
553 ; X87-NEXT: movl 12(%ebp), %ecx
554 ; X87-NEXT: movl %ecx, {{[0-9]+}}(%esp)
555 ; X87-NEXT: movl %eax, (%esp)
556 ; X87-NEXT: xorl %eax, %eax
557 ; X87-NEXT: testl %ecx, %ecx
558 ; X87-NEXT: setns %al
559 ; X87-NEXT: fildll (%esp)
560 ; X87-NEXT: fadds {{\.LCPI.*}}(,%eax,4)
561 ; X87-NEXT: fstpl {{[0-9]+}}(%esp)
562 ; X87-NEXT: fldl {{[0-9]+}}(%esp)
563 ; X87-NEXT: movl %ebp, %esp
564 ; X87-NEXT: popl %ebp
566 %r = uitofp i64 %a to double
570 define double @s64_to_d(i64 %a) nounwind {
571 ; AVX512_32-LABEL: s64_to_d:
573 ; AVX512_32-NEXT: pushl %ebp
574 ; AVX512_32-NEXT: movl %esp, %ebp
575 ; AVX512_32-NEXT: andl $-8, %esp
576 ; AVX512_32-NEXT: subl $8, %esp
577 ; AVX512_32-NEXT: fildll 8(%ebp)
578 ; AVX512_32-NEXT: fstpl (%esp)
579 ; AVX512_32-NEXT: fldl (%esp)
580 ; AVX512_32-NEXT: movl %ebp, %esp
581 ; AVX512_32-NEXT: popl %ebp
582 ; AVX512_32-NEXT: retl
584 ; AVX512_64-LABEL: s64_to_d:
586 ; AVX512_64-NEXT: vcvtsi2sdq %rdi, %xmm0, %xmm0
587 ; AVX512_64-NEXT: retq
589 ; SSE2_32-LABEL: s64_to_d:
591 ; SSE2_32-NEXT: pushl %ebp
592 ; SSE2_32-NEXT: movl %esp, %ebp
593 ; SSE2_32-NEXT: andl $-8, %esp
594 ; SSE2_32-NEXT: subl $8, %esp
595 ; SSE2_32-NEXT: fildll 8(%ebp)
596 ; SSE2_32-NEXT: fstpl (%esp)
597 ; SSE2_32-NEXT: fldl (%esp)
598 ; SSE2_32-NEXT: movl %ebp, %esp
599 ; SSE2_32-NEXT: popl %ebp
602 ; SSE2_64-LABEL: s64_to_d:
604 ; SSE2_64-NEXT: cvtsi2sdq %rdi, %xmm0
607 ; X87-LABEL: s64_to_d:
609 ; X87-NEXT: fildll {{[0-9]+}}(%esp)
611 %r = sitofp i64 %a to double
615 define double @s64_to_d_2(i64 %a) nounwind {
616 ; AVX512_32-LABEL: s64_to_d_2:
618 ; AVX512_32-NEXT: pushl %ebp
619 ; AVX512_32-NEXT: movl %esp, %ebp
620 ; AVX512_32-NEXT: andl $-8, %esp
621 ; AVX512_32-NEXT: subl $16, %esp
622 ; AVX512_32-NEXT: movl 8(%ebp), %eax
623 ; AVX512_32-NEXT: movl 12(%ebp), %ecx
624 ; AVX512_32-NEXT: addl $5, %eax
625 ; AVX512_32-NEXT: adcl $0, %ecx
626 ; AVX512_32-NEXT: vmovd %eax, %xmm0
627 ; AVX512_32-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0
628 ; AVX512_32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp)
629 ; AVX512_32-NEXT: fildll {{[0-9]+}}(%esp)
630 ; AVX512_32-NEXT: fstpl (%esp)
631 ; AVX512_32-NEXT: fldl (%esp)
632 ; AVX512_32-NEXT: movl %ebp, %esp
633 ; AVX512_32-NEXT: popl %ebp
634 ; AVX512_32-NEXT: retl
636 ; AVX512_64-LABEL: s64_to_d_2:
638 ; AVX512_64-NEXT: addq $5, %rdi
639 ; AVX512_64-NEXT: vcvtsi2sdq %rdi, %xmm0, %xmm0
640 ; AVX512_64-NEXT: retq
642 ; SSE2_32-LABEL: s64_to_d_2:
644 ; SSE2_32-NEXT: pushl %ebp
645 ; SSE2_32-NEXT: movl %esp, %ebp
646 ; SSE2_32-NEXT: andl $-8, %esp
647 ; SSE2_32-NEXT: subl $16, %esp
648 ; SSE2_32-NEXT: movl 8(%ebp), %eax
649 ; SSE2_32-NEXT: movl 12(%ebp), %ecx
650 ; SSE2_32-NEXT: addl $5, %eax
651 ; SSE2_32-NEXT: adcl $0, %ecx
652 ; SSE2_32-NEXT: movd %ecx, %xmm0
653 ; SSE2_32-NEXT: movd %eax, %xmm1
654 ; SSE2_32-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
655 ; SSE2_32-NEXT: movq %xmm1, {{[0-9]+}}(%esp)
656 ; SSE2_32-NEXT: fildll {{[0-9]+}}(%esp)
657 ; SSE2_32-NEXT: fstpl (%esp)
658 ; SSE2_32-NEXT: fldl (%esp)
659 ; SSE2_32-NEXT: movl %ebp, %esp
660 ; SSE2_32-NEXT: popl %ebp
663 ; SSE2_64-LABEL: s64_to_d_2:
665 ; SSE2_64-NEXT: addq $5, %rdi
666 ; SSE2_64-NEXT: cvtsi2sdq %rdi, %xmm0
669 ; X87-LABEL: s64_to_d_2:
671 ; X87-NEXT: pushl %ebp
672 ; X87-NEXT: movl %esp, %ebp
673 ; X87-NEXT: andl $-8, %esp
674 ; X87-NEXT: subl $8, %esp
675 ; X87-NEXT: movl 8(%ebp), %eax
676 ; X87-NEXT: movl 12(%ebp), %ecx
677 ; X87-NEXT: addl $5, %eax
678 ; X87-NEXT: adcl $0, %ecx
679 ; X87-NEXT: movl %eax, (%esp)
680 ; X87-NEXT: movl %ecx, {{[0-9]+}}(%esp)
681 ; X87-NEXT: fildll (%esp)
682 ; X87-NEXT: movl %ebp, %esp
683 ; X87-NEXT: popl %ebp
686 %f = sitofp i64 %b to double
690 define x86_fp80 @u64_to_x(i64 %a) nounwind {
691 ; CHECK32-LABEL: u64_to_x:
693 ; CHECK32-NEXT: pushl %ebp
694 ; CHECK32-NEXT: movl %esp, %ebp
695 ; CHECK32-NEXT: andl $-8, %esp
696 ; CHECK32-NEXT: subl $8, %esp
697 ; CHECK32-NEXT: movl 8(%ebp), %eax
698 ; CHECK32-NEXT: movl 12(%ebp), %ecx
699 ; CHECK32-NEXT: movl %ecx, {{[0-9]+}}(%esp)
700 ; CHECK32-NEXT: movl %eax, (%esp)
701 ; CHECK32-NEXT: xorl %eax, %eax
702 ; CHECK32-NEXT: testl %ecx, %ecx
703 ; CHECK32-NEXT: setns %al
704 ; CHECK32-NEXT: fildll (%esp)
705 ; CHECK32-NEXT: fadds {{\.LCPI.*}}(,%eax,4)
706 ; CHECK32-NEXT: movl %ebp, %esp
707 ; CHECK32-NEXT: popl %ebp
710 ; CHECK64-LABEL: u64_to_x:
712 ; CHECK64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp)
713 ; CHECK64-NEXT: xorl %eax, %eax
714 ; CHECK64-NEXT: testq %rdi, %rdi
715 ; CHECK64-NEXT: setns %al
716 ; CHECK64-NEXT: fildll -{{[0-9]+}}(%rsp)
717 ; CHECK64-NEXT: fadds {{\.LCPI.*}}(,%rax,4)
719 %r = uitofp i64 %a to x86_fp80
723 define x86_fp80 @s64_to_x(i64 %a) nounwind {
724 ; CHECK32-LABEL: s64_to_x:
726 ; CHECK32-NEXT: fildll {{[0-9]+}}(%esp)
729 ; CHECK64-LABEL: s64_to_x:
731 ; CHECK64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp)
732 ; CHECK64-NEXT: fildll -{{[0-9]+}}(%rsp)
734 %r = sitofp i64 %a to x86_fp80