Skip to content

Commit be8f217

Browse files
committed
[X86] Don't call LowerUINT_TO_FP_i32 for i32->f80 on 32-bit targets with sse2.
We were performing an emulated i32->f64 in the SSE registers, then storing that value to memory and doing a extload into the X87 domain. After this patch we'll now just store the i32 to memory along with an i32 0. Then do a 64-bit FILD to f80 completely in the X87 unit. This matches what we do without SSE.
1 parent 1b264a8 commit be8f217

File tree

2 files changed

+14
-46
lines changed

2 files changed

+14
-46
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19331,7 +19331,7 @@ SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,
1933119331

1933219332
if (SrcVT == MVT::i64 && DstVT == MVT::f64 && X86ScalarSSEf64)
1933319333
return LowerUINT_TO_FP_i64(Op, DAG, Subtarget);
19334-
if (SrcVT == MVT::i32 && X86ScalarSSEf64)
19334+
if (SrcVT == MVT::i32 && X86ScalarSSEf64 && DstVT != MVT::f80)
1933519335
return LowerUINT_TO_FP_i32(Op, DAG, Subtarget);
1933619336
if (Subtarget.is64Bit() && SrcVT == MVT::i64 && DstVT == MVT::f32)
1933719337
return SDValue();

llvm/test/CodeGen/X86/scalar-int-to-fp.ll

Lines changed: 13 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -214,58 +214,26 @@ define double @s32_to_d(i32 %a) nounwind {
214214
}
215215

216216
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
217+
; CHECK32-LABEL: u32_to_x:
218+
; CHECK32: # %bb.0:
219+
; CHECK32-NEXT: pushl %ebp
220+
; CHECK32-NEXT: movl %esp, %ebp
221+
; CHECK32-NEXT: andl $-8, %esp
222+
; CHECK32-NEXT: subl $8, %esp
223+
; CHECK32-NEXT: movl 8(%ebp), %eax
224+
; CHECK32-NEXT: movl %eax, (%esp)
225+
; CHECK32-NEXT: movl $0, {{[0-9]+}}(%esp)
226+
; CHECK32-NEXT: fildll (%esp)
227+
; CHECK32-NEXT: movl %ebp, %esp
228+
; CHECK32-NEXT: popl %ebp
229+
; CHECK32-NEXT: retl
232230
;
233231
; CHECK64-LABEL: u32_to_x:
234232
; CHECK64: # %bb.0:
235233
; CHECK64-NEXT: movl %edi, %eax
236234
; CHECK64-NEXT: movq %rax, -{{[0-9]+}}(%rsp)
237235
; CHECK64-NEXT: fildll -{{[0-9]+}}(%rsp)
238236
; CHECK64-NEXT: retq
239-
;
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
255-
;
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
269237
%r = uitofp i32 %a to x86_fp80
270238
ret x86_fp80 %r
271239
}

0 commit comments

Comments
 (0)