diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td index e68fb42ece9f0..0bbf71519953b 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td @@ -975,11 +975,14 @@ multiclass VNCLP_IV_V_X_I funct6> { SchedUnaryMC<"WriteVNClipI", "ReadVNClipV">; } -multiclass VSLD_IV_X_I funct6> { +multiclass VSLD_IV_X_I funct6, bit slidesUp> { + // Note: In the future, if VISlideI is also split into VSlideUpI and + // VSlideDownI, it'll probably better to use two separate multiclasses. + defvar WriteSlideX = !if(slidesUp, "WriteVSlideUpX", "WriteVSlideDownX"); def X : VALUVX, - SchedBinaryMC<"WriteVISlideX", "ReadVISlideV", "ReadVISlideX">; + SchedBinaryMC; def I : VALUVI, - SchedUnaryMC<"WriteVISlideI", "ReadVISlideV">; + SchedUnaryMC<"WriteVSlideI", "ReadVISlideV">; } multiclass VSLD1_MV_X funct6> { @@ -1658,10 +1661,10 @@ def VFMV_S_F : RVInstV2<0b010000, 0b00000, OPFVF, (outs VR:$vd_wb), let Predicates = [HasVInstructions] in { // Vector Slide Instructions let Constraints = "@earlyclobber $vd", RVVConstraint = SlideUp in { -defm VSLIDEUP_V : VSLD_IV_X_I<"vslideup", 0b001110>; +defm VSLIDEUP_V : VSLD_IV_X_I<"vslideup", 0b001110, /*slidesUp=*/true>; defm VSLIDE1UP_V : VSLD1_MV_X<"vslide1up", 0b001110>; } // Constraints = "@earlyclobber $vd", RVVConstraint = SlideUp -defm VSLIDEDOWN_V : VSLD_IV_X_I<"vslidedown", 0b001111>; +defm VSLIDEDOWN_V : VSLD_IV_X_I<"vslidedown", 0b001111, /*slidesUp=*/false>; defm VSLIDE1DOWN_V : VSLD1_MV_X<"vslide1down", 0b001111>; } // Predicates = [HasVInstructions] diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td index 317a6d7d4c52f..8bf0f25d496a5 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -3380,14 +3380,16 @@ multiclass VPseudoVMAC_VV_VF_AAXA_RM { } } -multiclass VPseudoVSLD_VX_VI { +multiclass VPseudoVSLD_VX_VI { + defvar WriteSlideX = !if(slidesUp, "WriteVSlideUpX", "WriteVSlideDownX"); foreach m = MxList in { defvar mx = m.MX; defm "" : VPseudoVSLDV_VX, - SchedTernary<"WriteVISlideX", "ReadVISlideV", "ReadVISlideV", + SchedTernary; defm "" : VPseudoVSLDV_VI, - SchedBinary<"WriteVISlideI", "ReadVISlideV", "ReadVISlideV", mx>; + SchedBinary<"WriteVSlideI", "ReadVISlideV", "ReadVISlideV", mx>; } } @@ -6861,8 +6863,8 @@ let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { // 16.3. Vector Slide Instructions //===----------------------------------------------------------------------===// let Predicates = [HasVInstructions] in { - defm PseudoVSLIDEUP : VPseudoVSLD_VX_VI; - defm PseudoVSLIDEDOWN : VPseudoVSLD_VX_VI; + defm PseudoVSLIDEUP : VPseudoVSLD_VX_VI; + defm PseudoVSLIDEDOWN : VPseudoVSLD_VX_VI; defm PseudoVSLIDE1UP : VPseudoVSLD1_VX<"@earlyclobber $rd">; defm PseudoVSLIDE1DOWN : VPseudoVSLD1_VX; } // Predicates = [HasVInstructions] diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td index e67da839bdb87..83fb75727bbe8 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td @@ -937,10 +937,11 @@ foreach mx = SchedMxList in { defvar Cycles = SiFive7GetCyclesDefault.c; defvar IsWorstCase = SiFive7IsWorstCaseMX.c; let Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { - defm "" : LMULWriteResMX<"WriteVISlideX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; - defm "" : LMULWriteResMX<"WriteVISlideI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; - defm "" : LMULWriteResMX<"WriteVISlide1X", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; - defm "" : LMULWriteResMX<"WriteVFSlide1F", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVSlideUpX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVSlideDownX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVSlideI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVISlide1X", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVFSlide1F", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; } } diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td b/llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td index 6ba299385f07e..07d72b61862dd 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td @@ -669,7 +669,7 @@ foreach mx = SchedMxList in { defvar LMulLat = SiFiveP600GetLMulCycles.c; defvar IsWorstCase = SiFiveP600IsWorstCaseMX.c; let Latency = 2, ReleaseAtCycles = [LMulLat] in { - defm "" : LMULWriteResMX<"WriteVISlideI", [SiFiveP600VEXQ0], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVSlideI", [SiFiveP600VEXQ0], mx, IsWorstCase>; } let Latency = 1, ReleaseAtCycles = [LMulLat] in { defm "" : LMULWriteResMX<"WriteVISlide1X", [SiFiveP600VEXQ0], mx, IsWorstCase>; @@ -679,7 +679,8 @@ foreach mx = SchedMxList in { foreach mx = ["MF8", "MF4", "MF2", "M1"] in { defvar IsWorstCase = SiFiveP600IsWorstCaseMX.c; let Latency = 2, ReleaseAtCycles = [1] in { - defm "" : LMULWriteResMX<"WriteVISlideX", [SiFiveP600VEXQ0], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVSlideUpX", [SiFiveP600VEXQ0], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVSlideDownX", [SiFiveP600VEXQ0], mx, IsWorstCase>; } } @@ -688,7 +689,8 @@ foreach mx = ["M8", "M4", "M2"] in { defvar LMulLat = SiFiveP600GetLMulCycles.c; defvar IsWorstCase = SiFiveP600IsWorstCaseMX.c; let Latency = !add(4, LMulLat), ReleaseAtCycles = [LMulLat] in { - defm "" : LMULWriteResMX<"WriteVISlideX", [SiFiveP600VEXQ1], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVSlideUpX", [SiFiveP600VEXQ1], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVSlideDownX", [SiFiveP600VEXQ1], mx, IsWorstCase>; } } diff --git a/llvm/lib/Target/RISCV/RISCVScheduleV.td b/llvm/lib/Target/RISCV/RISCVScheduleV.td index 5be06d4c3f7e7..e4524185991e5 100644 --- a/llvm/lib/Target/RISCV/RISCVScheduleV.td +++ b/llvm/lib/Target/RISCV/RISCVScheduleV.td @@ -514,8 +514,9 @@ def WriteVMovXS : SchedWrite; def WriteVMovSF : SchedWrite; def WriteVMovFS : SchedWrite; // 16.3. Vector Slide Instructions -defm "" : LMULSchedWrites<"WriteVISlideX">; -defm "" : LMULSchedWrites<"WriteVISlideI">; +defm "" : LMULSchedWrites<"WriteVSlideUpX">; +defm "" : LMULSchedWrites<"WriteVSlideDownX">; +defm "" : LMULSchedWrites<"WriteVSlideI">; defm "" : LMULSchedWrites<"WriteVISlide1X">; defm "" : LMULSchedWrites<"WriteVFSlide1F">; // 16.4. Vector Register Gather Instructions @@ -949,8 +950,9 @@ def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; -defm "" : LMULWriteRes<"WriteVISlideX", []>; -defm "" : LMULWriteRes<"WriteVISlideI", []>; +defm "" : LMULWriteRes<"WriteVSlideUpX", []>; +defm "" : LMULWriteRes<"WriteVSlideDownX", []>; +defm "" : LMULWriteRes<"WriteVSlideI", []>; defm "" : LMULWriteRes<"WriteVISlide1X", []>; defm "" : LMULWriteRes<"WriteVFSlide1F", []>; defm "" : LMULSEWWriteRes<"WriteVRGatherVV", []>;