1 ; Verify that scalar integer conversions to FP compile successfully
2 ; (at one time long double failed with avx512f), and that reasonable
3 ; instruction sequences are selected based on subtarget features.
4 ; Due to the plethora of reasonable sequences we just check for
5 ; one key instruction, usually a cvt or fild, allowing the test
6 ; to be relatively easily updated when sequences are improved.
8 ; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_32
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_64
10 ; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_32
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_64
12 ; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=-sse | FileCheck %s --check-prefix=CHECK --check-prefix=X87
14 ; CHECK-LABEL: u32_to_f
15 ; AVX512_32: vcvtusi2ssl
16 ; AVX512_64: vcvtusi2ssl
20 define float @u32_to_f(i32 %a) nounwind {
21 %r = uitofp i32 %a to float
25 ; CHECK-LABEL: s32_to_f
26 ; AVX512_32: vcvtsi2ssl
27 ; AVX512_64: vcvtsi2ssl
31 define float @s32_to_f(i32 %a) nounwind {
32 %r = sitofp i32 %a to float
36 ; CHECK-LABEL: u32_to_d
37 ; AVX512_32: vcvtusi2sdl
38 ; AVX512_64: vcvtusi2sdl
42 define double @u32_to_d(i32 %a) nounwind {
43 %r = uitofp i32 %a to double
47 ; CHECK-LABEL: s32_to_d
48 ; AVX512_32: vcvtsi2sdl
49 ; AVX512_64: vcvtsi2sdl
53 define double @s32_to_d(i32 %a) nounwind {
54 %r = sitofp i32 %a to double
58 ; CHECK-LABEL: u32_to_x
64 define x86_fp80 @u32_to_x(i32 %a) nounwind {
65 %r = uitofp i32 %a to x86_fp80
69 ; CHECK-LABEL: s32_to_x
71 define x86_fp80 @s32_to_x(i32 %a) nounwind {
72 %r = sitofp i32 %a to x86_fp80
76 ; CHECK-LABEL: u64_to_f
77 ; AVX512_32: vmovq {{.*#+}} xmm0 = mem[0],zero
78 ; AVX512_32: vmovlpd %xmm0, {{[0-9]+}}(%esp)
81 ; AVX512_64: vcvtusi2ssq
83 ; SSE2_32: movq {{.*#+}} xmm0 = mem[0],zero
84 ; SSE2_32: movq %xmm0, {{[0-9]+}}(%esp)
89 define float @u64_to_f(i64 %a) nounwind {
90 %r = uitofp i64 %a to float
94 ; CHECK-LABEL: s64_to_f
96 ; AVX512_64: vcvtsi2ssq
100 define float @s64_to_f(i64 %a) nounwind {
101 %r = sitofp i64 %a to float
105 ; CHECK-LABEL: s64_to_f_2
106 ; SSE2_32: movd %ecx, %xmm0
107 ; SSE2_32: movd %eax, %xmm1
108 ; SSE2_32: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
109 ; SSE2_32: movq %xmm1, {{[0-9]+}}(%esp)
110 ; SSE2_32: fildll {{[0-9]+}}(%esp)
112 ; AVX512_32: vmovd %eax, %xmm0
113 ; AVX512_32: vpinsrd $1, %ecx, %xmm0, %xmm0
114 ; AVX512_32: vmovlpd %xmm0, {{[0-9]+}}(%esp)
115 ; AVX512_32: fildll {{[0-9]+}}(%esp)
117 define float @s64_to_f_2(i64 %a) nounwind {
119 %r = sitofp i64 %a1 to float
123 ; CHECK-LABEL: u64_to_d
124 ; AVX512_32: vpunpckldq
125 ; AVX512_64: vcvtusi2sdq
129 define double @u64_to_d(i64 %a) nounwind {
130 %r = uitofp i64 %a to double
134 ; CHECK-LABEL: s64_to_d
136 ; AVX512_64: vcvtsi2sdq
140 define double @s64_to_d(i64 %a) nounwind {
141 %r = sitofp i64 %a to double
145 ; CHECK-LABEL: s64_to_d_2
146 ; SSE2_32: movd %ecx, %xmm0
147 ; SSE2_32: movd %eax, %xmm1
148 ; SSE2_32: punpckldq %xmm0, %xmm1
149 ; SSE2_32: movq %xmm1, {{[0-9]+}}(%esp)
152 ; AVX512_32: vmovd %eax, %xmm0
153 ; AVX512_32: vpinsrd $1, %ecx, %xmm0, %xmm0
154 ; AVX512_32: vmovlpd %xmm0, {{[0-9]+}}(%esp)
157 define double @s64_to_d_2(i64 %a) nounwind {
159 %f = sitofp i64 %b to double
163 ; CHECK-LABEL: u64_to_x
165 define x86_fp80 @u64_to_x(i64 %a) nounwind {
166 %r = uitofp i64 %a to x86_fp80
170 ; CHECK-LABEL: s64_to_x
172 define x86_fp80 @s64_to_x(i64 %a) nounwind {
173 %r = sitofp i64 %a to x86_fp80