@@ -2024,13 +2024,14 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
20242024 setOperationAction(ISD::FSHL, MVT::v16i32, Custom);
20252025 setOperationAction(ISD::FSHR, MVT::v16i32, Custom);
20262026
2027- if (Subtarget.hasDQI()) {
2027+ if (Subtarget.hasDQI() || Subtarget.hasFP16())
20282028 for (auto Opc : {ISD::SINT_TO_FP, ISD::UINT_TO_FP, ISD::STRICT_SINT_TO_FP,
20292029 ISD::STRICT_UINT_TO_FP, ISD::FP_TO_SINT, ISD::FP_TO_UINT,
20302030 ISD::STRICT_FP_TO_SINT, ISD::STRICT_FP_TO_UINT})
20312031 setOperationAction(Opc, MVT::v8i64, Custom);
2032+
2033+ if (Subtarget.hasDQI())
20322034 setOperationAction(ISD::MUL, MVT::v8i64, Legal);
2033- }
20342035
20352036 if (Subtarget.hasCDI()) {
20362037 // NonVLX sub-targets extend 128/256 vectors to use the 512 version.
@@ -19860,7 +19861,7 @@ static SDValue promoteXINT_TO_FP(SDValue Op, const SDLoc &dl,
1986019861 DAG.getNode(Op.getOpcode(), dl, NVT, Src), Rnd);
1986119862}
1986219863
19863- static bool isLegalConversion(MVT VT, bool IsSigned,
19864+ static bool isLegalConversion(MVT VT, MVT FloatVT, bool IsSigned,
1986419865 const X86Subtarget &Subtarget) {
1986519866 if (VT == MVT::v4i32 && Subtarget.hasSSE2() && IsSigned)
1986619867 return true;
@@ -19871,6 +19872,8 @@ static bool isLegalConversion(MVT VT, bool IsSigned,
1987119872 if (Subtarget.useAVX512Regs()) {
1987219873 if (VT == MVT::v16i32)
1987319874 return true;
19875+ if (VT == MVT::v8i64 && FloatVT == MVT::v8f16 && Subtarget.hasFP16())
19876+ return true;
1987419877 if (VT == MVT::v8i64 && Subtarget.hasDQI())
1987519878 return true;
1987619879 }
@@ -19892,7 +19895,7 @@ SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op,
1989219895
1989319896 if (isSoftF16(VT, Subtarget))
1989419897 return promoteXINT_TO_FP(Op, dl, DAG);
19895- else if (isLegalConversion(SrcVT, true, Subtarget))
19898+ else if (isLegalConversion(SrcVT, VT, true, Subtarget))
1989619899 return Op;
1989719900
1989819901 if (Subtarget.isTargetWin64() && SrcVT == MVT::i128)
@@ -20396,7 +20399,7 @@ SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,
2039620399
2039720400 if (isSoftF16(DstVT, Subtarget))
2039820401 return promoteXINT_TO_FP(Op, dl, DAG);
20399- else if (isLegalConversion(SrcVT, false, Subtarget))
20402+ else if (isLegalConversion(SrcVT, DstVT, false, Subtarget))
2040020403 return Op;
2040120404
2040220405 if (DstVT.isVector())
@@ -21419,7 +21422,8 @@ SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
2141921422 {NVT, MVT::Other}, {Chain, Src})});
2142021423 return DAG.getNode(Op.getOpcode(), dl, VT,
2142121424 DAG.getNode(ISD::FP_EXTEND, dl, NVT, Src));
21422- } else if (isTypeLegal(SrcVT) && isLegalConversion(VT, IsSigned, Subtarget)) {
21425+ } else if (isTypeLegal(SrcVT) &&
21426+ isLegalConversion(VT, SrcVT, IsSigned, Subtarget)) {
2142321427 return Op;
2142421428 }
2142521429
0 commit comments