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 @@ -38,6 +38,13 @@ !eq(mx, "MF4"): [16]); } +// Create functions that return fixed cycles. +function fixed(int cycles): function { + return function(string lmul, int sew = 0): int { + return cycles; + }; +} + // Define multiclasses to define SchedWrite, SchedRead, WriteRes, and // ReadAdvance for each (name, LMUL) pair and for each LMUL in each of the // SchedMxList variants above. Each multiclass is responsible for defining @@ -54,12 +61,20 @@ def name # "_" # mx : SchedRead; } } -multiclass LMULWriteResImpl resources> { +multiclass LMULWriteResImpl resources, + function latency, + list> resourceCycles> { if !exists(name # "_WorstCase") then - def : WriteRes(name # "_WorstCase"), resources>; + def : WriteRes(name # "_WorstCase"), resources> { + let Latency = latency("WorstCase"); + let ResourceCycles = !foreach(resourceCycle, resourceCycles, resourceCycle("WorstCase")); + } foreach mx = SchedMxList in { if !exists(name # "_" # mx) then - def : WriteRes(name # "_" # mx), resources>; + def : WriteRes(name # "_" # mx), resources> { + let Latency = latency(mx); + let ResourceCycles = !foreach(resourceCycle, resourceCycles, resourceCycle(mx)); + } } } multiclass LMULReadAdvanceImpl resources, + function latency, + list> resourceCycles, bit isF = 0> { - def : WriteRes(name # "_WorstCase"), resources>; + def : WriteRes(name # "_WorstCase"), resources> { + let Latency = latency("WorstCase"); + let ResourceCycles = !foreach(resourceCycle, resourceCycles, resourceCycle("WorstCase")); + } foreach mx = !if(isF, SchedMxListF, SchedMxList) in { foreach sew = !if(isF, SchedSEWSetF.val, SchedSEWSet.val) in - def : WriteRes(name # "_" # mx # "_E" # sew), resources>; + def : WriteRes(name # "_" # mx # "_E" # sew), resources> { + let Latency = latency(mx, sew); + let ResourceCycles = !foreach(resourceCycle, resourceCycles, resourceCycle(mx, sew)); + } } } multiclass LMULSEWReadAdvanceImpl writes = [], @@ -124,45 +147,57 @@ multiclass LMULSchedWrites : LMULSchedWritesImpl; multiclass LMULSchedReads : LMULSchedReadsImpl; -multiclass LMULWriteRes resources> - : LMULWriteResImpl; +multiclass LMULWriteRes resources, + function latency = fixed(1), + list> resourceCycles = []> + : LMULWriteResImpl; multiclass LMULReadAdvance writes = []> : LMULReadAdvanceImpl; class LMULSchedWriteList names> : LMULSchedWriteListImpl; multiclass LMULSEWSchedWrites : LMULSEWSchedWritesImpl; multiclass LMULSEWSchedReads : LMULSEWSchedReadsImpl; -multiclass LMULSEWWriteRes resources> - : LMULSEWWriteResImpl; +multiclass LMULSEWWriteRes resources, + function latency = fixed(1), + list> resourceCycles = []> + : LMULSEWWriteResImpl; multiclass LMULSEWReadAdvance writes = []> : LMULSEWReadAdvanceImpl; multiclass LMULSEWSchedWritesF : LMULSEWSchedWritesImpl; multiclass LMULSEWSchedReadsF : LMULSEWSchedReadsImpl; -multiclass LMULSEWWriteResF resources> - : LMULSEWWriteResImpl; +multiclass LMULSEWWriteResF resources, + function latency = fixed(1), + list> resourceCycles = []> + : LMULSEWWriteResImpl; multiclass LMULSEWReadAdvanceF writes = []> : LMULSEWReadAdvanceImpl; multiclass LMULSchedWritesW : LMULSchedWritesImpl; multiclass LMULSchedReadsW : LMULSchedReadsImpl; -multiclass LMULWriteResW resources> - : LMULWriteResImpl; +multiclass LMULWriteResW resources, + function latency = fixed(1), + list> resourceCycles = []> + : LMULWriteResImpl; multiclass LMULReadAdvanceW writes = []> : LMULReadAdvanceImpl; class LMULSchedWriteListW names> : LMULSchedWriteListImpl; multiclass LMULSchedWritesFW : LMULSchedWritesImpl; multiclass LMULSchedReadsFW : LMULSchedReadsImpl; -multiclass LMULWriteResFW resources> - : LMULWriteResImpl; +multiclass LMULWriteResFW resources, + function latency = fixed(1), + list> resourceCycles = []> + : LMULWriteResImpl; multiclass LMULReadAdvanceFW writes = []> : LMULReadAdvanceImpl; class LMULSchedWriteListFW names> : LMULSchedWriteListImpl; multiclass LMULSchedWritesFWRed : LMULSchedWritesImpl; -multiclass LMULWriteResFWRed resources> - : LMULWriteResImpl; +multiclass LMULWriteResFWRed resources, + function latency = fixed(1), + list> resourceCycles = []> + : LMULWriteResImpl; class LMULSchedWriteListFWRed names> : LMULSchedWriteListImpl;