Index: llvm/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/lib/Target/X86/X86ISelLowering.cpp +++ llvm/lib/Target/X86/X86ISelLowering.cpp @@ -21368,6 +21368,10 @@ if (VT == MVT::f128 || !Subtarget.hasX87()) return SDValue(); + // On Windows, the default precision control on x87 is only 56-bit. + if (SrcVT == MVT::i64 && UseSSEReg && Subtarget.isOSWindows()) + return SDValue(); + SDValue ValueToStore = Src; if (SrcVT == MVT::i64 && Subtarget.hasSSE2() && !Subtarget.is64Bit()) // Bitcasting to f64 here allows us to do a single 64-bit store from @@ -21824,7 +21828,9 @@ if (SDValue Extract = vectorizeExtractedCast(Op, DAG, Subtarget)) return Extract; - if (Subtarget.hasAVX512() && isScalarFPTypeInSSEReg(DstVT) && + bool UseSSEReg = isScalarFPTypeInSSEReg(DstVT); + + if (Subtarget.hasAVX512() && UseSSEReg && (SrcVT == MVT::i32 || (SrcVT == MVT::i64 && Subtarget.is64Bit()))) { // Conversions from unsigned i32 to f32/f64 are legal, // using VCVTUSI2SS/SD. Same for i64 in 64-bit mode. @@ -21859,6 +21865,9 @@ (DstVT == MVT::f32 || DstVT == MVT::f64)) return SDValue(); + if (!Subtarget.hasX87()) + return SDValue(); + // Make a 64-bit buffer, and use it to build an FILD. SDValue StackSlot = DAG.CreateStackTemporary(MVT::i64, 8); int SSFI = cast(StackSlot)->getIndex(); @@ -21880,6 +21889,11 @@ } assert(SrcVT == MVT::i64 && "Unexpected type in UINT_TO_FP"); + + // On Windows, the default precision control on x87 is only 56-bit. + if (UseSSEReg && Subtarget.isOSWindows()) + return SDValue(); + SDValue ValueToStore = Src; if (isScalarFPTypeInSSEReg(Op.getValueType()) && !Subtarget.is64Bit()) { // Bitcasting to f64 here allows us to do a single 64-bit store from