xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/scalar-fp-to-i64.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Check that scalar FP conversions to signed and unsigned int64 are using
2*9880d681SAndroid Build Coastguard Worker; reasonable sequences, across platforms and target switches.
3*9880d681SAndroid Build Coastguard Worker;
4*9880d681SAndroid Build Coastguard Worker; The signed case is straight forward, and the tests here basically
5*9880d681SAndroid Build Coastguard Worker; ensure successful compilation (f80 with avx512 was broken at one point).
6*9880d681SAndroid Build Coastguard Worker;
7*9880d681SAndroid Build Coastguard Worker; For the unsigned case there are many possible sequences, so to avoid
8*9880d681SAndroid Build Coastguard Worker; a fragile test we just check for the presence of a few key instructions.
9*9880d681SAndroid Build Coastguard Worker; AVX512 on Intel64 can use vcvtts[ds]2usi directly for float and double.
10*9880d681SAndroid Build Coastguard Worker; Otherwise the sequence will involve an FP subtract (fsub, subss or subsd),
11*9880d681SAndroid Build Coastguard Worker; and a truncating conversion (cvtts[ds]2si, fisttp, or fnstcw+fist).  When
12*9880d681SAndroid Build Coastguard Worker; both a subtract and fnstcw are needed, they can occur in either order.
13*9880d681SAndroid Build Coastguard Worker;
14*9880d681SAndroid Build Coastguard Worker; The interesting subtargets are AVX512F (vcvtts[ds]2usi), SSE3 (fisttp),
15*9880d681SAndroid Build Coastguard Worker; SSE2 (cvtts[ds]2si) and vanilla X87 (fnstcw+fist, 32-bit only).
16*9880d681SAndroid Build Coastguard Worker;
17*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-pc-windows-msvc     -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_32
18*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-linux-gnu   -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_32
19*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc   -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_64
20*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_64
21*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-pc-windows-msvc     -mattr=+sse3 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE3_32
22*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-linux-gnu   -mattr=+sse3 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE3_32
23*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc   -mattr=+sse3 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE3_64
24*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE3_64
25*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-pc-windows-msvc     -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_32
26*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-linux-gnu   -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_32
27*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc   -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_64
28*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_64
29*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-pc-windows-msvc     -mattr=-sse  | FileCheck %s --check-prefix=CHECK --check-prefix=X87
30*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-linux-gnu   -mattr=-sse  | FileCheck %s --check-prefix=CHECK --check-prefix=X87
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f_to_u64
33*9880d681SAndroid Build Coastguard Worker; X87-DAG: fsub
34*9880d681SAndroid Build Coastguard Worker; X87-DAG: fnstcw
35*9880d681SAndroid Build Coastguard Worker; X87: fist
36*9880d681SAndroid Build Coastguard Worker; SSE2_32-DAG: {{subss|fsub}}
37*9880d681SAndroid Build Coastguard Worker; SSE2_32-DAG: fnstcw
38*9880d681SAndroid Build Coastguard Worker; SSE2_32: fist
39*9880d681SAndroid Build Coastguard Worker; SSE2_64: subss
40*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvttss2si
41*9880d681SAndroid Build Coastguard Worker; SSE3_32: {{subss|fsub}}
42*9880d681SAndroid Build Coastguard Worker; SSE3_32: fistt
43*9880d681SAndroid Build Coastguard Worker; SSE3_64: subss
44*9880d681SAndroid Build Coastguard Worker; SSE3_64: cvttss2si
45*9880d681SAndroid Build Coastguard Worker; AVX512_32: {{subss|fsub}}
46*9880d681SAndroid Build Coastguard Worker; AVX512_32: fistt
47*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvttss2usi
48*9880d681SAndroid Build Coastguard Worker; CHECK: ret
49*9880d681SAndroid Build Coastguard Workerdefine i64 @f_to_u64(float %a) nounwind {
50*9880d681SAndroid Build Coastguard Worker  %r = fptoui float %a to i64
51*9880d681SAndroid Build Coastguard Worker  ret i64 %r
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f_to_s64
55*9880d681SAndroid Build Coastguard Worker; X87: fnstcw
56*9880d681SAndroid Build Coastguard Worker; X87: fist
57*9880d681SAndroid Build Coastguard Worker; SSE2_32: fnstcw
58*9880d681SAndroid Build Coastguard Worker; SSE2_32: fist
59*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvttss2si
60*9880d681SAndroid Build Coastguard Worker; SSE3_32: fistt
61*9880d681SAndroid Build Coastguard Worker; SSE3_64: cvttss2si
62*9880d681SAndroid Build Coastguard Worker; AVX512_32: fistt
63*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvttss2si
64*9880d681SAndroid Build Coastguard Worker; CHECK: ret
65*9880d681SAndroid Build Coastguard Workerdefine i64 @f_to_s64(float %a) nounwind {
66*9880d681SAndroid Build Coastguard Worker  %r = fptosi float %a to i64
67*9880d681SAndroid Build Coastguard Worker  ret i64 %r
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: d_to_u64
71*9880d681SAndroid Build Coastguard Worker; X87-DAG: fsub
72*9880d681SAndroid Build Coastguard Worker; X87-DAG: fnstcw
73*9880d681SAndroid Build Coastguard Worker; X87: fist
74*9880d681SAndroid Build Coastguard Worker; SSE2_32-DAG: {{subsd|fsub}}
75*9880d681SAndroid Build Coastguard Worker; SSE2_32-DAG: fnstcw
76*9880d681SAndroid Build Coastguard Worker; SSE2_32: fist
77*9880d681SAndroid Build Coastguard Worker; SSE2_64: subsd
78*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvttsd2si
79*9880d681SAndroid Build Coastguard Worker; SSE3_32: {{subsd|fsub}}
80*9880d681SAndroid Build Coastguard Worker; SSE3_32: fistt
81*9880d681SAndroid Build Coastguard Worker; SSE3_64: subsd
82*9880d681SAndroid Build Coastguard Worker; SSE3_64: cvttsd2si
83*9880d681SAndroid Build Coastguard Worker; AVX512_32: {{subsd|fsub}}
84*9880d681SAndroid Build Coastguard Worker; AVX512_32: fistt
85*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvttsd2usi
86*9880d681SAndroid Build Coastguard Worker; CHECK: ret
87*9880d681SAndroid Build Coastguard Workerdefine i64 @d_to_u64(double %a) nounwind {
88*9880d681SAndroid Build Coastguard Worker  %r = fptoui double %a to i64
89*9880d681SAndroid Build Coastguard Worker  ret i64 %r
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: d_to_s64
93*9880d681SAndroid Build Coastguard Worker; X87: fnstcw
94*9880d681SAndroid Build Coastguard Worker; X87: fist
95*9880d681SAndroid Build Coastguard Worker; SSE2_32: fnstcw
96*9880d681SAndroid Build Coastguard Worker; SSE2_32: fist
97*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvttsd2si
98*9880d681SAndroid Build Coastguard Worker; SSE3_32: fistt
99*9880d681SAndroid Build Coastguard Worker; SSE3_64: cvttsd2si
100*9880d681SAndroid Build Coastguard Worker; AVX512_32: fistt
101*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvttsd2si
102*9880d681SAndroid Build Coastguard Worker; CHECK: ret
103*9880d681SAndroid Build Coastguard Workerdefine i64 @d_to_s64(double %a) nounwind {
104*9880d681SAndroid Build Coastguard Worker  %r = fptosi double %a to i64
105*9880d681SAndroid Build Coastguard Worker  ret i64 %r
106*9880d681SAndroid Build Coastguard Worker}
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: x_to_u64
109*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fsub
110*9880d681SAndroid Build Coastguard Worker; X87-DAG: fnstcw
111*9880d681SAndroid Build Coastguard Worker; SSE2_32-DAG: fnstcw
112*9880d681SAndroid Build Coastguard Worker; SSE2_64-DAG: fnstcw
113*9880d681SAndroid Build Coastguard Worker; CHECK: fist
114*9880d681SAndroid Build Coastguard Worker; CHECK: ret
115*9880d681SAndroid Build Coastguard Workerdefine i64 @x_to_u64(x86_fp80 %a) nounwind {
116*9880d681SAndroid Build Coastguard Worker  %r = fptoui x86_fp80 %a to i64
117*9880d681SAndroid Build Coastguard Worker  ret i64 %r
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: x_to_s64
121*9880d681SAndroid Build Coastguard Worker; X87: fnstcw
122*9880d681SAndroid Build Coastguard Worker; X87: fist
123*9880d681SAndroid Build Coastguard Worker; SSE2_32: fnstcw
124*9880d681SAndroid Build Coastguard Worker; SSE2_32: fist
125*9880d681SAndroid Build Coastguard Worker; SSE2_64: fnstcw
126*9880d681SAndroid Build Coastguard Worker; SSE2_64: fist
127*9880d681SAndroid Build Coastguard Worker; SSE3_32: fistt
128*9880d681SAndroid Build Coastguard Worker; SSE3_64: fistt
129*9880d681SAndroid Build Coastguard Worker; AVX512_32: fistt
130*9880d681SAndroid Build Coastguard Worker; AVX512_64: fistt
131*9880d681SAndroid Build Coastguard Worker; CHECK: ret
132*9880d681SAndroid Build Coastguard Workerdefine i64 @x_to_s64(x86_fp80 %a) nounwind {
133*9880d681SAndroid Build Coastguard Worker  %r = fptosi x86_fp80 %a to i64
134*9880d681SAndroid Build Coastguard Worker  ret i64 %r
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t_to_u64
138*9880d681SAndroid Build Coastguard Worker; CHECK: __fixunstfdi
139*9880d681SAndroid Build Coastguard Worker; CHECK: ret
140*9880d681SAndroid Build Coastguard Workerdefine i64 @t_to_u64(fp128 %a) nounwind {
141*9880d681SAndroid Build Coastguard Worker  %r = fptoui fp128 %a to i64
142*9880d681SAndroid Build Coastguard Worker  ret i64 %r
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t_to_s64
146*9880d681SAndroid Build Coastguard Worker; CHECK: __fixtfdi
147*9880d681SAndroid Build Coastguard Worker; CHECK: ret
148*9880d681SAndroid Build Coastguard Workerdefine i64 @t_to_s64(fp128 %a) nounwind {
149*9880d681SAndroid Build Coastguard Worker  %r = fptosi fp128 %a to i64
150*9880d681SAndroid Build Coastguard Worker  ret i64 %r
151*9880d681SAndroid Build Coastguard Worker}
152