Expand Up
@@ -17,10 +17,19 @@ defvar SchedMxListFW = !listremove(SchedMxList, ["M8", "MF8"]);
// Used for widening floating-point Reduction as it doesn't contain MF8.
defvar SchedMxListFWRed = !listremove(SchedMxList, ["MF8"]);
class SchedSEWSet<string mx> {
list<int> val = !cond(!eq(mx, "M1"): [8, 16, 32, 64],
!eq(mx, "M2"): [8, 16, 32, 64],
!eq(mx, "M4"): [8, 16, 32, 64],
!eq(mx, "M8"): [8, 16, 32, 64],
!eq(mx, "MF2"): [8, 16, 32],
!eq(mx, "MF4"): [8, 16],
!eq(mx, "MF8"): [8]);
}
// Define multiclasses to define SchedWrite, SchedRead, WriteRes, and
// ReadAdvance for each (name, LMUL) pair for each LMUL in each of the
// SchedMxList variants above.
multiclass LMULSchedWritesImpl<string name, list<string> MxList> {
foreach mx = MxList in {
def name # "_" # mx : SchedWrite;
Expand All
@@ -45,6 +54,46 @@ multiclass LMULReadAdvanceImpl<string name, int val,
}
}
// Define multiclasses to define SchedWrite, SchedRead, WriteRes, and
// ReadAdvance for each (name, LMUL, SEW) tuple for each LMUL in each of the
// SchedMxList variants above.
multiclass LMULSEWSchedWritesImpl<string name, list<string> MxList> {
foreach mx = MxList in {
if !eq(mx, "UpperBound") then
def name # "_" # mx : SchedWrite;
else
foreach sew = SchedSEWSet<mx>.val in
def name # "_" # mx # "_E" # sew : SchedWrite;
}
}
multiclass LMULSEWSchedReadsImpl<string name, list<string> MxList> {
foreach mx = MxList in {
if !eq(mx, "UpperBound") then
def name # "_" # mx : SchedRead;
else
foreach sew = SchedSEWSet<mx>.val in
def name # "_" # mx # "_E" # sew : SchedRead;
}
}
multiclass LMULSEWWriteResImpl<string name, list<ProcResourceKind> resources> {
foreach mx = SchedMxList in {
if !eq(mx, "UpperBound") then
def : WriteRes<!cast<SchedWrite>(name # "_" # mx), resources>;
else
foreach sew = SchedSEWSet<mx>.val in
def : WriteRes<!cast<SchedWrite>(name # "_" # mx # "_E" # sew), resources>;
}
}
multiclass LMULSEWReadAdvanceImpl<string name, int val,
list<SchedWrite> writes = []> {
foreach mx = SchedMxList in {
if !eq(mx, "UpperBound") then
def : ReadAdvance<!cast<SchedRead>(name # "_" # mx), val, writes>;
else
foreach sew = SchedSEWSet<mx>.val in
def : ReadAdvance<!cast<SchedRead>(name # "_" # mx # "_E" # sew), val, writes>;
}
}
// Define classes to define list containing all SchedWrites for each (name, LMUL)
// pair for each LMUL in each of the SchedMxList variants above and name in
// argument `names`. These classes can be used to construct a list of existing
Expand All
@@ -69,6 +118,13 @@ multiclass LMULReadAdvance<string name, int val, list<SchedWrite> writes = []>
: LMULReadAdvanceImpl<name, val, writes>;
class LMULSchedWriteList<list<string> names> : LMULSchedWriteListImpl<names, SchedMxList>;
multiclass LMULSEWSchedWrites<string name> : LMULSEWSchedWritesImpl<name, SchedMxList>;
multiclass LMULSEWSchedReads<string name> : LMULSEWSchedReadsImpl<name, SchedMxList>;
multiclass LMULSEWWriteRes<string name, list<ProcResourceKind> resources>
: LMULSEWWriteResImpl<name, resources>;
multiclass LMULSEWReadAdvance<string name, int val, list<SchedWrite> writes = []>
: LMULSEWReadAdvanceImpl<name, val, writes>;
multiclass LMULSchedWritesW<string name> : LMULSchedWritesImpl<name, SchedMxListW>;
multiclass LMULSchedReadsW<string name> : LMULSchedReadsImpl<name, SchedMxListW>;
multiclass LMULWriteResW<string name, list<ProcResourceKind> resources>
Expand Down
Expand Up
@@ -191,8 +247,8 @@ defm "" : LMULSchedWrites<"WriteVICmpI">;
defm "" : LMULSchedWrites<"WriteVIMulV">;
defm "" : LMULSchedWrites<"WriteVIMulX">;
// 11.11. Vector Integer Divide Instructions
defm "" : LMULSchedWrites <"WriteVIDivV">;
defm "" : LMULSchedWrites <"WriteVIDivX">;
defm "" : LMULSEWSchedWrites <"WriteVIDivV">;
defm "" : LMULSEWSchedWrites <"WriteVIDivX">;
// 11.12. Vector Widening Integer Multiply Instructions
defm "" : LMULSchedWritesW<"WriteVIWMulV">;
defm "" : LMULSchedWritesW<"WriteVIWMulX">;
Expand Down
Expand Up
@@ -241,8 +297,8 @@ defm "" : LMULSchedWritesFW<"WriteVFWALUF">;
// 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
defm "" : LMULSchedWrites<"WriteVFMulV">;
defm "" : LMULSchedWrites<"WriteVFMulF">;
defm "" : LMULSchedWrites <"WriteVFDivV">;
defm "" : LMULSchedWrites <"WriteVFDivF">;
defm "" : LMULSEWSchedWrites <"WriteVFDivV">;
defm "" : LMULSEWSchedWrites <"WriteVFDivF">;
// 13.5. Vector Widening Floating-Point Multiply
defm "" : LMULSchedWritesFW<"WriteVFWMulV">;
defm "" : LMULSchedWritesFW<"WriteVFWMulF">;
Expand All
@@ -253,7 +309,7 @@ defm "" : LMULSchedWrites<"WriteVFMulAddF">;
defm "" : LMULSchedWritesFW<"WriteVFWMulAddV">;
defm "" : LMULSchedWritesFW<"WriteVFWMulAddF">;
// 13.8. Vector Floating-Point Square-Root Instruction
defm "" : LMULSchedWrites <"WriteVFSqrtV">;
defm "" : LMULSEWSchedWrites <"WriteVFSqrtV">;
// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction
// 13.10. Vector Floating-Point Reciprocal Estimate Instruction
defm "" : LMULSchedWrites<"WriteVFRecpV">;
Expand Down
Expand Up
@@ -327,11 +383,11 @@ defm "" : LMULSchedWrites<"WriteVISlideI">;
defm "" : LMULSchedWrites<"WriteVISlide1X">;
defm "" : LMULSchedWrites<"WriteVFSlide1F">;
// 16.4. Vector Register Gather Instructions
defm "" : LMULSchedWrites<"WriteVGatherV ">;
defm "" : LMULSchedWrites<"WriteVGatherX ">;
defm "" : LMULSchedWrites<"WriteVGatherI ">;
defm "" : LMULSEWSchedWrites<"WriteVRGatherVV ">;
defm "" : LMULSchedWrites<"WriteVRGatherVX ">;
defm "" : LMULSchedWrites<"WriteVRGatherVI ">;
// 16.5. Vector Compress Instruction
defm "" : LMULSchedWrites <"WriteVCompressV">;
defm "" : LMULSEWSchedWrites <"WriteVCompressV">;
// 16.6. Whole Vector Register Move
// These are already LMUL aware
def WriteVMov1V : SchedWrite;
Expand Down
Expand Up
@@ -415,8 +471,8 @@ defm "" : LMULSchedReads<"ReadVICmpX">;
defm "" : LMULSchedReads<"ReadVIMulV">;
defm "" : LMULSchedReads<"ReadVIMulX">;
// 11.11. Vector Integer Divide Instructions
defm "" : LMULSchedReads <"ReadVIDivV">;
defm "" : LMULSchedReads <"ReadVIDivX">;
defm "" : LMULSEWSchedReads <"ReadVIDivV">;
defm "" : LMULSEWSchedReads <"ReadVIDivX">;
// 11.12. Vector Widening Integer Multiply Instructions
defm "" : LMULSchedReadsW<"ReadVIWMulV">;
defm "" : LMULSchedReadsW<"ReadVIWMulX">;
Expand Down
Expand Up
@@ -460,8 +516,8 @@ defm "" : LMULSchedReadsFW<"ReadVFWALUF">;
// 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
defm "" : LMULSchedReads<"ReadVFMulV">;
defm "" : LMULSchedReads<"ReadVFMulF">;
defm "" : LMULSchedReads <"ReadVFDivV">;
defm "" : LMULSchedReads <"ReadVFDivF">;
defm "" : LMULSEWSchedReads <"ReadVFDivV">;
defm "" : LMULSEWSchedReads <"ReadVFDivF">;
// 13.5. Vector Widening Floating-Point Multiply
defm "" : LMULSchedReadsFW<"ReadVFWMulV">;
defm "" : LMULSchedReadsFW<"ReadVFWMulF">;
Expand All
@@ -472,7 +528,7 @@ defm "" : LMULSchedReads<"ReadVFMulAddF">;
defm "" : LMULSchedReadsFW<"ReadVFWMulAddV">;
defm "" : LMULSchedReadsFW<"ReadVFWMulAddF">;
// 13.8. Vector Floating-Point Square-Root Instruction
defm "" : LMULSchedReads <"ReadVFSqrtV">;
defm "" : LMULSEWSchedReads <"ReadVFSqrtV">;
// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction
// 13.10. Vector Floating-Point Reciprocal Estimate Instruction
defm "" : LMULSchedReads<"ReadVFRecpV">;
Expand Down
Expand Up
@@ -549,10 +605,13 @@ defm "" : LMULSchedReads<"ReadVISlideX">;
defm "" : LMULSchedReads<"ReadVFSlideV">;
defm "" : LMULSchedReads<"ReadVFSlideF">;
// 16.4. Vector Register Gather Instructions
defm "" : LMULSchedReads<"ReadVGatherV">;
defm "" : LMULSchedReads<"ReadVGatherX">;
defm "" : LMULSEWSchedReads<"ReadVRGatherVV_data">;
defm "" : LMULSEWSchedReads<"ReadVRGatherVV_index">;
defm "" : LMULSchedReads<"ReadVRGatherVX_data">;
defm "" : LMULSchedReads<"ReadVRGatherVX_index">;
defm "" : LMULSchedReads<"ReadVRGatherVI_data">;
// 16.5. Vector Compress Instruction
defm "" : LMULSchedReads <"ReadVCompressV">;
defm "" : LMULSEWSchedReads <"ReadVCompressV">;
// 16.6. Whole Vector Register Move
// These are already LMUL aware
def ReadVMov1V : SchedRead;
Expand Down
Expand Up
@@ -653,8 +712,8 @@ defm "" : LMULWriteRes<"WriteVICmpX", []>;
defm "" : LMULWriteRes<"WriteVICmpI", []>;
defm "" : LMULWriteRes<"WriteVIMulV", []>;
defm "" : LMULWriteRes<"WriteVIMulX", []>;
defm "" : LMULWriteRes <"WriteVIDivV", []>;
defm "" : LMULWriteRes <"WriteVIDivX", []>;
defm "" : LMULSEWWriteRes <"WriteVIDivV", []>;
defm "" : LMULSEWWriteRes <"WriteVIDivX", []>;
defm "" : LMULWriteResW<"WriteVIWMulV", []>;
defm "" : LMULWriteResW<"WriteVIWMulX", []>;
defm "" : LMULWriteRes<"WriteVIMulAddV", []>;
Expand Down
Expand Up
@@ -690,15 +749,15 @@ defm "" : LMULWriteResFW<"WriteVFWALUV", []>;
defm "" : LMULWriteResFW<"WriteVFWALUF", []>;
defm "" : LMULWriteRes<"WriteVFMulV", []>;
defm "" : LMULWriteRes<"WriteVFMulF", []>;
defm "" : LMULWriteRes <"WriteVFDivV", []>;
defm "" : LMULWriteRes <"WriteVFDivF", []>;
defm "" : LMULSEWWriteRes <"WriteVFDivV", []>;
defm "" : LMULSEWWriteRes <"WriteVFDivF", []>;
defm "" : LMULWriteResFW<"WriteVFWMulV", []>;
defm "" : LMULWriteResFW<"WriteVFWMulF", []>;
defm "" : LMULWriteRes<"WriteVFMulAddV", []>;
defm "" : LMULWriteRes<"WriteVFMulAddF", []>;
defm "" : LMULWriteResFW<"WriteVFWMulAddV", []>;
defm "" : LMULWriteResFW<"WriteVFWMulAddF", []>;
defm "" : LMULWriteRes <"WriteVFSqrtV", []>;
defm "" : LMULSEWWriteRes <"WriteVFSqrtV", []>;
defm "" : LMULWriteRes<"WriteVFRecpV", []>;
defm "" : LMULWriteRes<"WriteVFCmpV", []>;
defm "" : LMULWriteRes<"WriteVFCmpF", []>;
Expand Down
Expand Up
@@ -741,10 +800,10 @@ defm "" : LMULWriteRes<"WriteVISlideX", []>;
defm "" : LMULWriteRes<"WriteVISlideI", []>;
defm "" : LMULWriteRes<"WriteVISlide1X", []>;
defm "" : LMULWriteRes<"WriteVFSlide1F", []>;
defm "" : LMULWriteRes<"WriteVGatherV ", []>;
defm "" : LMULWriteRes<"WriteVGatherX ", []>;
defm "" : LMULWriteRes<"WriteVGatherI ", []>;
defm "" : LMULWriteRes <"WriteVCompressV", []>;
defm "" : LMULSEWWriteRes<"WriteVRGatherVV ", []>;
defm "" : LMULWriteRes<"WriteVRGatherVX ", []>;
defm "" : LMULWriteRes<"WriteVRGatherVI ", []>;
defm "" : LMULSEWWriteRes <"WriteVCompressV", []>;
// These are already LMUL aware
def : WriteRes<WriteVMov1V, []>;
def : WriteRes<WriteVMov2V, []>;
Expand Down
Expand Up
@@ -808,8 +867,8 @@ defm "" : LMULReadAdvance<"ReadVICmpV", 0>;
defm "" : LMULReadAdvance<"ReadVICmpX", 0>;
defm "" : LMULReadAdvance<"ReadVIMulV", 0>;
defm "" : LMULReadAdvance<"ReadVIMulX", 0>;
defm "" : LMULReadAdvance <"ReadVIDivV", 0>;
defm "" : LMULReadAdvance <"ReadVIDivX", 0>;
defm "" : LMULSEWReadAdvance <"ReadVIDivV", 0>;
defm "" : LMULSEWReadAdvance <"ReadVIDivX", 0>;
defm "" : LMULReadAdvanceW<"ReadVIWMulV", 0>;
defm "" : LMULReadAdvanceW<"ReadVIWMulX", 0>;
defm "" : LMULReadAdvance<"ReadVIMulAddV", 0>;
Expand Down
Expand Up
@@ -840,15 +899,15 @@ defm "" : LMULReadAdvanceFW<"ReadVFWALUV", 0>;
defm "" : LMULReadAdvanceFW<"ReadVFWALUF", 0>;
defm "" : LMULReadAdvance<"ReadVFMulV", 0>;
defm "" : LMULReadAdvance<"ReadVFMulF", 0>;
defm "" : LMULReadAdvance <"ReadVFDivV", 0>;
defm "" : LMULReadAdvance <"ReadVFDivF", 0>;
defm "" : LMULSEWReadAdvance <"ReadVFDivV", 0>;
defm "" : LMULSEWReadAdvance <"ReadVFDivF", 0>;
defm "" : LMULReadAdvanceFW<"ReadVFWMulV", 0>;
defm "" : LMULReadAdvanceFW<"ReadVFWMulF", 0>;
defm "" : LMULReadAdvance<"ReadVFMulAddV", 0>;
defm "" : LMULReadAdvance<"ReadVFMulAddF", 0>;
defm "" : LMULReadAdvanceFW<"ReadVFWMulAddV", 0>;
defm "" : LMULReadAdvanceFW<"ReadVFWMulAddF", 0>;
defm "" : LMULReadAdvance <"ReadVFSqrtV", 0>;
defm "" : LMULSEWReadAdvance <"ReadVFSqrtV", 0>;
defm "" : LMULReadAdvance<"ReadVFRecpV", 0>;
defm "" : LMULReadAdvance<"ReadVFCmpV", 0>;
defm "" : LMULReadAdvance<"ReadVFCmpF", 0>;
Expand Down
Expand Up
@@ -899,9 +958,13 @@ defm "" : LMULReadAdvance<"ReadVISlideV", 0>;
defm "" : LMULReadAdvance<"ReadVISlideX", 0>;
defm "" : LMULReadAdvance<"ReadVFSlideV", 0>;
defm "" : LMULReadAdvance<"ReadVFSlideF", 0>;
defm "" : LMULSEWReadAdvance<"ReadVRGatherVV_data", 0>;
defm "" : LMULSEWReadAdvance<"ReadVRGatherVV_index", 0>;
defm "" : LMULReadAdvance<"ReadVRGatherVX_data", 0>;
defm "" : LMULReadAdvance<"ReadVRGatherVX_index", 0>;
defm "" : LMULReadAdvance<"ReadVRGatherVI_data", 0>;
defm "" : LMULReadAdvance<"ReadVGatherV", 0>;
defm "" : LMULReadAdvance<"ReadVGatherX", 0>;
defm "" : LMULReadAdvance<"ReadVCompressV", 0>;
defm "" : LMULSEWReadAdvance<"ReadVCompressV", 0>;
// These are already LMUL aware
def : ReadAdvance<ReadVMov1V, 0>;
def : ReadAdvance<ReadVMov2V, 0>;
Expand Down