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 @@ -1916,9 +1916,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>; } } } @@ -1927,10 +1927,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>; } } } @@ -1941,9 +1941,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>; } } } @@ -1953,10 +1955,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>; } } } @@ -1976,10 +1979,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>; } } } @@ -1992,9 +1997,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>; } } } @@ -2137,9 +2143,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>; } } } @@ -2157,7 +2165,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>; } } @@ -2175,9 +2184,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>; } } } @@ -2195,7 +2205,7 @@ defvar mx = m.MX; let VLMul = m.value in { def "_MM_" # mx : VPseudoBinaryNoMask, - SchedBinary<"WriteVMALUV", "ReadVMALUV", "ReadVMALUV", mx>; + SchedBinary<"WriteVMALUV", "ReadVMALUV", "ReadVMALUV", mx>; } } } @@ -2344,10 +2354,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>; } } } @@ -2373,11 +2385,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>; } } } @@ -2390,7 +2405,7 @@ let VLMul = m.value in { def "_" # f.FX # "_" # mx : VPseudoUnaryNoMask, - SchedUnary<"WriteVFMovV", "ReadVFMovF", mx>; + SchedUnary<"WriteVFMovV", "ReadVFMovF", mx, forceMergeOpRead=true>; } } } @@ -2401,10 +2416,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>; } } } @@ -2419,10 +2436,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>; } } } @@ -2432,11 +2452,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>; } } } @@ -2445,11 +2467,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>; } } } @@ -2460,11 +2484,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>; } } } @@ -2475,11 +2499,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>; } } } @@ -2490,11 +2514,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>; } } } @@ -2537,15 +2561,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>; } } } @@ -2554,11 +2579,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>; } } @@ -2567,11 +2594,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>; } } @@ -2579,11 +2608,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>; } } @@ -2591,11 +2622,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>; } } @@ -2603,9 +2636,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>; } } @@ -2613,9 +2648,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>; } } @@ -2623,9 +2660,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>; } } @@ -2665,13 +2704,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>; } } } @@ -2682,14 +2723,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>; } } } @@ -2698,7 +2741,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>; } } } @@ -2706,22 +2750,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>; } } } @@ -2729,13 +2777,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>; } } } @@ -2743,13 +2793,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>; } } } @@ -2757,13 +2809,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>; } } } @@ -2772,7 +2826,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>; } } } @@ -2781,7 +2836,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>; } } } @@ -2790,9 +2846,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>; } } @@ -2800,9 +2857,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>; } } @@ -2816,22 +2875,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>; } } } @@ -2840,22 +2903,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>; } } } @@ -2863,12 +2930,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>; } } } @@ -2879,15 +2948,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>; } } @@ -2895,11 +2967,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>; } } @@ -2907,9 +2982,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>; } } @@ -2917,11 +2994,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>; } } @@ -2929,9 +3009,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>; } } @@ -2939,11 +3021,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>; } } @@ -2951,9 +3036,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>; } } @@ -2961,11 +3048,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>; } } @@ -2973,11 +3063,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>; } } @@ -3228,6 +3321,7 @@ 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]>; @@ -3240,6 +3334,7 @@ defvar ReadVFWMulAddV_MX = !cast("ReadVFWMulAddV_" # mx); defvar ReadVFWMulAddF_MX = !cast("ReadVFWMulAddF_" # mx); + // FIXME: should use SchedTernary defm "" : VPseudoTernaryW_VF_BF_RM, Sched<[WriteVFWMulAddF_MX, ReadVFWMulAddV_MX, ReadVFWMulAddF_MX, ReadVFWMulAddV_MX, ReadVMask]>; @@ -3427,42 +3522,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>; } } @@ -3470,7 +3571,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _V : VPseudoConversion, - SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX>; + SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3478,7 +3580,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _V : VPseudoConversionRoundingMode, - SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX>; + SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3486,7 +3589,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _V : VPseudoConversionRM, - SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX>; + SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3494,7 +3598,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { defm _V : VPseudoConversion, - SchedUnary<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV", m.MX>; + SchedUnary<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3502,7 +3607,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _V : VPseudoConversion, - SchedUnary<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV", m.MX>; + SchedUnary<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3510,7 +3616,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { defm _W : VPseudoConversion, - SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX>; + SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3518,7 +3625,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { defm _W : VPseudoConversionRoundingMode, - SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX>; + SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3526,7 +3634,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListW in { defm _W : VPseudoConversionRM, - SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX>; + SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX, + forceMergeOpRead=true>; } } @@ -3534,7 +3643,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _W : VPseudoConversionRoundingMode, - SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX>; + SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3542,7 +3652,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _W : VPseudoConversionRM, - SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX>; + SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3550,7 +3661,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _W : VPseudoConversion, - SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX>; + SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX, + forceMergeOpRead=true>; } } @@ -3558,7 +3670,8 @@ defvar constraint = "@earlyclobber $rd"; foreach m = MxListFW in { defm _W : VPseudoConversionRoundingMode, - SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX>; + SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX, + forceMergeOpRead=true>; } }