xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/scalar-int-to-fp.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Verify that scalar integer conversions to FP compile successfully
2*9880d681SAndroid Build Coastguard Worker; (at one time long double failed with avx512f), and that reasonable
3*9880d681SAndroid Build Coastguard Worker; instruction sequences are selected based on subtarget features.
4*9880d681SAndroid Build Coastguard Worker; Due to the plethora of reasonable sequences we just check for
5*9880d681SAndroid Build Coastguard Worker; one key instruction, usually a cvt or fild, allowing the test
6*9880d681SAndroid Build Coastguard Worker; to be relatively easily updated when sequences are improved.
7*9880d681SAndroid Build Coastguard Worker;
8*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-unknown     -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_32
9*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown   -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_64
10*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-unknown     -mattr=+sse2    | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_32
11*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown   -mattr=+sse2    | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_64
12*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-unknown     -mattr=-sse     | FileCheck %s --check-prefix=CHECK --check-prefix=X87
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u32_to_f
15*9880d681SAndroid Build Coastguard Worker; AVX512_32: vcvtusi2ssl
16*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtusi2ssl
17*9880d681SAndroid Build Coastguard Worker; SSE2_32: cvtsd2ss
18*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2ssq
19*9880d681SAndroid Build Coastguard Worker; X87: fildll
20*9880d681SAndroid Build Coastguard Workerdefine float @u32_to_f(i32 %a) nounwind {
21*9880d681SAndroid Build Coastguard Worker  %r = uitofp i32 %a to float
22*9880d681SAndroid Build Coastguard Worker  ret float %r
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s32_to_f
26*9880d681SAndroid Build Coastguard Worker; AVX512_32: vcvtsi2ssl
27*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtsi2ssl
28*9880d681SAndroid Build Coastguard Worker; SSE2_32: cvtsi2ssl
29*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2ssl
30*9880d681SAndroid Build Coastguard Worker; X87: fildl
31*9880d681SAndroid Build Coastguard Workerdefine float @s32_to_f(i32 %a) nounwind {
32*9880d681SAndroid Build Coastguard Worker  %r = sitofp i32 %a to float
33*9880d681SAndroid Build Coastguard Worker  ret float %r
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u32_to_d
37*9880d681SAndroid Build Coastguard Worker; AVX512_32: vcvtusi2sdl
38*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtusi2sdl
39*9880d681SAndroid Build Coastguard Worker; SSE2_32: subsd
40*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2sdq
41*9880d681SAndroid Build Coastguard Worker; X87: fildll
42*9880d681SAndroid Build Coastguard Workerdefine double @u32_to_d(i32 %a) nounwind {
43*9880d681SAndroid Build Coastguard Worker  %r = uitofp i32 %a to double
44*9880d681SAndroid Build Coastguard Worker  ret double %r
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s32_to_d
48*9880d681SAndroid Build Coastguard Worker; AVX512_32: vcvtsi2sdl
49*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtsi2sdl
50*9880d681SAndroid Build Coastguard Worker; SSE2_32: cvtsi2sdl
51*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2sdl
52*9880d681SAndroid Build Coastguard Worker; X87: fildl
53*9880d681SAndroid Build Coastguard Workerdefine double @s32_to_d(i32 %a) nounwind {
54*9880d681SAndroid Build Coastguard Worker  %r = sitofp i32 %a to double
55*9880d681SAndroid Build Coastguard Worker  ret double %r
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u32_to_x
59*9880d681SAndroid Build Coastguard Worker; AVX512_32: vsubsd
60*9880d681SAndroid Build Coastguard Worker; AVX512_64: vsubsd
61*9880d681SAndroid Build Coastguard Worker; SSE2_32: subsd
62*9880d681SAndroid Build Coastguard Worker; SSE2_64: fildll
63*9880d681SAndroid Build Coastguard Worker; X87: fildll
64*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @u32_to_x(i32 %a) nounwind {
65*9880d681SAndroid Build Coastguard Worker  %r = uitofp i32 %a to x86_fp80
66*9880d681SAndroid Build Coastguard Worker  ret x86_fp80 %r
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s32_to_x
70*9880d681SAndroid Build Coastguard Worker; CHECK: fildl
71*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @s32_to_x(i32 %a) nounwind {
72*9880d681SAndroid Build Coastguard Worker  %r = sitofp i32 %a to x86_fp80
73*9880d681SAndroid Build Coastguard Worker  ret x86_fp80 %r
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u64_to_f
77*9880d681SAndroid Build Coastguard Worker; AVX512_32: vmovq {{.*#+}} xmm0 = mem[0],zero
78*9880d681SAndroid Build Coastguard Worker; AVX512_32: vmovlpd %xmm0, {{[0-9]+}}(%esp)
79*9880d681SAndroid Build Coastguard Worker; AVX512_32: fildll
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtusi2ssq
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; SSE2_32: movq {{.*#+}} xmm0 = mem[0],zero
84*9880d681SAndroid Build Coastguard Worker; SSE2_32: movq %xmm0, {{[0-9]+}}(%esp)
85*9880d681SAndroid Build Coastguard Worker; SSE2_32: fildll
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2ssq
88*9880d681SAndroid Build Coastguard Worker; X87: fildll
89*9880d681SAndroid Build Coastguard Workerdefine float @u64_to_f(i64 %a) nounwind {
90*9880d681SAndroid Build Coastguard Worker  %r = uitofp i64 %a to float
91*9880d681SAndroid Build Coastguard Worker  ret float %r
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s64_to_f
95*9880d681SAndroid Build Coastguard Worker; AVX512_32: fildll
96*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtsi2ssq
97*9880d681SAndroid Build Coastguard Worker; SSE2_32: fildll
98*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2ssq
99*9880d681SAndroid Build Coastguard Worker; X87: fildll
100*9880d681SAndroid Build Coastguard Workerdefine float @s64_to_f(i64 %a) nounwind {
101*9880d681SAndroid Build Coastguard Worker  %r = sitofp i64 %a to float
102*9880d681SAndroid Build Coastguard Worker  ret float %r
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s64_to_f_2
106*9880d681SAndroid Build Coastguard Worker; SSE2_32:    movd %ecx, %xmm0
107*9880d681SAndroid Build Coastguard Worker; SSE2_32:    movd %eax, %xmm1
108*9880d681SAndroid Build Coastguard Worker; SSE2_32:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
109*9880d681SAndroid Build Coastguard Worker; SSE2_32:    movq %xmm1, {{[0-9]+}}(%esp)
110*9880d681SAndroid Build Coastguard Worker; SSE2_32:    fildll {{[0-9]+}}(%esp)
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; AVX512_32:    vmovd %eax, %xmm0
113*9880d681SAndroid Build Coastguard Worker; AVX512_32:    vpinsrd $1, %ecx, %xmm0, %xmm0
114*9880d681SAndroid Build Coastguard Worker; AVX512_32:    vmovlpd %xmm0, {{[0-9]+}}(%esp)
115*9880d681SAndroid Build Coastguard Worker; AVX512_32:    fildll {{[0-9]+}}(%esp)
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine float @s64_to_f_2(i64 %a) nounwind {
118*9880d681SAndroid Build Coastguard Worker  %a1 = add i64 %a, 5
119*9880d681SAndroid Build Coastguard Worker  %r = sitofp i64 %a1 to float
120*9880d681SAndroid Build Coastguard Worker  ret float %r
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u64_to_d
124*9880d681SAndroid Build Coastguard Worker; AVX512_32: vpunpckldq
125*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtusi2sdq
126*9880d681SAndroid Build Coastguard Worker; SSE2_32: punpckldq
127*9880d681SAndroid Build Coastguard Worker; SSE2_64: punpckldq
128*9880d681SAndroid Build Coastguard Worker; X87: fildll
129*9880d681SAndroid Build Coastguard Workerdefine double @u64_to_d(i64 %a) nounwind {
130*9880d681SAndroid Build Coastguard Worker  %r = uitofp i64 %a to double
131*9880d681SAndroid Build Coastguard Worker  ret double %r
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s64_to_d
135*9880d681SAndroid Build Coastguard Worker; AVX512_32: fildll
136*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtsi2sdq
137*9880d681SAndroid Build Coastguard Worker; SSE2_32: fildll
138*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2sdq
139*9880d681SAndroid Build Coastguard Worker; X87: fildll
140*9880d681SAndroid Build Coastguard Workerdefine double @s64_to_d(i64 %a) nounwind {
141*9880d681SAndroid Build Coastguard Worker  %r = sitofp i64 %a to double
142*9880d681SAndroid Build Coastguard Worker  ret double %r
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s64_to_d_2
146*9880d681SAndroid Build Coastguard Worker; SSE2_32: movd %ecx, %xmm0
147*9880d681SAndroid Build Coastguard Worker; SSE2_32: movd %eax, %xmm1
148*9880d681SAndroid Build Coastguard Worker; SSE2_32: punpckldq %xmm0, %xmm1
149*9880d681SAndroid Build Coastguard Worker; SSE2_32: movq %xmm1, {{[0-9]+}}(%esp)
150*9880d681SAndroid Build Coastguard Worker; SSE2_32: fildll
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker; AVX512_32:    vmovd %eax, %xmm0
153*9880d681SAndroid Build Coastguard Worker; AVX512_32:    vpinsrd $1, %ecx, %xmm0, %xmm0
154*9880d681SAndroid Build Coastguard Worker; AVX512_32:    vmovlpd %xmm0, {{[0-9]+}}(%esp)
155*9880d681SAndroid Build Coastguard Worker; AVX512_32: fildll
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerdefine double @s64_to_d_2(i64 %a) nounwind {
158*9880d681SAndroid Build Coastguard Worker  %b = add i64 %a, 5
159*9880d681SAndroid Build Coastguard Worker  %f = sitofp i64 %b to double
160*9880d681SAndroid Build Coastguard Worker  ret double %f
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u64_to_x
164*9880d681SAndroid Build Coastguard Worker; CHECK: fildll
165*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @u64_to_x(i64 %a) nounwind {
166*9880d681SAndroid Build Coastguard Worker  %r = uitofp i64 %a to x86_fp80
167*9880d681SAndroid Build Coastguard Worker  ret x86_fp80 %r
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s64_to_x
171*9880d681SAndroid Build Coastguard Worker; CHECK: fildll
172*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @s64_to_x(i64 %a) nounwind {
173*9880d681SAndroid Build Coastguard Worker  %r = sitofp i64 %a to x86_fp80
174*9880d681SAndroid Build Coastguard Worker  ret x86_fp80 %r
175*9880d681SAndroid Build Coastguard Worker}
176