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 @@ -1989,6 +1989,45 @@ } } +class SchedBinary: Sched<[]> { + defvar Write = !cast(!if(sew, + write # "_" # mx # "_E" # sew, + write # "_" # mx)); + defvar Read0 = !cast(!if(sew, + read0 # "_" # mx # "_E" # sew, + read0 # "_" # mx)); + defvar Read1 = !cast(!if(sew, + read1 # "_" # mx # "_E" # sew, + read1 # "_" # mx)); + defvar SchedRWList = [Write, Read0, Read1]; + defvar SchedRWListMasked = [Write, Read0, Read1, ReadVMask]; + defvar IsMasked = !ne(!find(NAME, "_MASK"), -1); + let SchedRW = !if(IsMasked, SchedRWListMasked, SchedRWList); +} + +class SchedBinaryVV: + SchedBinary; + +class SchedBinaryVX: + SchedBinary; + +class SchedBinaryVI: Sched<[]> { + defvar Write = !cast(!if(sew, + write # "_" # mx # "_E" # sew, + write # "_" # mx)); + defvar Read0 = !cast(!if(sew, + read0 # "_" # mx # "_E" # sew, + read0 # "_" # mx)); + defvar SchedRWList = [Write, Read0]; + defvar SchedRWListMasked = [Write, Read0, ReadVMask]; + defvar IsMasked = !find(NAME, "_MASK"); + let SchedRW = !if(IsMasked, SchedRWListMasked, SchedRWList); +} + multiclass VPseudoBinaryRoundingMode("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]>; + SchedBinaryVV<"WriteVRGatherVV", "ReadVRGatherVV_data", "ReadVRGatherVV_index", mx, e>; } } } @@ -2143,14 +2179,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]>; + SchedBinaryVV<"WriteVFSlide1F", "ReadVFSlideV", "ReadVFSlideF", m.MX>; } } } @@ -2542,26 +2573,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]>; + SchedBinaryVX<"WriteVRGatherVX", "ReadVRGatherVX_data", + "ReadVRGatherVX_index", mx>; defm "" : VPseudoBinaryV_VI, - Sched<[WriteVRGatherVI_MX, ReadVRGatherVI_data_MX, ReadVMask]>; + SchedBinaryVI<"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]>; + SchedBinaryVV<"WriteVRGatherVV", "ReadVRGatherVV_data", + "ReadVRGatherVV_index", mx, e>; } } } @@ -2569,18 +2591,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]>; + SchedBinaryVV<"WriteVSALUV", "ReadVSALUV", "ReadVSALUX", mx>; defm "" : VPseudoBinaryV_VX, - Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>; + SchedBinaryVX<"WriteVSALUX", "ReadVSALUV", "ReadVSALUX", mx>; defm "" : VPseudoBinaryV_VI, - Sched<[WriteVSALUI_MX, ReadVSALUV_MX, ReadVMask]>; + SchedBinaryVI<"WriteVSALUI", "ReadVSALUV", mx>; } }