Use Align for TFL::TransientStackAlignment
[llvm-core.git] / test / CodeGen / X86 / scalar-int-to-fp.ll
blob6386ffbcc378b41365a6f20446bdf3af4ce187dd
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-unknown-unknown     -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=CHECK,CHECK32,AVX512_32,AVX512DQVL_32
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown   -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=CHECK,CHECK64,AVX512_64,AVX512DQVL_64
4 ; RUN: llc < %s -mtriple=i386-unknown-unknown     -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=CHECK,CHECK32,AVX512_32,AVX512DQ_32
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown   -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=CHECK,CHECK64,AVX512_64,AVX512DQ_64
6 ; RUN: llc < %s -mtriple=i386-unknown-unknown     -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,CHECK32,AVX512_32,AVX512F_32
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown   -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,CHECK64,AVX512_64,AVX512F_64
8 ; RUN: llc < %s -mtriple=i386-unknown-unknown     -mattr=+sse2    | FileCheck %s --check-prefixes=CHECK,CHECK32,SSE2_32
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown   -mattr=+sse2    | FileCheck %s --check-prefixes=CHECK,CHECK64,SSE2_64
10 ; RUN: llc < %s -mtriple=i386-unknown-unknown     -mattr=-sse     | FileCheck %s --check-prefixes=CHECK,CHECK32,X87
12 ; Verify that scalar integer conversions to FP compile successfully
13 ; (at one time long double failed with avx512f), and that reasonable
14 ; instruction sequences are selected based on subtarget features.
16 define float @u32_to_f(i32 %a) nounwind {
17 ; AVX512_32-LABEL: u32_to_f:
18 ; AVX512_32:       # %bb.0:
19 ; AVX512_32-NEXT:    pushl %eax
20 ; AVX512_32-NEXT:    vcvtusi2ssl {{[0-9]+}}(%esp), %xmm0, %xmm0
21 ; AVX512_32-NEXT:    vmovss %xmm0, (%esp)
22 ; AVX512_32-NEXT:    flds (%esp)
23 ; AVX512_32-NEXT:    popl %eax
24 ; AVX512_32-NEXT:    retl
26 ; AVX512_64-LABEL: u32_to_f:
27 ; AVX512_64:       # %bb.0:
28 ; AVX512_64-NEXT:    vcvtusi2ss %edi, %xmm0, %xmm0
29 ; AVX512_64-NEXT:    retq
31 ; SSE2_32-LABEL: u32_to_f:
32 ; SSE2_32:       # %bb.0:
33 ; SSE2_32-NEXT:    pushl %eax
34 ; SSE2_32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
35 ; SSE2_32-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
36 ; SSE2_32-NEXT:    orpd %xmm0, %xmm1
37 ; SSE2_32-NEXT:    subsd %xmm0, %xmm1
38 ; SSE2_32-NEXT:    xorps %xmm0, %xmm0
39 ; SSE2_32-NEXT:    cvtsd2ss %xmm1, %xmm0
40 ; SSE2_32-NEXT:    movss %xmm0, (%esp)
41 ; SSE2_32-NEXT:    flds (%esp)
42 ; SSE2_32-NEXT:    popl %eax
43 ; SSE2_32-NEXT:    retl
45 ; SSE2_64-LABEL: u32_to_f:
46 ; SSE2_64:       # %bb.0:
47 ; SSE2_64-NEXT:    movl %edi, %eax
48 ; SSE2_64-NEXT:    cvtsi2ss %rax, %xmm0
49 ; SSE2_64-NEXT:    retq
51 ; X87-LABEL: u32_to_f:
52 ; X87:       # %bb.0:
53 ; X87-NEXT:    pushl %ebp
54 ; X87-NEXT:    movl %esp, %ebp
55 ; X87-NEXT:    andl $-8, %esp
56 ; X87-NEXT:    subl $8, %esp
57 ; X87-NEXT:    movl 8(%ebp), %eax
58 ; X87-NEXT:    movl %eax, (%esp)
59 ; X87-NEXT:    movl $0, {{[0-9]+}}(%esp)
60 ; X87-NEXT:    fildll (%esp)
61 ; X87-NEXT:    movl %ebp, %esp
62 ; X87-NEXT:    popl %ebp
63 ; X87-NEXT:    retl
64   %r = uitofp i32 %a to float
65   ret float %r
68 define float @s32_to_f(i32 %a) nounwind {
69 ; AVX512_32-LABEL: s32_to_f:
70 ; AVX512_32:       # %bb.0:
71 ; AVX512_32-NEXT:    pushl %eax
72 ; AVX512_32-NEXT:    vcvtsi2ssl {{[0-9]+}}(%esp), %xmm0, %xmm0
73 ; AVX512_32-NEXT:    vmovss %xmm0, (%esp)
74 ; AVX512_32-NEXT:    flds (%esp)
75 ; AVX512_32-NEXT:    popl %eax
76 ; AVX512_32-NEXT:    retl
78 ; AVX512_64-LABEL: s32_to_f:
79 ; AVX512_64:       # %bb.0:
80 ; AVX512_64-NEXT:    vcvtsi2ss %edi, %xmm0, %xmm0
81 ; AVX512_64-NEXT:    retq
83 ; SSE2_32-LABEL: s32_to_f:
84 ; SSE2_32:       # %bb.0:
85 ; SSE2_32-NEXT:    pushl %eax
86 ; SSE2_32-NEXT:    cvtsi2ssl {{[0-9]+}}(%esp), %xmm0
87 ; SSE2_32-NEXT:    movss %xmm0, (%esp)
88 ; SSE2_32-NEXT:    flds (%esp)
89 ; SSE2_32-NEXT:    popl %eax
90 ; SSE2_32-NEXT:    retl
92 ; SSE2_64-LABEL: s32_to_f:
93 ; SSE2_64:       # %bb.0:
94 ; SSE2_64-NEXT:    cvtsi2ss %edi, %xmm0
95 ; SSE2_64-NEXT:    retq
97 ; X87-LABEL: s32_to_f:
98 ; X87:       # %bb.0:
99 ; X87-NEXT:    pushl %eax
100 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
101 ; X87-NEXT:    movl %eax, (%esp)
102 ; X87-NEXT:    fildl (%esp)
103 ; X87-NEXT:    popl %eax
104 ; X87-NEXT:    retl
105   %r = sitofp i32 %a to float
106   ret float %r
109 define double @u32_to_d(i32 %a) nounwind {
110 ; AVX512_32-LABEL: u32_to_d:
111 ; AVX512_32:       # %bb.0:
112 ; AVX512_32-NEXT:    pushl %ebp
113 ; AVX512_32-NEXT:    movl %esp, %ebp
114 ; AVX512_32-NEXT:    andl $-8, %esp
115 ; AVX512_32-NEXT:    subl $8, %esp
116 ; AVX512_32-NEXT:    vcvtusi2sdl 8(%ebp), %xmm0, %xmm0
117 ; AVX512_32-NEXT:    vmovsd %xmm0, (%esp)
118 ; AVX512_32-NEXT:    fldl (%esp)
119 ; AVX512_32-NEXT:    movl %ebp, %esp
120 ; AVX512_32-NEXT:    popl %ebp
121 ; AVX512_32-NEXT:    retl
123 ; AVX512_64-LABEL: u32_to_d:
124 ; AVX512_64:       # %bb.0:
125 ; AVX512_64-NEXT:    vcvtusi2sd %edi, %xmm0, %xmm0
126 ; AVX512_64-NEXT:    retq
128 ; SSE2_32-LABEL: u32_to_d:
129 ; SSE2_32:       # %bb.0:
130 ; SSE2_32-NEXT:    pushl %ebp
131 ; SSE2_32-NEXT:    movl %esp, %ebp
132 ; SSE2_32-NEXT:    andl $-8, %esp
133 ; SSE2_32-NEXT:    subl $8, %esp
134 ; SSE2_32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
135 ; SSE2_32-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
136 ; SSE2_32-NEXT:    orpd %xmm0, %xmm1
137 ; SSE2_32-NEXT:    subsd %xmm0, %xmm1
138 ; SSE2_32-NEXT:    movsd %xmm1, (%esp)
139 ; SSE2_32-NEXT:    fldl (%esp)
140 ; SSE2_32-NEXT:    movl %ebp, %esp
141 ; SSE2_32-NEXT:    popl %ebp
142 ; SSE2_32-NEXT:    retl
144 ; SSE2_64-LABEL: u32_to_d:
145 ; SSE2_64:       # %bb.0:
146 ; SSE2_64-NEXT:    movl %edi, %eax
147 ; SSE2_64-NEXT:    cvtsi2sd %rax, %xmm0
148 ; SSE2_64-NEXT:    retq
150 ; X87-LABEL: u32_to_d:
151 ; X87:       # %bb.0:
152 ; X87-NEXT:    pushl %ebp
153 ; X87-NEXT:    movl %esp, %ebp
154 ; X87-NEXT:    andl $-8, %esp
155 ; X87-NEXT:    subl $8, %esp
156 ; X87-NEXT:    movl 8(%ebp), %eax
157 ; X87-NEXT:    movl %eax, (%esp)
158 ; X87-NEXT:    movl $0, {{[0-9]+}}(%esp)
159 ; X87-NEXT:    fildll (%esp)
160 ; X87-NEXT:    movl %ebp, %esp
161 ; X87-NEXT:    popl %ebp
162 ; X87-NEXT:    retl
163   %r = uitofp i32 %a to double
164   ret double %r
167 define double @s32_to_d(i32 %a) nounwind {
168 ; AVX512_32-LABEL: s32_to_d:
169 ; AVX512_32:       # %bb.0:
170 ; AVX512_32-NEXT:    pushl %ebp
171 ; AVX512_32-NEXT:    movl %esp, %ebp
172 ; AVX512_32-NEXT:    andl $-8, %esp
173 ; AVX512_32-NEXT:    subl $8, %esp
174 ; AVX512_32-NEXT:    vcvtsi2sdl 8(%ebp), %xmm0, %xmm0
175 ; AVX512_32-NEXT:    vmovsd %xmm0, (%esp)
176 ; AVX512_32-NEXT:    fldl (%esp)
177 ; AVX512_32-NEXT:    movl %ebp, %esp
178 ; AVX512_32-NEXT:    popl %ebp
179 ; AVX512_32-NEXT:    retl
181 ; AVX512_64-LABEL: s32_to_d:
182 ; AVX512_64:       # %bb.0:
183 ; AVX512_64-NEXT:    vcvtsi2sd %edi, %xmm0, %xmm0
184 ; AVX512_64-NEXT:    retq
186 ; SSE2_32-LABEL: s32_to_d:
187 ; SSE2_32:       # %bb.0:
188 ; SSE2_32-NEXT:    pushl %ebp
189 ; SSE2_32-NEXT:    movl %esp, %ebp
190 ; SSE2_32-NEXT:    andl $-8, %esp
191 ; SSE2_32-NEXT:    subl $8, %esp
192 ; SSE2_32-NEXT:    cvtsi2sdl 8(%ebp), %xmm0
193 ; SSE2_32-NEXT:    movsd %xmm0, (%esp)
194 ; SSE2_32-NEXT:    fldl (%esp)
195 ; SSE2_32-NEXT:    movl %ebp, %esp
196 ; SSE2_32-NEXT:    popl %ebp
197 ; SSE2_32-NEXT:    retl
199 ; SSE2_64-LABEL: s32_to_d:
200 ; SSE2_64:       # %bb.0:
201 ; SSE2_64-NEXT:    cvtsi2sd %edi, %xmm0
202 ; SSE2_64-NEXT:    retq
204 ; X87-LABEL: s32_to_d:
205 ; X87:       # %bb.0:
206 ; X87-NEXT:    pushl %eax
207 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
208 ; X87-NEXT:    movl %eax, (%esp)
209 ; X87-NEXT:    fildl (%esp)
210 ; X87-NEXT:    popl %eax
211 ; X87-NEXT:    retl
212   %r = sitofp i32 %a to double
213   ret double %r
216 define x86_fp80 @u32_to_x(i32 %a) nounwind {
217 ; AVX512_32-LABEL: u32_to_x:
218 ; AVX512_32:       # %bb.0:
219 ; AVX512_32-NEXT:    pushl %ebp
220 ; AVX512_32-NEXT:    movl %esp, %ebp
221 ; AVX512_32-NEXT:    andl $-8, %esp
222 ; AVX512_32-NEXT:    subl $8, %esp
223 ; AVX512_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
224 ; AVX512_32-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
225 ; AVX512_32-NEXT:    vorpd %xmm0, %xmm1, %xmm1
226 ; AVX512_32-NEXT:    vsubsd %xmm0, %xmm1, %xmm0
227 ; AVX512_32-NEXT:    vmovsd %xmm0, (%esp)
228 ; AVX512_32-NEXT:    fldl (%esp)
229 ; AVX512_32-NEXT:    movl %ebp, %esp
230 ; AVX512_32-NEXT:    popl %ebp
231 ; AVX512_32-NEXT:    retl
233 ; CHECK64-LABEL: u32_to_x:
234 ; CHECK64:       # %bb.0:
235 ; CHECK64-NEXT:    movl %edi, %eax
236 ; CHECK64-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)
237 ; CHECK64-NEXT:    fildll -{{[0-9]+}}(%rsp)
238 ; CHECK64-NEXT:    retq
240 ; SSE2_32-LABEL: u32_to_x:
241 ; SSE2_32:       # %bb.0:
242 ; SSE2_32-NEXT:    pushl %ebp
243 ; SSE2_32-NEXT:    movl %esp, %ebp
244 ; SSE2_32-NEXT:    andl $-8, %esp
245 ; SSE2_32-NEXT:    subl $8, %esp
246 ; SSE2_32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
247 ; SSE2_32-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
248 ; SSE2_32-NEXT:    orpd %xmm0, %xmm1
249 ; SSE2_32-NEXT:    subsd %xmm0, %xmm1
250 ; SSE2_32-NEXT:    movsd %xmm1, (%esp)
251 ; SSE2_32-NEXT:    fldl (%esp)
252 ; SSE2_32-NEXT:    movl %ebp, %esp
253 ; SSE2_32-NEXT:    popl %ebp
254 ; SSE2_32-NEXT:    retl
256 ; X87-LABEL: u32_to_x:
257 ; X87:       # %bb.0:
258 ; X87-NEXT:    pushl %ebp
259 ; X87-NEXT:    movl %esp, %ebp
260 ; X87-NEXT:    andl $-8, %esp
261 ; X87-NEXT:    subl $8, %esp
262 ; X87-NEXT:    movl 8(%ebp), %eax
263 ; X87-NEXT:    movl %eax, (%esp)
264 ; X87-NEXT:    movl $0, {{[0-9]+}}(%esp)
265 ; X87-NEXT:    fildll (%esp)
266 ; X87-NEXT:    movl %ebp, %esp
267 ; X87-NEXT:    popl %ebp
268 ; X87-NEXT:    retl
269   %r = uitofp i32 %a to x86_fp80
270   ret x86_fp80 %r
273 define x86_fp80 @s32_to_x(i32 %a) nounwind {
274 ; CHECK32-LABEL: s32_to_x:
275 ; CHECK32:       # %bb.0:
276 ; CHECK32-NEXT:    pushl %eax
277 ; CHECK32-NEXT:    movl {{[0-9]+}}(%esp), %eax
278 ; CHECK32-NEXT:    movl %eax, (%esp)
279 ; CHECK32-NEXT:    fildl (%esp)
280 ; CHECK32-NEXT:    popl %eax
281 ; CHECK32-NEXT:    retl
283 ; CHECK64-LABEL: s32_to_x:
284 ; CHECK64:       # %bb.0:
285 ; CHECK64-NEXT:    movl %edi, -{{[0-9]+}}(%rsp)
286 ; CHECK64-NEXT:    fildl -{{[0-9]+}}(%rsp)
287 ; CHECK64-NEXT:    retq
288   %r = sitofp i32 %a to x86_fp80
289   ret x86_fp80 %r
292 define float @u64_to_f(i64 %a) nounwind {
293 ; AVX512DQVL_32-LABEL: u64_to_f:
294 ; AVX512DQVL_32:       # %bb.0:
295 ; AVX512DQVL_32-NEXT:    pushl %eax
296 ; AVX512DQVL_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
297 ; AVX512DQVL_32-NEXT:    vcvtuqq2ps %ymm0, %xmm0
298 ; AVX512DQVL_32-NEXT:    vmovss %xmm0, (%esp)
299 ; AVX512DQVL_32-NEXT:    flds (%esp)
300 ; AVX512DQVL_32-NEXT:    popl %eax
301 ; AVX512DQVL_32-NEXT:    vzeroupper
302 ; AVX512DQVL_32-NEXT:    retl
304 ; AVX512_64-LABEL: u64_to_f:
305 ; AVX512_64:       # %bb.0:
306 ; AVX512_64-NEXT:    vcvtusi2ss %rdi, %xmm0, %xmm0
307 ; AVX512_64-NEXT:    retq
309 ; AVX512DQ_32-LABEL: u64_to_f:
310 ; AVX512DQ_32:       # %bb.0:
311 ; AVX512DQ_32-NEXT:    pushl %eax
312 ; AVX512DQ_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
313 ; AVX512DQ_32-NEXT:    vcvtuqq2ps %zmm0, %ymm0
314 ; AVX512DQ_32-NEXT:    vmovss %xmm0, (%esp)
315 ; AVX512DQ_32-NEXT:    flds (%esp)
316 ; AVX512DQ_32-NEXT:    popl %eax
317 ; AVX512DQ_32-NEXT:    vzeroupper
318 ; AVX512DQ_32-NEXT:    retl
320 ; AVX512F_32-LABEL: u64_to_f:
321 ; AVX512F_32:       # %bb.0:
322 ; AVX512F_32-NEXT:    pushl %ebp
323 ; AVX512F_32-NEXT:    movl %esp, %ebp
324 ; AVX512F_32-NEXT:    andl $-8, %esp
325 ; AVX512F_32-NEXT:    subl $16, %esp
326 ; AVX512F_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
327 ; AVX512F_32-NEXT:    vmovlps %xmm0, {{[0-9]+}}(%esp)
328 ; AVX512F_32-NEXT:    xorl %eax, %eax
329 ; AVX512F_32-NEXT:    cmpl $0, 12(%ebp)
330 ; AVX512F_32-NEXT:    setns %al
331 ; AVX512F_32-NEXT:    fildll {{[0-9]+}}(%esp)
332 ; AVX512F_32-NEXT:    fadds {{\.LCPI.*}}(,%eax,4)
333 ; AVX512F_32-NEXT:    fstps {{[0-9]+}}(%esp)
334 ; AVX512F_32-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
335 ; AVX512F_32-NEXT:    vmovss %xmm0, (%esp)
336 ; AVX512F_32-NEXT:    flds (%esp)
337 ; AVX512F_32-NEXT:    movl %ebp, %esp
338 ; AVX512F_32-NEXT:    popl %ebp
339 ; AVX512F_32-NEXT:    retl
341 ; SSE2_32-LABEL: u64_to_f:
342 ; SSE2_32:       # %bb.0:
343 ; SSE2_32-NEXT:    pushl %ebp
344 ; SSE2_32-NEXT:    movl %esp, %ebp
345 ; SSE2_32-NEXT:    andl $-8, %esp
346 ; SSE2_32-NEXT:    subl $16, %esp
347 ; SSE2_32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
348 ; SSE2_32-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)
349 ; SSE2_32-NEXT:    xorl %eax, %eax
350 ; SSE2_32-NEXT:    cmpl $0, 12(%ebp)
351 ; SSE2_32-NEXT:    setns %al
352 ; SSE2_32-NEXT:    fildll {{[0-9]+}}(%esp)
353 ; SSE2_32-NEXT:    fadds {{\.LCPI.*}}(,%eax,4)
354 ; SSE2_32-NEXT:    fstps {{[0-9]+}}(%esp)
355 ; SSE2_32-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
356 ; SSE2_32-NEXT:    movss %xmm0, (%esp)
357 ; SSE2_32-NEXT:    flds (%esp)
358 ; SSE2_32-NEXT:    movl %ebp, %esp
359 ; SSE2_32-NEXT:    popl %ebp
360 ; SSE2_32-NEXT:    retl
362 ; SSE2_64-LABEL: u64_to_f:
363 ; SSE2_64:       # %bb.0:
364 ; SSE2_64-NEXT:    testq %rdi, %rdi
365 ; SSE2_64-NEXT:    js .LBB6_1
366 ; SSE2_64-NEXT:  # %bb.2:
367 ; SSE2_64-NEXT:    cvtsi2ss %rdi, %xmm0
368 ; SSE2_64-NEXT:    retq
369 ; SSE2_64-NEXT:  .LBB6_1:
370 ; SSE2_64-NEXT:    movq %rdi, %rax
371 ; SSE2_64-NEXT:    shrq %rax
372 ; SSE2_64-NEXT:    andl $1, %edi
373 ; SSE2_64-NEXT:    orq %rax, %rdi
374 ; SSE2_64-NEXT:    cvtsi2ss %rdi, %xmm0
375 ; SSE2_64-NEXT:    addss %xmm0, %xmm0
376 ; SSE2_64-NEXT:    retq
378 ; X87-LABEL: u64_to_f:
379 ; X87:       # %bb.0:
380 ; X87-NEXT:    pushl %ebp
381 ; X87-NEXT:    movl %esp, %ebp
382 ; X87-NEXT:    andl $-8, %esp
383 ; X87-NEXT:    subl $16, %esp
384 ; X87-NEXT:    movl 8(%ebp), %eax
385 ; X87-NEXT:    movl 12(%ebp), %ecx
386 ; X87-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
387 ; X87-NEXT:    movl %eax, {{[0-9]+}}(%esp)
388 ; X87-NEXT:    xorl %eax, %eax
389 ; X87-NEXT:    testl %ecx, %ecx
390 ; X87-NEXT:    setns %al
391 ; X87-NEXT:    fildll {{[0-9]+}}(%esp)
392 ; X87-NEXT:    fadds {{\.LCPI.*}}(,%eax,4)
393 ; X87-NEXT:    fstps {{[0-9]+}}(%esp)
394 ; X87-NEXT:    flds {{[0-9]+}}(%esp)
395 ; X87-NEXT:    movl %ebp, %esp
396 ; X87-NEXT:    popl %ebp
397 ; X87-NEXT:    retl
398   %r = uitofp i64 %a to float
399   ret float %r
402 define float @s64_to_f(i64 %a) nounwind {
403 ; AVX512DQVL_32-LABEL: s64_to_f:
404 ; AVX512DQVL_32:       # %bb.0:
405 ; AVX512DQVL_32-NEXT:    pushl %eax
406 ; AVX512DQVL_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
407 ; AVX512DQVL_32-NEXT:    vcvtqq2ps %ymm0, %xmm0
408 ; AVX512DQVL_32-NEXT:    vmovss %xmm0, (%esp)
409 ; AVX512DQVL_32-NEXT:    flds (%esp)
410 ; AVX512DQVL_32-NEXT:    popl %eax
411 ; AVX512DQVL_32-NEXT:    vzeroupper
412 ; AVX512DQVL_32-NEXT:    retl
414 ; AVX512_64-LABEL: s64_to_f:
415 ; AVX512_64:       # %bb.0:
416 ; AVX512_64-NEXT:    vcvtsi2ss %rdi, %xmm0, %xmm0
417 ; AVX512_64-NEXT:    retq
419 ; AVX512DQ_32-LABEL: s64_to_f:
420 ; AVX512DQ_32:       # %bb.0:
421 ; AVX512DQ_32-NEXT:    pushl %eax
422 ; AVX512DQ_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
423 ; AVX512DQ_32-NEXT:    vcvtqq2ps %zmm0, %ymm0
424 ; AVX512DQ_32-NEXT:    vmovss %xmm0, (%esp)
425 ; AVX512DQ_32-NEXT:    flds (%esp)
426 ; AVX512DQ_32-NEXT:    popl %eax
427 ; AVX512DQ_32-NEXT:    vzeroupper
428 ; AVX512DQ_32-NEXT:    retl
430 ; AVX512F_32-LABEL: s64_to_f:
431 ; AVX512F_32:       # %bb.0:
432 ; AVX512F_32-NEXT:    pushl %eax
433 ; AVX512F_32-NEXT:    fildll {{[0-9]+}}(%esp)
434 ; AVX512F_32-NEXT:    fstps (%esp)
435 ; AVX512F_32-NEXT:    flds (%esp)
436 ; AVX512F_32-NEXT:    popl %eax
437 ; AVX512F_32-NEXT:    retl
439 ; SSE2_32-LABEL: s64_to_f:
440 ; SSE2_32:       # %bb.0:
441 ; SSE2_32-NEXT:    pushl %eax
442 ; SSE2_32-NEXT:    fildll {{[0-9]+}}(%esp)
443 ; SSE2_32-NEXT:    fstps (%esp)
444 ; SSE2_32-NEXT:    flds (%esp)
445 ; SSE2_32-NEXT:    popl %eax
446 ; SSE2_32-NEXT:    retl
448 ; SSE2_64-LABEL: s64_to_f:
449 ; SSE2_64:       # %bb.0:
450 ; SSE2_64-NEXT:    cvtsi2ss %rdi, %xmm0
451 ; SSE2_64-NEXT:    retq
453 ; X87-LABEL: s64_to_f:
454 ; X87:       # %bb.0:
455 ; X87-NEXT:    fildll {{[0-9]+}}(%esp)
456 ; X87-NEXT:    retl
457   %r = sitofp i64 %a to float
458   ret float %r
461 define float @s64_to_f_2(i64 %a) nounwind {
462 ; AVX512DQVL_32-LABEL: s64_to_f_2:
463 ; AVX512DQVL_32:       # %bb.0:
464 ; AVX512DQVL_32-NEXT:    pushl %eax
465 ; AVX512DQVL_32-NEXT:    movl {{[0-9]+}}(%esp), %eax
466 ; AVX512DQVL_32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
467 ; AVX512DQVL_32-NEXT:    addl $5, %eax
468 ; AVX512DQVL_32-NEXT:    adcl $0, %ecx
469 ; AVX512DQVL_32-NEXT:    vmovd %eax, %xmm0
470 ; AVX512DQVL_32-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
471 ; AVX512DQVL_32-NEXT:    vcvtqq2ps %ymm0, %xmm0
472 ; AVX512DQVL_32-NEXT:    vmovss %xmm0, (%esp)
473 ; AVX512DQVL_32-NEXT:    flds (%esp)
474 ; AVX512DQVL_32-NEXT:    popl %eax
475 ; AVX512DQVL_32-NEXT:    vzeroupper
476 ; AVX512DQVL_32-NEXT:    retl
478 ; AVX512_64-LABEL: s64_to_f_2:
479 ; AVX512_64:       # %bb.0:
480 ; AVX512_64-NEXT:    addq $5, %rdi
481 ; AVX512_64-NEXT:    vcvtsi2ss %rdi, %xmm0, %xmm0
482 ; AVX512_64-NEXT:    retq
484 ; AVX512DQ_32-LABEL: s64_to_f_2:
485 ; AVX512DQ_32:       # %bb.0:
486 ; AVX512DQ_32-NEXT:    pushl %eax
487 ; AVX512DQ_32-NEXT:    movl {{[0-9]+}}(%esp), %eax
488 ; AVX512DQ_32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
489 ; AVX512DQ_32-NEXT:    addl $5, %eax
490 ; AVX512DQ_32-NEXT:    adcl $0, %ecx
491 ; AVX512DQ_32-NEXT:    vmovd %eax, %xmm0
492 ; AVX512DQ_32-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
493 ; AVX512DQ_32-NEXT:    vcvtqq2ps %zmm0, %ymm0
494 ; AVX512DQ_32-NEXT:    vmovss %xmm0, (%esp)
495 ; AVX512DQ_32-NEXT:    flds (%esp)
496 ; AVX512DQ_32-NEXT:    popl %eax
497 ; AVX512DQ_32-NEXT:    vzeroupper
498 ; AVX512DQ_32-NEXT:    retl
500 ; AVX512F_32-LABEL: s64_to_f_2:
501 ; AVX512F_32:       # %bb.0:
502 ; AVX512F_32-NEXT:    pushl %ebp
503 ; AVX512F_32-NEXT:    movl %esp, %ebp
504 ; AVX512F_32-NEXT:    andl $-8, %esp
505 ; AVX512F_32-NEXT:    subl $16, %esp
506 ; AVX512F_32-NEXT:    movl 8(%ebp), %eax
507 ; AVX512F_32-NEXT:    movl 12(%ebp), %ecx
508 ; AVX512F_32-NEXT:    addl $5, %eax
509 ; AVX512F_32-NEXT:    adcl $0, %ecx
510 ; AVX512F_32-NEXT:    vmovd %eax, %xmm0
511 ; AVX512F_32-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
512 ; AVX512F_32-NEXT:    vmovq %xmm0, {{[0-9]+}}(%esp)
513 ; AVX512F_32-NEXT:    fildll {{[0-9]+}}(%esp)
514 ; AVX512F_32-NEXT:    fstps {{[0-9]+}}(%esp)
515 ; AVX512F_32-NEXT:    flds {{[0-9]+}}(%esp)
516 ; AVX512F_32-NEXT:    movl %ebp, %esp
517 ; AVX512F_32-NEXT:    popl %ebp
518 ; AVX512F_32-NEXT:    retl
520 ; SSE2_32-LABEL: s64_to_f_2:
521 ; SSE2_32:       # %bb.0:
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 $16, %esp
526 ; SSE2_32-NEXT:    movl 8(%ebp), %eax
527 ; SSE2_32-NEXT:    movl 12(%ebp), %ecx
528 ; SSE2_32-NEXT:    addl $5, %eax
529 ; SSE2_32-NEXT:    adcl $0, %ecx
530 ; SSE2_32-NEXT:    movd %ecx, %xmm0
531 ; SSE2_32-NEXT:    movd %eax, %xmm1
532 ; SSE2_32-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
533 ; SSE2_32-NEXT:    movq %xmm1, {{[0-9]+}}(%esp)
534 ; SSE2_32-NEXT:    fildll {{[0-9]+}}(%esp)
535 ; SSE2_32-NEXT:    fstps {{[0-9]+}}(%esp)
536 ; SSE2_32-NEXT:    flds {{[0-9]+}}(%esp)
537 ; SSE2_32-NEXT:    movl %ebp, %esp
538 ; SSE2_32-NEXT:    popl %ebp
539 ; SSE2_32-NEXT:    retl
541 ; SSE2_64-LABEL: s64_to_f_2:
542 ; SSE2_64:       # %bb.0:
543 ; SSE2_64-NEXT:    addq $5, %rdi
544 ; SSE2_64-NEXT:    cvtsi2ss %rdi, %xmm0
545 ; SSE2_64-NEXT:    retq
547 ; X87-LABEL: s64_to_f_2:
548 ; X87:       # %bb.0:
549 ; X87-NEXT:    pushl %ebp
550 ; X87-NEXT:    movl %esp, %ebp
551 ; X87-NEXT:    andl $-8, %esp
552 ; X87-NEXT:    subl $8, %esp
553 ; X87-NEXT:    movl 8(%ebp), %eax
554 ; X87-NEXT:    movl 12(%ebp), %ecx
555 ; X87-NEXT:    addl $5, %eax
556 ; X87-NEXT:    adcl $0, %ecx
557 ; X87-NEXT:    movl %eax, (%esp)
558 ; X87-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
559 ; X87-NEXT:    fildll (%esp)
560 ; X87-NEXT:    movl %ebp, %esp
561 ; X87-NEXT:    popl %ebp
562 ; X87-NEXT:    retl
563   %a1 = add i64 %a, 5
564   %r = sitofp i64 %a1 to float
565   ret float %r
568 define double @u64_to_d(i64 %a) nounwind {
569 ; AVX512DQVL_32-LABEL: u64_to_d:
570 ; AVX512DQVL_32:       # %bb.0:
571 ; AVX512DQVL_32-NEXT:    pushl %ebp
572 ; AVX512DQVL_32-NEXT:    movl %esp, %ebp
573 ; AVX512DQVL_32-NEXT:    andl $-8, %esp
574 ; AVX512DQVL_32-NEXT:    subl $8, %esp
575 ; AVX512DQVL_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
576 ; AVX512DQVL_32-NEXT:    vcvtuqq2pd %ymm0, %ymm0
577 ; AVX512DQVL_32-NEXT:    vmovlps %xmm0, (%esp)
578 ; AVX512DQVL_32-NEXT:    fldl (%esp)
579 ; AVX512DQVL_32-NEXT:    movl %ebp, %esp
580 ; AVX512DQVL_32-NEXT:    popl %ebp
581 ; AVX512DQVL_32-NEXT:    vzeroupper
582 ; AVX512DQVL_32-NEXT:    retl
584 ; AVX512_64-LABEL: u64_to_d:
585 ; AVX512_64:       # %bb.0:
586 ; AVX512_64-NEXT:    vcvtusi2sd %rdi, %xmm0, %xmm0
587 ; AVX512_64-NEXT:    retq
589 ; AVX512DQ_32-LABEL: u64_to_d:
590 ; AVX512DQ_32:       # %bb.0:
591 ; AVX512DQ_32-NEXT:    pushl %ebp
592 ; AVX512DQ_32-NEXT:    movl %esp, %ebp
593 ; AVX512DQ_32-NEXT:    andl $-8, %esp
594 ; AVX512DQ_32-NEXT:    subl $8, %esp
595 ; AVX512DQ_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
596 ; AVX512DQ_32-NEXT:    vcvtuqq2pd %zmm0, %zmm0
597 ; AVX512DQ_32-NEXT:    vmovlps %xmm0, (%esp)
598 ; AVX512DQ_32-NEXT:    fldl (%esp)
599 ; AVX512DQ_32-NEXT:    movl %ebp, %esp
600 ; AVX512DQ_32-NEXT:    popl %ebp
601 ; AVX512DQ_32-NEXT:    vzeroupper
602 ; AVX512DQ_32-NEXT:    retl
604 ; AVX512F_32-LABEL: u64_to_d:
605 ; AVX512F_32:       # %bb.0:
606 ; AVX512F_32-NEXT:    pushl %ebp
607 ; AVX512F_32-NEXT:    movl %esp, %ebp
608 ; AVX512F_32-NEXT:    andl $-8, %esp
609 ; AVX512F_32-NEXT:    subl $8, %esp
610 ; AVX512F_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
611 ; AVX512F_32-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
612 ; AVX512F_32-NEXT:    vsubpd {{\.LCPI.*}}, %xmm0, %xmm0
613 ; AVX512F_32-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
614 ; AVX512F_32-NEXT:    vaddsd %xmm0, %xmm1, %xmm0
615 ; AVX512F_32-NEXT:    vmovsd %xmm0, (%esp)
616 ; AVX512F_32-NEXT:    fldl (%esp)
617 ; AVX512F_32-NEXT:    movl %ebp, %esp
618 ; AVX512F_32-NEXT:    popl %ebp
619 ; AVX512F_32-NEXT:    retl
621 ; SSE2_32-LABEL: u64_to_d:
622 ; SSE2_32:       # %bb.0:
623 ; SSE2_32-NEXT:    pushl %ebp
624 ; SSE2_32-NEXT:    movl %esp, %ebp
625 ; SSE2_32-NEXT:    andl $-8, %esp
626 ; SSE2_32-NEXT:    subl $8, %esp
627 ; SSE2_32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
628 ; SSE2_32-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
629 ; SSE2_32-NEXT:    subpd {{\.LCPI.*}}, %xmm0
630 ; SSE2_32-NEXT:    movapd %xmm0, %xmm1
631 ; SSE2_32-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]
632 ; SSE2_32-NEXT:    addsd %xmm0, %xmm1
633 ; SSE2_32-NEXT:    movsd %xmm1, (%esp)
634 ; SSE2_32-NEXT:    fldl (%esp)
635 ; SSE2_32-NEXT:    movl %ebp, %esp
636 ; SSE2_32-NEXT:    popl %ebp
637 ; SSE2_32-NEXT:    retl
639 ; SSE2_64-LABEL: u64_to_d:
640 ; SSE2_64:       # %bb.0:
641 ; SSE2_64-NEXT:    movq %rdi, %xmm1
642 ; SSE2_64-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
643 ; SSE2_64-NEXT:    subpd {{.*}}(%rip), %xmm1
644 ; SSE2_64-NEXT:    movapd %xmm1, %xmm0
645 ; SSE2_64-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
646 ; SSE2_64-NEXT:    addsd %xmm1, %xmm0
647 ; SSE2_64-NEXT:    retq
649 ; X87-LABEL: u64_to_d:
650 ; X87:       # %bb.0:
651 ; X87-NEXT:    pushl %ebp
652 ; X87-NEXT:    movl %esp, %ebp
653 ; X87-NEXT:    andl $-8, %esp
654 ; X87-NEXT:    subl $16, %esp
655 ; X87-NEXT:    movl 8(%ebp), %eax
656 ; X87-NEXT:    movl 12(%ebp), %ecx
657 ; X87-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
658 ; X87-NEXT:    movl %eax, (%esp)
659 ; X87-NEXT:    xorl %eax, %eax
660 ; X87-NEXT:    testl %ecx, %ecx
661 ; X87-NEXT:    setns %al
662 ; X87-NEXT:    fildll (%esp)
663 ; X87-NEXT:    fadds {{\.LCPI.*}}(,%eax,4)
664 ; X87-NEXT:    fstpl {{[0-9]+}}(%esp)
665 ; X87-NEXT:    fldl {{[0-9]+}}(%esp)
666 ; X87-NEXT:    movl %ebp, %esp
667 ; X87-NEXT:    popl %ebp
668 ; X87-NEXT:    retl
669   %r = uitofp i64 %a to double
670   ret double %r
673 define double @u64_to_d_optsize(i64 %a) nounwind optsize {
674 ; AVX512DQVL_32-LABEL: u64_to_d_optsize:
675 ; AVX512DQVL_32:       # %bb.0:
676 ; AVX512DQVL_32-NEXT:    pushl %ebp
677 ; AVX512DQVL_32-NEXT:    movl %esp, %ebp
678 ; AVX512DQVL_32-NEXT:    andl $-8, %esp
679 ; AVX512DQVL_32-NEXT:    subl $8, %esp
680 ; AVX512DQVL_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
681 ; AVX512DQVL_32-NEXT:    vcvtuqq2pd %ymm0, %ymm0
682 ; AVX512DQVL_32-NEXT:    vmovlps %xmm0, (%esp)
683 ; AVX512DQVL_32-NEXT:    fldl (%esp)
684 ; AVX512DQVL_32-NEXT:    movl %ebp, %esp
685 ; AVX512DQVL_32-NEXT:    popl %ebp
686 ; AVX512DQVL_32-NEXT:    vzeroupper
687 ; AVX512DQVL_32-NEXT:    retl
689 ; AVX512_64-LABEL: u64_to_d_optsize:
690 ; AVX512_64:       # %bb.0:
691 ; AVX512_64-NEXT:    vcvtusi2sd %rdi, %xmm0, %xmm0
692 ; AVX512_64-NEXT:    retq
694 ; AVX512DQ_32-LABEL: u64_to_d_optsize:
695 ; AVX512DQ_32:       # %bb.0:
696 ; AVX512DQ_32-NEXT:    pushl %ebp
697 ; AVX512DQ_32-NEXT:    movl %esp, %ebp
698 ; AVX512DQ_32-NEXT:    andl $-8, %esp
699 ; AVX512DQ_32-NEXT:    subl $8, %esp
700 ; AVX512DQ_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
701 ; AVX512DQ_32-NEXT:    vcvtuqq2pd %zmm0, %zmm0
702 ; AVX512DQ_32-NEXT:    vmovlps %xmm0, (%esp)
703 ; AVX512DQ_32-NEXT:    fldl (%esp)
704 ; AVX512DQ_32-NEXT:    movl %ebp, %esp
705 ; AVX512DQ_32-NEXT:    popl %ebp
706 ; AVX512DQ_32-NEXT:    vzeroupper
707 ; AVX512DQ_32-NEXT:    retl
709 ; AVX512F_32-LABEL: u64_to_d_optsize:
710 ; AVX512F_32:       # %bb.0:
711 ; AVX512F_32-NEXT:    pushl %ebp
712 ; AVX512F_32-NEXT:    movl %esp, %ebp
713 ; AVX512F_32-NEXT:    andl $-8, %esp
714 ; AVX512F_32-NEXT:    subl $8, %esp
715 ; AVX512F_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
716 ; AVX512F_32-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
717 ; AVX512F_32-NEXT:    vsubpd {{\.LCPI.*}}, %xmm0, %xmm0
718 ; AVX512F_32-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0
719 ; AVX512F_32-NEXT:    vmovlpd %xmm0, (%esp)
720 ; AVX512F_32-NEXT:    fldl (%esp)
721 ; AVX512F_32-NEXT:    movl %ebp, %esp
722 ; AVX512F_32-NEXT:    popl %ebp
723 ; AVX512F_32-NEXT:    retl
725 ; SSE2_32-LABEL: u64_to_d_optsize:
726 ; SSE2_32:       # %bb.0:
727 ; SSE2_32-NEXT:    pushl %ebp
728 ; SSE2_32-NEXT:    movl %esp, %ebp
729 ; SSE2_32-NEXT:    andl $-8, %esp
730 ; SSE2_32-NEXT:    subl $8, %esp
731 ; SSE2_32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
732 ; SSE2_32-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
733 ; SSE2_32-NEXT:    subpd {{\.LCPI.*}}, %xmm0
734 ; SSE2_32-NEXT:    movapd %xmm0, %xmm1
735 ; SSE2_32-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]
736 ; SSE2_32-NEXT:    addsd %xmm0, %xmm1
737 ; SSE2_32-NEXT:    movsd %xmm1, (%esp)
738 ; SSE2_32-NEXT:    fldl (%esp)
739 ; SSE2_32-NEXT:    movl %ebp, %esp
740 ; SSE2_32-NEXT:    popl %ebp
741 ; SSE2_32-NEXT:    retl
743 ; SSE2_64-LABEL: u64_to_d_optsize:
744 ; SSE2_64:       # %bb.0:
745 ; SSE2_64-NEXT:    movq %rdi, %xmm1
746 ; SSE2_64-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
747 ; SSE2_64-NEXT:    subpd {{.*}}(%rip), %xmm1
748 ; SSE2_64-NEXT:    movapd %xmm1, %xmm0
749 ; SSE2_64-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
750 ; SSE2_64-NEXT:    addsd %xmm1, %xmm0
751 ; SSE2_64-NEXT:    retq
753 ; X87-LABEL: u64_to_d_optsize:
754 ; X87:       # %bb.0:
755 ; X87-NEXT:    pushl %ebp
756 ; X87-NEXT:    movl %esp, %ebp
757 ; X87-NEXT:    andl $-8, %esp
758 ; X87-NEXT:    subl $16, %esp
759 ; X87-NEXT:    movl 8(%ebp), %eax
760 ; X87-NEXT:    movl 12(%ebp), %ecx
761 ; X87-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
762 ; X87-NEXT:    movl %eax, (%esp)
763 ; X87-NEXT:    xorl %eax, %eax
764 ; X87-NEXT:    testl %ecx, %ecx
765 ; X87-NEXT:    setns %al
766 ; X87-NEXT:    fildll (%esp)
767 ; X87-NEXT:    fadds {{\.LCPI.*}}(,%eax,4)
768 ; X87-NEXT:    fstpl {{[0-9]+}}(%esp)
769 ; X87-NEXT:    fldl {{[0-9]+}}(%esp)
770 ; X87-NEXT:    movl %ebp, %esp
771 ; X87-NEXT:    popl %ebp
772 ; X87-NEXT:    retl
773   %r = uitofp i64 %a to double
774   ret double %r
777 define double @s64_to_d(i64 %a) nounwind {
778 ; AVX512DQVL_32-LABEL: s64_to_d:
779 ; AVX512DQVL_32:       # %bb.0:
780 ; AVX512DQVL_32-NEXT:    pushl %ebp
781 ; AVX512DQVL_32-NEXT:    movl %esp, %ebp
782 ; AVX512DQVL_32-NEXT:    andl $-8, %esp
783 ; AVX512DQVL_32-NEXT:    subl $8, %esp
784 ; AVX512DQVL_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
785 ; AVX512DQVL_32-NEXT:    vcvtqq2pd %ymm0, %ymm0
786 ; AVX512DQVL_32-NEXT:    vmovlps %xmm0, (%esp)
787 ; AVX512DQVL_32-NEXT:    fldl (%esp)
788 ; AVX512DQVL_32-NEXT:    movl %ebp, %esp
789 ; AVX512DQVL_32-NEXT:    popl %ebp
790 ; AVX512DQVL_32-NEXT:    vzeroupper
791 ; AVX512DQVL_32-NEXT:    retl
793 ; AVX512_64-LABEL: s64_to_d:
794 ; AVX512_64:       # %bb.0:
795 ; AVX512_64-NEXT:    vcvtsi2sd %rdi, %xmm0, %xmm0
796 ; AVX512_64-NEXT:    retq
798 ; AVX512DQ_32-LABEL: s64_to_d:
799 ; AVX512DQ_32:       # %bb.0:
800 ; AVX512DQ_32-NEXT:    pushl %ebp
801 ; AVX512DQ_32-NEXT:    movl %esp, %ebp
802 ; AVX512DQ_32-NEXT:    andl $-8, %esp
803 ; AVX512DQ_32-NEXT:    subl $8, %esp
804 ; AVX512DQ_32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
805 ; AVX512DQ_32-NEXT:    vcvtqq2pd %zmm0, %zmm0
806 ; AVX512DQ_32-NEXT:    vmovlps %xmm0, (%esp)
807 ; AVX512DQ_32-NEXT:    fldl (%esp)
808 ; AVX512DQ_32-NEXT:    movl %ebp, %esp
809 ; AVX512DQ_32-NEXT:    popl %ebp
810 ; AVX512DQ_32-NEXT:    vzeroupper
811 ; AVX512DQ_32-NEXT:    retl
813 ; AVX512F_32-LABEL: s64_to_d:
814 ; AVX512F_32:       # %bb.0:
815 ; AVX512F_32-NEXT:    pushl %ebp
816 ; AVX512F_32-NEXT:    movl %esp, %ebp
817 ; AVX512F_32-NEXT:    andl $-8, %esp
818 ; AVX512F_32-NEXT:    subl $8, %esp
819 ; AVX512F_32-NEXT:    fildll 8(%ebp)
820 ; AVX512F_32-NEXT:    fstpl (%esp)
821 ; AVX512F_32-NEXT:    fldl (%esp)
822 ; AVX512F_32-NEXT:    movl %ebp, %esp
823 ; AVX512F_32-NEXT:    popl %ebp
824 ; AVX512F_32-NEXT:    retl
826 ; SSE2_32-LABEL: s64_to_d:
827 ; SSE2_32:       # %bb.0:
828 ; SSE2_32-NEXT:    pushl %ebp
829 ; SSE2_32-NEXT:    movl %esp, %ebp
830 ; SSE2_32-NEXT:    andl $-8, %esp
831 ; SSE2_32-NEXT:    subl $8, %esp
832 ; SSE2_32-NEXT:    fildll 8(%ebp)
833 ; SSE2_32-NEXT:    fstpl (%esp)
834 ; SSE2_32-NEXT:    fldl (%esp)
835 ; SSE2_32-NEXT:    movl %ebp, %esp
836 ; SSE2_32-NEXT:    popl %ebp
837 ; SSE2_32-NEXT:    retl
839 ; SSE2_64-LABEL: s64_to_d:
840 ; SSE2_64:       # %bb.0:
841 ; SSE2_64-NEXT:    cvtsi2sd %rdi, %xmm0
842 ; SSE2_64-NEXT:    retq
844 ; X87-LABEL: s64_to_d:
845 ; X87:       # %bb.0:
846 ; X87-NEXT:    fildll {{[0-9]+}}(%esp)
847 ; X87-NEXT:    retl
848   %r = sitofp i64 %a to double
849   ret double %r
852 define double @s64_to_d_2(i64 %a) nounwind {
853 ; AVX512DQVL_32-LABEL: s64_to_d_2:
854 ; AVX512DQVL_32:       # %bb.0:
855 ; AVX512DQVL_32-NEXT:    pushl %ebp
856 ; AVX512DQVL_32-NEXT:    movl %esp, %ebp
857 ; AVX512DQVL_32-NEXT:    andl $-8, %esp
858 ; AVX512DQVL_32-NEXT:    subl $8, %esp
859 ; AVX512DQVL_32-NEXT:    movl 8(%ebp), %eax
860 ; AVX512DQVL_32-NEXT:    movl 12(%ebp), %ecx
861 ; AVX512DQVL_32-NEXT:    addl $5, %eax
862 ; AVX512DQVL_32-NEXT:    adcl $0, %ecx
863 ; AVX512DQVL_32-NEXT:    vmovd %eax, %xmm0
864 ; AVX512DQVL_32-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
865 ; AVX512DQVL_32-NEXT:    vcvtqq2pd %ymm0, %ymm0
866 ; AVX512DQVL_32-NEXT:    vmovlps %xmm0, (%esp)
867 ; AVX512DQVL_32-NEXT:    fldl (%esp)
868 ; AVX512DQVL_32-NEXT:    movl %ebp, %esp
869 ; AVX512DQVL_32-NEXT:    popl %ebp
870 ; AVX512DQVL_32-NEXT:    vzeroupper
871 ; AVX512DQVL_32-NEXT:    retl
873 ; AVX512_64-LABEL: s64_to_d_2:
874 ; AVX512_64:       # %bb.0:
875 ; AVX512_64-NEXT:    addq $5, %rdi
876 ; AVX512_64-NEXT:    vcvtsi2sd %rdi, %xmm0, %xmm0
877 ; AVX512_64-NEXT:    retq
879 ; AVX512DQ_32-LABEL: s64_to_d_2:
880 ; AVX512DQ_32:       # %bb.0:
881 ; AVX512DQ_32-NEXT:    pushl %ebp
882 ; AVX512DQ_32-NEXT:    movl %esp, %ebp
883 ; AVX512DQ_32-NEXT:    andl $-8, %esp
884 ; AVX512DQ_32-NEXT:    subl $8, %esp
885 ; AVX512DQ_32-NEXT:    movl 8(%ebp), %eax
886 ; AVX512DQ_32-NEXT:    movl 12(%ebp), %ecx
887 ; AVX512DQ_32-NEXT:    addl $5, %eax
888 ; AVX512DQ_32-NEXT:    adcl $0, %ecx
889 ; AVX512DQ_32-NEXT:    vmovd %eax, %xmm0
890 ; AVX512DQ_32-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
891 ; AVX512DQ_32-NEXT:    vcvtqq2pd %zmm0, %zmm0
892 ; AVX512DQ_32-NEXT:    vmovlps %xmm0, (%esp)
893 ; AVX512DQ_32-NEXT:    fldl (%esp)
894 ; AVX512DQ_32-NEXT:    movl %ebp, %esp
895 ; AVX512DQ_32-NEXT:    popl %ebp
896 ; AVX512DQ_32-NEXT:    vzeroupper
897 ; AVX512DQ_32-NEXT:    retl
899 ; AVX512F_32-LABEL: s64_to_d_2:
900 ; AVX512F_32:       # %bb.0:
901 ; AVX512F_32-NEXT:    pushl %ebp
902 ; AVX512F_32-NEXT:    movl %esp, %ebp
903 ; AVX512F_32-NEXT:    andl $-8, %esp
904 ; AVX512F_32-NEXT:    subl $16, %esp
905 ; AVX512F_32-NEXT:    movl 8(%ebp), %eax
906 ; AVX512F_32-NEXT:    movl 12(%ebp), %ecx
907 ; AVX512F_32-NEXT:    addl $5, %eax
908 ; AVX512F_32-NEXT:    adcl $0, %ecx
909 ; AVX512F_32-NEXT:    vmovd %eax, %xmm0
910 ; AVX512F_32-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
911 ; AVX512F_32-NEXT:    vmovq %xmm0, {{[0-9]+}}(%esp)
912 ; AVX512F_32-NEXT:    fildll {{[0-9]+}}(%esp)
913 ; AVX512F_32-NEXT:    fstpl (%esp)
914 ; AVX512F_32-NEXT:    fldl (%esp)
915 ; AVX512F_32-NEXT:    movl %ebp, %esp
916 ; AVX512F_32-NEXT:    popl %ebp
917 ; AVX512F_32-NEXT:    retl
919 ; SSE2_32-LABEL: s64_to_d_2:
920 ; SSE2_32:       # %bb.0:
921 ; SSE2_32-NEXT:    pushl %ebp
922 ; SSE2_32-NEXT:    movl %esp, %ebp
923 ; SSE2_32-NEXT:    andl $-8, %esp
924 ; SSE2_32-NEXT:    subl $16, %esp
925 ; SSE2_32-NEXT:    movl 8(%ebp), %eax
926 ; SSE2_32-NEXT:    movl 12(%ebp), %ecx
927 ; SSE2_32-NEXT:    addl $5, %eax
928 ; SSE2_32-NEXT:    adcl $0, %ecx
929 ; SSE2_32-NEXT:    movd %ecx, %xmm0
930 ; SSE2_32-NEXT:    movd %eax, %xmm1
931 ; SSE2_32-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
932 ; SSE2_32-NEXT:    movq %xmm1, {{[0-9]+}}(%esp)
933 ; SSE2_32-NEXT:    fildll {{[0-9]+}}(%esp)
934 ; SSE2_32-NEXT:    fstpl (%esp)
935 ; SSE2_32-NEXT:    fldl (%esp)
936 ; SSE2_32-NEXT:    movl %ebp, %esp
937 ; SSE2_32-NEXT:    popl %ebp
938 ; SSE2_32-NEXT:    retl
940 ; SSE2_64-LABEL: s64_to_d_2:
941 ; SSE2_64:       # %bb.0:
942 ; SSE2_64-NEXT:    addq $5, %rdi
943 ; SSE2_64-NEXT:    cvtsi2sd %rdi, %xmm0
944 ; SSE2_64-NEXT:    retq
946 ; X87-LABEL: s64_to_d_2:
947 ; X87:       # %bb.0:
948 ; X87-NEXT:    pushl %ebp
949 ; X87-NEXT:    movl %esp, %ebp
950 ; X87-NEXT:    andl $-8, %esp
951 ; X87-NEXT:    subl $8, %esp
952 ; X87-NEXT:    movl 8(%ebp), %eax
953 ; X87-NEXT:    movl 12(%ebp), %ecx
954 ; X87-NEXT:    addl $5, %eax
955 ; X87-NEXT:    adcl $0, %ecx
956 ; X87-NEXT:    movl %eax, (%esp)
957 ; X87-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
958 ; X87-NEXT:    fildll (%esp)
959 ; X87-NEXT:    movl %ebp, %esp
960 ; X87-NEXT:    popl %ebp
961 ; X87-NEXT:    retl
962   %b = add i64 %a, 5
963   %f = sitofp i64 %b to double
964   ret double %f
967 define x86_fp80 @u64_to_x(i64 %a) nounwind {
968 ; CHECK32-LABEL: u64_to_x:
969 ; CHECK32:       # %bb.0:
970 ; CHECK32-NEXT:    pushl %ebp
971 ; CHECK32-NEXT:    movl %esp, %ebp
972 ; CHECK32-NEXT:    andl $-8, %esp
973 ; CHECK32-NEXT:    subl $8, %esp
974 ; CHECK32-NEXT:    movl 8(%ebp), %eax
975 ; CHECK32-NEXT:    movl 12(%ebp), %ecx
976 ; CHECK32-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
977 ; CHECK32-NEXT:    movl %eax, (%esp)
978 ; CHECK32-NEXT:    xorl %eax, %eax
979 ; CHECK32-NEXT:    testl %ecx, %ecx
980 ; CHECK32-NEXT:    setns %al
981 ; CHECK32-NEXT:    fildll (%esp)
982 ; CHECK32-NEXT:    fadds {{\.LCPI.*}}(,%eax,4)
983 ; CHECK32-NEXT:    movl %ebp, %esp
984 ; CHECK32-NEXT:    popl %ebp
985 ; CHECK32-NEXT:    retl
987 ; CHECK64-LABEL: u64_to_x:
988 ; CHECK64:       # %bb.0:
989 ; CHECK64-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)
990 ; CHECK64-NEXT:    xorl %eax, %eax
991 ; CHECK64-NEXT:    testq %rdi, %rdi
992 ; CHECK64-NEXT:    setns %al
993 ; CHECK64-NEXT:    fildll -{{[0-9]+}}(%rsp)
994 ; CHECK64-NEXT:    fadds {{\.LCPI.*}}(,%rax,4)
995 ; CHECK64-NEXT:    retq
996   %r = uitofp i64 %a to x86_fp80
997   ret x86_fp80 %r
1000 define x86_fp80 @s64_to_x(i64 %a) nounwind {
1001 ; CHECK32-LABEL: s64_to_x:
1002 ; CHECK32:       # %bb.0:
1003 ; CHECK32-NEXT:    fildll {{[0-9]+}}(%esp)
1004 ; CHECK32-NEXT:    retl
1006 ; CHECK64-LABEL: s64_to_x:
1007 ; CHECK64:       # %bb.0:
1008 ; CHECK64-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)
1009 ; CHECK64-NEXT:    fildll -{{[0-9]+}}(%rsp)
1010 ; CHECK64-NEXT:    retq
1011   %r = sitofp i64 %a to x86_fp80
1012   ret x86_fp80 %r