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 @@ -26,6 +26,32 @@ !eq(mx, "MF8"): [8]); } +// Index values by LMUL. +class IndexByLMUL<list<int> cycles, string mx> { + int value = !cond(!eq(mx, "M1") : cycles[0], + !eq(mx, "M2") : cycles[1], + !eq(mx, "M4") : cycles[2], + !eq(mx, "M8") : cycles[3], + !eq(mx, "MF2") : cycles[4], + !eq(mx, "MF4") : cycles[5], + !eq(mx, "MF8") : cycles[6], + !eq(mx, "WorstCase") : cycles[7],); +} + +class ResourceCycle { + list<int> Cycles; +} +// ResourceCycle whose cycles are fixed. +class FixedResourceCycle<int cycles> : ResourceCycle { + let Cycles = !listsplat(cycles, !add(!size(SchedMxList), 1)); +} + +// Helper class for generating a list of resource cycles of different LMULs. +class ResourceCycles<list<ResourceCycle> resourceCycles, string mx> { + list<int> value = !foreach(resourceCycle, resourceCycles, + IndexByLMUL<resourceCycle.Cycles, mx>.value); +} + // 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 @@ -42,12 +68,19 @@ def name # "_" # mx : SchedRead; } } -multiclass LMULWriteResImpl<string name, list<ProcResourceKind> resources> { +multiclass LMULWriteResImpl<string name, list<ProcResourceKind> resources, + ResourceCycle latency, list<ResourceCycle> resourceCycles> { if !exists<SchedWrite>(name # "_WorstCase") then - def : WriteRes<!cast<SchedWrite>(name # "_WorstCase"), resources>; + def : WriteRes<!cast<SchedWrite>(name # "_WorstCase"), resources> { + let Latency = IndexByLMUL<latency.Cycles, "WorstCase">.value; + let ResourceCycles = ResourceCycles<resourceCycles, "WorstCase">.value; + } foreach mx = SchedMxList in { if !exists<SchedWrite>(name # "_" # mx) then - def : WriteRes<!cast<SchedWrite>(name # "_" # mx), resources>; + def : WriteRes<!cast<SchedWrite>(name # "_" # mx), resources> { + let Latency = IndexByLMUL<latency.Cycles, mx>.value; + let ResourceCycles = ResourceCycles<resourceCycles, mx>.value; + } } } multiclass LMULReadAdvanceImpl<string name, int val, @@ -111,8 +144,10 @@ multiclass LMULSchedWrites<string name> : LMULSchedWritesImpl<name, SchedMxList>; multiclass LMULSchedReads<string name> : LMULSchedReadsImpl<name, SchedMxList>; -multiclass LMULWriteRes<string name, list<ProcResourceKind> resources> - : LMULWriteResImpl<name, resources>; +multiclass LMULWriteRes<string name, list<ProcResourceKind> resources, + ResourceCycle latency = FixedResourceCycle<1>, + list<ResourceCycle> resourceCycles = []> + : LMULWriteResImpl<name, resources, latency, resourceCycles>; multiclass LMULReadAdvance<string name, int val, list<SchedWrite> writes = []> : LMULReadAdvanceImpl<name, val, writes>; class LMULSchedWriteList<list<string> names> : LMULSchedWriteListImpl<names, SchedMxList>; @@ -126,23 +161,29 @@ multiclass LMULSchedWritesW<string name> : LMULSchedWritesImpl<name, SchedMxListW>; multiclass LMULSchedReadsW<string name> : LMULSchedReadsImpl<name, SchedMxListW>; -multiclass LMULWriteResW<string name, list<ProcResourceKind> resources> - : LMULWriteResImpl<name, resources>; +multiclass LMULWriteResW<string name, list<ProcResourceKind> resources, + ResourceCycle latency = FixedResourceCycle<1>, + list<ResourceCycle> resourceCycles = []> + : LMULWriteResImpl<name, resources, latency, resourceCycles>; multiclass LMULReadAdvanceW<string name, int val, list<SchedWrite> writes = []> : LMULReadAdvanceImpl<name, val, writes>; class LMULSchedWriteListW<list<string> names> : LMULSchedWriteListImpl<names, SchedMxListW>; multiclass LMULSchedWritesFW<string name> : LMULSchedWritesImpl<name, SchedMxListFW>; multiclass LMULSchedReadsFW<string name> : LMULSchedReadsImpl<name, SchedMxListFW>; -multiclass LMULWriteResFW<string name, list<ProcResourceKind> resources> - : LMULWriteResImpl<name, resources>; +multiclass LMULWriteResFW<string name, list<ProcResourceKind> resources, + ResourceCycle latency = FixedResourceCycle<1>, + list<ResourceCycle> resourceCycles = []> + : LMULWriteResImpl<name, resources, latency, resourceCycles>; multiclass LMULReadAdvanceFW<string name, int val, list<SchedWrite> writes = []> : LMULReadAdvanceImpl<name, val, writes>; class LMULSchedWriteListFW<list<string> names> : LMULSchedWriteListImpl<names, SchedMxListFW>; multiclass LMULSchedWritesFWRed<string name> : LMULSchedWritesImpl<name, SchedMxListFWRed>; -multiclass LMULWriteResFWRed<string name, list<ProcResourceKind> resources> - : LMULWriteResImpl<name, resources>; +multiclass LMULWriteResFWRed<string name, list<ProcResourceKind> resources, + ResourceCycle latency = FixedResourceCycle<1>, + list<ResourceCycle> resourceCycles = []> + : LMULWriteResImpl<name, resources, latency, resourceCycles>; class LMULSchedWriteListFWRed<list<string> names> : LMULSchedWriteListImpl<names, SchedMxListFWRed>;