diff --git a/D155932.diff b/D155932.diff new file mode 100644 --- /dev/null +++ b/D155932.diff @@ -0,0 +1,2825 @@ +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 +@@ -98,88 +98,190 @@ + // Scheduling definitions. + //===----------------------------------------------------------------------===// + +-class VMVRSched : Sched<[ +- !cast("WriteVMov" #n #"V"), +- !cast("ReadVMov" #n #"V") +-]>; +- +-class VLESched : Sched<[ +- !cast("WriteVLDE_" #lmul), +- ReadVLDX, ReadVMask +-]>; +- +-class VSESched : Sched<[ +- !cast("WriteVSTE_" #lmul), +- !cast("ReadVSTEV_" #lmul), +- ReadVSTX, ReadVMask +-]>; +- +-class VLSSched : Sched<[ +- !cast("WriteVLDS" #eew #"_" #emul), +- ReadVLDX, ReadVLDSX, ReadVMask +-]>; +- +-class VSSSched : Sched<[ +- !cast("WriteVSTS" #eew #"_" #emul), +- !cast("ReadVSTS" #eew #"V_" #emul), +- ReadVSTX, ReadVSTSX, ReadVMask +-]>; +- +-class VLXSched : Sched<[ +- !cast("WriteVLD" #isOrdered #"X" #dataEEW #"_" #dataEMUL), +- ReadVLDX, +- !cast("ReadVLD" #isOrdered #"XV_" #idxEMUL), ReadVMask +-]>; +- +-class VSXSched : Sched<[ +- !cast("WriteVST" #isOrdered #"X" #dataEEW #"_" #dataEMUL), +- !cast("ReadVST" #isOrdered #"X" #dataEEW #"_" #dataEMUL), +- ReadVSTX, !cast("ReadVST" #isOrdered #"XV_" #idxEMUL), ReadVMask +-]>; +- +-class VLFSched : Sched<[ +- !cast("WriteVLDFF_" #lmul), +- ReadVLDX, ReadVMask +-]>; ++// Common class of scheduling definitions. ++// `ReadVMask` will be appended if instruction is masked. ++// Operands: ++// `writes` SchedWrites that are listed for each explicit def operand ++// in order. ++// `reads` SchedReads that are listed for each explicit use operand. ++// `forceMasked` Forced to be masked (e.g. Add-with-Carry Instructions). ++class SchedCommon writes, list reads, ++ bit forceMasked = 0>: Sched<[]> { ++ defvar isMasked = !ne(!find(NAME, "_MASK"), -1); ++ defvar needReadVMask = !or(forceMasked, isMasked); ++ let SchedRW = !listconcat(writes, reads, ++ !if(needReadVMask, [ReadVMask], [])); ++} ++ ++// 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, ++ write # "_" # mx))], ++ !foreach(read, reads, ++ !cast( ++ !if(sew, read # "_" # mx # "_E" # sew, ++ read # "_" # mx))), ++ forceMasked>; ++ ++// 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 SchedNullaryMC: ++ SchedNullary; ++ ++// For instructions with one operand. ++class SchedUnary: ++ SchedNary; ++class SchedUnaryMC: ++ SchedUnary; ++ ++// For instructions with two operands. ++class SchedBinary: ++ SchedNary; ++class SchedBinaryMC: ++ SchedBinary; ++ ++// For instructions with three operands. ++class SchedTernary: ++ SchedNary; ++ ++// For reduction instructions. ++class SchedReduction: ++ SchedCommon<[!cast(write # "_" # mx # "_E" # sew)], ++ !listsplat(!cast(read), 3)>; ++class SchedReductionMC: ++ SchedCommon<[!cast(write # "_WorstCase")], ++ [!cast(readV), !cast(readV0)], ++ forceMasked=1>; ++ ++// Whole Vector Register Move ++class VMVRSched : SchedCommon< ++ [!cast("WriteVMov" #n #"V")], ++ [!cast("ReadVMov" #n #"V")] ++>; ++ ++// Vector Unit-Stride Loads and Stores ++class VLESched : SchedCommon< ++ [!cast("WriteVLDE_" #lmul)], ++ [ReadVLDX], forceMasked ++>; ++class VLESchedMC : VLESched<"WorstCase", forceMasked=1>; ++ ++class VSESched : SchedCommon< ++ [!cast("WriteVSTE_" #lmul)], ++ [!cast("ReadVSTEV_" #lmul), ReadVSTX], forceMasked ++>; ++class VSESchedMC : VSESched<"WorstCase", forceMasked=1>; ++ ++// Vector Strided Loads and Stores ++class VLSSched : SchedCommon< ++ [!cast("WriteVLDS" #eew #"_" #emul)], ++ [ReadVLDX, ReadVLDSX], forceMasked ++>; ++class VLSSchedMC : VLSSched; ++ ++class VSSSched : SchedCommon< ++ [!cast("WriteVSTS" #eew #"_" #emul)], ++ [!cast("ReadVSTS" #eew #"V_" #emul), ReadVSTX, ReadVSTSX], ++ forceMasked ++>; ++class VSSSchedMC : VSSSched; ++ ++// Vector Indexed Loads and Stores ++class VLXSched : SchedCommon< ++ [!cast("WriteVLD" #isOrdered #"X" #dataEEW #"_" #dataEMUL)], ++ [ReadVLDX, !cast("ReadVLD" #isOrdered #"XV_" #idxEMUL)], ++ forceMasked ++>; ++class VLXSchedMC: ++ VLXSched; ++ ++class VSXSched : SchedCommon< ++ [!cast("WriteVST" #isOrdered #"X" #dataEEW #"_" #dataEMUL)], ++ [!cast("ReadVST" #isOrdered #"X" #dataEEW #"_" #dataEMUL), ++ ReadVSTX, !cast("ReadVST" #isOrdered #"XV_" #idxEMUL)], ++ forceMasked ++>; ++class VSXSchedMC: ++ VSXSched; ++ ++// Unit-stride Fault-Only-First Loads ++class VLFSched : SchedCommon< ++ [!cast("WriteVLDFF_" #lmul)], ++ [ReadVLDX], forceMasked ++>; ++class VLFSchedMC: VLFSched<"WorstCase", forceMasked=1>; + + // Unit-Stride Segment Loads and Stores +-class VLSEGSched : Sched<[ +- !cast("WriteVLSEG" #nf #"e" #eew #"_" #emul), +- ReadVLDX, ReadVMask +-]>; +-class VSSEGSched : Sched<[ +- !cast("WriteVSSEG" #nf #"e" #eew #"_" #emul), +- !cast("ReadVSTEV_" #emul), +- ReadVSTX, ReadVMask +-]>; +-class VLSEGFFSched : Sched<[ +- !cast("WriteVLSEGFF" #nf #"e" #eew #"_" #emul), +- ReadVLDX, ReadVMask +-]>; ++class VLSEGSched : SchedCommon< ++ [!cast("WriteVLSEG" #nf #"e" #eew #"_" #emul)], ++ [ReadVLDX], forceMasked ++>; ++class VLSEGSchedMC : VLSEGSched; ++ ++class VSSEGSched : SchedCommon< ++ [!cast("WriteVSSEG" #nf #"e" #eew #"_" #emul)], ++ [!cast("ReadVSTEV_" #emul), ReadVSTX], forceMasked ++>; ++class VSSEGSchedMC : VSSEGSched; ++ ++class VLSEGFFSched : SchedCommon< ++ [!cast("WriteVLSEGFF" #nf #"e" #eew #"_" #emul)], ++ [ReadVLDX], forceMasked ++>; ++class VLSEGFFSchedMC : VLSEGFFSched; ++ + // Strided Segment Loads and Stores +-class VLSSEGSched : Sched<[ +- !cast("WriteVLSSEG" #nf #"e" #eew #"_" #emul), +- ReadVLDX, ReadVLDSX, ReadVMask +-]>; +-class VSSSEGSched : Sched<[ +- !cast("WriteVSSSEG" #nf #"e" #eew #"_" #emul), +- !cast("ReadVSTS" #eew #"V_" #emul), +- ReadVSTX, ReadVSTSX, ReadVMask +-]>; ++class VLSSEGSched : SchedCommon< ++ [!cast("WriteVLSSEG" #nf #"e" #eew #"_" #emul)], ++ [ReadVLDX, ReadVLDSX], forceMasked ++>; ++class VLSSEGSchedMC : VLSSEGSched; ++ ++class VSSSEGSched : SchedCommon< ++ [!cast("WriteVSSSEG" #nf #"e" #eew #"_" #emul)], ++ [!cast("ReadVSTS" #eew #"V_" #emul), ++ ReadVSTX, ReadVSTSX], forceMasked ++>; ++class VSSSEGSchedMC : VSSSEGSched; ++ + // Indexed Segment Loads and Stores +-class VLXSEGSched : Sched<[ +- !cast("WriteVL" #isOrdered #"XSEG" #nf #"e" #eew #"_" #emul), +- ReadVLDX, !cast("ReadVLD" #isOrdered #"XV_" #emul), ReadVMask +-]>; +-class VSXSEGSched : Sched<[ +- !cast("WriteVS" #isOrdered #"XSEG" #nf #"e" #eew #"_" #emul), +- !cast("ReadVST" #isOrdered #"X" #eew #"_" #emul), +- ReadVSTX, !cast("ReadVST" #isOrdered #"XV_" #emul), ReadVMask +-]>; ++class VLXSEGSched : SchedCommon< ++ [!cast("WriteVL" #isOrdered #"XSEG" #nf #"e" #eew #"_" #emul)], ++ [ReadVLDX, !cast("ReadVLD" #isOrdered #"XV_" #emul)], ++ forceMasked ++>; ++class VLXSEGSchedMC: ++ VLXSEGSched; ++ ++class VSXSEGSched : SchedCommon< ++ [!cast("WriteVS" #isOrdered #"XSEG" #nf #"e" #eew #"_" #emul)], ++ [!cast("ReadVST" #isOrdered #"X" #eew #"_" #emul), ++ ReadVSTX, !cast("ReadVST" #isOrdered #"XV_" #emul)], ++ forceMasked ++>; ++class VSXSEGSchedMC: ++ VSXSEGSched; + + //===----------------------------------------------------------------------===// + // Instruction class templates +@@ -428,36 +530,33 @@ + + def VLUXEI # n # _V : + VIndexedLoad, +- VLXSched; ++ VLXSchedMC; + def VLOXEI # n # _V : + VIndexedLoad, +- VLXSched; ++ VLXSchedMC; + + def VSUXEI # n # _V : + VIndexedStore, +- VSXSched; ++ VSXSchedMC; + def VSOXEI # n # _V : + VIndexedStore, +- VSXSched; ++ VSXSchedMC; + } + } + + multiclass VALU_IV_V funct6> { + def V : VALUVV, +- Sched<[WriteVIALUV_WorstCase, ReadVIALUV_WorstCase, +- ReadVIALUV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIALUV", "ReadVIALUV", "ReadVIALUV">; + } + + multiclass VALU_IV_X funct6> { + def X : VALUVX, +- Sched<[WriteVIALUX_WorstCase, ReadVIALUV_WorstCase, +- ReadVIALUX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIALUX", "ReadVIALUV", "ReadVIALUX">; + } + + multiclass VALU_IV_I funct6> { + def I : VALUVI, +- Sched<[WriteVIALUI_WorstCase, ReadVIALUV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVIALUI", "ReadVIALUV">; + } + + multiclass VALU_IV_V_X_I funct6> +@@ -475,364 +574,302 @@ + + multiclass VALU_MV_V_X funct6, string vw> { + def V : VALUVV, +- Sched<[WriteVIWALUV_WorstCase, ReadVIWALUV_WorstCase, +- ReadVIWALUV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIWALUV", "ReadVIWALUV", "ReadVIWALUV">; + def X : VALUVX, +- Sched<[WriteVIWALUX_WorstCase, ReadVIWALUV_WorstCase, +- ReadVIWALUX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIWALUX", "ReadVIWALUV", "ReadVIWALUX">; + } + + multiclass VMAC_MV_V_X funct6> { + def V : VALUrVV, +- Sched<[WriteVIMulAddV_WorstCase, ReadVIMulAddV_WorstCase, +- ReadVIMulAddV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIMulAddV", "ReadVIMulAddV", "ReadVIMulAddV">; + def X : VALUrVX, +- Sched<[WriteVIMulAddX_WorstCase, ReadVIMulAddV_WorstCase, +- ReadVIMulAddX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIMulAddX", "ReadVIMulAddV", "ReadVIMulAddX">; + } + + multiclass VWMAC_MV_X funct6> { + def X : VALUrVX, +- Sched<[WriteVIWMulAddX_WorstCase, ReadVIWMulAddV_WorstCase, +- ReadVIWMulAddX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIWMulAddX", "ReadVIWMulAddV", "ReadVIWMulAddX">; + } + + multiclass VWMAC_MV_V_X funct6> + : VWMAC_MV_X { + def V : VALUrVV, +- Sched<[WriteVIWMulAddV_WorstCase, ReadVIWMulAddV_WorstCase, +- ReadVIWMulAddV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIWMulAddV", "ReadVIWMulAddV", "ReadVIWMulAddV">; + } + + multiclass VALU_MV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVExtV_WorstCase, ReadVExtV_WorstCase, ReadVMask]>; ++ SchedUnaryMC<"WriteVExtV", "ReadVExtV">; + } + + multiclass VMRG_IV_V_X_I funct6> { + def VM : VALUmVV, +- Sched<[WriteVIMergeV_WorstCase, ReadVIMergeV_WorstCase, +- ReadVIMergeV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIMergeV", "ReadVIMergeV", "ReadVIMergeV">; + def XM : VALUmVX, +- Sched<[WriteVIMergeX_WorstCase, ReadVIMergeV_WorstCase, +- ReadVIMergeX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIMergeX", "ReadVIMergeV", "ReadVIMergeX">; + def IM : VALUmVI, +- Sched<[WriteVIMergeI_WorstCase, ReadVIMergeV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVIMergeI", "ReadVIMergeV">; + } + + multiclass VALUm_IV_V_X funct6> { + def VM : VALUmVV, +- Sched<[WriteVICALUV_WorstCase, ReadVICALUV_WorstCase, +- ReadVICALUV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV">; + def XM : VALUmVX, +- Sched<[WriteVICALUX_WorstCase, ReadVICALUV_WorstCase, +- ReadVICALUX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX">; + } + + multiclass VALUm_IV_V_X_I funct6> + : VALUm_IV_V_X { + def IM : VALUmVI, +- Sched<[WriteVICALUI_WorstCase, ReadVICALUV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVICALUI", "ReadVICALUV">; + } + + multiclass VALUNoVm_IV_V_X funct6> { + def V : VALUVVNoVm, +- Sched<[WriteVICALUV_WorstCase, ReadVICALUV_WorstCase, +- ReadVICALUV_WorstCase]>; ++ SchedBinaryMC<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", ++ forceMasked=0>; + def X : VALUVXNoVm, +- Sched<[WriteVICALUX_WorstCase, ReadVICALUV_WorstCase, +- ReadVICALUX_WorstCase]>; ++ SchedBinaryMC<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", ++ forceMasked=0>; + } + + multiclass VALUNoVm_IV_V_X_I funct6> + : VALUNoVm_IV_V_X { + def I : VALUVINoVm, +- Sched<[WriteVICALUI_WorstCase, ReadVICALUV_WorstCase]>; ++ SchedUnaryMC<"WriteVICALUI", "ReadVICALUV", forceMasked=0>; + } + + multiclass VALU_FV_F funct6> { + def F : VALUVF, +- Sched<[WriteVFALUF_WorstCase, ReadVFALUV_WorstCase, +- ReadVFALUF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF">; + } + + multiclass VALU_FV_V_F funct6> + : VALU_FV_F { + def V : VALUVV, +- Sched<[WriteVFALUV_WorstCase, ReadVFALUV_WorstCase, +- ReadVFALUV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFALUV", "ReadVFALUV", "ReadVFALUV">; + } + + multiclass VWALU_FV_V_F funct6, string vw> { + def V : VALUVV, +- Sched<[WriteVFWALUV_WorstCase, ReadVFWALUV_WorstCase, +- ReadVFWALUV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFWALUV", "ReadVFWALUV", "ReadVFWALUV">; + def F : VALUVF, +- Sched<[WriteVFWALUF_WorstCase, ReadVFWALUV_WorstCase, +- ReadVFWALUF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFWALUF", "ReadVFWALUV", "ReadVFWALUF">; + } + + multiclass VMUL_FV_V_F funct6> { + def V : VALUVV, +- Sched<[WriteVFMulV_WorstCase, ReadVFMulV_WorstCase, +- ReadVFMulV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFMulV", "ReadVFMulV", "ReadVFMulV">; + def F : VALUVF, +- Sched<[WriteVFMulF_WorstCase, ReadVFMulV_WorstCase, +- ReadVFMulF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFMulF", "ReadVFMulV", "ReadVFMulF">; + } + + multiclass VDIV_FV_F funct6> { + def F : VALUVF, +- Sched<[WriteVFDivF_WorstCase, ReadVFDivV_WorstCase, +- ReadVFDivF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFDivF", "ReadVFDivV", "ReadVFDivF">; + } + + multiclass VDIV_FV_V_F funct6> + : VDIV_FV_F { + def V : VALUVV, +- Sched<[WriteVFDivV_WorstCase, ReadVFDivV_WorstCase, +- ReadVFDivV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFDivV", "ReadVFDivV", "ReadVFDivV">; + } + + multiclass VWMUL_FV_V_F funct6> { + def V : VALUVV, +- Sched<[WriteVFWMulV_WorstCase, ReadVFWMulV_WorstCase, +- ReadVFWMulV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFWMulV", "ReadVFWMulV", "ReadVFWMulV">; + def F : VALUVF, +- Sched<[WriteVFWMulF_WorstCase, ReadVFWMulV_WorstCase, +- ReadVFWMulF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFWMulF", "ReadVFWMulV", "ReadVFWMulF">; + } + + multiclass VMAC_FV_V_F funct6> { + def V : VALUrVV, +- Sched<[WriteVFMulAddV_WorstCase, ReadVFMulAddV_WorstCase, +- ReadVFMulAddV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFMulAddV", "ReadVFMulAddV", "ReadVFMulAddV">; + def F : VALUrVF, +- Sched<[WriteVFMulAddF_WorstCase, ReadVFMulAddV_WorstCase, +- ReadVFMulAddF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFMulAddF", "ReadVFMulAddV", "ReadVFMulAddF">; + } + + multiclass VWMAC_FV_V_F funct6> { + def V : VALUrVV, +- Sched<[WriteVFWMulAddV_WorstCase, ReadVFWMulAddV_WorstCase, +- ReadVFWMulAddV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFWMulAddV", "ReadVFWMulAddV", "ReadVFWMulAddV">; + def F : VALUrVF, +- Sched<[WriteVFWMulAddF_WorstCase, ReadVFWMulAddV_WorstCase, +- ReadVFWMulAddF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFWMulAddF", "ReadVFWMulAddV", "ReadVFWMulAddF">; + } + + multiclass VSQR_FV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFSqrtV_WorstCase, ReadVFSqrtV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFSqrtV", "ReadVFSqrtV">; + } + + multiclass VRCP_FV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFRecpV_WorstCase, ReadVFRecpV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFRecpV", "ReadVFRecpV">; + } + + multiclass VMINMAX_FV_V_F funct6> { + def V : VALUVV, +- Sched<[WriteVFMinMaxV_WorstCase, ReadVFMinMaxV_WorstCase, +- ReadVFMinMaxV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFMinMaxV", "ReadVFMinMaxV", "ReadVFMinMaxV">; + def F : VALUVF, +- Sched<[WriteVFMinMaxF_WorstCase, ReadVFMinMaxV_WorstCase, +- ReadVFMinMaxF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFMinMaxF", "ReadVFMinMaxV", "ReadVFMinMaxF">; + } + + multiclass VCMP_FV_F funct6> { + def F : VALUVF, +- Sched<[WriteVFCmpF_WorstCase, ReadVFCmpV_WorstCase, +- ReadVFCmpF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFCmpF", "ReadVFCmpV", "ReadVFCmpF">; + } + + multiclass VCMP_FV_V_F funct6> + : VCMP_FV_F { + def V : VALUVV, +- Sched<[WriteVFCmpV_WorstCase, ReadVFCmpV_WorstCase, +- ReadVFCmpV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFCmpV", "ReadVFCmpV", "ReadVFCmpV">; + } + + multiclass VSGNJ_FV_V_F funct6> { + def V : VALUVV, +- Sched<[WriteVFSgnjV_WorstCase, ReadVFSgnjV_WorstCase, +- ReadVFSgnjV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFSgnjV", "ReadVFSgnjV", "ReadVFSgnjV">; + def F : VALUVF, +- Sched<[WriteVFSgnjF_WorstCase, ReadVFSgnjV_WorstCase, +- ReadVFSgnjF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFSgnjF", "ReadVFSgnjV", "ReadVFSgnjF">; + } + + multiclass VCLS_FV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFClassV_WorstCase, ReadVFClassV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFClassV", "ReadVFClassV">; + } + + multiclass VCVTF_IV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFCvtIToFV_WorstCase, ReadVFCvtIToFV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFCvtIToFV", "ReadVFCvtIToFV">; + } + + multiclass VCVTI_FV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFCvtFToIV_WorstCase, ReadVFCvtFToIV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFCvtFToIV", "ReadVFCvtFToIV">; + } + + multiclass VWCVTF_IV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFWCvtIToFV_WorstCase, ReadVFWCvtIToFV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV">; + } + + multiclass VWCVTI_FV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFWCvtFToIV_WorstCase, ReadVFWCvtFToIV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV">; + } + + multiclass VWCVTF_FV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFWCvtFToFV_WorstCase, ReadVFWCvtFToFV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV">; + } + + multiclass VNCVTF_IV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFNCvtIToFV_WorstCase, ReadVFNCvtIToFV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV">; + } + + multiclass VNCVTI_FV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFNCvtFToIV_WorstCase, ReadVFNCvtFToIV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV">; + } + + multiclass VNCVTF_FV_VS2 funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVFNCvtFToFV_WorstCase, ReadVFNCvtFToFV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV">; + } + + multiclass VRED_MV_V funct6> { + def _VS : VALUVV, +- Sched<[WriteVIRedV_From_WorstCase, ReadVIRedV, ReadVIRedV0, +- ReadVMask]>; ++ SchedReductionMC<"WriteVIRedV_From", "ReadVIRedV", "ReadVIRedV0">; + } + + multiclass VREDMINMAX_MV_V funct6> { + def _VS : VALUVV, +- Sched<[WriteVIRedMinMaxV_From_WorstCase, ReadVIRedV, ReadVIRedV0, +- ReadVMask]>; ++ SchedReductionMC<"WriteVIRedMinMaxV_From", "ReadVIRedV", "ReadVIRedV0">; + } + + multiclass VWRED_IV_V funct6> { + def _VS : VALUVV, +- Sched<[WriteVIWRedV_From_WorstCase, ReadVIWRedV, ReadVIWRedV0, +- ReadVMask]>; ++ SchedReductionMC<"WriteVIWRedV_From", "ReadVIWRedV", "ReadVIWRedV0">; + } + + multiclass VRED_FV_V funct6> { + def _VS : VALUVV, +- Sched<[WriteVFRedV_From_WorstCase, ReadVFRedV, ReadVFRedV0, +- ReadVMask]>; ++ SchedReductionMC<"WriteVFRedV_From", "ReadVFRedV", "ReadVFRedV0">; + } + + multiclass VREDMINMAX_FV_V funct6> { + def _VS : VALUVV, +- Sched<[WriteVFRedMinMaxV_From_WorstCase, ReadVFRedV, ReadVFRedV0, +- ReadVMask]>; ++ SchedReductionMC<"WriteVFRedMinMaxV_From", "ReadVFRedV", "ReadVFRedV0">; + } + + multiclass VREDO_FV_V funct6> { + def _VS : VALUVV, +- Sched<[WriteVFRedOV_From_WorstCase, ReadVFRedOV, ReadVFRedOV0, +- ReadVMask]>; ++ SchedReductionMC<"WriteVFRedOV_From", "ReadVFRedOV", "ReadVFRedOV0">; + } + + multiclass VWRED_FV_V funct6> { + def _VS : VALUVV, +- Sched<[WriteVFWRedV_From_WorstCase, ReadVFWRedV, ReadVFWRedV0, +- ReadVMask]>; ++ SchedReductionMC<"WriteVFWRedV_From", "ReadVFWRedV", "ReadVFWRedV0">; + } + + multiclass VWREDO_FV_V funct6> { + def _VS : VALUVV, +- Sched<[WriteVFWRedOV_From_WorstCase, ReadVFWRedOV, ReadVFWRedOV0, +- ReadVMask]>; ++ SchedReductionMC<"WriteVFWRedOV_From", "ReadVFWRedOV", "ReadVFWRedOV0">; + } + + multiclass VMALU_MV_Mask funct6, string vm = "v"> { + def M : VALUVVNoVm, +- Sched<[WriteVMALUV_WorstCase, ReadVMALUV_WorstCase, +- ReadVMALUV_WorstCase]>; ++ SchedBinaryMC<"WriteVMALUV", "ReadVMALUV", "ReadVMALUV", ++ forceMasked=0>; + } + + multiclass VMSFS_MV_V funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVMSFSV_WorstCase, ReadVMSFSV_WorstCase, ReadVMask]>; ++ SchedUnaryMC<"WriteVMSFSV", "ReadVMSFSV">; + } + + multiclass VMIOT_MV_V funct6, bits<5> vs1> { + def "" : VALUVs2, +- Sched<[WriteVMIotV_WorstCase, ReadVMIotV_WorstCase, ReadVMask]>; ++ SchedUnaryMC<"WriteVMIotV", "ReadVMIotV">; + } + + multiclass VSHT_IV_V_X_I funct6> { + def V : VALUVV, +- Sched<[WriteVShiftV_WorstCase, ReadVShiftV_WorstCase, +- ReadVShiftV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVShiftV", "ReadVShiftV", "ReadVShiftV">; + def X : VALUVX, +- Sched<[WriteVShiftX_WorstCase, ReadVShiftV_WorstCase, +- ReadVShiftX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVShiftX", "ReadVShiftV", "ReadVShiftX">; + def I : VALUVI, +- Sched<[WriteVShiftI_WorstCase, ReadVShiftV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVShiftI", "ReadVShiftV">; + } + + multiclass VNSHT_IV_V_X_I funct6> { + def V : VALUVV, +- Sched<[WriteVNShiftV_WorstCase, ReadVNShiftV_WorstCase, +- ReadVNShiftV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVNShiftV", "ReadVNShiftV", "ReadVNShiftV">; + def X : VALUVX, +- Sched<[WriteVNShiftX_WorstCase, ReadVNShiftV_WorstCase, +- ReadVNShiftX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVNShiftX", "ReadVNShiftV", "ReadVNShiftX">; + def I : VALUVI, +- Sched<[WriteVNShiftI_WorstCase, ReadVNShiftV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVNShiftI", "ReadVNShiftV">; + } + + multiclass VMINMAX_IV_V_X funct6> { + def V : VALUVV, +- Sched<[WriteVIMinMaxV_WorstCase, ReadVIMinMaxV_WorstCase, +- ReadVIMinMaxV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIMinMaxV", "ReadVIMinMaxV", "ReadVIMinMaxV">; + def X : VALUVX, +- Sched<[WriteVIMinMaxX_WorstCase, ReadVIMinMaxV_WorstCase, +- ReadVIMinMaxX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIMinMaxX", "ReadVIMinMaxV", "ReadVIMinMaxX">; + } + + multiclass VCMP_IV_V funct6> { + def V : VALUVV, +- Sched<[WriteVICmpV_WorstCase, ReadVICmpV_WorstCase, +- ReadVICmpV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVICmpV", "ReadVICmpV", "ReadVICmpV">; + } + + multiclass VCMP_IV_X funct6> { + def X : VALUVX, +- Sched<[WriteVICmpX_WorstCase, ReadVICmpV_WorstCase, +- ReadVICmpX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVICmpX", "ReadVICmpV", "ReadVICmpX">; + } + + multiclass VCMP_IV_I funct6> { + def I : VALUVI, +- Sched<[WriteVICmpI_WorstCase, ReadVICmpV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVICmpI", "ReadVICmpV">; + } + + multiclass VCMP_IV_V_X_I funct6> +@@ -850,126 +887,101 @@ + + multiclass VMUL_MV_V_X funct6> { + def V : VALUVV, +- Sched<[WriteVIMulV_WorstCase, ReadVIMulV_WorstCase, +- ReadVIMulV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIMulV", "ReadVIMulV", "ReadVIMulV">; + def X : VALUVX, +- Sched<[WriteVIMulX_WorstCase, ReadVIMulV_WorstCase, +- ReadVIMulX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIMulX", "ReadVIMulV", "ReadVIMulX">; + } + + multiclass VWMUL_MV_V_X funct6> { + def V : VALUVV, +- Sched<[WriteVIWMulV_WorstCase, ReadVIWMulV_WorstCase, +- ReadVIWMulV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIWMulV", "ReadVIWMulV", "ReadVIWMulV">; + def X : VALUVX, +- Sched<[WriteVIWMulX_WorstCase, ReadVIWMulV_WorstCase, +- ReadVIWMulX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIWMulX", "ReadVIWMulV", "ReadVIWMulX">; + } + + multiclass VDIV_MV_V_X funct6> { + def V : VALUVV, +- Sched<[WriteVIDivV_WorstCase, ReadVIDivV_WorstCase, +- ReadVIDivV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIDivV", "ReadVIDivV", "ReadVIDivV">; + def X : VALUVX, +- Sched<[WriteVIDivX_WorstCase, ReadVIDivV_WorstCase, +- ReadVIDivX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVIDivX", "ReadVIDivV", "ReadVIDivX">; + } + + multiclass VSALU_IV_V_X funct6> { + def V : VALUVV, +- Sched<[WriteVSALUV_WorstCase, ReadVSALUV_WorstCase, +- ReadVSALUV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVSALUV", "ReadVSALUV", "ReadVSALUV">; + def X : VALUVX, +- Sched<[WriteVSALUX_WorstCase, ReadVSALUV_WorstCase, +- ReadVSALUX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVSALUX", "ReadVSALUV", "ReadVSALUX">; + } + + multiclass VSALU_IV_V_X_I funct6> + : VSALU_IV_V_X { + def I : VALUVI, +- Sched<[WriteVSALUI_WorstCase, ReadVSALUV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVSALUI", "ReadVSALUV">; + } + + multiclass VAALU_MV_V_X funct6> { + def V : VALUVV, +- Sched<[WriteVAALUV_WorstCase, ReadVAALUV_WorstCase, +- ReadVAALUV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVAALUV", "ReadVAALUV", "ReadVAALUV">; + def X : VALUVX, +- Sched<[WriteVAALUX_WorstCase, ReadVAALUV_WorstCase, +- ReadVAALUX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVAALUX", "ReadVAALUV", "ReadVAALUX">; + } + + multiclass VSMUL_IV_V_X funct6> { + def V : VALUVV, +- Sched<[WriteVSMulV_WorstCase, ReadVSMulV_WorstCase, +- ReadVSMulV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVSMulV", "ReadVSMulV", "ReadVSMulV">; + def X : VALUVX, +- Sched<[WriteVSMulX_WorstCase, ReadVSMulV_WorstCase, +- ReadVSMulX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVSMulX", "ReadVSMulV", "ReadVSMulX">; + } + + multiclass VSSHF_IV_V_X_I funct6> { + def V : VALUVV, +- Sched<[WriteVSShiftV_WorstCase, ReadVSShiftV_WorstCase, +- ReadVSShiftV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVSShiftV", "ReadVSShiftV", "ReadVSShiftV">; + def X : VALUVX, +- Sched<[WriteVSShiftX_WorstCase, ReadVSShiftV_WorstCase, +- ReadVSShiftX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVSShiftX", "ReadVSShiftV", "ReadVSShiftX">; + def I : VALUVI, +- Sched<[WriteVSShiftI_WorstCase, ReadVSShiftV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVSShiftI", "ReadVSShiftV">; + } + + multiclass VNCLP_IV_V_X_I funct6> { + def V : VALUVV, +- Sched<[WriteVNClipV_WorstCase, ReadVNClipV_WorstCase, +- ReadVNClipV_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVNClipV", "ReadVNClipV", "ReadVNClipV">; + def X : VALUVX, +- Sched<[WriteVNClipX_WorstCase, ReadVNClipV_WorstCase, +- ReadVNClipX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVNClipX", "ReadVNClipV", "ReadVNClipX">; + def I : VALUVI, +- Sched<[WriteVNClipI_WorstCase, ReadVNClipV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVNClipI", "ReadVNClipV">; + } + + multiclass VSLD_IV_X_I funct6> { + def X : VALUVX, +- Sched<[WriteVISlideX_WorstCase, ReadVISlideV_WorstCase, +- ReadVISlideX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVISlideX", "ReadVISlideV", "ReadVISlideX">; + def I : VALUVI, +- Sched<[WriteVISlideI_WorstCase, ReadVISlideV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVISlideI", "ReadVISlideV">; + } + + multiclass VSLD1_MV_X funct6> { + def X : VALUVX, +- Sched<[WriteVISlide1X_WorstCase, ReadVISlideV_WorstCase, +- ReadVISlideX_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVISlide1X", "ReadVISlideV", "ReadVISlideX">; + } + + multiclass VSLD1_FV_F funct6> { + def F : VALUVF, +- Sched<[WriteVFSlide1F_WorstCase, ReadVFSlideV_WorstCase, +- ReadVFSlideF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFSlide1F", "ReadVFSlideV", "ReadVFSlideF">; + } + + multiclass VGTR_IV_V_X_I funct6> { + def V : VALUVV, +- Sched<[WriteVRGatherVV_WorstCase, ReadVRGatherVV_data_WorstCase, +- ReadVRGatherVV_index_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVRGatherVV", "ReadVRGatherVV_data", ++ "ReadVRGatherVV_index">; + def X : VALUVX, +- Sched<[WriteVRGatherVX_WorstCase, ReadVRGatherVX_data_WorstCase, +- ReadVRGatherVX_index_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVRGatherVX", "ReadVRGatherVX_data", ++ "ReadVRGatherVX_index">; + def I : VALUVI, +- Sched<[WriteVRGatherVI_WorstCase, ReadVRGatherVI_data_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVRGatherVI", "ReadVRGatherVI_data">; + } + + multiclass VCPR_MV_Mask funct6, string vm = "v"> { + def M : VALUVVNoVm, +- Sched<[WriteVCompressV_WorstCase, ReadVCompressV_WorstCase, +- ReadVCompressV_WorstCase]>; ++ SchedBinaryMC<"WriteVCompressV", "ReadVCompressV", "ReadVCompressV">; + } + + multiclass VWholeLoadN nf, string opcodestr, RegisterClass VRC> { +@@ -1007,15 +1019,15 @@ + defvar w = !cast("LSWidth" # eew); + + // Vector Unit-Stride Instructions +- def VLE#eew#_V : VUnitStrideLoad, VLESched; +- def VSE#eew#_V : VUnitStrideStore, VSESched; ++ def VLE#eew#_V : VUnitStrideLoad, VLESchedMC; ++ def VSE#eew#_V : VUnitStrideStore, VSESchedMC; + + // Vector Unit-Stride Fault-only-First Loads +- def VLE#eew#FF_V : VUnitStrideLoadFF, VLFSched; ++ def VLE#eew#FF_V : VUnitStrideLoadFF, VLFSchedMC; + + // Vector Strided Instructions +- def VLSE#eew#_V : VStridedLoad, VLSSched; +- def VSSE#eew#_V : VStridedStore, VSSSched; ++ def VLSE#eew#_V : VStridedLoad, VLSSchedMC; ++ def VSSE#eew#_V : VStridedStore, VSSSchedMC; + } + + defm "" : VIndexLoadStore<[8, 16, 32]>; +@@ -1054,19 +1066,19 @@ + let Predicates = [HasVInstructionsI64] in { + // Vector Unit-Stride Instructions + def VLE64_V : VUnitStrideLoad, +- VLESched; ++ VLESchedMC; + + def VLE64FF_V : VUnitStrideLoadFF, +- VLFSched; ++ VLFSchedMC; + + def VSE64_V : VUnitStrideStore, +- VSESched; ++ VSESchedMC; + // Vector Strided Instructions + def VLSE64_V : VStridedLoad, +- VLSSched<32>; ++ VLSSchedMC<32>; + + def VSSE64_V : VStridedStore, +- VSSSched<64>; ++ VSSSchedMC<64>; + + defm VL1R: VWholeLoadEEW64<0, "vl1r", VR, WriteVLD1R>; + defm VL2R: VWholeLoadEEW64<1, "vl2r", VRM2, WriteVLD2R>; +@@ -1284,15 +1296,15 @@ + // op vd, vs1 + def VMV_V_V : RVInstVV<0b010111, OPIVV, (outs VR:$vd), + (ins VR:$vs1), "vmv.v.v", "$vd, $vs1">, +- Sched<[WriteVIMovV_WorstCase, ReadVIMovV_WorstCase]>; ++ SchedUnaryMC<"WriteVIMovV", "ReadVIMovV", forceMasked=0>; + // op vd, rs1 + def VMV_V_X : RVInstVX<0b010111, OPIVX, (outs VR:$vd), + (ins GPR:$rs1), "vmv.v.x", "$vd, $rs1">, +- Sched<[WriteVIMovX_WorstCase, ReadVIMovX_WorstCase]>; ++ SchedUnaryMC<"WriteVIMovX", "ReadVIMovX", forceMasked=0>; + // op vd, imm + def VMV_V_I : RVInstIVI<0b010111, (outs VR:$vd), + (ins simm5:$imm), "vmv.v.i", "$vd, $imm">, +- Sched<[WriteVIMovI_WorstCase]>; ++ SchedNullaryMC<"WriteVIMovI", forceMasked=0>; + } // hasSideEffects = 0, mayLoad = 0, mayStore = 0 + + // Vector Fixed-Point Arithmetic Instructions +@@ -1435,15 +1447,14 @@ + def VFMERGE_VFM : RVInstVX<0b010111, OPFVF, (outs VR:$vd), + (ins VR:$vs2, FPR32:$rs1, VMV0:$v0), + "vfmerge.vfm", "$vd, $vs2, $rs1, v0">, +- Sched<[WriteVFMergeV_WorstCase, ReadVFMergeV_WorstCase, +- ReadVFMergeF_WorstCase, ReadVMask]>; ++ SchedBinaryMC<"WriteVFMergeV", "ReadVFMergeV", "ReadVFMergeF">; + + // Vector Floating-Point Move Instruction + let RVVConstraint = NoConstraint in + let vm = 1, vs2 = 0 in + def VFMV_V_F : RVInstVX<0b010111, OPFVF, (outs VR:$vd), + (ins FPR32:$rs1), "vfmv.v.f", "$vd, $rs1">, +- Sched<[WriteVFMovV_WorstCase, ReadVFMovF_WorstCase]>; ++ SchedUnaryMC<"WriteVFMovV", "ReadVFMovF", forceMasked=0>; + + } // hasSideEffects = 0, mayLoad = 0, mayStore = 0 + +@@ -1584,15 +1595,13 @@ + def VCPOP_M : RVInstV<0b010000, 0b10000, OPMVV, (outs GPR:$vd), + (ins VR:$vs2, VMaskOp:$vm), + "vcpop.m", "$vd, $vs2$vm">, +- Sched<[WriteVMPopV_WorstCase, ReadVMPopV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVMPopV", "ReadVMPopV">; + + // vfirst find-first-set mask bit + def VFIRST_M : RVInstV<0b010000, 0b10001, OPMVV, (outs GPR:$vd), + (ins VR:$vs2, VMaskOp:$vm), + "vfirst.m", "$vd, $vs2$vm">, +- Sched<[WriteVMFFSV_WorstCase, ReadVMFFSV_WorstCase, +- ReadVMask]>; ++ SchedUnaryMC<"WriteVMFFSV", "ReadVMFFSV">; + + } // hasSideEffects = 0, mayLoad = 0, mayStore = 0 + +@@ -1618,7 +1627,7 @@ + let vs2 = 0 in + def VID_V : RVInstV<0b010100, 0b10001, OPMVV, (outs VR:$vd), + (ins VMaskOp:$vm), "vid.v", "$vd$vm">, +- Sched<[WriteVMIdxV_WorstCase, ReadVMask]>; ++ SchedNullaryMC<"WriteVMIdxV">; + + // Integer Scalar Move Instructions + let vm = 1, RVVConstraint = NoConstraint in { +@@ -1674,8 +1683,8 @@ + let Constraints = "@earlyclobber $vd", RVVConstraint = Vrgather in { + defm VRGATHER_V : VGTR_IV_V_X_I<"vrgather", 0b001100>; + def VRGATHEREI16_VV : VALUVV<0b001110, OPIVV, "vrgatherei16.vv">, +- Sched<[WriteVRGatherVV_WorstCase, ReadVRGatherVV_data_WorstCase, +- ReadVRGatherVV_index_WorstCase]>; ++ SchedBinaryMC<"WriteVRGatherVV", "ReadVRGatherVV_data", ++ "ReadVRGatherVV_index">; + } // Constraints = "@earlyclobber $vd", RVVConstraint = Vrgather + + // Vector Compress Instruction +@@ -1705,38 +1714,38 @@ + + def VLSEG#nf#E#eew#_V : + VUnitStrideSegmentLoad, +- VLSEGSched; ++ VLSEGSchedMC; + def VLSEG#nf#E#eew#FF_V : + VUnitStrideSegmentLoadFF, +- VLSEGFFSched; ++ VLSEGFFSchedMC; + def VSSEG#nf#E#eew#_V : + VUnitStrideSegmentStore, +- VSSEGSched; ++ VSSEGSchedMC; + // Vector Strided Instructions + def VLSSEG#nf#E#eew#_V : + VStridedSegmentLoad, +- VLSSEGSched; ++ VLSSEGSchedMC; + def VSSSEG#nf#E#eew#_V : + VStridedSegmentStore, +- VSSSEGSched; ++ VSSSEGSchedMC; + + // Vector Indexed Instructions + def VLUXSEG#nf#EI#eew#_V : + VIndexedSegmentLoad, +- VLXSEGSched; ++ VLXSEGSchedMC; + def VLOXSEG#nf#EI#eew#_V : + VIndexedSegmentLoad, +- VLXSEGSched; ++ VLXSEGSchedMC; + def VSUXSEG#nf#EI#eew#_V : + VIndexedSegmentStore, +- VSXSEGSched; ++ VSXSEGSchedMC; + def VSOXSEG#nf#EI#eew#_V : + VIndexedSegmentStore, +- VSXSEGSched; ++ VSXSEGSchedMC; + } + } + } // Predicates = [HasVInstructions] +@@ -1746,21 +1755,21 @@ + // Vector Unit-strided Segment Instructions + def VLSEG#nf#E64_V : + VUnitStrideSegmentLoad, +- VLSEGSched; ++ VLSEGSchedMC; + def VLSEG#nf#E64FF_V : + VUnitStrideSegmentLoadFF, +- VLSEGFFSched; ++ VLSEGFFSchedMC; + def VSSEG#nf#E64_V : + VUnitStrideSegmentStore, +- VSSEGSched; ++ VSSEGSchedMC; + + // Vector Strided Segment Instructions + def VLSSEG#nf#E64_V : + VStridedSegmentLoad, +- VLSSEGSched; ++ VLSSEGSchedMC; + def VSSSEG#nf#E64_V : + VStridedSegmentStore, +- VSSSEGSched; ++ VSSSEGSchedMC; + } + } // Predicates = [HasVInstructionsI64] + let Predicates = [HasVInstructionsI64, IsRV64] in { +@@ -1769,19 +1778,19 @@ + def VLUXSEG #nf #EI64_V + : VIndexedSegmentLoad, +- VLXSEGSched; ++ VLXSEGSchedMC; + def VLOXSEG #nf #EI64_V + : VIndexedSegmentLoad, +- VLXSEGSched; ++ VLXSEGSchedMC; + def VSUXSEG #nf #EI64_V + : VIndexedSegmentStore, +- VSXSEGSched; ++ VSXSEGSchedMC; + def VSOXSEG #nf #EI64_V + : VIndexedSegmentStore, +- VSXSEGSched; ++ VSXSEGSchedMC; + } + } // Predicates = [HasVInstructionsI64, IsRV64] + +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 +@@ -1871,13 +1871,11 @@ + multiclass VPseudoVPOP_M { + foreach mti = AllMasks in { + defvar mx = mti.LMul.MX; +- defvar WriteVMPopV_MX = !cast("WriteVMPopV_" # mx); +- defvar ReadVMPopV_MX = !cast("ReadVMPopV_" # mx); + let VLMul = mti.LMul.value in { + def "_M_" # mti.BX : VPseudoUnaryNoMaskGPROut, +- Sched<[WriteVMPopV_MX, ReadVMPopV_MX, ReadVMPopV_MX]>; ++ SchedBinary<"WriteVMPopV", "ReadVMPopV", "ReadVMPopV", mx>; + def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMaskGPROut, +- Sched<[WriteVMPopV_MX, ReadVMPopV_MX, ReadVMPopV_MX]>; ++ SchedBinary<"WriteVMPopV", "ReadVMPopV", "ReadVMPopV", mx>; + } + } + } +@@ -1885,13 +1883,11 @@ + multiclass VPseudoV1ST_M { + foreach mti = AllMasks in { + defvar mx = mti.LMul.MX; +- defvar WriteVMFFSV_MX = !cast("WriteVMFFSV_" # mx); +- defvar ReadVMFFSV_MX = !cast("ReadVMFFSV_" # mx); + let VLMul = mti.LMul.value in { + def "_M_" # mti.BX : VPseudoUnaryNoMaskGPROut, +- Sched<[WriteVMFFSV_MX, ReadVMFFSV_MX, ReadVMFFSV_MX]>; ++ SchedBinary<"WriteVMFFSV", "ReadVMFFSV", "ReadVMFFSV", mx>; + def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMaskGPROut, +- Sched<[WriteVMFFSV_MX, ReadVMFFSV_MX, ReadVMFFSV_MX]>; ++ SchedBinary<"WriteVMFFSV", "ReadVMFFSV", "ReadVMFFSV", mx>; + } + } + } +@@ -1900,13 +1896,11 @@ + defvar constraint = "@earlyclobber $rd"; + foreach mti = AllMasks in { + defvar mx = mti.LMul.MX; +- defvar WriteVMSFSV_MX = !cast("WriteVMSFSV_" # mx); +- defvar ReadVMSFSV_MX = !cast("ReadVMSFSV_" # mx); + let VLMul = mti.LMul.value in { + def "_M_" # mti.BX : VPseudoUnaryNoMask, +- Sched<[WriteVMSFSV_MX, ReadVMSFSV_MX, ReadVMask]>; ++ SchedUnary<"WriteVMSFSV", "ReadVMSFSV", mx>; + def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMask, +- Sched<[WriteVMSFSV_MX, ReadVMSFSV_MX, ReadVMask]>; ++ SchedUnary<"WriteVMSFSV", "ReadVMSFSV", mx>; + } + } + } +@@ -1914,28 +1908,21 @@ + multiclass VPseudoVID_V { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVMIdxV_MX = !cast("WriteVMIdxV_" # mx); +- defvar ReadVMIdxV_MX = !cast("ReadVMIdxV_" # mx); +- + let VLMul = m.value in { +- def "_V_" # m.MX : VPseudoNullaryNoMask, +- Sched<[WriteVMIdxV_MX, ReadVMask]>; +- def "_V_" # m.MX # "_MASK" : VPseudoNullaryMask, ++ def "_V_" # mx : VPseudoNullaryNoMask, ++ SchedNullary<"WriteVMIdxV", mx>; ++ def "_V_" # mx # "_MASK" : VPseudoNullaryMask, + RISCVMaskedPseudo, +- Sched<[WriteVMIdxV_MX, ReadVMask]>; ++ SchedNullary<"WriteVMIdxV", mx>; + } + } + } + + multiclass VPseudoNullaryPseudoM { + foreach mti = AllMasks in { +- defvar mx = mti.LMul.MX; +- defvar WriteVMALUV_MX = !cast("WriteVMALUV_" # mx); +- defvar ReadVMALUV_MX = !cast("ReadVMALUV_" # mx); +- + let VLMul = mti.LMul.value in { + def "_M_" # mti.BX : VPseudoNullaryPseudoM, +- Sched<[WriteVMALUV_MX, ReadVMALUV_MX, ReadVMALUV_MX]>; ++ SchedBinary<"WriteVMALUV", "ReadVMALUV", "ReadVMALUV", mti.LMul.MX>; + } + } + } +@@ -1944,14 +1931,12 @@ + defvar constraint = "@earlyclobber $rd"; + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVMIotV_MX = !cast("WriteVMIotV_" # mx); +- defvar ReadVMIotV_MX = !cast("ReadVMIotV_" # mx); + let VLMul = m.value in { +- def "_" # m.MX : VPseudoUnaryNoMask, +- Sched<[WriteVMIotV_MX, ReadVMIotV_MX, ReadVMask]>; +- def "_" # m.MX # "_MASK" : VPseudoUnaryMask, ++ def "_" # mx : VPseudoUnaryNoMask, ++ SchedUnary<"WriteVMIotV", "ReadVMIotV", mx>; ++ def "_" # mx # "_MASK" : VPseudoUnaryMask, + RISCVMaskedPseudo, +- Sched<[WriteVMIotV_MX, ReadVMIotV_MX, ReadVMask]>; ++ SchedUnary<"WriteVMIotV", "ReadVMIotV", mx>; + } + } + } +@@ -1963,12 +1948,10 @@ + let VLMul = m.value in + foreach e = sews in { + defvar suffix = "_" # m.MX # "_E" # e; +- defvar WriteVCompressV_MX_E = !cast("WriteVCompressV" # suffix); +- defvar ReadVCompressV_MX_E = !cast("ReadVCompressV" # suffix); +- + let SEW = e in + def _VM # suffix : VPseudoUnaryAnyMask, +- Sched<[WriteVCompressV_MX_E, ReadVCompressV_MX_E, ReadVCompressV_MX_E]>; ++ SchedBinary<"WriteVCompressV", "ReadVCompressV", "ReadVCompressV", ++ mx, e>; + } + } + } +@@ -2098,11 +2081,9 @@ + defvar emul = !cast("V_" # emulMX); + defvar sews = SchedSEWSet.val; + foreach e = sews in { +- defvar WriteVRGatherVV_MX_E = !cast("WriteVRGatherVV_" # mx # "_E" # e); +- defvar ReadVRGatherVV_data_MX_E = !cast("ReadVRGatherVV_data_" # mx # "_E" # e); +- defvar ReadVRGatherVV_index_MX_E = !cast("ReadVRGatherVV_index_" # mx # "_E" # e); + defm _VV : VPseudoBinaryEmul, +- Sched<[WriteVRGatherVV_MX_E, ReadVRGatherVV_data_MX_E, ReadVRGatherVV_index_MX_E]>; ++ SchedBinary<"WriteVRGatherVV", "ReadVRGatherVV_data", "ReadVRGatherVV_index", ++ mx, e>; + } + } + } +@@ -2119,13 +2100,8 @@ + + multiclass VPseudoVSLD1_VX { + foreach m = MxList in { +- defvar mx = m.MX; +- defvar WriteVISlide1X_MX = !cast("WriteVISlide1X_" # mx); +- defvar ReadVISlideV_MX = !cast("ReadVISlideV_" # mx); +- defvar ReadVISlideX_MX = !cast("ReadVISlideX_" # mx); +- + defm "_VX" : VPseudoBinary, +- Sched<[WriteVISlide1X_MX, ReadVISlideV_MX, ReadVISlideX_MX, ReadVMask]>; ++ SchedBinary<"WriteVISlide1X", "ReadVISlideV", "ReadVISlideX", m.MX>; + } + } + +@@ -2143,14 +2119,9 @@ + multiclass VPseudoVSLD1_VF { + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFSlide1F_MX = !cast("WriteVFSlide1F_" # mx); +- defvar ReadVFSlideV_MX = !cast("ReadVFSlideV_" # mx); +- defvar ReadVFSlideF_MX = !cast("ReadVFSlideF_" # mx); +- + defm "_V" # f.FX : + VPseudoBinary, +- Sched<[WriteVFSlide1F_MX, ReadVFSlideV_MX, ReadVFSlideF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFSlide1F", "ReadVFSlideV", "ReadVFSlideF", m.MX>; + } + } + } +@@ -2166,12 +2137,9 @@ + multiclass VPseudoVALU_MM { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVMALUV_MX = !cast("WriteVMALUV_" # mx); +- defvar ReadVMALUV_MX = !cast("ReadVMALUV_" # mx); +- + let VLMul = m.value in { + def "_MM_" # mx : VPseudoBinaryNoMask, +- Sched<[WriteVMALUV_MX, ReadVMALUV_MX, ReadVMALUV_MX]>; ++ SchedBinary<"WriteVMALUV", "ReadVMALUV", "ReadVMALUV", mx>; + } + } + } +@@ -2315,14 +2283,10 @@ + foreach f = FPList in { + foreach m = f.MxList in { + defvar mx = m.MX; +- defvar WriteVFMergeV_MX = !cast("WriteVFMergeV_" # mx); +- defvar ReadVFMergeV_MX = !cast("ReadVFMergeV_" # mx); +- defvar ReadVFMergeF_MX = !cast("ReadVFMergeF_" # mx); +- + def "_V" # f.FX # "M_" # mx: + VPseudoTiedBinaryCarryIn.R, + m.vrclass, f.fprclass, m, CarryIn=1, Constraint="">, +- Sched<[WriteVFMergeV_MX, ReadVFMergeV_MX, ReadVFMergeF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFMergeV", "ReadVFMergeV", "ReadVFMergeF", mx, forceMasked=1>; + } + } + } +@@ -2346,19 +2310,13 @@ + foreach m = MxList in { + let VLMul = m.value in { + defvar mx = m.MX; +- defvar WriteVIMovV_MX = !cast("WriteVIMovV_" # mx); +- defvar WriteVIMovX_MX = !cast("WriteVIMovX_" # mx); +- defvar WriteVIMovI_MX = !cast("WriteVIMovI_" # mx); +- defvar ReadVIMovV_MX = !cast("ReadVIMovV_" # mx); +- defvar ReadVIMovX_MX = !cast("ReadVIMovX_" # mx); +- + let VLMul = m.value in { + def "_V_" # mx : VPseudoUnaryNoMask, +- Sched<[WriteVIMovV_MX, ReadVIMovV_MX]>; ++ SchedUnary<"WriteVIMovV", "ReadVIMovV", mx>; + def "_X_" # mx : VPseudoUnaryNoMask, +- Sched<[WriteVIMovX_MX, ReadVIMovX_MX]>; ++ SchedUnary<"WriteVIMovX", "ReadVIMovX", mx>; + def "_I_" # mx : VPseudoUnaryNoMask, +- Sched<[WriteVIMovI_MX]>; ++ SchedNullary<"WriteVIMovI", mx>; + } + } + } +@@ -2368,13 +2326,10 @@ + foreach f = FPList in { + foreach m = f.MxList in { + defvar mx = m.MX; +- defvar WriteVFMovV_MX = !cast("WriteVFMovV_" # mx); +- defvar ReadVFMovF_MX = !cast("ReadVFMovF_" # mx); +- + let VLMul = m.value in { + def "_" # f.FX # "_" # mx : + VPseudoUnaryNoMask, +- Sched<[WriteVFMovV_MX, ReadVFMovF_MX]>; ++ SchedUnary<"WriteVFMovV", "ReadVFMovF", mx>; + } + } + } +@@ -2383,15 +2338,12 @@ + multiclass VPseudoVCLS_V { + foreach m = MxListF in { + defvar mx = m.MX; +- defvar WriteVFClassV_MX = !cast("WriteVFClassV_" # mx); +- defvar ReadVFClassV_MX = !cast("ReadVFClassV_" # mx); +- + let VLMul = m.value in { + def "_V_" # mx : VPseudoUnaryNoMask, +- Sched<[WriteVFClassV_MX, ReadVFClassV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFClassV", "ReadVFClassV", mx>; + def "_V_" # mx # "_MASK" : VPseudoUnaryMask, + RISCVMaskedPseudo, +- Sched<[WriteVFClassV_MX, ReadVFClassV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFClassV", "ReadVFClassV", mx>; + } + } + } +@@ -2404,17 +2356,12 @@ + let VLMul = m.value in + foreach e = sews in { + defvar suffix = "_" # mx # "_E" # e; +- defvar WriteVFSqrtV_MX_E = !cast("WriteVFSqrtV" # suffix); +- defvar ReadVFSqrtV_MX_E = !cast("ReadVFSqrtV" # suffix); +- + let SEW = e in { + def "_V" # suffix : VPseudoUnaryNoMaskRoundingMode, +- Sched<[WriteVFSqrtV_MX_E, ReadVFSqrtV_MX_E, +- ReadVMask]>; ++ SchedUnary<"WriteVFSqrtV", "ReadVFSqrtV", mx, e>; + def "_V" # suffix # "_MASK" : VPseudoUnaryMaskRoundingMode, + RISCVMaskedPseudo, +- Sched<[WriteVFSqrtV_MX_E, ReadVFSqrtV_MX_E, +- ReadVMask]>; ++ SchedUnary<"WriteVFSqrtV", "ReadVFSqrtV", mx, e>; + } + } + } +@@ -2423,15 +2370,12 @@ + multiclass VPseudoVRCP_V { + foreach m = MxListF in { + defvar mx = m.MX; +- defvar WriteVFRecpV_MX = !cast("WriteVFRecpV_" # mx); +- defvar ReadVFRecpV_MX = !cast("ReadVFRecpV_" # mx); +- + let VLMul = m.value in { + def "_V_" # mx : VPseudoUnaryNoMask, +- Sched<[WriteVFRecpV_MX, ReadVFRecpV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx>; + def "_V_" # mx # "_MASK" : VPseudoUnaryMask, + RISCVMaskedPseudo, +- Sched<[WriteVFRecpV_MX, ReadVFRecpV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx>; + } + } + } +@@ -2439,15 +2383,12 @@ + multiclass VPseudoVRCP_V_RM { + foreach m = MxListF in { + defvar mx = m.MX; +- defvar WriteVFRecpV_MX = !cast("WriteVFRecpV_" # mx); +- defvar ReadVFRecpV_MX = !cast("ReadVFRecpV_" # mx); +- + let VLMul = m.value in { + def "_V_" # mx : VPseudoUnaryNoMaskRoundingMode, +- Sched<[WriteVFRecpV_MX, ReadVFRecpV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx>; + def "_V_" # mx # "_MASK" : VPseudoUnaryMaskRoundingMode, + RISCVMaskedPseudo, +- Sched<[WriteVFRecpV_MX, ReadVFRecpV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFRecpV", "ReadVFRecpV", mx>; + } + } + } +@@ -2456,16 +2397,13 @@ + defvar constraints = "@earlyclobber $rd"; + foreach m = MxListVF2 in { + defvar mx = m.MX; +- defvar WriteVExtV_MX = !cast("WriteVExtV_" # mx); +- defvar ReadVExtV_MX = !cast("ReadVExtV_" # mx); +- + let VLMul = m.value in { + def "_" # mx : VPseudoUnaryNoMask, +- Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask]>; ++ SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + def "_" # mx # "_MASK" : + VPseudoUnaryMask, + RISCVMaskedPseudo, +- Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask]>; ++ SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + } + } + } +@@ -2474,16 +2412,13 @@ + defvar constraints = "@earlyclobber $rd"; + foreach m = MxListVF4 in { + defvar mx = m.MX; +- defvar WriteVExtV_MX = !cast("WriteVExtV_" # mx); +- defvar ReadVExtV_MX = !cast("ReadVExtV_" # mx); +- + let VLMul = m.value in { + def "_" # mx : VPseudoUnaryNoMask, +- Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask]>; ++ SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + def "_" # mx # "_MASK" : + VPseudoUnaryMask, + RISCVMaskedPseudo, +- Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask]>; ++ SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + } + } + } +@@ -2492,16 +2427,13 @@ + defvar constraints = "@earlyclobber $rd"; + foreach m = MxListVF8 in { + defvar mx = m.MX; +- defvar WriteVExtV_MX = !cast("WriteVExtV_" # mx); +- defvar ReadVExtV_MX = !cast("ReadVExtV_" # mx); +- + let VLMul = m.value in { + def "_" # mx : VPseudoUnaryNoMask, +- Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask]>; ++ SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + def "_" # mx # "_MASK" : + VPseudoUnaryMask, + RISCVMaskedPseudo, +- Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask]>; ++ SchedUnary<"WriteVExtV", "ReadVExtV", mx>; + } + } + } +@@ -2542,26 +2474,17 @@ + multiclass VPseudoVGTR_VV_VX_VI { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVRGatherVX_MX = !cast("WriteVRGatherVX_" # mx); +- defvar WriteVRGatherVI_MX = !cast("WriteVRGatherVI_" # mx); +- defvar ReadVRGatherVX_data_MX = !cast("ReadVRGatherVX_data_" # mx); +- defvar ReadVRGatherVX_index_MX = !cast("ReadVRGatherVX_index_" # mx); +- defvar ReadVRGatherVI_data_MX = !cast("ReadVRGatherVI_data_" # mx); +- + defm "" : VPseudoBinaryV_VX, +- Sched<[WriteVRGatherVX_MX, ReadVRGatherVX_data_MX, +- ReadVRGatherVX_index_MX, ReadVMask]>; ++ SchedBinary<"WriteVRGatherVX", "ReadVRGatherVX_data", ++ "ReadVRGatherVX_index", mx>; + defm "" : VPseudoBinaryV_VI, +- Sched<[WriteVRGatherVI_MX, ReadVRGatherVI_data_MX, ReadVMask]>; ++ SchedUnary<"WriteVRGatherVI", "ReadVRGatherVI_data", mx>; + + defvar sews = SchedSEWSet.val; + foreach e = sews in { +- defvar WriteVRGatherVV_MX_E = !cast("WriteVRGatherVV_" # mx # "_E" # e); +- defvar ReadVRGatherVV_data_MX_E = !cast("ReadVRGatherVV_data_" # mx # "_E" # e); +- defvar ReadVRGatherVV_index_MX_E = !cast("ReadVRGatherVV_index_" # mx # "_E" # e); + defm "" : VPseudoBinaryV_VV, +- Sched<[WriteVRGatherVV_MX_E, ReadVRGatherVV_data_MX_E, +- ReadVRGatherVV_index_MX_E, ReadVMask]>; ++ SchedBinary<"WriteVRGatherVV", "ReadVRGatherVV_data", ++ "ReadVRGatherVV_index", mx, e>; + } + } + } +@@ -2569,18 +2492,12 @@ + multiclass VPseudoVSALU_VV_VX_VI { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVSALUV_MX = !cast("WriteVSALUV_" # mx); +- defvar WriteVSALUX_MX = !cast("WriteVSALUX_" # mx); +- defvar WriteVSALUI_MX = !cast("WriteVSALUI_" # mx); +- defvar ReadVSALUV_MX = !cast("ReadVSALUV_" # mx); +- defvar ReadVSALUX_MX = !cast("ReadVSALUX_" # mx); +- + defm "" : VPseudoBinaryV_VV, +- Sched<[WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVSALUV", "ReadVSALUV", "ReadVSALUX", mx>; + defm "" : VPseudoBinaryV_VX, +- Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVSALUX", "ReadVSALUV", "ReadVSALUX", mx>; + defm "" : VPseudoBinaryV_VI, +- Sched<[WriteVSALUI_MX, ReadVSALUV_MX, ReadVMask]>; ++ SchedUnary<"WriteVSALUI", "ReadVSALUV", mx>; + } + } + +@@ -2588,129 +2505,86 @@ + multiclass VPseudoVSHT_VV_VX_VI { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVShiftV_MX = !cast("WriteVShiftV_" # mx); +- defvar WriteVShiftX_MX = !cast("WriteVShiftX_" # mx); +- defvar WriteVShiftI_MX = !cast("WriteVShiftI_" # mx); +- defvar ReadVShiftV_MX = !cast("ReadVShiftV_" # mx); +- defvar ReadVShiftX_MX = !cast("ReadVShiftX_" # mx); +- + defm "" : VPseudoBinaryV_VV, +- Sched<[WriteVShiftV_MX, ReadVShiftV_MX, ReadVShiftV_MX, ReadVMask]>; ++ SchedBinary<"WriteVShiftV", "ReadVShiftV", "ReadVShiftV", mx>; + defm "" : VPseudoBinaryV_VX, +- Sched<[WriteVShiftX_MX, ReadVShiftV_MX, ReadVShiftX_MX, ReadVMask]>; ++ SchedBinary<"WriteVShiftX", "ReadVShiftV", "ReadVShiftX", mx>; + defm "" : VPseudoBinaryV_VI, +- Sched<[WriteVShiftI_MX, ReadVShiftV_MX, ReadVMask]>; ++ SchedUnary<"WriteVShiftI", "ReadVShiftV", mx>; + } + } + + multiclass VPseudoVSSHT_VV_VX_VI_RM { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVSShiftV_MX = !cast("WriteVSShiftV_" # mx); +- defvar WriteVSShiftX_MX = !cast("WriteVSShiftX_" # mx); +- defvar WriteVSShiftI_MX = !cast("WriteVSShiftI_" # mx); +- defvar ReadVSShiftV_MX = !cast("ReadVSShiftV_" # mx); +- defvar ReadVSShiftX_MX = !cast("ReadVSShiftX_" # mx); +- + defm "" : VPseudoBinaryV_VV_RM, +- Sched<[WriteVSShiftV_MX, ReadVSShiftV_MX, ReadVSShiftV_MX, ReadVMask]>; ++ SchedBinary<"WriteVSShiftV", "ReadVSShiftV", "ReadVSShiftV", mx>; + defm "" : VPseudoBinaryV_VX_RM, +- Sched<[WriteVSShiftX_MX, ReadVSShiftV_MX, ReadVSShiftX_MX, ReadVMask]>; ++ SchedBinary<"WriteVSShiftX", "ReadVSShiftV", "ReadVSShiftX", mx>; + defm "" : VPseudoBinaryV_VI_RM, +- Sched<[WriteVSShiftI_MX, ReadVSShiftV_MX, ReadVMask]>; ++ SchedUnary<"WriteVSShiftI", "ReadVSShiftV", mx>; + } + } + + multiclass VPseudoVALU_VV_VX_VI { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVIALUV_MX = !cast("WriteVIALUV_" # mx); +- defvar WriteVIALUX_MX = !cast("WriteVIALUX_" # mx); +- defvar WriteVIALUI_MX = !cast("WriteVIALUI_" # mx); +- defvar ReadVIALUV_MX = !cast("ReadVIALUV_" # mx); +- defvar ReadVIALUX_MX = !cast("ReadVIALUX_" # mx); +- + defm "" : VPseudoBinaryV_VV, +- Sched<[WriteVIALUV_MX, ReadVIALUV_MX, ReadVIALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVIALUV", "ReadVIALUV", "ReadVIALUV", mx>; + defm "" : VPseudoBinaryV_VX, +- Sched<[WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVIALUX", "ReadVIALUV", "ReadVIALUX", mx>; + defm "" : VPseudoBinaryV_VI, +- Sched<[WriteVIALUI_MX, ReadVIALUV_MX, ReadVMask]>; ++ SchedUnary<"WriteVIALUI", "ReadVIALUV", mx>; + } + } + + multiclass VPseudoVSALU_VV_VX { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVSALUV_MX = !cast("WriteVSALUV_" # mx); +- defvar WriteVSALUX_MX = !cast("WriteVSALUX_" # mx); +- defvar ReadVSALUV_MX = !cast("ReadVSALUV_" # mx); +- defvar ReadVSALUX_MX = !cast("ReadVSALUX_" # mx); +- + defm "" : VPseudoBinaryV_VV, +- Sched<[WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVSALUV", "ReadVSALUV", "ReadVSALUV", mx>; + defm "" : VPseudoBinaryV_VX, +- Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVSALUX", "ReadVSALUV", "ReadVSALUX", mx>; + } + } + + multiclass VPseudoVSMUL_VV_VX_RM { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVSMulV_MX = !cast("WriteVSMulV_" # mx); +- defvar WriteVSMulX_MX = !cast("WriteVSMulX_" # mx); +- defvar ReadVSMulV_MX = !cast("ReadVSMulV_" # mx); +- defvar ReadVSMulX_MX = !cast("ReadVSMulX_" # mx); +- + defm "" : VPseudoBinaryV_VV_RM, +- Sched<[WriteVSMulV_MX, ReadVSMulV_MX, ReadVSMulV_MX, ReadVMask]>; ++ SchedBinary<"WriteVSMulV", "ReadVSMulV", "ReadVSMulV", mx>; + defm "" : VPseudoBinaryV_VX_RM, +- Sched<[WriteVSMulX_MX, ReadVSMulV_MX, ReadVSMulX_MX, ReadVMask]>; ++ SchedBinary<"WriteVSMulX", "ReadVSMulV", "ReadVSMulX", mx>; + } + } + + multiclass VPseudoVAALU_VV_VX_RM { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVAALUV_MX = !cast("WriteVAALUV_" # mx); +- defvar WriteVAALUX_MX = !cast("WriteVAALUX_" # mx); +- defvar ReadVAALUV_MX = !cast("ReadVAALUV_" # mx); +- defvar ReadVAALUX_MX = !cast("ReadVAALUX_" # mx); +- + defm "" : VPseudoBinaryV_VV_RM, +- Sched<[WriteVAALUV_MX, ReadVAALUV_MX, ReadVAALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVAALUV", "ReadVAALUV", "ReadVAALUV", mx>; + defm "" : VPseudoBinaryV_VX_RM, +- Sched<[WriteVAALUX_MX, ReadVAALUV_MX, ReadVAALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVAALUX", "ReadVAALUV", "ReadVAALUX", mx>; + } + } + + multiclass VPseudoVMINMAX_VV_VX { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVIMinMaxV_MX = !cast("WriteVIMinMaxV_" # mx); +- defvar WriteVIMinMaxX_MX = !cast("WriteVIMinMaxX_" # mx); +- defvar ReadVIMinMaxV_MX = !cast("ReadVIMinMaxV_" # mx); +- defvar ReadVIMinMaxX_MX = !cast("ReadVIMinMaxX_" # mx); +- + defm "" : VPseudoBinaryV_VV, +- Sched<[WriteVIMinMaxV_MX, ReadVIMinMaxV_MX, ReadVIMinMaxV_MX, ReadVMask]>; ++ SchedBinary<"WriteVIMinMaxV", "ReadVIMinMaxV", "ReadVIMinMaxV", mx>; + defm "" : VPseudoBinaryV_VX, +- Sched<[WriteVIMinMaxX_MX, ReadVIMinMaxV_MX, ReadVIMinMaxX_MX, ReadVMask]>; ++ SchedBinary<"WriteVIMinMaxX", "ReadVIMinMaxV", "ReadVIMinMaxX", mx>; + } + } + + multiclass VPseudoVMUL_VV_VX { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVIMulV_MX = !cast("WriteVIMulV_" # mx); +- defvar WriteVIMulX_MX = !cast("WriteVIMulX_" # mx); +- defvar ReadVIMulV_MX = !cast("ReadVIMulV_" # mx); +- defvar ReadVIMulX_MX = !cast("ReadVIMulX_" # mx); +- + defm "" : VPseudoBinaryV_VV, +- Sched<[WriteVIMulV_MX, ReadVIMulV_MX, ReadVIMulV_MX, ReadVMask]>; ++ SchedBinary<"WriteVIMulV", "ReadVIMulV", "ReadVIMulV", mx>; + defm "" : VPseudoBinaryV_VX, +- Sched<[WriteVIMulX_MX, ReadVIMulV_MX, ReadVIMulX_MX, ReadVMask]>; ++ SchedBinary<"WriteVIMulX", "ReadVIMulV", "ReadVIMulX", mx>; + } + } + +@@ -2719,38 +2593,24 @@ + defvar mx = m.MX; + defvar sews = SchedSEWSet.val; + foreach e = sews in { +- defvar WriteVIDivV_MX_E = !cast("WriteVIDivV_" # mx # "_E" # e); +- defvar WriteVIDivX_MX_E = !cast("WriteVIDivX_" # mx # "_E" # e); +- defvar ReadVIDivV_MX_E = !cast("ReadVIDivV_" # mx # "_E" # e); +- defvar ReadVIDivX_MX_E = !cast("ReadVIDivX_" # mx # "_E" # e); +- + defm "" : VPseudoBinaryV_VV, +- Sched<[WriteVIDivV_MX_E, ReadVIDivV_MX_E, ReadVIDivV_MX_E, ReadVMask]>; ++ SchedBinary<"WriteVIDivV", "ReadVIDivV", "ReadVIDivV", mx, e>; + defm "" : VPseudoBinaryV_VX, +- Sched<[WriteVIDivX_MX_E, ReadVIDivV_MX_E, ReadVIDivX_MX_E, ReadVMask]>; ++ SchedBinary<"WriteVIDivX", "ReadVIDivV", "ReadVIDivX", mx, e>; + } + } + } + + multiclass VPseudoVFMUL_VV_VF_RM { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFMulV_MX = !cast("WriteVFMulV_" # mx); +- defvar ReadVFMulV_MX = !cast("ReadVFMulV_" # mx); +- + defm "" : VPseudoBinaryFV_VV_RM, +- Sched<[WriteVFMulV_MX, ReadVFMulV_MX, ReadVFMulV_MX, ReadVMask]>; ++ SchedBinary<"WriteVFMulV", "ReadVFMulV", "ReadVFMulV", m.MX>; + } + + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFMulF_MX = !cast("WriteVFMulF_" # mx); +- defvar ReadVFMulV_MX = !cast("ReadVFMulV_" # mx); +- defvar ReadVFMulF_MX = !cast("ReadVFMulF_" # mx); +- + defm "" : VPseudoBinaryV_VF_RM, +- Sched<[WriteVFMulF_MX, ReadVFMulV_MX, ReadVFMulF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFMulF", "ReadVFMulV", "ReadVFMulF", m.MX>; + } + } + } +@@ -2760,23 +2620,15 @@ + defvar mx = m.MX; + defvar sews = SchedSEWSet.val; + foreach e = sews in { +- defvar WriteVFDivV_MX_E = !cast("WriteVFDivV_" # mx # "_E" # e); +- defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # e); +- + defm "" : VPseudoBinaryFV_VV_RM, +- Sched<[WriteVFDivV_MX_E, ReadVFDivV_MX_E, ReadVFDivV_MX_E, ReadVMask]>; ++ SchedBinary<"WriteVFDivV", "ReadVFDivV", "ReadVFDivV", mx, e>; + } + } + + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFDivF_MX_E = !cast("WriteVFDivF_" # mx # "_E" # f.SEW); +- defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # f.SEW); +- defvar ReadVFDivF_MX_E = !cast("ReadVFDivF_" # mx # "_E" # f.SEW); +- + defm "" : VPseudoBinaryV_VF_RM, +- Sched<[WriteVFDivF_MX_E, ReadVFDivV_MX_E, ReadVFDivF_MX_E, ReadVMask]>; ++ SchedBinary<"WriteVFDivF", "ReadVFDivV", "ReadVFDivF", m.MX, f.SEW>; + } + } + } +@@ -2784,118 +2636,73 @@ + multiclass VPseudoVFRDIV_VF_RM { + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFDivF_MX_E = !cast("WriteVFDivF_" # mx # "_E" # f.SEW); +- defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # f.SEW); +- defvar ReadVFDivF_MX_E = !cast("ReadVFDivF_" # mx # "_E" # f.SEW); +- + defm "" : VPseudoBinaryV_VF_RM, +- Sched<[WriteVFDivF_MX_E, ReadVFDivV_MX_E, ReadVFDivF_MX_E, ReadVMask]>; ++ SchedBinary<"WriteVFDivF", "ReadVFDivV", "ReadVFDivF", m.MX, f.SEW>; + } + } + } + + multiclass VPseudoVALU_VV_VX { + foreach m = MxList in { +- defvar mx = m.MX; +- defvar WriteVIALUV_MX = !cast("WriteVIALUV_" # mx); +- defvar WriteVIALUX_MX = !cast("WriteVIALUV_" # mx); +- defvar ReadVIALUV_MX = !cast("ReadVIALUV_" # mx); +- defvar ReadVIALUX_MX = !cast("ReadVIALUX_" # mx); +- + defm "" : VPseudoBinaryV_VV, +- Sched<[WriteVIALUV_MX, ReadVIALUV_MX, ReadVIALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVIALUV", "ReadVIALUV", "ReadVIALUV", m.MX>; + defm "" : VPseudoBinaryV_VX, +- Sched<[WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVIALUV", "ReadVIALUV", "ReadVIALUX", m.MX>; + } + } + + multiclass VPseudoVSGNJ_VV_VF { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFSgnjV_MX = !cast("WriteVFSgnjV_" # mx); +- defvar ReadVFSgnjV_MX = !cast("ReadVFSgnjV_" # mx); +- + defm "" : VPseudoBinaryFV_VV, +- Sched<[WriteVFSgnjV_MX, ReadVFSgnjV_MX, ReadVFSgnjV_MX, ReadVMask]>; ++ SchedBinary<"WriteVFSgnjV", "ReadVFSgnjV", "ReadVFSgnjV", m.MX>; + } + + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFSgnjF_MX = !cast("WriteVFSgnjF_" # mx); +- defvar ReadVFSgnjV_MX = !cast("ReadVFSgnjV_" # mx); +- defvar ReadVFSgnjF_MX = !cast("ReadVFSgnjF_" # mx); +- + defm "" : VPseudoBinaryV_VF, +- Sched<[WriteVFSgnjF_MX, ReadVFSgnjV_MX, ReadVFSgnjF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFSgnjF", "ReadVFSgnjV", "ReadVFSgnjF", m.MX>; + } + } + } + + multiclass VPseudoVMAX_VV_VF { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFMinMaxV_MX = !cast("WriteVFMinMaxV_" # mx); +- defvar ReadVFMinMaxV_MX = !cast("ReadVFMinMaxV_" # mx); +- + defm "" : VPseudoBinaryFV_VV, +- Sched<[WriteVFMinMaxV_MX, ReadVFMinMaxV_MX, ReadVFMinMaxV_MX, ReadVMask]>; ++ SchedBinary<"WriteVFMinMaxV", "ReadVFMinMaxV", "ReadVFMinMaxV", m.MX>; + } + + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFMinMaxF_MX = !cast("WriteVFMinMaxF_" # mx); +- defvar ReadVFMinMaxV_MX = !cast("ReadVFMinMaxV_" # mx); +- defvar ReadVFMinMaxF_MX = !cast("ReadVFMinMaxF_" # mx); +- + defm "" : VPseudoBinaryV_VF, +- Sched<[WriteVFMinMaxF_MX, ReadVFMinMaxV_MX, ReadVFMinMaxF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFMinMaxF", "ReadVFMinMaxV", "ReadVFMinMaxF", m.MX>; + } + } + } + + multiclass VPseudoVALU_VV_VF { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFALUV_MX = !cast("WriteVFALUV_" # mx); +- defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); +- + defm "" : VPseudoBinaryFV_VV, +- Sched<[WriteVFALUV_MX, ReadVFALUV_MX, ReadVFALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVFALUV", "ReadVFALUV", "ReadVFALUV", m.MX>; + } + + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFALUF_MX = !cast("WriteVFALUF_" # mx); +- defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); +- defvar ReadVFALUF_MX = !cast("ReadVFALUF_" # mx); + defm "" : VPseudoBinaryV_VF, +- Sched<[WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX>; + } + } + } + + multiclass VPseudoVALU_VV_VF_RM { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFALUV_MX = !cast("WriteVFALUV_" # mx); +- defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); +- + defm "" : VPseudoBinaryFV_VV_RM, +- Sched<[WriteVFALUV_MX, ReadVFALUV_MX, ReadVFALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVFALUV", "ReadVFALUV", "ReadVFALUV", m.MX>; + } + + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFALUF_MX = !cast("WriteVFALUF_" # mx); +- defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); +- defvar ReadVFALUF_MX = !cast("ReadVFALUF_" # mx); + defm "" : VPseudoBinaryV_VF_RM, +- Sched<[WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX>; + } + } + } +@@ -2903,13 +2710,8 @@ + multiclass VPseudoVALU_VF { + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFALUF_MX = !cast("WriteVFALUF_" # mx); +- defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); +- defvar ReadVFALUF_MX = !cast("ReadVFALUF_" # mx); +- + defm "" : VPseudoBinaryV_VF, +- Sched<[WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX>; + } + } + } +@@ -2917,13 +2719,8 @@ + multiclass VPseudoVALU_VF_RM { + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFALUF_MX = !cast("WriteVFALUF_" # mx); +- defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); +- defvar ReadVFALUF_MX = !cast("ReadVFALUF_" # mx); +- + defm "" : VPseudoBinaryV_VF_RM, +- Sched<[WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFALUF", "ReadVFALUV", "ReadVFALUF", m.MX>; + } + } + } +@@ -2931,67 +2728,43 @@ + multiclass VPseudoVALU_VX_VI { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVIALUX_MX = !cast("WriteVIALUX_" # mx); +- defvar WriteVIALUI_MX = !cast("WriteVIALUI_" # mx); +- defvar ReadVIALUV_MX = !cast("ReadVIALUV_" # mx); +- defvar ReadVIALUX_MX = !cast("ReadVIALUX_" # mx); +- + defm "" : VPseudoBinaryV_VX, +- Sched<[WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVIALUX", "ReadVIALUV", "ReadVIALUX", mx>; + defm "" : VPseudoBinaryV_VI, +- Sched<[WriteVIALUI_MX, ReadVIALUV_MX, ReadVMask]>; ++ SchedUnary<"WriteVIALUI", "ReadVIALUV", mx>; + } + } + + multiclass VPseudoVWALU_VV_VX { + foreach m = MxListW in { + defvar mx = m.MX; +- defvar WriteVIWALUV_MX = !cast("WriteVIWALUV_" # mx); +- defvar WriteVIWALUX_MX = !cast("WriteVIWALUX_" # mx); +- defvar ReadVIWALUV_MX = !cast("ReadVIWALUV_" # mx); +- defvar ReadVIWALUX_MX = !cast("ReadVIWALUX_" # mx); +- + defm "" : VPseudoBinaryW_VV, +- Sched<[WriteVIWALUV_MX, ReadVIWALUV_MX, ReadVIWALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVIWALUV", "ReadVIWALUV", "ReadVIWALUV", mx>; + defm "" : VPseudoBinaryW_VX, +- Sched<[WriteVIWALUX_MX, ReadVIWALUV_MX, ReadVIWALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVIWALUX", "ReadVIWALUV", "ReadVIWALUX", mx>; + } + } + + multiclass VPseudoVWMUL_VV_VX { + foreach m = MxListW in { + defvar mx = m.MX; +- defvar WriteVIWMulV_MX = !cast("WriteVIWMulV_" # mx); +- defvar WriteVIWMulX_MX = !cast("WriteVIWMulX_" # mx); +- defvar ReadVIWMulV_MX = !cast("ReadVIWMulV_" # mx); +- defvar ReadVIWMulX_MX = !cast("ReadVIWMulX_" # mx); +- + defm "" : VPseudoBinaryW_VV, +- Sched<[WriteVIWMulV_MX, ReadVIWMulV_MX, ReadVIWMulV_MX, ReadVMask]>; ++ SchedBinary<"WriteVIWMulV", "ReadVIWMulV", "ReadVIWMulV", mx>; + defm "" : VPseudoBinaryW_VX, +- Sched<[WriteVIWMulX_MX, ReadVIWMulV_MX, ReadVIWMulX_MX, ReadVMask]>; ++ SchedBinary<"WriteVIWMulX", "ReadVIWMulV", "ReadVIWMulX", mx>; + } + } + + multiclass VPseudoVWMUL_VV_VF_RM { + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWMulV_MX = !cast("WriteVFWMulV_" # mx); +- defvar ReadVFWMulV_MX = !cast("ReadVFWMulV_" # mx); +- + defm "" : VPseudoBinaryW_VV_RM, +- Sched<[WriteVFWMulV_MX, ReadVFWMulV_MX, ReadVFWMulV_MX, ReadVMask]>; ++ SchedBinary<"WriteVFWMulV", "ReadVFWMulV", "ReadVFWMulV", m.MX>; + } + + foreach f = FPListW in { + foreach m = f.MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWMulF_MX = !cast("WriteVFWMulF_" # mx); +- defvar ReadVFWMulV_MX = !cast("ReadVFWMulV_" # mx); +- defvar ReadVFWMulF_MX = !cast("ReadVFWMulF_" # mx); +- + defm "" : VPseudoBinaryW_VF_RM, +- Sched<[WriteVFWMulF_MX, ReadVFWMulV_MX, ReadVFWMulF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFWMulF", "ReadVFWMulV", "ReadVFWMulF", m.MX>; + } + } + } +@@ -2999,59 +2772,36 @@ + multiclass VPseudoVWALU_WV_WX { + foreach m = MxListW in { + defvar mx = m.MX; +- defvar WriteVIWALUV_MX = !cast("WriteVIWALUV_" # mx); +- defvar WriteVIWALUX_MX = !cast("WriteVIWALUX_" # mx); +- defvar ReadVIWALUV_MX = !cast("ReadVIWALUV_" # mx); +- defvar ReadVIWALUX_MX = !cast("ReadVIWALUX_" # mx); +- + defm "" : VPseudoBinaryW_WV, +- Sched<[WriteVIWALUV_MX, ReadVIWALUV_MX, ReadVIWALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVIWALUV", "ReadVIWALUV", "ReadVIWALUV", mx>; + defm "" : VPseudoBinaryW_WX, +- Sched<[WriteVIWALUX_MX, ReadVIWALUV_MX, ReadVIWALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVIWALUX", "ReadVIWALUV", "ReadVIWALUX", mx>; + } + } + + multiclass VPseudoVFWALU_VV_VF_RM { + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWALUV_MX = !cast("WriteVFWALUV_" # mx); +- defvar ReadVFWALUV_MX = !cast("ReadVFWALUV_" # mx); +- + defm "" : VPseudoBinaryW_VV_RM, +- Sched<[WriteVFWALUV_MX, ReadVFWALUV_MX, ReadVFWALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVFWALUV", "ReadVFWALUV", "ReadVFWALUV", m.MX>; + } + + foreach f = FPListW in { + foreach m = f.MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWALUF_MX = !cast("WriteVFWALUF_" # mx); +- defvar ReadVFWALUV_MX = !cast("ReadVFWALUV_" # mx); +- defvar ReadVFWALUF_MX = !cast("ReadVFWALUF_" # mx); +- + defm "" : VPseudoBinaryW_VF_RM, +- Sched<[WriteVFWALUF_MX, ReadVFWALUV_MX, ReadVFWALUF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFWALUF", "ReadVFWALUV", "ReadVFWALUF", m.MX>; + } + } + } + + multiclass VPseudoVFWALU_WV_WF_RM { + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWALUV_MX = !cast("WriteVFWALUV_" # mx); +- defvar ReadVFWALUV_MX = !cast("ReadVFWALUV_" # mx); +- + defm "" : VPseudoBinaryW_WV_RM, +- Sched<[WriteVFWALUV_MX, ReadVFWALUV_MX, ReadVFWALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVFWALUV", "ReadVFWALUV", "ReadVFWALUV", m.MX>; + } + foreach f = FPListW in { + foreach m = f.MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWALUF_MX = !cast("WriteVFWALUF_" # mx); +- defvar ReadVFWALUV_MX = !cast("ReadVFWALUV_" # mx); +- defvar ReadVFWALUF_MX = !cast("ReadVFWALUF_" # mx); +- + defm "" : VPseudoBinaryW_WF_RM, +- Sched<[WriteVFWALUF_MX, ReadVFWALUV_MX, ReadVFWALUF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFWALUF", "ReadVFWALUV", "ReadVFWALUF", m.MX>; + } + } + } +@@ -3059,159 +2809,108 @@ + multiclass VPseudoVMRG_VM_XM_IM { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVIMergeV_MX = !cast("WriteVIMergeV_" # mx); +- defvar WriteVIMergeX_MX = !cast("WriteVIMergeX_" # mx); +- defvar WriteVIMergeI_MX = !cast("WriteVIMergeI_" # mx); +- defvar ReadVIMergeV_MX = !cast("ReadVIMergeV_" # mx); +- defvar ReadVIMergeX_MX = !cast("ReadVIMergeX_" # mx); +- + def "_VVM" # "_" # m.MX: + VPseudoTiedBinaryCarryIn.R, + m.vrclass, m.vrclass, m, 1, "">, +- Sched<[WriteVIMergeV_MX, ReadVIMergeV_MX, ReadVIMergeV_MX, ReadVMask]>; ++ SchedBinary<"WriteVIMergeV", "ReadVIMergeV", "ReadVIMergeV", mx>; + def "_VXM" # "_" # m.MX: + VPseudoTiedBinaryCarryIn.R, + m.vrclass, GPR, m, 1, "">, +- Sched<[WriteVIMergeX_MX, ReadVIMergeV_MX, ReadVIMergeX_MX, ReadVMask]>; ++ SchedBinary<"WriteVIMergeX", "ReadVIMergeV", "ReadVIMergeX", mx>; + def "_VIM" # "_" # m.MX: + VPseudoTiedBinaryCarryIn.R, + m.vrclass, simm5, m, 1, "">, +- Sched<[WriteVIMergeI_MX, ReadVIMergeV_MX, ReadVMask]>; ++ SchedUnary<"WriteVIMergeI", "ReadVIMergeV", mx>; + } + } + + multiclass VPseudoVCALU_VM_XM_IM { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVICALUV_MX = !cast("WriteVICALUV_" # mx); +- defvar WriteVICALUX_MX = !cast("WriteVICALUX_" # mx); +- defvar WriteVICALUI_MX = !cast("WriteVICALUI_" # mx); +- defvar ReadVICALUV_MX = !cast("ReadVICALUV_" # mx); +- defvar ReadVICALUX_MX = !cast("ReadVICALUX_" # mx); +- + defm "" : VPseudoTiedBinaryV_VM, +- Sched<[WriteVICALUV_MX, ReadVICALUV_MX, ReadVICALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx>; + defm "" : VPseudoTiedBinaryV_XM, +- Sched<[WriteVICALUX_MX, ReadVICALUV_MX, ReadVICALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx>; + defm "" : VPseudoTiedBinaryV_IM, +- Sched<[WriteVICALUI_MX, ReadVICALUV_MX, ReadVMask]>; ++ SchedUnary<"WriteVICALUI", "ReadVICALUV", mx>; + } + } + + multiclass VPseudoVCALU_VM_XM { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVICALUV_MX = !cast("WriteVICALUV_" # mx); +- defvar WriteVICALUX_MX = !cast("WriteVICALUX_" # mx); +- defvar ReadVICALUV_MX = !cast("ReadVICALUV_" # mx); +- defvar ReadVICALUX_MX = !cast("ReadVICALUX_" # mx); +- + defm "" : VPseudoTiedBinaryV_VM, +- Sched<[WriteVICALUV_MX, ReadVICALUV_MX, ReadVICALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx>; + defm "" : VPseudoTiedBinaryV_XM, +- Sched<[WriteVICALUX_MX, ReadVICALUV_MX, ReadVICALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx>; + } + } + + multiclass VPseudoVCALUM_VM_XM_IM { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVICALUV_MX = !cast("WriteVICALUV_" # mx); +- defvar WriteVICALUX_MX = !cast("WriteVICALUX_" # mx); +- defvar WriteVICALUI_MX = !cast("WriteVICALUI_" # mx); +- defvar ReadVICALUV_MX = !cast("ReadVICALUV_" # mx); +- defvar ReadVICALUX_MX = !cast("ReadVICALUX_" # mx); +- + defm "" : VPseudoBinaryV_VM, +- Sched<[WriteVICALUV_MX, ReadVICALUV_MX, ReadVICALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, forceMasked=1>; + defm "" : VPseudoBinaryV_XM, +- Sched<[WriteVICALUX_MX, ReadVICALUV_MX, ReadVICALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, forceMasked=1>; + defm "" : VPseudoBinaryV_IM, +- Sched<[WriteVICALUI_MX, ReadVICALUV_MX, ReadVMask]>; ++ SchedUnary<"WriteVICALUI", "ReadVICALUV", mx, forceMasked=1>; + } + } + + multiclass VPseudoVCALUM_VM_XM { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVICALUV_MX = !cast("WriteVICALUV_" # mx); +- defvar WriteVICALUX_MX = !cast("WriteVICALUX_" # mx); +- defvar ReadVICALUV_MX = !cast("ReadVICALUV_" # mx); +- defvar ReadVICALUX_MX = !cast("ReadVICALUX_" # mx); +- + defm "" : VPseudoBinaryV_VM, +- Sched<[WriteVICALUV_MX, ReadVICALUV_MX, ReadVICALUV_MX, ReadVMask]>; ++ SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx, forceMasked=1>; + defm "" : VPseudoBinaryV_XM, +- Sched<[WriteVICALUX_MX, ReadVICALUV_MX, ReadVICALUX_MX, ReadVMask]>; ++ SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx, forceMasked=1>; + } + } + + multiclass VPseudoVCALUM_V_X_I { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVICALUV_MX = !cast("WriteVICALUV_" # mx); +- defvar WriteVICALUX_MX = !cast("WriteVICALUX_" # mx); +- defvar WriteVICALUI_MX = !cast("WriteVICALUI_" # mx); +- defvar ReadVICALUV_MX = !cast("ReadVICALUV_" # mx); +- defvar ReadVICALUX_MX = !cast("ReadVICALUX_" # mx); +- + defm "" : VPseudoBinaryV_VM, +- Sched<[WriteVICALUV_MX, ReadVICALUV_MX, ReadVICALUV_MX]>; ++ SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx>; + defm "" : VPseudoBinaryV_XM, +- Sched<[WriteVICALUX_MX, ReadVICALUV_MX, ReadVICALUX_MX]>; ++ SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx>; + defm "" : VPseudoBinaryV_IM, +- Sched<[WriteVICALUI_MX, ReadVICALUV_MX]>; ++ SchedUnary<"WriteVICALUI", "ReadVICALUV", mx>; + } + } + + multiclass VPseudoVCALUM_V_X { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVICALUV_MX = !cast("WriteVICALUV_" # mx); +- defvar WriteVICALUX_MX = !cast("WriteVICALUX_" # mx); +- defvar ReadVICALUV_MX = !cast("ReadVICALUV_" # mx); +- defvar ReadVICALUX_MX = !cast("ReadVICALUX_" # mx); +- + defm "" : VPseudoBinaryV_VM, +- Sched<[WriteVICALUV_MX, ReadVICALUV_MX, ReadVICALUV_MX]>; ++ SchedBinary<"WriteVICALUV", "ReadVICALUV", "ReadVICALUV", mx>; + defm "" : VPseudoBinaryV_XM, +- Sched<[WriteVICALUX_MX, ReadVICALUV_MX, ReadVICALUX_MX]>; ++ SchedBinary<"WriteVICALUX", "ReadVICALUV", "ReadVICALUX", mx>; + } + } + + multiclass VPseudoVNCLP_WV_WX_WI_RM { + foreach m = MxListW in { + defvar mx = m.MX; +- defvar WriteVNClipV_MX = !cast("WriteVNClipV_" # mx); +- defvar WriteVNClipX_MX = !cast("WriteVNClipX_" # mx); +- defvar WriteVNClipI_MX = !cast("WriteVNClipI_" # mx); +- defvar ReadVNClipV_MX = !cast("ReadVNClipV_" # mx); +- defvar ReadVNClipX_MX = !cast("ReadVNClipX_" # mx); +- + defm "" : VPseudoBinaryV_WV_RM, +- Sched<[WriteVNClipV_MX, ReadVNClipV_MX, ReadVNClipV_MX, ReadVMask]>; ++ SchedBinary<"WriteVNClipV", "ReadVNClipV", "ReadVNClipV", mx>; + defm "" : VPseudoBinaryV_WX_RM, +- Sched<[WriteVNClipX_MX, ReadVNClipV_MX, ReadVNClipX_MX, ReadVMask]>; ++ SchedBinary<"WriteVNClipX", "ReadVNClipV", "ReadVNClipX", mx>; + defm "" : VPseudoBinaryV_WI_RM, +- Sched<[WriteVNClipI_MX, ReadVNClipV_MX, ReadVMask]>; ++ SchedUnary<"WriteVNClipI", "ReadVNClipV", mx>; + } + } + + multiclass VPseudoVNSHT_WV_WX_WI { + foreach m = MxListW in { + defvar mx = m.MX; +- defvar WriteVNShiftV_MX = !cast("WriteVNShiftV_" # mx); +- defvar WriteVNShiftX_MX = !cast("WriteVNShiftX_" # mx); +- defvar WriteVNShiftI_MX = !cast("WriteVNShiftI_" # mx); +- defvar ReadVNShiftV_MX = !cast("ReadVNShiftV_" # mx); +- defvar ReadVNShiftX_MX = !cast("ReadVNShiftX_" # mx); +- + defm "" : VPseudoBinaryV_WV, +- Sched<[WriteVNShiftV_MX, ReadVNShiftV_MX, ReadVNShiftV_MX, ReadVMask]>; ++ SchedBinary<"WriteVNShiftV", "ReadVNShiftV", "ReadVNShiftV", mx>; + defm "" : VPseudoBinaryV_WX, +- Sched<[WriteVNShiftX_MX, ReadVNShiftV_MX, ReadVNShiftX_MX, ReadVMask]>; ++ SchedBinary<"WriteVNShiftX", "ReadVNShiftV", "ReadVNShiftX", mx>; + defm "" : VPseudoBinaryV_WI, +- Sched<[WriteVNShiftI_MX, ReadVNShiftV_MX, ReadVMask]>; ++ SchedUnary<"WriteVNShiftI", "ReadVNShiftV", mx>; + } + } + +@@ -3362,62 +3061,43 @@ + multiclass VPseudoVMAC_VV_VX_AAXA { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVIMulAddV_MX = !cast("WriteVIMulAddV_" # mx); +- defvar WriteVIMulAddX_MX = !cast("WriteVIMulAddX_" # mx); +- defvar ReadVIMulAddV_MX = !cast("ReadVIMulAddV_" # mx); +- defvar ReadVIMulAddX_MX = !cast("ReadVIMulAddX_" # mx); +- + defm "" : VPseudoTernaryV_VV_AAXA, +- Sched<[WriteVIMulAddV_MX, ReadVIMulAddV_MX, ReadVIMulAddV_MX, +- ReadVIMulAddV_MX, ReadVMask]>; ++ SchedTernary<"WriteVIMulAddV", "ReadVIMulAddV", "ReadVIMulAddV", ++ "ReadVIMulAddV", mx>; + defm "" : VPseudoTernaryV_VX_AAXA, +- Sched<[WriteVIMulAddX_MX, ReadVIMulAddV_MX, ReadVIMulAddV_MX, +- ReadVIMulAddX_MX, ReadVMask]>; ++ SchedTernary<"WriteVIMulAddX", "ReadVIMulAddV", "ReadVIMulAddV", ++ "ReadVIMulAddX", mx>; + } + } + + multiclass VPseudoVMAC_VV_VF_AAXA { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFMulAddV_MX = !cast("WriteVFMulAddV_" # mx); +- defvar ReadVFMulAddV_MX = !cast("ReadVFMulAddV_" # mx); +- + defm "" : VPseudoTernaryV_VV_AAXA, +- Sched<[WriteVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVMask]>; ++ SchedTernary<"WriteVFMulAddV", "ReadVFMulAddV", "ReadVFMulAddV", ++ "ReadVFMulAddV", m.MX>; + } + + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFMulAddF_MX = !cast("WriteVFMulAddF_" # mx); +- defvar ReadVFMulAddV_MX = !cast("ReadVFMulAddV_" # mx); +- defvar ReadVFMulAddF_MX = !cast("ReadVFMulAddF_" # mx); +- + defm "" : VPseudoTernaryV_VF_AAXA, +- Sched<[WriteVFMulAddF_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddF_MX, ReadVMask]>; ++ SchedTernary<"WriteVFMulAddF", "ReadVFMulAddV", "ReadVFMulAddV", ++ "ReadVFMulAddF", m.MX>; + } + } + } + + multiclass VPseudoVMAC_VV_VF_AAXA_RM { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFMulAddV_MX = !cast("WriteVFMulAddV_" # mx); +- defvar ReadVFMulAddV_MX = !cast("ReadVFMulAddV_" # mx); +- + defm "" : VPseudoTernaryV_VV_AAXA_RM, +- Sched<[WriteVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVMask]>; ++ SchedTernary<"WriteVFMulAddV", "ReadVFMulAddV", "ReadVFMulAddV", ++ "ReadVFMulAddV", m.MX>; + } + + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFMulAddF_MX = !cast("WriteVFMulAddF_" # mx); +- defvar ReadVFMulAddV_MX = !cast("ReadVFMulAddV_" # mx); +- defvar ReadVFMulAddF_MX = !cast("ReadVFMulAddF_" # mx); +- + defm "" : VPseudoTernaryV_VF_AAXA_RM, +- Sched<[WriteVFMulAddF_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddF_MX, ReadVMask]>; ++ SchedTernary<"WriteVFMulAddF", "ReadVFMulAddV", "ReadVFMulAddV", ++ "ReadVFMulAddF", m.MX>; + } + } + } +@@ -3425,70 +3105,46 @@ + multiclass VPseudoVSLD_VX_VI { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVISlideX_MX = !cast("WriteVISlideX_" # mx); +- defvar WriteVISlideI_MX = !cast("WriteVISlideI_" # mx); +- defvar ReadVISlideV_MX = !cast("ReadVISlideV_" # mx); +- defvar ReadVISlideX_MX = !cast("ReadVISlideX_" # mx); +- + defm "" : VPseudoVSLDV_VX, +- Sched<[WriteVISlideX_MX, ReadVISlideV_MX, ReadVISlideV_MX, +- ReadVISlideX_MX, ReadVMask]>; ++ SchedTernary<"WriteVISlideX", "ReadVISlideV", "ReadVISlideV", ++ "ReadVISlideX", mx>; + defm "" : VPseudoVSLDV_VI, +- Sched<[WriteVISlideI_MX, ReadVISlideV_MX, ReadVISlideV_MX, ReadVMask]>; ++ SchedBinary<"WriteVISlideI", "ReadVISlideV", "ReadVISlideV", mx>; + } + } + + multiclass VPseudoVWMAC_VV_VX { + foreach m = MxListW in { + defvar mx = m.MX; +- defvar WriteVIWMulAddV_MX = !cast("WriteVIWMulAddV_" # mx); +- defvar WriteVIWMulAddX_MX = !cast("WriteVIWMulAddX_" # mx); +- defvar ReadVIWMulAddV_MX = !cast("ReadVIWMulAddV_" # mx); +- defvar ReadVIWMulAddX_MX = !cast("ReadVIWMulAddX_" # mx); +- + defm "" : VPseudoTernaryW_VV, +- Sched<[WriteVIWMulAddV_MX, ReadVIWMulAddV_MX, ReadVIWMulAddV_MX, +- ReadVIWMulAddV_MX, ReadVMask]>; ++ SchedTernary<"WriteVIWMulAddV", "ReadVIWMulAddV", "ReadVIWMulAddV", ++ "ReadVIWMulAddV", mx>; + defm "" : VPseudoTernaryW_VX, +- Sched<[WriteVIWMulAddX_MX, ReadVIWMulAddV_MX, ReadVIWMulAddV_MX, +- ReadVIWMulAddX_MX, ReadVMask]>; ++ SchedTernary<"WriteVIWMulAddX", "ReadVIWMulAddV", "ReadVIWMulAddV", ++ "ReadVIWMulAddX", mx>; + } + } + + multiclass VPseudoVWMAC_VX { + foreach m = MxListW in { +- defvar mx = m.MX; +- defvar WriteVIWMulAddX_MX = !cast("WriteVIWMulAddX_" # mx); +- defvar ReadVIWMulAddV_MX= !cast("ReadVIWMulAddV_" # mx); +- defvar ReadVIWMulAddX_MX = !cast("ReadVIWMulAddX_" # mx); +- + defm "" : VPseudoTernaryW_VX, +- Sched<[WriteVIWMulAddX_MX, ReadVIWMulAddV_MX, ReadVIWMulAddV_MX, +- ReadVIWMulAddX_MX, ReadVMask]>; ++ SchedTernary<"WriteVIWMulAddX", "ReadVIWMulAddV", "ReadVIWMulAddV", ++ "ReadVIWMulAddX", m.MX>; + } + } + + multiclass VPseudoVWMAC_VV_VF_RM { + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWMulAddV_MX = !cast("WriteVFWMulAddV_" # mx); +- defvar ReadVFWMulAddV_MX = !cast("ReadVFWMulAddV_" # mx); +- + defm "" : VPseudoTernaryW_VV_RM, +- Sched<[WriteVFWMulAddV_MX, ReadVFWMulAddV_MX, +- ReadVFWMulAddV_MX, ReadVFWMulAddV_MX, ReadVMask]>; ++ SchedTernary<"WriteVFWMulAddV", "ReadVFWMulAddV", ++ "ReadVFWMulAddV", "ReadVFWMulAddV", m.MX>; + } + + foreach f = FPListW in { + foreach m = f.MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWMulAddF_MX = !cast("WriteVFWMulAddF_" # mx); +- defvar ReadVFWMulAddV_MX = !cast("ReadVFWMulAddV_" # mx); +- defvar ReadVFWMulAddF_MX = !cast("ReadVFWMulAddF_" # mx); +- + defm "" : VPseudoTernaryW_VF_RM, +- Sched<[WriteVFWMulAddF_MX, ReadVFWMulAddV_MX, +- ReadVFWMulAddV_MX, ReadVFWMulAddF_MX, ReadVMask]>; ++ SchedTernary<"WriteVFWMulAddF", "ReadVFWMulAddV", ++ "ReadVFWMulAddV", "ReadVFWMulAddF", m.MX>; + } + } + } +@@ -3496,55 +3152,35 @@ + multiclass VPseudoVCMPM_VV_VX_VI { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVICmpV_MX = !cast("WriteVICmpV_" # mx); +- defvar WriteVICmpX_MX = !cast("WriteVICmpX_" # mx); +- defvar WriteVICmpI_MX = !cast("WriteVICmpI_" # mx); +- defvar ReadVICmpV_MX = !cast("ReadVICmpV_" # mx); +- defvar ReadVICmpX_MX = !cast("ReadVICmpX_" # mx); +- + defm "" : VPseudoBinaryM_VV, +- Sched<[WriteVICmpV_MX, ReadVICmpV_MX, ReadVICmpV_MX, ReadVMask]>; ++ SchedBinary<"WriteVICmpV", "ReadVICmpV", "ReadVICmpV", mx>; + defm "" : VPseudoBinaryM_VX, +- Sched<[WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, ReadVMask]>; ++ SchedBinary<"WriteVICmpX", "ReadVICmpV", "ReadVICmpX", mx>; + defm "" : VPseudoBinaryM_VI, +- Sched<[WriteVICmpI_MX, ReadVICmpV_MX, ReadVMask]>; ++ SchedUnary<"WriteVICmpI", "ReadVICmpV", mx>; + } + } + + multiclass VPseudoVCMPM_VV_VX { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVICmpV_MX = !cast("WriteVICmpV_" # mx); +- defvar WriteVICmpX_MX = !cast("WriteVICmpX_" # mx); +- defvar ReadVICmpV_MX = !cast("ReadVICmpV_" # mx); +- defvar ReadVICmpX_MX = !cast("ReadVICmpX_" # mx); +- + defm "" : VPseudoBinaryM_VV, +- Sched<[WriteVICmpV_MX, ReadVICmpV_MX, ReadVICmpV_MX, ReadVMask]>; ++ SchedBinary<"WriteVICmpV", "ReadVICmpV", "ReadVICmpV", mx>; + defm "" : VPseudoBinaryM_VX, +- Sched<[WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, ReadVMask]>; ++ SchedBinary<"WriteVICmpX", "ReadVICmpV", "ReadVICmpX", mx>; + } + } + + multiclass VPseudoVCMPM_VV_VF { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFCmpV_MX = !cast("WriteVFCmpV_" # mx); +- defvar ReadVFCmpV_MX = !cast("ReadVFCmpV_" # mx); +- + defm "" : VPseudoBinaryM_VV, +- Sched<[WriteVFCmpV_MX, ReadVFCmpV_MX, ReadVFCmpV_MX, ReadVMask]>; ++ SchedBinary<"WriteVFCmpV", "ReadVFCmpV", "ReadVFCmpV", m.MX>; + } + + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFCmpF_MX = !cast("WriteVFCmpF_" # mx); +- defvar ReadVFCmpV_MX = !cast("ReadVFCmpV_" # mx); +- defvar ReadVFCmpF_MX = !cast("ReadVFCmpF_" # mx); +- + defm "" : VPseudoBinaryM_VF, +- Sched<[WriteVFCmpF_MX, ReadVFCmpV_MX, ReadVFCmpF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFCmpF", "ReadVFCmpV", "ReadVFCmpF", m.MX>; + } + } + } +@@ -3552,13 +3188,8 @@ + multiclass VPseudoVCMPM_VF { + foreach f = FPList in { + foreach m = f.MxList in { +- defvar mx = m.MX; +- defvar WriteVFCmpF_MX = !cast("WriteVFCmpF_" # mx); +- defvar ReadVFCmpV_MX = !cast("ReadVFCmpV_" # mx); +- defvar ReadVFCmpF_MX = !cast("ReadVFCmpF_" # mx); +- + defm "" : VPseudoBinaryM_VF, +- Sched<[WriteVFCmpF_MX, ReadVFCmpV_MX, ReadVFCmpF_MX, ReadVMask]>; ++ SchedBinary<"WriteVFCmpF", "ReadVFCmpV", "ReadVFCmpF", m.MX>; + } + } + } +@@ -3566,15 +3197,10 @@ + multiclass VPseudoVCMPM_VX_VI { + foreach m = MxList in { + defvar mx = m.MX; +- defvar WriteVICmpX_MX = !cast("WriteVICmpX_" # mx); +- defvar WriteVICmpI_MX = !cast("WriteVICmpI_" # mx); +- defvar ReadVICmpV_MX = !cast("ReadVICmpV_" # mx); +- defvar ReadVICmpX_MX = !cast("ReadVICmpX_" # mx); +- + defm "" : VPseudoBinaryM_VX, +- Sched<[WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, ReadVMask]>; ++ SchedBinary<"WriteVICmpX", "ReadVICmpV", "ReadVICmpX", mx>; + defm "" : VPseudoBinaryM_VI, +- Sched<[WriteVICmpI_MX, ReadVICmpV_MX, ReadVMask]>; ++ SchedUnary<"WriteVICmpI", "ReadVICmpV", mx>; + } + } + +@@ -3582,10 +3208,8 @@ + foreach m = MxList in { + defvar mx = m.MX; + foreach e = SchedSEWSet.val in { +- defvar WriteVIRedV_From_MX_E = !cast("WriteVIRedV_From_" # mx # "_E" # e); + defm _VS : VPseudoTernaryWithTailPolicy, +- Sched<[WriteVIRedV_From_MX_E, ReadVIRedV, ReadVIRedV, ReadVIRedV, +- ReadVMask]>; ++ SchedReduction<"WriteVIRedV_From", "ReadVIRedV", mx, e>; + } + } + } +@@ -3594,10 +3218,8 @@ + foreach m = MxList in { + defvar mx = m.MX; + foreach e = SchedSEWSet.val in { +- defvar WriteVIRedMinMaxV_From_MX_E = !cast("WriteVIRedMinMaxV_From_" # mx # "_E" # e); + defm _VS : VPseudoTernaryWithTailPolicy, +- Sched<[WriteVIRedMinMaxV_From_MX_E, ReadVIRedV, ReadVIRedV, +- ReadVIRedV, ReadVMask]>; ++ SchedReduction<"WriteVIRedMinMaxV_From", "ReadVIRedV", mx, e>; + } + } + } +@@ -3606,10 +3228,8 @@ + foreach m = MxListWRed in { + defvar mx = m.MX; + foreach e = SchedSEWSet.val in { +- defvar WriteVIWRedV_From_MX_E = !cast("WriteVIWRedV_From_" # mx # "_E" # e); + defm _VS : VPseudoTernaryWithTailPolicy, +- Sched<[WriteVIWRedV_From_MX_E, ReadVIWRedV, ReadVIWRedV, +- ReadVIWRedV, ReadVMask]>; ++ SchedReduction<"WriteVIWRedV_From", "ReadVIWRedV", mx, e>; + } + } + } +@@ -3618,12 +3238,10 @@ + foreach m = MxListF in { + defvar mx = m.MX; + foreach e = SchedSEWSet.val in { +- defvar WriteVFRedV_From_MX_E = !cast("WriteVFRedV_From_" # mx # "_E" # e); + defm _VS + : VPseudoTernaryWithTailPolicyRoundingMode, +- Sched<[WriteVFRedV_From_MX_E, ReadVFRedV, ReadVFRedV, ReadVFRedV, +- ReadVMask]>; ++ SchedReduction<"WriteVFRedV_From", "ReadVFRedV", mx, e>; + } + } + } +@@ -3632,10 +3250,8 @@ + foreach m = MxListF in { + defvar mx = m.MX; + foreach e = SchedSEWSet.val in { +- defvar WriteVFRedMinMaxV_From_MX_E = !cast("WriteVFRedMinMaxV_From_" # mx # "_E" # e); + defm _VS : VPseudoTernaryWithTailPolicy, +- Sched<[WriteVFRedMinMaxV_From_MX_E, ReadVFRedV, ReadVFRedV, ReadVFRedV, +- ReadVMask]>; ++ SchedReduction<"WriteVFRedMinMaxV_From", "ReadVFRedV", mx, e>; + } + } + } +@@ -3644,11 +3260,9 @@ + foreach m = MxListF in { + defvar mx = m.MX; + foreach e = SchedSEWSet.val in { +- defvar WriteVFRedOV_From_MX_E = !cast("WriteVFRedOV_From_" # mx # "_E" # e); + defm _VS : VPseudoTernaryWithTailPolicyRoundingMode, +- Sched<[WriteVFRedOV_From_MX_E, ReadVFRedOV, ReadVFRedOV, +- ReadVFRedOV, ReadVMask]>; ++ SchedReduction<"WriteVFRedOV_From", "ReadVFRedOV", mx, e>; + } + } + } +@@ -3657,12 +3271,10 @@ + foreach m = MxListFWRed in { + defvar mx = m.MX; + foreach e = SchedSEWSet.val in { +- defvar WriteVFWRedV_From_MX_E = !cast("WriteVFWRedV_From_" # mx # "_E" # e); + defm _VS + : VPseudoTernaryWithTailPolicyRoundingMode, +- Sched<[WriteVFWRedV_From_MX_E, ReadVFWRedV, ReadVFWRedV, +- ReadVFWRedV, ReadVMask]>; ++ SchedReduction<"WriteVFWRedV_From", "ReadVFWRedV", mx, e>; + } + } + } +@@ -3716,211 +3328,139 @@ + + multiclass VPseudoVCVTI_V { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFCvtFToIV_MX = !cast("WriteVFCvtFToIV_" # mx); +- defvar ReadVFCvtFToIV_MX = !cast("ReadVFCvtFToIV_" # mx); +- + defm _V : VPseudoConversion, +- Sched<[WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX>; + } + } + + multiclass VPseudoVCVTI_V_RM { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFCvtFToIV_MX = !cast("WriteVFCvtFToIV_" # mx); +- defvar ReadVFCvtFToIV_MX = !cast("ReadVFCvtFToIV_" # mx); +- + defm _V : VPseudoConversionRoundingMode, +- Sched<[WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX>; + } + } + + multiclass VPseudoVCVTI_RM_V { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFCvtFToIV_MX = !cast("WriteVFCvtFToIV_" # mx); +- defvar ReadVFCvtFToIV_MX = !cast("ReadVFCvtFToIV_" # mx); +- + defm _V : VPseudoConversionRM, +- Sched<[WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX>; + } + } + + multiclass VPseudoVFROUND_NOEXCEPT_V { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFCvtFToIV_MX = !cast("WriteVFCvtFToIV_" # mx); +- defvar ReadVFCvtFToIV_MX = !cast("ReadVFCvtFToIV_" # mx); +- + defm _V : VPseudoConversionNoExcept, +- Sched<[WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFCvtFToIV", "ReadVFCvtFToIV", m.MX>; + } + } + + multiclass VPseudoVCVTF_V_RM { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFCvtIToFV_MX = !cast("WriteVFCvtIToFV_" # mx); +- defvar ReadVFCvtIToFV_MX = !cast("ReadVFCvtIToFV_" # mx); +- + defm _V : VPseudoConversionRoundingMode, +- Sched<[WriteVFCvtIToFV_MX, ReadVFCvtIToFV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFCvtIToFV", "ReadVFCvtIToFV", m.MX>; + } + } + + multiclass VPseudoVCVTF_RM_V { + foreach m = MxListF in { +- defvar mx = m.MX; +- defvar WriteVFCvtIToFV_MX = !cast("WriteVFCvtIToFV_" # mx); +- defvar ReadVFCvtIToFV_MX = !cast("ReadVFCvtIToFV_" # mx); +- + defm _V : VPseudoConversionRM, +- Sched<[WriteVFCvtIToFV_MX, ReadVFCvtIToFV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFCvtIToFV", "ReadVFCvtIToFV", m.MX>; + } + } + + multiclass VPseudoVWCVTI_V { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWCvtFToIV_MX = !cast("WriteVFWCvtFToIV_" # mx); +- defvar ReadVFWCvtFToIV_MX = !cast("ReadVFWCvtFToIV_" # mx); +- + defm _V : VPseudoConversion, +- Sched<[WriteVFWCvtFToIV_MX, ReadVFWCvtFToIV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX>; + } + } + + multiclass VPseudoVWCVTI_V_RM { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWCvtFToIV_MX = !cast("WriteVFWCvtFToIV_" # mx); +- defvar ReadVFWCvtFToIV_MX = !cast("ReadVFWCvtFToIV_" # mx); +- + defm _V : VPseudoConversionRoundingMode, +- Sched<[WriteVFWCvtFToIV_MX, ReadVFWCvtFToIV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX>; + } + } + + multiclass VPseudoVWCVTI_RM_V { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWCvtFToIV_MX = !cast("WriteVFWCvtFToIV_" # mx); +- defvar ReadVFWCvtFToIV_MX = !cast("ReadVFWCvtFToIV_" # mx); +- + defm _V : VPseudoConversionRM, +- Sched<[WriteVFWCvtFToIV_MX, ReadVFWCvtFToIV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFWCvtFToIV", "ReadVFWCvtFToIV", m.MX>; + } + } + + multiclass VPseudoVWCVTF_V { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListW in { +- defvar mx = m.MX; +- defvar WriteVFWCvtIToFV_MX = !cast("WriteVFWCvtIToFV_" # mx); +- defvar ReadVFWCvtIToFV_MX = !cast("ReadVFWCvtIToFV_" # mx); +- + defm _V : VPseudoConversion, +- Sched<[WriteVFWCvtIToFV_MX, ReadVFWCvtIToFV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV", m.MX>; + } + } + + multiclass VPseudoVWCVTD_V { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFWCvtFToFV_MX = !cast("WriteVFWCvtFToFV_" # mx); +- defvar ReadVFWCvtFToFV_MX = !cast("ReadVFWCvtFToFV_" # mx); +- + defm _V : VPseudoConversion, +- Sched<[WriteVFWCvtFToFV_MX, ReadVFWCvtFToFV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV", m.MX>; + } + } + + multiclass VPseudoVNCVTI_W { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListW in { +- defvar mx = m.MX; +- defvar WriteVFNCvtFToIV_MX = !cast("WriteVFNCvtFToIV_" # mx); +- defvar ReadVFNCvtFToIV_MX = !cast("ReadVFNCvtFToIV_" # mx); +- + defm _W : VPseudoConversion, +- Sched<[WriteVFNCvtFToIV_MX, ReadVFNCvtFToIV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX>; + } + } + + multiclass VPseudoVNCVTI_W_RM { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListW in { +- defvar mx = m.MX; +- defvar WriteVFNCvtFToIV_MX = !cast("WriteVFNCvtFToIV_" # mx); +- defvar ReadVFNCvtFToIV_MX = !cast("ReadVFNCvtFToIV_" # mx); +- + defm _W : VPseudoConversionRoundingMode, +- Sched<[WriteVFNCvtFToIV_MX, ReadVFNCvtFToIV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX>; + } + } + + multiclass VPseudoVNCVTI_RM_W { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListW in { +- defvar mx = m.MX; +- defvar WriteVFNCvtFToIV_MX = !cast("WriteVFNCvtFToIV_" # mx); +- defvar ReadVFNCvtFToIV_MX = !cast("ReadVFNCvtFToIV_" # mx); +- + defm _W : VPseudoConversionRM, +- Sched<[WriteVFNCvtFToIV_MX, ReadVFNCvtFToIV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFNCvtFToIV", "ReadVFNCvtFToIV", m.MX>; + } + } + + multiclass VPseudoVNCVTF_W_RM { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFNCvtIToFV_MX = !cast("WriteVFNCvtIToFV_" # mx); +- defvar ReadVFNCvtIToFV_MX = !cast("ReadVFNCvtIToFV_" # mx); +- + defm _W : VPseudoConversionRoundingMode, +- Sched<[WriteVFNCvtIToFV_MX, ReadVFNCvtIToFV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX>; + } + } + + multiclass VPseudoVNCVTF_RM_W { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFNCvtIToFV_MX = !cast("WriteVFNCvtIToFV_" # mx); +- defvar ReadVFNCvtIToFV_MX = !cast("ReadVFNCvtIToFV_" # mx); +- + defm _W : VPseudoConversionRM, +- Sched<[WriteVFNCvtIToFV_MX, ReadVFNCvtIToFV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX>; + } + } + + multiclass VPseudoVNCVTD_W { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFNCvtFToFV_MX = !cast("WriteVFNCvtFToFV_" # mx); +- defvar ReadVFNCvtFToFV_MX = !cast("ReadVFNCvtFToFV_" # mx); +- + defm _W : VPseudoConversion, +- Sched<[WriteVFNCvtFToFV_MX, ReadVFNCvtFToFV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX>; + } + } + + multiclass VPseudoVNCVTD_W_RM { + defvar constraint = "@earlyclobber $rd"; + foreach m = MxListFW in { +- defvar mx = m.MX; +- defvar WriteVFNCvtFToFV_MX = !cast("WriteVFNCvtFToFV_" # mx); +- defvar ReadVFNCvtFToFV_MX = !cast("ReadVFNCvtFToFV_" # mx); +- + defm _W : VPseudoConversionRoundingMode, +- Sched<[WriteVFNCvtFToFV_MX, ReadVFNCvtFToFV_MX, ReadVMask]>; ++ SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX>; + } + } + + 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 @@ -108,23 +108,49 @@ ReadVLDX, ReadVMask ]>; +class VLESchedMask : Sched<[ + !cast("WriteVLDE_" # lmul), + !cast("ReadVMergeOp_" # lmul), ReadVLDX, ReadVMask +]>; + class VSESched : Sched<[ !cast("WriteVSTE_" #lmul), !cast("ReadVSTEV_" #lmul), ReadVSTX, ReadVMask ]>; +class VSESchedMask : Sched<[ + !cast("WriteVSTE_" # lmul), + !cast("ReadVMergeOp_" # lmul), + !cast("ReadVSTEV_" # lmul), ReadVSTX, ReadVMask, +]>; + class VLSSched : Sched<[ !cast("WriteVLDS" #eew #"_" #emul), ReadVLDX, ReadVLDSX, ReadVMask ]>; +class VLSSchedMask : Sched<[ + !cast("WriteVLDS" # eew #"_" #emul), + !cast("ReadVMergeOp_" # emul # "_E" # eew), ReadVLDX, ReadVLDSX, + ReadVMask +]>; + + class VSSSched : Sched<[ !cast("WriteVSTS" #eew #"_" #emul), !cast("ReadVSTS" #eew #"V_" #emul), ReadVSTX, ReadVSTSX, ReadVMask ]>; +class VSSSchedMask : Sched<[ + !cast("WriteVSTS" #eew #"_" #emul), + !cast("ReadVMergeOp_" # emul # "_E" # eew), + !cast("ReadVSTS" #eew #"V_" #emul), ReadVSTX, ReadVSTSX, + ReadVMask +]>; + + class VLXSched : Sched<[ @@ -133,6 +159,15 @@ !cast("ReadVLD" #isOrdered #"XV_" #idxEMUL), ReadVMask ]>; +class VLXSchedMask : Sched<[ + !cast("WriteVLD" #isOrdered #"X" #dataEEW #"_" #dataEMUL), + !cast("ReadVMergeOp_" # dataEMUL # "_E" # dataEEW), ReadVLDX, + !cast("ReadVLD" #isOrdered #"XV_" #idxEMUL), ReadVMask, +]>; + + class VSXSched : Sched<[ @@ -141,45 +176,101 @@ ReadVSTX, !cast("ReadVST" #isOrdered #"XV_" #idxEMUL), ReadVMask ]>; +class VSXSchedMask : Sched<[ + !cast("WriteVST" #isOrdered #"X" #dataEEW #"_" #dataEMUL), + !cast("ReadVMergeOp_" # dataEMUL # "_E" # dataEEW), + !cast("ReadVST" #isOrdered #"X" #dataEEW #"_" #dataEMUL), + ReadVSTX, !cast("ReadVST" #isOrdered #"XV_" #idxEMUL), + ReadVMask +]>; + + class VLFSched : Sched<[ !cast("WriteVLDFF_" #lmul), ReadVLDX, ReadVMask ]>; +class VLFSchedMask : Sched<[ + !cast("WriteVLDFF_" # lmul), + !cast("ReadVMergeOp_" # lmul), ReadVLDX, ReadVMask, +]>; + // Unit-Stride Segment Loads and Stores class VLSEGSched : Sched<[ !cast("WriteVLSEG" #nf #"e" #eew #"_" #emul), ReadVLDX, ReadVMask ]>; +class VLSEGSchedMask : Sched<[ + !cast("WriteVLSEG" #nf #"e" #eew #"_" #emul), + !cast("ReadVMergeOp_" # emul # "_E" # eew), ReadVLDX, ReadVMask +]>; + class VSSEGSched : Sched<[ !cast("WriteVSSEG" #nf #"e" #eew #"_" #emul), !cast("ReadVSTEV_" #emul), ReadVSTX, ReadVMask ]>; +class VSSEGSchedMask : Sched<[ + !cast("WriteVSSEG" #nf #"e" #eew #"_" #emul), + !cast("ReadVMergeOp_" # emul # "_E" # eew), + !cast("ReadVSTEV_" #emul), ReadVSTX, ReadVMask +]>; + class VLSEGFFSched : Sched<[ !cast("WriteVLSEGFF" #nf #"e" #eew #"_" #emul), ReadVLDX, ReadVMask ]>; +class VLSEGFFSchedMask : Sched<[ + !cast("WriteVLSEGFF" #nf #"e" #eew #"_" #emul), + !cast("ReadVMergeOp_" # emul # "_E" # eew), ReadVLDX, ReadVMask +]>; + // Strided Segment Loads and Stores class VLSSEGSched : Sched<[ !cast("WriteVLSSEG" #nf #"e" #eew #"_" #emul), ReadVLDX, ReadVLDSX, ReadVMask ]>; +class VLSSEGSchedMask : Sched<[ + !cast("WriteVLSSEG" #nf #"e" #eew #"_" #emul), + !cast("ReadVMergeOp_" # emul # "_E" # eew), ReadVLDX, ReadVLDSX, + ReadVMask +]>; + class VSSSEGSched : Sched<[ !cast("WriteVSSSEG" #nf #"e" #eew #"_" #emul), !cast("ReadVSTS" #eew #"V_" #emul), ReadVSTX, ReadVSTSX, ReadVMask ]>; +class VSSSEGSchedMask : Sched<[ + !cast("WriteVSSSEG" #nf #"e" #eew #"_" #emul), + !cast("ReadVMergeOp_" # emul # "_E" # eew), + !cast("ReadVSTS" #eew #"V_" #emul), ReadVSTX, ReadVSTSX, + ReadVMask +]>; + // Indexed Segment Loads and Stores class VLXSEGSched : Sched<[ !cast("WriteVL" #isOrdered #"XSEG" #nf #"e" #eew #"_" #emul), ReadVLDX, !cast("ReadVLD" #isOrdered #"XV_" #emul), ReadVMask ]>; +class VLXSEGSchedMask : Sched<[ + !cast("WriteVL" #isOrdered #"XSEG" #nf #"e" #eew #"_" #emul), + !cast("ReadVMergeOp_" # emul # "_E" # eew), ReadVLDX, + !cast("ReadVLD" #isOrdered #"XV_" #emul), ReadVMask +]>; class VSXSEGSched : Sched<[ !cast("WriteVS" #isOrdered #"XSEG" #nf #"e" #eew #"_" #emul), !cast("ReadVST" #isOrdered #"X" #eew #"_" #emul), ReadVSTX, !cast("ReadVST" #isOrdered #"XV_" #emul), ReadVMask ]>; +class VSXSEGSchedMask : Sched<[ + !cast("WriteVS" #isOrdered #"XSEG" #nf #"e" #eew #"_" #emul), + !cast("ReadVMergeOp_" # emul), + !cast("ReadVST" #isOrdered #"X" #eew #"_" #emul), ReadVSTX, + !cast("ReadVST" #isOrdered #"XV_" #emul), ReadVMask +]>; //===----------------------------------------------------------------------===// // Instruction class templates 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 @@ -253,6 +253,11 @@ true: m.MX)); } +// Helper subroutine used to insert ToInsert at index 1 of Lst. +class InsertAtIdx1 Lst, SchedReadWrite ToInsert> { + list l = !listconcat([!head(Lst)], [ToInsert], !tail(Lst)); +} + //===----------------------------------------------------------------------===// // Vector register and vector group type information. //===----------------------------------------------------------------------===// @@ -1715,7 +1720,7 @@ def "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoUSLoadMask, RISCVMaskedPseudo, - VLESched; + VLESchedMask; } } } @@ -1733,7 +1738,7 @@ def "E" # eew # "FF_V_" # LInfo # "_MASK": VPseudoUSLoadFFMask, RISCVMaskedPseudo, - VLFSched; + VLFSchedMask; } } } @@ -1761,7 +1766,7 @@ def "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoSLoadMask, RISCVMaskedPseudo, - VLSSched; + VLSSchedMask; } } } @@ -1790,7 +1795,7 @@ def "EI" # idxEEW # "_V_" # IdxLInfo # "_" # DataLInfo # "_MASK" : VPseudoILoadMask, RISCVMaskedPseudo, - VLXSched; + VLXSchedMask; } } } @@ -1807,7 +1812,7 @@ def "E" # eew # "_V_" # LInfo : VPseudoUSStoreNoMask, VSESched; def "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoUSStoreMask, - VSESched; + VSESchedMask; } } } @@ -1833,7 +1838,7 @@ def "E" # eew # "_V_" # LInfo : VPseudoSStoreNoMask, VSSSched; def "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoSStoreMask, - VSSSched; + VSSSchedMask; } } } @@ -1860,7 +1865,7 @@ VSXSched; def "EI" # idxEEW # "_V_" # IdxLInfo # "_" # DataLInfo # "_MASK" : VPseudoIStoreMask, - VSXSched; + VSXSchedMask; } } } @@ -1873,11 +1878,15 @@ defvar mx = mti.LMul.MX; defvar WriteVMPopV_MX = !cast("WriteVMPopV_" # mx); defvar ReadVMPopV_MX = !cast("ReadVMPopV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + let VLMul = mti.LMul.value in { def "_M_" # mti.BX : VPseudoUnaryNoMaskGPROut, - Sched<[WriteVMPopV_MX, ReadVMPopV_MX, ReadVMPopV_MX]>; + Sched<[WriteVMPopV_MX, ReadVMPopV_MX, + ReadVMPopV_MX]>; def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMaskGPROut, - Sched<[WriteVMPopV_MX, ReadVMPopV_MX, ReadVMPopV_MX]>; + Sched<[WriteVMPopV_MX, ReadVMergeOp_MX, + ReadVMPopV_MX, ReadVMPopV_MX]>; } } } @@ -1887,11 +1896,15 @@ defvar mx = mti.LMul.MX; defvar WriteVMFFSV_MX = !cast("WriteVMFFSV_" # mx); defvar ReadVMFFSV_MX = !cast("ReadVMFFSV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + let VLMul = mti.LMul.value in { def "_M_" # mti.BX : VPseudoUnaryNoMaskGPROut, - Sched<[WriteVMFFSV_MX, ReadVMFFSV_MX, ReadVMFFSV_MX]>; + Sched<[WriteVMFFSV_MX, ReadVMFFSV_MX, + ReadVMFFSV_MX]>; def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMaskGPROut, - Sched<[WriteVMFFSV_MX, ReadVMFFSV_MX, ReadVMFFSV_MX]>; + Sched<[WriteVMFFSV_MX, ReadVMergeOp_MX, + ReadVMFFSV_MX, ReadVMFFSV_MX]>; } } } @@ -1902,11 +1915,14 @@ defvar mx = mti.LMul.MX; defvar WriteVMSFSV_MX = !cast("WriteVMSFSV_" # mx); defvar ReadVMSFSV_MX = !cast("ReadVMSFSV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + let VLMul = mti.LMul.value in { def "_M_" # mti.BX : VPseudoUnaryNoMask, Sched<[WriteVMSFSV_MX, ReadVMSFSV_MX, ReadVMask]>; def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMask, - Sched<[WriteVMSFSV_MX, ReadVMSFSV_MX, ReadVMask]>; + Sched<[WriteVMSFSV_MX, ReadVMergeOp_MX, + ReadVMSFSV_MX, ReadVMask]>; } } } @@ -1916,13 +1932,15 @@ defvar mx = m.MX; defvar WriteVMIdxV_MX = !cast("WriteVMIdxV_" # mx); defvar ReadVMIdxV_MX = !cast("ReadVMIdxV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); let VLMul = m.value in { def "_V_" # m.MX : VPseudoNullaryNoMask, Sched<[WriteVMIdxV_MX, ReadVMask]>; def "_V_" # m.MX # "_MASK" : VPseudoNullaryMask, RISCVMaskedPseudo, - Sched<[WriteVMIdxV_MX, ReadVMask]>; + Sched<[WriteVMIdxV_MX, ReadVMergeOp_MX, + ReadVMask]>; } } } @@ -1946,12 +1964,15 @@ defvar mx = m.MX; defvar WriteVMIotV_MX = !cast("WriteVMIotV_" # mx); defvar ReadVMIotV_MX = !cast("ReadVMIotV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + let VLMul = m.value in { def "_" # m.MX : VPseudoUnaryNoMask, Sched<[WriteVMIotV_MX, ReadVMIotV_MX, ReadVMask]>; def "_" # m.MX # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - Sched<[WriteVMIotV_MX, ReadVMIotV_MX, ReadVMask]>; + Sched<[WriteVMIotV_MX, ReadVMergeOp_MX, + ReadVMIotV_MX, ReadVMask]>; } } } @@ -1963,12 +1984,15 @@ let VLMul = m.value in foreach e = sews in { defvar suffix = "_" # m.MX # "_E" # e; - defvar WriteVCompressV_MX_E = !cast("WriteVCompressV" # suffix); - defvar ReadVCompressV_MX_E = !cast("ReadVCompressV" # suffix); + defvar WriteVCompressV_MX_E = + !cast("WriteVCompressV" # suffix); + defvar ReadVCompressV_MX_E = + !cast("ReadVCompressV" # suffix); let SEW = e in def _VM # suffix : VPseudoUnaryAnyMask, - Sched<[WriteVCompressV_MX_E, ReadVCompressV_MX_E, ReadVCompressV_MX_E]>; + Sched<[WriteVCompressV_MX_E, ReadVCompressV_MX_E, + ReadVCompressV_MX_E]>; } } } @@ -1977,15 +2001,19 @@ VReg Op1Class, DAGOperand Op2Class, LMULInfo MInfo, + list ReadWrites, + list ReadWritesMask, string Constraint = "", int sew = 0> { let VLMul = MInfo.value, SEW=sew in { defvar suffix = !if(sew, "_" # MInfo.MX # "_E" # sew, "_" # MInfo.MX); def suffix : VPseudoBinaryNoMaskTU; + Constraint>, + Sched; def suffix # "_MASK" : VPseudoBinaryMaskPolicy, - RISCVMaskedPseudo; + RISCVMaskedPseudo, + Sched; } } @@ -1993,19 +2021,23 @@ VReg Op1Class, DAGOperand Op2Class, LMULInfo MInfo, + list ReadWrites, + list ReadWritesMask, string Constraint = "", int sew = 0, int UsesVXRM = 1> { let VLMul = MInfo.value, SEW=sew in { defvar suffix = !if(sew, "_" # MInfo.MX # "_E" # sew, "_" # MInfo.MX); def suffix : VPseudoBinaryNoMaskRoundingMode; + Constraint, UsesVXRM>, + Sched; def suffix # "_MASK" : VPseudoBinaryMaskPolicyRoundingMode, - RISCVMaskedPseudo; + RISCVMaskedPseudo, + Sched; } } @@ -2014,14 +2046,18 @@ VReg Op1Class, DAGOperand Op2Class, LMULInfo MInfo, + list ReadWrites, + list ReadWritesMask, string Constraint = ""> { let VLMul = MInfo.value in { def "_" # MInfo.MX : VPseudoBinaryMOutNoMask; + Constraint>, + Sched; let ForceTailAgnostic = true in def "_" # MInfo.MX # "_MASK" : VPseudoBinaryMOutMask, - RISCVMaskedPseudo; + RISCVMaskedPseudo, + Sched; } } @@ -2030,60 +2066,83 @@ DAGOperand Op2Class, LMULInfo lmul, LMULInfo emul, + list ReadWrites, + list ReadWritesMask, string Constraint = "", int sew = 0> { let VLMul = lmul.value, SEW=sew in { defvar suffix = !if(sew, "_" # lmul.MX # "_E" # sew, "_" # lmul.MX); - def suffix # "_" # emul.MX : VPseudoBinaryNoMaskTU; - def suffix # "_" # emul.MX # "_MASK" : VPseudoBinaryMaskPolicy, - RISCVMaskedPseudo; + def suffix # "_" # emul.MX : + VPseudoBinaryNoMaskTU, + Sched; + def suffix # "_" # emul.MX # "_MASK" : + VPseudoBinaryMaskPolicy, + RISCVMaskedPseudo, + Sched; } } multiclass VPseudoTiedBinary ReadWrites, + list ReadWritesMask, string Constraint = ""> { let VLMul = MInfo.value in { def "_" # MInfo.MX # "_TIED": VPseudoTiedBinaryNoMask; + Constraint>, + Sched; def "_" # MInfo.MX # "_MASK_TIED" : VPseudoTiedBinaryMask; + Constraint>, + Sched; } } multiclass VPseudoTiedBinaryRoundingMode ReadWrites, + list ReadWritesMask, string Constraint = ""> { let VLMul = MInfo.value in { def "_" # MInfo.MX # "_TIED": - VPseudoTiedBinaryNoMaskRoundingMode; + VPseudoTiedBinaryNoMaskRoundingMode, + Sched; def "_" # MInfo.MX # "_MASK_TIED" : - VPseudoTiedBinaryMaskRoundingMode; + VPseudoTiedBinaryMaskRoundingMode, + Sched; } } -multiclass VPseudoBinaryV_VV { - defm _VV : VPseudoBinary; +multiclass VPseudoBinaryV_VV ReadWrites, + list ReadWritesMask, + string Constraint = "", int sew = 0> { + defm _VV : VPseudoBinary; } -multiclass VPseudoBinaryV_VV_RM { - defm _VV : VPseudoBinaryRoundingMode; +multiclass VPseudoBinaryV_VV_RM ReadWrites, + list ReadWritesMask, + string Constraint = ""> { + defm _VV : VPseudoBinaryRoundingMode; } // Similar to VPseudoBinaryV_VV, but uses MxListF. -multiclass VPseudoBinaryFV_VV { - defm _VV : VPseudoBinary; +multiclass VPseudoBinaryFV_VV ReadWrites, + list ReadWritesMask, + string Constraint = "", int sew = 0> { + defm _VV : VPseudoBinary; } -multiclass VPseudoBinaryFV_VV_RM { +multiclass VPseudoBinaryFV_VV_RM ReadWrites, + list ReadWritesMask, + string Constraint = "", int sew = 0> { defm _VV : VPseudoBinaryRoundingMode; + ReadWrites, ReadWritesMask, Constraint, + sew, UsesVXRM=0>; } multiclass VPseudoVGTR_VV_EEW { @@ -2098,23 +2157,40 @@ defvar emul = !cast("V_" # emulMX); defvar sews = SchedSEWSet.val; foreach e = sews in { - defvar WriteVRGatherVV_MX_E = !cast("WriteVRGatherVV_" # mx # "_E" # e); - defvar ReadVRGatherVV_data_MX_E = !cast("ReadVRGatherVV_data_" # mx # "_E" # e); - defvar ReadVRGatherVV_index_MX_E = !cast("ReadVRGatherVV_index_" # mx # "_E" # e); - defm _VV : VPseudoBinaryEmul, - Sched<[WriteVRGatherVV_MX_E, ReadVRGatherVV_data_MX_E, ReadVRGatherVV_index_MX_E]>; + defvar WriteVRGatherVV_MX_E = + !cast("WriteVRGatherVV_" # mx # "_E" # e); + defvar ReadVRGatherVV_data_MX_E = + !cast("ReadVRGatherVV_data_" # mx # "_E" # e); + defvar ReadVRGatherVV_index_MX_E = + !cast("ReadVRGatherVV_index_" # mx # "_E" # e); + defvar ReadVMergeOp_MX_E = + !cast("ReadVMergeOp_" # mx # "_E" # e); + + defvar ReadWrites = [WriteVRGatherVV_MX_E, ReadVRGatherVV_data_MX_E, + ReadVRGatherVV_index_MX_E]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _VV : VPseudoBinaryEmul; } } } } } -multiclass VPseudoBinaryV_VX { - defm "_VX" : VPseudoBinary; +multiclass VPseudoBinaryV_VX ReadWrites, + list ReadWritesMask, + string Constraint = "", int sew = 0> { + defm "_VX" : VPseudoBinary; } -multiclass VPseudoBinaryV_VX_RM { - defm "_VX" : VPseudoBinaryRoundingMode; +multiclass VPseudoBinaryV_VX_RM ReadWrites, + list ReadWritesMask, + string Constraint = ""> { + defm "_VX" : VPseudoBinaryRoundingMode; } multiclass VPseudoVSLD1_VX { @@ -2123,23 +2199,36 @@ defvar WriteVISlide1X_MX = !cast("WriteVISlide1X_" # mx); defvar ReadVISlideV_MX = !cast("ReadVISlideV_" # mx); defvar ReadVISlideX_MX = !cast("ReadVISlideX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "_VX" : VPseudoBinary, - Sched<[WriteVISlide1X_MX, ReadVISlideV_MX, ReadVISlideX_MX, ReadVMask]>; + defvar ReadWrites = [WriteVISlide1X_MX, ReadVISlideV_MX, ReadVISlideX_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "_VX" : VPseudoBinary; } } -multiclass VPseudoBinaryV_VF { +multiclass VPseudoBinaryV_VF ReadWrites, + list ReadWritesMask, + string Constraint = "", int sew = 0> { defm "_V" # f.FX : VPseudoBinary; + f.fprclass, m, ReadWrites, ReadWritesMask, + Constraint, sew>; } -multiclass VPseudoBinaryV_VF_RM { +multiclass VPseudoBinaryV_VF_RM ReadWrites, + list ReadWritesMask, + string Constraint = "", int sew = 0> { defm "_V" # f.FX : VPseudoBinaryRoundingMode; } + multiclass VPseudoVSLD1_VF { foreach f = FPList in { foreach m = f.MxList in { @@ -2147,20 +2236,32 @@ defvar WriteVFSlide1F_MX = !cast("WriteVFSlide1F_" # mx); defvar ReadVFSlideV_MX = !cast("ReadVFSlideV_" # mx); defvar ReadVFSlideF_MX = !cast("ReadVFSlideF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + defvar ReadWrites = [WriteVFSlide1F_MX, ReadVFSlideV_MX, ReadVFSlideF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; defm "_V" # f.FX : - VPseudoBinary, - Sched<[WriteVFSlide1F_MX, ReadVFSlideV_MX, ReadVFSlideF_MX, ReadVMask]>; + VPseudoBinary; } } } -multiclass VPseudoBinaryV_VI { - defm _VI : VPseudoBinary; +multiclass VPseudoBinaryV_VI ReadWrites, + list ReadWritesMask, + string Constraint = ""> { + defm _VI : VPseudoBinary; } -multiclass VPseudoBinaryV_VI_RM { - defm _VI : VPseudoBinaryRoundingMode; +multiclass VPseudoBinaryV_VI_RM ReadWrites, + list ReadWritesMask, + string Constraint = ""> { + defm _VI : VPseudoBinaryRoundingMode; } multiclass VPseudoVALU_MM { @@ -2183,61 +2284,81 @@ // * The destination EEW is greater than the source EEW, the source EMUL is // at least 1, and the overlap is in the highest-numbered part of the // destination register group is legal. Otherwise, it is illegal. -multiclass VPseudoBinaryW_VV { - defm _VV : VPseudoBinary; +multiclass VPseudoBinaryW_VV ReadWrites, + list ReadWritesMask> { + defm _VV : VPseudoBinary; } -multiclass VPseudoBinaryW_VV_RM { +multiclass VPseudoBinaryW_VV_RM ReadWrites, + list ReadWritesMask> { defm _VV : VPseudoBinaryRoundingMode; + ReadWrites, ReadWritesMask, + "@earlyclobber $rd", UsesVXRM=0>; } -multiclass VPseudoBinaryW_VX { - defm "_VX" : VPseudoBinary; +multiclass VPseudoBinaryW_VX ReadWrites, + list ReadWritesMask> { + defm "_VX" : VPseudoBinary; } -multiclass VPseudoBinaryW_VF { +multiclass VPseudoBinaryW_VF ReadWrites, + list ReadWritesMask> { defm "_V" # f.FX : VPseudoBinary; } -multiclass VPseudoBinaryW_VF_RM { +multiclass VPseudoBinaryW_VF_RM ReadWrites, + list ReadWritesMask> { defm "_V" # f.FX : VPseudoBinaryRoundingMode; } -multiclass VPseudoBinaryW_WV { - defm _WV : VPseudoBinary; - defm _WV : VPseudoTiedBinary; +multiclass VPseudoBinaryW_WV ReadWrites, + list ReadWritesMask> { + defm _WV : VPseudoBinary; + defm _WV : VPseudoTiedBinary; } -multiclass VPseudoBinaryW_WV_RM { +multiclass VPseudoBinaryW_WV_RM ReadWrites, + list ReadWritesMask> { defm _WV : VPseudoBinaryRoundingMode; defm _WV : VPseudoTiedBinaryRoundingMode; } -multiclass VPseudoBinaryW_WX { - defm "_WX" : VPseudoBinary; +multiclass VPseudoBinaryW_WX ReadWrites, + list ReadWritesMask> { + defm "_WX" : VPseudoBinary; } -multiclass VPseudoBinaryW_WF { +multiclass VPseudoBinaryW_WF ReadWrites, + list ReadWritesMask> { defm "_W" # f.FX : VPseudoBinary; + f.fprclass, m, ReadWrites, ReadWritesMask>; } -multiclass VPseudoBinaryW_WF_RM { +multiclass VPseudoBinaryW_WF_RM ReadWrites, + list ReadWritesMask> { defm "_W" # f.FX : VPseudoBinaryRoundingMode; + f.fprclass, m, ReadWrites, + ReadWritesMask, UsesVXRM=0>; } // Narrowing instructions like vnsrl/vnsra/vnclip(u) don't need @earlyclobber @@ -2245,35 +2366,47 @@ // 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 { - defm _WV : VPseudoBinary ReadWrites, + list ReadWritesMask> { + defm _WV : VPseudoBinary; } -multiclass VPseudoBinaryV_WV_RM { +multiclass VPseudoBinaryV_WV_RM ReadWrites, + list ReadWritesMask> { defm _WV : VPseudoBinaryRoundingMode; } -multiclass VPseudoBinaryV_WX { - defm _WX : VPseudoBinary ReadWrites, + list ReadWritesMask> { + defm _WX : VPseudoBinary; } -multiclass VPseudoBinaryV_WX_RM { +multiclass VPseudoBinaryV_WX_RM ReadWrites, + list ReadWritesMask> { defm _WX : VPseudoBinaryRoundingMode; } -multiclass VPseudoBinaryV_WI { - defm _WI : VPseudoBinary ReadWrites, + list ReadWritesMask> { + defm _WI : VPseudoBinary; } -multiclass VPseudoBinaryV_WI_RM { +multiclass VPseudoBinaryV_WI_RM ReadWrites, + list ReadWritesMask> { defm _WI : VPseudoBinaryRoundingMode; } @@ -2385,13 +2518,15 @@ defvar mx = m.MX; defvar WriteVFClassV_MX = !cast("WriteVFClassV_" # mx); defvar ReadVFClassV_MX = !cast("ReadVFClassV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); let VLMul = m.value in { def "_V_" # mx : VPseudoUnaryNoMask, Sched<[WriteVFClassV_MX, ReadVFClassV_MX, ReadVMask]>; def "_V_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - Sched<[WriteVFClassV_MX, ReadVFClassV_MX, ReadVMask]>; + Sched<[WriteVFClassV_MX, ReadVFClassV_MX, + ReadVMask, ReadVMergeOp_MX]>; } } } @@ -2406,15 +2541,18 @@ defvar suffix = "_" # mx # "_E" # e; defvar WriteVFSqrtV_MX_E = !cast("WriteVFSqrtV" # suffix); defvar ReadVFSqrtV_MX_E = !cast("ReadVFSqrtV" # suffix); + defvar ReadVMergeOp_MX_E = !cast("ReadVMergeOp" # suffix); let SEW = e in { - def "_V" # suffix : VPseudoUnaryNoMaskRoundingMode, - Sched<[WriteVFSqrtV_MX_E, ReadVFSqrtV_MX_E, - ReadVMask]>; - def "_V" # suffix # "_MASK" : VPseudoUnaryMaskRoundingMode, - RISCVMaskedPseudo, - Sched<[WriteVFSqrtV_MX_E, ReadVFSqrtV_MX_E, - ReadVMask]>; + def "_V" # suffix : + VPseudoUnaryNoMaskRoundingMode, + Sched<[WriteVFSqrtV_MX_E, ReadVFSqrtV_MX_E, + ReadVMask]>; + def "_V" # suffix # "_MASK" : + VPseudoUnaryMaskRoundingMode, + RISCVMaskedPseudo, + Sched<[WriteVFSqrtV_MX_E, ReadVFSqrtV_MX_E, + ReadVMask, ReadVMergeOp_MX_E]>; } } } @@ -2425,13 +2563,15 @@ defvar mx = m.MX; defvar WriteVFRecpV_MX = !cast("WriteVFRecpV_" # mx); defvar ReadVFRecpV_MX = !cast("ReadVFRecpV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); let VLMul = m.value in { def "_V_" # mx : VPseudoUnaryNoMask, Sched<[WriteVFRecpV_MX, ReadVFRecpV_MX, ReadVMask]>; def "_V_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - Sched<[WriteVFRecpV_MX, ReadVFRecpV_MX, ReadVMask]>; + Sched<[WriteVFRecpV_MX, ReadVFRecpV_MX, + ReadVMask, ReadVMergeOp_MX]>; } } } @@ -2441,13 +2581,15 @@ defvar mx = m.MX; defvar WriteVFRecpV_MX = !cast("WriteVFRecpV_" # mx); defvar ReadVFRecpV_MX = !cast("ReadVFRecpV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); let VLMul = m.value in { def "_V_" # mx : VPseudoUnaryNoMaskRoundingMode, Sched<[WriteVFRecpV_MX, ReadVFRecpV_MX, ReadVMask]>; - def "_V_" # mx # "_MASK" : VPseudoUnaryMaskRoundingMode, - RISCVMaskedPseudo, - Sched<[WriteVFRecpV_MX, ReadVFRecpV_MX, ReadVMask]>; + def "_V_" # mx # "_MASK" : + VPseudoUnaryMaskRoundingMode, + RISCVMaskedPseudo, + Sched<[WriteVFRecpV_MX, ReadVFRecpV_MX, ReadVMask, ReadVMergeOp_MX]>; } } } @@ -2458,6 +2600,7 @@ defvar mx = m.MX; defvar WriteVExtV_MX = !cast("WriteVExtV_" # mx); defvar ReadVExtV_MX = !cast("ReadVExtV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); let VLMul = m.value in { def "_" # mx : VPseudoUnaryNoMask, @@ -2465,7 +2608,7 @@ def "_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask]>; + Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask, ReadVMergeOp_MX]>; } } } @@ -2476,6 +2619,7 @@ defvar mx = m.MX; defvar WriteVExtV_MX = !cast("WriteVExtV_" # mx); defvar ReadVExtV_MX = !cast("ReadVExtV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); let VLMul = m.value in { def "_" # mx : VPseudoUnaryNoMask, @@ -2483,7 +2627,7 @@ def "_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask]>; + Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask, ReadVMergeOp_MX]>; } } } @@ -2494,6 +2638,7 @@ defvar mx = m.MX; defvar WriteVExtV_MX = !cast("WriteVExtV_" # mx); defvar ReadVExtV_MX = !cast("ReadVExtV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); let VLMul = m.value in { def "_" # mx : VPseudoUnaryNoMask, @@ -2501,7 +2646,7 @@ def "_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, - Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask]>; + Sched<[WriteVExtV_MX, ReadVExtV_MX, ReadVMask, ReadVMergeOp_MX]>; } } } @@ -2517,25 +2662,31 @@ // 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 { - defm _VV : VPseudoBinaryM ReadWrites, + list ReadWritesMask> { + defm _VV : VPseudoBinaryM; } -multiclass VPseudoBinaryM_VX { +multiclass VPseudoBinaryM_VX ReadWrites, + list ReadWritesMask> { defm "_VX" : - VPseudoBinaryM; } -multiclass VPseudoBinaryM_VF { +multiclass VPseudoBinaryM_VF ReadWrites, + list ReadWritesMask> { defm "_V" # f.FX : - VPseudoBinaryM; } -multiclass VPseudoBinaryM_VI { - defm _VI : VPseudoBinaryM ReadWrites, + list ReadWritesMask> { + defm _VI : VPseudoBinaryM; } @@ -2547,21 +2698,33 @@ defvar ReadVRGatherVX_data_MX = !cast("ReadVRGatherVX_data_" # mx); defvar ReadVRGatherVX_index_MX = !cast("ReadVRGatherVX_index_" # mx); defvar ReadVRGatherVI_data_MX = !cast("ReadVRGatherVI_data_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVRGatherVX_MX, ReadVRGatherVX_data_MX, - ReadVRGatherVX_index_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI, - Sched<[WriteVRGatherVI_MX, ReadVRGatherVI_data_MX, ReadVMask]>; + defvar ReadWritesVX = [WriteVRGatherVX_MX, ReadVRGatherVX_data_MX, + ReadVRGatherVX_index_MX, ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX; + + defvar ReadWritesVI = [WriteVRGatherVI_MX, ReadVRGatherVI_data_MX, + ReadVMask]; + defvar ReadWritesVIMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VI; defvar sews = SchedSEWSet.val; foreach e = sews in { - defvar WriteVRGatherVV_MX_E = !cast("WriteVRGatherVV_" # mx # "_E" # e); - defvar ReadVRGatherVV_data_MX_E = !cast("ReadVRGatherVV_data_" # mx # "_E" # e); - defvar ReadVRGatherVV_index_MX_E = !cast("ReadVRGatherVV_index_" # mx # "_E" # e); - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVRGatherVV_MX_E, ReadVRGatherVV_data_MX_E, - ReadVRGatherVV_index_MX_E, ReadVMask]>; + defvar WriteVRGatherVV_MX_E = + !cast("WriteVRGatherVV_" # mx # "_E" # e); + defvar ReadVRGatherVV_data_MX_E = + !cast("ReadVRGatherVV_data_" # mx # "_E" # e); + defvar ReadVRGatherVV_index_MX_E = + !cast("ReadVRGatherVV_index_" # mx # "_E" # e); + defvar ReadVMergeOp_MX_E = !cast("ReadVMergeOp_" # mx # "_E" # e); + + defvar ReadWrites = [WriteVRGatherVV_MX_E, ReadVRGatherVV_data_MX_E, + ReadVRGatherVV_index_MX_E, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV; } } } @@ -2574,17 +2737,25 @@ defvar WriteVSALUI_MX = !cast("WriteVSALUI_" # mx); defvar ReadVSALUV_MX = !cast("ReadVSALUV_" # mx); defvar ReadVSALUX_MX = !cast("ReadVSALUX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesVV = [WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV; - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI, - Sched<[WriteVSALUI_MX, ReadVSALUV_MX, ReadVMask]>; + defvar ReadWritesVX = [WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX; + + defvar ReadWritesVI = [WriteVSALUI_MX, ReadVSALUV_MX, ReadVMask]; + defvar ReadWritesVIMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VI; } } - multiclass VPseudoVSHT_VV_VX_VI { foreach m = MxList in { defvar mx = m.MX; @@ -2593,13 +2764,22 @@ defvar WriteVShiftI_MX = !cast("WriteVShiftI_" # mx); defvar ReadVShiftV_MX = !cast("ReadVShiftV_" # mx); defvar ReadVShiftX_MX = !cast("ReadVShiftX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesVV = [WriteVShiftV_MX, ReadVShiftV_MX, ReadVShiftV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV; + + defvar ReadWritesVX = [WriteVShiftX_MX, ReadVShiftV_MX, ReadVShiftX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX; - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVShiftV_MX, ReadVShiftV_MX, ReadVShiftV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVShiftX_MX, ReadVShiftV_MX, ReadVShiftX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI, - Sched<[WriteVShiftI_MX, ReadVShiftV_MX, ReadVMask]>; + defvar ReadWritesVI = [WriteVShiftI_MX, ReadVShiftV_MX, ReadVMask]; + defvar ReadWritesVIMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VI; } } @@ -2611,13 +2791,24 @@ defvar WriteVSShiftI_MX = !cast("WriteVSShiftI_" # mx); defvar ReadVSShiftV_MX = !cast("ReadVSShiftV_" # mx); defvar ReadVSShiftX_MX = !cast("ReadVSShiftX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VV_RM, - Sched<[WriteVSShiftV_MX, ReadVSShiftV_MX, ReadVSShiftV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_RM, - Sched<[WriteVSShiftX_MX, ReadVSShiftV_MX, ReadVSShiftX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI_RM, - Sched<[WriteVSShiftI_MX, ReadVSShiftV_MX, ReadVMask]>; + defvar ReadWritesVV = [WriteVSShiftV_MX, ReadVSShiftV_MX, ReadVSShiftV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV_RM; + + defvar ReadWritesVX = [WriteVSShiftX_MX, ReadVSShiftV_MX, ReadVSShiftX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX_RM; + + defvar ReadWritesVI = [WriteVSShiftI_MX, ReadVSShiftV_MX, ReadVMask]; + defvar ReadWritesVIMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VI_RM; } } @@ -2629,13 +2820,22 @@ defvar WriteVIALUI_MX = !cast("WriteVIALUI_" # mx); defvar ReadVIALUV_MX = !cast("ReadVIALUV_" # mx); defvar ReadVIALUX_MX = !cast("ReadVIALUX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesVV = [WriteVIALUV_MX, ReadVIALUV_MX, ReadVIALUV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV; + + defvar ReadWritesVX = [WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX; - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVIALUV_MX, ReadVIALUV_MX, ReadVIALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI, - Sched<[WriteVIALUI_MX, ReadVIALUV_MX, ReadVMask]>; + defvar ReadWritesVI = [WriteVIALUI_MX, ReadVIALUV_MX, ReadVMask]; + defvar ReadWritesVIMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VI; } } @@ -2646,11 +2846,17 @@ defvar WriteVSALUX_MX = !cast("WriteVSALUX_" # mx); defvar ReadVSALUV_MX = !cast("ReadVSALUV_" # mx); defvar ReadVSALUX_MX = !cast("ReadVSALUX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>; + defvar ReadWritesVV = [WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV; + + defvar ReadWritesVX = [WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX; } } @@ -2661,11 +2867,17 @@ defvar WriteVSMulX_MX = !cast("WriteVSMulX_" # mx); defvar ReadVSMulV_MX = !cast("ReadVSMulV_" # mx); defvar ReadVSMulX_MX = !cast("ReadVSMulX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesVV = [WriteVSMulV_MX, ReadVSMulV_MX, ReadVSMulV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV_RM; - defm "" : VPseudoBinaryV_VV_RM, - Sched<[WriteVSMulV_MX, ReadVSMulV_MX, ReadVSMulV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_RM, - Sched<[WriteVSMulX_MX, ReadVSMulV_MX, ReadVSMulX_MX, ReadVMask]>; + defvar ReadWritesVX = [WriteVSMulX_MX, ReadVSMulV_MX, ReadVSMulX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX_RM; } } @@ -2676,11 +2888,16 @@ defvar WriteVAALUX_MX = !cast("WriteVAALUX_" # mx); defvar ReadVAALUV_MX = !cast("ReadVAALUV_" # mx); defvar ReadVAALUX_MX = !cast("ReadVAALUX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VV_RM, - Sched<[WriteVAALUV_MX, ReadVAALUV_MX, ReadVAALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_RM, - Sched<[WriteVAALUX_MX, ReadVAALUV_MX, ReadVAALUX_MX, ReadVMask]>; + defvar ReadWritesVV = [WriteVAALUV_MX, ReadVAALUV_MX, ReadVAALUV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV_RM; + + defvar ReadWritesVX = [WriteVAALUX_MX, ReadVAALUV_MX, ReadVAALUX_MX, ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX_RM; } } @@ -2691,11 +2908,17 @@ defvar WriteVIMinMaxX_MX = !cast("WriteVIMinMaxX_" # mx); defvar ReadVIMinMaxV_MX = !cast("ReadVIMinMaxV_" # mx); defvar ReadVIMinMaxX_MX = !cast("ReadVIMinMaxX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesVV = [WriteVIMinMaxV_MX, ReadVIMinMaxV_MX, + ReadVIMinMaxV_MX, ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV; - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVIMinMaxV_MX, ReadVIMinMaxV_MX, ReadVIMinMaxV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVIMinMaxX_MX, ReadVIMinMaxV_MX, ReadVIMinMaxX_MX, ReadVMask]>; + defvar ReadWritesVX = [WriteVIMinMaxX_MX, ReadVIMinMaxV_MX, + ReadVIMinMaxX_MX, ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX; } } @@ -2706,11 +2929,17 @@ defvar WriteVIMulX_MX = !cast("WriteVIMulX_" # mx); defvar ReadVIMulV_MX = !cast("ReadVIMulV_" # mx); defvar ReadVIMulX_MX = !cast("ReadVIMulX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVIMulV_MX, ReadVIMulV_MX, ReadVIMulV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVIMulX_MX, ReadVIMulV_MX, ReadVIMulX_MX, ReadVMask]>; + defvar ReadWritesVV = [WriteVIMulV_MX, ReadVIMulV_MX, ReadVIMulV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV; + + defvar ReadWritesVX = [WriteVIMulX_MX, ReadVIMulV_MX, ReadVIMulX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX; } } @@ -2719,15 +2948,23 @@ defvar mx = m.MX; defvar sews = SchedSEWSet.val; foreach e = sews in { - defvar WriteVIDivV_MX_E = !cast("WriteVIDivV_" # mx # "_E" # e); - defvar WriteVIDivX_MX_E = !cast("WriteVIDivX_" # mx # "_E" # e); + defvar WriteVIDivV_MX_E = + !cast("WriteVIDivV_" # mx # "_E" # e); + defvar WriteVIDivX_MX_E = + !cast("WriteVIDivX_" # mx # "_E" # e); defvar ReadVIDivV_MX_E = !cast("ReadVIDivV_" # mx # "_E" # e); defvar ReadVIDivX_MX_E = !cast("ReadVIDivX_" # mx # "_E" # e); + defvar ReadVMergeOp_MX_E = !cast("ReadVMergeOp_" # mx # "_E" # e); + + defvar ReadWritesVV = [WriteVIDivV_MX_E, ReadVIDivV_MX_E, ReadVIDivV_MX_E, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV; - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVIDivV_MX_E, ReadVIDivV_MX_E, ReadVIDivV_MX_E, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVIDivX_MX_E, ReadVIDivV_MX_E, ReadVIDivX_MX_E, ReadVMask]>; + defvar ReadWritesVX = [WriteVIDivX_MX_E, ReadVIDivV_MX_E, ReadVIDivX_MX_E, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX; } } } @@ -2737,9 +2974,12 @@ defvar mx = m.MX; defvar WriteVFMulV_MX = !cast("WriteVFMulV_" # mx); defvar ReadVFMulV_MX = !cast("ReadVFMulV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryFV_VV_RM, - Sched<[WriteVFMulV_MX, ReadVFMulV_MX, ReadVFMulV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFMulV_MX, ReadVFMulV_MX, ReadVFMulV_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryFV_VV_RM; } foreach f = FPList in { @@ -2748,9 +2988,12 @@ defvar WriteVFMulF_MX = !cast("WriteVFMulF_" # mx); defvar ReadVFMulV_MX = !cast("ReadVFMulV_" # mx); defvar ReadVFMulF_MX = !cast("ReadVFMulF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VF_RM, - Sched<[WriteVFMulF_MX, ReadVFMulV_MX, ReadVFMulF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFMulF_MX, ReadVFMulV_MX, ReadVFMulF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VF_RM; } } } @@ -2762,21 +3005,32 @@ foreach e = sews in { defvar WriteVFDivV_MX_E = !cast("WriteVFDivV_" # mx # "_E" # e); defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # e); + defvar ReadVMergeOp_MX_E = !cast("ReadVMergeOp_" # mx # "_E" # e); - defm "" : VPseudoBinaryFV_VV_RM, - Sched<[WriteVFDivV_MX_E, ReadVFDivV_MX_E, ReadVFDivV_MX_E, ReadVMask]>; + defvar ReadWrites = [WriteVFDivV_MX_E, ReadVFDivV_MX_E, ReadVFDivV_MX_E, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryFV_VV_RM; } } foreach f = FPList in { foreach m = f.MxList in { defvar mx = m.MX; - defvar WriteVFDivF_MX_E = !cast("WriteVFDivF_" # mx # "_E" # f.SEW); - defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # f.SEW); - defvar ReadVFDivF_MX_E = !cast("ReadVFDivF_" # mx # "_E" # f.SEW); - - defm "" : VPseudoBinaryV_VF_RM, - Sched<[WriteVFDivF_MX_E, ReadVFDivV_MX_E, ReadVFDivF_MX_E, ReadVMask]>; + defvar WriteVFDivF_MX_E = + !cast("WriteVFDivF_" # mx # "_E" # f.SEW); + defvar ReadVFDivV_MX_E = + !cast("ReadVFDivV_" # mx # "_E" # f.SEW); + defvar ReadVFDivF_MX_E = + !cast("ReadVFDivF_" # mx # "_E" # f.SEW); + defvar ReadVMergeOp_MX_E = + !cast("ReadVMergeOp_" # mx # "_E" # f.SEW); + + defvar ReadWrites = [WriteVFDivF_MX_E, ReadVFDivV_MX_E, ReadVFDivF_MX_E, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VF_RM; } } } @@ -2785,12 +3039,20 @@ foreach f = FPList in { foreach m = f.MxList in { defvar mx = m.MX; - defvar WriteVFDivF_MX_E = !cast("WriteVFDivF_" # mx # "_E" # f.SEW); - defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # f.SEW); - defvar ReadVFDivF_MX_E = !cast("ReadVFDivF_" # mx # "_E" # f.SEW); - - defm "" : VPseudoBinaryV_VF_RM, - Sched<[WriteVFDivF_MX_E, ReadVFDivV_MX_E, ReadVFDivF_MX_E, ReadVMask]>; + defvar WriteVFDivF_MX_E = + !cast("WriteVFDivF_" # mx # "_E" # f.SEW); + defvar ReadVFDivV_MX_E = + !cast("ReadVFDivV_" # mx # "_E" # f.SEW); + defvar ReadVFDivF_MX_E = + !cast("ReadVFDivF_" # mx # "_E" # f.SEW); + defvar ReadVMergeOp_MX_E = + !cast("ReadVMergeOp_" # mx # "_E" # f.SEW); + + defvar ReadWrites = [WriteVFDivF_MX_E, ReadVFDivV_MX_E, ReadVFDivF_MX_E, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VF_RM; } } } @@ -2802,11 +3064,17 @@ defvar WriteVIALUX_MX = !cast("WriteVIALUV_" # mx); defvar ReadVIALUV_MX = !cast("ReadVIALUV_" # mx); defvar ReadVIALUX_MX = !cast("ReadVIALUX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVIALUV_MX, ReadVIALUV_MX, ReadVIALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, ReadVMask]>; + defvar ReadWritesVV = [WriteVIALUV_MX, ReadVIALUV_MX, ReadVIALUV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VV; + + defvar ReadWritesVX = [WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX; } } @@ -2815,9 +3083,12 @@ defvar mx = m.MX; defvar WriteVFSgnjV_MX = !cast("WriteVFSgnjV_" # mx); defvar ReadVFSgnjV_MX = !cast("ReadVFSgnjV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryFV_VV, - Sched<[WriteVFSgnjV_MX, ReadVFSgnjV_MX, ReadVFSgnjV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFSgnjV_MX, ReadVFSgnjV_MX, ReadVFSgnjV_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryFV_VV; } foreach f = FPList in { @@ -2826,9 +3097,12 @@ defvar WriteVFSgnjF_MX = !cast("WriteVFSgnjF_" # mx); defvar ReadVFSgnjV_MX = !cast("ReadVFSgnjV_" # mx); defvar ReadVFSgnjF_MX = !cast("ReadVFSgnjF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VF, - Sched<[WriteVFSgnjF_MX, ReadVFSgnjV_MX, ReadVFSgnjF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFSgnjF_MX, ReadVFSgnjV_MX, ReadVFSgnjF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VF; } } } @@ -2838,9 +3112,12 @@ defvar mx = m.MX; defvar WriteVFMinMaxV_MX = !cast("WriteVFMinMaxV_" # mx); defvar ReadVFMinMaxV_MX = !cast("ReadVFMinMaxV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryFV_VV, - Sched<[WriteVFMinMaxV_MX, ReadVFMinMaxV_MX, ReadVFMinMaxV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFMinMaxV_MX, ReadVFMinMaxV_MX, ReadVFMinMaxV_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryFV_VV; } foreach f = FPList in { @@ -2849,9 +3126,12 @@ defvar WriteVFMinMaxF_MX = !cast("WriteVFMinMaxF_" # mx); defvar ReadVFMinMaxV_MX = !cast("ReadVFMinMaxV_" # mx); defvar ReadVFMinMaxF_MX = !cast("ReadVFMinMaxF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VF, - Sched<[WriteVFMinMaxF_MX, ReadVFMinMaxV_MX, ReadVFMinMaxF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFMinMaxF_MX, ReadVFMinMaxV_MX, + ReadVFMinMaxF_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VF; } } } @@ -2861,9 +3141,12 @@ defvar mx = m.MX; defvar WriteVFALUV_MX = !cast("WriteVFALUV_" # mx); defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryFV_VV, - Sched<[WriteVFALUV_MX, ReadVFALUV_MX, ReadVFALUV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFALUV_MX, ReadVFALUV_MX, ReadVFALUV_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryFV_VV; } foreach f = FPList in { @@ -2872,8 +3155,12 @@ defvar WriteVFALUF_MX = !cast("WriteVFALUF_" # mx); defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); defvar ReadVFALUF_MX = !cast("ReadVFALUF_" # mx); - defm "" : VPseudoBinaryV_VF, - Sched<[WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, ReadVMask]>; + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWrites = [WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VF; } } } @@ -2883,9 +3170,12 @@ defvar mx = m.MX; defvar WriteVFALUV_MX = !cast("WriteVFALUV_" # mx); defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryFV_VV_RM, - Sched<[WriteVFALUV_MX, ReadVFALUV_MX, ReadVFALUV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFALUV_MX, ReadVFALUV_MX, ReadVFALUV_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryFV_VV_RM; } foreach f = FPList in { @@ -2894,8 +3184,12 @@ defvar WriteVFALUF_MX = !cast("WriteVFALUF_" # mx); defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); defvar ReadVFALUF_MX = !cast("ReadVFALUF_" # mx); - defm "" : VPseudoBinaryV_VF_RM, - Sched<[WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, ReadVMask]>; + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWrites = [WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VF_RM; } } } @@ -2907,9 +3201,12 @@ defvar WriteVFALUF_MX = !cast("WriteVFALUF_" # mx); defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); defvar ReadVFALUF_MX = !cast("ReadVFALUF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VF, - Sched<[WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VF; } } } @@ -2921,9 +3218,12 @@ defvar WriteVFALUF_MX = !cast("WriteVFALUF_" # mx); defvar ReadVFALUV_MX = !cast("ReadVFALUV_" # mx); defvar ReadVFALUF_MX = !cast("ReadVFALUF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryV_VF_RM, - Sched<[WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFALUF_MX, ReadVFALUV_MX, ReadVFALUF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VF_RM; } } } @@ -2935,11 +3235,16 @@ defvar WriteVIALUI_MX = !cast("WriteVIALUI_" # mx); defvar ReadVIALUV_MX = !cast("ReadVIALUV_" # mx); defvar ReadVIALUX_MX = !cast("ReadVIALUX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesVX = [WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VX; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI, - Sched<[WriteVIALUI_MX, ReadVIALUV_MX, ReadVMask]>; + defvar ReadWritesVI = [WriteVIALUI_MX, ReadVIALUV_MX, ReadVMask]; + defvar ReadWritesVIMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_VI; } } @@ -2950,11 +3255,17 @@ defvar WriteVIWALUX_MX = !cast("WriteVIWALUX_" # mx); defvar ReadVIWALUV_MX = !cast("ReadVIWALUV_" # mx); defvar ReadVIWALUX_MX = !cast("ReadVIWALUX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryW_VV, - Sched<[WriteVIWALUV_MX, ReadVIWALUV_MX, ReadVIWALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryW_VX, - Sched<[WriteVIWALUX_MX, ReadVIWALUV_MX, ReadVIWALUX_MX, ReadVMask]>; + defvar ReadWritesVV = [WriteVIWALUV_MX, ReadVIWALUV_MX, ReadVIWALUV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_VV; + + defvar ReadWritesVX = [WriteVIWALUX_MX, ReadVIWALUV_MX, ReadVIWALUX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_VX; } } @@ -2965,11 +3276,17 @@ defvar WriteVIWMulX_MX = !cast("WriteVIWMulX_" # mx); defvar ReadVIWMulV_MX = !cast("ReadVIWMulV_" # mx); defvar ReadVIWMulX_MX = !cast("ReadVIWMulX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesVV = [WriteVIWMulV_MX, ReadVIWMulV_MX, ReadVIWMulV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_VV; - defm "" : VPseudoBinaryW_VV, - Sched<[WriteVIWMulV_MX, ReadVIWMulV_MX, ReadVIWMulV_MX, ReadVMask]>; - defm "" : VPseudoBinaryW_VX, - Sched<[WriteVIWMulX_MX, ReadVIWMulV_MX, ReadVIWMulX_MX, ReadVMask]>; + defvar ReadWritesVX = [WriteVIWMulX_MX, ReadVIWMulV_MX, ReadVIWMulX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_VX; } } @@ -2978,9 +3295,12 @@ defvar mx = m.MX; defvar WriteVFWMulV_MX = !cast("WriteVFWMulV_" # mx); defvar ReadVFWMulV_MX = !cast("ReadVFWMulV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryW_VV_RM, - Sched<[WriteVFWMulV_MX, ReadVFWMulV_MX, ReadVFWMulV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWMulV_MX, ReadVFWMulV_MX, ReadVFWMulV_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_VV_RM; } foreach f = FPListW in { @@ -2989,9 +3309,12 @@ defvar WriteVFWMulF_MX = !cast("WriteVFWMulF_" # mx); defvar ReadVFWMulV_MX = !cast("ReadVFWMulV_" # mx); defvar ReadVFWMulF_MX = !cast("ReadVFWMulF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryW_VF_RM, - Sched<[WriteVFWMulF_MX, ReadVFWMulV_MX, ReadVFWMulF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWMulF_MX, ReadVFWMulV_MX, ReadVFWMulF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_VF_RM; } } } @@ -3003,11 +3326,17 @@ defvar WriteVIWALUX_MX = !cast("WriteVIWALUX_" # mx); defvar ReadVIWALUV_MX = !cast("ReadVIWALUV_" # mx); defvar ReadVIWALUX_MX = !cast("ReadVIWALUX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryW_WV, - Sched<[WriteVIWALUV_MX, ReadVIWALUV_MX, ReadVIWALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryW_WX, - Sched<[WriteVIWALUX_MX, ReadVIWALUV_MX, ReadVIWALUX_MX, ReadVMask]>; + defvar ReadWritesWV = [WriteVIWALUV_MX, ReadVIWALUV_MX, ReadVIWALUV_MX, + ReadVMask]; + defvar ReadWritesWVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_WV; + + defvar ReadWritesWX = [WriteVIWALUX_MX, ReadVIWALUV_MX, ReadVIWALUX_MX, + ReadVMask]; + defvar ReadWritesWXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_WX; } } @@ -3016,9 +3345,12 @@ defvar mx = m.MX; defvar WriteVFWALUV_MX = !cast("WriteVFWALUV_" # mx); defvar ReadVFWALUV_MX = !cast("ReadVFWALUV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryW_VV_RM, - Sched<[WriteVFWALUV_MX, ReadVFWALUV_MX, ReadVFWALUV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWALUV_MX, ReadVFWALUV_MX, ReadVFWALUV_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_VV_RM; } foreach f = FPListW in { @@ -3027,9 +3359,12 @@ defvar WriteVFWALUF_MX = !cast("WriteVFWALUF_" # mx); defvar ReadVFWALUV_MX = !cast("ReadVFWALUV_" # mx); defvar ReadVFWALUF_MX = !cast("ReadVFWALUF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryW_VF_RM, - Sched<[WriteVFWALUF_MX, ReadVFWALUV_MX, ReadVFWALUF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWALUF_MX, ReadVFWALUV_MX, ReadVFWALUF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_VF_RM; } } } @@ -3039,9 +3374,12 @@ defvar mx = m.MX; defvar WriteVFWALUV_MX = !cast("WriteVFWALUV_" # mx); defvar ReadVFWALUV_MX = !cast("ReadVFWALUV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryW_WV_RM, - Sched<[WriteVFWALUV_MX, ReadVFWALUV_MX, ReadVFWALUV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWALUV_MX, ReadVFWALUV_MX, ReadVFWALUV_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_WV_RM; } foreach f = FPListW in { foreach m = f.MxListFW in { @@ -3049,9 +3387,12 @@ defvar WriteVFWALUF_MX = !cast("WriteVFWALUF_" # mx); defvar ReadVFWALUV_MX = !cast("ReadVFWALUV_" # mx); defvar ReadVFWALUF_MX = !cast("ReadVFWALUF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryW_WF_RM, - Sched<[WriteVFWALUF_MX, ReadVFWALUV_MX, ReadVFWALUF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWALUF_MX, ReadVFWALUV_MX, ReadVFWALUF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryW_WF_RM; } } } @@ -3187,13 +3528,22 @@ defvar WriteVNClipI_MX = !cast("WriteVNClipI_" # mx); defvar ReadVNClipV_MX = !cast("ReadVNClipV_" # mx); defvar ReadVNClipX_MX = !cast("ReadVNClipX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesWV = [WriteVNClipV_MX, ReadVNClipV_MX, ReadVNClipV_MX, + ReadVMask]; + defvar ReadWritesWVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_WV_RM; - defm "" : VPseudoBinaryV_WV_RM, - Sched<[WriteVNClipV_MX, ReadVNClipV_MX, ReadVNClipV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_WX_RM, - Sched<[WriteVNClipX_MX, ReadVNClipV_MX, ReadVNClipX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_WI_RM, - Sched<[WriteVNClipI_MX, ReadVNClipV_MX, ReadVMask]>; + defvar ReadWritesWX = [WriteVNClipX_MX, ReadVNClipV_MX, ReadVNClipX_MX, + ReadVMask]; + defvar ReadWritesWXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_WX_RM; + + defvar ReadWritesWI = [WriteVNClipI_MX, ReadVNClipV_MX, + ReadVMask]; + defvar ReadWritesWIMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_WI_RM; } } @@ -3205,13 +3555,22 @@ defvar WriteVNShiftI_MX = !cast("WriteVNShiftI_" # mx); defvar ReadVNShiftV_MX = !cast("ReadVNShiftV_" # mx); defvar ReadVNShiftX_MX = !cast("ReadVNShiftX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesWV = [WriteVNShiftV_MX, ReadVNShiftV_MX, ReadVNShiftV_MX, + ReadVMask]; + defvar ReadWritesWVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_WV; - defm "" : VPseudoBinaryV_WV, - Sched<[WriteVNShiftV_MX, ReadVNShiftV_MX, ReadVNShiftV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_WX, - Sched<[WriteVNShiftX_MX, ReadVNShiftV_MX, ReadVNShiftX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_WI, - Sched<[WriteVNShiftI_MX, ReadVNShiftV_MX, ReadVMask]>; + defvar ReadWritesWX = [WriteVNShiftX_MX, ReadVNShiftV_MX, ReadVNShiftX_MX, + ReadVMask]; + defvar ReadWritesWXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_WX; + + defvar ReadWritesWI = [WriteVNShiftI_MX, ReadVNShiftV_MX, + ReadVMask]; + defvar ReadWritesWIMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryV_WI; } } @@ -3220,13 +3579,20 @@ DAGOperand Op2Class, LMULInfo MInfo, int sew, + list ReadWrites, + list ReadWritesMask, string Constraint = "", bit Commutable = 0> { let VLMul = MInfo.value in { defvar mx = MInfo.MX; let isCommutable = Commutable in - def "_" # mx # "_E" # sew : VPseudoTernaryNoMaskWithPolicy; - def "_" # mx # "_E" # sew # "_MASK" : VPseudoTernaryMaskPolicy; + def "_" # mx # "_E" # sew + : VPseudoTernaryNoMaskWithPolicy, + Sched; + def "_" # mx # "_E" # sew # "_MASK" + : VPseudoTernaryMaskPolicy, + Sched; } } @@ -3235,6 +3601,8 @@ DAGOperand Op2Class, LMULInfo MInfo, int sew, + list ReadWrites, + list ReadWritesMask, string Constraint = "", bit Commutable = 0> { let VLMul = MInfo.value in { @@ -3242,10 +3610,12 @@ let isCommutable = Commutable in def "_" # mx # "_E" # sew : VPseudoTernaryNoMaskWithPolicyRoundingMode; + Op2Class, Constraint>, + Sched; def "_" # mx # "_E" # sew # "_MASK" : VPseudoTernaryMaskPolicyRoundingMode; + Op2Class, Constraint>, + Sched; } } @@ -3253,110 +3623,159 @@ RegisterClass Op1Class, DAGOperand Op2Class, LMULInfo MInfo, + list ReadWrites, + list ReadWritesMask, string Constraint = "", bit Commutable = 0> { let VLMul = MInfo.value in { let isCommutable = Commutable in - def "_" # MInfo.MX : VPseudoTernaryNoMaskWithPolicy; - def "_" # MInfo.MX # "_MASK" : VPseudoBinaryMaskPolicy, - RISCVMaskedPseudo; + def "_" # MInfo.MX : + VPseudoTernaryNoMaskWithPolicy, + Sched; + def "_" # MInfo.MX # "_MASK" : + VPseudoBinaryMaskPolicy, + RISCVMaskedPseudo, + Sched; } } -multiclass VPseudoTernaryWithPolicyRoundingMode { +multiclass VPseudoTernaryWithPolicyRoundingMode< + VReg RetClass, RegisterClass Op1Class, DAGOperand Op2Class, LMULInfo MInfo, + list ReadWrites, list ReadWritesMask, + string Constraint = "", bit Commutable = 0> { let VLMul = MInfo.value in { let isCommutable = Commutable in def "_" # MInfo.MX : VPseudoTernaryNoMaskWithPolicyRoundingMode; + Op2Class, Constraint>, + Sched; def "_" # MInfo.MX # "_MASK" : VPseudoBinaryMaskPolicyRoundingMode, - RISCVMaskedPseudo; + RISCVMaskedPseudo, + Sched; } } -multiclass VPseudoTernaryV_VV_AAXA { +multiclass VPseudoTernaryV_VV_AAXA ReadWrites, + list ReadWritesMask, + string Constraint = ""> { defm _VV : VPseudoTernaryWithPolicy; } -multiclass VPseudoTernaryV_VV_AAXA_RM { - defm _VV : VPseudoTernaryWithPolicyRoundingMode; +multiclass VPseudoTernaryV_VV_AAXA_RM< + LMULInfo m, list ReadWrites, + list ReadWritesMask, string Constraint = ""> { + defm _VV : VPseudoTernaryWithPolicyRoundingMode; } -multiclass VPseudoTernaryV_VX_AAXA { +multiclass VPseudoTernaryV_VX_AAXA ReadWrites, + list ReadWritesMask, + string Constraint = ""> { defm "_VX" : VPseudoTernaryWithPolicy; + ReadWrites, ReadWritesMask, Constraint, + Commutable=1>; } -multiclass VPseudoTernaryV_VF_AAXA { +multiclass VPseudoTernaryV_VF_AAXA< + LMULInfo m, FPR_Info f, list ReadWrites, + list ReadWritesMask, string Constraint = ""> { defm "_V" # f.FX : VPseudoTernaryWithPolicy; } -multiclass VPseudoTernaryV_VF_AAXA_RM { +multiclass VPseudoTernaryV_VF_AAXA_RM< + LMULInfo m, FPR_Info f, list ReadWrites, + list ReadWritesMask, string Constraint = ""> { defm "_V" # f.FX : VPseudoTernaryWithPolicyRoundingMode; } -multiclass VPseudoTernaryW_VV { +multiclass VPseudoTernaryW_VV ReadWrites, + list ReadWritesMask> { defvar constraint = "@earlyclobber $rd"; defm _VV : VPseudoTernaryWithPolicy; + ReadWrites, ReadWritesMask, constraint>; } -multiclass VPseudoTernaryW_VV_RM { +multiclass VPseudoTernaryW_VV_RM ReadWrites, + list ReadWritesMask> { defvar constraint = "@earlyclobber $rd"; - defm _VV : VPseudoTernaryWithPolicyRoundingMode; } -multiclass VPseudoTernaryW_VX { +multiclass VPseudoTernaryW_VX ReadWrites, + list ReadWritesMask> { defvar constraint = "@earlyclobber $rd"; defm "_VX" : VPseudoTernaryWithPolicy; + ReadWrites, ReadWritesMask, constraint>; } -multiclass VPseudoTernaryW_VF { +multiclass VPseudoTernaryW_VF ReadWrites, + list ReadWritesMask> { defvar constraint = "@earlyclobber $rd"; defm "_V" # f.FX : VPseudoTernaryWithPolicy; + m.vrclass, m, ReadWrites, + ReadWritesMask, constraint>; } -multiclass VPseudoTernaryW_VF_RM { +multiclass VPseudoTernaryW_VF_RM ReadWrites, + list ReadWritesMask> { defvar constraint = "@earlyclobber $rd"; - defm "_V" # f.FX : VPseudoTernaryWithPolicyRoundingMode; + defm "_V" # f.FX + : VPseudoTernaryWithPolicyRoundingMode; } multiclass VPseudoVSLDVWithPolicy ReadWrites, + list ReadWritesMask, string Constraint = ""> { let VLMul = MInfo.value in { - def "_" # MInfo.MX : VPseudoTernaryNoMaskWithPolicy; - def "_" # MInfo.MX # "_MASK" : VPseudoBinaryMaskPolicy, - RISCVMaskedPseudo; + def "_" # MInfo.MX : + VPseudoTernaryNoMaskWithPolicy, + Sched; + def "_" # MInfo.MX # "_MASK" : + VPseudoBinaryMaskPolicy, + RISCVMaskedPseudo, + Sched; } } -multiclass VPseudoVSLDV_VX { - defm _VX : VPseudoVSLDVWithPolicy; +multiclass VPseudoVSLDV_VX ReadWrites, + list ReadWritesMask, + string Constraint = ""> { + defm _VX : VPseudoVSLDVWithPolicy; } -multiclass VPseudoVSLDV_VI { - defm _VI : VPseudoVSLDVWithPolicy; +multiclass VPseudoVSLDV_VI ReadWrites, + list ReadWritesMask, + string Constraint = ""> { + defm _VI : VPseudoVSLDVWithPolicy; } multiclass VPseudoVMAC_VV_VX_AAXA { @@ -3366,13 +3785,19 @@ defvar WriteVIMulAddX_MX = !cast("WriteVIMulAddX_" # mx); defvar ReadVIMulAddV_MX = !cast("ReadVIMulAddV_" # mx); defvar ReadVIMulAddX_MX = !cast("ReadVIMulAddX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesVV = [WriteVIMulAddV_MX, ReadVIMulAddV_MX, + ReadVIMulAddV_MX, ReadVIMulAddV_MX, ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryV_VV_AAXA; - defm "" : VPseudoTernaryV_VV_AAXA, - Sched<[WriteVIMulAddV_MX, ReadVIMulAddV_MX, ReadVIMulAddV_MX, - ReadVIMulAddV_MX, ReadVMask]>; - defm "" : VPseudoTernaryV_VX_AAXA, - Sched<[WriteVIMulAddX_MX, ReadVIMulAddV_MX, ReadVIMulAddV_MX, - ReadVIMulAddX_MX, ReadVMask]>; + defvar ReadWritesVX = [WriteVIMulAddX_MX, ReadVIMulAddV_MX, + ReadVIMulAddV_MX, ReadVIMulAddX_MX, ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryV_VX_AAXA; } } @@ -3381,9 +3806,13 @@ defvar mx = m.MX; defvar WriteVFMulAddV_MX = !cast("WriteVFMulAddV_" # mx); defvar ReadVFMulAddV_MX = !cast("ReadVFMulAddV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoTernaryV_VV_AAXA, - Sched<[WriteVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, + ReadVFMulAddV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryV_VV_AAXA; } foreach f = FPList in { @@ -3392,9 +3821,13 @@ defvar WriteVFMulAddF_MX = !cast("WriteVFMulAddF_" # mx); defvar ReadVFMulAddV_MX = !cast("ReadVFMulAddV_" # mx); defvar ReadVFMulAddF_MX = !cast("ReadVFMulAddF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoTernaryV_VF_AAXA, - Sched<[WriteVFMulAddF_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFMulAddF_MX, ReadVFMulAddV_MX, + ReadVFMulAddV_MX, ReadVFMulAddF_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryV_VF_AAXA; } } } @@ -3404,9 +3837,13 @@ defvar mx = m.MX; defvar WriteVFMulAddV_MX = !cast("WriteVFMulAddV_" # mx); defvar ReadVFMulAddV_MX = !cast("ReadVFMulAddV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoTernaryV_VV_AAXA_RM, - Sched<[WriteVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, + ReadVFMulAddV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryV_VV_AAXA_RM; } foreach f = FPList in { @@ -3415,9 +3852,13 @@ defvar WriteVFMulAddF_MX = !cast("WriteVFMulAddF_" # mx); defvar ReadVFMulAddV_MX = !cast("ReadVFMulAddV_" # mx); defvar ReadVFMulAddF_MX = !cast("ReadVFMulAddF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoTernaryV_VF_AAXA_RM, - Sched<[WriteVFMulAddF_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFMulAddF_MX, ReadVFMulAddV_MX, + ReadVFMulAddV_MX, ReadVFMulAddF_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryV_VF_AAXA_RM; } } } @@ -3429,12 +3870,18 @@ defvar WriteVISlideI_MX = !cast("WriteVISlideI_" # mx); defvar ReadVISlideV_MX = !cast("ReadVISlideV_" # mx); defvar ReadVISlideX_MX = !cast("ReadVISlideX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoVSLDV_VX, - Sched<[WriteVISlideX_MX, ReadVISlideV_MX, ReadVISlideV_MX, - ReadVISlideX_MX, ReadVMask]>; - defm "" : VPseudoVSLDV_VI, - Sched<[WriteVISlideI_MX, ReadVISlideV_MX, ReadVISlideV_MX, ReadVMask]>; + defvar ReadWritesVX = [WriteVISlideX_MX, ReadVISlideV_MX, ReadVISlideV_MX, + ReadVISlideX_MX, ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoVSLDV_VX; + + defvar ReadWritesVI = [WriteVISlideI_MX, ReadVISlideV_MX, ReadVISlideV_MX, + ReadVMask]; + defvar ReadWritesVIMask = InsertAtIdx1.l; + defm "" : VPseudoVSLDV_VI; } } @@ -3445,13 +3892,17 @@ defvar WriteVIWMulAddX_MX = !cast("WriteVIWMulAddX_" # mx); defvar ReadVIWMulAddV_MX = !cast("ReadVIWMulAddV_" # mx); defvar ReadVIWMulAddX_MX = !cast("ReadVIWMulAddX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesVV = [WriteVIWMulAddV_MX, ReadVIWMulAddV_MX, + ReadVIWMulAddV_MX, ReadVIWMulAddV_MX, ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryW_VV; - defm "" : VPseudoTernaryW_VV, - Sched<[WriteVIWMulAddV_MX, ReadVIWMulAddV_MX, ReadVIWMulAddV_MX, - ReadVIWMulAddV_MX, ReadVMask]>; - defm "" : VPseudoTernaryW_VX, - Sched<[WriteVIWMulAddX_MX, ReadVIWMulAddV_MX, ReadVIWMulAddV_MX, - ReadVIWMulAddX_MX, ReadVMask]>; + defvar ReadWritesVX = [WriteVIWMulAddX_MX, ReadVIWMulAddV_MX, + ReadVIWMulAddV_MX, ReadVIWMulAddX_MX, ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryW_VX; } } @@ -3461,10 +3912,12 @@ defvar WriteVIWMulAddX_MX = !cast("WriteVIWMulAddX_" # mx); defvar ReadVIWMulAddV_MX= !cast("ReadVIWMulAddV_" # mx); defvar ReadVIWMulAddX_MX = !cast("ReadVIWMulAddX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoTernaryW_VX, - Sched<[WriteVIWMulAddX_MX, ReadVIWMulAddV_MX, ReadVIWMulAddV_MX, - ReadVIWMulAddX_MX, ReadVMask]>; + defvar ReadWrites = [WriteVIWMulAddX_MX, ReadVIWMulAddV_MX, + ReadVIWMulAddV_MX, ReadVIWMulAddX_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryW_VX; } } @@ -3473,10 +3926,12 @@ defvar mx = m.MX; defvar WriteVFWMulAddV_MX = !cast("WriteVFWMulAddV_" # mx); defvar ReadVFWMulAddV_MX = !cast("ReadVFWMulAddV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoTernaryW_VV_RM, - Sched<[WriteVFWMulAddV_MX, ReadVFWMulAddV_MX, - ReadVFWMulAddV_MX, ReadVFWMulAddV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWMulAddV_MX, ReadVFWMulAddV_MX, + ReadVFWMulAddV_MX, ReadVFWMulAddV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryW_VV_RM; } foreach f = FPListW in { @@ -3485,10 +3940,12 @@ defvar WriteVFWMulAddF_MX = !cast("WriteVFWMulAddF_" # mx); defvar ReadVFWMulAddV_MX = !cast("ReadVFWMulAddV_" # mx); defvar ReadVFWMulAddF_MX = !cast("ReadVFWMulAddF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoTernaryW_VF_RM, - Sched<[WriteVFWMulAddF_MX, ReadVFWMulAddV_MX, - ReadVFWMulAddV_MX, ReadVFWMulAddF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWMulAddF_MX, ReadVFWMulAddV_MX, + ReadVFWMulAddV_MX, ReadVFWMulAddF_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoTernaryW_VF_RM; } } } @@ -3501,13 +3958,21 @@ defvar WriteVICmpI_MX = !cast("WriteVICmpI_" # mx); defvar ReadVICmpV_MX = !cast("ReadVICmpV_" # mx); defvar ReadVICmpX_MX = !cast("ReadVICmpX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryM_VV, - Sched<[WriteVICmpV_MX, ReadVICmpV_MX, ReadVICmpV_MX, ReadVMask]>; - defm "" : VPseudoBinaryM_VX, - Sched<[WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, ReadVMask]>; - defm "" : VPseudoBinaryM_VI, - Sched<[WriteVICmpI_MX, ReadVICmpV_MX, ReadVMask]>; + defvar ReadWritesVV = [WriteVICmpV_MX, ReadVICmpV_MX, ReadVICmpV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryM_VV; + + defvar ReadWritesVX = [WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryM_VX; + + defvar ReadWritesVI = [WriteVICmpI_MX, ReadVICmpV_MX, ReadVMask]; + defvar ReadWritesVIMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryM_VI; } } @@ -3518,11 +3983,17 @@ defvar WriteVICmpX_MX = !cast("WriteVICmpX_" # mx); defvar ReadVICmpV_MX = !cast("ReadVICmpV_" # mx); defvar ReadVICmpX_MX = !cast("ReadVICmpX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryM_VV, - Sched<[WriteVICmpV_MX, ReadVICmpV_MX, ReadVICmpV_MX, ReadVMask]>; - defm "" : VPseudoBinaryM_VX, - Sched<[WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, ReadVMask]>; + defvar ReadWritesVV = [WriteVICmpV_MX, ReadVICmpV_MX, ReadVICmpV_MX, + ReadVMask]; + defvar ReadWritesVVMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryM_VV; + + defvar ReadWritesVX = [WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryM_VX; } } @@ -3531,9 +4002,12 @@ defvar mx = m.MX; defvar WriteVFCmpV_MX = !cast("WriteVFCmpV_" # mx); defvar ReadVFCmpV_MX = !cast("ReadVFCmpV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryM_VV, - Sched<[WriteVFCmpV_MX, ReadVFCmpV_MX, ReadVFCmpV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFCmpV_MX, ReadVFCmpV_MX, ReadVFCmpV_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryM_VV; } foreach f = FPList in { @@ -3542,9 +4016,12 @@ defvar WriteVFCmpF_MX = !cast("WriteVFCmpF_" # mx); defvar ReadVFCmpV_MX = !cast("ReadVFCmpV_" # mx); defvar ReadVFCmpF_MX = !cast("ReadVFCmpF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryM_VF, - Sched<[WriteVFCmpF_MX, ReadVFCmpV_MX, ReadVFCmpF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFCmpF_MX, ReadVFCmpV_MX, ReadVFCmpF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryM_VF; } } } @@ -3556,9 +4033,12 @@ defvar WriteVFCmpF_MX = !cast("WriteVFCmpF_" # mx); defvar ReadVFCmpV_MX = !cast("ReadVFCmpV_" # mx); defvar ReadVFCmpF_MX = !cast("ReadVFCmpF_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm "" : VPseudoBinaryM_VF, - Sched<[WriteVFCmpF_MX, ReadVFCmpV_MX, ReadVFCmpF_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFCmpF_MX, ReadVFCmpV_MX, ReadVFCmpF_MX, + ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryM_VF; } } } @@ -3570,11 +4050,16 @@ defvar WriteVICmpI_MX = !cast("WriteVICmpI_" # mx); defvar ReadVICmpV_MX = !cast("ReadVICmpV_" # mx); defvar ReadVICmpX_MX = !cast("ReadVICmpX_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); + + defvar ReadWritesVX = [WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, + ReadVMask]; + defvar ReadWritesVXMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryM_VX; - defm "" : VPseudoBinaryM_VX, - Sched<[WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, ReadVMask]>; - defm "" : VPseudoBinaryM_VI, - Sched<[WriteVICmpI_MX, ReadVICmpV_MX, ReadVMask]>; + defvar ReadWritesVI = [WriteVICmpI_MX, ReadVICmpV_MX, ReadVMask]; + defvar ReadWritesVIMask = InsertAtIdx1.l; + defm "" : VPseudoBinaryM_VI; } } @@ -3582,10 +4067,18 @@ foreach m = MxList in { defvar mx = m.MX; foreach e = SchedSEWSet.val in { - defvar WriteVIRedV_From_MX_E = !cast("WriteVIRedV_From_" # mx # "_E" # e); - defm _VS : VPseudoTernaryWithTailPolicy, - Sched<[WriteVIRedV_From_MX_E, ReadVIRedV, ReadVIRedV, ReadVIRedV, - ReadVMask]>; + defvar WriteVIRedV_From_MX_E = + !cast("WriteVIRedV_From_" # mx # "_E" # e); + // TODO: ReadVMergeOp should be MX of destination + defvar ReadVMergeOp_MX_E = + !cast("ReadVMergeOp_" # mx # "_E" # e); + + defvar ReadWrites = [WriteVIRedV_From_MX_E, ReadVIRedV, ReadVIRedV, + ReadVIRedV, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _VS : VPseudoTernaryWithTailPolicy; } } } @@ -3594,10 +4087,18 @@ foreach m = MxList in { defvar mx = m.MX; foreach e = SchedSEWSet.val in { - defvar WriteVIRedMinMaxV_From_MX_E = !cast("WriteVIRedMinMaxV_From_" # mx # "_E" # e); - defm _VS : VPseudoTernaryWithTailPolicy, - Sched<[WriteVIRedMinMaxV_From_MX_E, ReadVIRedV, ReadVIRedV, - ReadVIRedV, ReadVMask]>; + defvar WriteVIRedMinMaxV_From_MX_E = + !cast("WriteVIRedMinMaxV_From_" # mx # "_E" # e); + // TODO: ReadVMergeOp should be MX of destination + defvar ReadVMergeOp_MX_E = + !cast("ReadVMergeOp_" # mx # "_E" # e); + + defvar ReadWrites = [WriteVIRedMinMaxV_From_MX_E, ReadVIRedV, ReadVIRedV, + ReadVIRedV, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _VS : VPseudoTernaryWithTailPolicy; } } } @@ -3606,10 +4107,18 @@ foreach m = MxListWRed in { defvar mx = m.MX; foreach e = SchedSEWSet.val in { - defvar WriteVIWRedV_From_MX_E = !cast("WriteVIWRedV_From_" # mx # "_E" # e); - defm _VS : VPseudoTernaryWithTailPolicy, - Sched<[WriteVIWRedV_From_MX_E, ReadVIWRedV, ReadVIWRedV, - ReadVIWRedV, ReadVMask]>; + defvar WriteVIWRedV_From_MX_E = + !cast("WriteVIWRedV_From_" # mx # "_E" # e); + // TODO: ReadVMergeOp should be MX of destination + defvar ReadVMergeOp_MX_E = + !cast("ReadVMergeOp_" # mx # "_E" # e); + + defvar ReadWrites = [WriteVIWRedV_From_MX_E, ReadVIWRedV, ReadVIWRedV, + ReadVIWRedV, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _VS : VPseudoTernaryWithTailPolicy; } } } @@ -3618,12 +4127,20 @@ foreach m = MxListF in { defvar mx = m.MX; foreach e = SchedSEWSet.val in { - defvar WriteVFRedV_From_MX_E = !cast("WriteVFRedV_From_" # mx # "_E" # e); + defvar WriteVFRedV_From_MX_E = + !cast("WriteVFRedV_From_" # mx # "_E" # e); + // TODO: ReadVMergeOp should be MX of destination + defvar ReadVMergeOp_MX_E = + !cast("ReadVMergeOp_" # mx # "_E" # e); + + defvar ReadWrites = [WriteVFRedV_From_MX_E, ReadVFRedV, ReadVFRedV, + ReadVFRedV, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; defm _VS : VPseudoTernaryWithTailPolicyRoundingMode, - Sched<[WriteVFRedV_From_MX_E, ReadVFRedV, ReadVFRedV, ReadVFRedV, - ReadVMask]>; + V_M1.vrclass, m, e, + ReadWrites, + ReadWritesMask>; } } } @@ -3632,10 +4149,18 @@ foreach m = MxListF in { defvar mx = m.MX; foreach e = SchedSEWSet.val in { - defvar WriteVFRedMinMaxV_From_MX_E = !cast("WriteVFRedMinMaxV_From_" # mx # "_E" # e); - defm _VS : VPseudoTernaryWithTailPolicy, - Sched<[WriteVFRedMinMaxV_From_MX_E, ReadVFRedV, ReadVFRedV, ReadVFRedV, - ReadVMask]>; + defvar WriteVFRedMinMaxV_From_MX_E = + !cast("WriteVFRedMinMaxV_From_" # mx # "_E" # e); + // TODO: ReadVMergeOp should be MX of destination + defvar ReadVMergeOp_MX_E = + !cast("ReadVMergeOp_" # mx # "_E" # e); + + defvar ReadWrites = [WriteVFRedMinMaxV_From_MX_E, ReadVFRedV, ReadVFRedV, + ReadVFRedV, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _VS : VPseudoTernaryWithTailPolicy; } } } @@ -3644,11 +4169,19 @@ foreach m = MxListF in { defvar mx = m.MX; foreach e = SchedSEWSet.val in { - defvar WriteVFRedOV_From_MX_E = !cast("WriteVFRedOV_From_" # mx # "_E" # e); - defm _VS : VPseudoTernaryWithTailPolicyRoundingMode, - Sched<[WriteVFRedOV_From_MX_E, ReadVFRedOV, ReadVFRedOV, - ReadVFRedOV, ReadVMask]>; + defvar WriteVFRedOV_From_MX_E = + !cast("WriteVFRedOV_From_" # mx # "_E" # e); + defvar ReadVMergeOp_MX_E = + !cast("ReadVMergeOp_" # mx # "_E" # e); + + defvar ReadWrites = [WriteVFRedOV_From_MX_E, ReadVFRedOV, ReadVFRedOV, + ReadVFRedOV, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _VS : VPseudoTernaryWithTailPolicyRoundingMode; } } } @@ -3657,12 +4190,19 @@ foreach m = MxListFWRed in { defvar mx = m.MX; foreach e = SchedSEWSet.val in { - defvar WriteVFWRedV_From_MX_E = !cast("WriteVFWRedV_From_" # mx # "_E" # e); + defvar WriteVFWRedV_From_MX_E = + !cast("WriteVFWRedV_From_" # mx # "_E" # e); + defvar ReadVMergeOp_MX_E = + !cast("ReadVMergeOp_" # mx # "_E" # e); + + defvar ReadWrites = [WriteVFWRedV_From_MX_E, ReadVFWRedV, ReadVFWRedV, + ReadVFWRedV, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; defm _VS : VPseudoTernaryWithTailPolicyRoundingMode, - Sched<[WriteVFWRedV_From_MX_E, ReadVFWRedV, ReadVFWRedV, - ReadVFWRedV, ReadVMask]>; + V_M1.vrclass, m, e, + ReadWrites, + ReadWritesMask>; } } } @@ -3670,24 +4210,33 @@ multiclass VPseudoConversion ReadWrites, + list ReadWritesMask, string Constraint = ""> { let VLMul = MInfo.value in { - def "_" # MInfo.MX : VPseudoUnaryNoMask; + def "_" # MInfo.MX : VPseudoUnaryNoMask, + Sched; def "_" # MInfo.MX # "_MASK" : VPseudoUnaryMask, - RISCVMaskedPseudo; + RISCVMaskedPseudo, + Sched; } } multiclass VPseudoConversionRoundingMode ReadWrites, + list ReadWritesMask, string Constraint = ""> { let VLMul = MInfo.value in { - def "_" # MInfo.MX : VPseudoUnaryNoMaskRoundingMode; + def "_" # MInfo.MX + : VPseudoUnaryNoMaskRoundingMode, + Sched; def "_" # MInfo.MX # "_MASK" : VPseudoUnaryMaskRoundingMode, - RISCVMaskedPseudo; + RISCVMaskedPseudo, + Sched; } } @@ -3695,22 +4244,30 @@ multiclass VPseudoConversionRM ReadWrites, + list ReadWritesMask, string Constraint = ""> { let VLMul = MInfo.value in { def "_" # MInfo.MX : VPseudoUnaryNoMask_FRM; + Constraint>, + Sched; + def "_" # MInfo.MX # "_MASK" : VPseudoUnaryMask_FRM, - RISCVMaskedPseudo; + RISCVMaskedPseudo, + Sched; } } multiclass VPseudoConversionNoExcept ReadWritesMask, string Constraint = ""> { let VLMul = MInfo.value in { - def "_" # MInfo.MX # "_MASK" : VPseudoUnaryMask_NoExcept; + def "_" # MInfo.MX # "_MASK" + : VPseudoUnaryMask_NoExcept, + Sched; } } @@ -3719,9 +4276,12 @@ defvar mx = m.MX; defvar WriteVFCvtFToIV_MX = !cast("WriteVFCvtFToIV_" # mx); defvar ReadVFCvtFToIV_MX = !cast("ReadVFCvtFToIV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversion, - Sched<[WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _V : VPseudoConversion; } } @@ -3730,9 +4290,12 @@ defvar mx = m.MX; defvar WriteVFCvtFToIV_MX = !cast("WriteVFCvtFToIV_" # mx); defvar ReadVFCvtFToIV_MX = !cast("ReadVFCvtFToIV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversionRoundingMode, - Sched<[WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _V : VPseudoConversionRoundingMode; } } @@ -3741,9 +4304,12 @@ defvar mx = m.MX; defvar WriteVFCvtFToIV_MX = !cast("WriteVFCvtFToIV_" # mx); defvar ReadVFCvtFToIV_MX = !cast("ReadVFCvtFToIV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversionRM, - Sched<[WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _V : VPseudoConversionRM; } } @@ -3752,9 +4318,12 @@ defvar mx = m.MX; defvar WriteVFCvtFToIV_MX = !cast("WriteVFCvtFToIV_" # mx); defvar ReadVFCvtFToIV_MX = !cast("ReadVFCvtFToIV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversionNoExcept, - Sched<[WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask]>; + defvar ReadWritesMask = [WriteVFCvtFToIV_MX, ReadVFCvtFToIV_MX, ReadVMask, + ReadVMergeOp_MX]; + defm _V : VPseudoConversionNoExcept; } } @@ -3763,9 +4332,12 @@ defvar mx = m.MX; defvar WriteVFCvtIToFV_MX = !cast("WriteVFCvtIToFV_" # mx); defvar ReadVFCvtIToFV_MX = !cast("ReadVFCvtIToFV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversionRoundingMode, - Sched<[WriteVFCvtIToFV_MX, ReadVFCvtIToFV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFCvtIToFV_MX, ReadVFCvtIToFV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _V : VPseudoConversionRoundingMode; } } @@ -3774,9 +4346,12 @@ defvar mx = m.MX; defvar WriteVFCvtIToFV_MX = !cast("WriteVFCvtIToFV_" # mx); defvar ReadVFCvtIToFV_MX = !cast("ReadVFCvtIToFV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversionRM, - Sched<[WriteVFCvtIToFV_MX, ReadVFCvtIToFV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFCvtIToFV_MX, ReadVFCvtIToFV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _V : VPseudoConversionRM; } } @@ -3786,9 +4361,12 @@ defvar mx = m.MX; defvar WriteVFWCvtFToIV_MX = !cast("WriteVFWCvtFToIV_" # mx); defvar ReadVFWCvtFToIV_MX = !cast("ReadVFWCvtFToIV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversion, - Sched<[WriteVFWCvtFToIV_MX, ReadVFWCvtFToIV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWCvtFToIV_MX, ReadVFWCvtFToIV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _V : VPseudoConversion; } } @@ -3798,9 +4376,13 @@ defvar mx = m.MX; defvar WriteVFWCvtFToIV_MX = !cast("WriteVFWCvtFToIV_" # mx); defvar ReadVFWCvtFToIV_MX = !cast("ReadVFWCvtFToIV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversionRoundingMode, - Sched<[WriteVFWCvtFToIV_MX, ReadVFWCvtFToIV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWCvtFToIV_MX, ReadVFWCvtFToIV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _V : VPseudoConversionRoundingMode; } } @@ -3810,9 +4392,12 @@ defvar mx = m.MX; defvar WriteVFWCvtFToIV_MX = !cast("WriteVFWCvtFToIV_" # mx); defvar ReadVFWCvtFToIV_MX = !cast("ReadVFWCvtFToIV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversionRM, - Sched<[WriteVFWCvtFToIV_MX, ReadVFWCvtFToIV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWCvtFToIV_MX, ReadVFWCvtFToIV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _V : VPseudoConversionRM; } } @@ -3822,9 +4407,12 @@ defvar mx = m.MX; defvar WriteVFWCvtIToFV_MX = !cast("WriteVFWCvtIToFV_" # mx); defvar ReadVFWCvtIToFV_MX = !cast("ReadVFWCvtIToFV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversion, - Sched<[WriteVFWCvtIToFV_MX, ReadVFWCvtIToFV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWCvtIToFV_MX, ReadVFWCvtIToFV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _V : VPseudoConversion; } } @@ -3834,9 +4422,12 @@ defvar mx = m.MX; defvar WriteVFWCvtFToFV_MX = !cast("WriteVFWCvtFToFV_" # mx); defvar ReadVFWCvtFToFV_MX = !cast("ReadVFWCvtFToFV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _V : VPseudoConversion, - Sched<[WriteVFWCvtFToFV_MX, ReadVFWCvtFToFV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFWCvtFToFV_MX, ReadVFWCvtFToFV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _V : VPseudoConversion; } } @@ -3846,9 +4437,12 @@ defvar mx = m.MX; defvar WriteVFNCvtFToIV_MX = !cast("WriteVFNCvtFToIV_" # mx); defvar ReadVFNCvtFToIV_MX = !cast("ReadVFNCvtFToIV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _W : VPseudoConversion, - Sched<[WriteVFNCvtFToIV_MX, ReadVFNCvtFToIV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFNCvtFToIV_MX, ReadVFNCvtFToIV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _W : VPseudoConversion; } } @@ -3858,9 +4452,13 @@ defvar mx = m.MX; defvar WriteVFNCvtFToIV_MX = !cast("WriteVFNCvtFToIV_" # mx); defvar ReadVFNCvtFToIV_MX = !cast("ReadVFNCvtFToIV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _W : VPseudoConversionRoundingMode, - Sched<[WriteVFNCvtFToIV_MX, ReadVFNCvtFToIV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFNCvtFToIV_MX, ReadVFNCvtFToIV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _W : VPseudoConversionRoundingMode; } } @@ -3870,9 +4468,12 @@ defvar mx = m.MX; defvar WriteVFNCvtFToIV_MX = !cast("WriteVFNCvtFToIV_" # mx); defvar ReadVFNCvtFToIV_MX = !cast("ReadVFNCvtFToIV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _W : VPseudoConversionRM, - Sched<[WriteVFNCvtFToIV_MX, ReadVFNCvtFToIV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFNCvtFToIV_MX, ReadVFNCvtFToIV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _W : VPseudoConversionRM; } } @@ -3882,9 +4483,13 @@ defvar mx = m.MX; defvar WriteVFNCvtIToFV_MX = !cast("WriteVFNCvtIToFV_" # mx); defvar ReadVFNCvtIToFV_MX = !cast("ReadVFNCvtIToFV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _W : VPseudoConversionRoundingMode, - Sched<[WriteVFNCvtIToFV_MX, ReadVFNCvtIToFV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFNCvtIToFV_MX, ReadVFNCvtIToFV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _W : VPseudoConversionRoundingMode; } } @@ -3894,9 +4499,12 @@ defvar mx = m.MX; defvar WriteVFNCvtIToFV_MX = !cast("WriteVFNCvtIToFV_" # mx); defvar ReadVFNCvtIToFV_MX = !cast("ReadVFNCvtIToFV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _W : VPseudoConversionRM, - Sched<[WriteVFNCvtIToFV_MX, ReadVFNCvtIToFV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFNCvtIToFV_MX, ReadVFNCvtIToFV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _W : VPseudoConversionRM; } } @@ -3906,9 +4514,12 @@ defvar mx = m.MX; defvar WriteVFNCvtFToFV_MX = !cast("WriteVFNCvtFToFV_" # mx); defvar ReadVFNCvtFToFV_MX = !cast("ReadVFNCvtFToFV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _W : VPseudoConversion, - Sched<[WriteVFNCvtFToFV_MX, ReadVFNCvtFToFV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFNCvtFToFV_MX, ReadVFNCvtFToFV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _W : VPseudoConversion; } } @@ -3918,9 +4529,13 @@ defvar mx = m.MX; defvar WriteVFNCvtFToFV_MX = !cast("WriteVFNCvtFToFV_" # mx); defvar ReadVFNCvtFToFV_MX = !cast("ReadVFNCvtFToFV_" # mx); + defvar ReadVMergeOp_MX = !cast("ReadVMergeOp_" # mx); - defm _W : VPseudoConversionRoundingMode, - Sched<[WriteVFNCvtFToFV_MX, ReadVFNCvtFToFV_MX, ReadVMask]>; + defvar ReadWrites = [WriteVFNCvtFToFV_MX, ReadVFNCvtFToFV_MX, ReadVMask]; + defvar ReadWritesMask = InsertAtIdx1.l; + defm _W : VPseudoConversionRoundingMode; } } @@ -3934,7 +4549,7 @@ def nf # "E" # eew # "_V_" # LInfo : VPseudoUSSegLoadNoMask, VLSEGSched; def nf # "E" # eew # "_V_" # LInfo # "_MASK" : - VPseudoUSSegLoadMask, VLSEGSched; + VPseudoUSSegLoadMask, VLSEGSchedMask; } } } @@ -3949,9 +4564,11 @@ foreach nf = NFSet.L in { defvar vreg = SegRegClass.RC; def nf # "E" # eew # "FF_V_" # LInfo : - VPseudoUSSegLoadFFNoMask, VLSEGFFSched; + VPseudoUSSegLoadFFNoMask, + VLSEGFFSched; def nf # "E" # eew # "FF_V_" # LInfo # "_MASK" : - VPseudoUSSegLoadFFMask, VLSEGFFSched; + VPseudoUSSegLoadFFMask, + VLSEGFFSchedMask; } } } @@ -3965,10 +4582,12 @@ let VLMul = lmul.value, SEW=eew in { foreach nf = NFSet.L in { defvar vreg = SegRegClass.RC; - def nf # "E" # eew # "_V_" # LInfo : VPseudoSSegLoadNoMask, - VLSSEGSched; - def nf # "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoSSegLoadMask, - VLSSEGSched; + def nf # "E" # eew # "_V_" # LInfo + : VPseudoSSegLoadNoMask, + VLSSEGSched; + def nf # "E" # eew # "_V_" # LInfo # "_MASK" + : VPseudoSSegLoadMask, + VLSSEGSchedMask; } } } @@ -3999,7 +4618,7 @@ def nf # "EI" # idxEEW # "_V_" # IdxLInfo # "_" # DataLInfo # "_MASK" : VPseudoISegLoadMask, - VLXSEGSched; + VLXSEGSchedMask; } } } @@ -4015,10 +4634,12 @@ let VLMul = lmul.value, SEW=eew in { foreach nf = NFSet.L in { defvar vreg = SegRegClass.RC; - def nf # "E" # eew # "_V_" # LInfo : VPseudoUSSegStoreNoMask, - VSSEGSched; - def nf # "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoUSSegStoreMask, - VSSEGSched; + def nf # "E" # eew # "_V_" # LInfo + : VPseudoUSSegStoreNoMask, + VSSEGSched; + def nf # "E" # eew # "_V_" # LInfo # "_MASK" + : VPseudoUSSegStoreMask, + VSSEGSchedMask; } } } @@ -4032,10 +4653,12 @@ let VLMul = lmul.value, SEW=eew in { foreach nf = NFSet.L in { defvar vreg = SegRegClass.RC; - def nf # "E" # eew # "_V_" # LInfo : VPseudoSSegStoreNoMask, - VSSSEGSched; - def nf # "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoSSegStoreMask, - VSSSEGSched; + def nf # "E" # eew # "_V_" # LInfo + : VPseudoSSegStoreNoMask, + VSSSEGSched; + def nf # "E" # eew # "_V_" # LInfo # "_MASK" + : VPseudoSSegStoreMask, + VSSSEGSchedMask; } } } @@ -4066,7 +4689,7 @@ def nf # "EI" # idxEEW # "_V_" # IdxLInfo # "_" # DataLInfo # "_MASK" : VPseudoISegStoreMask, - VSXSEGSched; + VSXSEGSchedMask; } } } diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXTHead.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXTHead.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXTHead.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXTHead.td @@ -474,14 +474,16 @@ //===----------------------------------------------------------------------===// multiclass VPseudoVMAQA_VV_VX { foreach m = MxListTHVdot in { - defm "" : VPseudoTernaryW_VV; - defm "" : VPseudoTernaryW_VX; + // TODO: Add SchedReadWrites + defm "" : VPseudoTernaryW_VV; + defm "" : VPseudoTernaryW_VX; } } multiclass VPseudoVMAQA_VX { foreach m = MxListTHVdot in { - defm "" : VPseudoTernaryW_VX; + // TODO: Add SchedReadWrites + defm "" : VPseudoTernaryW_VX; } } diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td --- a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td @@ -1154,6 +1154,11 @@ // Others def : ReadAdvance; +foreach mx = SchedMxList in { + def : ReadAdvance("ReadVMergeOp_" # mx), 0>; + foreach sew = SchedSEWSet.val in + def : ReadAdvance("ReadVMergeOp_" # mx # "_E" # sew), 0>; +} //===----------------------------------------------------------------------===// // Unsupported extensions diff --git a/llvm/lib/Target/RISCV/RISCVScheduleV.td b/llvm/lib/Target/RISCV/RISCVScheduleV.td --- a/llvm/lib/Target/RISCV/RISCVScheduleV.td +++ b/llvm/lib/Target/RISCV/RISCVScheduleV.td @@ -687,6 +687,11 @@ // Others def ReadVMask : SchedRead; +foreach mx = SchedMxList in { + def ReadVMergeOp_ # mx : SchedRead; + foreach sew = SchedSEWSet.val in + def ReadVMergeOp_ # mx # "_E" # sew : SchedRead; +} //===----------------------------------------------------------------------===// /// Define default scheduler resources for V. @@ -1050,6 +1055,11 @@ // Others def : ReadAdvance; +foreach mx = SchedMxList in { + def : ReadAdvance("ReadVMergeOp_" # mx), 0>; + foreach sew = SchedSEWSet.val in + def : ReadAdvance("ReadVMergeOp_" # mx # "_E" # sew), 0>; +} } // Unsupported } // UnsupportedSchedV