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 @@ -783,50 +783,65 @@ multiclass VSALU_IV_V_X_I funct6, Operand optype = simm5, string vw = "v"> { def V : VALUVV, - Sched<[WriteVSALUV, ReadVSALUV, ReadVSALUV, ReadVMask]>; + Sched<[WriteVSALUV_UpperBound, ReadVSALUV_UpperBound, + ReadVSALUV_UpperBound, ReadVMask]>; def X : VALUVX, - Sched<[WriteVSALUX, ReadVSALUV, ReadVSALUX, ReadVMask]>; + Sched<[WriteVSALUX_UpperBound, ReadVSALUV_UpperBound, + ReadVSALUX_UpperBound, ReadVMask]>; def I : VALUVI, - Sched<[WriteVSALUI, ReadVSALUV, ReadVMask]>; + Sched<[WriteVSALUI_UpperBound, ReadVSALUV_UpperBound, + ReadVMask]>; } multiclass VSALU_IV_V_X funct6, string vw = "v"> { def V : VALUVV, - Sched<[WriteVSALUV, ReadVSALUV, ReadVSALUV, ReadVMask]>; + Sched<[WriteVSALUV_UpperBound, ReadVSALUV_UpperBound, + ReadVSALUV_UpperBound, ReadVMask]>; def X : VALUVX, - Sched<[WriteVSALUX, ReadVSALUV, ReadVSALUX, ReadVMask]>; + Sched<[WriteVSALUX_UpperBound, ReadVSALUV_UpperBound, + ReadVSALUX_UpperBound, ReadVMask]>; } multiclass VAALU_MV_V_X funct6, string vw = "v"> { def V : VALUVV, - Sched<[WriteVAALUV, ReadVAALUV, ReadVAALUV, ReadVMask]>; + Sched<[WriteVAALUV_UpperBound, ReadVAALUV_UpperBound, + ReadVAALUV_UpperBound, ReadVMask]>; def X : VALUVX, - Sched<[WriteVAALUX, ReadVAALUV, ReadVAALUX, ReadVMask]>; + Sched<[WriteVAALUX_UpperBound, ReadVAALUV_UpperBound, + ReadVAALUX_UpperBound, ReadVMask]>; } multiclass VSMUL_IV_V_X funct6, string vw = "v"> { def V : VALUVV, - Sched<[WriteVSMulV, ReadVSMulV, ReadVSMulV, ReadVMask]>; + Sched<[WriteVSMulV_UpperBound, ReadVSMulV_UpperBound, + ReadVSMulV_UpperBound, ReadVMask]>; def X : VALUVX, - Sched<[WriteVSMulX, ReadVSMulV, ReadVSMulX, ReadVMask]>; + Sched<[WriteVSMulX_UpperBound, ReadVSMulV_UpperBound, + ReadVSMulX_UpperBound, ReadVMask]>; } multiclass VSSHF_IV_V_X_I funct6, Operand optype = simm5, string vw = "v"> { def V : VALUVV, - Sched<[WriteVSShiftV, ReadVSShiftV, ReadVSShiftV, ReadVMask]>; + Sched<[WriteVSShiftV_UpperBound, ReadVSShiftV_UpperBound, + ReadVSShiftV_UpperBound, ReadVMask]>; def X : VALUVX, - Sched<[WriteVSShiftX, ReadVSShiftV, ReadVSShiftX, ReadVMask]>; + Sched<[WriteVSShiftX_UpperBound, ReadVSShiftV_UpperBound, + ReadVSShiftX_UpperBound, ReadVMask]>; def I : VALUVI, - Sched<[WriteVSShiftI, ReadVSShiftV, ReadVMask]>; + Sched<[WriteVSShiftI_UpperBound, ReadVSShiftV_UpperBound, + ReadVMask]>; } multiclass VNCLP_IV_V_X_I funct6, Operand optype = simm5, string vw = "v"> { def V : VALUVV, - Sched<[WriteVNClipV, ReadVNClipV, ReadVNClipV, ReadVMask]>; + Sched<[WriteVNClipV_UpperBound, ReadVNClipV_UpperBound, + ReadVNClipV_UpperBound, ReadVMask]>; def X : VALUVX, - Sched<[WriteVNClipX, ReadVNClipV, ReadVNClipX, ReadVMask]>; + Sched<[WriteVNClipX_UpperBound, ReadVNClipV_UpperBound, + ReadVNClipX_UpperBound, ReadVMask]>; def I : VALUVI, - Sched<[WriteVNClipI, ReadVNClipV, ReadVMask]>; + Sched<[WriteVNClipI_UpperBound, ReadVNClipV_UpperBound, + ReadVMask]>; } multiclass VSLD_IV_X_I funct6, Operand optype = simm5, string vw = "v"> { 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 @@ -2354,12 +2354,21 @@ } multiclass VPseudoVSALU_VV_VX_VI { - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVSALUV, ReadVSALUV, ReadVSALUV, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVSALUX, ReadVSALUV, ReadVSALUX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI, - Sched<[WriteVSALUI, ReadVSALUV, ReadVMask]>; + 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_LMUL, + Sched<[WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_VX_LMUL, + Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_VI_LMUL, + Sched<[WriteVSALUI_MX, ReadVSALUV_MX, ReadVMask]>; + } } @@ -2382,12 +2391,21 @@ } multiclass VPseudoVSSHT_VV_VX_VI { - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVSShiftV, ReadVSShiftV, ReadVSShiftV, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVSShiftX, ReadVSShiftV, ReadVSShiftX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI, - Sched<[WriteVSShiftI, ReadVSShiftV, ReadVMask]>; + 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_LMUL, + Sched<[WriteVSShiftV_MX, ReadVSShiftV_MX, ReadVSShiftV_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_VX_LMUL, + Sched<[WriteVSShiftX_MX, ReadVSShiftV_MX, ReadVSShiftX_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_VI_LMUL, + Sched<[WriteVSShiftI_MX, ReadVSShiftV_MX, ReadVMask]>; + } } multiclass VPseudoVALU_VV_VX_VI { @@ -2409,24 +2427,48 @@ } multiclass VPseudoVSALU_VV_VX { - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVSALUV, ReadVSALUV, ReadVSALUV, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVSALUX, ReadVSALUV, ReadVSALUX, ReadVMask]>; + 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_LMUL, + Sched<[WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_VX_LMUL, + Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>; + } } multiclass VPseudoVSMUL_VV_VX { - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVSMulV, ReadVSMulV, ReadVSMulV, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVSMulX, ReadVSMulV, ReadVSMulX, ReadVMask]>; + 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_LMUL, + Sched<[WriteVSMulV_MX, ReadVSMulV_MX, ReadVSMulV_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_VX_LMUL, + Sched<[WriteVSMulX_MX, ReadVSMulV_MX, ReadVSMulX_MX, ReadVMask]>; + } } multiclass VPseudoVAALU_VV_VX { - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVAALUV, ReadVAALUV, ReadVAALUV, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVAALUX, ReadVAALUV, ReadVAALUX, ReadVMask]>; + 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_LMUL, + Sched<[WriteVAALUV_MX, ReadVAALUV_MX, ReadVAALUV_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_VX_LMUL, + Sched<[WriteVAALUX_MX, ReadVAALUV_MX, ReadVAALUX_MX, ReadVMask]>; + } } multiclass VPseudoVMINMAX_VV_VX { @@ -2752,12 +2794,21 @@ } multiclass VPseudoVNCLP_WV_WX_WI { - defm "" : VPseudoBinaryV_WV, - Sched<[WriteVNClipV, ReadVNClipV, ReadVNClipV, ReadVMask]>; - defm "" : VPseudoBinaryV_WX, - Sched<[WriteVNClipX, ReadVNClipV, ReadVNClipX, ReadVMask]>; - defm "" : VPseudoBinaryV_WI, - Sched<[WriteVNClipI, ReadVNClipV, ReadVMask]>; + 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_LMUL, + Sched<[WriteVNClipV_MX, ReadVNClipV_MX, ReadVNClipV_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_WX_LMUL, + Sched<[WriteVNClipX_MX, ReadVNClipV_MX, ReadVNClipX_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_WI_LMUL, + Sched<[WriteVNClipI_MX, ReadVNClipV_MX, ReadVMask]>; + } } multiclass VPseudoVNSHT_WV_WX_WI { 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 @@ -166,23 +166,23 @@ // 12. Vector Fixed-Point Arithmetic Instructions // 12.1. Vector Single-Width Saturating Add and Subtract -def WriteVSALUV : SchedWrite; -def WriteVSALUX : SchedWrite; -def WriteVSALUI : SchedWrite; +defm "" : LMULSchedWrites<"WriteVSALUV">; +defm "" : LMULSchedWrites<"WriteVSALUX">; +defm "" : LMULSchedWrites<"WriteVSALUI">; // 12.2. Vector Single-Width Averaging Add and Subtract -def WriteVAALUV : SchedWrite; -def WriteVAALUX : SchedWrite; +defm "" : LMULSchedWrites<"WriteVAALUV">; +defm "" : LMULSchedWrites<"WriteVAALUX">; // 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation -def WriteVSMulV : SchedWrite; -def WriteVSMulX : SchedWrite; +defm "" : LMULSchedWrites<"WriteVSMulV">; +defm "" : LMULSchedWrites<"WriteVSMulX">; // 12.4. Vector Single-Width Scaling Shift Instructions -def WriteVSShiftV : SchedWrite; -def WriteVSShiftX : SchedWrite; -def WriteVSShiftI : SchedWrite; +defm "" : LMULSchedWrites<"WriteVSShiftV">; +defm "" : LMULSchedWrites<"WriteVSShiftX">; +defm "" : LMULSchedWrites<"WriteVSShiftI">; // 12.5. Vector Narrowing Fixed-Point Clip Instructions -def WriteVNClipV : SchedWrite; -def WriteVNClipX : SchedWrite; -def WriteVNClipI : SchedWrite; +defm "" : LMULSchedWrites<"WriteVNClipV", SchedMxListW>; +defm "" : LMULSchedWrites<"WriteVNClipX", SchedMxListW>; +defm "" : LMULSchedWrites<"WriteVNClipI", SchedMxListW>; // 13. Vector Floating-Point Instructions // 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions @@ -382,20 +382,20 @@ // 12. Vector Fixed-Point Arithmetic Instructions // 12.1. Vector Single-Width Saturating Add and Subtract -def ReadVSALUV : SchedRead; -def ReadVSALUX : SchedRead; +defm "" : LMULSchedReads<"ReadVSALUV">; +defm "" : LMULSchedReads<"ReadVSALUX">; // 12.2. Vector Single-Width Averaging Add and Subtract -def ReadVAALUV : SchedRead; -def ReadVAALUX : SchedRead; +defm "" : LMULSchedReads<"ReadVAALUV">; +defm "" : LMULSchedReads<"ReadVAALUX">; // 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation -def ReadVSMulV : SchedRead; -def ReadVSMulX : SchedRead; +defm "" : LMULSchedReads<"ReadVSMulV">; +defm "" : LMULSchedReads<"ReadVSMulX">; // 12.4. Vector Single-Width Scaling Shift Instructions -def ReadVSShiftV : SchedRead; -def ReadVSShiftX : SchedRead; +defm "" : LMULSchedReads<"ReadVSShiftV">; +defm "" : LMULSchedReads<"ReadVSShiftX">; // 12.5. Vector Narrowing Fixed-Point Clip Instructions -def ReadVNClipV : SchedRead; -def ReadVNClipX : SchedRead; +defm "" : LMULSchedReads<"ReadVNClipV", SchedMxListW>; +defm "" : LMULSchedReads<"ReadVNClipX", SchedMxListW>; // 13. Vector Floating-Point Instructions // 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions @@ -613,20 +613,21 @@ defm "" : LMULWriteRes<"WriteVIMovX", []>; defm "" : LMULWriteRes<"WriteVIMovI", []>; -// 13. Vector Fixed-Point Arithmetic Instructions -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; +// 12. Vector Fixed-Point Arithmetic Instructions +// 12. Vector Fixed-Point Arithmetic Instructions +defm "" : LMULWriteRes<"WriteVSALUV", []>; +defm "" : LMULWriteRes<"WriteVSALUX", []>; +defm "" : LMULWriteRes<"WriteVSALUI", []>; +defm "" : LMULWriteRes<"WriteVAALUV", []>; +defm "" : LMULWriteRes<"WriteVAALUX", []>; +defm "" : LMULWriteRes<"WriteVSMulV", []>; +defm "" : LMULWriteRes<"WriteVSMulX", []>; +defm "" : LMULWriteRes<"WriteVSShiftV", []>; +defm "" : LMULWriteRes<"WriteVSShiftX", []>; +defm "" : LMULWriteRes<"WriteVSShiftI", []>; +defm "" : LMULWriteRes<"WriteVNClipV", [], SchedMxListW>; +defm "" : LMULWriteRes<"WriteVNClipX", [], SchedMxListW>; +defm "" : LMULWriteRes<"WriteVNClipI", [], SchedMxListW>; // 14. Vector Floating-Point Instructions def : WriteRes; @@ -764,17 +765,17 @@ defm "" : LMULReadAdvance<"ReadVIMovV", 0>; defm "" : LMULReadAdvance<"ReadVIMovX", 0>; -// 13. Vector Fixed-Point Arithmetic Instructions -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; +// 12. Vector Fixed-Point Arithmetic Instructions +defm "" : LMULReadAdvance<"ReadVSALUV", 0>; +defm "" : LMULReadAdvance<"ReadVSALUX", 0>; +defm "" : LMULReadAdvance<"ReadVAALUV", 0>; +defm "" : LMULReadAdvance<"ReadVAALUX", 0>; +defm "" : LMULReadAdvance<"ReadVSMulV", 0>; +defm "" : LMULReadAdvance<"ReadVSMulX", 0>; +defm "" : LMULReadAdvance<"ReadVSShiftV", 0>; +defm "" : LMULReadAdvance<"ReadVSShiftX", 0>; +defm "" : LMULReadAdvance<"ReadVNClipV", 0, SchedMxListW>; +defm "" : LMULReadAdvance<"ReadVNClipX", 0, SchedMxListW>; // 14. Vector Floating-Point Instructions def : ReadAdvance;