Skip to content

Commit 1eb12e6

Browse files
committed
[X86] LowerFPToIntToFP: return SDValue() for unsigned fp -> int in SSE2
SSE2 cannot convert unsigned i32 to f32/f64, so return SDValue() in this case. Updated the corresponding X86 fp/int conversion test cases (fp-int-fp-cvt.ll, ftrunc.ll, isint.ll, setoeq.ll) to reflect this change.
1 parent b0a20ac commit 1eb12e6

File tree

5 files changed

+100
-36
lines changed

5 files changed

+100
-36
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19963,6 +19963,8 @@ static SDValue lowerFPToIntToFP(SDValue CastToFP, const SDLoc &DL,
1996319963
ToFPOpcode = IsUnsigned ? ISD::UINT_TO_FP : ISD::SINT_TO_FP;
1996419964
} else {
1996519965
// SSE2
19966+
if (IsUnsigned)
19967+
return SDValue();
1996619968
ToIntOpcode =
1996719969
SrcSize != IntSize ? X86ISD::CVTTP2SI : (unsigned)ISD::FP_TO_SINT;
1996819970
ToFPOpcode =

llvm/test/CodeGen/X86/fp-int-fp-cvt.ll

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,24 @@ define float @scvtf32_i64(float %a0) {
116116
define double @ucvtf64_i32(double %a0) {
117117
; SSE-LABEL: ucvtf64_i32:
118118
; SSE: # %bb.0:
119-
; SSE-NEXT: cvttpd2dq %xmm0, %xmm0
120-
; SSE-NEXT: cvtdq2pd %xmm0, %xmm0
119+
; SSE-NEXT: cvttsd2si %xmm0, %rax
120+
; SSE-NEXT: movl %eax, %eax
121+
; SSE-NEXT: xorps %xmm0, %xmm0
122+
; SSE-NEXT: cvtsi2sd %rax, %xmm0
121123
; SSE-NEXT: retq
122124
;
123-
; AVX-LABEL: ucvtf64_i32:
124-
; AVX: # %bb.0:
125-
; AVX-NEXT: vcvttpd2dq %xmm0, %xmm0
126-
; AVX-NEXT: vcvtdq2pd %xmm0, %xmm0
127-
; AVX-NEXT: retq
125+
; AVX2-LABEL: ucvtf64_i32:
126+
; AVX2: # %bb.0:
127+
; AVX2-NEXT: vcvttsd2si %xmm0, %rax
128+
; AVX2-NEXT: movl %eax, %eax
129+
; AVX2-NEXT: vcvtsi2sd %rax, %xmm15, %xmm0
130+
; AVX2-NEXT: retq
131+
;
132+
; AVX512-LABEL: ucvtf64_i32:
133+
; AVX512: # %bb.0:
134+
; AVX512-NEXT: vcvttsd2usi %xmm0, %eax
135+
; AVX512-NEXT: vcvtusi2sd %eax, %xmm15, %xmm0
136+
; AVX512-NEXT: retq
128137
%ii = fptoui double %a0 to i32
129138
%ff = uitofp i32 %ii to double
130139
ret double %ff
@@ -186,15 +195,24 @@ define double @ucvtf64_i64(double %a0) {
186195
define float @ucvtf32_i32(float %a0) {
187196
; SSE-LABEL: ucvtf32_i32:
188197
; SSE: # %bb.0:
189-
; SSE-NEXT: cvttps2dq %xmm0, %xmm0
190-
; SSE-NEXT: cvtdq2ps %xmm0, %xmm0
198+
; SSE-NEXT: cvttss2si %xmm0, %rax
199+
; SSE-NEXT: movl %eax, %eax
200+
; SSE-NEXT: xorps %xmm0, %xmm0
201+
; SSE-NEXT: cvtsi2ss %rax, %xmm0
191202
; SSE-NEXT: retq
192203
;
193-
; AVX-LABEL: ucvtf32_i32:
194-
; AVX: # %bb.0:
195-
; AVX-NEXT: vcvttps2dq %xmm0, %xmm0
196-
; AVX-NEXT: vcvtdq2ps %xmm0, %xmm0
197-
; AVX-NEXT: retq
204+
; AVX2-LABEL: ucvtf32_i32:
205+
; AVX2: # %bb.0:
206+
; AVX2-NEXT: vcvttss2si %xmm0, %rax
207+
; AVX2-NEXT: movl %eax, %eax
208+
; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm0
209+
; AVX2-NEXT: retq
210+
;
211+
; AVX512-LABEL: ucvtf32_i32:
212+
; AVX512: # %bb.0:
213+
; AVX512-NEXT: vcvttss2usi %xmm0, %eax
214+
; AVX512-NEXT: vcvtusi2ss %eax, %xmm15, %xmm0
215+
; AVX512-NEXT: retq
198216
%ii = fptoui float %a0 to i32
199217
%ff = uitofp i32 %ii to float
200218
ret float %ff
@@ -265,5 +283,3 @@ define float @ucvtf32_i64(float %a0) {
265283
%ff = uitofp i64 %ii to float
266284
ret float %ff
267285
}
268-
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
269-
; AVX512: {{.*}}

llvm/test/CodeGen/X86/ftrunc.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ declare i64 @llvm.fptosi.sat.i64.f64(double)
1010
define float @trunc_unsigned_f32(float %x) #0 {
1111
; SSE2-LABEL: trunc_unsigned_f32:
1212
; SSE2: # %bb.0:
13-
; SSE2-NEXT: cvttps2dq %xmm0, %xmm0
14-
; SSE2-NEXT: cvtdq2ps %xmm0, %xmm0
13+
; SSE2-NEXT: cvttss2si %xmm0, %rax
14+
; SSE2-NEXT: movl %eax, %eax
15+
; SSE2-NEXT: xorps %xmm0, %xmm0
16+
; SSE2-NEXT: cvtsi2ss %rax, %xmm0
1517
; SSE2-NEXT: retq
1618
;
1719
; SSE41-LABEL: trunc_unsigned_f32:

llvm/test/CodeGen/X86/isint.ll

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,9 @@ define i32 @isuint_return(double %d) nounwind {
207207
;
208208
; X86-LABEL: isuint_return:
209209
; X86: # %bb.0:
210-
; X86-NEXT: cvttpd2dq %xmm0, %xmm1
211-
; X86-NEXT: cvtdq2pd %xmm1, %xmm1
210+
; X86-NEXT: cvttsd2si %xmm0, %rax
211+
; X86-NEXT: movl %eax, %eax
212+
; X86-NEXT: cvtsi2sd %rax, %xmm1
212213
; X86-NEXT: cmpeqsd %xmm0, %xmm1
213214
; X86-NEXT: movq %xmm1, %rax
214215
; X86-NEXT: andl $1, %eax
@@ -218,17 +219,26 @@ define i32 @isuint_return(double %d) nounwind {
218219
; SSE2-LABEL: isuint_return:
219220
; SSE2: # %bb.0:
220221
; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
221-
; SSE2-NEXT: cvttpd2dq %xmm0, %xmm1
222-
; SSE2-NEXT: cvtdq2pd %xmm1, %xmm1
222+
; SSE2-NEXT: cvttsd2si %xmm0, %eax
223+
; SSE2-NEXT: movl %eax, %ecx
224+
; SSE2-NEXT: sarl $31, %ecx
225+
; SSE2-NEXT: movapd %xmm0, %xmm1
226+
; SSE2-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
227+
; SSE2-NEXT: cvttsd2si %xmm1, %edx
228+
; SSE2-NEXT: andl %ecx, %edx
229+
; SSE2-NEXT: orl %eax, %edx
230+
; SSE2-NEXT: movd %edx, %xmm1
231+
; SSE2-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
232+
; SSE2-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
223233
; SSE2-NEXT: cmpeqsd %xmm0, %xmm1
224234
; SSE2-NEXT: movd %xmm1, %eax
225235
; SSE2-NEXT: andl $1, %eax
226236
; SSE2-NEXT: retl
227237
;
228238
; AVX512VL-LABEL: isuint_return:
229239
; AVX512VL: # %bb.0:
230-
; AVX512VL-NEXT: vcvttpd2dq %xmm0, %xmm1
231-
; AVX512VL-NEXT: vcvtdq2pd %xmm1, %xmm1
240+
; AVX512VL-NEXT: vcvttsd2usi %xmm0, %eax
241+
; AVX512VL-NEXT: vcvtusi2sd %eax, %xmm15, %xmm1
232242
; AVX512VL-NEXT: vcmpeqsd %xmm1, %xmm0, %k0
233243
; AVX512VL-NEXT: kmovw %k0, %eax
234244
; AVX512VL-NEXT: retq

llvm/test/CodeGen/X86/setoeq.ll

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,17 @@ define zeroext i8 @oeq_f64_u32(double %x) nounwind readnone {
4747
; SSE-LABEL: oeq_f64_u32:
4848
; SSE: # %bb.0: # %entry
4949
; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
50-
; SSE-NEXT: cvttpd2dq %xmm0, %xmm1
51-
; SSE-NEXT: cvtdq2pd %xmm1, %xmm1
50+
; SSE-NEXT: cvttsd2si %xmm0, %eax
51+
; SSE-NEXT: movl %eax, %ecx
52+
; SSE-NEXT: sarl $31, %ecx
53+
; SSE-NEXT: movapd %xmm0, %xmm1
54+
; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
55+
; SSE-NEXT: cvttsd2si %xmm1, %edx
56+
; SSE-NEXT: andl %ecx, %edx
57+
; SSE-NEXT: orl %eax, %edx
58+
; SSE-NEXT: movd %edx, %xmm1
59+
; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
60+
; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
5261
; SSE-NEXT: cmpeqsd %xmm0, %xmm1
5362
; SSE-NEXT: movd %xmm1, %eax
5463
; SSE-NEXT: andl $1, %eax
@@ -58,8 +67,16 @@ define zeroext i8 @oeq_f64_u32(double %x) nounwind readnone {
5867
; AVX-LABEL: oeq_f64_u32:
5968
; AVX: # %bb.0: # %entry
6069
; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
61-
; AVX-NEXT: vcvttpd2dq %xmm0, %xmm1
62-
; AVX-NEXT: vcvtdq2pd %xmm1, %xmm1
70+
; AVX-NEXT: vcvttsd2si %xmm0, %eax
71+
; AVX-NEXT: movl %eax, %ecx
72+
; AVX-NEXT: sarl $31, %ecx
73+
; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1
74+
; AVX-NEXT: vcvttsd2si %xmm1, %edx
75+
; AVX-NEXT: andl %ecx, %edx
76+
; AVX-NEXT: orl %eax, %edx
77+
; AVX-NEXT: vmovd %edx, %xmm1
78+
; AVX-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
79+
; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
6380
; AVX-NEXT: vcmpeqsd %xmm0, %xmm1, %xmm0
6481
; AVX-NEXT: vmovd %xmm0, %eax
6582
; AVX-NEXT: andl $1, %eax
@@ -69,8 +86,8 @@ define zeroext i8 @oeq_f64_u32(double %x) nounwind readnone {
6986
; AVX512-LABEL: oeq_f64_u32:
7087
; AVX512: # %bb.0: # %entry
7188
; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
72-
; AVX512-NEXT: vcvttpd2dq %xmm0, %xmm1
73-
; AVX512-NEXT: vcvtdq2pd %xmm1, %xmm1
89+
; AVX512-NEXT: vcvttsd2usi %xmm0, %eax
90+
; AVX512-NEXT: vcvtusi2sd %eax, %xmm7, %xmm1
7491
; AVX512-NEXT: vcmpeqsd %xmm0, %xmm1, %k0
7592
; AVX512-NEXT: kmovd %k0, %eax
7693
; AVX512-NEXT: # kill: def $al killed $al killed $eax
@@ -294,8 +311,17 @@ define zeroext i8 @une_f64_u32(double %x) nounwind readnone {
294311
; SSE-LABEL: une_f64_u32:
295312
; SSE: # %bb.0: # %entry
296313
; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
297-
; SSE-NEXT: cvttpd2dq %xmm0, %xmm1
298-
; SSE-NEXT: cvtdq2pd %xmm1, %xmm1
314+
; SSE-NEXT: cvttsd2si %xmm0, %eax
315+
; SSE-NEXT: movl %eax, %ecx
316+
; SSE-NEXT: sarl $31, %ecx
317+
; SSE-NEXT: movapd %xmm0, %xmm1
318+
; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
319+
; SSE-NEXT: cvttsd2si %xmm1, %edx
320+
; SSE-NEXT: andl %ecx, %edx
321+
; SSE-NEXT: orl %eax, %edx
322+
; SSE-NEXT: movd %edx, %xmm1
323+
; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
324+
; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
299325
; SSE-NEXT: cmpneqsd %xmm0, %xmm1
300326
; SSE-NEXT: movd %xmm1, %eax
301327
; SSE-NEXT: andl $1, %eax
@@ -305,8 +331,16 @@ define zeroext i8 @une_f64_u32(double %x) nounwind readnone {
305331
; AVX-LABEL: une_f64_u32:
306332
; AVX: # %bb.0: # %entry
307333
; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
308-
; AVX-NEXT: vcvttpd2dq %xmm0, %xmm1
309-
; AVX-NEXT: vcvtdq2pd %xmm1, %xmm1
334+
; AVX-NEXT: vcvttsd2si %xmm0, %eax
335+
; AVX-NEXT: movl %eax, %ecx
336+
; AVX-NEXT: sarl $31, %ecx
337+
; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1
338+
; AVX-NEXT: vcvttsd2si %xmm1, %edx
339+
; AVX-NEXT: andl %ecx, %edx
340+
; AVX-NEXT: orl %eax, %edx
341+
; AVX-NEXT: vmovd %edx, %xmm1
342+
; AVX-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
343+
; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
310344
; AVX-NEXT: vcmpneqsd %xmm0, %xmm1, %xmm0
311345
; AVX-NEXT: vmovd %xmm0, %eax
312346
; AVX-NEXT: andl $1, %eax
@@ -316,8 +350,8 @@ define zeroext i8 @une_f64_u32(double %x) nounwind readnone {
316350
; AVX512-LABEL: une_f64_u32:
317351
; AVX512: # %bb.0: # %entry
318352
; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
319-
; AVX512-NEXT: vcvttpd2dq %xmm0, %xmm1
320-
; AVX512-NEXT: vcvtdq2pd %xmm1, %xmm1
353+
; AVX512-NEXT: vcvttsd2usi %xmm0, %eax
354+
; AVX512-NEXT: vcvtusi2sd %eax, %xmm7, %xmm1
321355
; AVX512-NEXT: vcmpneqsd %xmm0, %xmm1, %k0
322356
; AVX512-NEXT: kmovd %k0, %eax
323357
; AVX512-NEXT: # kill: def $al killed $al killed $eax

0 commit comments

Comments
 (0)