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 @@ -650,6 +650,15 @@ ReadVMask]>; } +multiclass VMINMAX_FV_V_F funct6> { + def V : VALUVV, + Sched<[WriteVFMinMaxV_WorstCase, ReadVFMinMaxV_WorstCase, + ReadVFMinMaxV_WorstCase, ReadVMask]>; + def F : VALUVF, + Sched<[WriteVFMinMaxF_WorstCase, ReadVFMinMaxV_WorstCase, + ReadVFMinMaxF_WorstCase, ReadVMask]>; +} + multiclass VCMP_FV_V_F funct6> { def V : VALUVV, Sched<[WriteVFCmpV_WorstCase, ReadVFCmpV_WorstCase, @@ -804,6 +813,15 @@ ReadVMask]>; } +multiclass VMINMAX_IV_V_X funct6> { + def V : VALUVV, + Sched<[WriteVIMinMaxV_WorstCase, ReadVIMinMaxV_WorstCase, + ReadVIMinMaxV_WorstCase, ReadVMask]>; + def X : VALUVX, + Sched<[WriteVIMinMaxX_WorstCase, ReadVIMinMaxV_WorstCase, + ReadVIMinMaxX_WorstCase, ReadVMask]>; +} + multiclass VCMP_IV_V_X_I funct6> { def V : VALUVV, Sched<[WriteVICmpV_WorstCase, ReadVICmpV_WorstCase, @@ -1228,10 +1246,10 @@ } // Vector Integer Min/Max Instructions -defm VMINU_V : VCMP_IV_V_X<"vminu", 0b000100>; -defm VMIN_V : VCMP_IV_V_X<"vmin", 0b000101>; -defm VMAXU_V : VCMP_IV_V_X<"vmaxu", 0b000110>; -defm VMAX_V : VCMP_IV_V_X<"vmax", 0b000111>; +defm VMINU_V : VMINMAX_IV_V_X<"vminu", 0b000100>; +defm VMIN_V : VMINMAX_IV_V_X<"vmin", 0b000101>; +defm VMAXU_V : VMINMAX_IV_V_X<"vmaxu", 0b000110>; +defm VMAX_V : VMINMAX_IV_V_X<"vmax", 0b000111>; // Vector Single-Width Integer Multiply Instructions defm VMUL_V : VMUL_MV_V_X<"vmul", 0b100101>; @@ -1383,8 +1401,8 @@ // Vector Floating-Point MIN/MAX Instructions let mayRaiseFPException = true in { -defm VFMIN_V : VCMP_FV_V_F<"vfmin", 0b000100>; -defm VFMAX_V : VCMP_FV_V_F<"vfmax", 0b000110>; +defm VFMIN_V : VMINMAX_FV_V_F<"vfmin", 0b000100>; +defm VFMAX_V : VMINMAX_FV_V_F<"vfmax", 0b000110>; } // Vector Floating-Point Sign-Injection Instructions 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 @@ -2648,15 +2648,15 @@ multiclass VPseudoVMINMAX_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); + 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<[WriteVICmpV_MX, ReadVICmpV_MX, ReadVICmpV_MX, ReadVMask]>; + Sched<[WriteVIMinMaxV_MX, ReadVIMinMaxV_MX, ReadVIMinMaxV_MX, ReadVMask]>; defm "" : VPseudoBinaryV_VX, - Sched<[WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, ReadVMask]>; + Sched<[WriteVIMinMaxX_MX, ReadVIMinMaxV_MX, ReadVIMinMaxX_MX, ReadVMask]>; } } @@ -2803,22 +2803,22 @@ multiclass VPseudoVMAX_VV_VF { foreach m = MxListF in { defvar mx = m.MX; - defvar WriteVFCmpV_MX = !cast("WriteVFCmpV_" # mx); - defvar ReadVFCmpV_MX = !cast("ReadVFCmpV_" # mx); + defvar WriteVFMinMaxV_MX = !cast("WriteVFMinMaxV_" # mx); + defvar ReadVFMinMaxV_MX = !cast("ReadVFMinMaxV_" # mx); defm "" : VPseudoBinaryFV_VV, - Sched<[WriteVFCmpV_MX, ReadVFCmpV_MX, ReadVFCmpV_MX, ReadVMask]>; + Sched<[WriteVFMinMaxV_MX, ReadVFMinMaxV_MX, ReadVFMinMaxV_MX, ReadVMask]>; } 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); + defvar WriteVFMinMaxF_MX = !cast("WriteVFMinMaxF_" # mx); + defvar ReadVFMinMaxV_MX = !cast("ReadVFMinMaxV_" # mx); + defvar ReadVFMinMaxF_MX = !cast("ReadVFMinMaxF_" # mx); defm "" : VPseudoBinaryV_VF, - Sched<[WriteVFCmpF_MX, ReadVFCmpV_MX, ReadVFCmpF_MX, ReadVMask]>; + Sched<[WriteVFMinMaxF_MX, ReadVFMinMaxV_MX, ReadVFMinMaxF_MX, ReadVMask]>; } } } 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 @@ -448,6 +448,8 @@ defm "" : LMULWriteResMX<"WriteVShiftV", [SiFive7VA], mx, IsWorstCase>; defm "" : LMULWriteResMX<"WriteVShiftX", [SiFive7VA], mx, IsWorstCase>; defm "" : LMULWriteResMX<"WriteVShiftI", [SiFive7VA], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVIMinMaxV", [SiFive7VA], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVIMinMaxX", [SiFive7VA], mx, IsWorstCase>; defm "" : LMULWriteResMX<"WriteVIMulV", [SiFive7VA], mx, IsWorstCase>; defm "" : LMULWriteResMX<"WriteVIMulX", [SiFive7VA], mx, IsWorstCase>; defm "" : LMULWriteResMX<"WriteVIMulAddV", [SiFive7VA], mx, IsWorstCase>; @@ -556,6 +558,8 @@ let Latency = 4, ResourceCycles = [Cycles] in { defm "" : LMULWriteResMX<"WriteVFSgnjV", [SiFive7VA], mx, IsWorstCase>; defm "" : LMULWriteResMX<"WriteVFSgnjF", [SiFive7VA], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVFMinMaxV", [SiFive7VA], mx, IsWorstCase>; + defm "" : LMULWriteResMX<"WriteVFMinMaxF", [SiFive7VA], mx, IsWorstCase>; defm "" : LMULWriteResMX<"WriteVFClassV", [SiFive7VA], mx, IsWorstCase>; defm "" : LMULWriteResMX<"WriteVFMergeV", [SiFive7VA], mx, IsWorstCase>; defm "" : LMULWriteResMX<"WriteVFMovV", [SiFive7VA], mx, IsWorstCase>; @@ -856,6 +860,8 @@ defm : LMULReadAdvanceW<"ReadVNShiftX", 0>; defm : LMULReadAdvance<"ReadVICmpV", 0>; defm : LMULReadAdvance<"ReadVICmpX", 0>; +defm : LMULReadAdvance<"ReadVIMinMaxV", 0>; +defm : LMULReadAdvance<"ReadVIMinMaxX", 0>; defm : LMULReadAdvance<"ReadVIMulV", 0>; defm : LMULReadAdvance<"ReadVIMulX", 0>; defm : LMULSEWReadAdvance<"ReadVIDivV", 0>; @@ -900,10 +906,12 @@ defm "" : LMULReadAdvanceFW<"ReadVFWMulAddF", 0>; defm "" : LMULSEWReadAdvanceF<"ReadVFSqrtV", 0>; defm "" : LMULReadAdvance<"ReadVFRecpV", 0>; -defm "" : LMULReadAdvance<"ReadVFCmpV", 0>; -defm "" : LMULReadAdvance<"ReadVFCmpF", 0>; +defm "" : LMULReadAdvance<"ReadVFMinMaxV", 0>; +defm "" : LMULReadAdvance<"ReadVFMinMaxF", 0>; defm "" : LMULReadAdvance<"ReadVFSgnjV", 0>; defm "" : LMULReadAdvance<"ReadVFSgnjF", 0>; +defm "" : LMULReadAdvance<"ReadVFCmpV", 0>; +defm "" : LMULReadAdvance<"ReadVFCmpF", 0>; defm "" : LMULReadAdvance<"ReadVFClassV", 0>; defm "" : LMULReadAdvance<"ReadVFMergeV", 0>; defm "" : LMULReadAdvance<"ReadVFMergeF", 0>; 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 @@ -294,10 +294,12 @@ defm "" : LMULSchedWritesW<"WriteVNShiftX">; defm "" : LMULSchedWritesW<"WriteVNShiftI">; // 11.8. Vector Integer Comparison Instructions -// 11.9. Vector Integer Min/Max Instructions defm "" : LMULSchedWrites<"WriteVICmpV">; defm "" : LMULSchedWrites<"WriteVICmpX">; defm "" : LMULSchedWrites<"WriteVICmpI">; +// 11.9. Vector Integer Min/Max Instructions +defm "" : LMULSchedWrites<"WriteVIMinMaxV">; +defm "" : LMULSchedWrites<"WriteVIMinMaxX">; // 11.10. Vector Single-Width Integer Multiply Instructions defm "" : LMULSchedWrites<"WriteVIMulV">; defm "" : LMULSchedWrites<"WriteVIMulX">; @@ -369,12 +371,14 @@ // 13.10. Vector Floating-Point Reciprocal Estimate Instruction defm "" : LMULSchedWrites<"WriteVFRecpV">; // 13.11. Vector Floating-Point MIN/MAX Instructions -// 13.13. Vector Floating-Point Compare Instructions -defm "" : LMULSchedWrites<"WriteVFCmpV">; -defm "" : LMULSchedWrites<"WriteVFCmpF">; +defm "" : LMULSchedWrites<"WriteVFMinMaxV">; +defm "" : LMULSchedWrites<"WriteVFMinMaxF">; // 13.12. Vector Floating-Point Sign-Injection Instructions defm "" : LMULSchedWrites<"WriteVFSgnjV">; defm "" : LMULSchedWrites<"WriteVFSgnjF">; +// 13.13. Vector Floating-Point Compare Instructions +defm "" : LMULSchedWrites<"WriteVFCmpV">; +defm "" : LMULSchedWrites<"WriteVFCmpF">; // 13.14. Vector Floating-Point Classify Instruction defm "" : LMULSchedWrites<"WriteVFClassV">; // 13.15. Vector Floating-Point Merge Instruction @@ -519,9 +523,11 @@ defm "" : LMULSchedReadsW<"ReadVNShiftV">; defm "" : LMULSchedReadsW<"ReadVNShiftX">; // 11.8. Vector Integer Comparison Instructions -// 11.9. Vector Integer Min/Max Instructions defm "" : LMULSchedReads<"ReadVICmpV">; defm "" : LMULSchedReads<"ReadVICmpX">; +// 11.9. Vector Integer Min/Max Instructions +defm "" : LMULSchedReads<"ReadVIMinMaxV">; +defm "" : LMULSchedReads<"ReadVIMinMaxX">; // 11.10. Vector Single-Width Integer Multiply Instructions defm "" : LMULSchedReads<"ReadVIMulV">; defm "" : LMULSchedReads<"ReadVIMulX">; @@ -588,12 +594,14 @@ // 13.10. Vector Floating-Point Reciprocal Estimate Instruction defm "" : LMULSchedReads<"ReadVFRecpV">; // 13.11. Vector Floating-Point MIN/MAX Instructions -// 13.13. Vector Floating-Point Compare Instructions -defm "" : LMULSchedReads<"ReadVFCmpV">; -defm "" : LMULSchedReads<"ReadVFCmpF">; +defm "" : LMULSchedReads<"ReadVFMinMaxV">; +defm "" : LMULSchedReads<"ReadVFMinMaxF">; // 13.12. Vector Floating-Point Sign-Injection Instructions defm "" : LMULSchedReads<"ReadVFSgnjV">; defm "" : LMULSchedReads<"ReadVFSgnjF">; +// 13.13. Vector Floating-Point Compare Instructions +defm "" : LMULSchedReads<"ReadVFCmpV">; +defm "" : LMULSchedReads<"ReadVFCmpF">; // 13.14. Vector Floating-Point Classify Instruction defm "" : LMULSchedReads<"ReadVFClassV">; // 13.15. Vector Floating-Point Merge Instruction @@ -765,6 +773,8 @@ defm "" : LMULWriteRes<"WriteVICmpV", []>; defm "" : LMULWriteRes<"WriteVICmpX", []>; defm "" : LMULWriteRes<"WriteVICmpI", []>; +defm "" : LMULWriteRes<"WriteVIMinMaxV", []>; +defm "" : LMULWriteRes<"WriteVIMinMaxX", []>; defm "" : LMULWriteRes<"WriteVIMulV", []>; defm "" : LMULWriteRes<"WriteVIMulX", []>; defm "" : LMULSEWWriteRes<"WriteVIDivV", []>; @@ -814,10 +824,12 @@ defm "" : LMULWriteResFW<"WriteVFWMulAddF", []>; defm "" : LMULSEWWriteResF<"WriteVFSqrtV", []>; defm "" : LMULWriteRes<"WriteVFRecpV", []>; -defm "" : LMULWriteRes<"WriteVFCmpV", []>; -defm "" : LMULWriteRes<"WriteVFCmpF", []>; +defm "" : LMULWriteRes<"WriteVFMinMaxV", []>; +defm "" : LMULWriteRes<"WriteVFMinMaxF", []>; defm "" : LMULWriteRes<"WriteVFSgnjV", []>; defm "" : LMULWriteRes<"WriteVFSgnjF", []>; +defm "" : LMULWriteRes<"WriteVFCmpV", []>; +defm "" : LMULWriteRes<"WriteVFCmpF", []>; defm "" : LMULWriteRes<"WriteVFClassV", []>; defm "" : LMULWriteRes<"WriteVFMergeV", []>; defm "" : LMULWriteRes<"WriteVFMovV", []>; @@ -920,6 +932,8 @@ defm "" : LMULReadAdvanceW<"ReadVNShiftX", 0>; defm "" : LMULReadAdvance<"ReadVICmpV", 0>; defm "" : LMULReadAdvance<"ReadVICmpX", 0>; +defm "" : LMULReadAdvance<"ReadVIMinMaxV", 0>; +defm "" : LMULReadAdvance<"ReadVIMinMaxX", 0>; defm "" : LMULReadAdvance<"ReadVIMulV", 0>; defm "" : LMULReadAdvance<"ReadVIMulX", 0>; defm "" : LMULSEWReadAdvance<"ReadVIDivV", 0>; @@ -964,10 +978,12 @@ defm "" : LMULReadAdvanceFW<"ReadVFWMulAddF", 0>; defm "" : LMULSEWReadAdvanceF<"ReadVFSqrtV", 0>; defm "" : LMULReadAdvance<"ReadVFRecpV", 0>; -defm "" : LMULReadAdvance<"ReadVFCmpV", 0>; -defm "" : LMULReadAdvance<"ReadVFCmpF", 0>; +defm "" : LMULReadAdvance<"ReadVFMinMaxV", 0>; +defm "" : LMULReadAdvance<"ReadVFMinMaxF", 0>; defm "" : LMULReadAdvance<"ReadVFSgnjV", 0>; defm "" : LMULReadAdvance<"ReadVFSgnjF", 0>; +defm "" : LMULReadAdvance<"ReadVFCmpV", 0>; +defm "" : LMULReadAdvance<"ReadVFCmpF", 0>; defm "" : LMULReadAdvance<"ReadVFClassV", 0>; defm "" : LMULReadAdvance<"ReadVFMergeV", 0>; defm "" : LMULReadAdvance<"ReadVFMergeF", 0>;