xref: /freebsd/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVScheduleV.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
106c3fb27SDimitry Andric//===- RISCVScheduleV.td - RISC-V Scheduling Definitions V -*- tablegen -*-===//
26e75b2fbSDimitry Andric//
36e75b2fbSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46e75b2fbSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
56e75b2fbSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66e75b2fbSDimitry Andric//
76e75b2fbSDimitry Andric//===----------------------------------------------------------------------===//
86e75b2fbSDimitry Andric
96e75b2fbSDimitry Andric//===----------------------------------------------------------------------===//
106e75b2fbSDimitry Andric/// Define scheduler resources associated with def operands.
116e75b2fbSDimitry Andric
1206c3fb27SDimitry Andricdefvar SchedMxList = ["MF8", "MF4", "MF2", "M1", "M2", "M4", "M8"];
13bdd1243dSDimitry Andric// Used for widening and narrowing instructions as it doesn't contain M8.
1406c3fb27SDimitry Andricdefvar SchedMxListW = !listremove(SchedMxList, ["M8"]);
1506c3fb27SDimitry Andric// Used for widening reductions, which does contain M8.
1606c3fb27SDimitry Andricdefvar SchedMxListWRed = SchedMxList;
1706c3fb27SDimitry Andricdefvar SchedMxListFW = !listremove(SchedMxList, ["M8", "MF8"]);
1806c3fb27SDimitry Andric// Used for floating-point as it doesn't contain MF8.
1906c3fb27SDimitry Andricdefvar SchedMxListF = !listremove(SchedMxList, ["MF8"]);
2006c3fb27SDimitry Andric// Used for widening floating-point Reduction as it doesn't contain MF8.
2106c3fb27SDimitry Andricdefvar SchedMxListFWRed = SchedMxListF;
22bdd1243dSDimitry Andric
2306c3fb27SDimitry Andricclass SchedSEWSet<string mx, bit isF = 0, bit isWidening = 0> {
2406c3fb27SDimitry Andric  assert !or(!not(isF), !ne(mx, "MF8")), "LMUL shouldn't be MF8 for floating-point";
2506c3fb27SDimitry Andric  defvar t = !cond(!eq(mx, "M1"):  [8, 16, 32, 64],
2606c3fb27SDimitry Andric                   !eq(mx, "M2"):  [8, 16, 32, 64],
2706c3fb27SDimitry Andric                   !eq(mx, "M4"):  [8, 16, 32, 64],
2806c3fb27SDimitry Andric                   !eq(mx, "M8"):  [8, 16, 32, 64],
2906c3fb27SDimitry Andric                   !eq(mx, "MF2"): [8, 16, 32],
3006c3fb27SDimitry Andric                   !eq(mx, "MF4"): [8, 16],
3106c3fb27SDimitry Andric                   !eq(mx, "MF8"): [8]);
3206c3fb27SDimitry Andric  // For floating-point instructions, SEW won't be 8.
3306c3fb27SDimitry Andric  defvar remove8 = !if(isF, !listremove(t, [8]), t);
3406c3fb27SDimitry Andric  // For widening instructions, SEW will not be 64.
3506c3fb27SDimitry Andric  defvar remove64 = !if(isWidening, !listremove(remove8, [64]), remove8);
3606c3fb27SDimitry Andric  list<int> val = remove64;
3706c3fb27SDimitry Andric}
3806c3fb27SDimitry Andric
3906c3fb27SDimitry Andric// Helper function to get the largest LMUL from MxList
4006c3fb27SDimitry Andric// Precondition: MxList is sorted in ascending LMUL order.
4106c3fb27SDimitry Andricclass LargestLMUL<list<string> MxList> {
4206c3fb27SDimitry Andric  // MX list is sorted from smallest to largest
4306c3fb27SDimitry Andric  string r = !foldl(!head(MxList), MxList, last, curr, curr);
4406c3fb27SDimitry Andric}
4506c3fb27SDimitry Andric// Helper function to get the smallest SEW that can be used with LMUL mx
4606c3fb27SDimitry Andric// Precondition: MxList is sorted in ascending LMUL order and SchedSEWSet<mx>
4706c3fb27SDimitry Andricclass SmallestSEW<string mx, bit isF = 0> {
4806c3fb27SDimitry Andric  int r = !head(SchedSEWSet<mx, isF>.val);
4906c3fb27SDimitry Andric}
5006c3fb27SDimitry Andric
5106c3fb27SDimitry Andric// Creates WriteRes for (name, mx, resources) tuple
5206c3fb27SDimitry Andricmulticlass LMULWriteResMX<string name, list<ProcResourceKind> resources,
5306c3fb27SDimitry Andric                          string mx, bit IsWorstCase> {
5406c3fb27SDimitry Andric  def : WriteRes<!cast<SchedWrite>(name # "_" # mx), resources>;
5506c3fb27SDimitry Andric  if IsWorstCase then
5606c3fb27SDimitry Andric    def : WriteRes<!cast<SchedWrite>(name # "_WorstCase"), resources>;
5706c3fb27SDimitry Andric}
5806c3fb27SDimitry Andricmulticlass LMULSEWWriteResMXSEW<string name, list<ProcResourceKind> resources,
5906c3fb27SDimitry Andric                             string mx, int sew,  bit IsWorstCase> {
6006c3fb27SDimitry Andric  def : WriteRes<!cast<SchedWrite>(name # "_" # mx # "_E" # sew), resources>;
6106c3fb27SDimitry Andric  if IsWorstCase then
6206c3fb27SDimitry Andric    def : WriteRes<!cast<SchedWrite>(name # "_WorstCase"), resources>;
6306c3fb27SDimitry Andric}
6406c3fb27SDimitry Andric
655f757f3fSDimitry Andric// Define a SchedAlias for the SchedWrite associated with (name, mx) whose
665f757f3fSDimitry Andric// behavior is aliased to a Variant. The Variant has Latency predLad and
675f757f3fSDimitry Andric// ReleaseAtCycles predCycles if the SchedPredicate Pred is true, otherwise has
685f757f3fSDimitry Andric// Latency noPredLat and ReleaseAtCycles noPredCycles. The WorstCase SchedWrite
695f757f3fSDimitry Andric// is created similiarly if IsWorstCase is true.
705f757f3fSDimitry Andricmulticlass LMULWriteResMXVariant<string name, SchedPredicateBase Pred,
715f757f3fSDimitry Andric                                 list<ProcResourceKind> resources,
725f757f3fSDimitry Andric                                 int predLat, list<int> predAcquireCycles,
735f757f3fSDimitry Andric                                 list<int> predReleaseCycles, int noPredLat,
745f757f3fSDimitry Andric                                 list<int> noPredAcquireCycles,
755f757f3fSDimitry Andric                                 list<int> noPredReleaseCycles,
765f757f3fSDimitry Andric                                 string mx, bit IsWorstCase> {
775f757f3fSDimitry Andric  defvar nameMX = name # "_" # mx;
785f757f3fSDimitry Andric
795f757f3fSDimitry Andric  // Define the different behaviors
805f757f3fSDimitry Andric  def nameMX # "_Pred" : SchedWriteRes<resources>{
815f757f3fSDimitry Andric    let Latency = predLat;
825f757f3fSDimitry Andric    let AcquireAtCycles = predAcquireCycles;
835f757f3fSDimitry Andric    let ReleaseAtCycles = predReleaseCycles;
845f757f3fSDimitry Andric  }
855f757f3fSDimitry Andric  def nameMX # "_NoPred" : SchedWriteRes<resources> {
865f757f3fSDimitry Andric    let Latency = noPredLat;
875f757f3fSDimitry Andric    let AcquireAtCycles = noPredAcquireCycles;
885f757f3fSDimitry Andric    let ReleaseAtCycles = noPredReleaseCycles;
895f757f3fSDimitry Andric  }
905f757f3fSDimitry Andric
91*0fca6ea1SDimitry Andric  // Define SchedVars
92*0fca6ea1SDimitry Andric  def nameMX # PredSchedVar
93*0fca6ea1SDimitry Andric      : SchedVar<Pred, [!cast<SchedWriteRes>(NAME # nameMX # "_Pred")]>;
94*0fca6ea1SDimitry Andric  def nameMX # NoPredSchedVar
95*0fca6ea1SDimitry Andric      : SchedVar<NoSchedPred, [!cast<SchedWriteRes>(NAME # nameMX #"_NoPred")]>;
96*0fca6ea1SDimitry Andric  // Allow multiclass to refer to SchedVars -- need to have NAME prefix.
97*0fca6ea1SDimitry Andric  defvar PredSchedVar = !cast<SchedVar>(NAME # nameMX # PredSchedVar);
98*0fca6ea1SDimitry Andric  defvar NoPredSchedVar = !cast<SchedVar>(NAME # nameMX # NoPredSchedVar);
99*0fca6ea1SDimitry Andric
1005f757f3fSDimitry Andric  // Tie behavior to predicate
101*0fca6ea1SDimitry Andric  def NAME # nameMX # "_Variant"
102*0fca6ea1SDimitry Andric      : SchedWriteVariant<[PredSchedVar, NoPredSchedVar]>;
1035f757f3fSDimitry Andric  def : SchedAlias<
1045f757f3fSDimitry Andric    !cast<SchedReadWrite>(nameMX),
1055f757f3fSDimitry Andric    !cast<SchedReadWrite>(NAME # nameMX # "_Variant")>;
1065f757f3fSDimitry Andric
1075f757f3fSDimitry Andric  if IsWorstCase then {
108*0fca6ea1SDimitry Andric    def NAME # name # "_WorstCase_Variant"
109*0fca6ea1SDimitry Andric      : SchedWriteVariant<[PredSchedVar, NoPredSchedVar]>;
1105f757f3fSDimitry Andric    def : SchedAlias<
1115f757f3fSDimitry Andric      !cast<SchedReadWrite>(name # "_WorstCase"),
1125f757f3fSDimitry Andric      !cast<SchedReadWrite>(NAME # name # "_WorstCase_Variant")>;
1135f757f3fSDimitry Andric  }
1145f757f3fSDimitry Andric}
1155f757f3fSDimitry Andric
11606c3fb27SDimitry Andric// Define multiclasses to define SchedWrite, SchedRead,  WriteRes, and
11706c3fb27SDimitry Andric// ReadAdvance for each (name, LMUL) pair and for each LMUL in each of the
11806c3fb27SDimitry Andric// SchedMxList variants above. Each multiclass is responsible for defining
11906c3fb27SDimitry Andric// a record that represents the WorseCase behavior for name.
12006c3fb27SDimitry Andricmulticlass LMULSchedWritesImpl<string name, list<string> MxList> {
12106c3fb27SDimitry Andric  def name # "_WorstCase" : SchedWrite;
12206c3fb27SDimitry Andric  foreach mx = MxList in {
123bdd1243dSDimitry Andric    def name # "_" # mx : SchedWrite;
124bdd1243dSDimitry Andric  }
125bdd1243dSDimitry Andric}
12606c3fb27SDimitry Andricmulticlass LMULSchedReadsImpl<string name, list<string> MxList> {
12706c3fb27SDimitry Andric  def name # "_WorstCase" : SchedRead;
12806c3fb27SDimitry Andric  foreach mx = MxList in {
129bdd1243dSDimitry Andric    def name # "_" # mx : SchedRead;
130bdd1243dSDimitry Andric  }
131bdd1243dSDimitry Andric}
13206c3fb27SDimitry Andricmulticlass LMULWriteResImpl<string name, list<ProcResourceKind> resources> {
13306c3fb27SDimitry Andric  if !exists<SchedWrite>(name # "_WorstCase") then
13406c3fb27SDimitry Andric    def : WriteRes<!cast<SchedWrite>(name # "_WorstCase"), resources>;
135bdd1243dSDimitry Andric  foreach mx = SchedMxList in {
13606c3fb27SDimitry Andric    if !exists<SchedWrite>(name # "_" # mx) then
137bdd1243dSDimitry Andric      def : WriteRes<!cast<SchedWrite>(name # "_" # mx), resources>;
138bdd1243dSDimitry Andric  }
139bdd1243dSDimitry Andric}
14006c3fb27SDimitry Andricmulticlass LMULReadAdvanceImpl<string name, int val,
14106c3fb27SDimitry Andric                               list<SchedWrite> writes = []> {
14206c3fb27SDimitry Andric  if !exists<SchedRead>(name # "_WorstCase") then
14306c3fb27SDimitry Andric    def : ReadAdvance<!cast<SchedRead>(name # "_WorstCase"), val, writes>;
144bdd1243dSDimitry Andric  foreach mx = SchedMxList in {
14506c3fb27SDimitry Andric    if !exists<SchedRead>(name # "_" # mx) then
146bdd1243dSDimitry Andric      def : ReadAdvance<!cast<SchedRead>(name # "_" # mx), val, writes>;
147bdd1243dSDimitry Andric  }
148bdd1243dSDimitry Andric}
149bdd1243dSDimitry Andric
15006c3fb27SDimitry Andric// Define multiclasses to define SchedWrite, SchedRead,  WriteRes, and
15106c3fb27SDimitry Andric// ReadAdvance for each (name, LMUL, SEW) tuple for each LMUL in each of the
15206c3fb27SDimitry Andric// SchedMxList variants above. Each multiclass is responsible for defining
15306c3fb27SDimitry Andric// a record that represents the WorseCase behavior for name.
15406c3fb27SDimitry Andricmulticlass LMULSEWSchedWritesImpl<string name, list<string> MxList, bit isF = 0,
15506c3fb27SDimitry Andric                                  bit isWidening = 0> {
15606c3fb27SDimitry Andric  def name # "_WorstCase" : SchedWrite;
15706c3fb27SDimitry Andric  foreach mx = MxList in {
15806c3fb27SDimitry Andric    foreach sew = SchedSEWSet<mx, isF, isWidening>.val in
15906c3fb27SDimitry Andric      def name # "_" # mx # "_E" # sew : SchedWrite;
160bdd1243dSDimitry Andric  }
161bdd1243dSDimitry Andric}
16206c3fb27SDimitry Andricmulticlass LMULSEWSchedReadsImpl<string name, list<string> MxList, bit isF = 0,
16306c3fb27SDimitry Andric                                 bit isWidening = 0> {
16406c3fb27SDimitry Andric  def name # "_WorstCase" : SchedRead;
16506c3fb27SDimitry Andric  foreach mx = MxList in {
16606c3fb27SDimitry Andric    foreach sew = SchedSEWSet<mx, isF, isWidening>.val in
16706c3fb27SDimitry Andric      def name # "_" # mx # "_E" # sew : SchedRead;
16806c3fb27SDimitry Andric  }
16906c3fb27SDimitry Andric}
17006c3fb27SDimitry Andricmulticlass LMULSEWWriteResImpl<string name, list<ProcResourceKind> resources,
17106c3fb27SDimitry Andric                               list<string> MxList, bit isF = 0,
17206c3fb27SDimitry Andric                               bit isWidening = 0> {
17306c3fb27SDimitry Andric  if !exists<SchedWrite>(name # "_WorstCase") then
17406c3fb27SDimitry Andric    def : WriteRes<!cast<SchedWrite>(name # "_WorstCase"), resources>;
17506c3fb27SDimitry Andric  foreach mx = MxList in {
17606c3fb27SDimitry Andric    foreach sew = SchedSEWSet<mx, isF, isWidening>.val in
17706c3fb27SDimitry Andric      if !exists<SchedWrite>(name # "_" # mx # "_E" # sew) then
17806c3fb27SDimitry Andric        def : WriteRes<!cast<SchedWrite>(name # "_" # mx # "_E" # sew), resources>;
17906c3fb27SDimitry Andric  }
18006c3fb27SDimitry Andric}
18106c3fb27SDimitry Andricmulticlass LMULSEWReadAdvanceImpl<string name, int val, list<SchedWrite> writes = [],
18206c3fb27SDimitry Andric                                  list<string> MxList, bit isF = 0,
18306c3fb27SDimitry Andric                                  bit isWidening = 0> {
18406c3fb27SDimitry Andric  if !exists<SchedRead>(name # "_WorstCase") then
18506c3fb27SDimitry Andric    def : ReadAdvance<!cast<SchedRead>(name # "_WorstCase"), val, writes>;
18606c3fb27SDimitry Andric  foreach mx = MxList in {
18706c3fb27SDimitry Andric    foreach sew = SchedSEWSet<mx, isF, isWidening>.val in
18806c3fb27SDimitry Andric      if !exists<SchedRead>(name # "_" # mx # "_E" # sew) then
18906c3fb27SDimitry Andric        def : ReadAdvance<!cast<SchedRead>(name # "_" # mx # "_E" # sew), val, writes>;
19006c3fb27SDimitry Andric  }
19106c3fb27SDimitry Andric}
19206c3fb27SDimitry Andric// Define classes to define list containing all SchedWrites for each (name, LMUL)
19306c3fb27SDimitry Andric// pair for each LMUL in each of the SchedMxList variants above and name in
19406c3fb27SDimitry Andric// argument `names`. These classes can be used to construct a list of existing
19506c3fb27SDimitry Andric// definitions of writes corresponding to each (name, LMUL) pair, that are needed
19606c3fb27SDimitry Andric// by the ReadAdvance. For example:
19706c3fb27SDimitry Andric// ```
19806c3fb27SDimitry Andric//   defm "" : LMULReadAdvance<"ReadVIALUX", 1,
199*0fca6ea1SDimitry Andric//                             LMULSchedWriteList<["WriteVMovSX"]>.value>;
20006c3fb27SDimitry Andric// ```
20106c3fb27SDimitry Andricclass LMULSchedWriteListImpl<list<string> names, list<string> MxList> {
20206c3fb27SDimitry Andric  list<SchedWrite> value = !foldl([]<SchedWrite>,
20306c3fb27SDimitry Andric                                  !foreach(name, names,
20406c3fb27SDimitry Andric                                    !foreach(mx, MxList, !cast<SchedWrite>(name # "_" # mx))),
20506c3fb27SDimitry Andric                                  all, writes, !listconcat(all, writes));
20606c3fb27SDimitry Andric}
207bdd1243dSDimitry Andric
20806c3fb27SDimitry Andricmulticlass LMULSchedWrites<string name> : LMULSchedWritesImpl<name, SchedMxList>;
20906c3fb27SDimitry Andricmulticlass LMULSchedReads<string name> : LMULSchedReadsImpl<name, SchedMxList>;
21006c3fb27SDimitry Andricmulticlass LMULWriteRes<string name, list<ProcResourceKind> resources>
21106c3fb27SDimitry Andric  : LMULWriteResImpl<name, resources>;
21206c3fb27SDimitry Andricmulticlass LMULReadAdvance<string name, int val, list<SchedWrite> writes = []>
21306c3fb27SDimitry Andric  : LMULReadAdvanceImpl<name, val, writes>;
21406c3fb27SDimitry Andricclass LMULSchedWriteList<list<string> names> : LMULSchedWriteListImpl<names, SchedMxList>;
21506c3fb27SDimitry Andric
21606c3fb27SDimitry Andricmulticlass LMULSEWSchedWrites<string name> : LMULSEWSchedWritesImpl<name, SchedMxList>;
21706c3fb27SDimitry Andricmulticlass LMULSEWSchedReads<string name> : LMULSEWSchedReadsImpl<name, SchedMxList>;
21806c3fb27SDimitry Andricmulticlass LMULSEWWriteRes<string name, list<ProcResourceKind> resources>
21906c3fb27SDimitry Andric  : LMULSEWWriteResImpl<name, resources, SchedMxList>;
22006c3fb27SDimitry Andricmulticlass LMULSEWReadAdvance<string name, int val, list<SchedWrite> writes = []>
22106c3fb27SDimitry Andric  : LMULSEWReadAdvanceImpl<name, val, writes, SchedMxList>;
22206c3fb27SDimitry Andric
22306c3fb27SDimitry Andricmulticlass LMULSEWSchedWritesWRed<string name>
22406c3fb27SDimitry Andric    : LMULSEWSchedWritesImpl<name, SchedMxListWRed, isWidening=1>;
22506c3fb27SDimitry Andricmulticlass LMULSEWWriteResWRed<string name, list<ProcResourceKind> resources>
22606c3fb27SDimitry Andric    : LMULSEWWriteResImpl<name, resources, SchedMxListWRed, isWidening=1>;
22706c3fb27SDimitry Andric
22806c3fb27SDimitry Andricmulticlass LMULSEWSchedWritesFWRed<string name>
22906c3fb27SDimitry Andric    : LMULSEWSchedWritesImpl<name, SchedMxListFWRed, isF=1, isWidening=1>;
23006c3fb27SDimitry Andricmulticlass LMULSEWWriteResFWRed<string name, list<ProcResourceKind> resources>
23106c3fb27SDimitry Andric    : LMULSEWWriteResImpl<name, resources, SchedMxListFWRed, isF=1, isWidening=1>;
23206c3fb27SDimitry Andric
23306c3fb27SDimitry Andricmulticlass LMULSEWSchedWritesF<string name> : LMULSEWSchedWritesImpl<name, SchedMxListF, isF=1>;
23406c3fb27SDimitry Andricmulticlass LMULSEWSchedReadsF<string name> : LMULSEWSchedReadsImpl<name, SchedMxListF, isF=1>;
23506c3fb27SDimitry Andricmulticlass LMULSEWWriteResF<string name, list<ProcResourceKind> resources>
23606c3fb27SDimitry Andric  : LMULSEWWriteResImpl<name, resources, SchedMxListF, isF=1>;
23706c3fb27SDimitry Andricmulticlass LMULSEWReadAdvanceF<string name, int val, list<SchedWrite> writes = []>
23806c3fb27SDimitry Andric  : LMULSEWReadAdvanceImpl<name, val, writes, SchedMxListF, isF=1>;
23906c3fb27SDimitry Andric
24006c3fb27SDimitry Andricmulticlass LMULSchedWritesW<string name> : LMULSchedWritesImpl<name, SchedMxListW>;
24106c3fb27SDimitry Andricmulticlass LMULSchedReadsW<string name> : LMULSchedReadsImpl<name, SchedMxListW>;
24206c3fb27SDimitry Andricmulticlass LMULWriteResW<string name, list<ProcResourceKind> resources>
24306c3fb27SDimitry Andric  : LMULWriteResImpl<name, resources>;
24406c3fb27SDimitry Andricmulticlass LMULReadAdvanceW<string name, int val, list<SchedWrite> writes = []>
24506c3fb27SDimitry Andric  : LMULReadAdvanceImpl<name, val, writes>;
24606c3fb27SDimitry Andricclass LMULSchedWriteListW<list<string> names> : LMULSchedWriteListImpl<names, SchedMxListW>;
24706c3fb27SDimitry Andric
24806c3fb27SDimitry Andricmulticlass LMULSchedWritesFW<string name> : LMULSchedWritesImpl<name, SchedMxListFW>;
24906c3fb27SDimitry Andricmulticlass LMULSchedReadsFW<string name> : LMULSchedReadsImpl<name, SchedMxListFW>;
25006c3fb27SDimitry Andricmulticlass LMULWriteResFW<string name, list<ProcResourceKind> resources>
25106c3fb27SDimitry Andric  : LMULWriteResImpl<name, resources>;
25206c3fb27SDimitry Andricmulticlass LMULReadAdvanceFW<string name, int val, list<SchedWrite> writes = []>
25306c3fb27SDimitry Andric  : LMULReadAdvanceImpl<name, val, writes>;
25406c3fb27SDimitry Andricclass LMULSchedWriteListFW<list<string> names> : LMULSchedWriteListImpl<names, SchedMxListFW>;
255bdd1243dSDimitry Andric
256*0fca6ea1SDimitry Andricmulticlass LMULSEWSchedWritesW<string name>
257*0fca6ea1SDimitry Andric    : LMULSEWSchedWritesImpl<name, SchedMxListW, isF = 0, isWidening = 1>;
258*0fca6ea1SDimitry Andricmulticlass LMULSEWSchedReadsW<string name>
259*0fca6ea1SDimitry Andric    : LMULSEWSchedReadsImpl<name, SchedMxListW, isF = 0, isWidening = 1>;
260*0fca6ea1SDimitry Andricmulticlass LMULSEWWriteResW<string name, list<ProcResourceKind> resources>
261*0fca6ea1SDimitry Andric    : LMULSEWWriteResImpl<name, resources, SchedMxListW, isF = 0,
262*0fca6ea1SDimitry Andric                          isWidening = 1>;
263*0fca6ea1SDimitry Andricmulticlass
264*0fca6ea1SDimitry Andric    LMULSEWReadAdvanceW<string name, int val, list<SchedWrite> writes = []>
265*0fca6ea1SDimitry Andric    : LMULSEWReadAdvanceImpl<name, val, writes, SchedMxListW, isF = 0,
266*0fca6ea1SDimitry Andric                             isWidening = 1>;
267*0fca6ea1SDimitry Andric
268*0fca6ea1SDimitry Andricmulticlass LMULSEWSchedWritesFW<string name>
269*0fca6ea1SDimitry Andric    : LMULSEWSchedWritesImpl<name, SchedMxListFW, isF = 1, isWidening = 1>;
270*0fca6ea1SDimitry Andricmulticlass LMULSEWSchedReadsFW<string name>
271*0fca6ea1SDimitry Andric    : LMULSEWSchedReadsImpl<name, SchedMxListFW, isF = 1, isWidening = 1>;
272*0fca6ea1SDimitry Andricmulticlass LMULSEWWriteResFW<string name, list<ProcResourceKind> resources>
273*0fca6ea1SDimitry Andric    : LMULSEWWriteResImpl<name, resources, SchedMxListFW, isF = 1,
274*0fca6ea1SDimitry Andric                          isWidening = 1>;
275*0fca6ea1SDimitry Andricmulticlass
276*0fca6ea1SDimitry Andric    LMULSEWReadAdvanceFW<string name, int val, list<SchedWrite> writes = []>
277*0fca6ea1SDimitry Andric    : LMULSEWReadAdvanceImpl<name, val, writes, SchedMxListFW, isF = 1,
278*0fca6ea1SDimitry Andric                             isWidening = 1>;
279*0fca6ea1SDimitry Andric
280bdd1243dSDimitry Andric// 3.6 Vector Byte Length vlenb
281bdd1243dSDimitry Andricdef WriteRdVLENB      : SchedWrite;
282bdd1243dSDimitry Andric
283bdd1243dSDimitry Andric// 6. Configuration-Setting Instructions
284bdd1243dSDimitry Andricdef WriteVSETVLI      : SchedWrite;
285bdd1243dSDimitry Andricdef WriteVSETIVLI     : SchedWrite;
286bdd1243dSDimitry Andricdef WriteVSETVL       : SchedWrite;
287bdd1243dSDimitry Andric
2886e75b2fbSDimitry Andric// 7. Vector Loads and Stores
2896e75b2fbSDimitry Andric// 7.4. Vector Unit-Stride Instructions
290bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDE">;
291bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTE">;
2926e75b2fbSDimitry Andric// 7.4.1. Vector Unit-Strided Mask
293bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDM">;
294bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTM">;
2956e75b2fbSDimitry Andric// 7.5. Vector Strided Instructions
296bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDS8">;
297bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDS16">;
298bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDS32">;
299bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDS64">;
300bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTS8">;
301bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTS16">;
302bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTS32">;
303bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTS64">;
3046e75b2fbSDimitry Andric// 7.6. Vector Indexed Instructions
305bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDUX8">;
306bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDUX16">;
307bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDUX32">;
308bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDUX64">;
309bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDOX8">;
310bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDOX16">;
311bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDOX32">;
312bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDOX64">;
313bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTUX8">;
314bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTUX16">;
315bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTUX32">;
316bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTUX64">;
317bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTOX8">;
318bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTOX16">;
319bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTOX32">;
320bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTOX64">;
3216e75b2fbSDimitry Andric// 7.7. Vector Unit-stride Fault-Only-First Loads
322bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDFF">;
323753f127fSDimitry Andric// 7.8. Vector Segment Instructions
324753f127fSDimitry Andricforeach nf=2-8 in {
325753f127fSDimitry Andric  foreach eew = [8, 16, 32, 64] in {
326bdd1243dSDimitry Andric    defm "" : LMULSchedWrites<"WriteVLSEG" # nf # e # eew>;
327bdd1243dSDimitry Andric    defm "" : LMULSchedWrites<"WriteVSSEG" # nf # e # eew>;
328bdd1243dSDimitry Andric    defm "" : LMULSchedWrites<"WriteVLSEGFF" # nf # e # eew>;
329bdd1243dSDimitry Andric    defm "" : LMULSchedWrites<"WriteVLSSEG" # nf # e # eew>;
330bdd1243dSDimitry Andric    defm "" : LMULSchedWrites<"WriteVSSSEG" # nf # e # eew>;
331bdd1243dSDimitry Andric    defm "" : LMULSchedWrites<"WriteVLUXSEG" # nf # e # eew>;
332bdd1243dSDimitry Andric    defm "" : LMULSchedWrites<"WriteVLOXSEG" # nf # e # eew>;
333bdd1243dSDimitry Andric    defm "" : LMULSchedWrites<"WriteVSUXSEG" # nf # e # eew>;
334bdd1243dSDimitry Andric    defm "" : LMULSchedWrites<"WriteVSOXSEG" # nf # e # eew>;
335753f127fSDimitry Andric  }
336753f127fSDimitry Andric}
3376e75b2fbSDimitry Andric// 7.9. Vector Whole Register Instructions
338bdd1243dSDimitry Andricdef WriteVLD1R        : SchedWrite;
339bdd1243dSDimitry Andricdef WriteVLD2R        : SchedWrite;
340bdd1243dSDimitry Andricdef WriteVLD4R        : SchedWrite;
341bdd1243dSDimitry Andricdef WriteVLD8R        : SchedWrite;
3426e75b2fbSDimitry Andricdef WriteVST1R        : SchedWrite;
3436e75b2fbSDimitry Andricdef WriteVST2R        : SchedWrite;
3446e75b2fbSDimitry Andricdef WriteVST4R        : SchedWrite;
3456e75b2fbSDimitry Andricdef WriteVST8R        : SchedWrite;
3466e75b2fbSDimitry Andric
3476e75b2fbSDimitry Andric// 11. Vector Integer Arithmetic Instructions
3486e75b2fbSDimitry Andric// 11.1. Vector Single-Width Integer Add and Subtract
3496e75b2fbSDimitry Andric// 11.5. Vector Bitwise Logical Instructions
350bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIALUV">;
351bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIALUX">;
352bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIALUI">;
3536e75b2fbSDimitry Andric// 11.2. Vector Widening Integer Add/Subtract
354bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWALUV">;
355bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWALUX">;
356bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWALUI">;
3576e75b2fbSDimitry Andric// 11.3. Vector Integer Extension
358bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVExtV">;
3596e75b2fbSDimitry Andric// 11.4. Vector Integer Arithmetic with Carry or Borrow Instructions
360bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICALUV">;
361bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICALUX">;
362bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICALUI">;
3636e75b2fbSDimitry Andric// 11.6. Vector Single-Width Bit Shift Instructions
364bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVShiftV">;
365bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVShiftX">;
366bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVShiftI">;
3676e75b2fbSDimitry Andric// 11.7. Vector Narrowing Integer Right Shift Instructions
368bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNShiftV">;
369bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNShiftX">;
370bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNShiftI">;
3716e75b2fbSDimitry Andric// 11.8. Vector Integer Comparison Instructions
372bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICmpV">;
373bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICmpX">;
374bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICmpI">;
37506c3fb27SDimitry Andric// 11.9. Vector Integer Min/Max Instructions
37606c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMinMaxV">;
37706c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMinMaxX">;
3786e75b2fbSDimitry Andric// 11.10. Vector Single-Width Integer Multiply Instructions
379bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMulV">;
380bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMulX">;
3816e75b2fbSDimitry Andric// 11.11. Vector Integer Divide Instructions
38206c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVIDivV">;
38306c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVIDivX">;
3846e75b2fbSDimitry Andric// 11.12. Vector Widening Integer Multiply Instructions
385bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWMulV">;
386bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWMulX">;
3876e75b2fbSDimitry Andric// 11.13. Vector Single-Width Integer Multiply-Add Instructions
388bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMulAddV">;
389bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMulAddX">;
3906e75b2fbSDimitry Andric// 11.14. Vector Widening Integer Multiply-Add Instructions
391bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWMulAddV">;
392bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWMulAddX">;
3936e75b2fbSDimitry Andric// 11.15. Vector Integer Merge Instructions
394bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMergeV">;
395bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMergeX">;
396bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMergeI">;
3976e75b2fbSDimitry Andric// 11.16. Vector Integer Move Instructions
398bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMovV">;
399bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMovX">;
400bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMovI">;
4016e75b2fbSDimitry Andric
4026e75b2fbSDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions
4036e75b2fbSDimitry Andric// 12.1. Vector Single-Width Saturating Add and Subtract
404bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSALUV">;
405bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSALUX">;
406bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSALUI">;
4076e75b2fbSDimitry Andric// 12.2. Vector Single-Width Averaging Add and Subtract
408bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVAALUV">;
409bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVAALUX">;
4106e75b2fbSDimitry Andric// 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation
411bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSMulV">;
412bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSMulX">;
4136e75b2fbSDimitry Andric// 12.4. Vector Single-Width Scaling Shift Instructions
414bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSShiftV">;
415bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSShiftX">;
416bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSShiftI">;
4176e75b2fbSDimitry Andric// 12.5. Vector Narrowing Fixed-Point Clip Instructions
418bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNClipV">;
419bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNClipX">;
420bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNClipI">;
4216e75b2fbSDimitry Andric
4226e75b2fbSDimitry Andric// 13. Vector Floating-Point Instructions
4236e75b2fbSDimitry Andric// 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions
424*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFALUV">;
425*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFALUF">;
4266e75b2fbSDimitry Andric// 13.3. Vector Widening Floating-Point Add/Subtract Instructions
427*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWALUV">;
428*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWALUF">;
4296e75b2fbSDimitry Andric// 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
430*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMulV">;
431*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMulF">;
43206c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFDivV">;
43306c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFDivF">;
4346e75b2fbSDimitry Andric// 13.5. Vector Widening Floating-Point Multiply
435*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWMulV">;
436*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWMulF">;
4376e75b2fbSDimitry Andric// 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions
438*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMulAddV">;
439*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMulAddF">;
4406e75b2fbSDimitry Andric// 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions
441*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWMulAddV">;
442*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWMulAddF">;
4436e75b2fbSDimitry Andric// 13.8. Vector Floating-Point Square-Root Instruction
44406c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFSqrtV">;
4456e75b2fbSDimitry Andric// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction
4466e75b2fbSDimitry Andric// 13.10. Vector Floating-Point Reciprocal Estimate Instruction
447*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFRecpV">;
4486e75b2fbSDimitry Andric// 13.11. Vector Floating-Point MIN/MAX Instructions
449*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMinMaxV">;
450*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMinMaxF">;
4516e75b2fbSDimitry Andric// 13.12. Vector Floating-Point Sign-Injection Instructions
452*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFSgnjV">;
453*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFSgnjF">;
45406c3fb27SDimitry Andric// 13.13. Vector Floating-Point Compare Instructions
45506c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVFCmpV">;
45606c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVFCmpF">;
4576e75b2fbSDimitry Andric// 13.14. Vector Floating-Point Classify Instruction
458bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVFClassV">;
4596e75b2fbSDimitry Andric// 13.15. Vector Floating-Point Merge Instruction
460bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVFMergeV">;
4616e75b2fbSDimitry Andric// 13.16. Vector Floating-Point Move Instruction
462bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVFMovV">;
4636e75b2fbSDimitry Andric// 13.17. Single-Width Floating-Point/Integer Type-Convert Instructions
464*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFCvtIToFV">;
465bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVFCvtFToIV">;
4666e75b2fbSDimitry Andric// 13.18. Widening Floating-Point/Integer Type-Convert Instructions
467*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesW<"WriteVFWCvtIToFV">;
468bdd1243dSDimitry Andricdefm "" : LMULSchedWritesFW<"WriteVFWCvtFToIV">;
469*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWCvtFToFV">;
4706e75b2fbSDimitry Andric// 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions
471*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFNCvtIToFV">;
472bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVFNCvtFToIV">;
473*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFNCvtFToFV">;
4746e75b2fbSDimitry Andric
4756e75b2fbSDimitry Andric// 14. Vector Reduction Operations
47606c3fb27SDimitry Andric// The latency of reduction is determined by the size of the read resource.
47706c3fb27SDimitry Andric// The LMUL range of read resource(VS2) for reduction operantion is between
47806c3fb27SDimitry Andric// MF8 and M8. Use the _From suffix to indicate the number of the
47906c3fb27SDimitry Andric// LMUL from VS2.
4806e75b2fbSDimitry Andric// 14.1. Vector Single-Width Integer Reduction Instructions
48106c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVIRedV_From">;
48206c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVIRedMinMaxV_From">;
4836e75b2fbSDimitry Andric// 14.2. Vector Widening Integer Reduction Instructions
48406c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesWRed<"WriteVIWRedV_From">;
4856e75b2fbSDimitry Andric// 14.3. Vector Single-Width Floating-Point Reduction Instructions
48606c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFRedV_From">;
48706c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFRedOV_From">;
48806c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFRedMinMaxV_From">;
4896e75b2fbSDimitry Andric// 14.4. Vector Widening Floating-Point Reduction Instructions
49006c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesFWRed<"WriteVFWRedV_From">;
49106c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesFWRed<"WriteVFWRedOV_From">;
4926e75b2fbSDimitry Andric
4936e75b2fbSDimitry Andric// 15. Vector Mask Instructions
4946e75b2fbSDimitry Andric// 15.1. Vector Mask-Register Logical Instructions
495bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVMALUV">;
4966e75b2fbSDimitry Andric// 15.2. Vector Mask Population Count
497bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVMPopV">;
4986e75b2fbSDimitry Andric// 15.3. Vector Find-First-Set Mask Bit
499bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVMFFSV">;
5006e75b2fbSDimitry Andric// 15.4. Vector Set-Before-First Mask Bit
5016e75b2fbSDimitry Andric// 15.5. Vector Set-Including-First Mask Bit
5026e75b2fbSDimitry Andric// 15.6. Vector Set-only-First Mask Bit
503bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVMSFSV">;
5046e75b2fbSDimitry Andric// 15.8. Vector Iota Instruction
505*0fca6ea1SDimitry Andricdefm "" : LMULSchedWrites<"WriteVIotaV">;
5066e75b2fbSDimitry Andric// 15.9. Vector Element Index Instruction
507*0fca6ea1SDimitry Andricdefm "" : LMULSchedWrites<"WriteVIdxV">;
5086e75b2fbSDimitry Andric
5096e75b2fbSDimitry Andric// 16. Vector Permutation Instructions
5106e75b2fbSDimitry Andric// 16.1. Integer Scalar Move Instructions
511*0fca6ea1SDimitry Andricdef WriteVMovSX : SchedWrite;
512*0fca6ea1SDimitry Andricdef WriteVMovXS : SchedWrite;
5136e75b2fbSDimitry Andric// 16.2. Floating-Point Scalar Move Instructions
514*0fca6ea1SDimitry Andricdef WriteVMovSF : SchedWrite;
515*0fca6ea1SDimitry Andricdef WriteVMovFS : SchedWrite;
5166e75b2fbSDimitry Andric// 16.3. Vector Slide Instructions
517*0fca6ea1SDimitry Andricdefm "" : LMULSchedWrites<"WriteVSlideUpX">;
518*0fca6ea1SDimitry Andricdefm "" : LMULSchedWrites<"WriteVSlideDownX">;
519*0fca6ea1SDimitry Andricdefm "" : LMULSchedWrites<"WriteVSlideI">;
520bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVISlide1X">;
521bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVFSlide1F">;
5226e75b2fbSDimitry Andric// 16.4. Vector Register Gather Instructions
52306c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVRGatherVV">;
524*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVRGatherEI16VV">;
52506c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVRGatherVX">;
52606c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVRGatherVI">;
5276e75b2fbSDimitry Andric// 16.5. Vector Compress Instruction
52806c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVCompressV">;
5296e75b2fbSDimitry Andric// 16.6. Whole Vector Register Move
530bdd1243dSDimitry Andric// These are already LMUL aware
5316e75b2fbSDimitry Andricdef WriteVMov1V       : SchedWrite;
5326e75b2fbSDimitry Andricdef WriteVMov2V       : SchedWrite;
5336e75b2fbSDimitry Andricdef WriteVMov4V       : SchedWrite;
5346e75b2fbSDimitry Andricdef WriteVMov8V       : SchedWrite;
5356e75b2fbSDimitry Andric
5366e75b2fbSDimitry Andric//===----------------------------------------------------------------------===//
5376e75b2fbSDimitry Andric/// Define scheduler resources associated with use operands.
5386e75b2fbSDimitry Andric
539bdd1243dSDimitry Andric// 6. Configuration-Setting Instructions
540bdd1243dSDimitry Andricdef ReadVSETVLI       : SchedRead;
541bdd1243dSDimitry Andricdef ReadVSETVL        : SchedRead;
542bdd1243dSDimitry Andric
5436e75b2fbSDimitry Andric// 7. Vector Loads and Stores
54406c3fb27SDimitry Andricdef ReadVLDX : SchedRead;
54506c3fb27SDimitry Andricdef ReadVSTX : SchedRead;
5466e75b2fbSDimitry Andric// 7.4. Vector Unit-Stride Instructions
547bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTEV">;
5486e75b2fbSDimitry Andric// 7.4.1. Vector Unit-Strided Mask
549bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTM">;
5506e75b2fbSDimitry Andric// 7.5. Vector Strided Instructions
55106c3fb27SDimitry Andricdef ReadVLDSX : SchedRead;
55206c3fb27SDimitry Andricdef ReadVSTSX : SchedRead;
553bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTS8V">;
554bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTS16V">;
555bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTS32V">;
556bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTS64V">;
5576e75b2fbSDimitry Andric// 7.6. Vector Indexed Instructions
558bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVLDUXV">;
559bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVLDOXV">;
560bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX8">;
561bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX16">;
562bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX32">;
563bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX64">;
564bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUXV">;
565bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX8V">;
566bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX16V">;
567bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX32V">;
568bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX64V">;
569bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX8">;
570bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX16">;
571bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX32">;
572bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX64">;
573bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOXV">;
574bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX8V">;
575bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX16V">;
576bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX32V">;
577bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX64V">;
5786e75b2fbSDimitry Andric// 7.9. Vector Whole Register Instructions
579bdd1243dSDimitry Andric// These are already LMUL aware
5806e75b2fbSDimitry Andricdef ReadVST1R         : SchedRead;
5816e75b2fbSDimitry Andricdef ReadVST2R         : SchedRead;
5826e75b2fbSDimitry Andricdef ReadVST4R         : SchedRead;
5836e75b2fbSDimitry Andricdef ReadVST8R         : SchedRead;
5846e75b2fbSDimitry Andric
5856e75b2fbSDimitry Andric// 11. Vector Integer Arithmetic Instructions
5866e75b2fbSDimitry Andric// 11.1. Vector Single-Width Integer Add and Subtract
5876e75b2fbSDimitry Andric// 11.5. Vector Bitwise Logical Instructions
588bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIALUV">;
589bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIALUX">;
5906e75b2fbSDimitry Andric// 11.2. Vector Widening Integer Add/Subtract
591bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWALUV">;
592bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWALUX">;
5936e75b2fbSDimitry Andric// 11.3. Vector Integer Extension
594bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVExtV">;
5956e75b2fbSDimitry Andric// 11.4. Vector Integer Arithmetic with Carry or Borrow Instructions
596bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVICALUV">;
597bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVICALUX">;
5986e75b2fbSDimitry Andric// 11.6. Vector Single-Width Bit Shift Instructions
599bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVShiftV">;
600bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVShiftX">;
6016e75b2fbSDimitry Andric// 11.7. Vector Narrowing Integer Right Shift Instructions
602bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVNShiftV">;
603bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVNShiftX">;
6046e75b2fbSDimitry Andric// 11.8. Vector Integer Comparison Instructions
605bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVICmpV">;
606bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVICmpX">;
60706c3fb27SDimitry Andric// 11.9. Vector Integer Min/Max Instructions
60806c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVIMinMaxV">;
60906c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVIMinMaxX">;
6106e75b2fbSDimitry Andric// 11.10. Vector Single-Width Integer Multiply Instructions
611bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMulV">;
612bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMulX">;
6136e75b2fbSDimitry Andric// 11.11. Vector Integer Divide Instructions
61406c3fb27SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVIDivV">;
61506c3fb27SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVIDivX">;
6166e75b2fbSDimitry Andric// 11.12. Vector Widening Integer Multiply Instructions
617bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWMulV">;
618bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWMulX">;
6196e75b2fbSDimitry Andric// 11.13. Vector Single-Width Integer Multiply-Add Instructions
620bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMulAddV">;
621bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMulAddX">;
6226e75b2fbSDimitry Andric// 11.14. Vector Widening Integer Multiply-Add Instructions
623bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWMulAddV">;
624bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWMulAddX">;
6256e75b2fbSDimitry Andric// 11.15. Vector Integer Merge Instructions
626bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMergeV">;
627bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMergeX">;
6286e75b2fbSDimitry Andric// 11.16. Vector Integer Move Instructions
629bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMovV">;
630bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMovX">;
6316e75b2fbSDimitry Andric
6326e75b2fbSDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions
6336e75b2fbSDimitry Andric// 12.1. Vector Single-Width Saturating Add and Subtract
634bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSALUV">;
635bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSALUX">;
6366e75b2fbSDimitry Andric// 12.2. Vector Single-Width Averaging Add and Subtract
637bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVAALUV">;
638bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVAALUX">;
6396e75b2fbSDimitry Andric// 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation
640bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSMulV">;
641bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSMulX">;
6426e75b2fbSDimitry Andric// 12.4. Vector Single-Width Scaling Shift Instructions
643bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSShiftV">;
644bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSShiftX">;
6456e75b2fbSDimitry Andric// 12.5. Vector Narrowing Fixed-Point Clip Instructions
646bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVNClipV">;
647bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVNClipX">;
6486e75b2fbSDimitry Andric
6496e75b2fbSDimitry Andric// 13. Vector Floating-Point Instructions
6506e75b2fbSDimitry Andric// 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions
651*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFALUV">;
652*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFALUF">;
6536e75b2fbSDimitry Andric// 13.3. Vector Widening Floating-Point Add/Subtract Instructions
654*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWALUV">;
655*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWALUF">;
6566e75b2fbSDimitry Andric// 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
657*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMulV">;
658*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMulF">;
65906c3fb27SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFDivV">;
66006c3fb27SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFDivF">;
6616e75b2fbSDimitry Andric// 13.5. Vector Widening Floating-Point Multiply
662*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWMulV">;
663*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWMulF">;
6646e75b2fbSDimitry Andric// 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions
665*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMulAddV">;
666*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMulAddF">;
6676e75b2fbSDimitry Andric// 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions
668*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWMulAddV">;
669*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWMulAddF">;
6706e75b2fbSDimitry Andric// 13.8. Vector Floating-Point Square-Root Instruction
67106c3fb27SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFSqrtV">;
6726e75b2fbSDimitry Andric// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction
6736e75b2fbSDimitry Andric// 13.10. Vector Floating-Point Reciprocal Estimate Instruction
674*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFRecpV">;
6756e75b2fbSDimitry Andric// 13.11. Vector Floating-Point MIN/MAX Instructions
676*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMinMaxV">;
677*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMinMaxF">;
6786e75b2fbSDimitry Andric// 13.12. Vector Floating-Point Sign-Injection Instructions
679*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFSgnjV">;
680*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFSgnjF">;
68106c3fb27SDimitry Andric// 13.13. Vector Floating-Point Compare Instructions
68206c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVFCmpV">;
68306c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVFCmpF">;
6846e75b2fbSDimitry Andric// 13.14. Vector Floating-Point Classify Instruction
685bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFClassV">;
6866e75b2fbSDimitry Andric// 13.15. Vector Floating-Point Merge Instruction
687bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFMergeV">;
688bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFMergeF">;
6896e75b2fbSDimitry Andric// 13.16. Vector Floating-Point Move Instruction
690bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFMovF">;
6916e75b2fbSDimitry Andric// 13.17. Single-Width Floating-Point/Integer Type-Convert Instructions
692*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFCvtIToFV">;
693bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFCvtFToIV">;
6946e75b2fbSDimitry Andric// 13.18. Widening Floating-Point/Integer Type-Convert Instructions
695*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsW<"ReadVFWCvtIToFV">;
696bdd1243dSDimitry Andricdefm "" : LMULSchedReadsFW<"ReadVFWCvtFToIV">;
697*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWCvtFToFV">;
6986e75b2fbSDimitry Andric// 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions
699*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFNCvtIToFV">;
700bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVFNCvtFToIV">;
701*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFNCvtFToFV">;
7026e75b2fbSDimitry Andric
7036e75b2fbSDimitry Andric// 14. Vector Reduction Operations
7046e75b2fbSDimitry Andric// 14.1. Vector Single-Width Integer Reduction Instructions
7056e75b2fbSDimitry Andricdef ReadVIRedV        : SchedRead;
7066e75b2fbSDimitry Andricdef ReadVIRedV0       : SchedRead;
7076e75b2fbSDimitry Andric// 14.2. Vector Widening Integer Reduction Instructions
7086e75b2fbSDimitry Andricdef ReadVIWRedV       : SchedRead;
7096e75b2fbSDimitry Andricdef ReadVIWRedV0      : SchedRead;
7106e75b2fbSDimitry Andric// 14.3. Vector Single-Width Floating-Point Reduction Instructions
7116e75b2fbSDimitry Andricdef ReadVFRedV        : SchedRead;
7126e75b2fbSDimitry Andricdef ReadVFRedV0       : SchedRead;
7136e75b2fbSDimitry Andricdef ReadVFRedOV       : SchedRead;
7146e75b2fbSDimitry Andricdef ReadVFRedOV0      : SchedRead;
71506c3fb27SDimitry Andricdef ReadVFRedMinMaxV  : SchedRead;
7166e75b2fbSDimitry Andric// 14.4. Vector Widening Floating-Point Reduction Instructions
7176e75b2fbSDimitry Andricdef ReadVFWRedV       : SchedRead;
7186e75b2fbSDimitry Andricdef ReadVFWRedV0      : SchedRead;
7196e75b2fbSDimitry Andricdef ReadVFWRedOV      : SchedRead;
7206e75b2fbSDimitry Andricdef ReadVFWRedOV0     : SchedRead;
7216e75b2fbSDimitry Andric
7226e75b2fbSDimitry Andric// 15. Vector Mask Instructions
7236e75b2fbSDimitry Andric// 15.1. Vector Mask-Register Logical Instructions
724bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVMALUV">;
7256e75b2fbSDimitry Andric// 15.2. Vector Mask Population Count
726bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVMPopV">;
7276e75b2fbSDimitry Andric// 15.3. Vector Find-First-Set Mask Bit
728bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVMFFSV">;
7296e75b2fbSDimitry Andric// 15.4. Vector Set-Before-First Mask Bit
7306e75b2fbSDimitry Andric// 15.5. Vector Set-Including-First Mask Bit
7316e75b2fbSDimitry Andric// 15.6. Vector Set-only-First Mask Bit
732bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVMSFSV">;
7336e75b2fbSDimitry Andric// 15.8. Vector Iota Instruction
734*0fca6ea1SDimitry Andricdefm "" : LMULSchedReads<"ReadVIotaV">;
7356e75b2fbSDimitry Andric
7366e75b2fbSDimitry Andric// 16. Vector Permutation Instructions
7376e75b2fbSDimitry Andric// 16.1. Integer Scalar Move Instructions
738*0fca6ea1SDimitry Andricdef ReadVMovXS : SchedRead;
739*0fca6ea1SDimitry Andricdef ReadVMovSX_V : SchedRead;
740*0fca6ea1SDimitry Andricdef ReadVMovSX_X : SchedRead;
7416e75b2fbSDimitry Andric// 16.2. Floating-Point Scalar Move Instructions
742*0fca6ea1SDimitry Andricdef ReadVMovFS : SchedRead;
743*0fca6ea1SDimitry Andricdef ReadVMovSF_V : SchedRead;
744*0fca6ea1SDimitry Andricdef ReadVMovSF_F : SchedRead;
7456e75b2fbSDimitry Andric// 16.3. Vector Slide Instructions
746bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVISlideV">;
747bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVISlideX">;
748bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFSlideV">;
749bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFSlideF">;
7506e75b2fbSDimitry Andric// 16.4. Vector Register Gather Instructions
75106c3fb27SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVRGatherVV_data">;
75206c3fb27SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVRGatherVV_index">;
753*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVRGatherEI16VV_data">;
754*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVRGatherEI16VV_index">;
75506c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVRGatherVX_data">;
75606c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVRGatherVX_index">;
75706c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVRGatherVI_data">;
7586e75b2fbSDimitry Andric// 16.5. Vector Compress Instruction
75906c3fb27SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVCompressV">;
7606e75b2fbSDimitry Andric// 16.6. Whole Vector Register Move
761bdd1243dSDimitry Andric// These are already LMUL aware
7626e75b2fbSDimitry Andricdef ReadVMov1V        : SchedRead;
7636e75b2fbSDimitry Andricdef ReadVMov2V        : SchedRead;
7646e75b2fbSDimitry Andricdef ReadVMov4V        : SchedRead;
7656e75b2fbSDimitry Andricdef ReadVMov8V        : SchedRead;
7666e75b2fbSDimitry Andric
7676e75b2fbSDimitry Andric// Others
7686e75b2fbSDimitry Andricdef ReadVMask         : SchedRead;
7695f757f3fSDimitry Andricdef ReadVMergeOp_WorstCase : SchedRead;
7705f757f3fSDimitry Andricforeach mx = SchedMxList in {
7715f757f3fSDimitry Andric  def ReadVMergeOp_ # mx : SchedRead;
7725f757f3fSDimitry Andric  foreach sew = SchedSEWSet<mx>.val in
7735f757f3fSDimitry Andric    def ReadVMergeOp_ # mx  # "_E" # sew : SchedRead;
7745f757f3fSDimitry Andric}
7756e75b2fbSDimitry Andric
7766e75b2fbSDimitry Andric//===----------------------------------------------------------------------===//
7776e75b2fbSDimitry Andric/// Define default scheduler resources for V.
7786e75b2fbSDimitry Andric
7796e75b2fbSDimitry Andricmulticlass UnsupportedSchedV {
7806e75b2fbSDimitry Andriclet Unsupported = true in {
7816e75b2fbSDimitry Andric
782bdd1243dSDimitry Andric// 3.6 Vector Byte Length vlenb
783bdd1243dSDimitry Andricdef : WriteRes<WriteRdVLENB, []>;
784bdd1243dSDimitry Andric
785bdd1243dSDimitry Andric// 6. Configuration-Setting Instructions
786bdd1243dSDimitry Andricdef : WriteRes<WriteVSETVLI, []>;
787bdd1243dSDimitry Andricdef : WriteRes<WriteVSETIVLI, []>;
788bdd1243dSDimitry Andricdef : WriteRes<WriteVSETVL, []>;
789bdd1243dSDimitry Andric
7906e75b2fbSDimitry Andric// 7. Vector Loads and Stores
791bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDE", []>;
792bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTE", []>;
793bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDM", []>;
794bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTM", []>;
795bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDS8", []>;
796bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDS16", []>;
797bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDS32", []>;
798bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDS64", []>;
799bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTS8", []>;
800bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTS16", []>;
801bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTS32", []>;
802bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTS64", []>;
803bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDUX8", []>;
804bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDUX16", []>;
805bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDUX32", []>;
806bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDUX64", []>;
807bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDOX8", []>;
808bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDOX16", []>;
809bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDOX32", []>;
810bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDOX64", []>;
811bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTUX8", []>;
812bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTUX16", []>;
813bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTUX32", []>;
814bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTUX64", []>;
815bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTOX8", []>;
816bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTOX16", []>;
817bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTOX32", []>;
818bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTOX64", []>;
819bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDFF", []>;
820bdd1243dSDimitry Andric// These are already LMUL aware
821bdd1243dSDimitry Andricdef : WriteRes<WriteVLD1R, []>;
822bdd1243dSDimitry Andricdef : WriteRes<WriteVLD2R, []>;
823bdd1243dSDimitry Andricdef : WriteRes<WriteVLD4R, []>;
824bdd1243dSDimitry Andricdef : WriteRes<WriteVLD8R, []>;
8256e75b2fbSDimitry Andricdef : WriteRes<WriteVST1R, []>;
8266e75b2fbSDimitry Andricdef : WriteRes<WriteVST2R, []>;
8276e75b2fbSDimitry Andricdef : WriteRes<WriteVST4R, []>;
8286e75b2fbSDimitry Andricdef : WriteRes<WriteVST8R, []>;
829753f127fSDimitry Andric// Vector Segment Loads and Stores
830753f127fSDimitry Andricforeach nf=2-8 in {
831753f127fSDimitry Andric  foreach eew = [8, 16, 32, 64] in {
832bdd1243dSDimitry Andric    defm "" : LMULWriteRes <"WriteVLSEG" # nf # "e" # eew, []>;
833bdd1243dSDimitry Andric    defm "" : LMULWriteRes <"WriteVLSEGFF" # nf # "e" # eew, []>;
834bdd1243dSDimitry Andric    defm "" : LMULWriteRes <"WriteVSSEG" # nf # "e" # eew, []>;
835bdd1243dSDimitry Andric    defm "" : LMULWriteRes <"WriteVLSSEG" # nf # "e" # eew, []>;
836bdd1243dSDimitry Andric    defm "" : LMULWriteRes <"WriteVSSSEG" # nf # "e" # eew, []>;
837bdd1243dSDimitry Andric    defm "" : LMULWriteRes <"WriteVLUXSEG" # nf # "e" # eew, []>;
838bdd1243dSDimitry Andric    defm "" : LMULWriteRes <"WriteVLOXSEG" # nf # "e" # eew, []>;
839bdd1243dSDimitry Andric    defm "" : LMULWriteRes <"WriteVSUXSEG" # nf # "e" # eew, []>;
840bdd1243dSDimitry Andric    defm "" : LMULWriteRes <"WriteVSOXSEG" # nf # "e" # eew, []>;
841753f127fSDimitry Andric  }
842753f127fSDimitry Andric}
8436e75b2fbSDimitry Andric
844bdd1243dSDimitry Andric// 11. Vector Integer Arithmetic Instructions
845bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIALUV", []>;
846bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIALUX", []>;
847bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIALUI", []>;
848bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWALUV", []>;
849bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWALUX", []>;
850bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWALUI", []>;
851bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVExtV", []>;
852bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICALUV", []>;
853bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICALUX", []>;
854bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICALUI", []>;
855bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVShiftV", []>;
856bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVShiftX", []>;
857bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVShiftI", []>;
858bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNShiftV", []>;
859bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNShiftX", []>;
860bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNShiftI", []>;
861bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICmpV", []>;
862bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICmpX", []>;
863bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICmpI", []>;
86406c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVIMinMaxV", []>;
86506c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVIMinMaxX", []>;
866bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMulV", []>;
867bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMulX", []>;
86806c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVIDivV", []>;
86906c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVIDivX", []>;
870bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWMulV", []>;
871bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWMulX", []>;
872bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMulAddV", []>;
873bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMulAddX", []>;
874bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWMulAddV", []>;
875bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWMulAddX", []>;
876bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMergeV", []>;
877bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMergeX", []>;
878bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMergeI", []>;
879bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMovV", []>;
880bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMovX", []>;
881bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMovI", []>;
8826e75b2fbSDimitry Andric
883bdd1243dSDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions
884bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSALUV", []>;
885bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSALUX", []>;
886bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSALUI", []>;
887bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVAALUV", []>;
888bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVAALUX", []>;
889bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSMulV", []>;
890bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSMulX", []>;
891bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSShiftV", []>;
892bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSShiftX", []>;
893bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSShiftI", []>;
894bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNClipV", []>;
895bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNClipX", []>;
896bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNClipI", []>;
8976e75b2fbSDimitry Andric
898bdd1243dSDimitry Andric// 13. Vector Floating-Point Instructions
899*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFALUV", []>;
900*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFALUF", []>;
901*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWALUV", []>;
902*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWALUF", []>;
903*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMulV", []>;
904*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMulF", []>;
90506c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFDivV", []>;
90606c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFDivF", []>;
907*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWMulV", []>;
908*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWMulF", []>;
909*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMulAddV", []>;
910*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMulAddF", []>;
911*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWMulAddV", []>;
912*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWMulAddF", []>;
91306c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFSqrtV", []>;
914*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFRecpV", []>;
915*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMinMaxV", []>;
916*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMinMaxF", []>;
917*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFSgnjV", []>;
918*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFSgnjF", []>;
91906c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVFCmpV", []>;
92006c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVFCmpF", []>;
921bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVFClassV", []>;
922bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVFMergeV", []>;
923bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVFMovV", []>;
924*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFCvtIToFV", []>;
925bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVFCvtFToIV", []>;
926*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResW<"WriteVFWCvtIToFV", []>;
927bdd1243dSDimitry Andricdefm "" : LMULWriteResFW<"WriteVFWCvtFToIV", []>;
928*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWCvtFToFV", []>;
929*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFNCvtIToFV", []>;
930bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVFNCvtFToIV", []>;
931*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFNCvtFToFV", []>;
9326e75b2fbSDimitry Andric
933bdd1243dSDimitry Andric// 14. Vector Reduction Operations
93406c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVIRedV_From", []>;
93506c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVIRedMinMaxV_From", []>;
93606c3fb27SDimitry Andricdefm "" : LMULSEWWriteResWRed<"WriteVIWRedV_From", []>;
93706c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFRedV_From", []>;
93806c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFRedOV_From", []>;
93906c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFRedMinMaxV_From", []>;
94006c3fb27SDimitry Andricdefm "" : LMULSEWWriteResFWRed<"WriteVFWRedV_From", []>;
94106c3fb27SDimitry Andricdefm "" : LMULSEWWriteResFWRed<"WriteVFWRedOV_From", []>;
9426e75b2fbSDimitry Andric
943bdd1243dSDimitry Andric// 15. Vector Mask Instructions
944bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVMALUV", []>;
945bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVMPopV", []>;
946bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVMFFSV", []>;
947bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVMSFSV", []>;
948*0fca6ea1SDimitry Andricdefm "" : LMULWriteRes<"WriteVIotaV", []>;
949*0fca6ea1SDimitry Andricdefm "" : LMULWriteRes<"WriteVIdxV", []>;
9506e75b2fbSDimitry Andric
951bdd1243dSDimitry Andric// 16. Vector Permutation Instructions
952*0fca6ea1SDimitry Andricdef : WriteRes<WriteVMovSX, []>;
953*0fca6ea1SDimitry Andricdef : WriteRes<WriteVMovXS, []>;
954*0fca6ea1SDimitry Andricdef : WriteRes<WriteVMovSF, []>;
955*0fca6ea1SDimitry Andricdef : WriteRes<WriteVMovFS, []>;
956*0fca6ea1SDimitry Andricdefm "" : LMULWriteRes<"WriteVSlideUpX", []>;
957*0fca6ea1SDimitry Andricdefm "" : LMULWriteRes<"WriteVSlideDownX", []>;
958*0fca6ea1SDimitry Andricdefm "" : LMULWriteRes<"WriteVSlideI", []>;
959bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVISlide1X", []>;
960bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVFSlide1F", []>;
96106c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVRGatherVV", []>;
962*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVRGatherEI16VV", []>;
96306c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVRGatherVX", []>;
96406c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVRGatherVI", []>;
96506c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVCompressV", []>;
966bdd1243dSDimitry Andric// These are already LMUL aware
9676e75b2fbSDimitry Andricdef : WriteRes<WriteVMov1V, []>;
9686e75b2fbSDimitry Andricdef : WriteRes<WriteVMov2V, []>;
9696e75b2fbSDimitry Andricdef : WriteRes<WriteVMov4V, []>;
9706e75b2fbSDimitry Andricdef : WriteRes<WriteVMov8V, []>;
9716e75b2fbSDimitry Andric
972bdd1243dSDimitry Andric// 6. Configuration-Setting Instructions
973bdd1243dSDimitry Andricdef : ReadAdvance<ReadVSETVLI, 0>;
974bdd1243dSDimitry Andricdef : ReadAdvance<ReadVSETVL, 0>;
975bdd1243dSDimitry Andric
9766e75b2fbSDimitry Andric// 7. Vector Loads and Stores
97706c3fb27SDimitry Andricdef : ReadAdvance<ReadVLDX, 0>;
97806c3fb27SDimitry Andricdef : ReadAdvance<ReadVSTX, 0>;
979bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTEV", 0>;
980bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTM", 0>;
98106c3fb27SDimitry Andricdef : ReadAdvance<ReadVLDSX, 0>;
98206c3fb27SDimitry Andricdef : ReadAdvance<ReadVSTSX, 0>;
983bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS8V", 0>;
984bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS16V", 0>;
985bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS32V", 0>;
986bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS64V", 0>;
987bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVLDUXV", 0>;
988bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVLDOXV", 0>;
989bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUXV", 0>;
990bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX8", 0>;
991bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX16", 0>;
992bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX32", 0>;
993bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX64", 0>;
994bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX8V", 0>;
995bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX16V", 0>;
996bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX32V", 0>;
997bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX64V", 0>;
998bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX8", 0>;
999bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX16", 0>;
1000bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX32", 0>;
1001bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX64", 0>;
1002bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOXV", 0>;
1003bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX8V", 0>;
1004bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX16V", 0>;
1005bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX32V", 0>;
1006bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX64V", 0>;
1007bdd1243dSDimitry Andric// These are already LMUL aware
10086e75b2fbSDimitry Andricdef : ReadAdvance<ReadVST1R, 0>;
10096e75b2fbSDimitry Andricdef : ReadAdvance<ReadVST2R, 0>;
10106e75b2fbSDimitry Andricdef : ReadAdvance<ReadVST4R, 0>;
10116e75b2fbSDimitry Andricdef : ReadAdvance<ReadVST8R, 0>;
10126e75b2fbSDimitry Andric
1013bdd1243dSDimitry Andric// 11. Vector Integer Arithmetic Instructions
1014bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIALUV", 0>;
1015bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIALUX", 0>;
1016bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWALUV", 0>;
1017bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWALUX", 0>;
1018bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVExtV", 0>;
1019bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVICALUV", 0>;
1020bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVICALUX", 0>;
1021bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVShiftV", 0>;
1022bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVShiftX", 0>;
1023bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNShiftV", 0>;
1024bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNShiftX", 0>;
1025bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVICmpV", 0>;
1026bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVICmpX", 0>;
102706c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMinMaxV", 0>;
102806c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMinMaxX", 0>;
1029bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMulV", 0>;
1030bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMulX", 0>;
103106c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVIDivV", 0>;
103206c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVIDivX", 0>;
1033bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWMulV", 0>;
1034bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWMulX", 0>;
1035bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMulAddV", 0>;
1036bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMulAddX", 0>;
1037bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWMulAddV", 0>;
1038bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWMulAddX", 0>;
1039bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMergeV", 0>;
1040bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMergeX", 0>;
1041bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMovV", 0>;
1042bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMovX", 0>;
10436e75b2fbSDimitry Andric
1044bdd1243dSDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions
1045bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSALUV", 0>;
1046bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSALUX", 0>;
1047bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVAALUV", 0>;
1048bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVAALUX", 0>;
1049bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSMulV", 0>;
1050bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSMulX", 0>;
1051bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSShiftV", 0>;
1052bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSShiftX", 0>;
1053bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNClipV", 0>;
1054bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNClipX", 0>;
10556e75b2fbSDimitry Andric
1056bdd1243dSDimitry Andric// 13. Vector Floating-Point Instructions
1057*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFALUV", 0>;
1058*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFALUF", 0>;
1059*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWALUV", 0>;
1060*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWALUF", 0>;
1061*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulV", 0>;
1062*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulF", 0>;
106306c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFDivV", 0>;
106406c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFDivF", 0>;
1065*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulV", 0>;
1066*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulF", 0>;
1067*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulAddV", 0>;
1068*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulAddF", 0>;
1069*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulAddV", 0>;
1070*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulAddF", 0>;
107106c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSqrtV", 0>;
1072*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFRecpV", 0>;
1073*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMinMaxV", 0>;
1074*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMinMaxF", 0>;
1075*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSgnjV", 0>;
1076*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSgnjF", 0>;
107706c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCmpV", 0>;
107806c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCmpF", 0>;
1079bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFClassV", 0>;
1080bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMergeV", 0>;
1081bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMergeF", 0>;
1082bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMovF", 0>;
1083*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFCvtIToFV", 0>;
1084bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCvtFToIV", 0>;
1085*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceW<"ReadVFWCvtIToFV", 0>;
1086bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceFW<"ReadVFWCvtFToIV", 0>;
1087*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWCvtFToFV", 0>;
1088*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFNCvtIToFV", 0>;
1089bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVFNCvtFToIV", 0>;
1090*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFNCvtFToFV", 0>;
10916e75b2fbSDimitry Andric
1092bdd1243dSDimitry Andric// 14. Vector Reduction Operations
10936e75b2fbSDimitry Andricdef : ReadAdvance<ReadVIRedV, 0>;
10946e75b2fbSDimitry Andricdef : ReadAdvance<ReadVIRedV0, 0>;
10956e75b2fbSDimitry Andricdef : ReadAdvance<ReadVIWRedV, 0>;
10966e75b2fbSDimitry Andricdef : ReadAdvance<ReadVIWRedV0, 0>;
10976e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFRedV, 0>;
10986e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFRedV0, 0>;
10996e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFRedOV, 0>;
11006e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFRedOV0, 0>;
110106c3fb27SDimitry Andricdef : ReadAdvance<ReadVFRedMinMaxV, 0>;
11026e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFWRedV, 0>;
11036e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFWRedV0, 0>;
11046e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFWRedOV, 0>;
11056e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFWRedOV0, 0>;
11066e75b2fbSDimitry Andric
1107bdd1243dSDimitry Andric// 15. Vector Mask Instructions
1108bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVMALUV", 0>;
1109bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVMPopV", 0>;
1110bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVMFFSV", 0>;
1111bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVMSFSV", 0>;
1112*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVIotaV", 0>;
11136e75b2fbSDimitry Andric
1114bdd1243dSDimitry Andric// 16. Vector Permutation Instructions
1115*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovXS, 0>;
1116*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSX_V, 0>;
1117*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSX_X, 0>;
1118*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovFS, 0>;
1119*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSF_V, 0>;
1120*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSF_F, 0>;
1121bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVISlideV", 0>;
1122bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVISlideX", 0>;
1123bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFSlideV", 0>;
1124bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFSlideF", 0>;
112506c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherVV_data", 0>;
112606c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherVV_index", 0>;
1127*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherEI16VV_data", 0>;
1128*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherEI16VV_index", 0>;
112906c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVX_data", 0>;
113006c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVX_index", 0>;
113106c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVI_data", 0>;
1132bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVGatherV", 0>;
113306c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVCompressV", 0>;
1134bdd1243dSDimitry Andric// These are already LMUL aware
11356e75b2fbSDimitry Andricdef : ReadAdvance<ReadVMov1V, 0>;
11366e75b2fbSDimitry Andricdef : ReadAdvance<ReadVMov2V, 0>;
11376e75b2fbSDimitry Andricdef : ReadAdvance<ReadVMov4V, 0>;
11386e75b2fbSDimitry Andricdef : ReadAdvance<ReadVMov8V, 0>;
11396e75b2fbSDimitry Andric
11406e75b2fbSDimitry Andric// Others
11416e75b2fbSDimitry Andricdef : ReadAdvance<ReadVMask, 0>;
11425f757f3fSDimitry Andricdef : ReadAdvance<ReadVMergeOp_WorstCase, 0>;
11435f757f3fSDimitry Andricforeach mx = SchedMxList in {
11445f757f3fSDimitry Andric  def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx), 0>;
11455f757f3fSDimitry Andric  foreach sew = SchedSEWSet<mx>.val in
11465f757f3fSDimitry Andric    def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx  # "_E" # sew), 0>;
11475f757f3fSDimitry Andric}
11486e75b2fbSDimitry Andric
11496e75b2fbSDimitry Andric} // Unsupported
11506e75b2fbSDimitry Andric} // UnsupportedSchedV
1151