diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 129e0c10a04..d018e01d58c 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -39073,7 +39073,8 @@ static SDValue combineSIntToFP(SDNode *N, SelectionDAG &DAG, // Transform (SINT_TO_FP (i64 ...)) into an x87 operation if we have // a 32-bit target where SSE doesn't support i64->FP operations. - if (!Subtarget.useSoftFloat() && Op0.getOpcode() == ISD::LOAD) { + if (!Subtarget.useSoftFloat() && Subtarget.hasX87() && + Op0.getOpcode() == ISD::LOAD) { LoadSDNode *Ld = cast(Op0.getNode()); EVT LdVT = Ld->getValueType(0); diff --git a/test/CodeGen/X86/pr38819.ll b/test/CodeGen/X86/pr38819.ll new file mode 100644 index 00000000000..11d16250378 --- /dev/null +++ b/test/CodeGen/X86/pr38819.ll @@ -0,0 +1,26 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse,-sse2,-x87 | FileCheck %s + +define void @foo(i64 %x, float* %b) { +; CHECK-LABEL: foo: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: pushl %esi +; CHECK-NEXT: .cfi_def_cfa_offset 8 +; CHECK-NEXT: .cfi_offset %esi, -8 +; CHECK-NEXT: movl {{[0-9]+}}(%esp), %esi +; CHECK-NEXT: pushl {{[0-9]+}}(%esp) +; CHECK-NEXT: .cfi_adjust_cfa_offset 4 +; CHECK-NEXT: pushl {{[0-9]+}}(%esp) +; CHECK-NEXT: .cfi_adjust_cfa_offset 4 +; CHECK-NEXT: calll __floatdisf +; CHECK-NEXT: addl $8, %esp +; CHECK-NEXT: .cfi_adjust_cfa_offset -8 +; CHECK-NEXT: movl %eax, (%esi) +; CHECK-NEXT: popl %esi +; CHECK-NEXT: .cfi_def_cfa_offset 4 +; CHECK-NEXT: retl +entry: + %conv = sitofp i64 %x to float + store float %conv, float* %b + ret void +}