diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -528,6 +528,14 @@ Instruction BaseInstr = !cast(PseudoToVInst.VInst); // SEW = 0 is used to denote that the Pseudo is not SEW specific (or unknown). bits<8> SEW = 0; + // TargetOverlapConstraintType indicates that these instructions can + // overlap between source operands and destination operands. + // 1 -> default value, remain current constraint + // 2 -> narrow case + // 3 -> widen case + // TODO: Add TargetOverlapConstraintType into PseudosTable for further + // query. + bits<2> TargetOverlapConstraintType = 1; } // The actual table. @@ -855,7 +863,7 @@ } class VPseudoILoadNoMask LMUL, - bit Ordered, bit EarlyClobber>: + bit Ordered, bit EarlyClobber, int TargetConstraintType = 1>: Pseudo<(outs RetClass:$rd), (ins RetClass:$dest, GPRMem:$rs1, IdxClass:$rs2, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy),[]>, @@ -868,10 +876,11 @@ let HasSEWOp = 1; let HasVecPolicyOp = 1; let Constraints = !if(!eq(EarlyClobber, 1), "@earlyclobber $rd, $rd = $dest", "$rd = $dest"); + let TargetOverlapConstraintType = TargetConstraintType; } class VPseudoILoadMask LMUL, - bit Ordered, bit EarlyClobber>: + bit Ordered, bit EarlyClobber, int TargetConstraintType = 1>: Pseudo<(outs GetVRegNoV0.R:$rd), (ins GetVRegNoV0.R:$merge, GPRMem:$rs1, IdxClass:$rs2, @@ -882,6 +891,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !if(!eq(EarlyClobber, 1), "@earlyclobber $rd, $rd = $merge", "$rd = $merge"); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -979,7 +989,7 @@ } class VPseudoUnaryNoMask : + string Constraint = "", int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins RetClass:$merge, OpClass:$rs2, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy), []>, @@ -988,13 +998,14 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $merge"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; } class VPseudoUnaryNoMaskRoundingMode : + string Constraint = "", int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins RetClass:$merge, OpClass:$rs2, ixlenimm:$rm, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy), []>, @@ -1003,6 +1014,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $merge"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -1010,7 +1022,7 @@ let UsesVXRM = 0; } -class VPseudoUnaryMask : +class VPseudoUnaryMask : Pseudo<(outs GetVRegNoV0.R:$rd), (ins GetVRegNoV0.R:$merge, OpClass:$rs2, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy), []>, @@ -1019,6 +1031,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $merge"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -1129,7 +1142,8 @@ class VPseudoBinaryNoMask : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins Op1Class:$rs2, Op2Class:$rs1, AVL:$vl, ixlenimm:$sew), []>, RISCVVPseudo { @@ -1137,6 +1151,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = Constraint; + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; } @@ -1144,7 +1159,8 @@ class VPseudoBinaryNoMaskTU : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins RetClass:$merge, Op1Class:$rs2, Op2Class:$rs1, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy), []>, @@ -1153,6 +1169,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $merge"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -1162,7 +1179,8 @@ VReg Op1Class, DAGOperand Op2Class, string Constraint, - int UsesVXRM_ = 1> : + int UsesVXRM_ = 1, + int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins RetClass:$merge, Op1Class:$rs2, Op2Class:$rs1, ixlenimm:$rm, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy), []>, @@ -1170,6 +1188,7 @@ let mayLoad = 0; let mayStore = 0; let Constraints = !interleave([Constraint, "$rd = $merge"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -1181,7 +1200,8 @@ RegisterClass Op1Class, DAGOperand Op2Class, string Constraint, - int UsesVXRM_> : + int UsesVXRM_, + int TargetConstraintType = 1> : Pseudo<(outs GetVRegNoV0.R:$rd), (ins GetVRegNoV0.R:$merge, Op1Class:$rs2, Op2Class:$rs1, @@ -1191,6 +1211,7 @@ let mayLoad = 0; let mayStore = 0; let Constraints = !interleave([Constraint, "$rd = $merge"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -1204,7 +1225,8 @@ // This allows maskedoff and rs2 to be the same register. class VPseudoTiedBinaryNoMask : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins RetClass:$rs2, Op2Class:$rs1, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy), []>, @@ -1213,6 +1235,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $rs2"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -1222,7 +1245,8 @@ class VPseudoTiedBinaryNoMaskRoundingMode : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins RetClass:$rs2, Op2Class:$rs1, ixlenimm:$rm, @@ -1233,6 +1257,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $rs2"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -1288,7 +1313,8 @@ class VPseudoBinaryMaskPolicy : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs GetVRegNoV0.R:$rd), (ins GetVRegNoV0.R:$merge, Op1Class:$rs2, Op2Class:$rs1, @@ -1298,6 +1324,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $merge"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -1348,7 +1375,8 @@ class VPseudoBinaryMOutNoMask : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins Op1Class:$rs2, Op2Class:$rs1, AVL:$vl, ixlenimm:$sew), []>, RISCVVPseudo { @@ -1356,6 +1384,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = Constraint; + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; } @@ -1364,7 +1393,8 @@ class VPseudoBinaryMOutMask : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins RetClass:$merge, Op1Class:$rs2, Op2Class:$rs1, @@ -1374,6 +1404,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $merge"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let UsesMaskPolicy = 1; @@ -1384,7 +1415,8 @@ // This allows maskedoff and rs2 to be the same register. class VPseudoTiedBinaryMask : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs GetVRegNoV0.R:$rd), (ins GetVRegNoV0.R:$merge, Op2Class:$rs1, @@ -1394,6 +1426,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $merge"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -1403,7 +1436,8 @@ class VPseudoTiedBinaryMaskRoundingMode : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs GetVRegNoV0.R:$rd), (ins GetVRegNoV0.R:$merge, Op2Class:$rs1, @@ -1415,6 +1449,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $merge"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let HasVecPolicyOp = 1; @@ -1429,7 +1464,8 @@ DAGOperand Op2Class, LMULInfo MInfo, bit CarryIn, - string Constraint> : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), !if(CarryIn, (ins Op1Class:$rs2, Op2Class:$rs1, VMV0:$carry, AVL:$vl, @@ -1440,6 +1476,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = Constraint; + let TargetOverlapConstraintType = TargetConstraintType; let HasVLOp = 1; let HasSEWOp = 1; let VLMul = MInfo.value; @@ -1487,7 +1524,8 @@ class VPseudoTernaryNoMaskWithPolicy : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins RetClass:$rs3, Op1Class:$rs1, Op2Class:$rs2, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy), @@ -1497,6 +1535,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $rs3"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVecPolicyOp = 1; let HasVLOp = 1; let HasSEWOp = 1; @@ -1505,7 +1544,8 @@ class VPseudoTernaryNoMaskWithPolicyRoundingMode : + string Constraint, + int TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), (ins RetClass:$rs3, Op1Class:$rs1, Op2Class:$rs2, ixlenimm:$rm, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy), @@ -1515,6 +1555,7 @@ let mayStore = 0; let hasSideEffects = 0; let Constraints = !interleave([Constraint, "$rd = $rs3"], ","); + let TargetOverlapConstraintType = TargetConstraintType; let HasVecPolicyOp = 1; let HasVLOp = 1; let HasSEWOp = 1; @@ -1796,7 +1837,7 @@ } } -multiclass VPseudoILoad { +multiclass VPseudoILoad { foreach idxEEW = EEWList in { foreach dataEEW = EEWList in { foreach dataEMUL = MxSet.m in { @@ -1811,12 +1852,14 @@ defvar Vreg = dataEMUL.vrclass; defvar IdxVreg = idxEMUL.vrclass; defvar HasConstraint = !ne(dataEEW, idxEEW); + defvar NewTypeConstraints = !if(!or(!eq(dataEMULOctuple, dataEMUL.octuple), !eq(IdxLInfo, "MF2")), 1, !if(!ge(dataEMULOctuple, dataEMUL.octuple), 2, 3)); + defvar UseNewTypeConstraints = !if(!eq(TargetConstraintType, 1), 1, NewTypeConstraints); let VLMul = dataEMUL.value in { def "EI" # idxEEW # "_V_" # IdxLInfo # "_" # DataLInfo : - VPseudoILoadNoMask, + VPseudoILoadNoMask, VLXSched; def "EI" # idxEEW # "_V_" # IdxLInfo # "_" # DataLInfo # "_MASK" : - VPseudoILoadMask, + VPseudoILoadMask, RISCVMaskedPseudo, VLXSched; } @@ -1994,13 +2037,14 @@ DAGOperand Op2Class, LMULInfo MInfo, string Constraint = "", - int sew = 0> { + int sew = 0, + int TargetConstraintType = 1> { let VLMul = MInfo.value, SEW=sew in { defvar suffix = !if(sew, "_" # MInfo.MX # "_E" # sew, "_" # MInfo.MX); def suffix : VPseudoBinaryNoMaskTU; + Constraint, TargetConstraintType>; def suffix # "_MASK" : VPseudoBinaryMaskPolicy, + Constraint, TargetConstraintType>, RISCVMaskedPseudo; } } @@ -2024,16 +2068,19 @@ LMULInfo MInfo, string Constraint = "", int sew = 0, - int UsesVXRM = 1> { + int UsesVXRM = 1, + int TargetConstraintType = 1> { let VLMul = MInfo.value, SEW=sew in { defvar suffix = !if(sew, "_" # MInfo.MX # "_E" # sew, "_" # MInfo.MX); def suffix : VPseudoBinaryNoMaskRoundingMode; + Constraint, UsesVXRM, + TargetConstraintType>; def suffix # "_MASK" : VPseudoBinaryMaskPolicyRoundingMode, + UsesVXRM, + TargetConstraintType>, RISCVMaskedPseudo; } } @@ -2043,13 +2090,14 @@ VReg Op1Class, DAGOperand Op2Class, LMULInfo MInfo, - string Constraint = ""> { + string Constraint = "", + int TargetConstraintType = 1> { let VLMul = MInfo.value in { def "_" # MInfo.MX : VPseudoBinaryMOutNoMask; + Constraint, TargetConstraintType>; let ForceTailAgnostic = true in def "_" # MInfo.MX # "_MASK" : VPseudoBinaryMOutMask, + Op2Class, Constraint, TargetConstraintType>, RISCVMaskedPseudo; } } @@ -2074,24 +2122,26 @@ multiclass VPseudoTiedBinary { + string Constraint = "", + int TargetConstraintType = 1> { let VLMul = MInfo.value in { def "_" # MInfo.MX # "_TIED": VPseudoTiedBinaryNoMask; + Constraint, TargetConstraintType>; def "_" # MInfo.MX # "_MASK_TIED" : VPseudoTiedBinaryMask; + Constraint, TargetConstraintType>; } } multiclass VPseudoTiedBinaryRoundingMode { + string Constraint = "", + int TargetConstraintType = 1> { let VLMul = MInfo.value in { def "_" # MInfo.MX # "_TIED": - VPseudoTiedBinaryNoMaskRoundingMode; + VPseudoTiedBinaryNoMaskRoundingMode; def "_" # MInfo.MX # "_MASK_TIED" : - VPseudoTiedBinaryMaskRoundingMode; + VPseudoTiedBinaryMaskRoundingMode; } } @@ -2203,22 +2253,23 @@ // destination register group is legal. Otherwise, it is illegal. multiclass VPseudoBinaryW_VV { defm _VV : VPseudoBinary; + "@earlyclobber $rd", TargetConstraintType=3>; } multiclass VPseudoBinaryW_VV_RM { defm _VV : VPseudoBinaryRoundingMode; + "@earlyclobber $rd", UsesVXRM=0, + TargetConstraintType=3>; } multiclass VPseudoBinaryW_VX { defm "_VX" : VPseudoBinary; + "@earlyclobber $rd", TargetConstraintType=3>; } multiclass VPseudoBinaryW_VI { defm "_VI" : VPseudoBinary; + "@earlyclobber $rd", TargetConstraintType=3>; } multiclass VPseudoBinaryW_VF { @@ -2231,36 +2282,40 @@ defm "_V" # f.FX : VPseudoBinaryRoundingMode; + UsesVXRM=0, + TargetConstraintType=3>; } multiclass VPseudoBinaryW_WV { defm _WV : VPseudoBinary; + "@earlyclobber $rd", TargetConstraintType=3>; defm _WV : VPseudoTiedBinary; + "@earlyclobber $rd", TargetConstraintType=3>; } multiclass VPseudoBinaryW_WV_RM { defm _WV : VPseudoBinaryRoundingMode; + "@earlyclobber $rd", UsesVXRM=0, TargetConstraintType=3>; defm _WV : VPseudoTiedBinaryRoundingMode; + "@earlyclobber $rd", TargetConstraintType=3>; } multiclass VPseudoBinaryW_WX { - defm "_WX" : VPseudoBinary; + defm "_WX" : VPseudoBinary; } -multiclass VPseudoBinaryW_WF { +multiclass VPseudoBinaryW_WF { defm "_W" # f.FX : VPseudoBinary; + f.fprclass, m, /*Constraint*/ "", TargetConstraintType=TargetConstraintType>; } multiclass VPseudoBinaryW_WF_RM { defm "_W" # f.FX : VPseudoBinaryRoundingMode; + Constraint="", + sew=0, + UsesVXRM=0, + TargetConstraintType=3>; } // Narrowing instructions like vnsrl/vnsra/vnclip(u) don't need @earlyclobber @@ -2268,9 +2323,9 @@ // exception from the spec. // "The destination EEW is smaller than the source EEW and the overlap is in the // lowest-numbered part of the source register group." -multiclass VPseudoBinaryV_WV { +multiclass VPseudoBinaryV_WV { defm _WV : VPseudoBinary; + !if(!ge(m.octuple, 8), "@earlyclobber $rd", ""), TargetConstraintType=TargetConstraintType>; } multiclass VPseudoBinaryV_WV_RM { @@ -2279,9 +2334,9 @@ "@earlyclobber $rd", "")>; } -multiclass VPseudoBinaryV_WX { +multiclass VPseudoBinaryV_WX { defm _WX : VPseudoBinary; + !if(!ge(m.octuple, 8), "@earlyclobber $rd", ""), TargetConstraintType=TargetConstraintType>; } multiclass VPseudoBinaryV_WX_RM { @@ -2290,9 +2345,9 @@ "@earlyclobber $rd", "")>; } -multiclass VPseudoBinaryV_WI { +multiclass VPseudoBinaryV_WI { defm _WI : VPseudoBinary; + !if(!ge(m.octuple, 8), "@earlyclobber $rd", ""), TargetConstraintType=TargetConstraintType>; } multiclass VPseudoBinaryV_WI_RM { @@ -2305,12 +2360,12 @@ // vector register is v0. // For vadc and vsbc, CarryIn == 1 and CarryOut == 0 multiclass VPseudoBinaryV_VM { + string Constraint = "", int TargetConstraintType = 1> { def "_VV" # !if(CarryIn, "M", "") # "_" # m.MX : VPseudoBinaryCarryIn.R, m.vrclass)), - m.vrclass, m.vrclass, m, CarryIn, Constraint>; + m.vrclass, m.vrclass, m, CarryIn, Constraint, TargetConstraintType>; } multiclass VPseudoTiedBinaryV_VM { @@ -2320,12 +2375,12 @@ } multiclass VPseudoBinaryV_XM { + string Constraint = "", int TargetConstraintType = 1> { def "_VX" # !if(CarryIn, "M", "") # "_" # m.MX : VPseudoBinaryCarryIn.R, m.vrclass)), - m.vrclass, GPR, m, CarryIn, Constraint>; + m.vrclass, GPR, m, CarryIn, Constraint, TargetConstraintType>; } multiclass VPseudoTiedBinaryV_XM { @@ -2349,12 +2404,12 @@ } multiclass VPseudoBinaryV_IM { + string Constraint = "", int TargetConstraintType = 1> { def "_VI" # !if(CarryIn, "M", "") # "_" # m.MX : VPseudoBinaryCarryIn.R, m.vrclass)), - m.vrclass, simm5, m, CarryIn, Constraint>; + m.vrclass, simm5, m, CarryIn, Constraint, TargetConstraintType>; } multiclass VPseudoTiedBinaryV_IM { @@ -2462,45 +2517,45 @@ } } -multiclass PseudoVEXT_VF2 { +multiclass PseudoVEXT_VF2 { defvar constraints = "@earlyclobber $rd"; foreach m = MxListVF2 in { defvar mx = m.MX; let VLMul = m.value in { - def "_" # mx : VPseudoUnaryNoMask, + def "_" # mx : VPseudoUnaryNoMask, SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; def "_" # mx # "_MASK" : - VPseudoUnaryMask, + VPseudoUnaryMask, RISCVMaskedPseudo, SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; } } } -multiclass PseudoVEXT_VF4 { +multiclass PseudoVEXT_VF4 { defvar constraints = "@earlyclobber $rd"; foreach m = MxListVF4 in { defvar mx = m.MX; let VLMul = m.value in { - def "_" # mx : VPseudoUnaryNoMask, + def "_" # mx : VPseudoUnaryNoMask, SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; def "_" # mx # "_MASK" : - VPseudoUnaryMask, + VPseudoUnaryMask, RISCVMaskedPseudo, SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; } } } -multiclass PseudoVEXT_VF8 { +multiclass PseudoVEXT_VF8 { defvar constraints = "@earlyclobber $rd"; foreach m = MxListVF8 in { defvar mx = m.MX; let VLMul = m.value in { - def "_" # mx : VPseudoUnaryNoMask, + def "_" # mx : VPseudoUnaryNoMask, SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; def "_" # mx # "_MASK" : - VPseudoUnaryMask, + VPseudoUnaryMask, RISCVMaskedPseudo, SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; } @@ -2518,26 +2573,26 @@ // lowest-numbered part of the source register group". // With LMUL<=1 the source and dest occupy a single register so any overlap // is in the lowest-numbered part. -multiclass VPseudoBinaryM_VV { +multiclass VPseudoBinaryM_VV { defm _VV : VPseudoBinaryM; + !if(!ge(m.octuple, 16), "@earlyclobber $rd", ""), TargetConstraintType>; } -multiclass VPseudoBinaryM_VX { +multiclass VPseudoBinaryM_VX { defm "_VX" : VPseudoBinaryM; + !if(!ge(m.octuple, 16), "@earlyclobber $rd", ""), TargetConstraintType>; } -multiclass VPseudoBinaryM_VF { +multiclass VPseudoBinaryM_VF { defm "_V" # f.FX : VPseudoBinaryM; + !if(!ge(m.octuple, 16), "@earlyclobber $rd", ""), TargetConstraintType>; } -multiclass VPseudoBinaryM_VI { +multiclass VPseudoBinaryM_VI { defm _VI : VPseudoBinaryM; + !if(!ge(m.octuple, 16), "@earlyclobber $rd", ""), TargetConstraintType>; } multiclass VPseudoVGTR_VV_VX_VI { @@ -2843,7 +2898,7 @@ defm "" : VPseudoBinaryW_VV, SchedBinary<"WriteVIWALUV", "ReadVIWALUV", "ReadVIWALUV", mx, forceMergeOpRead=true>; - defm "" : VPseudoBinaryW_VX, + defm "" : VPseudoBinaryW_VX, SchedBinary<"WriteVIWALUX", "ReadVIWALUV", "ReadVIWALUX", mx, forceMergeOpRead=true>; } @@ -2977,13 +3032,13 @@ multiclass VPseudoVCALUM_VM_XM_IM { foreach m = MxList in { defvar mx = m.MX; - defm "" : VPseudoBinaryV_VM, + defm "" : VPseudoBinaryV_VM, SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, forceMasked=1, forceMergeOpRead=true>; - defm "" : VPseudoBinaryV_XM, + defm "" : VPseudoBinaryV_XM, SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, forceMasked=1, forceMergeOpRead=true>; - defm "" : VPseudoBinaryV_IM, + defm "" : VPseudoBinaryV_IM, SchedUnary<"WriteVICALUI", "ReadVICALUV", mx, forceMasked=1, forceMergeOpRead=true>; } @@ -2992,10 +3047,10 @@ multiclass VPseudoVCALUM_VM_XM { foreach m = MxList in { defvar mx = m.MX; - defm "" : VPseudoBinaryV_VM, + defm "" : VPseudoBinaryV_VM, SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, forceMasked=1, forceMergeOpRead=true>; - defm "" : VPseudoBinaryV_XM, + defm "" : VPseudoBinaryV_XM, SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, forceMasked=1, forceMergeOpRead=true>; } @@ -3004,10 +3059,10 @@ multiclass VPseudoVCALUM_V_X_I { foreach m = MxList in { defvar mx = m.MX; - defm "" : VPseudoBinaryV_VM, + defm "" : VPseudoBinaryV_VM, SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, forceMergeOpRead=true>; - defm "" : VPseudoBinaryV_XM, + defm "" : VPseudoBinaryV_XM, SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, forceMergeOpRead=true>; defm "" : VPseudoBinaryV_IM, @@ -3019,10 +3074,10 @@ multiclass VPseudoVCALUM_V_X { foreach m = MxList in { defvar mx = m.MX; - defm "" : VPseudoBinaryV_VM, + defm "" : VPseudoBinaryV_VM, SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, forceMergeOpRead=true>; - defm "" : VPseudoBinaryV_XM, + defm "" : VPseudoBinaryV_XM, SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, forceMergeOpRead=true>; } @@ -3046,13 +3101,13 @@ multiclass VPseudoVNSHT_WV_WX_WI { foreach m = MxListW in { defvar mx = m.MX; - defm "" : VPseudoBinaryV_WV, + defm "" : VPseudoBinaryV_WV, SchedBinary<"WriteVNShiftV", "ReadVNShiftV", "ReadVNShiftV", mx, forceMergeOpRead=true>; - defm "" : VPseudoBinaryV_WX, + defm "" : VPseudoBinaryV_WX, SchedBinary<"WriteVNShiftX", "ReadVNShiftV", "ReadVNShiftX", mx, forceMergeOpRead=true>; - defm "" : VPseudoBinaryV_WI, + defm "" : VPseudoBinaryV_WI, SchedUnary<"WriteVNShiftI", "ReadVNShiftV", mx, forceMergeOpRead=true>; } @@ -3097,11 +3152,12 @@ DAGOperand Op2Class, LMULInfo MInfo, string Constraint = "", - bit Commutable = 0> { + bit Commutable = 0, + int TargetConstraintType = 1> { let VLMul = MInfo.value in { let isCommutable = Commutable in - def "_" # MInfo.MX : VPseudoTernaryNoMaskWithPolicy; - def "_" # MInfo.MX # "_MASK" : VPseudoBinaryMaskPolicy, + def "_" # MInfo.MX : VPseudoTernaryNoMaskWithPolicy; + def "_" # MInfo.MX # "_MASK" : VPseudoBinaryMaskPolicy, RISCVMaskedPseudo; } } @@ -3111,16 +3167,19 @@ DAGOperand Op2Class, LMULInfo MInfo, string Constraint = "", - bit Commutable = 0> { + bit Commutable = 0, + int TargetConstraintType = 1> { let VLMul = MInfo.value in { let isCommutable = Commutable in def "_" # MInfo.MX : VPseudoTernaryNoMaskWithPolicyRoundingMode; + Op2Class, Constraint, + TargetConstraintType>; def "_" # MInfo.MX # "_MASK" : VPseudoBinaryMaskPolicyRoundingMode, + UsesVXRM_=0, + TargetConstraintType=TargetConstraintType>, RISCVMaskedPseudo; } } @@ -3155,31 +3214,34 @@ multiclass VPseudoTernaryW_VV { defvar constraint = "@earlyclobber $rd"; defm _VV : VPseudoTernaryWithPolicy; + constraint, /*Commutable*/ 0, TargetConstraintType=3>; } multiclass VPseudoTernaryW_VV_RM { defvar constraint = "@earlyclobber $rd"; defm _VV : VPseudoTernaryWithPolicyRoundingMode; + constraint, /* Commutable */ 0, + TargetConstraintType=3>; } multiclass VPseudoTernaryW_VX { defvar constraint = "@earlyclobber $rd"; defm "_VX" : VPseudoTernaryWithPolicy; + constraint, /*Commutable*/ 0, TargetConstraintType=3>; } -multiclass VPseudoTernaryW_VF { +multiclass VPseudoTernaryW_VF { defvar constraint = "@earlyclobber $rd"; defm "_V" # f.FX : VPseudoTernaryWithPolicy; + m.vrclass, m, constraint, /*Commutable*/ 0, TargetConstraintType>; } multiclass VPseudoTernaryW_VF_RM { defvar constraint = "@earlyclobber $rd"; defm "_V" # f.FX : VPseudoTernaryWithPolicyRoundingMode; + m.vrclass, m, constraint, + /* Commutable */ 0, + TargetConstraintType=3>; } multiclass VPseudoVSLDVWithPolicy, + defm "" : VPseudoBinaryM_VV, SchedBinary<"WriteVICmpV", "ReadVICmpV", "ReadVICmpV", mx>; - defm "" : VPseudoBinaryM_VX, + defm "" : VPseudoBinaryM_VX, SchedBinary<"WriteVICmpX", "ReadVICmpV", "ReadVICmpX", mx>; - defm "" : VPseudoBinaryM_VI, + defm "" : VPseudoBinaryM_VI, SchedUnary<"WriteVICmpI", "ReadVICmpV", mx>; } } @@ -3326,22 +3388,22 @@ multiclass VPseudoVCMPM_VV_VX { foreach m = MxList in { defvar mx = m.MX; - defm "" : VPseudoBinaryM_VV, + defm "" : VPseudoBinaryM_VV, SchedBinary<"WriteVICmpV", "ReadVICmpV", "ReadVICmpV", mx>; - defm "" : VPseudoBinaryM_VX, + defm "" : VPseudoBinaryM_VX, SchedBinary<"WriteVICmpX", "ReadVICmpV", "ReadVICmpX", mx>; } } multiclass VPseudoVCMPM_VV_VF { foreach m = MxListF in { - defm "" : VPseudoBinaryM_VV, + defm "" : VPseudoBinaryM_VV, SchedBinary<"WriteVFCmpV", "ReadVFCmpV", "ReadVFCmpV", m.MX>; } foreach f = FPList in { foreach m = f.MxList in { - defm "" : VPseudoBinaryM_VF, + defm "" : VPseudoBinaryM_VF, SchedBinary<"WriteVFCmpF", "ReadVFCmpV", "ReadVFCmpF", m.MX>; } } @@ -3350,7 +3412,7 @@ multiclass VPseudoVCMPM_VF { foreach f = FPList in { foreach m = f.MxList in { - defm "" : VPseudoBinaryM_VF, + defm "" : VPseudoBinaryM_VF, SchedBinary<"WriteVFCmpF", "ReadVFCmpV", "ReadVFCmpF", m.MX>; } } @@ -3359,9 +3421,9 @@ multiclass VPseudoVCMPM_VX_VI { foreach m = MxList in { defvar mx = m.MX; - defm "" : VPseudoBinaryM_VX, + defm "" : VPseudoBinaryM_VX, SchedBinary<"WriteVICmpX", "ReadVICmpV", "ReadVICmpX", mx>; - defm "" : VPseudoBinaryM_VI, + defm "" : VPseudoBinaryM_VI, SchedUnary<"WriteVICmpI", "ReadVICmpV", mx>; } } @@ -3444,11 +3506,12 @@ multiclass VPseudoConversion { + string Constraint = "", + int TargetConstraintType = 1> { let VLMul = MInfo.value in { - def "_" # MInfo.MX : VPseudoUnaryNoMask; + def "_" # MInfo.MX : VPseudoUnaryNoMask; def "_" # MInfo.MX # "_MASK" : VPseudoUnaryMask, + Constraint, TargetConstraintType>, RISCVMaskedPseudo; } } @@ -3456,9 +3519,10 @@ multiclass VPseudoConversionRoundingMode { + string Constraint = "", + int TargetConstraintType = 1> { let VLMul = MInfo.value in { - def "_" # MInfo.MX : VPseudoUnaryNoMaskRoundingMode; + def "_" # MInfo.MX : VPseudoUnaryNoMaskRoundingMode; def "_" # MInfo.MX # "_MASK" : VPseudoUnaryMaskRoundingMode, RISCVMaskedPseudo; @@ -3539,7 +3603,7 @@ multiclass VPseudoVWCVTI_V { defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { - defm _V : VPseudoConversion, + defm _V : VPseudoConversion, SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX, forceMergeOpRead=true>; } @@ -3548,7 +3612,7 @@ multiclass VPseudoVWCVTI_V_RM { defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { - defm _V : VPseudoConversionRoundingMode, + defm _V : VPseudoConversionRoundingMode, SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX, forceMergeOpRead=true>; } @@ -3566,7 +3630,7 @@ multiclass VPseudoVWCVTF_V { defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { - defm _V : VPseudoConversion, + defm _V : VPseudoConversion, SchedUnary<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV", m.MX, forceMergeOpRead=true>; } @@ -3575,7 +3639,7 @@ multiclass VPseudoVWCVTD_V { defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { - defm _V : VPseudoConversion, + defm _V : VPseudoConversion, SchedUnary<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV", m.MX, forceMergeOpRead=true>; } @@ -3584,7 +3648,7 @@ multiclass VPseudoVNCVTI_W { defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { - defm _W : VPseudoConversion, + defm _W : VPseudoConversion, SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX, forceMergeOpRead=true>; } @@ -3593,7 +3657,7 @@ multiclass VPseudoVNCVTI_W_RM { defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { - defm _W : VPseudoConversionRoundingMode, + defm _W : VPseudoConversionRoundingMode, SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX, forceMergeOpRead=true>; } @@ -3611,7 +3675,7 @@ multiclass VPseudoVNCVTF_W_RM { defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { - defm _W : VPseudoConversionRoundingMode, + defm _W : VPseudoConversionRoundingMode, SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX, forceMergeOpRead=true>; } @@ -3629,7 +3693,7 @@ multiclass VPseudoVNCVTD_W { defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { - defm _W : VPseudoConversion, + defm _W : VPseudoConversion, SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX, forceMergeOpRead=true>; } @@ -3638,7 +3702,7 @@ multiclass VPseudoVNCVTD_W_RM { defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { - defm _W : VPseudoConversionRoundingMode, + defm _W : VPseudoConversionRoundingMode, SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX, forceMergeOpRead=true>; }