diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td @@ -106,70 +106,77 @@ // in order. // `reads` SchedReads that are listed for each explicit use operand. // `forceMasked` Forced to be masked (e.g. Add-with-Carry Instructions). +// `forceMergeOpRead` Force to have read for merge operand. class SchedCommon writes, list reads, - string mx = "WorstCase", int sew = 0, bit forceMasked = 0> - : Sched<[]> { + string mx = "WorstCase", int sew = 0, bit forceMasked = 0, + bit forceMergeOpRead = 0> : Sched<[]> { defvar isMasked = !ne(!find(NAME, "_MASK"), -1); defvar isMaskedOrForceMasked = !or(forceMasked, isMasked); - defvar mergeOp = !if(!or(!eq(mx, "WorstCase"), !eq(sew, 0)), + defvar mergeRead = !if(!or(!eq(mx, "WorstCase"), !eq(sew, 0)), !cast("ReadVMergeOp_" # mx), !cast("ReadVMergeOp_" # mx # "_E" #sew)); - defvar allReads = !if(isMaskedOrForceMasked, - !listconcat([mergeOp], reads, [ReadVMask]), - reads); + defvar needsMergeRead = !or(isMaskedOrForceMasked, forceMergeOpRead); + defvar readsWithMask = + !if(isMaskedOrForceMasked, !listconcat(reads, [ReadVMask]), reads); + defvar allReads = + !if(needsMergeRead, !listconcat([mergeRead], readsWithMask), reads); let SchedRW = !listconcat(writes, allReads); } // Common class of scheduling definitions for n-ary instructions. // The scheudling resources are relevant to LMUL and may be relevant to SEW. -class SchedNary reads, - string mx, int sew = 0, bit forceMasked = 0>: - SchedCommon<[!cast( - !if(sew, write # "_" # mx # "_E" # sew, +class SchedNary reads, string mx, int sew = 0, + bit forceMasked = 0, bit forceMergeOpRead = 0> + : SchedCommon<[!cast( + !if(sew, + write # "_" # mx # "_E" # sew, write # "_" # mx))], - !foreach(read, reads, - !cast( - !if(sew, read # "_" # mx # "_E" # sew, - read # "_" # mx))), - mx, sew, forceMasked>; + !foreach(read, reads, + !cast(!if(sew, read #"_" #mx #"_E" #sew, + read #"_" #mx))), + mx, sew, forceMasked, forceMergeOpRead>; // Classes with postfix "MC" are only used in MC layer. // For these classes, we assume that they are with the worst case costs and // `ReadVMask` is always needed (with some exceptions). // For instructions with no operand. -class SchedNullary: - SchedNary; +class SchedNullary: + SchedNary; class SchedNullaryMC: SchedNullary; // For instructions with one operand. class SchedUnary: - SchedNary; + bit forceMasked = 0, bit forceMergeOpRead = 0>: + SchedNary; class SchedUnaryMC: SchedUnary; // For instructions with two operands. -class SchedBinary: - SchedNary; +class SchedBinary + : SchedNary; class SchedBinaryMC: SchedBinary; // For instructions with three operands. class SchedTernary: - SchedNary; + string mx, int sew = 0, bit forceMasked = 0, + bit forceMergeOpRead = 0> + : SchedNary; class SchedTernaryMC: SchedNary; // For reduction instructions. -class SchedReduction: - SchedCommon<[!cast(write # "_" # mx # "_E" # sew)], - !listsplat(!cast(read), 3), mx, sew>; +class SchedReduction + : SchedCommon<[!cast(write #"_" #mx #"_E" #sew)], + !listsplat(!cast(read), 3), mx, sew, forceMergeOpRead>; class SchedReductionMC: SchedCommon<[!cast(write # "_WorstCase")], [!cast(readV), !cast(readV0)], 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 @@ -1900,9 +1900,9 @@ defvar mx = mti.LMul.MX; let VLMul = mti.LMul.value in { def "_M_" # mti.BX : VPseudoUnaryNoMaskGPROut, - SchedBinary<"WriteVMPopV", "ReadVMPopV", "ReadVMPopV", mx>; + SchedBinary<"WriteVMPopV", "ReadVMPopV", "ReadVMPopV", mx>; def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMaskGPROut, - SchedBinary<"WriteVMPopV", "ReadVMPopV", "ReadVMPopV", mx>; + SchedBinary<"WriteVMPopV", "ReadVMPopV", "ReadVMPopV", mx>; } } } @@ -1911,10 +1911,10 @@ foreach mti = AllMasks in { defvar mx = mti.LMul.MX; let VLMul = mti.LMul.value in { - def "_M_" # mti.BX : VPseudoUnaryNoMaskGPROut, - SchedBinary<"WriteVMFFSV", "ReadVMFFSV", "ReadVMFFSV", mx>; + def "_M_" #mti.BX : VPseudoUnaryNoMaskGPROut, + SchedBinary<"WriteVMFFSV", "ReadVMFFSV", "ReadVMFFSV", mx>; def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMaskGPROut, - SchedBinary<"WriteVMFFSV", "ReadVMFFSV", "ReadVMFFSV", mx>; + SchedBinary<"WriteVMFFSV", "ReadVMFFSV", "ReadVMFFSV", mx>; } } } @@ -1925,9 +1925,11 @@ defvar mx = mti.LMul.MX; let VLMul = mti.LMul.value in { def "_M_" # mti.BX : VPseudoUnaryNoMask, - SchedUnary<"WriteVMSFSV", "ReadVMSFSV", mx>; + SchedUnary<"WriteVMSFSV", "ReadVMSFSV", mx, + forceMergeOpRead=true>; def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMask, - SchedUnary<"WriteVMSFSV", "ReadVMSFSV", mx>; + SchedUnary<"WriteVMSFSV", "ReadVMSFSV", mx, + forceMergeOpRead=true>; } } } @@ -1937,10 +1939,11 @@ defvar mx = m.MX; let VLMul = m.value in { def "_V_" # mx : VPseudoNullaryNoMask, - SchedNullary<"WriteVMIdxV", mx>; + SchedNullary<"WriteVMIdxV", mx, forceMergeOpRead=true>; def "_V_" # mx # "_MASK" : VPseudoNullaryMask, RISCVMaskedPseudo, - SchedNullary<"WriteVMIdxV", mx>; + SchedNullary<"WriteVMIdxV", mx, + forceMergeOpRead=true>; } } } @@ -1960,10 +1963,12 @@ defvar mx = m.MX; let VLMul = m.value in { def "_" # mx : VPseudoUnaryNoMask, - SchedUnary<"WriteVMIotV", "ReadVMIotV", mx>; + SchedUnary<"WriteVMIotV", "ReadVMIotV", mx, + forceMergeOpRead=true>; def "_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - SchedUnary<"WriteVMIotV", "ReadVMIotV", mx>; + SchedUnary<"WriteVMIotV", "ReadVMIotV", mx, + forceMergeOpRead=true>; } } } @@ -1976,9 +1981,10 @@ foreach e = sews in { defvar suffix = "_" # m.MX # "_E" # e; let SEW = e in - def _VM # suffix : VPseudoUnaryAnyMask, - SchedBinary<"WriteVCompressV", "ReadVCompressV", "ReadVCompressV", - mx, e>; + def _VM # suffix + : VPseudoUnaryAnyMask, + SchedBinary<"WriteVCompressV", "ReadVCompressV", "ReadVCompressV", + mx, e>; } } } @@ -2121,9 +2127,11 @@ defvar emul = !cast("V_" # emulMX); defvar sews = SchedSEWSet.val; foreach e = sews in { - defm _VV : VPseudoBinaryEmul, - SchedBinary<"WriteVRGatherVV", "ReadVRGatherVV_data", "ReadVRGatherVV_index", - mx, e>; + defm _VV + : VPseudoBinaryEmul, + SchedBinary<"WriteVRGatherVV", "ReadVRGatherVV_data", + "ReadVRGatherVV_index", mx, e, forceMergeOpRead=true>; } } } @@ -2141,7 +2149,8 @@ multiclass VPseudoVSLD1_VX { foreach m = MxList in { defm "_VX" : VPseudoBinary, - SchedBinary<"WriteVISlide1X", "ReadVISlideV", "ReadVISlideX", m.MX>; + SchedBinary<"WriteVISlide1X", "ReadVISlideV", "ReadVISlideX", + m.MX, forceMergeOpRead=true>; } } @@ -2159,9 +2168,10 @@ multiclass VPseudoVSLD1_VF { foreach f = FPList in { foreach m = f.MxList in { - defm "_V" # f.FX : - VPseudoBinary, - SchedBinary<"WriteVFSlide1F", "ReadVFSlideV", "ReadVFSlideF", m.MX>; + defm "_V" #f.FX + : VPseudoBinary, + SchedBinary<"WriteVFSlide1F", "ReadVFSlideV", "ReadVFSlideF", m.MX, + forceMergeOpRead=true>; } } } @@ -2179,7 +2189,7 @@ defvar mx = m.MX; let VLMul = m.value in { def "_MM_" # mx : VPseudoBinaryNoMask, - SchedBinary<"WriteVMALUV", "ReadVMALUV", "ReadVMALUV", mx>; + SchedBinary<"WriteVMALUV", "ReadVMALUV", "ReadVMALUV", mx>; } } } @@ -2328,10 +2338,12 @@ foreach f = FPList in { foreach m = f.MxList in { defvar mx = m.MX; - def "_V" # f.FX # "M_" # mx: - VPseudoTiedBinaryCarryIn.R, - m.vrclass, f.fprclass, m, CarryIn=1, Constraint="">, - SchedBinary<"WriteVFMergeV", "ReadVFMergeV", "ReadVFMergeF", mx, forceMasked=1>; + def "_V" # f.FX # "M_" # mx + : VPseudoTiedBinaryCarryIn.R, m.vrclass, + f.fprclass, m, CarryIn=1, + Constraint = "">, + SchedBinary<"WriteVFMergeV", "ReadVFMergeV", "ReadVFMergeF", mx, + forceMasked=1, forceMergeOpRead=true>; } } } @@ -2357,11 +2369,14 @@ defvar mx = m.MX; let VLMul = m.value in { def "_V_" # mx : VPseudoUnaryNoMask, - SchedUnary<"WriteVIMovV", "ReadVIMovV", mx>; + SchedUnary<"WriteVIMovV", "ReadVIMovV", mx, + forceMergeOpRead=true>; def "_X_" # mx : VPseudoUnaryNoMask, - SchedUnary<"WriteVIMovX", "ReadVIMovX", mx>; + SchedUnary<"WriteVIMovX", "ReadVIMovX", mx, + forceMergeOpRead=true>; def "_I_" # mx : VPseudoUnaryNoMask, - SchedNullary<"WriteVIMovI", mx>; + SchedNullary<"WriteVIMovI", mx, + forceMergeOpRead=true>; } } } @@ -2374,7 +2389,7 @@ let VLMul = m.value in { def "_" # f.FX # "_" # mx : VPseudoUnaryNoMask, - SchedUnary<"WriteVFMovV", "ReadVFMovF", mx>; + SchedUnary<"WriteVFMovV", "ReadVFMovF", mx, forceMergeOpRead=true>; } } } @@ -2385,10 +2400,12 @@ defvar mx = m.MX; let VLMul = m.value in { def "_V_" # mx : VPseudoUnaryNoMask, - SchedUnary<"WriteVFClassV", "ReadVFClassV", mx>; + SchedUnary<"WriteVFClassV", "ReadVFClassV", mx, + forceMergeOpRead=true>; def "_V_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - SchedUnary<"WriteVFClassV", "ReadVFClassV", mx>; + SchedUnary<"WriteVFClassV", "ReadVFClassV", mx, + forceMergeOpRead=true>; } } } @@ -2403,10 +2420,13 @@ defvar suffix = "_" # mx # "_E" # e; let SEW = e in { def "_V" # suffix : VPseudoUnaryNoMaskRoundingMode, - SchedUnary<"WriteVFSqrtV", "ReadVFSqrtV", mx, e>; - def "_V" # suffix # "_MASK" : VPseudoUnaryMaskRoundingMode, - RISCVMaskedPseudo, - SchedUnary<"WriteVFSqrtV", "ReadVFSqrtV", mx, e>; + SchedUnary<"WriteVFSqrtV", "ReadVFSqrtV", mx, e, + forceMergeOpRead=true>; + def "_V" #suffix # "_MASK" + : VPseudoUnaryMaskRoundingMode, + RISCVMaskedPseudo, + SchedUnary<"WriteVFSqrtV", "ReadVFSqrtV", mx, e, + forceMergeOpRead=true>; } } } @@ -2416,11 +2436,13 @@ foreach m = MxListF in { defvar mx = m.MX; let VLMul = m.value in { - def "_V_" # mx : VPseudoUnaryNoMask, - SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx>; - def "_V_" # mx # "_MASK" : VPseudoUnaryMask, - RISCVMaskedPseudo, - SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx>; + def "_V_" # mx + : VPseudoUnaryNoMask, + SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx, forceMergeOpRead=true>; + def "_V_" # mx # "_MASK" + : VPseudoUnaryMask, + RISCVMaskedPseudo, + SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx, forceMergeOpRead=true>; } } } @@ -2429,11 +2451,13 @@ foreach m = MxListF in { defvar mx = m.MX; let VLMul = m.value in { - def "_V_" # mx : VPseudoUnaryNoMaskRoundingMode, - SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx>; - def "_V_" # mx # "_MASK" : VPseudoUnaryMaskRoundingMode, - RISCVMaskedPseudo, - SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx>; + def "_V_" # mx + : VPseudoUnaryNoMaskRoundingMode, + SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx, forceMergeOpRead=true>; + def "_V_" # mx # "_MASK" + : VPseudoUnaryMaskRoundingMode, + RISCVMaskedPseudo, + SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx, forceMergeOpRead=true>; } } } @@ -2444,11 +2468,11 @@ defvar mx = m.MX; let VLMul = m.value in { def "_" # mx : VPseudoUnaryNoMask, - SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; def "_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; } } } @@ -2459,11 +2483,11 @@ defvar mx = m.MX; let VLMul = m.value in { def "_" # mx : VPseudoUnaryNoMask, - SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; def "_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; } } } @@ -2474,11 +2498,11 @@ defvar mx = m.MX; let VLMul = m.value in { def "_" # mx : VPseudoUnaryNoMask, - SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; def "_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + SchedUnary<"WriteVExtV", "ReadVExtV", mx, forceMergeOpRead=true>; } } } @@ -2521,15 +2545,16 @@ defvar mx = m.MX; defm "" : VPseudoBinaryV_VX, SchedBinary<"WriteVRGatherVX", "ReadVRGatherVX_data", - "ReadVRGatherVX_index", mx>; + "ReadVRGatherVX_index", mx, forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VI, - SchedUnary<"WriteVRGatherVI", "ReadVRGatherVI_data", mx>; + SchedUnary<"WriteVRGatherVI", "ReadVRGatherVI_data", mx, + forceMergeOpRead=true>; defvar sews = SchedSEWSet.val; foreach e = sews in { defm "" : VPseudoBinaryV_VV, SchedBinary<"WriteVRGatherVV", "ReadVRGatherVV_data", - "ReadVRGatherVV_index", mx, e>; + "ReadVRGatherVV_index", mx, e, forceMergeOpRead=true>; } } } @@ -2538,11 +2563,13 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VV, - SchedBinary<"WriteVSALUV", "ReadVSALUV", "ReadVSALUX", mx>; + SchedBinary<"WriteVSALUV", "ReadVSALUV", "ReadVSALUX", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VX, - SchedBinary<"WriteVSALUX", "ReadVSALUV", "ReadVSALUX", mx>; + SchedBinary<"WriteVSALUX", "ReadVSALUV", "ReadVSALUX", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VI, - SchedUnary<"WriteVSALUI", "ReadVSALUV", mx>; + SchedUnary<"WriteVSALUI", "ReadVSALUV", mx, forceMergeOpRead=true>; } } @@ -2551,11 +2578,13 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VV, - SchedBinary<"WriteVShiftV", "ReadVShiftV", "ReadVShiftV", mx>; + SchedBinary<"WriteVShiftV", "ReadVShiftV", "ReadVShiftV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VX, - SchedBinary<"WriteVShiftX", "ReadVShiftV", "ReadVShiftX", mx>; + SchedBinary<"WriteVShiftX", "ReadVShiftV", "ReadVShiftX", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VI, - SchedUnary<"WriteVShiftI", "ReadVShiftV", mx>; + SchedUnary<"WriteVShiftI", "ReadVShiftV", mx, forceMergeOpRead=true>; } } @@ -2563,11 +2592,13 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VV_RM, - SchedBinary<"WriteVSShiftV", "ReadVSShiftV", "ReadVSShiftV", mx>; + SchedBinary<"WriteVSShiftV", "ReadVSShiftV", "ReadVSShiftV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VX_RM, - SchedBinary<"WriteVSShiftX", "ReadVSShiftV", "ReadVSShiftX", mx>; + SchedBinary<"WriteVSShiftX", "ReadVSShiftV", "ReadVSShiftX", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VI_RM, - SchedUnary<"WriteVSShiftI", "ReadVSShiftV", mx>; + SchedUnary<"WriteVSShiftI", "ReadVSShiftV", mx, forceMergeOpRead=true>; } } @@ -2575,11 +2606,13 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VV, - SchedBinary<"WriteVIALUV", "ReadVIALUV", "ReadVIALUV", mx>; + SchedBinary<"WriteVIALUV", "ReadVIALUV", "ReadVIALUV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VX, - SchedBinary<"WriteVIALUX", "ReadVIALUV", "ReadVIALUX", mx>; + SchedBinary<"WriteVIALUX", "ReadVIALUV", "ReadVIALUX", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VI, - SchedUnary<"WriteVIALUI", "ReadVIALUV", mx>; + SchedUnary<"WriteVIALUI", "ReadVIALUV", mx, forceMergeOpRead=true>; } } @@ -2587,9 +2620,11 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VV, - SchedBinary<"WriteVSALUV", "ReadVSALUV", "ReadVSALUV", mx>; + SchedBinary<"WriteVSALUV", "ReadVSALUV", "ReadVSALUV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VX, - SchedBinary<"WriteVSALUX", "ReadVSALUV", "ReadVSALUX", mx>; + SchedBinary<"WriteVSALUX", "ReadVSALUV", "ReadVSALUX", mx, + forceMergeOpRead=true>; } } @@ -2597,9 +2632,11 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VV_RM, - SchedBinary<"WriteVSMulV", "ReadVSMulV", "ReadVSMulV", mx>; + SchedBinary<"WriteVSMulV", "ReadVSMulV", "ReadVSMulV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VX_RM, - SchedBinary<"WriteVSMulX", "ReadVSMulV", "ReadVSMulX", mx>; + SchedBinary<"WriteVSMulX", "ReadVSMulV", "ReadVSMulX", mx, + forceMergeOpRead=true>; } } @@ -2607,9 +2644,11 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VV_RM, - SchedBinary<"WriteVAALUV", "ReadVAALUV", "ReadVAALUV", mx>; + SchedBinary<"WriteVAALUV", "ReadVAALUV", "ReadVAALUV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VX_RM, - SchedBinary<"WriteVAALUX", "ReadVAALUV", "ReadVAALUX", mx>; + SchedBinary<"WriteVAALUX", "ReadVAALUV", "ReadVAALUX", mx, + forceMergeOpRead=true>; } } @@ -2649,13 +2688,15 @@ multiclass VPseudoVFMUL_VV_VF_RM { foreach m = MxListF in { defm "" : VPseudoBinaryFV_VV_RM, - SchedBinary<"WriteVFMulV", "ReadVFMulV", "ReadVFMulV", m.MX>; + SchedBinary<"WriteVFMulV", "ReadVFMulV", "ReadVFMulV", m.MX, + forceMergeOpRead=true>; } foreach f = FPList in { foreach m = f.MxList in { defm "" : VPseudoBinaryV_VF_RM, - SchedBinary<"WriteVFMulF", "ReadVFMulV", "ReadVFMulF", m.MX>; + SchedBinary<"WriteVFMulF", "ReadVFMulV", "ReadVFMulF", m.MX, + forceMergeOpRead=true>; } } } @@ -2666,14 +2707,16 @@ defvar sews = SchedSEWSet.val; foreach e = sews in { defm "" : VPseudoBinaryFV_VV_RM, - SchedBinary<"WriteVFDivV", "ReadVFDivV", "ReadVFDivV", mx, e>; + SchedBinary<"WriteVFDivV", "ReadVFDivV", "ReadVFDivV", mx, e, + forceMergeOpRead=true>; } } foreach f = FPList in { foreach m = f.MxList in { defm "" : VPseudoBinaryV_VF_RM, - SchedBinary<"WriteVFDivF", "ReadVFDivV", "ReadVFDivF", m.MX, f.SEW>; + SchedBinary<"WriteVFDivF", "ReadVFDivV", "ReadVFDivF", m.MX, f.SEW, + forceMergeOpRead=true>; } } } @@ -2682,7 +2725,8 @@ foreach f = FPList in { foreach m = f.MxList in { defm "" : VPseudoBinaryV_VF_RM, - SchedBinary<"WriteVFDivF", "ReadVFDivV", "ReadVFDivF", m.MX, f.SEW>; + SchedBinary<"WriteVFDivF", "ReadVFDivV", "ReadVFDivF", m.MX, f.SEW, + forceMergeOpRead=true>; } } } @@ -2690,22 +2734,26 @@ multiclass VPseudoVALU_VV_VX { foreach m = MxList in { defm "" : VPseudoBinaryV_VV, - SchedBinary<"WriteVIALUV", "ReadVIALUV", "ReadVIALUV", m.MX>; + SchedBinary<"WriteVIALUV", "ReadVIALUV", "ReadVIALUV", m.MX, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VX, - SchedBinary<"WriteVIALUX", "ReadVIALUV", "ReadVIALUX", m.MX>; + SchedBinary<"WriteVIALUX", "ReadVIALUV", "ReadVIALUX", m.MX, + forceMergeOpRead=true>; } } multiclass VPseudoVSGNJ_VV_VF { foreach m = MxListF in { defm "" : VPseudoBinaryFV_VV, - SchedBinary<"WriteVFSgnjV", "ReadVFSgnjV", "ReadVFSgnjV", m.MX>; + SchedBinary<"WriteVFSgnjV", "ReadVFSgnjV", "ReadVFSgnjV", m.MX, + forceMergeOpRead=true>; } foreach f = FPList in { foreach m = f.MxList in { defm "" : VPseudoBinaryV_VF, - SchedBinary<"WriteVFSgnjF", "ReadVFSgnjV", "ReadVFSgnjF", m.MX>; + SchedBinary<"WriteVFSgnjF", "ReadVFSgnjV", "ReadVFSgnjF", m.MX, + forceMergeOpRead=true>; } } } @@ -2713,13 +2761,15 @@ multiclass VPseudoVMAX_VV_VF { foreach m = MxListF in { defm "" : VPseudoBinaryFV_VV, - SchedBinary<"WriteVFMinMaxV", "ReadVFMinMaxV", "ReadVFMinMaxV", m.MX>; + SchedBinary<"WriteVFMinMaxV", "ReadVFMinMaxV", "ReadVFMinMaxV", m.MX, + forceMergeOpRead=true>; } foreach f = FPList in { foreach m = f.MxList in { defm "" : VPseudoBinaryV_VF, - SchedBinary<"WriteVFMinMaxF", "ReadVFMinMaxV", "ReadVFMinMaxF", m.MX>; + SchedBinary<"WriteVFMinMaxF", "ReadVFMinMaxV", "ReadVFMinMaxF", m.MX, + forceMergeOpRead=true>; } } } @@ -2727,13 +2777,15 @@ multiclass VPseudoVALU_VV_VF { foreach m = MxListF in { defm "" : VPseudoBinaryFV_VV, - SchedBinary<"WriteVFALUV", "ReadVFALUV", "ReadVFALUV", m.MX>; + SchedBinary<"WriteVFALUV", "ReadVFALUV", "ReadVFALUV", m.MX, + forceMergeOpRead=true>; } foreach f = FPList in { foreach m = f.MxList in { defm "" : VPseudoBinaryV_VF, - SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX>; + SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX, + forceMergeOpRead=true>; } } } @@ -2741,13 +2793,15 @@ multiclass VPseudoVALU_VV_VF_RM { foreach m = MxListF in { defm "" : VPseudoBinaryFV_VV_RM, - SchedBinary<"WriteVFALUV", "ReadVFALUV", "ReadVFALUV", m.MX>; + SchedBinary<"WriteVFALUV", "ReadVFALUV", "ReadVFALUV", m.MX, + forceMergeOpRead=true>; } foreach f = FPList in { foreach m = f.MxList in { defm "" : VPseudoBinaryV_VF_RM, - SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX>; + SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX, + forceMergeOpRead=true>; } } } @@ -2756,7 +2810,8 @@ foreach f = FPList in { foreach m = f.MxList in { defm "" : VPseudoBinaryV_VF, - SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX>; + SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX, + forceMergeOpRead=true>; } } } @@ -2765,7 +2820,8 @@ foreach f = FPList in { foreach m = f.MxList in { defm "" : VPseudoBinaryV_VF_RM, - SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX>; + SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX, + forceMergeOpRead=true>; } } } @@ -2774,9 +2830,10 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VX, - SchedBinary<"WriteVIALUX", "ReadVIALUV", "ReadVIALUX", mx>; + SchedBinary<"WriteVIALUX", "ReadVIALUV", "ReadVIALUX", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_VI, - SchedUnary<"WriteVIALUI", "ReadVIALUV", mx>; + SchedUnary<"WriteVIALUI", "ReadVIALUV", mx, forceMergeOpRead=true>; } } @@ -2784,9 +2841,11 @@ foreach m = MxListW in { defvar mx = m.MX; defm "" : VPseudoBinaryW_VV, - SchedBinary<"WriteVIWALUV", "ReadVIWALUV", "ReadVIWALUV", mx>; + SchedBinary<"WriteVIWALUV", "ReadVIWALUV", "ReadVIWALUV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryW_VX, - SchedBinary<"WriteVIWALUX", "ReadVIWALUV", "ReadVIWALUX", mx>; + SchedBinary<"WriteVIWALUX", "ReadVIWALUV", "ReadVIWALUX", mx, + forceMergeOpRead=true>; } } @@ -2800,22 +2859,26 @@ foreach m = MxListW in { defvar mx = m.MX; defm "" : VPseudoBinaryW_VV, - SchedBinary<"WriteVIWMulV", "ReadVIWMulV", "ReadVIWMulV", mx>; + SchedBinary<"WriteVIWMulV", "ReadVIWMulV", "ReadVIWMulV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryW_VX, - SchedBinary<"WriteVIWMulX", "ReadVIWMulV", "ReadVIWMulX", mx>; + SchedBinary<"WriteVIWMulX", "ReadVIWMulV", "ReadVIWMulX", mx, + forceMergeOpRead=true>; } } multiclass VPseudoVWMUL_VV_VF_RM { foreach m = MxListFW in { defm "" : VPseudoBinaryW_VV_RM, - SchedBinary<"WriteVFWMulV", "ReadVFWMulV", "ReadVFWMulV", m.MX>; + SchedBinary<"WriteVFWMulV", "ReadVFWMulV", "ReadVFWMulV", m.MX, + forceMergeOpRead=true>; } foreach f = FPListW in { foreach m = f.MxListFW in { defm "" : VPseudoBinaryW_VF_RM, - SchedBinary<"WriteVFWMulF", "ReadVFWMulV", "ReadVFWMulF", m.MX>; + SchedBinary<"WriteVFWMulF", "ReadVFWMulV", "ReadVFWMulF", m.MX, + forceMergeOpRead=true>; } } } @@ -2824,22 +2887,26 @@ foreach m = MxListW in { defvar mx = m.MX; defm "" : VPseudoBinaryW_WV, - SchedBinary<"WriteVIWALUV", "ReadVIWALUV", "ReadVIWALUV", mx>; + SchedBinary<"WriteVIWALUV", "ReadVIWALUV", "ReadVIWALUV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryW_WX, - SchedBinary<"WriteVIWALUX", "ReadVIWALUV", "ReadVIWALUX", mx>; + SchedBinary<"WriteVIWALUX", "ReadVIWALUV", "ReadVIWALUX", mx, + forceMergeOpRead=true>; } } multiclass VPseudoVFWALU_VV_VF_RM { foreach m = MxListFW in { defm "" : VPseudoBinaryW_VV_RM, - SchedBinary<"WriteVFWALUV", "ReadVFWALUV", "ReadVFWALUV", m.MX>; + SchedBinary<"WriteVFWALUV", "ReadVFWALUV", "ReadVFWALUV", m.MX, + forceMergeOpRead=true>; } foreach f = FPListW in { foreach m = f.MxListFW in { defm "" : VPseudoBinaryW_VF_RM, - SchedBinary<"WriteVFWALUF", "ReadVFWALUV", "ReadVFWALUF", m.MX>; + SchedBinary<"WriteVFWALUF", "ReadVFWALUV", "ReadVFWALUF", m.MX, + forceMergeOpRead=true>; } } } @@ -2847,12 +2914,14 @@ multiclass VPseudoVFWALU_WV_WF_RM { foreach m = MxListFW in { defm "" : VPseudoBinaryW_WV_RM, - SchedBinary<"WriteVFWALUV", "ReadVFWALUV", "ReadVFWALUV", m.MX>; + SchedBinary<"WriteVFWALUV", "ReadVFWALUV", "ReadVFWALUV", m.MX, + forceMergeOpRead=true>; } foreach f = FPListW in { foreach m = f.MxListFW in { defm "" : VPseudoBinaryW_WF_RM, - SchedBinary<"WriteVFWALUF", "ReadVFWALUV", "ReadVFWALUF", m.MX>; + SchedBinary<"WriteVFWALUF", "ReadVFWALUV", "ReadVFWALUF", m.MX, + forceMergeOpRead=true>; } } } @@ -2863,15 +2932,18 @@ def "_VVM" # "_" # m.MX: VPseudoTiedBinaryCarryIn.R, m.vrclass, m.vrclass, m, 1, "">, - SchedBinary<"WriteVIMergeV", "ReadVIMergeV", "ReadVIMergeV", mx>; + SchedBinary<"WriteVIMergeV", "ReadVIMergeV", "ReadVIMergeV", mx, + forceMergeOpRead=true>; def "_VXM" # "_" # m.MX: VPseudoTiedBinaryCarryIn.R, m.vrclass, GPR, m, 1, "">, - SchedBinary<"WriteVIMergeX", "ReadVIMergeV", "ReadVIMergeX", mx>; + SchedBinary<"WriteVIMergeX", "ReadVIMergeV", "ReadVIMergeX", mx, + forceMergeOpRead=true>; def "_VIM" # "_" # m.MX: VPseudoTiedBinaryCarryIn.R, m.vrclass, simm5, m, 1, "">, - SchedUnary<"WriteVIMergeI", "ReadVIMergeV", mx>; + SchedUnary<"WriteVIMergeI", "ReadVIMergeV", mx, + forceMergeOpRead=true>; } } @@ -2879,11 +2951,14 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoTiedBinaryV_VM, - SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx>; + SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, + forceMergeOpRead=true>; defm "" : VPseudoTiedBinaryV_XM, - SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx>; + SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, + forceMergeOpRead=true>; defm "" : VPseudoTiedBinaryV_IM, - SchedUnary<"WriteVICALUI", "ReadVICALUV", mx>; + SchedUnary<"WriteVICALUI", "ReadVICALUV", mx, + forceMergeOpRead=true>; } } @@ -2891,9 +2966,11 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoTiedBinaryV_VM, - SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx>; + SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, + forceMergeOpRead=true>; defm "" : VPseudoTiedBinaryV_XM, - SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx>; + SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, + forceMergeOpRead=true>; } } @@ -2901,11 +2978,14 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VM, - SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, forceMasked=1>; + SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, forceMasked=1, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_XM, - SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, forceMasked=1>; + SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, forceMasked=1, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_IM, - SchedUnary<"WriteVICALUI", "ReadVICALUV", mx, forceMasked=1>; + SchedUnary<"WriteVICALUI", "ReadVICALUV", mx, forceMasked=1, + forceMergeOpRead=true>; } } @@ -2913,9 +2993,11 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VM, - SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, forceMasked=1>; + SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, forceMasked=1, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_XM, - SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, forceMasked=1>; + SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, forceMasked=1, + forceMergeOpRead=true>; } } @@ -2923,11 +3005,14 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VM, - SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx>; + SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_XM, - SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx>; + SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_IM, - SchedUnary<"WriteVICALUI", "ReadVICALUV", mx>; + SchedUnary<"WriteVICALUI", "ReadVICALUV", mx, + forceMergeOpRead=true>; } } @@ -2935,9 +3020,11 @@ foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoBinaryV_VM, - SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx>; + SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_XM, - SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx>; + SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, + forceMergeOpRead=true>; } } @@ -2945,11 +3032,14 @@ foreach m = MxListW in { defvar mx = m.MX; defm "" : VPseudoBinaryV_WV_RM, - SchedBinary<"WriteVNClipV", "ReadVNClipV", "ReadVNClipV", mx>; + SchedBinary<"WriteVNClipV", "ReadVNClipV", "ReadVNClipV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_WX_RM, - SchedBinary<"WriteVNClipX", "ReadVNClipV", "ReadVNClipX", mx>; + SchedBinary<"WriteVNClipX", "ReadVNClipV", "ReadVNClipX", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_WI_RM, - SchedUnary<"WriteVNClipI", "ReadVNClipV", mx>; + SchedUnary<"WriteVNClipI", "ReadVNClipV", mx, + forceMergeOpRead=true>; } } @@ -2957,11 +3047,14 @@ foreach m = MxListW in { defvar mx = m.MX; defm "" : VPseudoBinaryV_WV, - SchedBinary<"WriteVNShiftV", "ReadVNShiftV", "ReadVNShiftV", mx>; + SchedBinary<"WriteVNShiftV", "ReadVNShiftV", "ReadVNShiftV", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_WX, - SchedBinary<"WriteVNShiftX", "ReadVNShiftV", "ReadVNShiftX", mx>; + SchedBinary<"WriteVNShiftX", "ReadVNShiftV", "ReadVNShiftX", mx, + forceMergeOpRead=true>; defm "" : VPseudoBinaryV_WI, - SchedUnary<"WriteVNShiftI", "ReadVNShiftV", mx>; + SchedUnary<"WriteVNShiftI", "ReadVNShiftV", mx, + forceMergeOpRead=true>; } } @@ -3205,7 +3298,7 @@ defvar mx = m.MX; defvar WriteVFWMulAddV_MX = !cast("WriteVFWMulAddV_" # mx); defvar ReadVFWMulAddV_MX = !cast("ReadVFWMulAddV_" # mx); - + // FIXME: should use SchedTernary defm "" : VPseudoTernaryW_VV_RM, Sched<[WriteVFWMulAddV_MX, ReadVFWMulAddV_MX, ReadVFWMulAddV_MX, ReadVFWMulAddV_MX, ReadVMask]>; @@ -3218,6 +3311,7 @@ defvar ReadVFWMulAddV_MX = !cast("ReadVFWMulAddV_" # mx); defvar ReadVFWMulAddF_MX = !cast("ReadVFWMulAddF_" # mx); + // FIXME: should use SchedTernary defm "" : VPseudoTernaryW_VF_RM, Sched<[WriteVFWMulAddF_MX, ReadVFWMulAddV_MX, ReadVFWMulAddF_MX, ReadVFWMulAddV_MX, ReadVMask]>; @@ -3405,42 +3499,48 @@ multiclass VPseudoVCVTI_V { foreach m = MxListF in { defm _V : VPseudoConversion, - SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX>; + SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX, + forceMergeOpRead=true>; } } multiclass VPseudoVCVTI_V_RM { foreach m = MxListF in { defm _V : VPseudoConversionRoundingMode, - SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX>; + SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX, + forceMergeOpRead=true>; } } multiclass VPseudoVCVTI_RM_V { foreach m = MxListF in { defm _V : VPseudoConversionRM, - SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX>; + SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX, + forceMergeOpRead=true>; } } multiclass VPseudoVFROUND_NOEXCEPT_V { foreach m = MxListF in { defm _V : VPseudoConversionNoExcept, - SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX>; + SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX, + forceMergeOpRead=true>; } } multiclass VPseudoVCVTF_V_RM { foreach m = MxListF in { defm _V : VPseudoConversionRoundingMode, - SchedUnary<"WriteVFCvtIToFV", "ReadVFCvtIToFV", m.MX>; + SchedUnary<"WriteVFCvtIToFV", "ReadVFCvtIToFV", m.MX, + forceMergeOpRead=true>; } } multiclass VPseudoVCVTF_RM_V { foreach m = MxListF in { defm _V : VPseudoConversionRM, - SchedUnary<"WriteVFCvtIToFV", "ReadVFCvtIToFV", m.MX>; + SchedUnary<"WriteVFCvtIToFV", "ReadVFCvtIToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3448,7 +3548,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _V : VPseudoConversion, - SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX>; + SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3456,7 +3557,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _V : VPseudoConversionRoundingMode, - SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX>; + SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3464,7 +3566,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _V : VPseudoConversionRM, - SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX>; + SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3472,7 +3575,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { defm _V : VPseudoConversion, - SchedUnary<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV", m.MX>; + SchedUnary<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3480,7 +3584,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _V : VPseudoConversion, - SchedUnary<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV", m.MX>; + SchedUnary<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3488,7 +3593,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { defm _W : VPseudoConversion, - SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX>; + SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3496,7 +3602,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { defm _W : VPseudoConversionRoundingMode, - SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX>; + SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3504,7 +3611,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { defm _W : VPseudoConversionRM, - SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX>; + SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3512,7 +3620,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _W : VPseudoConversionRoundingMode, - SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX>; + SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3520,7 +3629,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _W : VPseudoConversionRM, - SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX>; + SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3528,7 +3638,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _W : VPseudoConversion, - SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX>; + SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3536,7 +3647,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _W : VPseudoConversionRoundingMode, - SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX>; + SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX, + forceMergeOpRead=true>; } }