1//===-- RISCVScheduleV.td - RISCV Scheduling Definitions V -*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9//===----------------------------------------------------------------------===//
10/// Define scheduler resources associated with def operands.
11
12defvar UpperBoundLMUL = "UpperBound";
13defvar SchedMxList = ["UpperBound", "M1", "M2", "M4", "M8", "MF2", "MF4", "MF8"];
14// Used for widening and narrowing instructions as it doesn't contain M8.
15defvar SchedMxListW = ["UpperBound", "MF8", "MF4", "MF2", "M1", "M2", "M4"];
16defvar SchedMxListFW = ["UpperBound", "MF4", "MF2", "M1", "M2", "M4"];
17
18// Creates SchedWrite for each (name, LMUL) pair for LMUL in SchedMxList
19multiclass LMULSchedWrites<string name> {
20  foreach mx = SchedMxList in {
21    def name # "_" # mx : SchedWrite;
22  }
23}
24
25// Creates SchedWrite for each (name, LMUL) pair for LMUL in SchedMxListW
26multiclass LMULSchedWritesW<string name> {
27  foreach mx = SchedMxListW in {
28    def name # "_" # mx : SchedWrite;
29  }
30}
31
32// Creates SchedWrite for each (name, LMUL) pair for LMUL in SchedMxListFW
33multiclass LMULSchedWritesFW<string name> {
34  foreach mx = SchedMxListFW in {
35    def name # "_" # mx : SchedWrite;
36  }
37}
38
39// Creates SchedRead for each (name, LMUL) pair for LMUL in SchedMxList
40multiclass LMULSchedReads<string name> {
41  foreach mx = SchedMxList in {
42    def name # "_" # mx : SchedRead;
43  }
44}
45
46// Creates SchedRead for each (name, LMUL) pair for LMUL in SchedMxListW
47multiclass LMULSchedReadsW<string name> {
48  foreach mx = SchedMxListW in {
49    def name # "_" # mx : SchedRead;
50  }
51}
52
53// Creates SchedRead for each (name, LMUL) pair for LMUL in SchedMxListFW
54multiclass LMULSchedReadsFW<string name> {
55  foreach mx = SchedMxListFW in {
56    def name # "_" # mx : SchedRead;
57  }
58}
59
60// Creates WriteRes for each (name, LMUL, resources) tuple for LMUL
61// in SchedMxList
62multiclass LMULWriteRes<string name, list<ProcResourceKind> resources> {
63  foreach mx = SchedMxList in {
64    def : WriteRes<!cast<SchedWrite>(name # "_" # mx), resources>;
65  }
66}
67
68// Creates WriteRes for each (name, LMUL, resources) tuple for LMUL
69// in SchedMxListW
70multiclass LMULWriteResW<string name, list<ProcResourceKind> resources> {
71  foreach mx = SchedMxListW in {
72    def : WriteRes<!cast<SchedWrite>(name # "_" # mx), resources>;
73  }
74}
75
76// Creates WriteRes for each (name, LMUL, resources) tuple for LMUL
77// in SchedMxListFW
78multiclass LMULWriteResFW<string name, list<ProcResourceKind> resources> {
79  foreach mx = SchedMxListFW in {
80    def : WriteRes<!cast<SchedWrite>(name # "_" # mx), resources>;
81  }
82}
83
84// Creates ReadAdvance for each (name, LMUL, val) tuple for LMUL
85// in SchedMxList
86multiclass LMULReadAdvance<string name, int val, list<SchedWrite> writes = []> {
87  foreach mx = SchedMxList in {
88    def : ReadAdvance<!cast<SchedRead>(name # "_" # mx), val, writes>;
89  }
90}
91
92// Creates ReadAdvance for each (name, LMUL, val) tuple for LMUL
93// in SchedMxListW
94multiclass LMULReadAdvanceW<string name, int val, list<SchedWrite> writes = []> {
95  foreach mx = SchedMxListW in {
96    def : ReadAdvance<!cast<SchedRead>(name # "_" # mx), val, writes>;
97  }
98}
99
100// Creates ReadAdvance for each (name, LMUL, val) tuple for LMUL
101// in SchedMxListFW
102multiclass LMULReadAdvanceFW<string name, int val, list<SchedWrite> writes = []> {
103  foreach mx = SchedMxListFW in {
104    def : ReadAdvance<!cast<SchedRead>(name # "_" # mx), val, writes>;
105  }
106}
107
108// 3.6 Vector Byte Length vlenb
109def WriteRdVLENB      : SchedWrite;
110
111// 6. Configuration-Setting Instructions
112def WriteVSETVLI      : SchedWrite;
113def WriteVSETIVLI     : SchedWrite;
114def WriteVSETVL       : SchedWrite;
115
116// 7. Vector Loads and Stores
117// 7.4. Vector Unit-Stride Instructions
118defm "" : LMULSchedWrites<"WriteVLDE">;
119defm "" : LMULSchedWrites<"WriteVSTE">;
120// 7.4.1. Vector Unit-Strided Mask
121defm "" : LMULSchedWrites<"WriteVLDM">;
122defm "" : LMULSchedWrites<"WriteVSTM">;
123// 7.5. Vector Strided Instructions
124defm "" : LMULSchedWrites<"WriteVLDS8">;
125defm "" : LMULSchedWrites<"WriteVLDS16">;
126defm "" : LMULSchedWrites<"WriteVLDS32">;
127defm "" : LMULSchedWrites<"WriteVLDS64">;
128defm "" : LMULSchedWrites<"WriteVSTS8">;
129defm "" : LMULSchedWrites<"WriteVSTS16">;
130defm "" : LMULSchedWrites<"WriteVSTS32">;
131defm "" : LMULSchedWrites<"WriteVSTS64">;
132// 7.6. Vector Indexed Instructions
133defm "" : LMULSchedWrites<"WriteVLDUX8">;
134defm "" : LMULSchedWrites<"WriteVLDUX16">;
135defm "" : LMULSchedWrites<"WriteVLDUX32">;
136defm "" : LMULSchedWrites<"WriteVLDUX64">;
137defm "" : LMULSchedWrites<"WriteVLDOX8">;
138defm "" : LMULSchedWrites<"WriteVLDOX16">;
139defm "" : LMULSchedWrites<"WriteVLDOX32">;
140defm "" : LMULSchedWrites<"WriteVLDOX64">;
141defm "" : LMULSchedWrites<"WriteVSTUX8">;
142defm "" : LMULSchedWrites<"WriteVSTUX16">;
143defm "" : LMULSchedWrites<"WriteVSTUX32">;
144defm "" : LMULSchedWrites<"WriteVSTUX64">;
145defm "" : LMULSchedWrites<"WriteVSTOX8">;
146defm "" : LMULSchedWrites<"WriteVSTOX16">;
147defm "" : LMULSchedWrites<"WriteVSTOX32">;
148defm "" : LMULSchedWrites<"WriteVSTOX64">;
149// 7.7. Vector Unit-stride Fault-Only-First Loads
150defm "" : LMULSchedWrites<"WriteVLDFF">;
151// 7.8. Vector Segment Instructions
152foreach nf=2-8 in {
153  foreach eew = [8, 16, 32, 64] in {
154    defm "" : LMULSchedWrites<"WriteVLSEG" # nf # e # eew>;
155    defm "" : LMULSchedWrites<"WriteVSSEG" # nf # e # eew>;
156    defm "" : LMULSchedWrites<"WriteVLSEGFF" # nf # e # eew>;
157    defm "" : LMULSchedWrites<"WriteVLSSEG" # nf # e # eew>;
158    defm "" : LMULSchedWrites<"WriteVSSSEG" # nf # e # eew>;
159    defm "" : LMULSchedWrites<"WriteVLUXSEG" # nf # e # eew>;
160    defm "" : LMULSchedWrites<"WriteVLOXSEG" # nf # e # eew>;
161    defm "" : LMULSchedWrites<"WriteVSUXSEG" # nf # e # eew>;
162    defm "" : LMULSchedWrites<"WriteVSOXSEG" # nf # e # eew>;
163  }
164}
165// 7.9. Vector Whole Register Instructions
166def WriteVLD1R        : SchedWrite;
167def WriteVLD2R        : SchedWrite;
168def WriteVLD4R        : SchedWrite;
169def WriteVLD8R        : SchedWrite;
170def WriteVST1R        : SchedWrite;
171def WriteVST2R        : SchedWrite;
172def WriteVST4R        : SchedWrite;
173def WriteVST8R        : SchedWrite;
174
175// 11. Vector Integer Arithmetic Instructions
176// 11.1. Vector Single-Width Integer Add and Subtract
177// 11.5. Vector Bitwise Logical Instructions
178defm "" : LMULSchedWrites<"WriteVIALUV">;
179defm "" : LMULSchedWrites<"WriteVIALUX">;
180defm "" : LMULSchedWrites<"WriteVIALUI">;
181// 11.2. Vector Widening Integer Add/Subtract
182defm "" : LMULSchedWritesW<"WriteVIWALUV">;
183defm "" : LMULSchedWritesW<"WriteVIWALUX">;
184defm "" : LMULSchedWritesW<"WriteVIWALUI">;
185// 11.3. Vector Integer Extension
186defm "" : LMULSchedWrites<"WriteVExtV">;
187// 11.4. Vector Integer Arithmetic with Carry or Borrow Instructions
188defm "" : LMULSchedWrites<"WriteVICALUV">;
189defm "" : LMULSchedWrites<"WriteVICALUX">;
190defm "" : LMULSchedWrites<"WriteVICALUI">;
191// 11.6. Vector Single-Width Bit Shift Instructions
192defm "" : LMULSchedWrites<"WriteVShiftV">;
193defm "" : LMULSchedWrites<"WriteVShiftX">;
194defm "" : LMULSchedWrites<"WriteVShiftI">;
195// 11.7. Vector Narrowing Integer Right Shift Instructions
196defm "" : LMULSchedWritesW<"WriteVNShiftV">;
197defm "" : LMULSchedWritesW<"WriteVNShiftX">;
198defm "" : LMULSchedWritesW<"WriteVNShiftI">;
199// 11.8. Vector Integer Comparison Instructions
200// 11.9. Vector Integer Min/Max Instructions
201defm "" : LMULSchedWrites<"WriteVICmpV">;
202defm "" : LMULSchedWrites<"WriteVICmpX">;
203defm "" : LMULSchedWrites<"WriteVICmpI">;
204// 11.10. Vector Single-Width Integer Multiply Instructions
205defm "" : LMULSchedWrites<"WriteVIMulV">;
206defm "" : LMULSchedWrites<"WriteVIMulX">;
207// 11.11. Vector Integer Divide Instructions
208defm "" : LMULSchedWrites<"WriteVIDivV">;
209defm "" : LMULSchedWrites<"WriteVIDivX">;
210// 11.12. Vector Widening Integer Multiply Instructions
211defm "" : LMULSchedWritesW<"WriteVIWMulV">;
212defm "" : LMULSchedWritesW<"WriteVIWMulX">;
213// 11.13. Vector Single-Width Integer Multiply-Add Instructions
214defm "" : LMULSchedWrites<"WriteVIMulAddV">;
215defm "" : LMULSchedWrites<"WriteVIMulAddX">;
216// 11.14. Vector Widening Integer Multiply-Add Instructions
217defm "" : LMULSchedWritesW<"WriteVIWMulAddV">;
218defm "" : LMULSchedWritesW<"WriteVIWMulAddX">;
219// 11.15. Vector Integer Merge Instructions
220defm "" : LMULSchedWrites<"WriteVIMergeV">;
221defm "" : LMULSchedWrites<"WriteVIMergeX">;
222defm "" : LMULSchedWrites<"WriteVIMergeI">;
223// 11.16. Vector Integer Move Instructions
224defm "" : LMULSchedWrites<"WriteVIMovV">;
225defm "" : LMULSchedWrites<"WriteVIMovX">;
226defm "" : LMULSchedWrites<"WriteVIMovI">;
227
228// 12. Vector Fixed-Point Arithmetic Instructions
229// 12.1. Vector Single-Width Saturating Add and Subtract
230defm "" : LMULSchedWrites<"WriteVSALUV">;
231defm "" : LMULSchedWrites<"WriteVSALUX">;
232defm "" : LMULSchedWrites<"WriteVSALUI">;
233// 12.2. Vector Single-Width Averaging Add and Subtract
234defm "" : LMULSchedWrites<"WriteVAALUV">;
235defm "" : LMULSchedWrites<"WriteVAALUX">;
236// 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation
237defm "" : LMULSchedWrites<"WriteVSMulV">;
238defm "" : LMULSchedWrites<"WriteVSMulX">;
239// 12.4. Vector Single-Width Scaling Shift Instructions
240defm "" : LMULSchedWrites<"WriteVSShiftV">;
241defm "" : LMULSchedWrites<"WriteVSShiftX">;
242defm "" : LMULSchedWrites<"WriteVSShiftI">;
243// 12.5. Vector Narrowing Fixed-Point Clip Instructions
244defm "" : LMULSchedWritesW<"WriteVNClipV">;
245defm "" : LMULSchedWritesW<"WriteVNClipX">;
246defm "" : LMULSchedWritesW<"WriteVNClipI">;
247
248// 13. Vector Floating-Point Instructions
249// 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions
250defm "" : LMULSchedWrites<"WriteVFALUV">;
251defm "" : LMULSchedWrites<"WriteVFALUF">;
252// 13.3. Vector Widening Floating-Point Add/Subtract Instructions
253defm "" : LMULSchedWritesFW<"WriteVFWALUV">;
254defm "" : LMULSchedWritesFW<"WriteVFWALUF">;
255// 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
256defm "" : LMULSchedWrites<"WriteVFMulV">;
257defm "" : LMULSchedWrites<"WriteVFMulF">;
258defm "" : LMULSchedWrites<"WriteVFDivV">;
259defm "" : LMULSchedWrites<"WriteVFDivF">;
260// 13.5. Vector Widening Floating-Point Multiply
261defm "" : LMULSchedWritesFW<"WriteVFWMulV">;
262defm "" : LMULSchedWritesFW<"WriteVFWMulF">;
263// 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions
264defm "" : LMULSchedWrites<"WriteVFMulAddV">;
265defm "" : LMULSchedWrites<"WriteVFMulAddF">;
266// 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions
267defm "" : LMULSchedWritesFW<"WriteVFWMulAddV">;
268defm "" : LMULSchedWritesFW<"WriteVFWMulAddF">;
269// 13.8. Vector Floating-Point Square-Root Instruction
270defm "" : LMULSchedWrites<"WriteVFSqrtV">;
271// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction
272// 13.10. Vector Floating-Point Reciprocal Estimate Instruction
273defm "" : LMULSchedWrites<"WriteVFRecpV">;
274// 13.11. Vector Floating-Point MIN/MAX Instructions
275// 13.13. Vector Floating-Point Compare Instructions
276defm "" : LMULSchedWrites<"WriteVFCmpV">;
277defm "" : LMULSchedWrites<"WriteVFCmpF">;
278// 13.12. Vector Floating-Point Sign-Injection Instructions
279defm "" : LMULSchedWrites<"WriteVFSgnjV">;
280defm "" : LMULSchedWrites<"WriteVFSgnjF">;
281// 13.14. Vector Floating-Point Classify Instruction
282defm "" : LMULSchedWrites<"WriteVFClassV">;
283// 13.15. Vector Floating-Point Merge Instruction
284defm "" : LMULSchedWrites<"WriteVFMergeV">;
285// 13.16. Vector Floating-Point Move Instruction
286defm "" : LMULSchedWrites<"WriteVFMovV">;
287// 13.17. Single-Width Floating-Point/Integer Type-Convert Instructions
288defm "" : LMULSchedWrites<"WriteVFCvtIToFV">;
289defm "" : LMULSchedWrites<"WriteVFCvtFToIV">;
290// 13.18. Widening Floating-Point/Integer Type-Convert Instructions
291defm "" : LMULSchedWritesW<"WriteVFWCvtIToFV">;
292defm "" : LMULSchedWritesFW<"WriteVFWCvtFToIV">;
293defm "" : LMULSchedWritesFW<"WriteVFWCvtFToFV">;
294// 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions
295defm "" : LMULSchedWritesFW<"WriteVFNCvtIToFV">;
296defm "" : LMULSchedWritesW<"WriteVFNCvtFToIV">;
297defm "" : LMULSchedWritesFW<"WriteVFNCvtFToFV">;
298
299// 14. Vector Reduction Operations
300// 14.1. Vector Single-Width Integer Reduction Instructions
301def WriteVIRedV       : SchedWrite;
302// 14.2. Vector Widening Integer Reduction Instructions
303def WriteVIWRedV      : SchedWrite;
304// 14.3. Vector Single-Width Floating-Point Reduction Instructions
305def WriteVFRedV       : SchedWrite;
306def WriteVFRedOV      : SchedWrite;
307// 14.4. Vector Widening Floating-Point Reduction Instructions
308def WriteVFWRedV      : SchedWrite;
309def WriteVFWRedOV     : SchedWrite;
310
311// 15. Vector Mask Instructions
312// 15.1. Vector Mask-Register Logical Instructions
313defm "" : LMULSchedWrites<"WriteVMALUV">;
314// 15.2. Vector Mask Population Count
315defm "" : LMULSchedWrites<"WriteVMPopV">;
316// 15.3. Vector Find-First-Set Mask Bit
317defm "" : LMULSchedWrites<"WriteVMFFSV">;
318// 15.4. Vector Set-Before-First Mask Bit
319// 15.5. Vector Set-Including-First Mask Bit
320// 15.6. Vector Set-only-First Mask Bit
321defm "" : LMULSchedWrites<"WriteVMSFSV">;
322// 15.8. Vector Iota Instruction
323defm "" : LMULSchedWrites<"WriteVMIotV">;
324// 15.9. Vector Element Index Instruction
325defm "" : LMULSchedWrites<"WriteVMIdxV">;
326
327// 16. Vector Permutation Instructions
328// 16.1. Integer Scalar Move Instructions
329defm "" : LMULSchedWrites<"WriteVIMovVX">;
330defm "" : LMULSchedWrites<"WriteVIMovXV">;
331// 16.2. Floating-Point Scalar Move Instructions
332defm "" : LMULSchedWrites<"WriteVFMovVF">;
333defm "" : LMULSchedWrites<"WriteVFMovFV">;
334// 16.3. Vector Slide Instructions
335defm "" : LMULSchedWrites<"WriteVISlideX">;
336defm "" : LMULSchedWrites<"WriteVISlideI">;
337defm "" : LMULSchedWrites<"WriteVISlide1X">;
338defm "" : LMULSchedWrites<"WriteVFSlide1F">;
339// 16.4. Vector Register Gather Instructions
340defm "" : LMULSchedWrites<"WriteVGatherV">;
341defm "" : LMULSchedWrites<"WriteVGatherX">;
342defm "" : LMULSchedWrites<"WriteVGatherI">;
343// 16.5. Vector Compress Instruction
344defm "" : LMULSchedWrites<"WriteVCompressV">;
345// 16.6. Whole Vector Register Move
346// These are already LMUL aware
347def WriteVMov1V       : SchedWrite;
348def WriteVMov2V       : SchedWrite;
349def WriteVMov4V       : SchedWrite;
350def WriteVMov8V       : SchedWrite;
351
352//===----------------------------------------------------------------------===//
353/// Define scheduler resources associated with use operands.
354
355// 6. Configuration-Setting Instructions
356def ReadVSETVLI       : SchedRead;
357def ReadVSETVL        : SchedRead;
358
359// 7. Vector Loads and Stores
360defm "" : LMULSchedReads<"ReadVLDX">;
361defm "" : LMULSchedReads<"ReadVSTX">;
362// 7.4. Vector Unit-Stride Instructions
363defm "" : LMULSchedReads<"ReadVSTEV">;
364// 7.4.1. Vector Unit-Strided Mask
365defm "" : LMULSchedReads<"ReadVSTM">;
366// 7.5. Vector Strided Instructions
367defm "" : LMULSchedReads<"ReadVLDSX">;
368defm "" : LMULSchedReads<"ReadVSTSX">;
369defm "" : LMULSchedReads<"ReadVSTS8V">;
370defm "" : LMULSchedReads<"ReadVSTS16V">;
371defm "" : LMULSchedReads<"ReadVSTS32V">;
372defm "" : LMULSchedReads<"ReadVSTS64V">;
373// 7.6. Vector Indexed Instructions
374defm "" : LMULSchedReads<"ReadVLDUXV">;
375defm "" : LMULSchedReads<"ReadVLDOXV">;
376defm "" : LMULSchedReads<"ReadVSTUX8">;
377defm "" : LMULSchedReads<"ReadVSTUX16">;
378defm "" : LMULSchedReads<"ReadVSTUX32">;
379defm "" : LMULSchedReads<"ReadVSTUX64">;
380defm "" : LMULSchedReads<"ReadVSTUXV">;
381defm "" : LMULSchedReads<"ReadVSTUX8V">;
382defm "" : LMULSchedReads<"ReadVSTUX16V">;
383defm "" : LMULSchedReads<"ReadVSTUX32V">;
384defm "" : LMULSchedReads<"ReadVSTUX64V">;
385defm "" : LMULSchedReads<"ReadVSTOX8">;
386defm "" : LMULSchedReads<"ReadVSTOX16">;
387defm "" : LMULSchedReads<"ReadVSTOX32">;
388defm "" : LMULSchedReads<"ReadVSTOX64">;
389defm "" : LMULSchedReads<"ReadVSTOXV">;
390defm "" : LMULSchedReads<"ReadVSTOX8V">;
391defm "" : LMULSchedReads<"ReadVSTOX16V">;
392defm "" : LMULSchedReads<"ReadVSTOX32V">;
393defm "" : LMULSchedReads<"ReadVSTOX64V">;
394// 7.9. Vector Whole Register Instructions
395// These are already LMUL aware
396def ReadVST1R         : SchedRead;
397def ReadVST2R         : SchedRead;
398def ReadVST4R         : SchedRead;
399def ReadVST8R         : SchedRead;
400
401// 11. Vector Integer Arithmetic Instructions
402// 11.1. Vector Single-Width Integer Add and Subtract
403// 11.5. Vector Bitwise Logical Instructions
404defm "" : LMULSchedReads<"ReadVIALUV">;
405defm "" : LMULSchedReads<"ReadVIALUX">;
406// 11.2. Vector Widening Integer Add/Subtract
407defm "" : LMULSchedReadsW<"ReadVIWALUV">;
408defm "" : LMULSchedReadsW<"ReadVIWALUX">;
409// 11.3. Vector Integer Extension
410defm "" : LMULSchedReads<"ReadVExtV">;
411// 11.4. Vector Integer Arithmetic with Carry or Borrow Instructions
412defm "" : LMULSchedReads<"ReadVICALUV">;
413defm "" : LMULSchedReads<"ReadVICALUX">;
414// 11.6. Vector Single-Width Bit Shift Instructions
415defm "" : LMULSchedReads<"ReadVShiftV">;
416defm "" : LMULSchedReads<"ReadVShiftX">;
417// 11.7. Vector Narrowing Integer Right Shift Instructions
418defm "" : LMULSchedReadsW<"ReadVNShiftV">;
419defm "" : LMULSchedReadsW<"ReadVNShiftX">;
420// 11.8. Vector Integer Comparison Instructions
421// 11.9. Vector Integer Min/Max Instructions
422defm "" : LMULSchedReads<"ReadVICmpV">;
423defm "" : LMULSchedReads<"ReadVICmpX">;
424// 11.10. Vector Single-Width Integer Multiply Instructions
425defm "" : LMULSchedReads<"ReadVIMulV">;
426defm "" : LMULSchedReads<"ReadVIMulX">;
427// 11.11. Vector Integer Divide Instructions
428defm "" : LMULSchedReads<"ReadVIDivV">;
429defm "" : LMULSchedReads<"ReadVIDivX">;
430// 11.12. Vector Widening Integer Multiply Instructions
431defm "" : LMULSchedReadsW<"ReadVIWMulV">;
432defm "" : LMULSchedReadsW<"ReadVIWMulX">;
433// 11.13. Vector Single-Width Integer Multiply-Add Instructions
434defm "" : LMULSchedReads<"ReadVIMulAddV">;
435defm "" : LMULSchedReads<"ReadVIMulAddX">;
436// 11.14. Vector Widening Integer Multiply-Add Instructions
437defm "" : LMULSchedReadsW<"ReadVIWMulAddV">;
438defm "" : LMULSchedReadsW<"ReadVIWMulAddX">;
439// 11.15. Vector Integer Merge Instructions
440defm "" : LMULSchedReads<"ReadVIMergeV">;
441defm "" : LMULSchedReads<"ReadVIMergeX">;
442// 11.16. Vector Integer Move Instructions
443defm "" : LMULSchedReads<"ReadVIMovV">;
444defm "" : LMULSchedReads<"ReadVIMovX">;
445
446// 12. Vector Fixed-Point Arithmetic Instructions
447// 12.1. Vector Single-Width Saturating Add and Subtract
448defm "" : LMULSchedReads<"ReadVSALUV">;
449defm "" : LMULSchedReads<"ReadVSALUX">;
450// 12.2. Vector Single-Width Averaging Add and Subtract
451defm "" : LMULSchedReads<"ReadVAALUV">;
452defm "" : LMULSchedReads<"ReadVAALUX">;
453// 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation
454defm "" : LMULSchedReads<"ReadVSMulV">;
455defm "" : LMULSchedReads<"ReadVSMulX">;
456// 12.4. Vector Single-Width Scaling Shift Instructions
457defm "" : LMULSchedReads<"ReadVSShiftV">;
458defm "" : LMULSchedReads<"ReadVSShiftX">;
459// 12.5. Vector Narrowing Fixed-Point Clip Instructions
460defm "" : LMULSchedReadsW<"ReadVNClipV">;
461defm "" : LMULSchedReadsW<"ReadVNClipX">;
462
463// 13. Vector Floating-Point Instructions
464// 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions
465defm "" : LMULSchedReads<"ReadVFALUV">;
466defm "" : LMULSchedReads<"ReadVFALUF">;
467// 13.3. Vector Widening Floating-Point Add/Subtract Instructions
468defm "" : LMULSchedReadsFW<"ReadVFWALUV">;
469defm "" : LMULSchedReadsFW<"ReadVFWALUF">;
470// 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
471defm "" : LMULSchedReads<"ReadVFMulV">;
472defm "" : LMULSchedReads<"ReadVFMulF">;
473defm "" : LMULSchedReads<"ReadVFDivV">;
474defm "" : LMULSchedReads<"ReadVFDivF">;
475// 13.5. Vector Widening Floating-Point Multiply
476defm "" : LMULSchedReadsFW<"ReadVFWMulV">;
477defm "" : LMULSchedReadsFW<"ReadVFWMulF">;
478// 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions
479defm "" : LMULSchedReads<"ReadVFMulAddV">;
480defm "" : LMULSchedReads<"ReadVFMulAddF">;
481// 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions
482defm "" : LMULSchedReadsFW<"ReadVFWMulAddV">;
483defm "" : LMULSchedReadsFW<"ReadVFWMulAddF">;
484// 13.8. Vector Floating-Point Square-Root Instruction
485defm "" : LMULSchedReads<"ReadVFSqrtV">;
486// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction
487// 13.10. Vector Floating-Point Reciprocal Estimate Instruction
488defm "" : LMULSchedReads<"ReadVFRecpV">;
489// 13.11. Vector Floating-Point MIN/MAX Instructions
490// 13.13. Vector Floating-Point Compare Instructions
491defm "" : LMULSchedReads<"ReadVFCmpV">;
492defm "" : LMULSchedReads<"ReadVFCmpF">;
493// 13.12. Vector Floating-Point Sign-Injection Instructions
494defm "" : LMULSchedReads<"ReadVFSgnjV">;
495defm "" : LMULSchedReads<"ReadVFSgnjF">;
496// 13.14. Vector Floating-Point Classify Instruction
497defm "" : LMULSchedReads<"ReadVFClassV">;
498// 13.15. Vector Floating-Point Merge Instruction
499defm "" : LMULSchedReads<"ReadVFMergeV">;
500defm "" : LMULSchedReads<"ReadVFMergeF">;
501// 13.16. Vector Floating-Point Move Instruction
502defm "" : LMULSchedReads<"ReadVFMovF">;
503// 13.17. Single-Width Floating-Point/Integer Type-Convert Instructions
504defm "" : LMULSchedReads<"ReadVFCvtIToFV">;
505defm "" : LMULSchedReads<"ReadVFCvtFToIV">;
506// 13.18. Widening Floating-Point/Integer Type-Convert Instructions
507defm "" : LMULSchedReadsW<"ReadVFWCvtIToFV">;
508defm "" : LMULSchedReadsFW<"ReadVFWCvtFToIV">;
509defm "" : LMULSchedReadsFW<"ReadVFWCvtFToFV">;
510// 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions
511defm "" : LMULSchedReadsFW<"ReadVFNCvtIToFV">;
512defm "" : LMULSchedReadsW<"ReadVFNCvtFToIV">;
513defm "" : LMULSchedReadsFW<"ReadVFNCvtFToFV">;
514
515// 14. Vector Reduction Operations
516// 14.1. Vector Single-Width Integer Reduction Instructions
517def ReadVIRedV        : SchedRead;
518def ReadVIRedV0       : SchedRead;
519// 14.2. Vector Widening Integer Reduction Instructions
520def ReadVIWRedV       : SchedRead;
521def ReadVIWRedV0      : SchedRead;
522// 14.3. Vector Single-Width Floating-Point Reduction Instructions
523def ReadVFRedV        : SchedRead;
524def ReadVFRedV0       : SchedRead;
525def ReadVFRedOV       : SchedRead;
526def ReadVFRedOV0      : SchedRead;
527// 14.4. Vector Widening Floating-Point Reduction Instructions
528def ReadVFWRedV       : SchedRead;
529def ReadVFWRedV0      : SchedRead;
530def ReadVFWRedOV      : SchedRead;
531def ReadVFWRedOV0     : SchedRead;
532
533// 15. Vector Mask Instructions
534// 15.1. Vector Mask-Register Logical Instructions
535defm "" : LMULSchedReads<"ReadVMALUV">;
536// 15.2. Vector Mask Population Count
537defm "" : LMULSchedReads<"ReadVMPopV">;
538// 15.3. Vector Find-First-Set Mask Bit
539defm "" : LMULSchedReads<"ReadVMFFSV">;
540// 15.4. Vector Set-Before-First Mask Bit
541// 15.5. Vector Set-Including-First Mask Bit
542// 15.6. Vector Set-only-First Mask Bit
543defm "" : LMULSchedReads<"ReadVMSFSV">;
544// 15.8. Vector Iota Instruction
545defm "" : LMULSchedReads<"ReadVMIotV">;
546
547// 16. Vector Permutation Instructions
548// 16.1. Integer Scalar Move Instructions
549defm "" : LMULSchedReads<"ReadVIMovVX">;
550defm "" : LMULSchedReads<"ReadVIMovXV">;
551defm "" : LMULSchedReads<"ReadVIMovXX">;
552// 16.2. Floating-Point Scalar Move Instructions
553defm "" : LMULSchedReads<"ReadVFMovVF">;
554defm "" : LMULSchedReads<"ReadVFMovFV">;
555defm "" : LMULSchedReads<"ReadVFMovFX">;
556// 16.3. Vector Slide Instructions
557defm "" : LMULSchedReads<"ReadVISlideV">;
558defm "" : LMULSchedReads<"ReadVISlideX">;
559defm "" : LMULSchedReads<"ReadVFSlideV">;
560defm "" : LMULSchedReads<"ReadVFSlideF">;
561// 16.4. Vector Register Gather Instructions
562defm "" : LMULSchedReads<"ReadVGatherV">;
563defm "" : LMULSchedReads<"ReadVGatherX">;
564// 16.5. Vector Compress Instruction
565defm "" : LMULSchedReads<"ReadVCompressV">;
566// 16.6. Whole Vector Register Move
567// These are already LMUL aware
568def ReadVMov1V        : SchedRead;
569def ReadVMov2V        : SchedRead;
570def ReadVMov4V        : SchedRead;
571def ReadVMov8V        : SchedRead;
572
573// Others
574def ReadVMask         : SchedRead;
575
576//===----------------------------------------------------------------------===//
577/// Define default scheduler resources for V.
578
579multiclass UnsupportedSchedV {
580let Unsupported = true in {
581
582// 3.6 Vector Byte Length vlenb
583def : WriteRes<WriteRdVLENB, []>;
584
585// 6. Configuration-Setting Instructions
586def : WriteRes<WriteVSETVLI, []>;
587def : WriteRes<WriteVSETIVLI, []>;
588def : WriteRes<WriteVSETVL, []>;
589
590// 7. Vector Loads and Stores
591defm "" : LMULWriteRes<"WriteVLDE", []>;
592defm "" : LMULWriteRes<"WriteVSTE", []>;
593defm "" : LMULWriteRes<"WriteVLDM", []>;
594defm "" : LMULWriteRes<"WriteVSTM", []>;
595defm "" : LMULWriteRes<"WriteVLDS8", []>;
596defm "" : LMULWriteRes<"WriteVLDS16", []>;
597defm "" : LMULWriteRes<"WriteVLDS32", []>;
598defm "" : LMULWriteRes<"WriteVLDS64", []>;
599defm "" : LMULWriteRes<"WriteVSTS8", []>;
600defm "" : LMULWriteRes<"WriteVSTS16", []>;
601defm "" : LMULWriteRes<"WriteVSTS32", []>;
602defm "" : LMULWriteRes<"WriteVSTS64", []>;
603defm "" : LMULWriteRes<"WriteVLDUX8", []>;
604defm "" : LMULWriteRes<"WriteVLDUX16", []>;
605defm "" : LMULWriteRes<"WriteVLDUX32", []>;
606defm "" : LMULWriteRes<"WriteVLDUX64", []>;
607defm "" : LMULWriteRes<"WriteVLDOX8", []>;
608defm "" : LMULWriteRes<"WriteVLDOX16", []>;
609defm "" : LMULWriteRes<"WriteVLDOX32", []>;
610defm "" : LMULWriteRes<"WriteVLDOX64", []>;
611defm "" : LMULWriteRes<"WriteVSTUX8", []>;
612defm "" : LMULWriteRes<"WriteVSTUX16", []>;
613defm "" : LMULWriteRes<"WriteVSTUX32", []>;
614defm "" : LMULWriteRes<"WriteVSTUX64", []>;
615defm "" : LMULWriteRes<"WriteVSTOX8", []>;
616defm "" : LMULWriteRes<"WriteVSTOX16", []>;
617defm "" : LMULWriteRes<"WriteVSTOX32", []>;
618defm "" : LMULWriteRes<"WriteVSTOX64", []>;
619defm "" : LMULWriteRes<"WriteVLDFF", []>;
620// These are already LMUL aware
621def : WriteRes<WriteVLD1R, []>;
622def : WriteRes<WriteVLD2R, []>;
623def : WriteRes<WriteVLD4R, []>;
624def : WriteRes<WriteVLD8R, []>;
625def : WriteRes<WriteVST1R, []>;
626def : WriteRes<WriteVST2R, []>;
627def : WriteRes<WriteVST4R, []>;
628def : WriteRes<WriteVST8R, []>;
629// Vector Segment Loads and Stores
630foreach nf=2-8 in {
631  foreach eew = [8, 16, 32, 64] in {
632    defm "" : LMULWriteRes <"WriteVLSEG" # nf # "e" # eew, []>;
633    defm "" : LMULWriteRes <"WriteVLSEGFF" # nf # "e" # eew, []>;
634    defm "" : LMULWriteRes <"WriteVSSEG" # nf # "e" # eew, []>;
635    defm "" : LMULWriteRes <"WriteVLSSEG" # nf # "e" # eew, []>;
636    defm "" : LMULWriteRes <"WriteVSSSEG" # nf # "e" # eew, []>;
637    defm "" : LMULWriteRes <"WriteVLUXSEG" # nf # "e" # eew, []>;
638    defm "" : LMULWriteRes <"WriteVLOXSEG" # nf # "e" # eew, []>;
639    defm "" : LMULWriteRes <"WriteVSUXSEG" # nf # "e" # eew, []>;
640    defm "" : LMULWriteRes <"WriteVSOXSEG" # nf # "e" # eew, []>;
641  }
642}
643
644// 11. Vector Integer Arithmetic Instructions
645defm "" : LMULWriteRes<"WriteVIALUV", []>;
646defm "" : LMULWriteRes<"WriteVIALUX", []>;
647defm "" : LMULWriteRes<"WriteVIALUI", []>;
648defm "" : LMULWriteResW<"WriteVIWALUV", []>;
649defm "" : LMULWriteResW<"WriteVIWALUX", []>;
650defm "" : LMULWriteResW<"WriteVIWALUI", []>;
651defm "" : LMULWriteRes<"WriteVExtV", []>;
652defm "" : LMULWriteRes<"WriteVICALUV", []>;
653defm "" : LMULWriteRes<"WriteVICALUX", []>;
654defm "" : LMULWriteRes<"WriteVICALUI", []>;
655defm "" : LMULWriteRes<"WriteVShiftV", []>;
656defm "" : LMULWriteRes<"WriteVShiftX", []>;
657defm "" : LMULWriteRes<"WriteVShiftI", []>;
658defm "" : LMULWriteResW<"WriteVNShiftV", []>;
659defm "" : LMULWriteResW<"WriteVNShiftX", []>;
660defm "" : LMULWriteResW<"WriteVNShiftI", []>;
661defm "" : LMULWriteRes<"WriteVICmpV", []>;
662defm "" : LMULWriteRes<"WriteVICmpX", []>;
663defm "" : LMULWriteRes<"WriteVICmpI", []>;
664defm "" : LMULWriteRes<"WriteVIMulV", []>;
665defm "" : LMULWriteRes<"WriteVIMulX", []>;
666defm "" : LMULWriteRes<"WriteVIDivV", []>;
667defm "" : LMULWriteRes<"WriteVIDivX", []>;
668defm "" : LMULWriteResW<"WriteVIWMulV", []>;
669defm "" : LMULWriteResW<"WriteVIWMulX", []>;
670defm "" : LMULWriteRes<"WriteVIMulAddV", []>;
671defm "" : LMULWriteRes<"WriteVIMulAddX", []>;
672defm "" : LMULWriteResW<"WriteVIWMulAddV", []>;
673defm "" : LMULWriteResW<"WriteVIWMulAddX", []>;
674defm "" : LMULWriteRes<"WriteVIMergeV", []>;
675defm "" : LMULWriteRes<"WriteVIMergeX", []>;
676defm "" : LMULWriteRes<"WriteVIMergeI", []>;
677defm "" : LMULWriteRes<"WriteVIMovV", []>;
678defm "" : LMULWriteRes<"WriteVIMovX", []>;
679defm "" : LMULWriteRes<"WriteVIMovI", []>;
680
681// 12. Vector Fixed-Point Arithmetic Instructions
682defm "" : LMULWriteRes<"WriteVSALUV", []>;
683defm "" : LMULWriteRes<"WriteVSALUX", []>;
684defm "" : LMULWriteRes<"WriteVSALUI", []>;
685defm "" : LMULWriteRes<"WriteVAALUV", []>;
686defm "" : LMULWriteRes<"WriteVAALUX", []>;
687defm "" : LMULWriteRes<"WriteVSMulV", []>;
688defm "" : LMULWriteRes<"WriteVSMulX", []>;
689defm "" : LMULWriteRes<"WriteVSShiftV", []>;
690defm "" : LMULWriteRes<"WriteVSShiftX", []>;
691defm "" : LMULWriteRes<"WriteVSShiftI", []>;
692defm "" : LMULWriteResW<"WriteVNClipV", []>;
693defm "" : LMULWriteResW<"WriteVNClipX", []>;
694defm "" : LMULWriteResW<"WriteVNClipI", []>;
695
696// 13. Vector Floating-Point Instructions
697defm "" : LMULWriteRes<"WriteVFALUV", []>;
698defm "" : LMULWriteRes<"WriteVFALUF", []>;
699defm "" : LMULWriteResFW<"WriteVFWALUV", []>;
700defm "" : LMULWriteResFW<"WriteVFWALUF", []>;
701defm "" : LMULWriteRes<"WriteVFMulV", []>;
702defm "" : LMULWriteRes<"WriteVFMulF", []>;
703defm "" : LMULWriteRes<"WriteVFDivV", []>;
704defm "" : LMULWriteRes<"WriteVFDivF", []>;
705defm "" : LMULWriteResFW<"WriteVFWMulV", []>;
706defm "" : LMULWriteResFW<"WriteVFWMulF", []>;
707defm "" : LMULWriteRes<"WriteVFMulAddV", []>;
708defm "" : LMULWriteRes<"WriteVFMulAddF", []>;
709defm "" : LMULWriteResFW<"WriteVFWMulAddV", []>;
710defm "" : LMULWriteResFW<"WriteVFWMulAddF", []>;
711defm "" : LMULWriteRes<"WriteVFSqrtV", []>;
712defm "" : LMULWriteRes<"WriteVFRecpV", []>;
713defm "" : LMULWriteRes<"WriteVFCmpV", []>;
714defm "" : LMULWriteRes<"WriteVFCmpF", []>;
715defm "" : LMULWriteRes<"WriteVFSgnjV", []>;
716defm "" : LMULWriteRes<"WriteVFSgnjF", []>;
717defm "" : LMULWriteRes<"WriteVFClassV", []>;
718defm "" : LMULWriteRes<"WriteVFMergeV", []>;
719defm "" : LMULWriteRes<"WriteVFMovV", []>;
720defm "" : LMULWriteRes<"WriteVFCvtIToFV", []>;
721defm "" : LMULWriteRes<"WriteVFCvtFToIV", []>;
722defm "" : LMULWriteResW<"WriteVFWCvtIToFV", []>;
723defm "" : LMULWriteResFW<"WriteVFWCvtFToIV", []>;
724defm "" : LMULWriteResFW<"WriteVFWCvtFToFV", []>;
725defm "" : LMULWriteResFW<"WriteVFNCvtIToFV", []>;
726defm "" : LMULWriteResW<"WriteVFNCvtFToIV", []>;
727defm "" : LMULWriteResFW<"WriteVFNCvtFToFV", []>;
728
729// 14. Vector Reduction Operations
730def : WriteRes<WriteVIRedV, []>;
731def : WriteRes<WriteVIWRedV, []>;
732def : WriteRes<WriteVFRedV, []>;
733def : WriteRes<WriteVFRedOV, []>;
734def : WriteRes<WriteVFWRedV, []>;
735def : WriteRes<WriteVFWRedOV, []>;
736
737// 15. Vector Mask Instructions
738defm "" : LMULWriteRes<"WriteVMALUV", []>;
739defm "" : LMULWriteRes<"WriteVMPopV", []>;
740defm "" : LMULWriteRes<"WriteVMFFSV", []>;
741defm "" : LMULWriteRes<"WriteVMSFSV", []>;
742defm "" : LMULWriteRes<"WriteVMIotV", []>;
743defm "" : LMULWriteRes<"WriteVMIdxV", []>;
744
745// 16. Vector Permutation Instructions
746defm "" : LMULWriteRes<"WriteVIMovVX", []>;
747defm "" : LMULWriteRes<"WriteVIMovXV", []>;
748defm "" : LMULWriteRes<"WriteVFMovVF", []>;
749defm "" : LMULWriteRes<"WriteVFMovFV", []>;
750defm "" : LMULWriteRes<"WriteVISlideX", []>;
751defm "" : LMULWriteRes<"WriteVISlideI", []>;
752defm "" : LMULWriteRes<"WriteVISlide1X", []>;
753defm "" : LMULWriteRes<"WriteVFSlide1F", []>;
754defm "" : LMULWriteRes<"WriteVGatherV", []>;
755defm "" : LMULWriteRes<"WriteVGatherX", []>;
756defm "" : LMULWriteRes<"WriteVGatherI", []>;
757defm "" : LMULWriteRes<"WriteVCompressV", []>;
758// These are already LMUL aware
759def : WriteRes<WriteVMov1V, []>;
760def : WriteRes<WriteVMov2V, []>;
761def : WriteRes<WriteVMov4V, []>;
762def : WriteRes<WriteVMov8V, []>;
763
764// 6. Configuration-Setting Instructions
765def : ReadAdvance<ReadVSETVLI, 0>;
766def : ReadAdvance<ReadVSETVL, 0>;
767
768// 7. Vector Loads and Stores
769defm "" : LMULReadAdvance<"ReadVLDX", 0>;
770defm "" : LMULReadAdvance<"ReadVSTX", 0>;
771defm "" : LMULReadAdvance<"ReadVSTEV", 0>;
772defm "" : LMULReadAdvance<"ReadVSTM", 0>;
773defm "" : LMULReadAdvance<"ReadVLDSX", 0>;
774defm "" : LMULReadAdvance<"ReadVSTSX", 0>;
775defm "" : LMULReadAdvance<"ReadVSTS8V", 0>;
776defm "" : LMULReadAdvance<"ReadVSTS16V", 0>;
777defm "" : LMULReadAdvance<"ReadVSTS32V", 0>;
778defm "" : LMULReadAdvance<"ReadVSTS64V", 0>;
779defm "" : LMULReadAdvance<"ReadVLDUXV", 0>;
780defm "" : LMULReadAdvance<"ReadVLDOXV", 0>;
781defm "" : LMULReadAdvance<"ReadVSTUXV", 0>;
782defm "" : LMULReadAdvance<"ReadVSTUX8", 0>;
783defm "" : LMULReadAdvance<"ReadVSTUX16", 0>;
784defm "" : LMULReadAdvance<"ReadVSTUX32", 0>;
785defm "" : LMULReadAdvance<"ReadVSTUX64", 0>;
786defm "" : LMULReadAdvance<"ReadVSTUX8V", 0>;
787defm "" : LMULReadAdvance<"ReadVSTUX16V", 0>;
788defm "" : LMULReadAdvance<"ReadVSTUX32V", 0>;
789defm "" : LMULReadAdvance<"ReadVSTUX64V", 0>;
790defm "" : LMULReadAdvance<"ReadVSTOX8", 0>;
791defm "" : LMULReadAdvance<"ReadVSTOX16", 0>;
792defm "" : LMULReadAdvance<"ReadVSTOX32", 0>;
793defm "" : LMULReadAdvance<"ReadVSTOX64", 0>;
794defm "" : LMULReadAdvance<"ReadVSTOXV", 0>;
795defm "" : LMULReadAdvance<"ReadVSTOX8V", 0>;
796defm "" : LMULReadAdvance<"ReadVSTOX16V", 0>;
797defm "" : LMULReadAdvance<"ReadVSTOX32V", 0>;
798defm "" : LMULReadAdvance<"ReadVSTOX64V", 0>;
799// These are already LMUL aware
800def : ReadAdvance<ReadVST1R, 0>;
801def : ReadAdvance<ReadVST2R, 0>;
802def : ReadAdvance<ReadVST4R, 0>;
803def : ReadAdvance<ReadVST8R, 0>;
804
805// 11. Vector Integer Arithmetic Instructions
806defm "" : LMULReadAdvance<"ReadVIALUV", 0>;
807defm "" : LMULReadAdvance<"ReadVIALUX", 0>;
808defm "" : LMULReadAdvanceW<"ReadVIWALUV", 0>;
809defm "" : LMULReadAdvanceW<"ReadVIWALUX", 0>;
810defm "" : LMULReadAdvance<"ReadVExtV", 0>;
811defm "" : LMULReadAdvance<"ReadVICALUV", 0>;
812defm "" : LMULReadAdvance<"ReadVICALUX", 0>;
813defm "" : LMULReadAdvance<"ReadVShiftV", 0>;
814defm "" : LMULReadAdvance<"ReadVShiftX", 0>;
815defm "" : LMULReadAdvanceW<"ReadVNShiftV", 0>;
816defm "" : LMULReadAdvanceW<"ReadVNShiftX", 0>;
817defm "" : LMULReadAdvance<"ReadVICmpV", 0>;
818defm "" : LMULReadAdvance<"ReadVICmpX", 0>;
819defm "" : LMULReadAdvance<"ReadVIMulV", 0>;
820defm "" : LMULReadAdvance<"ReadVIMulX", 0>;
821defm "" : LMULReadAdvance<"ReadVIDivV", 0>;
822defm "" : LMULReadAdvance<"ReadVIDivX", 0>;
823defm "" : LMULReadAdvanceW<"ReadVIWMulV", 0>;
824defm "" : LMULReadAdvanceW<"ReadVIWMulX", 0>;
825defm "" : LMULReadAdvance<"ReadVIMulAddV", 0>;
826defm "" : LMULReadAdvance<"ReadVIMulAddX", 0>;
827defm "" : LMULReadAdvanceW<"ReadVIWMulAddV", 0>;
828defm "" : LMULReadAdvanceW<"ReadVIWMulAddX", 0>;
829defm "" : LMULReadAdvance<"ReadVIMergeV", 0>;
830defm "" : LMULReadAdvance<"ReadVIMergeX", 0>;
831defm "" : LMULReadAdvance<"ReadVIMovV", 0>;
832defm "" : LMULReadAdvance<"ReadVIMovX", 0>;
833
834// 12. Vector Fixed-Point Arithmetic Instructions
835defm "" : LMULReadAdvance<"ReadVSALUV", 0>;
836defm "" : LMULReadAdvance<"ReadVSALUX", 0>;
837defm "" : LMULReadAdvance<"ReadVAALUV", 0>;
838defm "" : LMULReadAdvance<"ReadVAALUX", 0>;
839defm "" : LMULReadAdvance<"ReadVSMulV", 0>;
840defm "" : LMULReadAdvance<"ReadVSMulX", 0>;
841defm "" : LMULReadAdvance<"ReadVSShiftV", 0>;
842defm "" : LMULReadAdvance<"ReadVSShiftX", 0>;
843defm "" : LMULReadAdvanceW<"ReadVNClipV", 0>;
844defm "" : LMULReadAdvanceW<"ReadVNClipX", 0>;
845
846// 13. Vector Floating-Point Instructions
847defm "" : LMULReadAdvance<"ReadVFALUV", 0>;
848defm "" : LMULReadAdvance<"ReadVFALUF", 0>;
849defm "" : LMULReadAdvanceFW<"ReadVFWALUV", 0>;
850defm "" : LMULReadAdvanceFW<"ReadVFWALUF", 0>;
851defm "" : LMULReadAdvance<"ReadVFMulV", 0>;
852defm "" : LMULReadAdvance<"ReadVFMulF", 0>;
853defm "" : LMULReadAdvance<"ReadVFDivV", 0>;
854defm "" : LMULReadAdvance<"ReadVFDivF", 0>;
855defm "" : LMULReadAdvanceFW<"ReadVFWMulV", 0>;
856defm "" : LMULReadAdvanceFW<"ReadVFWMulF", 0>;
857defm "" : LMULReadAdvance<"ReadVFMulAddV", 0>;
858defm "" : LMULReadAdvance<"ReadVFMulAddF", 0>;
859defm "" : LMULReadAdvanceFW<"ReadVFWMulAddV", 0>;
860defm "" : LMULReadAdvanceFW<"ReadVFWMulAddF", 0>;
861defm "" : LMULReadAdvance<"ReadVFSqrtV", 0>;
862defm "" : LMULReadAdvance<"ReadVFRecpV", 0>;
863defm "" : LMULReadAdvance<"ReadVFCmpV", 0>;
864defm "" : LMULReadAdvance<"ReadVFCmpF", 0>;
865defm "" : LMULReadAdvance<"ReadVFSgnjV", 0>;
866defm "" : LMULReadAdvance<"ReadVFSgnjF", 0>;
867defm "" : LMULReadAdvance<"ReadVFClassV", 0>;
868defm "" : LMULReadAdvance<"ReadVFMergeV", 0>;
869defm "" : LMULReadAdvance<"ReadVFMergeF", 0>;
870defm "" : LMULReadAdvance<"ReadVFMovF", 0>;
871defm "" : LMULReadAdvance<"ReadVFCvtIToFV", 0>;
872defm "" : LMULReadAdvance<"ReadVFCvtFToIV", 0>;
873defm "" : LMULReadAdvanceW<"ReadVFWCvtIToFV", 0>;
874defm "" : LMULReadAdvanceFW<"ReadVFWCvtFToIV", 0>;
875defm "" : LMULReadAdvanceFW<"ReadVFWCvtFToFV", 0>;
876defm "" : LMULReadAdvanceFW<"ReadVFNCvtIToFV", 0>;
877defm "" : LMULReadAdvanceW<"ReadVFNCvtFToIV", 0>;
878defm "" : LMULReadAdvanceFW<"ReadVFNCvtFToFV", 0>;
879
880// 14. Vector Reduction Operations
881def : ReadAdvance<ReadVIRedV, 0>;
882def : ReadAdvance<ReadVIRedV0, 0>;
883def : ReadAdvance<ReadVIWRedV, 0>;
884def : ReadAdvance<ReadVIWRedV0, 0>;
885def : ReadAdvance<ReadVFRedV, 0>;
886def : ReadAdvance<ReadVFRedV0, 0>;
887def : ReadAdvance<ReadVFRedOV, 0>;
888def : ReadAdvance<ReadVFRedOV0, 0>;
889def : ReadAdvance<ReadVFWRedV, 0>;
890def : ReadAdvance<ReadVFWRedV0, 0>;
891def : ReadAdvance<ReadVFWRedOV, 0>;
892def : ReadAdvance<ReadVFWRedOV0, 0>;
893
894// 15. Vector Mask Instructions
895defm "" : LMULReadAdvance<"ReadVMALUV", 0>;
896defm "" : LMULReadAdvance<"ReadVMPopV", 0>;
897defm "" : LMULReadAdvance<"ReadVMFFSV", 0>;
898defm "" : LMULReadAdvance<"ReadVMSFSV", 0>;
899defm "" : LMULReadAdvance<"ReadVMIotV", 0>;
900
901// 16. Vector Permutation Instructions
902defm "" : LMULReadAdvance<"ReadVIMovVX", 0>;
903defm "" : LMULReadAdvance<"ReadVIMovXV", 0>;
904defm "" : LMULReadAdvance<"ReadVIMovXX", 0>;
905defm "" : LMULReadAdvance<"ReadVFMovVF", 0>;
906defm "" : LMULReadAdvance<"ReadVFMovFV", 0>;
907defm "" : LMULReadAdvance<"ReadVFMovFX", 0>;
908defm "" : LMULReadAdvance<"ReadVISlideV", 0>;
909defm "" : LMULReadAdvance<"ReadVISlideX", 0>;
910defm "" : LMULReadAdvance<"ReadVFSlideV", 0>;
911defm "" : LMULReadAdvance<"ReadVFSlideF", 0>;
912defm "" : LMULReadAdvance<"ReadVGatherV", 0>;
913defm "" : LMULReadAdvance<"ReadVGatherX", 0>;
914defm "" : LMULReadAdvance<"ReadVCompressV", 0>;
915// These are already LMUL aware
916def : ReadAdvance<ReadVMov1V, 0>;
917def : ReadAdvance<ReadVMov2V, 0>;
918def : ReadAdvance<ReadVMov4V, 0>;
919def : ReadAdvance<ReadVMov8V, 0>;
920
921// Others
922def : ReadAdvance<ReadVMask, 0>;
923
924} // Unsupported
925} // UnsupportedSchedV
926