@@ -2024,13 +2024,14 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
2024
2024
setOperationAction(ISD::FSHL, MVT::v16i32, Custom);
2025
2025
setOperationAction(ISD::FSHR, MVT::v16i32, Custom);
2026
2026
2027
- if (Subtarget.hasDQI()) {
2027
+ if (Subtarget.hasDQI() || Subtarget.hasFP16())
2028
2028
for (auto Opc : {ISD::SINT_TO_FP, ISD::UINT_TO_FP, ISD::STRICT_SINT_TO_FP,
2029
2029
ISD::STRICT_UINT_TO_FP, ISD::FP_TO_SINT, ISD::FP_TO_UINT,
2030
2030
ISD::STRICT_FP_TO_SINT, ISD::STRICT_FP_TO_UINT})
2031
2031
setOperationAction(Opc, MVT::v8i64, Custom);
2032
+
2033
+ if (Subtarget.hasDQI())
2032
2034
setOperationAction(ISD::MUL, MVT::v8i64, Legal);
2033
- }
2034
2035
2035
2036
if (Subtarget.hasCDI()) {
2036
2037
// NonVLX sub-targets extend 128/256 vectors to use the 512 version.
@@ -19850,7 +19851,7 @@ static SDValue promoteXINT_TO_FP(SDValue Op, const SDLoc &dl,
19850
19851
DAG.getNode(Op.getOpcode(), dl, NVT, Src), Rnd);
19851
19852
}
19852
19853
19853
- static bool isLegalConversion(MVT VT, bool IsSigned,
19854
+ static bool isLegalConversion(MVT VT, MVT FloatVT, bool IsSigned,
19854
19855
const X86Subtarget &Subtarget) {
19855
19856
if (VT == MVT::v4i32 && Subtarget.hasSSE2() && IsSigned)
19856
19857
return true;
@@ -19861,6 +19862,8 @@ static bool isLegalConversion(MVT VT, bool IsSigned,
19861
19862
if (Subtarget.useAVX512Regs()) {
19862
19863
if (VT == MVT::v16i32)
19863
19864
return true;
19865
+ if (VT == MVT::v8i64 && FloatVT == MVT::v8f16 && Subtarget.hasFP16())
19866
+ return true;
19864
19867
if (VT == MVT::v8i64 && Subtarget.hasDQI())
19865
19868
return true;
19866
19869
}
@@ -19882,7 +19885,7 @@ SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op,
19882
19885
19883
19886
if (isSoftF16(VT, Subtarget))
19884
19887
return promoteXINT_TO_FP(Op, dl, DAG);
19885
- else if (isLegalConversion(SrcVT, true, Subtarget))
19888
+ else if (isLegalConversion(SrcVT, VT, true, Subtarget))
19886
19889
return Op;
19887
19890
19888
19891
if (Subtarget.isTargetWin64() && SrcVT == MVT::i128)
@@ -20386,7 +20389,7 @@ SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,
20386
20389
20387
20390
if (isSoftF16(DstVT, Subtarget))
20388
20391
return promoteXINT_TO_FP(Op, dl, DAG);
20389
- else if (isLegalConversion(SrcVT, false, Subtarget))
20392
+ else if (isLegalConversion(SrcVT, DstVT, false, Subtarget))
20390
20393
return Op;
20391
20394
20392
20395
if (DstVT.isVector())
@@ -21409,7 +21412,8 @@ SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
21409
21412
{NVT, MVT::Other}, {Chain, Src})});
21410
21413
return DAG.getNode(Op.getOpcode(), dl, VT,
21411
21414
DAG.getNode(ISD::FP_EXTEND, dl, NVT, Src));
21412
- } else if (isTypeLegal(SrcVT) && isLegalConversion(VT, IsSigned, Subtarget)) {
21415
+ } else if (isTypeLegal(SrcVT) &&
21416
+ isLegalConversion(VT, SrcVT, IsSigned, Subtarget)) {
21413
21417
return Op;
21414
21418
}
21415
21419
0 commit comments