xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1*0fca6ea1SDimitry Andric//==- RISCVSchedSiFiveP600.td - SiFiveP600 Scheduling Defs ---*- tablegen -*-=//
2*0fca6ea1SDimitry Andric//
3*0fca6ea1SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0fca6ea1SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5*0fca6ea1SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0fca6ea1SDimitry Andric//
7*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
8*0fca6ea1SDimitry Andric
9*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
10*0fca6ea1SDimitry Andric
11*0fca6ea1SDimitry Andric/// c is true if mx has the worst case behavior compared to LMULs in MxList.
12*0fca6ea1SDimitry Andric/// On the SiFiveP600, the worst case LMUL is the Largest LMUL
13*0fca6ea1SDimitry Andric/// and the worst case sew is the smallest SEW for that LMUL.
14*0fca6ea1SDimitry Andricclass SiFiveP600IsWorstCaseMX<string mx, list<string> MxList> {
15*0fca6ea1SDimitry Andric  string LLMUL = LargestLMUL<MxList>.r;
16*0fca6ea1SDimitry Andric  bit c = !eq(mx, LLMUL);
17*0fca6ea1SDimitry Andric}
18*0fca6ea1SDimitry Andric
19*0fca6ea1SDimitry Andricclass SiFiveP600IsWorstCaseMXSEW<string mx, int sew, list<string> MxList, bit isF = 0> {
20*0fca6ea1SDimitry Andric  string LLMUL = LargestLMUL<MxList>.r;
21*0fca6ea1SDimitry Andric  int SSEW = SmallestSEW<mx, isF>.r;
22*0fca6ea1SDimitry Andric  bit c = !and(!eq(mx, LLMUL), !eq(sew, SSEW));
23*0fca6ea1SDimitry Andric}
24*0fca6ea1SDimitry Andric
25*0fca6ea1SDimitry Andric// 1 Micro-Op per cycle.
26*0fca6ea1SDimitry Andricclass SiFiveP600GetLMulCycles<string mx> {
27*0fca6ea1SDimitry Andric  int c = !cond(
28*0fca6ea1SDimitry Andric    !eq(mx, "M1") : 1,
29*0fca6ea1SDimitry Andric    !eq(mx, "M2") : 2,
30*0fca6ea1SDimitry Andric    !eq(mx, "M4") : 4,
31*0fca6ea1SDimitry Andric    !eq(mx, "M8") : 8,
32*0fca6ea1SDimitry Andric    !eq(mx, "MF2") : 1,
33*0fca6ea1SDimitry Andric    !eq(mx, "MF4") : 1,
34*0fca6ea1SDimitry Andric    !eq(mx, "MF8") : 1
35*0fca6ea1SDimitry Andric  );
36*0fca6ea1SDimitry Andric}
37*0fca6ea1SDimitry Andric
38*0fca6ea1SDimitry Andric// Latency for segmented loads and stores are calculated as vl * nf.
39*0fca6ea1SDimitry Andricclass SiFiveP600GetCyclesSegmented<string mx, int sew, int nf> {
40*0fca6ea1SDimitry Andric  defvar VLEN = 128;
41*0fca6ea1SDimitry Andric  defvar VLUpperBound = !cond(
42*0fca6ea1SDimitry Andric    !eq(mx, "M1") : !div(VLEN, sew),
43*0fca6ea1SDimitry Andric    !eq(mx, "M2") : !div(!mul(VLEN, 2), sew),
44*0fca6ea1SDimitry Andric    !eq(mx, "M4") : !div(!mul(VLEN, 4), sew),
45*0fca6ea1SDimitry Andric    !eq(mx, "M8") : !div(!mul(VLEN, 8), sew),
46*0fca6ea1SDimitry Andric    !eq(mx, "MF2") : !div(!div(VLEN, 2), sew),
47*0fca6ea1SDimitry Andric    !eq(mx, "MF4") : !div(!div(VLEN, 4), sew),
48*0fca6ea1SDimitry Andric    !eq(mx, "MF8") : !div(!div(VLEN, 8), sew),
49*0fca6ea1SDimitry Andric  );
50*0fca6ea1SDimitry Andric  int c = !mul(VLUpperBound, nf);
51*0fca6ea1SDimitry Andric}
52*0fca6ea1SDimitry Andric
53*0fca6ea1SDimitry Andric// SiFiveP600 machine model for scheduling and other instruction cost heuristics.
54*0fca6ea1SDimitry Andricdef SiFiveP600Model : SchedMachineModel {
55*0fca6ea1SDimitry Andric  let IssueWidth = 4;         // 4 micro-ops are dispatched per cycle.
56*0fca6ea1SDimitry Andric  let MicroOpBufferSize = 160; // Max micro-ops that can be buffered.
57*0fca6ea1SDimitry Andric  let LoadLatency = 4;        // Cycles for loads to access the cache.
58*0fca6ea1SDimitry Andric  let MispredictPenalty = 9;  // Extra cycles for a mispredicted branch.
59*0fca6ea1SDimitry Andric  let UnsupportedFeatures = [HasStdExtZbkb, HasStdExtZbkc, HasStdExtZbkx,
60*0fca6ea1SDimitry Andric                             HasStdExtZknd, HasStdExtZkne, HasStdExtZknh,
61*0fca6ea1SDimitry Andric                             HasStdExtZksed, HasStdExtZksh, HasStdExtZkr,
62*0fca6ea1SDimitry Andric                             HasVendorXSfvqmaccqoq];
63*0fca6ea1SDimitry Andric  let CompleteModel = false;
64*0fca6ea1SDimitry Andric}
65*0fca6ea1SDimitry Andric
66*0fca6ea1SDimitry Andriclet SchedModel = SiFiveP600Model in {
67*0fca6ea1SDimitry Andric
68*0fca6ea1SDimitry Andricdef SiFiveP600IEXQ0       : ProcResource<1>;
69*0fca6ea1SDimitry Andricdef SiFiveP600IEXQ1       : ProcResource<1>;
70*0fca6ea1SDimitry Andricdef SiFiveP600IEXQ2       : ProcResource<1>;
71*0fca6ea1SDimitry Andricdef SiFiveP600IEXQ3       : ProcResource<1>;
72*0fca6ea1SDimitry Andricdef SiFiveP600FEXQ0       : ProcResource<1>;
73*0fca6ea1SDimitry Andricdef SiFiveP600FEXQ1       : ProcResource<1>;
74*0fca6ea1SDimitry Andric
75*0fca6ea1SDimitry Andric// Two Load/Store ports that can issue either two loads, two stores, or one load
76*0fca6ea1SDimitry Andric// and one store (P550 has one load and one separate store pipe).
77*0fca6ea1SDimitry Andricdef SiFiveP600LDST       : ProcResource<2>;
78*0fca6ea1SDimitry Andric
79*0fca6ea1SDimitry Andric// 4-wide pipeline with 4 ALU pipes.
80*0fca6ea1SDimitry Andricdef SiFiveP600IntArith    : ProcResGroup<[SiFiveP600IEXQ0, SiFiveP600IEXQ1, SiFiveP600IEXQ2, SiFiveP600IEXQ3]>;
81*0fca6ea1SDimitry Andricdefvar SiFiveP600SYS      = SiFiveP600IEXQ0;
82*0fca6ea1SDimitry Andricdefvar SiFiveP600CMOV     = SiFiveP600IEXQ0;
83*0fca6ea1SDimitry Andricdefvar SiFiveP600MulI2F   = SiFiveP600IEXQ1;
84*0fca6ea1SDimitry Andricdef SiFiveP600Branch      : ProcResGroup<[SiFiveP600IEXQ2, SiFiveP600IEXQ3]>;
85*0fca6ea1SDimitry Andricdef SiFiveP600Div         : ProcResource<1>;
86*0fca6ea1SDimitry Andric
87*0fca6ea1SDimitry Andricdef SiFiveP600FloatArith  : ProcResGroup<[SiFiveP600FEXQ0, SiFiveP600FEXQ1]>;
88*0fca6ea1SDimitry Andricdefvar SiFiveP600F2I      = SiFiveP600FEXQ0;
89*0fca6ea1SDimitry Andricdef SiFiveP600FloatDiv    : ProcResource<1>;
90*0fca6ea1SDimitry Andric
91*0fca6ea1SDimitry Andric// Vector pipeline
92*0fca6ea1SDimitry Andric// VEXQ0 handle Mask, Simple Slide instructions,
93*0fca6ea1SDimitry Andric// VEXQ1 handle Complex Slide, Permutation, Reductions, Divide instructions.
94*0fca6ea1SDimitry Andric// Other vector instructions can be done in VEXQ0 and VEXQ1.
95*0fca6ea1SDimitry Andricdef SiFiveP600VEXQ0        : ProcResource<1>;
96*0fca6ea1SDimitry Andricdef SiFiveP600VEXQ1        : ProcResource<1>;
97*0fca6ea1SDimitry Andricdef SiFiveP600VectorArith  : ProcResGroup<[SiFiveP600VEXQ0, SiFiveP600VEXQ1]>;
98*0fca6ea1SDimitry Andricdef SiFiveP600VLD          : ProcResource<1>;
99*0fca6ea1SDimitry Andricdef SiFiveP600VST          : ProcResource<1>;
100*0fca6ea1SDimitry Andricdef SiFiveP600VDiv         : ProcResource<1>;
101*0fca6ea1SDimitry Andricdef SiFiveP600VFloatDiv    : ProcResource<1>;
102*0fca6ea1SDimitry Andric
103*0fca6ea1SDimitry Andric// Integer arithmetic and logic
104*0fca6ea1SDimitry Andricdef : WriteRes<WriteIALU, [SiFiveP600IntArith]>;
105*0fca6ea1SDimitry Andricdef : WriteRes<WriteIALU32, [SiFiveP600IntArith]>;
106*0fca6ea1SDimitry Andricdef : WriteRes<WriteShiftImm, [SiFiveP600IntArith]>;
107*0fca6ea1SDimitry Andricdef : WriteRes<WriteShiftImm32, [SiFiveP600IntArith]>;
108*0fca6ea1SDimitry Andricdef : WriteRes<WriteShiftReg, [SiFiveP600IntArith]>;
109*0fca6ea1SDimitry Andricdef : WriteRes<WriteShiftReg32, [SiFiveP600IntArith]>;
110*0fca6ea1SDimitry Andric// Branching
111*0fca6ea1SDimitry Andricdef : WriteRes<WriteJmp, [SiFiveP600Branch]>;
112*0fca6ea1SDimitry Andricdef : WriteRes<WriteJal, [SiFiveP600Branch]>;
113*0fca6ea1SDimitry Andricdef : WriteRes<WriteJalr, [SiFiveP600Branch]>;
114*0fca6ea1SDimitry Andric
115*0fca6ea1SDimitry Andric// CMOV
116*0fca6ea1SDimitry Andricdef P600WriteCMOV : SchedWriteRes<[SiFiveP600Branch, SiFiveP600CMOV]> {
117*0fca6ea1SDimitry Andric  let Latency = 2;
118*0fca6ea1SDimitry Andric  let NumMicroOps = 2;
119*0fca6ea1SDimitry Andric}
120*0fca6ea1SDimitry Andricdef : InstRW<[P600WriteCMOV], (instrs PseudoCCMOVGPRNoX0)>;
121*0fca6ea1SDimitry Andric
122*0fca6ea1SDimitry Andriclet Latency = 3 in {
123*0fca6ea1SDimitry Andric// Integer multiplication
124*0fca6ea1SDimitry Andricdef : WriteRes<WriteIMul, [SiFiveP600MulI2F]>;
125*0fca6ea1SDimitry Andricdef : WriteRes<WriteIMul32, [SiFiveP600MulI2F]>;
126*0fca6ea1SDimitry Andric// cpop[w] look exactly like multiply.
127*0fca6ea1SDimitry Andricdef : WriteRes<WriteCPOP, [SiFiveP600MulI2F]>;
128*0fca6ea1SDimitry Andricdef : WriteRes<WriteCPOP32, [SiFiveP600MulI2F]>;
129*0fca6ea1SDimitry Andric}
130*0fca6ea1SDimitry Andric
131*0fca6ea1SDimitry Andric// Integer division
132*0fca6ea1SDimitry Andricdef : WriteRes<WriteIDiv, [SiFiveP600MulI2F, SiFiveP600Div]> {
133*0fca6ea1SDimitry Andric  let Latency = 35;
134*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [1, 34];
135*0fca6ea1SDimitry Andric}
136*0fca6ea1SDimitry Andricdef : WriteRes<WriteIDiv32,  [SiFiveP600MulI2F, SiFiveP600Div]> {
137*0fca6ea1SDimitry Andric  let Latency = 20;
138*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [1, 19];
139*0fca6ea1SDimitry Andric}
140*0fca6ea1SDimitry Andric
141*0fca6ea1SDimitry Andric// Integer remainder
142*0fca6ea1SDimitry Andricdef : WriteRes<WriteIRem, [SiFiveP600MulI2F, SiFiveP600Div]> {
143*0fca6ea1SDimitry Andric  let Latency = 35;
144*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [1, 34];
145*0fca6ea1SDimitry Andric}
146*0fca6ea1SDimitry Andricdef : WriteRes<WriteIRem32, [SiFiveP600MulI2F, SiFiveP600Div]> {
147*0fca6ea1SDimitry Andric  let Latency = 20;
148*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [1, 19];
149*0fca6ea1SDimitry Andric}
150*0fca6ea1SDimitry Andric
151*0fca6ea1SDimitry Andric// Bitmanip
152*0fca6ea1SDimitry Andricdef : WriteRes<WriteRotateImm, [SiFiveP600IntArith]>;
153*0fca6ea1SDimitry Andricdef : WriteRes<WriteRotateImm32, [SiFiveP600IntArith]>;
154*0fca6ea1SDimitry Andricdef : WriteRes<WriteRotateReg, [SiFiveP600IntArith]>;
155*0fca6ea1SDimitry Andricdef : WriteRes<WriteRotateReg32, [SiFiveP600IntArith]>;
156*0fca6ea1SDimitry Andric
157*0fca6ea1SDimitry Andricdef : WriteRes<WriteCLZ, [SiFiveP600IntArith]>;
158*0fca6ea1SDimitry Andricdef : WriteRes<WriteCLZ32, [SiFiveP600IntArith]>;
159*0fca6ea1SDimitry Andricdef : WriteRes<WriteCTZ, [SiFiveP600IntArith]>;
160*0fca6ea1SDimitry Andricdef : WriteRes<WriteCTZ32, [SiFiveP600IntArith]>;
161*0fca6ea1SDimitry Andric
162*0fca6ea1SDimitry Andricdef : WriteRes<WriteORCB, [SiFiveP600IntArith]>;
163*0fca6ea1SDimitry Andricdef : WriteRes<WriteIMinMax, [SiFiveP600IntArith]>;
164*0fca6ea1SDimitry Andric
165*0fca6ea1SDimitry Andricdef : WriteRes<WriteREV8, [SiFiveP600IntArith]>;
166*0fca6ea1SDimitry Andric
167*0fca6ea1SDimitry Andricdef : WriteRes<WriteSHXADD, [SiFiveP600IntArith]>;
168*0fca6ea1SDimitry Andricdef : WriteRes<WriteSHXADD32, [SiFiveP600IntArith]>;
169*0fca6ea1SDimitry Andric
170*0fca6ea1SDimitry Andricdef : WriteRes<WriteSingleBit, [SiFiveP600IntArith]>;
171*0fca6ea1SDimitry Andricdef : WriteRes<WriteSingleBitImm, [SiFiveP600IntArith]>;
172*0fca6ea1SDimitry Andricdef : WriteRes<WriteBEXT, [SiFiveP600IntArith]>;
173*0fca6ea1SDimitry Andricdef : WriteRes<WriteBEXTI, [SiFiveP600IntArith]>;
174*0fca6ea1SDimitry Andric
175*0fca6ea1SDimitry Andric// Memory
176*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTB, [SiFiveP600LDST]>;
177*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTH, [SiFiveP600LDST]>;
178*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTW, [SiFiveP600LDST]>;
179*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTD, [SiFiveP600LDST]>;
180*0fca6ea1SDimitry Andricdef : WriteRes<WriteFST16, [SiFiveP600LDST]>;
181*0fca6ea1SDimitry Andricdef : WriteRes<WriteFST32, [SiFiveP600LDST]>;
182*0fca6ea1SDimitry Andricdef : WriteRes<WriteFST64, [SiFiveP600LDST]>;
183*0fca6ea1SDimitry Andric
184*0fca6ea1SDimitry Andriclet Latency = 4 in {
185*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDB, [SiFiveP600LDST]>;
186*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDH, [SiFiveP600LDST]>;
187*0fca6ea1SDimitry Andric}
188*0fca6ea1SDimitry Andriclet Latency = 4 in {
189*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDW, [SiFiveP600LDST]>;
190*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDD, [SiFiveP600LDST]>;
191*0fca6ea1SDimitry Andric}
192*0fca6ea1SDimitry Andric
193*0fca6ea1SDimitry Andriclet Latency = 5 in {
194*0fca6ea1SDimitry Andricdef : WriteRes<WriteFLD16, [SiFiveP600LDST]>;
195*0fca6ea1SDimitry Andricdef : WriteRes<WriteFLD32, [SiFiveP600LDST]>;
196*0fca6ea1SDimitry Andricdef : WriteRes<WriteFLD64, [SiFiveP600LDST]>;
197*0fca6ea1SDimitry Andric}
198*0fca6ea1SDimitry Andric
199*0fca6ea1SDimitry Andric// Atomic memory
200*0fca6ea1SDimitry Andriclet Latency = 3 in {
201*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicSTW, [SiFiveP600LDST]>;
202*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicSTD, [SiFiveP600LDST]>;
203*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicW, [SiFiveP600LDST]>;
204*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicD, [SiFiveP600LDST]>;
205*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicLDW, [SiFiveP600LDST]>;
206*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicLDD, [SiFiveP600LDST]>;
207*0fca6ea1SDimitry Andric}
208*0fca6ea1SDimitry Andric
209*0fca6ea1SDimitry Andric// Floating point
210*0fca6ea1SDimitry Andriclet Latency = 2 in {
211*0fca6ea1SDimitry Andricdef : WriteRes<WriteFAdd16, [SiFiveP600FloatArith]>;
212*0fca6ea1SDimitry Andricdef : WriteRes<WriteFAdd32, [SiFiveP600FloatArith]>;
213*0fca6ea1SDimitry Andricdef : WriteRes<WriteFAdd64, [SiFiveP600FloatArith]>;
214*0fca6ea1SDimitry Andric}
215*0fca6ea1SDimitry Andriclet Latency = 3 in {
216*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMul16, [SiFiveP600FloatArith]>;
217*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMul32, [SiFiveP600FloatArith]>;
218*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMul64, [SiFiveP600FloatArith]>;
219*0fca6ea1SDimitry Andric}
220*0fca6ea1SDimitry Andriclet Latency = 4 in {
221*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMA16, [SiFiveP600FloatArith]>;
222*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMA32, [SiFiveP600FloatArith]>;
223*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMA64, [SiFiveP600FloatArith]>;
224*0fca6ea1SDimitry Andric}
225*0fca6ea1SDimitry Andric
226*0fca6ea1SDimitry Andriclet Latency = 2 in {
227*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSGNJ16, [SiFiveP600FloatArith]>;
228*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSGNJ32, [SiFiveP600FloatArith]>;
229*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSGNJ64, [SiFiveP600FloatArith]>;
230*0fca6ea1SDimitry Andric
231*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMinMax16, [SiFiveP600FloatArith]>;
232*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMinMax32, [SiFiveP600FloatArith]>;
233*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMinMax64, [SiFiveP600FloatArith]>;
234*0fca6ea1SDimitry Andric}
235*0fca6ea1SDimitry Andric
236*0fca6ea1SDimitry Andric// Half precision.
237*0fca6ea1SDimitry Andricdef : WriteRes<WriteFDiv16, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> {
238*0fca6ea1SDimitry Andric  let Latency = 4;
239*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [1, 4];
240*0fca6ea1SDimitry Andric}
241*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSqrt16, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> {
242*0fca6ea1SDimitry Andric  let Latency = 18;
243*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [1, 17];
244*0fca6ea1SDimitry Andric}
245*0fca6ea1SDimitry Andric
246*0fca6ea1SDimitry Andric// Single precision.
247*0fca6ea1SDimitry Andricdef : WriteRes<WriteFDiv32, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> {
248*0fca6ea1SDimitry Andric  let Latency = 6;
249*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [1, 6];
250*0fca6ea1SDimitry Andric}
251*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSqrt32, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> {
252*0fca6ea1SDimitry Andric  let Latency = 18;
253*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [1, 17];
254*0fca6ea1SDimitry Andric}
255*0fca6ea1SDimitry Andric
256*0fca6ea1SDimitry Andric// Double precision
257*0fca6ea1SDimitry Andricdef : WriteRes<WriteFDiv64, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> {
258*0fca6ea1SDimitry Andric  let Latency = 11;
259*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [1, 11];
260*0fca6ea1SDimitry Andric}
261*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSqrt64, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> {
262*0fca6ea1SDimitry Andric  let Latency = 33;
263*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [1, 32];
264*0fca6ea1SDimitry Andric}
265*0fca6ea1SDimitry Andric
266*0fca6ea1SDimitry Andric// Conversions
267*0fca6ea1SDimitry Andriclet Latency = 2 in {
268*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI32ToF16, [SiFiveP600MulI2F]>;
269*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI32ToF32, [SiFiveP600MulI2F]>;
270*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI32ToF64, [SiFiveP600MulI2F]>;
271*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI64ToF16, [SiFiveP600MulI2F]>;
272*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI64ToF32, [SiFiveP600MulI2F]>;
273*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI64ToF64, [SiFiveP600MulI2F]>;
274*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF16ToI32, [SiFiveP600F2I]>;
275*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF16ToI64, [SiFiveP600F2I]>;
276*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF16ToF32, [SiFiveP600FloatArith]>;
277*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF16ToF64, [SiFiveP600FloatArith]>;
278*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF32ToI32, [SiFiveP600F2I]>;
279*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF32ToI64, [SiFiveP600F2I]>;
280*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF32ToF16, [SiFiveP600FloatArith]>;
281*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF32ToF64, [SiFiveP600FloatArith]>;
282*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF64ToI32, [SiFiveP600F2I]>;
283*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF64ToI64, [SiFiveP600F2I]>;
284*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF64ToF16, [SiFiveP600FloatArith]>;
285*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF64ToF32, [SiFiveP600FloatArith]>;
286*0fca6ea1SDimitry Andric
287*0fca6ea1SDimitry Andricdef : WriteRes<WriteFClass16, [SiFiveP600F2I]>;
288*0fca6ea1SDimitry Andricdef : WriteRes<WriteFClass32, [SiFiveP600F2I]>;
289*0fca6ea1SDimitry Andricdef : WriteRes<WriteFClass64, [SiFiveP600F2I]>;
290*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCmp16, [SiFiveP600F2I]>;
291*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCmp32, [SiFiveP600F2I]>;
292*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCmp64, [SiFiveP600F2I]>;
293*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovI16ToF16, [SiFiveP600MulI2F]>;
294*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovF16ToI16, [SiFiveP600F2I]>;
295*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovI32ToF32, [SiFiveP600MulI2F]>;
296*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovF32ToI32, [SiFiveP600F2I]>;
297*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovI64ToF64, [SiFiveP600MulI2F]>;
298*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovF64ToI64, [SiFiveP600F2I]>;
299*0fca6ea1SDimitry Andric}
300*0fca6ea1SDimitry Andric
301*0fca6ea1SDimitry Andric// 6. Configuration-Setting Instructions
302*0fca6ea1SDimitry Andricdef : WriteRes<WriteVSETVLI, [SiFiveP600SYS]>;
303*0fca6ea1SDimitry Andricdef : WriteRes<WriteVSETIVLI, [SiFiveP600SYS]>;
304*0fca6ea1SDimitry Andricdef : WriteRes<WriteVSETVL, [SiFiveP600SYS]>;
305*0fca6ea1SDimitry Andric
306*0fca6ea1SDimitry Andric// 7. Vector Loads and Stores
307*0fca6ea1SDimitry Andric// FIXME: This unit is still being improved, currently
308*0fca6ea1SDimitry Andric// it is based on stage numbers. Estimates are optimistic,
309*0fca6ea1SDimitry Andric// latency may be longer.
310*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
311*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
312*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
313*0fca6ea1SDimitry Andric  let Latency = 8, ReleaseAtCycles = [LMulLat] in {
314*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDE",    [SiFiveP600VLD], mx, IsWorstCase>;
315*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDM",    [SiFiveP600VLD], mx, IsWorstCase>;
316*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDFF",   [SiFiveP600VLD], mx, IsWorstCase>;
317*0fca6ea1SDimitry Andric  }
318*0fca6ea1SDimitry Andric  let Latency = 12, ReleaseAtCycles = [LMulLat] in {
319*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDS8",   [SiFiveP600VLD], mx, IsWorstCase>;
320*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDS16",  [SiFiveP600VLD], mx, IsWorstCase>;
321*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDS32",  [SiFiveP600VLD], mx, IsWorstCase>;
322*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDS64",  [SiFiveP600VLD], mx, IsWorstCase>;
323*0fca6ea1SDimitry Andric  }
324*0fca6ea1SDimitry Andric  let Latency = 12, ReleaseAtCycles = [LMulLat] in {
325*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDUX8",  [SiFiveP600VLD], mx, IsWorstCase>;
326*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDUX16", [SiFiveP600VLD], mx, IsWorstCase>;
327*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDUX32", [SiFiveP600VLD], mx, IsWorstCase>;
328*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDUX64", [SiFiveP600VLD], mx, IsWorstCase>;
329*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDOX8",  [SiFiveP600VLD], mx, IsWorstCase>;
330*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDOX16", [SiFiveP600VLD], mx, IsWorstCase>;
331*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDOX32", [SiFiveP600VLD], mx, IsWorstCase>;
332*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVLDOX64", [SiFiveP600VLD], mx, IsWorstCase>;
333*0fca6ea1SDimitry Andric  }
334*0fca6ea1SDimitry Andric}
335*0fca6ea1SDimitry Andric
336*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
337*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
338*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
339*0fca6ea1SDimitry Andric  let Latency = 8, ReleaseAtCycles = [LMulLat] in {
340*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTE",    [SiFiveP600VST], mx, IsWorstCase>;
341*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTM",    [SiFiveP600VST], mx, IsWorstCase>;
342*0fca6ea1SDimitry Andric  }
343*0fca6ea1SDimitry Andric  let Latency = 12, ReleaseAtCycles = [LMulLat] in {
344*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTS8",   [SiFiveP600VST], mx, IsWorstCase>;
345*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTS16",  [SiFiveP600VST], mx, IsWorstCase>;
346*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTS32",  [SiFiveP600VST], mx, IsWorstCase>;
347*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTS64",  [SiFiveP600VST], mx, IsWorstCase>;
348*0fca6ea1SDimitry Andric  }
349*0fca6ea1SDimitry Andric  let Latency = 12, ReleaseAtCycles = [LMulLat] in {
350*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTUX8",  [SiFiveP600VST], mx, IsWorstCase>;
351*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTUX16", [SiFiveP600VST], mx, IsWorstCase>;
352*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTUX32", [SiFiveP600VST], mx, IsWorstCase>;
353*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTUX64", [SiFiveP600VST], mx, IsWorstCase>;
354*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTOX8",  [SiFiveP600VST], mx, IsWorstCase>;
355*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTOX16", [SiFiveP600VST], mx, IsWorstCase>;
356*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTOX32", [SiFiveP600VST], mx, IsWorstCase>;
357*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSTOX64", [SiFiveP600VST], mx, IsWorstCase>;
358*0fca6ea1SDimitry Andric  }
359*0fca6ea1SDimitry Andric}
360*0fca6ea1SDimitry Andric
361*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
362*0fca6ea1SDimitry Andric  foreach nf=2-8 in {
363*0fca6ea1SDimitry Andric    foreach eew = [8, 16, 32, 64] in {
364*0fca6ea1SDimitry Andric      defvar LMulLat = SiFiveP600GetCyclesSegmented<mx, eew, nf>.c;
365*0fca6ea1SDimitry Andric      defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
366*0fca6ea1SDimitry Andric      let Latency = !add(12, LMulLat), ReleaseAtCycles = [!add(12, LMulLat)] in {
367*0fca6ea1SDimitry Andric        defm "" : LMULWriteResMX<"WriteVLSEG" # nf # "e" # eew,   [SiFiveP600VLD], mx, IsWorstCase>;
368*0fca6ea1SDimitry Andric        defm "" : LMULWriteResMX<"WriteVLSEGFF" # nf # "e" # eew, [SiFiveP600VLD], mx, IsWorstCase>;
369*0fca6ea1SDimitry Andric        defm "" : LMULWriteResMX<"WriteVLSSEG" # nf # "e" # eew,  [SiFiveP600VLD], mx, IsWorstCase>;
370*0fca6ea1SDimitry Andric        defm "" : LMULWriteResMX<"WriteVLUXSEG" # nf # "e" # eew, [SiFiveP600VLD], mx, IsWorstCase>;
371*0fca6ea1SDimitry Andric        defm "" : LMULWriteResMX<"WriteVLOXSEG" # nf # "e" # eew, [SiFiveP600VLD], mx, IsWorstCase>;
372*0fca6ea1SDimitry Andric      }
373*0fca6ea1SDimitry Andric      let Latency = !add(1, LMulLat), ReleaseAtCycles = [!add(12, LMulLat)] in {
374*0fca6ea1SDimitry Andric        defm "" : LMULWriteResMX<"WriteVSSEG" # nf # "e" # eew,   [SiFiveP600VST], mx, IsWorstCase>;
375*0fca6ea1SDimitry Andric        defm "" : LMULWriteResMX<"WriteVSSSEG" # nf # "e" # eew,  [SiFiveP600VST], mx, IsWorstCase>;
376*0fca6ea1SDimitry Andric        defm "" : LMULWriteResMX<"WriteVSUXSEG" # nf # "e" # eew, [SiFiveP600VST], mx, IsWorstCase>;
377*0fca6ea1SDimitry Andric        defm "" : LMULWriteResMX<"WriteVSOXSEG" # nf # "e" # eew, [SiFiveP600VST], mx, IsWorstCase>;
378*0fca6ea1SDimitry Andric      }
379*0fca6ea1SDimitry Andric    }
380*0fca6ea1SDimitry Andric  }
381*0fca6ea1SDimitry Andric}
382*0fca6ea1SDimitry Andric
383*0fca6ea1SDimitry Andric// Whole register move/load/store
384*0fca6ea1SDimitry Andricforeach LMul = [1, 2, 4, 8] in {
385*0fca6ea1SDimitry Andric  let Latency = 8, ReleaseAtCycles = [LMul] in {
386*0fca6ea1SDimitry Andric    def : WriteRes<!cast<SchedWrite>("WriteVLD" # LMul # "R"), [SiFiveP600VLD]>;
387*0fca6ea1SDimitry Andric    def : WriteRes<!cast<SchedWrite>("WriteVST" # LMul # "R"), [SiFiveP600VST]>;
388*0fca6ea1SDimitry Andric  }
389*0fca6ea1SDimitry Andric  let Latency = LMul, ReleaseAtCycles = [LMul] in {
390*0fca6ea1SDimitry Andric    def : WriteRes<!cast<SchedWrite>("WriteVMov" # LMul # "V"), [SiFiveP600VectorArith]>;
391*0fca6ea1SDimitry Andric  }
392*0fca6ea1SDimitry Andric}
393*0fca6ea1SDimitry Andric
394*0fca6ea1SDimitry Andric// 11. Vector Integer Arithmetic Instructions
395*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
396*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
397*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
398*0fca6ea1SDimitry Andric  let Latency = 1, ReleaseAtCycles = [LMulLat] in {
399*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIALUV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
400*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIALUX",   [SiFiveP600VectorArith], mx, IsWorstCase>;
401*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIALUI",   [SiFiveP600VectorArith], mx, IsWorstCase>;
402*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVExtV",    [SiFiveP600VectorArith], mx, IsWorstCase>;
403*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVICALUV",  [SiFiveP600VectorArith], mx, IsWorstCase>;
404*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVICALUX",  [SiFiveP600VectorArith], mx, IsWorstCase>;
405*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVICALUI",  [SiFiveP600VectorArith], mx, IsWorstCase>;
406*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVICmpV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
407*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVICmpX",   [SiFiveP600VectorArith], mx, IsWorstCase>;
408*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVICmpI",   [SiFiveP600VectorArith], mx, IsWorstCase>;
409*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMergeV", [SiFiveP600VectorArith], mx, IsWorstCase>;
410*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMergeX", [SiFiveP600VectorArith], mx, IsWorstCase>;
411*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMergeI", [SiFiveP600VectorArith], mx, IsWorstCase>;
412*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMovV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
413*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMovX",   [SiFiveP600VectorArith], mx, IsWorstCase>;
414*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMovI",   [SiFiveP600VectorArith], mx, IsWorstCase>;
415*0fca6ea1SDimitry Andric  }
416*0fca6ea1SDimitry Andric  let Latency = 6, ReleaseAtCycles = [LMulLat] in {
417*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVShiftV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
418*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVShiftX",   [SiFiveP600VectorArith], mx, IsWorstCase>;
419*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVShiftI",   [SiFiveP600VectorArith], mx, IsWorstCase>;
420*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMinMaxV", [SiFiveP600VectorArith], mx, IsWorstCase>;
421*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMinMaxX", [SiFiveP600VectorArith], mx, IsWorstCase>;
422*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMulV",    [SiFiveP600VectorArith], mx, IsWorstCase>;
423*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMulX",    [SiFiveP600VectorArith], mx, IsWorstCase>;
424*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMulAddV", [SiFiveP600VectorArith], mx, IsWorstCase>;
425*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIMulAddX", [SiFiveP600VectorArith], mx, IsWorstCase>;
426*0fca6ea1SDimitry Andric  }
427*0fca6ea1SDimitry Andric}
428*0fca6ea1SDimitry Andric// Widening
429*0fca6ea1SDimitry Andricforeach mx = SchedMxListW in {
430*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
431*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxListW>.c;
432*0fca6ea1SDimitry Andric  let Latency = 6, ReleaseAtCycles = [LMulLat] in {
433*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIWALUV",    [SiFiveP600VectorArith], mx, IsWorstCase>;
434*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIWALUX",    [SiFiveP600VectorArith], mx, IsWorstCase>;
435*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIWALUI",    [SiFiveP600VectorArith], mx, IsWorstCase>;
436*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIWMulV",    [SiFiveP600VectorArith], mx, IsWorstCase>;
437*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIWMulX",    [SiFiveP600VectorArith], mx, IsWorstCase>;
438*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIWMulAddV", [SiFiveP600VectorArith], mx, IsWorstCase>;
439*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIWMulAddX", [SiFiveP600VectorArith], mx, IsWorstCase>;
440*0fca6ea1SDimitry Andric  }
441*0fca6ea1SDimitry Andric}
442*0fca6ea1SDimitry Andric
443*0fca6ea1SDimitry Andric// Worst case needs 64 cycles if SEW is equal to 64.
444*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
445*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx>.val in {
446*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
447*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxList>.c;
448*0fca6ea1SDimitry Andric    let Latency = 64, ReleaseAtCycles = [LMulLat, !mul(63, LMulLat)] in {
449*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVIDivV", [SiFiveP600VEXQ1, SiFiveP600VDiv], mx, sew, IsWorstCase>;
450*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVIDivX", [SiFiveP600VEXQ1, SiFiveP600VDiv], mx, sew, IsWorstCase>;
451*0fca6ea1SDimitry Andric    }
452*0fca6ea1SDimitry Andric  }
453*0fca6ea1SDimitry Andric}
454*0fca6ea1SDimitry Andric
455*0fca6ea1SDimitry Andric// Narrowing Shift and Clips
456*0fca6ea1SDimitry Andricforeach mx = SchedMxListW in {
457*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
458*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxListW>.c;
459*0fca6ea1SDimitry Andric  let Latency = 2, ReleaseAtCycles = [LMulLat] in {
460*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVNShiftV", [SiFiveP600VectorArith], mx, IsWorstCase>;
461*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVNShiftX", [SiFiveP600VectorArith], mx, IsWorstCase>;
462*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVNShiftI", [SiFiveP600VectorArith], mx, IsWorstCase>;
463*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVNClipV",  [SiFiveP600VectorArith], mx, IsWorstCase>;
464*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVNClipX",  [SiFiveP600VectorArith], mx, IsWorstCase>;
465*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVNClipI",  [SiFiveP600VectorArith], mx, IsWorstCase>;
466*0fca6ea1SDimitry Andric  }
467*0fca6ea1SDimitry Andric}
468*0fca6ea1SDimitry Andric
469*0fca6ea1SDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions
470*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
471*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
472*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
473*0fca6ea1SDimitry Andric  let Latency = 6, ReleaseAtCycles = [LMulLat] in {
474*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSALUV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
475*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSALUX",   [SiFiveP600VectorArith], mx, IsWorstCase>;
476*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSALUI",   [SiFiveP600VectorArith], mx, IsWorstCase>;
477*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVAALUV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
478*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVAALUX",   [SiFiveP600VectorArith], mx, IsWorstCase>;
479*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSMulV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
480*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSMulX",   [SiFiveP600VectorArith], mx, IsWorstCase>;
481*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSShiftV", [SiFiveP600VectorArith], mx, IsWorstCase>;
482*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSShiftX", [SiFiveP600VectorArith], mx, IsWorstCase>;
483*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSShiftI", [SiFiveP600VectorArith], mx, IsWorstCase>;
484*0fca6ea1SDimitry Andric  }
485*0fca6ea1SDimitry Andric}
486*0fca6ea1SDimitry Andric
487*0fca6ea1SDimitry Andric// 13. Vector Floating-Point Instructions
488*0fca6ea1SDimitry Andricforeach mx = SchedMxListF in {
489*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx, isF=1>.val in {
490*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
491*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListF, isF=1>.c;
492*0fca6ea1SDimitry Andric    let Latency = 6, ReleaseAtCycles = [LMulLat] in {
493*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFALUV",  [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
494*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFALUF",  [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
495*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFMulV",  [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
496*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFMulF",  [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
497*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFMulAddV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
498*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFMulAddF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
499*0fca6ea1SDimitry Andric    }
500*0fca6ea1SDimitry Andric    let Latency = 2, ReleaseAtCycles = [LMulLat] in
501*0fca6ea1SDimitry Andric    defm "" : LMULSEWWriteResMXSEW<"WriteVFRecpV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
502*0fca6ea1SDimitry Andric    let Latency = 3, ReleaseAtCycles = [LMulLat] in
503*0fca6ea1SDimitry Andric    defm "" : LMULSEWWriteResMXSEW<"WriteVFCvtIToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
504*0fca6ea1SDimitry Andric  }
505*0fca6ea1SDimitry Andric}
506*0fca6ea1SDimitry Andricforeach mx = SchedMxListF in {
507*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx, isF=1>.val in {
508*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
509*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxList, isF=1>.c;
510*0fca6ea1SDimitry Andric    let Latency = 1, ReleaseAtCycles = [LMulLat] in {
511*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFMinMaxV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
512*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFMinMaxF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
513*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFSgnjV",   [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
514*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFSgnjF",   [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
515*0fca6ea1SDimitry Andric    }
516*0fca6ea1SDimitry Andric  }
517*0fca6ea1SDimitry Andric}
518*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
519*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
520*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
521*0fca6ea1SDimitry Andric  let Latency = 3, ReleaseAtCycles = [LMulLat] in
522*0fca6ea1SDimitry Andric  defm "" : LMULWriteResMX<"WriteVFCvtFToIV", [SiFiveP600VectorArith], mx, IsWorstCase>;
523*0fca6ea1SDimitry Andric  let Latency = 2, ReleaseAtCycles = [LMulLat] in {
524*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVFCmpV",  [SiFiveP600VectorArith], mx, IsWorstCase>;
525*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVFCmpF",  [SiFiveP600VectorArith], mx, IsWorstCase>;
526*0fca6ea1SDimitry Andric  }
527*0fca6ea1SDimitry Andric  let Latency = 1, ReleaseAtCycles = [LMulLat] in {
528*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVFClassV",  [SiFiveP600VectorArith], mx, IsWorstCase>;
529*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVFMergeV",  [SiFiveP600VectorArith], mx, IsWorstCase>;
530*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVFMovV",    [SiFiveP600VectorArith], mx, IsWorstCase>;
531*0fca6ea1SDimitry Andric  }
532*0fca6ea1SDimitry Andric}
533*0fca6ea1SDimitry Andric
534*0fca6ea1SDimitry Andric// Widening
535*0fca6ea1SDimitry Andricforeach mx = SchedMxListW in {
536*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx, isF=0, isWidening=1>.val in {
537*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
538*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListW>.c;
539*0fca6ea1SDimitry Andric    let Latency = 3, ReleaseAtCycles = [LMulLat] in
540*0fca6ea1SDimitry Andric    defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtIToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
541*0fca6ea1SDimitry Andric  }
542*0fca6ea1SDimitry Andric}
543*0fca6ea1SDimitry Andricforeach mx = SchedMxListFW in {
544*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
545*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxListFW>.c;
546*0fca6ea1SDimitry Andric  let Latency = 6, ReleaseAtCycles = [LMulLat] in
547*0fca6ea1SDimitry Andric  defm "" : LMULWriteResMX<"WriteVFWCvtFToIV", [SiFiveP600VectorArith], mx, IsWorstCase>;
548*0fca6ea1SDimitry Andric}
549*0fca6ea1SDimitry Andricforeach mx = SchedMxListFW in {
550*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx, isF=1, isWidening=1>.val in {
551*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
552*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListFW, isF=1>.c;
553*0fca6ea1SDimitry Andric    let Latency = 6, ReleaseAtCycles = [LMulLat] in {
554*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFWALUV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
555*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFWALUF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
556*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
557*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
558*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulAddV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
559*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulAddF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
560*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtFToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
561*0fca6ea1SDimitry Andric    }
562*0fca6ea1SDimitry Andric  }
563*0fca6ea1SDimitry Andric}
564*0fca6ea1SDimitry Andric// Narrowing
565*0fca6ea1SDimitry Andricforeach mx = SchedMxListW in {
566*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
567*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxListW>.c;
568*0fca6ea1SDimitry Andric  let Latency = 3, ReleaseAtCycles = [LMulLat] in {
569*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVFNCvtFToIV", [SiFiveP600VectorArith], mx, IsWorstCase>;
570*0fca6ea1SDimitry Andric  }
571*0fca6ea1SDimitry Andric}
572*0fca6ea1SDimitry Andricforeach mx = SchedMxListFW in {
573*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx, isF=1, isWidening=1>.val in {
574*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
575*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListFW, isF=1>.c;
576*0fca6ea1SDimitry Andric    let Latency = 3, ReleaseAtCycles = [LMulLat] in {
577*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFNCvtIToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
578*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFNCvtFToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
579*0fca6ea1SDimitry Andric    }
580*0fca6ea1SDimitry Andric  }
581*0fca6ea1SDimitry Andric}
582*0fca6ea1SDimitry Andric
583*0fca6ea1SDimitry Andric// Worst case needs 76 cycles if SEW is equal to 64.
584*0fca6ea1SDimitry Andricforeach mx = SchedMxListF in {
585*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx, 1>.val in {
586*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
587*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListF, 1>.c;
588*0fca6ea1SDimitry Andric    let Latency = 76, ReleaseAtCycles = [LMulLat, !mul(76, LMulLat)] in {
589*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFDivV",  [SiFiveP600VEXQ1, SiFiveP600VFloatDiv], mx, sew, IsWorstCase>;
590*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFDivF",  [SiFiveP600VEXQ1, SiFiveP600VFloatDiv], mx, sew, IsWorstCase>;
591*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFSqrtV", [SiFiveP600VEXQ1, SiFiveP600VFloatDiv], mx, sew, IsWorstCase>;
592*0fca6ea1SDimitry Andric    }
593*0fca6ea1SDimitry Andric  }
594*0fca6ea1SDimitry Andric}
595*0fca6ea1SDimitry Andric
596*0fca6ea1SDimitry Andric// 14. Vector Reduction Operations
597*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
598*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx>.val in {
599*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
600*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxList>.c;
601*0fca6ea1SDimitry Andric    let Latency = !add(2, !mul(2, LMulLat)), ReleaseAtCycles = [LMulLat] in {
602*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVIRedV_From", [SiFiveP600VEXQ1],
603*0fca6ea1SDimitry Andric                                     mx, sew, IsWorstCase>;
604*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVIRedMinMaxV_From", [SiFiveP600VEXQ1],
605*0fca6ea1SDimitry Andric                                     mx, sew, IsWorstCase>;
606*0fca6ea1SDimitry Andric    }
607*0fca6ea1SDimitry Andric  }
608*0fca6ea1SDimitry Andric}
609*0fca6ea1SDimitry Andric
610*0fca6ea1SDimitry Andricforeach mx = SchedMxListWRed in {
611*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx, 0, 1>.val in {
612*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
613*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListWRed>.c;
614*0fca6ea1SDimitry Andric    let Latency = !add(2, !mul(2, LMulLat)), ReleaseAtCycles = [LMulLat] in {
615*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVIWRedV_From", [SiFiveP600VEXQ1],
616*0fca6ea1SDimitry Andric                                     mx, sew, IsWorstCase>;
617*0fca6ea1SDimitry Andric    }
618*0fca6ea1SDimitry Andric  }
619*0fca6ea1SDimitry Andric}
620*0fca6ea1SDimitry Andric
621*0fca6ea1SDimitry Andricforeach mx = SchedMxListF in {
622*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx, 1>.val in {
623*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
624*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListF, 1>.c;
625*0fca6ea1SDimitry Andric    let Latency = !add(6, !mul(6, LMulLat)), ReleaseAtCycles = [LMulLat] in {
626*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFRedV_From", [SiFiveP600VEXQ1],
627*0fca6ea1SDimitry Andric                                     mx, sew, IsWorstCase>;
628*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFRedMinMaxV_From",
629*0fca6ea1SDimitry Andric                                     [SiFiveP600VEXQ1], mx, sew, IsWorstCase>;
630*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFRedOV_From", [SiFiveP600VEXQ1],
631*0fca6ea1SDimitry Andric                                     mx, sew, IsWorstCase>;
632*0fca6ea1SDimitry Andric    }
633*0fca6ea1SDimitry Andric  }
634*0fca6ea1SDimitry Andric}
635*0fca6ea1SDimitry Andric
636*0fca6ea1SDimitry Andricforeach mx = SchedMxListFWRed in {
637*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx, 1, 1>.val in {
638*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
639*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListFWRed, 1>.c;
640*0fca6ea1SDimitry Andric    let Latency = !add(6, !mul(6, LMulLat)), ReleaseAtCycles = [LMulLat] in {
641*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFWRedV_From",  [SiFiveP600VEXQ1],
642*0fca6ea1SDimitry Andric                                     mx, sew, IsWorstCase>;
643*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVFWRedOV_From", [SiFiveP600VEXQ1],
644*0fca6ea1SDimitry Andric                                     mx, sew, IsWorstCase>;
645*0fca6ea1SDimitry Andric    }
646*0fca6ea1SDimitry Andric  }
647*0fca6ea1SDimitry Andric}
648*0fca6ea1SDimitry Andric
649*0fca6ea1SDimitry Andric// 15. Vector Mask Instructions
650*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
651*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
652*0fca6ea1SDimitry Andric  let Latency = 1, ReleaseAtCycles = [1] in {
653*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVMALUV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
654*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVMPopV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
655*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVMFFSV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
656*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVMSFSV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
657*0fca6ea1SDimitry Andric  }
658*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
659*0fca6ea1SDimitry Andric  let Latency = 1, ReleaseAtCycles = [LMulLat] in {
660*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIotaV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
661*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVIdxV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
662*0fca6ea1SDimitry Andric  }
663*0fca6ea1SDimitry Andric}
664*0fca6ea1SDimitry Andric
665*0fca6ea1SDimitry Andric// 16. Vector Permutation Instructions
666*0fca6ea1SDimitry Andric// Simple Slide
667*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
668*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
669*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
670*0fca6ea1SDimitry Andric  let Latency = 2, ReleaseAtCycles = [LMulLat] in {
671*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSlideI",  [SiFiveP600VEXQ0], mx, IsWorstCase>;
672*0fca6ea1SDimitry Andric  }
673*0fca6ea1SDimitry Andric  let Latency = 1, ReleaseAtCycles = [LMulLat] in {
674*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVISlide1X", [SiFiveP600VEXQ0], mx, IsWorstCase>;
675*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVFSlide1F", [SiFiveP600VEXQ0], mx, IsWorstCase>;
676*0fca6ea1SDimitry Andric  }
677*0fca6ea1SDimitry Andric}
678*0fca6ea1SDimitry Andricforeach mx = ["MF8", "MF4", "MF2", "M1"] in {
679*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
680*0fca6ea1SDimitry Andric  let Latency = 2, ReleaseAtCycles = [1] in {
681*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSlideUpX",   [SiFiveP600VEXQ0], mx, IsWorstCase>;
682*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSlideDownX", [SiFiveP600VEXQ0], mx, IsWorstCase>;
683*0fca6ea1SDimitry Andric  }
684*0fca6ea1SDimitry Andric}
685*0fca6ea1SDimitry Andric
686*0fca6ea1SDimitry Andric// Complex Slide
687*0fca6ea1SDimitry Andricforeach mx = ["M8", "M4", "M2"] in {
688*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
689*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
690*0fca6ea1SDimitry Andric  let Latency = !add(4, LMulLat), ReleaseAtCycles = [LMulLat] in {
691*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSlideUpX",   [SiFiveP600VEXQ1], mx, IsWorstCase>;
692*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSlideDownX", [SiFiveP600VEXQ1], mx, IsWorstCase>;
693*0fca6ea1SDimitry Andric  }
694*0fca6ea1SDimitry Andric}
695*0fca6ea1SDimitry Andric
696*0fca6ea1SDimitry Andriclet Latency = 2, ReleaseAtCycles = [1] in {
697*0fca6ea1SDimitry Andric  def : WriteRes<WriteVMovSX, [SiFiveP600VectorArith]>;
698*0fca6ea1SDimitry Andric  def : WriteRes<WriteVMovXS, [SiFiveP600VectorArith]>;
699*0fca6ea1SDimitry Andric}
700*0fca6ea1SDimitry Andriclet Latency = 6, ReleaseAtCycles = [1] in {
701*0fca6ea1SDimitry Andric  def : WriteRes<WriteVMovSF, [SiFiveP600VectorArith]>;
702*0fca6ea1SDimitry Andric  def : WriteRes<WriteVMovFS, [SiFiveP600VectorArith]>;
703*0fca6ea1SDimitry Andric}
704*0fca6ea1SDimitry Andric
705*0fca6ea1SDimitry Andric// Simple Gather and Compress
706*0fca6ea1SDimitry Andricforeach mx = ["MF8", "MF4", "MF2", "M1"] in {
707*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
708*0fca6ea1SDimitry Andric  let Latency = 3, ReleaseAtCycles = [1] in {
709*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVRGatherVX", [SiFiveP600VEXQ1], mx, IsWorstCase>;
710*0fca6ea1SDimitry Andric  }
711*0fca6ea1SDimitry Andric}
712*0fca6ea1SDimitry Andric
713*0fca6ea1SDimitry Andricforeach mx = ["MF8", "MF4", "MF2", "M1"] in {
714*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx>.val in {
715*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
716*0fca6ea1SDimitry Andric    let Latency = 3, ReleaseAtCycles = [1] in {
717*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVRGatherVV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>;
718*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVRGatherEI16VV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>;
719*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVCompressV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>;
720*0fca6ea1SDimitry Andric    }
721*0fca6ea1SDimitry Andric  }
722*0fca6ea1SDimitry Andric}
723*0fca6ea1SDimitry Andric
724*0fca6ea1SDimitry Andric// Complex Gather and Compress
725*0fca6ea1SDimitry Andricforeach mx = ["M2", "M4", "M8"] in {
726*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
727*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
728*0fca6ea1SDimitry Andric  let Latency = 6, ReleaseAtCycles = [LMulLat] in {
729*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVRGatherVX", [SiFiveP600VEXQ1], mx, IsWorstCase>;
730*0fca6ea1SDimitry Andric  }
731*0fca6ea1SDimitry Andric}
732*0fca6ea1SDimitry Andric
733*0fca6ea1SDimitry Andricforeach mx = ["M2", "M4", "M8"] in {
734*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx>.val in {
735*0fca6ea1SDimitry Andric    defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
736*0fca6ea1SDimitry Andric    defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxList>.c;
737*0fca6ea1SDimitry Andric    let Latency = 6, ReleaseAtCycles = [LMulLat] in {
738*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVRGatherVV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>;
739*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVRGatherEI16VV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>;
740*0fca6ea1SDimitry Andric      defm "" : LMULSEWWriteResMXSEW<"WriteVCompressV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>;
741*0fca6ea1SDimitry Andric    }
742*0fca6ea1SDimitry Andric  }
743*0fca6ea1SDimitry Andric}
744*0fca6ea1SDimitry Andric
745*0fca6ea1SDimitry Andric// Simple Vrgather.vi
746*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
747*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
748*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
749*0fca6ea1SDimitry Andric  let Latency = 3, ReleaseAtCycles = [LMulLat] in {
750*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVRGatherVI", [SiFiveP600VEXQ1], mx, IsWorstCase>;
751*0fca6ea1SDimitry Andric  }
752*0fca6ea1SDimitry Andric}
753*0fca6ea1SDimitry Andric
754*0fca6ea1SDimitry Andric// Vector Crypto
755*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
756*0fca6ea1SDimitry Andric  defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
757*0fca6ea1SDimitry Andric  defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
758*0fca6ea1SDimitry Andric  // Zvbb
759*0fca6ea1SDimitry Andric  let Latency = 2, ReleaseAtCycles = [LMulLat] in {
760*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVBREVV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
761*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVCLZV",    [SiFiveP600VectorArith], mx, IsWorstCase>;
762*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVCPOPV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
763*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVCTZV",    [SiFiveP600VectorArith], mx, IsWorstCase>;
764*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVWSLLV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
765*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVWSLLX",   [SiFiveP600VectorArith], mx, IsWorstCase>;
766*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVWSLLI",   [SiFiveP600VectorArith], mx, IsWorstCase>;
767*0fca6ea1SDimitry Andric  }
768*0fca6ea1SDimitry Andric  // Zvbc
769*0fca6ea1SDimitry Andric  let Latency = 2, ReleaseAtCycles = [LMulLat] in {
770*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVCLMULV", [SiFiveP600VectorArith], mx, IsWorstCase>;
771*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVCLMULX", [SiFiveP600VectorArith], mx, IsWorstCase>;
772*0fca6ea1SDimitry Andric  }
773*0fca6ea1SDimitry Andric  // Zvkb
774*0fca6ea1SDimitry Andric  // VANDN uses WriteVIALU[V|X|I]
775*0fca6ea1SDimitry Andric  let Latency = 2, ReleaseAtCycles = [LMulLat] in {
776*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVBREV8V",  [SiFiveP600VectorArith], mx, IsWorstCase>;
777*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVREV8V",   [SiFiveP600VectorArith], mx, IsWorstCase>;
778*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVRotV",    [SiFiveP600VectorArith], mx, IsWorstCase>;
779*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVRotX",    [SiFiveP600VectorArith], mx, IsWorstCase>;
780*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVRotI",    [SiFiveP600VectorArith], mx, IsWorstCase>;
781*0fca6ea1SDimitry Andric  }
782*0fca6ea1SDimitry Andric  // Zvkg
783*0fca6ea1SDimitry Andric  let Latency = 2, ReleaseAtCycles = [LMulLat] in {
784*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVGHSHV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
785*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVGMULV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
786*0fca6ea1SDimitry Andric  }
787*0fca6ea1SDimitry Andric  // ZvknhaOrZvknhb
788*0fca6ea1SDimitry Andric  let Latency = 3, ReleaseAtCycles = [LMulLat] in {
789*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSHA2CHV", [SiFiveP600VectorArith], mx, IsWorstCase>;
790*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSHA2CLV", [SiFiveP600VectorArith], mx, IsWorstCase>;
791*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSHA2MSV", [SiFiveP600VectorArith], mx, IsWorstCase>;
792*0fca6ea1SDimitry Andric  }
793*0fca6ea1SDimitry Andric  // Zvkned
794*0fca6ea1SDimitry Andric  let Latency = 2, ReleaseAtCycles = [LMulLat] in {
795*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVAESMVV",  [SiFiveP600VectorArith], mx, IsWorstCase>;
796*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVAESKF1V", [SiFiveP600VectorArith], mx, IsWorstCase>;
797*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVAESKF2V", [SiFiveP600VectorArith], mx, IsWorstCase>;
798*0fca6ea1SDimitry Andric  }
799*0fca6ea1SDimitry Andric  let Latency = 1, ReleaseAtCycles = [LMulLat] in
800*0fca6ea1SDimitry Andric  defm "" : LMULWriteResMX<"WriteVAESZV",   [SiFiveP600VectorArith], mx, IsWorstCase>;
801*0fca6ea1SDimitry Andric  // Zvksed
802*0fca6ea1SDimitry Andric  let Latency = 3, ReleaseAtCycles = [LMulLat] in {
803*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSM4KV",   [SiFiveP600VEXQ0], mx, IsWorstCase>;
804*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSM4RV",   [SiFiveP600VEXQ0], mx, IsWorstCase>;
805*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSM3CV",   [SiFiveP600VEXQ0], mx, IsWorstCase>;
806*0fca6ea1SDimitry Andric    defm "" : LMULWriteResMX<"WriteVSM3MEV",  [SiFiveP600VEXQ0], mx, IsWorstCase>;
807*0fca6ea1SDimitry Andric  }
808*0fca6ea1SDimitry Andric}
809*0fca6ea1SDimitry Andric
810*0fca6ea1SDimitry Andric// Others
811*0fca6ea1SDimitry Andricdef : WriteRes<WriteCSR, [SiFiveP600SYS]>;
812*0fca6ea1SDimitry Andricdef : WriteRes<WriteNop, []>;
813*0fca6ea1SDimitry Andricdef : WriteRes<WriteRdVLENB, [SiFiveP600SYS]>;
814*0fca6ea1SDimitry Andric
815*0fca6ea1SDimitry Andric// FIXME: This could be better modeled by looking at the regclasses of the operands.
816*0fca6ea1SDimitry Andricdef : InstRW<[WriteIALU, ReadIALU], (instrs COPY)>;
817*0fca6ea1SDimitry Andric
818*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
819*0fca6ea1SDimitry Andric// Bypass and advance
820*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadJmp, 0>;
821*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadJalr, 0>;
822*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCSR, 0>;
823*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadStoreData, 0>;
824*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadMemBase, 0>;
825*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIALU, 0>;
826*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIALU32, 0>;
827*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadShiftImm, 0>;
828*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadShiftImm32, 0>;
829*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadShiftReg, 0>;
830*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadShiftReg32, 0>;
831*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIDiv, 0>;
832*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIDiv32, 0>;
833*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIRem, 0>;
834*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIRem32, 0>;
835*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIMul, 0>;
836*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIMul32, 0>;
837*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicWA, 0>;
838*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicWD, 0>;
839*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicDA, 0>;
840*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicDD, 0>;
841*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicLDW, 0>;
842*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicLDD, 0>;
843*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicSTW, 0>;
844*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicSTD, 0>;
845*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFStoreData, 0>;
846*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMemBase, 0>;
847*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFAdd16, 0>;
848*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFAdd32, 0>;
849*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFAdd64, 0>;
850*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMul16, 0>;
851*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA16, 0>;
852*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA16Addend, 0>;
853*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMul32, 0>;
854*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA32, 0>;
855*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA32Addend, 0>;
856*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMul64, 0>;
857*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA64, 0>;
858*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA64Addend, 0>;
859*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFDiv16, 0>;
860*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFDiv32, 0>;
861*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFDiv64, 0>;
862*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSqrt16, 0>;
863*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSqrt32, 0>;
864*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSqrt64, 0>;
865*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCmp16, 0>;
866*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCmp32, 0>;
867*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCmp64, 0>;
868*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSGNJ16, 0>;
869*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSGNJ32, 0>;
870*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSGNJ64, 0>;
871*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMinMax16, 0>;
872*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMinMax32, 0>;
873*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMinMax64, 0>;
874*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToI32, 0>;
875*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToI64, 0>;
876*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToI32, 0>;
877*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToI64, 0>;
878*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToI32, 0>;
879*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToI64, 0>;
880*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF16, 0>;
881*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF32, 0>;
882*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF64, 0>;
883*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF16, 0>;
884*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF32, 0>;
885*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF64, 0>;
886*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToF64, 0>;
887*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToF32, 0>;
888*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToF32, 0>;
889*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToF16, 0>;
890*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToF64, 0>;
891*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToF16, 0>;
892*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovF16ToI16, 0>;
893*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovI16ToF16, 0>;
894*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovF32ToI32, 0>;
895*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovI32ToF32, 0>;
896*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovF64ToI64, 0>;
897*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovI64ToF64, 0>;
898*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFClass16, 0>;
899*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFClass32, 0>;
900*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFClass64, 0>;
901*0fca6ea1SDimitry Andric
902*0fca6ea1SDimitry Andric// Bitmanip
903*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadRotateImm, 0>;
904*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadRotateImm32, 0>;
905*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadRotateReg, 0>;
906*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadRotateReg32, 0>;
907*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCLZ, 0>;
908*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCLZ32, 0>;
909*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCTZ, 0>;
910*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCTZ32, 0>;
911*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCPOP, 0>;
912*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCPOP32, 0>;
913*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadORCB, 0>;
914*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIMinMax, 0>;
915*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadREV8, 0>;
916*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadSHXADD, 0>;
917*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadSHXADD32, 0>;
918*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadSingleBit, 0>;
919*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadSingleBitImm, 0>;
920*0fca6ea1SDimitry Andric
921*0fca6ea1SDimitry Andric// 6. Configuration-Setting Instructions
922*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVSETVLI, 0>;
923*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVSETVL, 0>;
924*0fca6ea1SDimitry Andric
925*0fca6ea1SDimitry Andric// 7. Vector Loads and Stores
926*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVLDX, 0>;
927*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVSTX, 0>;
928*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTEV", 0>;
929*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTM", 0>;
930*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVLDSX, 0>;
931*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVSTSX, 0>;
932*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS8V", 0>;
933*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS16V", 0>;
934*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS32V", 0>;
935*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS64V", 0>;
936*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVLDUXV", 0>;
937*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVLDOXV", 0>;
938*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX8", 0>;
939*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX16", 0>;
940*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX32", 0>;
941*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX64", 0>;
942*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUXV", 0>;
943*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX8V", 0>;
944*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX16V", 0>;
945*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX32V", 0>;
946*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX64V", 0>;
947*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX8", 0>;
948*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX16", 0>;
949*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX32", 0>;
950*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX64", 0>;
951*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOXV", 0>;
952*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX8V", 0>;
953*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX16V", 0>;
954*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX32V", 0>;
955*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX64V", 0>;
956*0fca6ea1SDimitry Andric// LMUL Aware
957*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVST1R, 0>;
958*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVST2R, 0>;
959*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVST4R, 0>;
960*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVST8R, 0>;
961*0fca6ea1SDimitry Andric
962*0fca6ea1SDimitry Andric// 12. Vector Integer Arithmetic Instructions
963*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIALUV", 0>;
964*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIALUX", 0>;
965*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWALUV", 0>;
966*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWALUX", 0>;
967*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVExtV", 0>;
968*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVICALUV", 0>;
969*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVICALUX", 0>;
970*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVShiftV", 0>;
971*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVShiftX", 0>;
972*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVNShiftV", 0>;
973*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVNShiftX", 0>;
974*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVICmpV", 0>;
975*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVICmpX", 0>;
976*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMinMaxV", 0>;
977*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMinMaxX", 0>;
978*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulV", 0>;
979*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulX", 0>;
980*0fca6ea1SDimitry Andricdefm : LMULSEWReadAdvance<"ReadVIDivV", 0>;
981*0fca6ea1SDimitry Andricdefm : LMULSEWReadAdvance<"ReadVIDivX", 0>;
982*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulV", 0>;
983*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulX", 0>;
984*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulAddV", 0>;
985*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulAddX", 0>;
986*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulAddV", 0>;
987*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulAddX", 0>;
988*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMergeV", 0>;
989*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMergeX", 0>;
990*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMovV", 0>;
991*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMovX", 0>;
992*0fca6ea1SDimitry Andric
993*0fca6ea1SDimitry Andric// 13. Vector Fixed-Point Arithmetic Instructions
994*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSALUV", 0>;
995*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSALUX", 0>;
996*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAALUV", 0>;
997*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAALUX", 0>;
998*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSMulV", 0>;
999*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSMulX", 0>;
1000*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSShiftV", 0>;
1001*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSShiftX", 0>;
1002*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNClipV", 0>;
1003*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNClipX", 0>;
1004*0fca6ea1SDimitry Andric
1005*0fca6ea1SDimitry Andric// 14. Vector Floating-Point Instructions
1006*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFALUV", 0>;
1007*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFALUF", 0>;
1008*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWALUV", 0>;
1009*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWALUF", 0>;
1010*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulV", 0>;
1011*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulF", 0>;
1012*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFDivV", 0>;
1013*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFDivF", 0>;
1014*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulV", 0>;
1015*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulF", 0>;
1016*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulAddV", 0>;
1017*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulAddF", 0>;
1018*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulAddV", 0>;
1019*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulAddF", 0>;
1020*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSqrtV", 0>;
1021*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVFRecpV", 0>;
1022*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCmpV", 0>;
1023*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCmpF", 0>;
1024*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMinMaxV", 0>;
1025*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMinMaxF", 0>;
1026*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSgnjV", 0>;
1027*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSgnjF", 0>;
1028*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFClassV", 0>;
1029*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMergeV", 0>;
1030*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMergeF", 0>;
1031*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMovF", 0>;
1032*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFCvtIToFV", 0>;
1033*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCvtFToIV", 0>;
1034*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceW<"ReadVFWCvtIToFV", 0>;
1035*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvanceFW<"ReadVFWCvtFToIV", 0>;
1036*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWCvtFToFV", 0>;
1037*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFNCvtIToFV", 0>;
1038*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVFNCvtFToIV", 0>;
1039*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFNCvtFToFV", 0>;
1040*0fca6ea1SDimitry Andric
1041*0fca6ea1SDimitry Andric// 15. Vector Reduction Operations
1042*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVIRedV, 0>;
1043*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVIRedV0, 0>;
1044*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVIWRedV, 0>;
1045*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVIWRedV0, 0>;
1046*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFRedV, 0>;
1047*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFRedV0, 0>;
1048*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFRedOV, 0>;
1049*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFRedOV0, 0>;
1050*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFWRedV, 0>;
1051*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFWRedV0, 0>;
1052*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFWRedOV, 0>;
1053*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFWRedOV0, 0>;
1054*0fca6ea1SDimitry Andric
1055*0fca6ea1SDimitry Andric// 16. Vector Mask Instructions
1056*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMALUV", 0>;
1057*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMPopV", 0>;
1058*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMFFSV", 0>;
1059*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMSFSV", 0>;
1060*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVIotaV", 0>;
1061*0fca6ea1SDimitry Andric
1062*0fca6ea1SDimitry Andric// 17. Vector Permutation Instructions
1063*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovXS, 0>;
1064*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSX_V, 0>;
1065*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSX_X, 0>;
1066*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovFS, 0>;
1067*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSF_V, 0>;
1068*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSF_F, 0>;
1069*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVISlideV", 0>;
1070*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVISlideX", 0>;
1071*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFSlideV", 0>;
1072*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFSlideF", 0>;
1073*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherVV_data", 0>;
1074*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherVV_index", 0>;
1075*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherEI16VV_data", 0>;
1076*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherEI16VV_index", 0>;
1077*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVX_data", 0>;
1078*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVX_index", 0>;
1079*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVI_data", 0>;
1080*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVCompressV", 0>;
1081*0fca6ea1SDimitry Andric// LMUL Aware
1082*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMov1V, 0>;
1083*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMov2V, 0>;
1084*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMov4V, 0>;
1085*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMov8V, 0>;
1086*0fca6ea1SDimitry Andric
1087*0fca6ea1SDimitry Andric// Others
1088*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMask, 0>;
1089*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMergeOp_WorstCase, 0>;
1090*0fca6ea1SDimitry Andricforeach mx = SchedMxList in {
1091*0fca6ea1SDimitry Andric  def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx), 0>;
1092*0fca6ea1SDimitry Andric  foreach sew = SchedSEWSet<mx>.val in
1093*0fca6ea1SDimitry Andric    def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx  # "_E" # sew), 0>;
1094*0fca6ea1SDimitry Andric}
1095*0fca6ea1SDimitry Andric
1096*0fca6ea1SDimitry Andric// Vector Crypto Extensions
1097*0fca6ea1SDimitry Andric// Zvbb
1098*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVBREVV", 0>;
1099*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVCLZV", 0>;
1100*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVCPOPV", 0>;
1101*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVCTZV", 0>;
1102*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVWSLLV", 0>;
1103*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVWSLLX", 0>;
1104*0fca6ea1SDimitry Andric// Zvbc
1105*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVCLMULV", 0>;
1106*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVCLMULX", 0>;
1107*0fca6ea1SDimitry Andric// Zvkb
1108*0fca6ea1SDimitry Andric// VANDN uses ReadVIALU[V|X|I]
1109*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVBREV8V", 0>;
1110*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVREV8V", 0>;
1111*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRotV", 0>;
1112*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRotX", 0>;
1113*0fca6ea1SDimitry Andric// Zvkg
1114*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVGHSHV", 0>;
1115*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVGMULV", 0>;
1116*0fca6ea1SDimitry Andric// Zvknha or Zvknhb
1117*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSHA2CHV", 0>;
1118*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSHA2CLV", 0>;
1119*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSHA2MSV", 0>;
1120*0fca6ea1SDimitry Andric// Zvkned
1121*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAESMVV", 0>;
1122*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAESKF1V", 0>;
1123*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAESKF2V", 0>;
1124*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAESZV", 0>;
1125*0fca6ea1SDimitry Andric// Zvksed
1126*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSM4KV", 0>;
1127*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSM4RV", 0>;
1128*0fca6ea1SDimitry Andric// Zbksh
1129*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSM3CV", 0>;
1130*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSM3MEV", 0>;
1131*0fca6ea1SDimitry Andric
1132*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
1133*0fca6ea1SDimitry Andric// Unsupported extensions
1134*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZabha;
1135*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZbc;
1136*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZbkb;
1137*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZbkx;
1138*0fca6ea1SDimitry Andricdefm : UnsupportedSchedSFB;
1139*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZfa;
1140*0fca6ea1SDimitry Andricdefm : UnsupportedSchedXsfvcp;
1141*0fca6ea1SDimitry Andric}
1142