xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64SchedOryon.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1*0fca6ea1SDimitry Andric//=- AArch64SchedOryon.td - Qualcomm Oryon CPU 001 ---*- 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// This file defines the scheduling model for Qualcomm Oryon
10*0fca6ea1SDimitry Andric// family of processors.
11*0fca6ea1SDimitry Andric//
12*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
13*0fca6ea1SDimitry Andric
14*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
15*0fca6ea1SDimitry Andric// Pipeline Description.
16*0fca6ea1SDimitry Andric
17*0fca6ea1SDimitry Andricdef OryonModel : SchedMachineModel {
18*0fca6ea1SDimitry Andric  let IssueWidth            =  14;
19*0fca6ea1SDimitry Andric  let MicroOpBufferSize     = 376;
20*0fca6ea1SDimitry Andric  let LoadLatency           =   4;
21*0fca6ea1SDimitry Andric  let MispredictPenalty     =  13; // 13 cycles for mispredicted branch.
22*0fca6ea1SDimitry Andric  let LoopMicroOpBufferSize =   0; // Do not have a LoopMicroOpBuffer
23*0fca6ea1SDimitry Andric  let PostRAScheduler       =   1; // Using PostRA sched.
24*0fca6ea1SDimitry Andric  let CompleteModel         =   1;
25*0fca6ea1SDimitry Andric
26*0fca6ea1SDimitry Andric  list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F,
27*0fca6ea1SDimitry Andric                                                    SMEUnsupported.F,
28*0fca6ea1SDimitry Andric                                                    MTEUnsupported.F,
29*0fca6ea1SDimitry Andric                                                    PAUnsupported.F,
30*0fca6ea1SDimitry Andric                                                    [HasPAuth, HasCSSC]);
31*0fca6ea1SDimitry Andric}
32*0fca6ea1SDimitry Andric
33*0fca6ea1SDimitry Andriclet SchedModel = OryonModel in {
34*0fca6ea1SDimitry Andric
35*0fca6ea1SDimitry Andric// Issue ports.
36*0fca6ea1SDimitry Andric// IXU has 6 ports p0 ~ p5
37*0fca6ea1SDimitry Andric// LSU has 4 ports p6 ~ p9(ls0 ~ ls3), p10/p11(std0, std1) has to work with ls0~ls3
38*0fca6ea1SDimitry Andric// VXU has 4 ports p12 ~ p15
39*0fca6ea1SDimitry Andric
40*0fca6ea1SDimitry Andric// cross IXU/LSU/VXU resource group for FMOV P41 of VXU
41*0fca6ea1SDimitry Andric// I2V
42*0fca6ea1SDimitry Andricdef ORYONI4FP0 : ProcResource<1>;
43*0fca6ea1SDimitry Andricdef ORYONI5FP1 : ProcResource<1>;
44*0fca6ea1SDimitry Andric// V2I
45*0fca6ea1SDimitry Andricdef ORYONFP0I4 : ProcResource<1>;
46*0fca6ea1SDimitry Andricdef ORYONFP1I5 : ProcResource<1>;
47*0fca6ea1SDimitry Andric
48*0fca6ea1SDimitry Andric// store 1 for normal store instructions
49*0fca6ea1SDimitry Andricdef ORYONST0 : ProcResource<1>;
50*0fca6ea1SDimitry Andric// store 2 for normal store instructions
51*0fca6ea1SDimitry Andricdef ORYONST1 : ProcResource<1>;
52*0fca6ea1SDimitry Andric
53*0fca6ea1SDimitry Andric// Port 0: ALU/Indirect/Direct Branch.
54*0fca6ea1SDimitry Andricdef ORYONP0 : ProcResource<1>;
55*0fca6ea1SDimitry Andric
56*0fca6ea1SDimitry Andric// Port 1: ALU/Direct Branch.
57*0fca6ea1SDimitry Andricdef ORYONP1 : ProcResource<1>;
58*0fca6ea1SDimitry Andric
59*0fca6ea1SDimitry Andric// Port 2: ALU.
60*0fca6ea1SDimitry Andricdef ORYONP2 : ProcResource<1>;
61*0fca6ea1SDimitry Andric
62*0fca6ea1SDimitry Andric// Port 3: ALU.
63*0fca6ea1SDimitry Andricdef ORYONP3 : ProcResource<1>;
64*0fca6ea1SDimitry Andric
65*0fca6ea1SDimitry Andric// Port 4: ALU.
66*0fca6ea1SDimitry Andricdef ORYONP4 : ProcResource<1> {
67*0fca6ea1SDimitry Andric    let Super = ORYONI4FP0;
68*0fca6ea1SDimitry Andric    let Super = ORYONFP0I4; }
69*0fca6ea1SDimitry Andric
70*0fca6ea1SDimitry Andric// Port 5: ALU.
71*0fca6ea1SDimitry Andricdef ORYONP5 : ProcResource<1> {
72*0fca6ea1SDimitry Andric    let Super = ORYONI5FP1;
73*0fca6ea1SDimitry Andric    let Super = ORYONFP1I5; }
74*0fca6ea1SDimitry Andric
75*0fca6ea1SDimitry Andric// Port 6: Load/Store. LS0
76*0fca6ea1SDimitry Andricdef ORYONP6 : ProcResource<1> {
77*0fca6ea1SDimitry Andric    let Super = ORYONST0; }
78*0fca6ea1SDimitry Andric
79*0fca6ea1SDimitry Andric// Port 7: Load/store. LS1
80*0fca6ea1SDimitry Andricdef ORYONP7 : ProcResource<1> {
81*0fca6ea1SDimitry Andric    let Super = ORYONST0; }
82*0fca6ea1SDimitry Andric
83*0fca6ea1SDimitry Andric// Port 8: Load/Store. LS2
84*0fca6ea1SDimitry Andricdef ORYONP8 : ProcResource<1> {
85*0fca6ea1SDimitry Andric    let Super = ORYONST1; }
86*0fca6ea1SDimitry Andric
87*0fca6ea1SDimitry Andric// Port 9: Load/store. LS3
88*0fca6ea1SDimitry Andricdef ORYONP9 : ProcResource<1> {
89*0fca6ea1SDimitry Andric    let Super = ORYONST1; }
90*0fca6ea1SDimitry Andric
91*0fca6ea1SDimitry Andric// Port 10: Load/Store. STD0
92*0fca6ea1SDimitry Andricdef ORYONP10SD0 : ProcResource<1> {
93*0fca6ea1SDimitry Andric    let Super = ORYONST0; }
94*0fca6ea1SDimitry Andric
95*0fca6ea1SDimitry Andric// Port 11: Load/store. STD1
96*0fca6ea1SDimitry Andricdef ORYONP11SD1 : ProcResource<1> {
97*0fca6ea1SDimitry Andric    let Super = ORYONST1; }
98*0fca6ea1SDimitry Andric
99*0fca6ea1SDimitry Andric// Port 12: FP/Neon/SIMD/Crypto.
100*0fca6ea1SDimitry Andricdef ORYONP12FP0 : ProcResource<1> {
101*0fca6ea1SDimitry Andric    let Super = ORYONI4FP0;
102*0fca6ea1SDimitry Andric    let Super = ORYONFP0I4; }
103*0fca6ea1SDimitry Andric
104*0fca6ea1SDimitry Andric// Port 13: FP/Neon/SIMD/Crypto.
105*0fca6ea1SDimitry Andricdef ORYONP13FP1 : ProcResource<1> {
106*0fca6ea1SDimitry Andric    let Super = ORYONI5FP1;
107*0fca6ea1SDimitry Andric    let Super = ORYONFP1I5; }
108*0fca6ea1SDimitry Andric
109*0fca6ea1SDimitry Andric// Port 14: FP/Neon/SIMD/Crypto.
110*0fca6ea1SDimitry Andricdef ORYONP14FP2 : ProcResource<1>;
111*0fca6ea1SDimitry Andric
112*0fca6ea1SDimitry Andric// Port 15: FP/Neon/SIMD/Crypto.
113*0fca6ea1SDimitry Andricdef ORYONP15FP3 : ProcResource<1>;
114*0fca6ea1SDimitry Andric
115*0fca6ea1SDimitry Andric// Define groups for the functional units on each issue port.  Each group
116*0fca6ea1SDimitry Andric// created will be used by a WriteRes.
117*0fca6ea1SDimitry Andric
118*0fca6ea1SDimitry Andric// Integer add/shift/logical/misc. instructions on port I0/I1/I2/I3/I4/I5.
119*0fca6ea1SDimitry Andricdef ORYONI012345 : ProcResGroup<[ORYONP0, ORYONP1, ORYONP2,
120*0fca6ea1SDimitry Andric                                  ORYONP3, ORYONP4, ORYONP5]> {
121*0fca6ea1SDimitry Andric  let BufferSize = 120;
122*0fca6ea1SDimitry Andric}
123*0fca6ea1SDimitry Andric
124*0fca6ea1SDimitry Andric// Direct Conditional Branch instructions on ports I0/I1.
125*0fca6ea1SDimitry Andricdef ORYONI01 : ProcResGroup<[ORYONP0, ORYONP1]> {
126*0fca6ea1SDimitry Andric  let BufferSize = 40;
127*0fca6ea1SDimitry Andric}
128*0fca6ea1SDimitry Andric
129*0fca6ea1SDimitry Andric// Indirect/crypto Conditional Branch instructions on ports I0.
130*0fca6ea1SDimitry Andricdef ORYONI0 : ProcResGroup<[ORYONP0]> {
131*0fca6ea1SDimitry Andric  let BufferSize = 20;
132*0fca6ea1SDimitry Andric}
133*0fca6ea1SDimitry Andric
134*0fca6ea1SDimitry Andric// Crypto/CRC/PAU instructions on ports I2.
135*0fca6ea1SDimitry Andricdef ORYONI2 : ProcResGroup<[ORYONP2]> {
136*0fca6ea1SDimitry Andric  let BufferSize = 20;
137*0fca6ea1SDimitry Andric}
138*0fca6ea1SDimitry Andric
139*0fca6ea1SDimitry Andric// Multiply/Multiply-ADD instructions on ports I4/I5.
140*0fca6ea1SDimitry Andricdef ORYONI45 : ProcResGroup<[ORYONP4, ORYONP5]> {
141*0fca6ea1SDimitry Andric  let BufferSize = 40;
142*0fca6ea1SDimitry Andric}
143*0fca6ea1SDimitry Andric
144*0fca6ea1SDimitry Andric// Divide instructions on ports I5.
145*0fca6ea1SDimitry Andricdef ORYONI5 : ProcResGroup<[ORYONP5]> {
146*0fca6ea1SDimitry Andric  let BufferSize = 20;
147*0fca6ea1SDimitry Andric}
148*0fca6ea1SDimitry Andric
149*0fca6ea1SDimitry Andric// Comparison instructions on ports I0/I1/I2/I3.
150*0fca6ea1SDimitry Andricdef ORYONI0123 : ProcResGroup<[ORYONP0, ORYONP1,
151*0fca6ea1SDimitry Andric                                ORYONP2, ORYONP3]> {
152*0fca6ea1SDimitry Andric  let BufferSize = 80;
153*0fca6ea1SDimitry Andric}
154*0fca6ea1SDimitry Andric
155*0fca6ea1SDimitry Andric// Load instructions on ports P6/P7/P8/P9.
156*0fca6ea1SDimitry Andricdef ORYONLD : ProcResGroup<[ORYONP6, ORYONP7, ORYONP8, ORYONP9]> {
157*0fca6ea1SDimitry Andric  let BufferSize = 64;
158*0fca6ea1SDimitry Andric}
159*0fca6ea1SDimitry Andric
160*0fca6ea1SDimitry Andric// Store instructions on combo of STA/STD pipes
161*0fca6ea1SDimitry Andricdef ORYONST : ProcResGroup<[ORYONST0, ORYONST1]> {
162*0fca6ea1SDimitry Andric    let BufferSize = 64;
163*0fca6ea1SDimitry Andric}
164*0fca6ea1SDimitry Andric
165*0fca6ea1SDimitry Andric// Arithmetic and CRYP-AED ASIMD/FP instructions on ports FP0/FP1/FP2/FP3.
166*0fca6ea1SDimitry Andricdef ORYONFP0123 : ProcResGroup<[ORYONP12FP0, ORYONP13FP1,
167*0fca6ea1SDimitry Andric                                   ORYONP14FP2, ORYONP15FP3]> {
168*0fca6ea1SDimitry Andric  let BufferSize = 192;
169*0fca6ea1SDimitry Andric}
170*0fca6ea1SDimitry Andric
171*0fca6ea1SDimitry Andric// FP Comparison and F/I move instructions on ports FP0/FP1.
172*0fca6ea1SDimitry Andricdef ORYONFP01 : ProcResGroup<[ORYONP12FP0, ORYONP13FP1]> {
173*0fca6ea1SDimitry Andric  let BufferSize = 96;
174*0fca6ea1SDimitry Andric}
175*0fca6ea1SDimitry Andric
176*0fca6ea1SDimitry Andric// FDIV instructions on ports FP3.
177*0fca6ea1SDimitry Andricdef ORYONFP3 : ProcResGroup<[ORYONP15FP3]> {
178*0fca6ea1SDimitry Andric  let BufferSize = 48;
179*0fca6ea1SDimitry Andric}
180*0fca6ea1SDimitry Andric
181*0fca6ea1SDimitry Andric// CRYP-SHA instructions on ports FP1.
182*0fca6ea1SDimitry Andricdef ORYONFP1 : ProcResGroup<[ORYONP14FP2]> {
183*0fca6ea1SDimitry Andric  let BufferSize = 48;
184*0fca6ea1SDimitry Andric}
185*0fca6ea1SDimitry Andric
186*0fca6ea1SDimitry Andricdef ORYONFP2 : ProcResGroup<[ORYONP14FP2]> {
187*0fca6ea1SDimitry Andric  let BufferSize = 48;
188*0fca6ea1SDimitry Andric}
189*0fca6ea1SDimitry Andric
190*0fca6ea1SDimitry Andric// Reciprocal, Squre root on FP0.
191*0fca6ea1SDimitry Andricdef ORYONFP0 : ProcResGroup<[ORYONP12FP0]> {
192*0fca6ea1SDimitry Andric  let BufferSize = 48;
193*0fca6ea1SDimitry Andric}
194*0fca6ea1SDimitry Andric
195*0fca6ea1SDimitry Andric// cross IXU/LSU/VXU resource group for FMOV P41 of VXU
196*0fca6ea1SDimitry Andric// I2V
197*0fca6ea1SDimitry Andricdef ORYONI2V : ProcResGroup<[ORYONI4FP0, ORYONI5FP1]> {
198*0fca6ea1SDimitry Andric    let BufferSize = 40;
199*0fca6ea1SDimitry Andric}
200*0fca6ea1SDimitry Andric
201*0fca6ea1SDimitry Andric// V2I
202*0fca6ea1SDimitry Andricdef ORYONV2I : ProcResGroup<[ORYONFP0I4, ORYONFP1I5]> {
203*0fca6ea1SDimitry Andric    let BufferSize = 96;
204*0fca6ea1SDimitry Andric}
205*0fca6ea1SDimitry Andric
206*0fca6ea1SDimitry Andric// Define commonly used write types for InstRW specializations.
207*0fca6ea1SDimitry Andric// All definitions follow the format: ORYONWrite_<NumCycles>Cyc_<Resources>.
208*0fca6ea1SDimitry Andric
209*0fca6ea1SDimitry Andric// Because of the complexity of Oryon CPU, we skip the following
210*0fca6ea1SDimitry Andric// generic definitions and define each instruction specifically
211*0fca6ea1SDimitry Andric
212*0fca6ea1SDimitry Andric// These WriteRes entries are not used in the Falkor sched model.
213*0fca6ea1SDimitry Andricdef : WriteRes<WriteImm, []>     { let Unsupported = 1; }
214*0fca6ea1SDimitry Andricdef : WriteRes<WriteI, []>       { let Unsupported = 1; }
215*0fca6ea1SDimitry Andricdef : WriteRes<WriteISReg, []>   { let Unsupported = 1; }
216*0fca6ea1SDimitry Andricdef : WriteRes<WriteIEReg, []>   { let Unsupported = 1; }
217*0fca6ea1SDimitry Andricdef : WriteRes<WriteExtr, []>    { let Unsupported = 1; }
218*0fca6ea1SDimitry Andricdef : WriteRes<WriteIS, []>      { let Unsupported = 1; }
219*0fca6ea1SDimitry Andricdef : WriteRes<WriteID32, []>    { let Unsupported = 1; }
220*0fca6ea1SDimitry Andricdef : WriteRes<WriteID64, []>    { let Unsupported = 1; }
221*0fca6ea1SDimitry Andricdef : WriteRes<WriteIM32, []>    { let Unsupported = 1; }
222*0fca6ea1SDimitry Andricdef : WriteRes<WriteIM64, []>    { let Unsupported = 1; }
223*0fca6ea1SDimitry Andricdef : WriteRes<WriteBr, []>      { let Unsupported = 1; }
224*0fca6ea1SDimitry Andricdef : WriteRes<WriteBrReg, []>   { let Unsupported = 1; }
225*0fca6ea1SDimitry Andricdef : WriteRes<WriteLD, []>      { let Unsupported = 1; }
226*0fca6ea1SDimitry Andricdef : WriteRes<WriteST, []>      { let Unsupported = 1; }
227*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTP, []>     { let Unsupported = 1; }
228*0fca6ea1SDimitry Andricdef : WriteRes<WriteAdr, []>     { let Unsupported = 1; }
229*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDIdx, []>   { let Unsupported = 1; }
230*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTIdx, []>   { let Unsupported = 1; }
231*0fca6ea1SDimitry Andricdef : WriteRes<WriteF, []>       { let Unsupported = 1; }
232*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCmp, []>    { let Unsupported = 1; }
233*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvt, []>    { let Unsupported = 1; }
234*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCopy, []>   { let Unsupported = 1; }
235*0fca6ea1SDimitry Andricdef : WriteRes<WriteFImm, []>    { let Unsupported = 1; }
236*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMul, []>    { let Unsupported = 1; }
237*0fca6ea1SDimitry Andricdef : WriteRes<WriteFDiv, []>    { let Unsupported = 1; }
238*0fca6ea1SDimitry Andricdef : WriteRes<WriteVd, []>      { let Unsupported = 1; }
239*0fca6ea1SDimitry Andricdef : WriteRes<WriteVq, []>      { let Unsupported = 1; }
240*0fca6ea1SDimitry Andricdef : WriteRes<WriteVLD, []>     { let Unsupported = 1; }
241*0fca6ea1SDimitry Andricdef : WriteRes<WriteVST, []>     { let Unsupported = 1; }
242*0fca6ea1SDimitry Andricdef : WriteRes<WriteSys, []>     { let Unsupported = 1; }
243*0fca6ea1SDimitry Andricdef : WriteRes<WriteBarrier, []> { let Unsupported = 1; }
244*0fca6ea1SDimitry Andricdef : WriteRes<WriteHint, []>    { let Unsupported = 1; }
245*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDHi, []>    { let Unsupported = 1; }
246*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomic, []>  { let Unsupported = 1; }
247*0fca6ea1SDimitry Andric
248*0fca6ea1SDimitry Andric// These ReadAdvance entries will be defined in later implementation
249*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadI,       0>;
250*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadISReg,   0>;
251*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIEReg,   0>;
252*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIM,      0>;
253*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIMA,     0>;
254*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadID,      0>;
255*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadExtrHi,  0>;
256*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>;
257*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVLD,     0>;
258*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadST,      0>;
259*0fca6ea1SDimitry Andric
260*0fca6ea1SDimitry Andric
261*0fca6ea1SDimitry Andric//IXU resource definition
262*0fca6ea1SDimitry Andric// 1 cycles NO pipe
263*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_NONE : SchedWriteRes<[]>;
264*0fca6ea1SDimitry Andric
265*0fca6ea1SDimitry Andric// 1 cycles on I01.
266*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_I01 : SchedWriteRes<[ORYONI01]>;
267*0fca6ea1SDimitry Andric
268*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_2Uops_I01 : SchedWriteRes<[ORYONI01]> {
269*0fca6ea1SDimitry Andric  let NumMicroOps = 2;
270*0fca6ea1SDimitry Andric}
271*0fca6ea1SDimitry Andric
272*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_I0 : SchedWriteRes<[ORYONI0]>;
273*0fca6ea1SDimitry Andric
274*0fca6ea1SDimitry Andric// 7 cycles on I2. PAC*/AUT* instructions
275*0fca6ea1SDimitry Andricdef ORYONWrite_7Cyc_I2 : SchedWriteRes<[ORYONI2]> {
276*0fca6ea1SDimitry Andric  let Latency = 7;
277*0fca6ea1SDimitry Andric}
278*0fca6ea1SDimitry Andric
279*0fca6ea1SDimitry Andric// 7 cycles on I2. PAC*/AUT* instructions
280*0fca6ea1SDimitry Andricdef ORYONWrite_7Cyc_3Uops_I2 : SchedWriteRes<[ORYONI2]> {
281*0fca6ea1SDimitry Andric  let Latency = 7;
282*0fca6ea1SDimitry Andric  let NumMicroOps = 3;
283*0fca6ea1SDimitry Andric}
284*0fca6ea1SDimitry Andric
285*0fca6ea1SDimitry Andric// 9 (7+1+1) cycles on I2 and I0/I1, I0. Authentication branch instructions
286*0fca6ea1SDimitry Andric// these instructions are broken down to three uops
287*0fca6ea1SDimitry Andric// a.	PtrAuth on pipe 2 taking 7 cycles
288*0fca6ea1SDimitry Andric// b.	Link Register Update on pipes 0 and 1 taking 1 cycle
289*0fca6ea1SDimitry Andric// c.	Indirect branch on pipe 0 taking 1 cycle
290*0fca6ea1SDimitry Andric
291*0fca6ea1SDimitry Andricdef ORYONWrite_9Cyc_I012 : SchedWriteRes<[ORYONI2, ORYONI01]> {
292*0fca6ea1SDimitry Andric  let Latency = 9;
293*0fca6ea1SDimitry Andric  let NumMicroOps = 3;
294*0fca6ea1SDimitry Andric}
295*0fca6ea1SDimitry Andric
296*0fca6ea1SDimitry Andric// 3 cycles on I2. CRC32 and CRC32C instructions
297*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_I2 : SchedWriteRes<[ORYONI2]> {
298*0fca6ea1SDimitry Andric  let Latency = 3;
299*0fca6ea1SDimitry Andric}
300*0fca6ea1SDimitry Andric
301*0fca6ea1SDimitry Andric// 1 cycle on I012345
302*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_I012345 : SchedWriteRes<[ORYONI012345]>;
303*0fca6ea1SDimitry Andric
304*0fca6ea1SDimitry Andric// 1 cycle on I0123
305*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_I0123 : SchedWriteRes<[ORYONI0123]>;
306*0fca6ea1SDimitry Andric
307*0fca6ea1SDimitry Andric// 1 cycle on 2 of I012345
308*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_I012345_I012345 :
309*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONI012345, ORYONI012345]> ;
310*0fca6ea1SDimitry Andric
311*0fca6ea1SDimitry Andric// 2 cycle on 2 of I0123 with ReleaseAtCycles
312*0fca6ea1SDimitry Andricdef ORYONWrite_2Cyc_I0123_I0123_RC :
313*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONI0123, ORYONI0123]> {
314*0fca6ea1SDimitry Andric  let Latency = 2;
315*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2,2];
316*0fca6ea1SDimitry Andric}
317*0fca6ea1SDimitry Andric
318*0fca6ea1SDimitry Andric// 2 cycle on 2 of I012345
319*0fca6ea1SDimitry Andricdef ORYONWrite_2Cyc_I012345_I012345_RC :
320*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONI012345, ORYONI012345]> {
321*0fca6ea1SDimitry Andric  let Latency = 2;
322*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2,2];
323*0fca6ea1SDimitry Andric}
324*0fca6ea1SDimitry Andric
325*0fca6ea1SDimitry Andric// 3 cycle on 2 of I45
326*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_I45_I45_RC :
327*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONI45, ORYONI45]> {
328*0fca6ea1SDimitry Andric  let Latency = 3;
329*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2,2];
330*0fca6ea1SDimitry Andric}
331*0fca6ea1SDimitry Andric
332*0fca6ea1SDimitry Andric// 3 cycle on I45
333*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_I45 : SchedWriteRes<[ORYONI45]> {
334*0fca6ea1SDimitry Andric  let Latency = 3;
335*0fca6ea1SDimitry Andric}
336*0fca6ea1SDimitry Andric
337*0fca6ea1SDimitry Andric// 7 cycle on I2 32-bit integer division
338*0fca6ea1SDimitry Andricdef ORYONWrite_7Cyc_I2_RC : SchedWriteRes<[ORYONI2]> {
339*0fca6ea1SDimitry Andric  let Latency = 7;
340*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2];
341*0fca6ea1SDimitry Andric}
342*0fca6ea1SDimitry Andric
343*0fca6ea1SDimitry Andric// 9 cycle on I2 64-bit integer division
344*0fca6ea1SDimitry Andricdef ORYONWrite_9Cyc_I2_RC : SchedWriteRes<[ORYONI2]> {
345*0fca6ea1SDimitry Andric  let Latency = 9;
346*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2];
347*0fca6ea1SDimitry Andric}
348*0fca6ea1SDimitry Andric
349*0fca6ea1SDimitry Andric// LSU resource definition
350*0fca6ea1SDimitry Andric// need to define WriteLDAdr, WriteAdrAdr, WriteLDHi, WriteSTX
351*0fca6ea1SDimitry Andric// 4 cycle on LS(P6789)
352*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_LD : SchedWriteRes<[ORYONLD]> {
353*0fca6ea1SDimitry Andric  let Latency = 4;
354*0fca6ea1SDimitry Andric}
355*0fca6ea1SDimitry Andric
356*0fca6ea1SDimitry Andric// 4 cycle for Post/Pre inc/dec access, also covers all pair loads Post/Pre
357*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> {
358*0fca6ea1SDimitry Andric  let Latency = 4;
359*0fca6ea1SDimitry Andric}
360*0fca6ea1SDimitry Andric
361*0fca6ea1SDimitry Andric// 5 (4+1) for VXU SIMD access/could also include FP
362*0fca6ea1SDimitry Andric// resource might not be correct, as VXU resource not included
363*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_LD : SchedWriteRes<[ORYONLD]> {
364*0fca6ea1SDimitry Andric  let Latency = 5;
365*0fca6ea1SDimitry Andric}
366*0fca6ea1SDimitry Andric
367*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_2Uops_LD : SchedWriteRes<[ORYONLD]> {
368*0fca6ea1SDimitry Andric  let Latency = 5;
369*0fca6ea1SDimitry Andric  let NumMicroOps = 2;
370*0fca6ea1SDimitry Andric}
371*0fca6ea1SDimitry Andric
372*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_3Uops_LD : SchedWriteRes<[ORYONLD]> {
373*0fca6ea1SDimitry Andric  let Latency = 5;
374*0fca6ea1SDimitry Andric  let NumMicroOps = 3;
375*0fca6ea1SDimitry Andric}
376*0fca6ea1SDimitry Andric
377*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_4Uops_LD : SchedWriteRes<[ORYONLD]> {
378*0fca6ea1SDimitry Andric  let Latency = 5;
379*0fca6ea1SDimitry Andric  let NumMicroOps = 4;
380*0fca6ea1SDimitry Andric}
381*0fca6ea1SDimitry Andric
382*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_5Uops_LD : SchedWriteRes<[ORYONLD]> {
383*0fca6ea1SDimitry Andric  let Latency = 5;
384*0fca6ea1SDimitry Andric  let NumMicroOps = 5;
385*0fca6ea1SDimitry Andric}
386*0fca6ea1SDimitry Andric
387*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_6Uops_LD : SchedWriteRes<[ORYONLD]> {
388*0fca6ea1SDimitry Andric  let Latency = 5;
389*0fca6ea1SDimitry Andric  let NumMicroOps = 6;
390*0fca6ea1SDimitry Andric}
391*0fca6ea1SDimitry Andric
392*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_8Uops_LD : SchedWriteRes<[ORYONLD]> {
393*0fca6ea1SDimitry Andric  let Latency = 5;
394*0fca6ea1SDimitry Andric  let NumMicroOps = 8;
395*0fca6ea1SDimitry Andric}
396*0fca6ea1SDimitry Andric
397*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_10Uops_LD : SchedWriteRes<[ORYONLD]> {
398*0fca6ea1SDimitry Andric  let Latency = 5;
399*0fca6ea1SDimitry Andric  let NumMicroOps = 10;
400*0fca6ea1SDimitry Andric}
401*0fca6ea1SDimitry Andric
402*0fca6ea1SDimitry Andric// 6 cycle for Post/Pre inc/dec access
403*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> {
404*0fca6ea1SDimitry Andric  let Latency = 5;
405*0fca6ea1SDimitry Andric}
406*0fca6ea1SDimitry Andric
407*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_2Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> {
408*0fca6ea1SDimitry Andric  let Latency = 5;
409*0fca6ea1SDimitry Andric  let NumMicroOps = 2;
410*0fca6ea1SDimitry Andric}
411*0fca6ea1SDimitry Andric
412*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_3Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> {
413*0fca6ea1SDimitry Andric  let Latency = 5;
414*0fca6ea1SDimitry Andric  let NumMicroOps = 3;
415*0fca6ea1SDimitry Andric}
416*0fca6ea1SDimitry Andric
417*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_4Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> {
418*0fca6ea1SDimitry Andric  let Latency = 5;
419*0fca6ea1SDimitry Andric  let NumMicroOps = 4;
420*0fca6ea1SDimitry Andric}
421*0fca6ea1SDimitry Andric
422*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_5Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> {
423*0fca6ea1SDimitry Andric  let Latency = 5;
424*0fca6ea1SDimitry Andric  let NumMicroOps = 5;
425*0fca6ea1SDimitry Andric}
426*0fca6ea1SDimitry Andric
427*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_6Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> {
428*0fca6ea1SDimitry Andric  let Latency = 5;
429*0fca6ea1SDimitry Andric  let NumMicroOps = 6;
430*0fca6ea1SDimitry Andric}
431*0fca6ea1SDimitry Andric
432*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_8Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> {
433*0fca6ea1SDimitry Andric  let Latency = 5;
434*0fca6ea1SDimitry Andric  let NumMicroOps = 8;
435*0fca6ea1SDimitry Andric}
436*0fca6ea1SDimitry Andric
437*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_10Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> {
438*0fca6ea1SDimitry Andric  let Latency = 5;
439*0fca6ea1SDimitry Andric  let NumMicroOps = 10;
440*0fca6ea1SDimitry Andric}
441*0fca6ea1SDimitry Andric
442*0fca6ea1SDimitry Andric// 1 cycle for all generic stores
443*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_ST : SchedWriteRes<[ORYONST]>;
444*0fca6ea1SDimitry Andric
445*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_2Uops_ST : SchedWriteRes<[ORYONST]> {
446*0fca6ea1SDimitry Andric  let NumMicroOps = 2;
447*0fca6ea1SDimitry Andric}
448*0fca6ea1SDimitry Andric
449*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_3Uops_ST : SchedWriteRes<[ORYONST]> {
450*0fca6ea1SDimitry Andric  let NumMicroOps = 3;
451*0fca6ea1SDimitry Andric}
452*0fca6ea1SDimitry Andric
453*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_4Uops_ST : SchedWriteRes<[ORYONST]> {
454*0fca6ea1SDimitry Andric  let NumMicroOps = 4;
455*0fca6ea1SDimitry Andric}
456*0fca6ea1SDimitry Andric
457*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_5Uops_ST : SchedWriteRes<[ORYONST]> {
458*0fca6ea1SDimitry Andric  let NumMicroOps = 5;
459*0fca6ea1SDimitry Andric}
460*0fca6ea1SDimitry Andric
461*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_6Uops_ST : SchedWriteRes<[ORYONST]> {
462*0fca6ea1SDimitry Andric  let NumMicroOps = 6;
463*0fca6ea1SDimitry Andric}
464*0fca6ea1SDimitry Andric
465*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_8Uops_ST : SchedWriteRes<[ORYONST]> {
466*0fca6ea1SDimitry Andric  let NumMicroOps = 8;
467*0fca6ea1SDimitry Andric}
468*0fca6ea1SDimitry Andric
469*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_10Uops_ST : SchedWriteRes<[ORYONST]> {
470*0fca6ea1SDimitry Andric  let NumMicroOps = 10;
471*0fca6ea1SDimitry Andric}
472*0fca6ea1SDimitry Andric
473*0fca6ea1SDimitry Andric// 1 cycle for neon write: float + ASIMD with Post/Pre Inc/Dec access
474*0fca6ea1SDimitry Andric// also includes Pair store until further informed
475*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> {
476*0fca6ea1SDimitry Andric  let NumMicroOps = 3;
477*0fca6ea1SDimitry Andric}
478*0fca6ea1SDimitry Andric
479*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_2Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> {
480*0fca6ea1SDimitry Andric  let NumMicroOps = 2;
481*0fca6ea1SDimitry Andric}
482*0fca6ea1SDimitry Andric
483*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_3Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> {
484*0fca6ea1SDimitry Andric  let NumMicroOps = 3;
485*0fca6ea1SDimitry Andric}
486*0fca6ea1SDimitry Andric
487*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_4Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> {
488*0fca6ea1SDimitry Andric  let NumMicroOps = 4;
489*0fca6ea1SDimitry Andric}
490*0fca6ea1SDimitry Andric
491*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_5Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> {
492*0fca6ea1SDimitry Andric  let NumMicroOps = 5;
493*0fca6ea1SDimitry Andric}
494*0fca6ea1SDimitry Andric
495*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_6Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> {
496*0fca6ea1SDimitry Andric  let NumMicroOps = 6;
497*0fca6ea1SDimitry Andric}
498*0fca6ea1SDimitry Andric
499*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_8Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> {
500*0fca6ea1SDimitry Andric  let NumMicroOps = 8;
501*0fca6ea1SDimitry Andric}
502*0fca6ea1SDimitry Andric
503*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_10Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> {
504*0fca6ea1SDimitry Andric  let NumMicroOps = 10;
505*0fca6ea1SDimitry Andric}
506*0fca6ea1SDimitry Andric
507*0fca6ea1SDimitry Andric// VXU resource definition
508*0fca6ea1SDimitry Andric
509*0fca6ea1SDimitry Andric// I2V instruction has 1 uOp
510*0fca6ea1SDimitry Andric// I2v with convert has 2 uOps
511*0fca6ea1SDimitry Andric// all I2V, V2I's throughputs are 2
512*0fca6ea1SDimitry Andric// On VXU doc, p37 -- latencies and throughput
513*0fca6ea1SDimitry Andric// P41, resource taken, P42, uOps
514*0fca6ea1SDimitry Andricdef ORYONWrite_I2V_4Cyc_I45 : SchedWriteRes<[ORYONI2V]> {
515*0fca6ea1SDimitry Andric  let Latency = 4;
516*0fca6ea1SDimitry Andric}
517*0fca6ea1SDimitry Andric
518*0fca6ea1SDimitry Andric// inline a FCVT, so add one more uOp
519*0fca6ea1SDimitry Andricdef ORYONWrite_I2V_7Cyc_I45 : SchedWriteRes<[ORYONI2V]> {
520*0fca6ea1SDimitry Andric  let Latency = 7;
521*0fca6ea1SDimitry Andric  let NumMicroOps = 2;
522*0fca6ea1SDimitry Andric}
523*0fca6ea1SDimitry Andric
524*0fca6ea1SDimitry Andric// V2I move instruction has 1/2 uOps, P42 in VXU doc
525*0fca6ea1SDimitry Andric// Latency is 3, FCVT is also 3 cycle
526*0fca6ea1SDimitry Andric// move + convert is 6 (3+3) cycles
527*0fca6ea1SDimitry Andric// throughput is 2
528*0fca6ea1SDimitry Andricdef ORYONWrite_V2I_3Cyc_FP01 : SchedWriteRes<[ORYONV2I]> {
529*0fca6ea1SDimitry Andric  let Latency = 3;
530*0fca6ea1SDimitry Andric}
531*0fca6ea1SDimitry Andric
532*0fca6ea1SDimitry Andric// inline a FCVT, so add one more uOp
533*0fca6ea1SDimitry Andricdef ORYONWrite_V2I_6Cyc_FP01 : SchedWriteRes<[ORYONV2I]> {
534*0fca6ea1SDimitry Andric  let Latency = 6;
535*0fca6ea1SDimitry Andric  let NumMicroOps = 2;
536*0fca6ea1SDimitry Andric}
537*0fca6ea1SDimitry Andric
538*0fca6ea1SDimitry Andricdef ORYONWrite_V2V_2Cyc_FP0123 : SchedWriteRes<[ORYONFP0123]> {
539*0fca6ea1SDimitry Andric  let Latency = 2;
540*0fca6ea1SDimitry Andric}
541*0fca6ea1SDimitry Andric
542*0fca6ea1SDimitry Andricdef ORYONWrite_V2V_3Cyc_FP0123 : SchedWriteRes<[ORYONFP0123]> {
543*0fca6ea1SDimitry Andric  let Latency = 3;
544*0fca6ea1SDimitry Andric}
545*0fca6ea1SDimitry Andric
546*0fca6ea1SDimitry Andricdef ORYONWrite_V2V_6Cyc_FP01 : SchedWriteRes<[ORYONFP0123]> {
547*0fca6ea1SDimitry Andric  let Latency = 6;
548*0fca6ea1SDimitry Andric  let NumMicroOps = 3;
549*0fca6ea1SDimitry Andric}
550*0fca6ea1SDimitry Andric
551*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_FP0123 : SchedWriteRes<[ORYONFP0123]> {
552*0fca6ea1SDimitry Andric  let Latency = 4;
553*0fca6ea1SDimitry Andric}
554*0fca6ea1SDimitry Andric
555*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_FP0 : SchedWriteRes<[ORYONFP0]> {
556*0fca6ea1SDimitry Andric  let Latency = 3;
557*0fca6ea1SDimitry Andric}
558*0fca6ea1SDimitry Andric
559*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_FP0123 : SchedWriteRes<[ORYONFP0123]> {
560*0fca6ea1SDimitry Andric  let Latency = 3;
561*0fca6ea1SDimitry Andric}
562*0fca6ea1SDimitry Andric
563*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_2Uops_FP0123 : SchedWriteRes<[ORYONFP0123]> {
564*0fca6ea1SDimitry Andric  let Latency = 3;
565*0fca6ea1SDimitry Andric  let NumMicroOps = 2;
566*0fca6ea1SDimitry Andric}
567*0fca6ea1SDimitry Andric
568*0fca6ea1SDimitry Andricdef ORYONWrite_2Cyc_FP0123 : SchedWriteRes<[ORYONFP0123]> {
569*0fca6ea1SDimitry Andric  let Latency = 2;
570*0fca6ea1SDimitry Andric}
571*0fca6ea1SDimitry Andric
572*0fca6ea1SDimitry Andricdef ORYONWrite_2Cyc_FP01 : SchedWriteRes<[ORYONFP01]> {
573*0fca6ea1SDimitry Andric  let Latency = 2;
574*0fca6ea1SDimitry Andric}
575*0fca6ea1SDimitry Andric
576*0fca6ea1SDimitry Andric// 2 cycle on FP1
577*0fca6ea1SDimitry Andricdef ORYONWrite_2Cyc_FP1 : SchedWriteRes<[ORYONFP1]> {
578*0fca6ea1SDimitry Andric  let Latency = 2;
579*0fca6ea1SDimitry Andric}
580*0fca6ea1SDimitry Andric
581*0fca6ea1SDimitry Andric// 3 cycle on FP1
582*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_FP1 : SchedWriteRes<[ORYONFP1]> {
583*0fca6ea1SDimitry Andric  let Latency = 3;
584*0fca6ea1SDimitry Andric}
585*0fca6ea1SDimitry Andric
586*0fca6ea1SDimitry Andric// 4 cycle , 0.5 throughput on FP1
587*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_FP1_RC4 : SchedWriteRes<[ORYONFP1]> {
588*0fca6ea1SDimitry Andric  let Latency = 4;
589*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [4];
590*0fca6ea1SDimitry Andric}
591*0fca6ea1SDimitry Andric
592*0fca6ea1SDimitry Andric// 5 cycle , 1 throughput on FP1
593*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_FP1 : SchedWriteRes<[ORYONFP1]> {
594*0fca6ea1SDimitry Andric  let Latency = 5;
595*0fca6ea1SDimitry Andric}
596*0fca6ea1SDimitry Andric
597*0fca6ea1SDimitry Andric// 8 cycle , 2 throughput on FP0123
598*0fca6ea1SDimitry Andricdef ORYONWrite_8Cyc_FP0123_RC : SchedWriteRes<[ORYONFP0123]> {
599*0fca6ea1SDimitry Andric  let Latency = 8;
600*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2];
601*0fca6ea1SDimitry Andric}
602*0fca6ea1SDimitry Andric
603*0fca6ea1SDimitry Andricdef ORYONWrite_6Cyc_FP3 : SchedWriteRes<[ORYONFP3]> {
604*0fca6ea1SDimitry Andric  let Latency = 6;
605*0fca6ea1SDimitry Andric}
606*0fca6ea1SDimitry Andric
607*0fca6ea1SDimitry Andricdef ORYONWrite_7Cyc_FP3 : SchedWriteRes<[ORYONFP3]> {
608*0fca6ea1SDimitry Andric  let Latency = 7;
609*0fca6ea1SDimitry Andric}
610*0fca6ea1SDimitry Andric
611*0fca6ea1SDimitry Andricdef ORYONWrite_8Cyc_FP3 : SchedWriteRes<[ORYONFP3]> {
612*0fca6ea1SDimitry Andric  let Latency = 8;
613*0fca6ea1SDimitry Andric}
614*0fca6ea1SDimitry Andric
615*0fca6ea1SDimitry Andricdef ORYONWrite_9Cyc_FP3 : SchedWriteRes<[ORYONFP3]> {
616*0fca6ea1SDimitry Andric  let Latency = 9;
617*0fca6ea1SDimitry Andric}
618*0fca6ea1SDimitry Andric
619*0fca6ea1SDimitry Andricdef ORYONWrite_10Cyc_FP3 : SchedWriteRes<[ORYONFP3]> {
620*0fca6ea1SDimitry Andric  let Latency = 10;
621*0fca6ea1SDimitry Andric}
622*0fca6ea1SDimitry Andric
623*0fca6ea1SDimitry Andricdef ORYONWrite_8Cyc_FP3_RC : SchedWriteRes<[ORYONFP3]> {
624*0fca6ea1SDimitry Andric  let Latency = 8;
625*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2];
626*0fca6ea1SDimitry Andric}
627*0fca6ea1SDimitry Andric
628*0fca6ea1SDimitry Andricdef ORYONWrite_10Cyc_FP3_RC : SchedWriteRes<[ORYONFP3]> {
629*0fca6ea1SDimitry Andric  let Latency = 10;
630*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2];
631*0fca6ea1SDimitry Andric}
632*0fca6ea1SDimitry Andric
633*0fca6ea1SDimitry Andricdef ORYONWrite_13Cyc_FP3_RC : SchedWriteRes<[ORYONFP3]> {
634*0fca6ea1SDimitry Andric  let Latency = 13;
635*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2];
636*0fca6ea1SDimitry Andric}
637*0fca6ea1SDimitry Andric
638*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_FP0123_RC :
639*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONFP0123]> {
640*0fca6ea1SDimitry Andric  let Latency = 4;
641*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2];
642*0fca6ea1SDimitry Andric}
643*0fca6ea1SDimitry Andric
644*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_FP0123_FP0123_RC :
645*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONFP0123, ORYONFP0123]> {
646*0fca6ea1SDimitry Andric  let Latency = 4;
647*0fca6ea1SDimitry Andric  let NumMicroOps = 2;
648*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [2,2];
649*0fca6ea1SDimitry Andric}
650*0fca6ea1SDimitry Andric
651*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_FP0123_FP0123_FP0123_RC :
652*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONFP0123, ORYONFP0123, ORYONFP0123]> {
653*0fca6ea1SDimitry Andric  let Latency = 4;
654*0fca6ea1SDimitry Andric  let NumMicroOps = 3;
655*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [3,3,3];
656*0fca6ea1SDimitry Andric}
657*0fca6ea1SDimitry Andric
658*0fca6ea1SDimitry Andricdef ORYONWrite_6Cyc_FP0123_FP0123_FP0123_FP0123_RC :
659*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONFP0123, ORYONFP0123, ORYONFP0123, ORYONFP0123]> {
660*0fca6ea1SDimitry Andric  let Latency = 6;
661*0fca6ea1SDimitry Andric  let NumMicroOps = 4;
662*0fca6ea1SDimitry Andric  let ReleaseAtCycles = [6,6,6,6];
663*0fca6ea1SDimitry Andric}
664*0fca6ea1SDimitry Andric
665*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
666*0fca6ea1SDimitry Andric// Instruction Tables in IXU
667*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
668*0fca6ea1SDimitry Andric
669*0fca6ea1SDimitry Andric//---
670*0fca6ea1SDimitry Andric// Arithmetic Instructions
671*0fca6ea1SDimitry Andric//---
672*0fca6ea1SDimitry Andric
673*0fca6ea1SDimitry Andric//1, 1, 6
674*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345],
675*0fca6ea1SDimitry Andric            (instregex "^ADD(W|X)r(i|r|x)", "^SUB(W|X)r(i|r|x)")>;
676*0fca6ea1SDimitry Andric
677*0fca6ea1SDimitry Andric//2,2,3
678*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_I012345_I012345_RC],
679*0fca6ea1SDimitry Andric            (instregex "^ADD(W|X)rs", "^SUB(W|X)rs")>;
680*0fca6ea1SDimitry Andric
681*0fca6ea1SDimitry Andric//1,1,4 alias CMP, CMN on page 75
682*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123],
683*0fca6ea1SDimitry Andric            (instregex "^ADDS(W|X)r(i|r|x)(64)?", "^SUBS(W|X)r(i|r|x)")>;
684*0fca6ea1SDimitry Andric
685*0fca6ea1SDimitry Andric//2,2,2 alias CMP, CMN on page 75
686*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_I0123_I0123_RC],
687*0fca6ea1SDimitry Andric            (instregex "^ADDS(W|X)rs", "^SUBS(W|X)rs")>;
688*0fca6ea1SDimitry Andric
689*0fca6ea1SDimitry Andric//1,1,4
690*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123],
691*0fca6ea1SDimitry Andric            (instregex "^ADC(W|X)r","^SBC(W|X)r",
692*0fca6ea1SDimitry Andric                       "^ADCS(W|X)r","^SBCS(W|X)r")>;
693*0fca6ea1SDimitry Andric
694*0fca6ea1SDimitry Andric//1,1,2
695*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_I01],
696*0fca6ea1SDimitry Andric            (instrs ADR,ADRP)>;
697*0fca6ea1SDimitry Andric
698*0fca6ea1SDimitry Andric//1,1,4
699*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123],
700*0fca6ea1SDimitry Andric            (instregex "^CSEL(W|X)r", "^CSINV(W|X)r",
701*0fca6ea1SDimitry Andric                       "^CSNEG(W|X)r", "^CSINC(W|X)r")>;
702*0fca6ea1SDimitry Andric
703*0fca6ea1SDimitry Andric//---
704*0fca6ea1SDimitry Andric//Compare Instruciton
705*0fca6ea1SDimitry Andric//---
706*0fca6ea1SDimitry Andric
707*0fca6ea1SDimitry Andric// We have CCMP, CCMN as LLVM DAG node
708*0fca6ea1SDimitry Andric// CMP is an alias of SUBS as above
709*0fca6ea1SDimitry Andric// CMN is an alias of ADDS as above
710*0fca6ea1SDimitry Andric// We also have no way to get shift compare node in LLVM
711*0fca6ea1SDimitry Andric//2,2,1.5 CMP, CMN
712*0fca6ea1SDimitry Andric
713*0fca6ea1SDimitry Andric//1,1,4
714*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123],
715*0fca6ea1SDimitry Andric            (instregex "^CCMP(W|X)(i|r)", "^CCMN(W|X)(i|r)")>;
716*0fca6ea1SDimitry Andric
717*0fca6ea1SDimitry Andric//---
718*0fca6ea1SDimitry Andric// Branch
719*0fca6ea1SDimitry Andric//---
720*0fca6ea1SDimitry Andric
721*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_NONE], (instrs B)>;
722*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I01], (instrs BL)>;
723*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I01],
724*0fca6ea1SDimitry Andric            (instrs Bcc, CBZW, CBZX, CBNZW, CBNZX, TBZW, TBZX, TBNZW, TBNZX)>;
725*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0], (instrs BR, BLR)>;
726*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0], (instrs RET)>;
727*0fca6ea1SDimitry Andric
728*0fca6ea1SDimitry Andric// 3 uOp, 1 cycle for branch, 7 cycle for Authentication,
729*0fca6ea1SDimitry Andric// 1 cycle for updating link register
730*0fca6ea1SDimitry Andric// V8.3a PAC
731*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_9Cyc_I012],
732*0fca6ea1SDimitry Andric            (instrs BLRAA, BLRAAZ, BLRAB, BLRABZ,
733*0fca6ea1SDimitry Andric                    BRAA, BRAAZ, BRAB, BRABZ)>;
734*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_9Cyc_I012], (instrs RETAA, RETAB, ERETAA, ERETAB)>;
735*0fca6ea1SDimitry Andric
736*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_3Uops_I2], (instregex "^LDRAA", "^LDRAB")>;
737*0fca6ea1SDimitry Andric
738*0fca6ea1SDimitry Andric// Logical Instructions
739*0fca6ea1SDimitry Andric//---
740*0fca6ea1SDimitry Andric
741*0fca6ea1SDimitry Andric//1,1,4 TST is an alias of ANDS
742*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123],
743*0fca6ea1SDimitry Andric            (instregex "^ANDS(W|X)r(i|r|x)", "^BICS(W|X)r(i|r|x)")>;
744*0fca6ea1SDimitry Andric
745*0fca6ea1SDimitry Andric//2,2,2 TST shift is an alias
746*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_I0123_I0123_RC],
747*0fca6ea1SDimitry Andric            (instregex "^ANDS(W|X)rs", "^BICS(W|X)rs")>;
748*0fca6ea1SDimitry Andric
749*0fca6ea1SDimitry Andric//1,1,6
750*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345],
751*0fca6ea1SDimitry Andric            (instregex "^AND(W|X)r(i|r|x)", "^EOR(W|X)r(i|r|x)",
752*0fca6ea1SDimitry Andric                       "^ORR(W|X)r(i|r|x)", "^BIC(W|X)r(i|r|x)",
753*0fca6ea1SDimitry Andric                       "^EON(W|X)r(i|r|x)", "^ORN(W|X)r(i|r|x)")>;
754*0fca6ea1SDimitry Andric
755*0fca6ea1SDimitry Andric//2,2,3
756*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_I012345_I012345_RC],
757*0fca6ea1SDimitry Andric            (instregex "^AND(W|X)rs", "^EOR(W|X)rs", "^ORR(W|X)rs",
758*0fca6ea1SDimitry Andric                       "^BIC(W|X)rs", "^EON(W|X)rs", "^ORN(W|X)rs")>;
759*0fca6ea1SDimitry Andric
760*0fca6ea1SDimitry Andric
761*0fca6ea1SDimitry Andric//---
762*0fca6ea1SDimitry Andric// Shift Instructions
763*0fca6ea1SDimitry Andric//---
764*0fca6ea1SDimitry Andric
765*0fca6ea1SDimitry Andric//1,1,6
766*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345],
767*0fca6ea1SDimitry Andric            (instregex "^ASRV(W|X)r", "^LSLV(W|X)r",
768*0fca6ea1SDimitry Andric                       "^LSRV(W|X)r", "^RORV(W|X)r",
769*0fca6ea1SDimitry Andric                       "RMIF")>;
770*0fca6ea1SDimitry Andric
771*0fca6ea1SDimitry Andric//---
772*0fca6ea1SDimitry Andric// Move-Data Bit-field and Sign_Extension Instructions
773*0fca6ea1SDimitry Andric//---
774*0fca6ea1SDimitry Andric
775*0fca6ea1SDimitry Andric//1,1,6
776*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345],
777*0fca6ea1SDimitry Andric            (instregex "^MOVK(W|X)i", "^MOVN(W|X)i",
778*0fca6ea1SDimitry Andric                       "^MOVZ(W|X)i", "^SBFM(W|X)ri",
779*0fca6ea1SDimitry Andric                       "^UBFM(W|X)ri", "^BFM(W|X)ri",
780*0fca6ea1SDimitry Andric                       "^SXT(W|B|H|X)", "^UXT(H|B)")>;
781*0fca6ea1SDimitry Andric
782*0fca6ea1SDimitry Andric// COPY instruction is an LLVM internal DAG node, needs further study
783*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345], (instrs COPY)>;
784*0fca6ea1SDimitry Andric
785*0fca6ea1SDimitry Andric//---
786*0fca6ea1SDimitry Andric// Reverse Instructions
787*0fca6ea1SDimitry Andric//---
788*0fca6ea1SDimitry Andric
789*0fca6ea1SDimitry Andric//1,1,6
790*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345],
791*0fca6ea1SDimitry Andric            (instregex "^RBIT(W|X)r", "^REV(16|32|64)?(W|X)r")>;
792*0fca6ea1SDimitry Andric
793*0fca6ea1SDimitry Andric
794*0fca6ea1SDimitry Andric//---
795*0fca6ea1SDimitry Andric// Flag Manipulate Instructions
796*0fca6ea1SDimitry Andric//---
797*0fca6ea1SDimitry Andric
798*0fca6ea1SDimitry Andric//1,1,4
799*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123],
800*0fca6ea1SDimitry Andric            (instregex "^SETF8", "^SETF16", "^CFINV")>;
801*0fca6ea1SDimitry Andric
802*0fca6ea1SDimitry Andric//---
803*0fca6ea1SDimitry Andric// Miscellaneous Instructions
804*0fca6ea1SDimitry Andric//---
805*0fca6ea1SDimitry Andric
806*0fca6ea1SDimitry Andric//1,1,6
807*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345],
808*0fca6ea1SDimitry Andric              (instregex "^CLS(W|X)r$", "^CLZ(W|X)r$", "^EXTR(W|X)rri")>;
809*0fca6ea1SDimitry Andric
810*0fca6ea1SDimitry Andric
811*0fca6ea1SDimitry Andric//---
812*0fca6ea1SDimitry Andric// Multiply Instructions
813*0fca6ea1SDimitry Andric//---
814*0fca6ea1SDimitry Andric
815*0fca6ea1SDimitry Andric//1,3,2
816*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_I45],
817*0fca6ea1SDimitry Andric            (instregex "^MADD(W|X)rrr", "^MSUB(W|X)rrr",
818*0fca6ea1SDimitry Andric                       "^(S|U)MADDLrrr", "^(S|U)MSUBLrrr",
819*0fca6ea1SDimitry Andric                       "^(S|U)MULHrr")>;
820*0fca6ea1SDimitry Andric
821*0fca6ea1SDimitry Andric//---
822*0fca6ea1SDimitry Andric// Divide Instructions
823*0fca6ea1SDimitry Andric//---
824*0fca6ea1SDimitry Andric
825*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_I2_RC],
826*0fca6ea1SDimitry Andric             (instregex "^(S|U)DIVWr")>;
827*0fca6ea1SDimitry Andric
828*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_9Cyc_I2_RC],
829*0fca6ea1SDimitry Andric             (instregex "^(S|U)DIVXr")>;
830*0fca6ea1SDimitry Andric
831*0fca6ea1SDimitry Andric
832*0fca6ea1SDimitry Andric//---
833*0fca6ea1SDimitry Andric// Cryptgraphy Instructions
834*0fca6ea1SDimitry Andric//
835*0fca6ea1SDimitry Andric//1,3,1  on I2
836*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_I2],
837*0fca6ea1SDimitry Andric            (instregex "^CRC32(B|H|W|X)rr", "^CRC32C(B|H|W|X)rr")>;
838*0fca6ea1SDimitry Andric
839*0fca6ea1SDimitry Andric//---
840*0fca6ea1SDimitry Andric// PAU instructions
841*0fca6ea1SDimitry Andric//---
842*0fca6ea1SDimitry Andric
843*0fca6ea1SDimitry Andric// on p47 of IXU document, we have 7 cycles for all PAU instructions
844*0fca6ea1SDimitry Andric// here we just assume all signing and pauth instructions are 7 cycles
845*0fca6ea1SDimitry Andric// assume all are 7 cycles here
846*0fca6ea1SDimitry Andric
847*0fca6ea1SDimitry Andric// signing instrucitons
848*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_I2], (instrs PACIA, PACIB,
849*0fca6ea1SDimitry Andric                                            PACDA, PACDB,
850*0fca6ea1SDimitry Andric                                            PACIZA, PACIZB,
851*0fca6ea1SDimitry Andric                                            PACDZA, PACDZB,
852*0fca6ea1SDimitry Andric                                            PACGA)>;
853*0fca6ea1SDimitry Andric// authentication instrucitons
854*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_I2], (instrs AUTIA, AUTIB,
855*0fca6ea1SDimitry Andric                                            AUTDA, AUTDB,
856*0fca6ea1SDimitry Andric                                            AUTIZA, AUTIZB,
857*0fca6ea1SDimitry Andric                                            AUTDZA, AUTDZB)>;
858*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_I2], (instrs XPACI, XPACD)>;
859*0fca6ea1SDimitry Andric
860*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
861*0fca6ea1SDimitry Andric// Instruction Tables in LSU
862*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
863*0fca6ea1SDimitry Andric
864*0fca6ea1SDimitry Andric// 4 cycle Load-to-use from L1D$
865*0fca6ea1SDimitry Andric// Neon load with 5 cycle
866*0fca6ea1SDimitry Andric// 6 cycle to STA ?
867*0fca6ea1SDimitry Andric// STD cycle ?
868*0fca6ea1SDimitry Andric// NEON STD + 2
869*0fca6ea1SDimitry Andric
870*0fca6ea1SDimitry Andric// Load Instructions
871*0fca6ea1SDimitry Andric// FP Load Instructions
872*0fca6ea1SDimitry Andric
873*0fca6ea1SDimitry Andric// Load pair, immed pre-index, normal
874*0fca6ea1SDimitry Andric// Load pair, immed pre-index, signed words
875*0fca6ea1SDimitry Andric// Load pair, immed post-index, normal
876*0fca6ea1SDimitry Andric// Load pair, immed post-index, signed words
877*0fca6ea1SDimitry Andric// NOTE: Handled by WriteLD, WriteLDHi, WriteAdr.
878*0fca6ea1SDimitry Andric
879*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDNPDi)>;
880*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDNPQi)>;
881*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDNPSi)>;
882*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDNPWi)>;
883*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDNPXi)>;
884*0fca6ea1SDimitry Andric
885*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPDi)>;
886*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPQi)>;
887*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPSi)>;
888*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPSWi)>;
889*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPWi)>;
890*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPXi)>;
891*0fca6ea1SDimitry Andric
892*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRBui)>;
893*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRDui)>;
894*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRHui)>;
895*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRQui)>;
896*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSui)>;
897*0fca6ea1SDimitry Andric
898*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRDl)>;
899*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRQl)>;
900*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRWl)>;
901*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRXl)>;
902*0fca6ea1SDimitry Andric
903*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRBi)>;
904*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRHi)>;
905*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRWi)>;
906*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRXi)>;
907*0fca6ea1SDimitry Andric
908*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRSBWi)>;
909*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRSBXi)>;
910*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRSHWi)>;
911*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRSHXi)>;
912*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRSWi)>;
913*0fca6ea1SDimitry Andric
914*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345],
915*0fca6ea1SDimitry Andric            (instrs LDPDpre)>;
916*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345],
917*0fca6ea1SDimitry Andric            (instrs LDPQpre)>;
918*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345],
919*0fca6ea1SDimitry Andric            (instrs LDPSpre)>;
920*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345],
921*0fca6ea1SDimitry Andric            (instrs LDPWpre)>;
922*0fca6ea1SDimitry Andric
923*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRBpre)>;
924*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRDpre)>;
925*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRHpre)>;
926*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRQpre)>;
927*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSpre)>;
928*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRWpre)>;
929*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRXpre)>;
930*0fca6ea1SDimitry Andric
931*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSBWpre)>;
932*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSBXpre)>;
933*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSBWpost)>;
934*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSBXpost)>;
935*0fca6ea1SDimitry Andric
936*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSHWpre)>;
937*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSHXpre)>;
938*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSHWpost)>;
939*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSHXpost)>;
940*0fca6ea1SDimitry Andric
941*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRBBpre)>;
942*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRBBpost)>;
943*0fca6ea1SDimitry Andric
944*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRHHpre)>;
945*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRHHpost)>;
946*0fca6ea1SDimitry Andric
947*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345],
948*0fca6ea1SDimitry Andric            (instrs LDPDpost)>;
949*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345],
950*0fca6ea1SDimitry Andric            (instrs LDPQpost)>;
951*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345],
952*0fca6ea1SDimitry Andric            (instrs LDPSpost)>;
953*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345],
954*0fca6ea1SDimitry Andric            (instrs LDPWpost)>;
955*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345],
956*0fca6ea1SDimitry Andric            (instrs LDPXpost)>;
957*0fca6ea1SDimitry Andric
958*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRBpost)>;
959*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRDpost)>;
960*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRHpost)>;
961*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRQpost)>;
962*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSpost)>;
963*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRWpost)>;
964*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRXpost)>;
965*0fca6ea1SDimitry Andric
966*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRBroW)>;
967*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRDroW)>;
968*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRHroW)>;
969*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRHHroW)>;
970*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRQroW)>;
971*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSroW)>;
972*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSHWroW)>;
973*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSHXroW)>;
974*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRWroW)>;
975*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRXroW)>;
976*0fca6ea1SDimitry Andric
977*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRBroX)>;
978*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRDroX)>;
979*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRHHroX)>;
980*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRHroX)>;
981*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRQroX)>;
982*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSroX)>;
983*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSHWroX)>;
984*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSHXroX)>;
985*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRWroX)>;
986*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRXroX)>;
987*0fca6ea1SDimitry Andric
988*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURBi)>;
989*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURBBi)>;
990*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURDi)>;
991*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURHi)>;
992*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURHHi)>;
993*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURQi)>;
994*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSi)>;
995*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURXi)>;
996*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSBWi)>;
997*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSBXi)>;
998*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSHWi)>;
999*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSHXi)>;
1000*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSWi)>;
1001*0fca6ea1SDimitry Andric
1002*0fca6ea1SDimitry Andric
1003*0fca6ea1SDimitry Andric
1004*0fca6ea1SDimitry Andric// Store register, immed post-index
1005*0fca6ea1SDimitry Andric// NOTE: Handled by WriteST, ReadAdrBase
1006*0fca6ea1SDimitry Andric
1007*0fca6ea1SDimitry Andric// Store register, immed pre-index
1008*0fca6ea1SDimitry Andric// NOTE: Handled by WriteST
1009*0fca6ea1SDimitry Andric
1010*0fca6ea1SDimitry Andric// Store pair, immed post-index, W-form
1011*0fca6ea1SDimitry Andric// Store pair, immed post-indx, X-form
1012*0fca6ea1SDimitry Andric// Store pair, immed pre-index, W-form
1013*0fca6ea1SDimitry Andric// Store pair, immed pre-index, X-form
1014*0fca6ea1SDimitry Andric// NOTE: Handled by WriteSTP.
1015*0fca6ea1SDimitry Andric
1016*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURBi)>;
1017*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURBBi)>;
1018*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURDi)>;
1019*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURHi)>;
1020*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURHHi)>;
1021*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURQi)>;
1022*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURSi)>;
1023*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURWi)>;
1024*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURXi)>;
1025*0fca6ea1SDimitry Andric
1026*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STTRBi)>;
1027*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STTRHi)>;
1028*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STTRWi)>;
1029*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STTRXi)>;
1030*0fca6ea1SDimitry Andric
1031*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STNPDi)>;
1032*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STNPQi)>;
1033*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STNPXi)>;
1034*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STNPWi)>;
1035*0fca6ea1SDimitry Andric
1036*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STPDi)>;
1037*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STPQi)>;
1038*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STPXi)>;
1039*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STPWi)>;
1040*0fca6ea1SDimitry Andric
1041*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRBui)>;
1042*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRDui)>;
1043*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRHui)>;
1044*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRQui)>;
1045*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRXui)>;
1046*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRWui)>;
1047*0fca6ea1SDimitry Andric
1048*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1049*0fca6ea1SDimitry Andric            (instrs STPDpre, STPDpost)>;
1050*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1051*0fca6ea1SDimitry Andric            (instrs STPSpre, STPSpost)>;
1052*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1053*0fca6ea1SDimitry Andric            (instrs STPWpre, STPWpost)>;
1054*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1055*0fca6ea1SDimitry Andric            (instrs STPXpre, STPXpost)>;
1056*0fca6ea1SDimitry Andric
1057*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1058*0fca6ea1SDimitry Andric            (instrs STRBpre, STRBpost)>;
1059*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1060*0fca6ea1SDimitry Andric            (instrs STRBBpre, STRBBpost)>;
1061*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1062*0fca6ea1SDimitry Andric            (instrs STRDpre, STRDpost)>;
1063*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1064*0fca6ea1SDimitry Andric            (instrs STRHpre, STRHpost)>;
1065*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1066*0fca6ea1SDimitry Andric            (instrs STRHHpre, STRHHpost)>;
1067*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1068*0fca6ea1SDimitry Andric            (instrs STRQpre, STRQpost)>;
1069*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1070*0fca6ea1SDimitry Andric            (instrs STRSpre, STRSpost)>;
1071*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1072*0fca6ea1SDimitry Andric            (instrs STRWpre, STRWpost)>;
1073*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1074*0fca6ea1SDimitry Andric            (instrs STRXpre, STRXpost)>;
1075*0fca6ea1SDimitry Andric
1076*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST],
1077*0fca6ea1SDimitry Andric            (instrs STRBroW, STRBroX)>;
1078*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST],
1079*0fca6ea1SDimitry Andric            (instrs STRDroW, STRDroX)>;
1080*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST],
1081*0fca6ea1SDimitry Andric            (instrs STRHroW, STRHroX)>;
1082*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST],
1083*0fca6ea1SDimitry Andric            (instrs STRHHroW, STRHHroX)>;
1084*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST],
1085*0fca6ea1SDimitry Andric            (instrs STRQroW, STRQroX)>;
1086*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST],
1087*0fca6ea1SDimitry Andric            (instrs STRSroW, STRSroX)>;
1088*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST],
1089*0fca6ea1SDimitry Andric            (instrs STRWroW, STRWroX)>;
1090*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST],
1091*0fca6ea1SDimitry Andric            (instrs STRXroW, STRXroX)>;
1092*0fca6ea1SDimitry Andric
1093*0fca6ea1SDimitry Andric// ASIMD Load instructions, 4 cycle access + 2 cycle NEON access
1094*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, D-form 1uOps
1095*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, Q-form 1uOps
1096*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_LD],
1097*0fca6ea1SDimitry Andric            (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
1098*0fca6ea1SDimitry Andric
1099*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_LD_I012345],
1100*0fca6ea1SDimitry Andric            (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
1101*0fca6ea1SDimitry Andric
1102*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, D-form 3 uOps
1103*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, Q-form 2 uOps
1104*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD],
1105*0fca6ea1SDimitry Andric            (instregex "^LD1Twov(8b|4h|2s|1d)$")>;
1106*0fca6ea1SDimitry Andric
1107*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD],
1108*0fca6ea1SDimitry Andric            (instregex "^LD1Twov(16b|8h|4s|2d)$")>;
1109*0fca6ea1SDimitry Andric
1110*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD_I012345],
1111*0fca6ea1SDimitry Andric            (instregex "^LD1Twov(8b|4h|2s|1d)_POST$")>;
1112*0fca6ea1SDimitry Andric
1113*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD_I012345],
1114*0fca6ea1SDimitry Andric            (instregex "^LD1Twov(16b|8h|4s|2d)_POST$")>;
1115*0fca6ea1SDimitry Andric
1116*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, D-form 4 uOps
1117*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, Q-form 3 uOps
1118*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD],
1119*0fca6ea1SDimitry Andric            (instregex "^LD1Threev(8b|4h|2s|1d)$")>;
1120*0fca6ea1SDimitry Andric
1121*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD],
1122*0fca6ea1SDimitry Andric            (instregex "^LD1Threev(16b|8h|4s|2d)$")>;
1123*0fca6ea1SDimitry Andric
1124*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD_I012345],
1125*0fca6ea1SDimitry Andric            (instregex "^LD1Threev(8b|4h|2s|1d)_POST$")>;
1126*0fca6ea1SDimitry Andric
1127*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD_I012345],
1128*0fca6ea1SDimitry Andric            (instregex "^LD1Threev(16b|8h|4s|2d)_POST$")>;
1129*0fca6ea1SDimitry Andric
1130*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, D-form 6 uOps
1131*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, Q-form 4 uOps
1132*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD],
1133*0fca6ea1SDimitry Andric            (instregex "^LD1Fourv(8b|4h|2s|1d)$")>;
1134*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD],
1135*0fca6ea1SDimitry Andric            (instregex "^LD1Fourv(16b|8h|4s|2d)$")>;
1136*0fca6ea1SDimitry Andric
1137*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD_I012345],
1138*0fca6ea1SDimitry Andric            (instregex "^LD1Fourv(8b|4h|2s|1d)_POST$")>;
1139*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD_I012345],
1140*0fca6ea1SDimitry Andric            (instregex "^LD1Fourv(16b|8h|4s|2d)_POST$")>;
1141*0fca6ea1SDimitry Andric
1142*0fca6ea1SDimitry Andric// ASIMD load, 1 element, one lane, B/H/S 2uOps
1143*0fca6ea1SDimitry Andric// ASIMD load, 1 element, one lane, D     2UOps
1144*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD], (instregex "^LD1i(8|16|32|64)$")>;
1145*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD_I012345],
1146*0fca6ea1SDimitry Andric            (instregex "^LD1i(8|16|32|64)_POST$")>;
1147*0fca6ea1SDimitry Andric
1148*0fca6ea1SDimitry Andric// ASIMD load, 1 element, all lanes, D-form, B/H/S 2uOps
1149*0fca6ea1SDimitry Andric// ASIMD load, 1 element, all lanes, D-form, D     2uOps
1150*0fca6ea1SDimitry Andric// ASIMD load, 1 element, all lanes, Q-form        2uOps
1151*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD],
1152*0fca6ea1SDimitry Andric            (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
1153*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD_I012345],
1154*0fca6ea1SDimitry Andric            (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
1155*0fca6ea1SDimitry Andric
1156*0fca6ea1SDimitry Andric// ASIMD load, 2 element, multiple, D-form, B/H/S 3 uOps
1157*0fca6ea1SDimitry Andric// ASIMD load, 2 element, multiple, Q-form, D     4 uOps
1158*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD],
1159*0fca6ea1SDimitry Andric            (instregex "^LD2Twov(8b|4h|2s)$")>;
1160*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD],
1161*0fca6ea1SDimitry Andric            (instregex "^LD2Twov(16b|8h|4s|2d)$")>;
1162*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD_I012345],
1163*0fca6ea1SDimitry Andric            (instregex "^LD2Twov(8b|4h|2s)_POST$")>;
1164*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD_I012345],
1165*0fca6ea1SDimitry Andric            (instregex "^LD2Twov(16b|8h|4s|2d)_POST$")>;
1166*0fca6ea1SDimitry Andric
1167*0fca6ea1SDimitry Andric// ASIMD load, 2 element, one lane, B/H           3 uOps
1168*0fca6ea1SDimitry Andric// ASIMD load, 2 element, one lane, S             3 uOps
1169*0fca6ea1SDimitry Andric// ASIMD load, 2 element, one lane, D             3 uOps
1170*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD], (instregex "^LD2i(8|16|32|64)$")>;
1171*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD_I012345],
1172*0fca6ea1SDimitry Andric            (instregex "^LD2i(8|16|32|64)_POST$")>;
1173*0fca6ea1SDimitry Andric
1174*0fca6ea1SDimitry Andric// ASIMD load, 2 element, all lanes, D-form, B/H/S 3 uOps
1175*0fca6ea1SDimitry Andric// ASIMD load, 2 element, all lanes, D-form, D     3 uOps
1176*0fca6ea1SDimitry Andric// ASIMD load, 2 element, all lanes, Q-form        3 uOps
1177*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD],
1178*0fca6ea1SDimitry Andric            (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
1179*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD_I012345],
1180*0fca6ea1SDimitry Andric            (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
1181*0fca6ea1SDimitry Andric
1182*0fca6ea1SDimitry Andric// ASIMD load, 3 element, multiple, D-form, B/H/S  5 uOps
1183*0fca6ea1SDimitry Andric// ASIMD load, 3 element, multiple, Q-form, B/H/S  6 uOps
1184*0fca6ea1SDimitry Andric// ASIMD load, 3 element, multiple, Q-form, D      6 uOps
1185*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD],
1186*0fca6ea1SDimitry Andric            (instregex "^LD3Threev(8b|4h|2s)$")>;
1187*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD],
1188*0fca6ea1SDimitry Andric            (instregex "^LD3Threev(16b|8h|4s|2d)$")>;
1189*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD_I012345],
1190*0fca6ea1SDimitry Andric            (instregex "^LD3Threev(8b|4h|2s)_POST$")>;
1191*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD_I012345],
1192*0fca6ea1SDimitry Andric            (instregex "^LD3Threev(16b|8h|4s|2d)_POST$")>;
1193*0fca6ea1SDimitry Andric
1194*0fca6ea1SDimitry Andric// ASIMD load, 3 element, one lone, B/H            4 uOps
1195*0fca6ea1SDimitry Andric// ASIMD load, 3 element, one lane, S              4 uOps
1196*0fca6ea1SDimitry Andric// ASIMD load, 3 element, one lane, D              5 uOps
1197*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD], (instregex "^LD3i(8|16|32)$")>;
1198*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD], (instregex "^LD3i(64)$")>;
1199*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD_I012345],
1200*0fca6ea1SDimitry Andric            (instregex "^LD3i(8|16|32)_POST$")>;
1201*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD_I012345],
1202*0fca6ea1SDimitry Andric            (instregex "^LD3i(64)_POST$")>;
1203*0fca6ea1SDimitry Andric
1204*0fca6ea1SDimitry Andric// ASIMD load, 3 element, all lanes, D-form, B/H/S 4 uOps
1205*0fca6ea1SDimitry Andric// ASIMD load, 3 element, all lanes, D-form, D     5 uOps
1206*0fca6ea1SDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, B/H/S 4 uOps
1207*0fca6ea1SDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, D     5 uOps
1208*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD],
1209*0fca6ea1SDimitry Andric            (instregex "^LD3Rv(8b|4h|2s|16b|8h|4s)$")>;
1210*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD],
1211*0fca6ea1SDimitry Andric            (instregex "^LD3Rv(1d|2d)$")>;
1212*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD_I012345],
1213*0fca6ea1SDimitry Andric            (instregex "^LD3Rv(8b|4h|2s|16b|8h|4s)_POST$")>;
1214*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD_I012345],
1215*0fca6ea1SDimitry Andric            (instregex "^LD3Rv(1d|2d)_POST$")>;
1216*0fca6ea1SDimitry Andric
1217*0fca6ea1SDimitry Andric// ASIMD load, 4 element, multiple, D-form, B/H/S  6 uOps
1218*0fca6ea1SDimitry Andric// ASIMD load, 4 element, multiple, Q-form, B/H/S  10 uOps
1219*0fca6ea1SDimitry Andric// ASIMD load, 4 element, multiple, Q-form, D      8 uOps
1220*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD],
1221*0fca6ea1SDimitry Andric            (instregex "^LD4Fourv(8b|4h|2s)$")>;
1222*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_10Uops_LD],
1223*0fca6ea1SDimitry Andric            (instregex "^LD4Fourv(16b|8h|4s)$")>;
1224*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_8Uops_LD],
1225*0fca6ea1SDimitry Andric            (instregex "^LD4Fourv(2d)$")>;
1226*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD_I012345],
1227*0fca6ea1SDimitry Andric            (instregex "^LD4Fourv(8b|4h|2s)_POST$")>;
1228*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_10Uops_LD_I012345],
1229*0fca6ea1SDimitry Andric            (instregex "^LD4Fourv(16b|8h|4s)_POST$")>;
1230*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_8Uops_LD_I012345],
1231*0fca6ea1SDimitry Andric            (instregex "^LD4Fourv(2d)_POST$")>;
1232*0fca6ea1SDimitry Andric
1233*0fca6ea1SDimitry Andric// ASIMD load, 4 element, one lane, B/H            5 uOps
1234*0fca6ea1SDimitry Andric// ASIMD load, 4 element, one lane, S              5 uOps
1235*0fca6ea1SDimitry Andric// ASIMD load, 4 element, one lane, D              6 uOps
1236*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD], (instregex "^LD4i(8|16|32)$")>;
1237*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD], (instregex "^LD4i(64)$")>;
1238*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD_I012345],
1239*0fca6ea1SDimitry Andric            (instregex "^LD4i(8|16|32)_POST$")>;
1240*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD_I012345],
1241*0fca6ea1SDimitry Andric            (instregex "^LD4i(64)_POST$")>;
1242*0fca6ea1SDimitry Andric
1243*0fca6ea1SDimitry Andric// ASIMD load, 4 element, all lanes, D-form, B/H/S    5 uOps
1244*0fca6ea1SDimitry Andric// ASIMD load, 4 element, all lanes, D-form, D        6 uOps
1245*0fca6ea1SDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, B/H/S    5 uOps
1246*0fca6ea1SDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, D        6 uOps
1247*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD],
1248*0fca6ea1SDimitry Andric            (instregex "^LD4Rv(8b|4h|2s|16b|8h|4s)$")>;
1249*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD],
1250*0fca6ea1SDimitry Andric            (instregex "^LD4Rv(1d|2d)$")>;
1251*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD_I012345],
1252*0fca6ea1SDimitry Andric            (instregex "^LD4Rv(8b|4h|2s|16b|8h|4s)_POST$")>;
1253*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD_I012345],
1254*0fca6ea1SDimitry Andric            (instregex "^LD4Rv(1d|2d)_POST$")>;
1255*0fca6ea1SDimitry Andric
1256*0fca6ea1SDimitry Andric// ASIMD Store Instructions
1257*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, D-form    1 uOps
1258*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, Q-form    1 uops
1259*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST],
1260*0fca6ea1SDimitry Andric            (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
1261*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345],
1262*0fca6ea1SDimitry Andric            (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
1263*0fca6ea1SDimitry Andric
1264*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, D-form    2 uOps
1265*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, Q-form    2 uOps
1266*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST],
1267*0fca6ea1SDimitry Andric            (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
1268*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST_I012345],
1269*0fca6ea1SDimitry Andric            (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
1270*0fca6ea1SDimitry Andric
1271*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, D-form    3 uOps
1272*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, Q-form    3 uOps
1273*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_3Uops_ST],
1274*0fca6ea1SDimitry Andric            (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
1275*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_3Uops_ST_I012345],
1276*0fca6ea1SDimitry Andric            (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
1277*0fca6ea1SDimitry Andric
1278*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, D-form    4 uOps
1279*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, Q-form    4 uOps
1280*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST],
1281*0fca6ea1SDimitry Andric            (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
1282*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST_I012345],
1283*0fca6ea1SDimitry Andric            (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
1284*0fca6ea1SDimitry Andric
1285*0fca6ea1SDimitry Andric// ASIMD store, 1 element, one lane, B/H/S            2 uOps
1286*0fca6ea1SDimitry Andric// ASIMD store, 1 element, one lane, D                2 uOps
1287*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST],
1288*0fca6ea1SDimitry Andric            (instregex "^ST1i(8|16|32|64)$")>;
1289*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST_I012345],
1290*0fca6ea1SDimitry Andric            (instregex "^ST1i(8|16|32|64)_POST$")>;
1291*0fca6ea1SDimitry Andric
1292*0fca6ea1SDimitry Andric// ASIMD store, 2 element, multiple, D-form, B/H/S    2 uOps
1293*0fca6ea1SDimitry Andric// ASIMD store, 2 element, multiple, Q-form, B/H/S    4 uOps
1294*0fca6ea1SDimitry Andric// ASIMD store, 2 element, multiple, Q-form, D        4 uOps
1295*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST],
1296*0fca6ea1SDimitry Andric            (instregex "^ST2Twov(8b|4h|2s)$")>;
1297*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST],
1298*0fca6ea1SDimitry Andric            (instregex "^ST2Twov(16b|8h|4s|2d)$")>;
1299*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST_I012345],
1300*0fca6ea1SDimitry Andric            (instregex "^ST2Twov(8b|4h|2s)_POST$")>;
1301*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST_I012345],
1302*0fca6ea1SDimitry Andric            (instregex "^ST2Twov(16b|8h|4s|2d)_POST$")>;
1303*0fca6ea1SDimitry Andric
1304*0fca6ea1SDimitry Andric// ASIMD store, 2 element, one lane, B/H/S            2 uOps
1305*0fca6ea1SDimitry Andric// ASIMD store, 2 element, one lane, D                2 uOps
1306*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST],
1307*0fca6ea1SDimitry Andric            (instregex "^ST2i(8|16|32|64)$")>;
1308*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST_I012345],
1309*0fca6ea1SDimitry Andric            (instregex "^ST2i(8|16|32|64)_POST$")>;
1310*0fca6ea1SDimitry Andric
1311*0fca6ea1SDimitry Andric// ASIMD store, 3 element, multiple, D-form, B/H/S    4 uOps
1312*0fca6ea1SDimitry Andric// ASIMD store, 3 element, multiple, Q-form, B/H/S    6 uOps
1313*0fca6ea1SDimitry Andric// ASIMD store, 3 element, multiple, Q-form, D        6 uOps
1314*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST],
1315*0fca6ea1SDimitry Andric            (instregex "^ST3Threev(8b|4h|2s)$")>;
1316*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_6Uops_ST],
1317*0fca6ea1SDimitry Andric            (instregex "^ST3Threev(16b|8h|4s|2d)$")>;
1318*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST_I012345],
1319*0fca6ea1SDimitry Andric            (instregex "^ST3Threev(8b|4h|2s)_POST$")>;
1320*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_6Uops_ST_I012345],
1321*0fca6ea1SDimitry Andric            (instregex "^ST3Threev(16b|8h|4s|2d)_POST$")>;
1322*0fca6ea1SDimitry Andric
1323*0fca6ea1SDimitry Andric// ASIMD store, 3 element, one lane, B/H              2 uOps
1324*0fca6ea1SDimitry Andric// ASIMD store, 3 element, one lane, S                2 uOps
1325*0fca6ea1SDimitry Andric// ASIMD store, 3 element, one lane, D                4 uOps
1326*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST], (instregex "^ST3i(8|16|32)$")>;
1327*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST], (instregex "^ST3i(64)$")>;
1328*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST_I012345],
1329*0fca6ea1SDimitry Andric            (instregex "^ST3i(8|16|32)_POST$")>;
1330*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST_I012345],
1331*0fca6ea1SDimitry Andric            (instregex "^ST3i(64)_POST$")>;
1332*0fca6ea1SDimitry Andric
1333*0fca6ea1SDimitry Andric
1334*0fca6ea1SDimitry Andric// ASIMD store, 4 element, multiple, D-form, B/H/S    5 uOps
1335*0fca6ea1SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, B/H/S    10 uOps
1336*0fca6ea1SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, D        8 uOps
1337*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_5Uops_ST],
1338*0fca6ea1SDimitry Andric            (instregex "^ST4Fourv(8b|4h|2s)$")>;
1339*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_10Uops_ST],
1340*0fca6ea1SDimitry Andric            (instregex "^ST4Fourv(16b|8h|4s)$")>;
1341*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_8Uops_ST],
1342*0fca6ea1SDimitry Andric            (instregex "^ST4Fourv(2d)$")>;
1343*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_5Uops_ST_I012345],
1344*0fca6ea1SDimitry Andric            (instregex "^ST4Fourv(8b|4h|2s)_POST$")>;
1345*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_10Uops_ST_I012345],
1346*0fca6ea1SDimitry Andric            (instregex "^ST4Fourv(16b|8h|4s)_POST$")>;
1347*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_8Uops_ST_I012345],
1348*0fca6ea1SDimitry Andric            (instregex "^ST4Fourv(2d)_POST$")>;
1349*0fca6ea1SDimitry Andric
1350*0fca6ea1SDimitry Andric// ASIMD store, 4 element, one lane, B/H              3 uOps
1351*0fca6ea1SDimitry Andric// ASIMD store, 4 element, one lane, S                3 uOps
1352*0fca6ea1SDimitry Andric// ASIMD store, 4 element, one lane, D                4 uOps
1353*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_3Uops_ST], (instregex "^ST4i(8|16|32)$")>;
1354*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST], (instregex "^ST4i(64)$")>;
1355*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_3Uops_ST_I012345],
1356*0fca6ea1SDimitry Andric            (instregex "^ST4i(8|16|32)_POST$")>;
1357*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST_I012345],
1358*0fca6ea1SDimitry Andric            (instregex "^ST4i(64)_POST$")>;
1359*0fca6ea1SDimitry Andric
1360*0fca6ea1SDimitry Andric
1361*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
1362*0fca6ea1SDimitry Andric// Instruction Tables in VXU
1363*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
1364*0fca6ea1SDimitry Andric// all uOps are not clearly written in the VXU document
1365*0fca6ea1SDimitry Andric
1366*0fca6ea1SDimitry Andric// I2V
1367*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_I2V_4Cyc_I45], (instregex "^FMOV[HSD][WX]r", "^FMOVDXHighr")>;
1368*0fca6ea1SDimitry Andric
1369*0fca6ea1SDimitry Andric// I2V with convert
1370*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_I2V_7Cyc_I45], (instregex "^[SU]CVTF[SU][XW][HSD]ri")>;
1371*0fca6ea1SDimitry Andric
1372*0fca6ea1SDimitry Andric// V2I
1373*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2I_3Cyc_FP01], (instregex "^FMOV[WX][HSD]r", "FMOVXDHighr")>;
1374*0fca6ea1SDimitry Andric
1375*0fca6ea1SDimitry Andric// V2I with convert 2nd [SU] necessary?
1376*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2I_6Cyc_FP01], (instregex "^FCVT[AMNPZ][SU][SU][XW][HSD]r")>;
1377*0fca6ea1SDimitry Andric
1378*0fca6ea1SDimitry Andric// float to float move immediate, row 7 in big chart
1379*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2V_2Cyc_FP0123], (instregex "^FMOV[HSD]r")>;
1380*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2V_2Cyc_FP0123], (instregex "^FMOV[HSD]i")>;
1381*0fca6ea1SDimitry Andric
1382*0fca6ea1SDimitry Andric// float to float conversion within VXU, precision conversion
1383*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2V_6Cyc_FP01], (instregex "^FJCVTZS")>;
1384*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2V_3Cyc_FP0123], (instregex "^FCVT[HSD][HSD]r",
1385*0fca6ea1SDimitry Andric                                                       "^FRINT(A|I|M|N|P|X|Z)(Sr|Dr)")>;
1386*0fca6ea1SDimitry Andric
1387*0fca6ea1SDimitry Andric// floating comparison write to NZCV
1388*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP01], (instregex "^FCMP(E)?[HSD]r[ir]")>;
1389*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP01], (instregex "^FCCMP(E)?[HSD]rr")>;
1390*0fca6ea1SDimitry Andric
1391*0fca6ea1SDimitry Andric// floating point conditional select
1392*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^FCSEL")>;
1393*0fca6ea1SDimitry Andric
1394*0fca6ea1SDimitry Andric// floating multiply-add
1395*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123], (instregex "^(F|FN)MADD", "^(F|FN)MSUB")>;
1396*0fca6ea1SDimitry Andric
1397*0fca6ea1SDimitry Andric// floating unary, cycle/throughput? xls row14
1398*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^F(ABS|NEG)[SD]r")>;
1399*0fca6ea1SDimitry Andric
1400*0fca6ea1SDimitry Andric//floating division/square root
1401*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_FP3], (instregex "^FDIVHrr")>;
1402*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_8Cyc_FP3], (instregex "^FDIVSrr")>;
1403*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_10Cyc_FP3], (instregex "^FDIVDrr")>;
1404*0fca6ea1SDimitry Andric
1405*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_8Cyc_FP3_RC], (instregex "^FSQRTHr")>;
1406*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_10Cyc_FP3_RC], (instregex "^FSQRTSr")>;
1407*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_13Cyc_FP3_RC], (instregex "^FSQRTDr")>;
1408*0fca6ea1SDimitry Andric
1409*0fca6ea1SDimitry Andric//==========
1410*0fca6ea1SDimitry Andric// SIMD move instructions
1411*0fca6ea1SDimitry Andric//==========
1412*0fca6ea1SDimitry Andric
1413*0fca6ea1SDimitry Andric// ASIMD DUP element
1414*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^DUPv.+lane")>;
1415*0fca6ea1SDimitry Andric// ASIMD DUP general thoughput undecided, 3? FP0123
1416*0fca6ea1SDimitry Andric// VXU doc, p42, 2 uOps
1417*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_2Uops_FP0123], (instregex "^DUPv.+gpr")>;
1418*0fca6ea1SDimitry Andric
1419*0fca6ea1SDimitry Andric// ASIMD insert, element to element
1420*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^INSv.+lane")>;
1421*0fca6ea1SDimitry Andric// ASIMD insert,  gen reg 3? FP0123?
1422*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_2Uops_FP0123], (instregex "^INSv.+gpr")>;
1423*0fca6ea1SDimitry Andric
1424*0fca6ea1SDimitry Andric// ASIMD move, FP immed
1425*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^FMOVv")>;
1426*0fca6ea1SDimitry Andric
1427*0fca6ea1SDimitry Andric// ASIMD transfer, element to gen reg
1428*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^[SU]MOVv")>;
1429*0fca6ea1SDimitry Andric
1430*0fca6ea1SDimitry Andric//==========
1431*0fca6ea1SDimitry Andric// SIMD arithmetic instructions
1432*0fca6ea1SDimitry Andric//==========
1433*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^ADDv", "^SUBv",
1434*0fca6ea1SDimitry Andric                                         "^BIFv", "^BITv", "^BSLv",
1435*0fca6ea1SDimitry Andric                                         "^ANDv", "^BICv", "^EORv",
1436*0fca6ea1SDimitry Andric                                         "^ORRv", "^ORNv")>;
1437*0fca6ea1SDimitry Andric
1438*0fca6ea1SDimitry Andric
1439*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^FABDv", "^FADDv", "^FSUBv")>;
1440*0fca6ea1SDimitry Andric
1441*0fca6ea1SDimitry Andric// floating division
1442*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_6Cyc_FP3], (instregex "^FDIVv.*16$")>;
1443*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_FP3], (instregex "^FDIVv.*32$")>;
1444*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_9Cyc_FP3], (instregex "^FDIVv.*64$")>;
1445*0fca6ea1SDimitry Andric
1446*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123], (instregex "^FMUL(X)?v",
1447*0fca6ea1SDimitry Andric                                                   "^FRECPSv", "^FRSQRTSv")>;
1448*0fca6ea1SDimitry Andric
1449*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^MLAv","^MLSv", "^MULv",
1450*0fca6ea1SDimitry Andric                                                   "^PMULv", "UABAv")>;
1451*0fca6ea1SDimitry Andric
1452*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "SABAv", "SABDv",
1453*0fca6ea1SDimitry Andric                                                   "^(SH|UH)(ADD|SUB)v",
1454*0fca6ea1SDimitry Andric                                                   "^S(MAX|MIN)v",
1455*0fca6ea1SDimitry Andric                                                   "^(SQ|UQ)(ADD|SUB)v",
1456*0fca6ea1SDimitry Andric                                                   "^(SQ|SQR|UQ|UQR)SHLv",
1457*0fca6ea1SDimitry Andric                                                   "^(SR|UR)HADDv",
1458*0fca6ea1SDimitry Andric                                                   "^(SR|UR)SHLv",
1459*0fca6ea1SDimitry Andric                                                   "^UABDv",
1460*0fca6ea1SDimitry Andric                                                   "^U(MAX|MIN)v")>;
1461*0fca6ea1SDimitry Andric// IMAX or UMAX in the above line
1462*0fca6ea1SDimitry Andric//==========
1463*0fca6ea1SDimitry Andric// SIMD compare instructions
1464*0fca6ea1SDimitry Andric//==========
1465*0fca6ea1SDimitry Andric
1466*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^CMEQv","^CMGEv","^CMGTv",
1467*0fca6ea1SDimitry Andric                                                   "^CMLEv","^CMLTv", "^CMHIv",
1468*0fca6ea1SDimitry Andric                                                   "^CMHSv",
1469*0fca6ea1SDimitry Andric                                                   "^FCMEQv", "^FCMGEv",
1470*0fca6ea1SDimitry Andric                                                   "^FCMGTv", "^FCMLEv",
1471*0fca6ea1SDimitry Andric                                                   "^FCMLTv",
1472*0fca6ea1SDimitry Andric                                                   "^FACGEv", "^FACGTv")>;
1473*0fca6ea1SDimitry Andric
1474*0fca6ea1SDimitry Andric//==========
1475*0fca6ea1SDimitry Andric// SIMD widening and narrowing arithmetic instructions
1476*0fca6ea1SDimitry Andric//==========
1477*0fca6ea1SDimitry Andric// NO need to list ADDHN2, RADDHN2, RSUBHN2 as they are not distinguished
1478*0fca6ea1SDimitry Andric// from ADDHN, RADDHN, RSUBHN in td file(v16i8, v8i16, v4i32).
1479*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^ADDHNv",
1480*0fca6ea1SDimitry Andric                                                   "^SUBHNv",
1481*0fca6ea1SDimitry Andric                                                   "^RADDHNv",
1482*0fca6ea1SDimitry Andric                                                   "^RSUBHNv",
1483*0fca6ea1SDimitry Andric                                                   "^SABD(L|L2)v", "^UABD(L|L2)v",
1484*0fca6ea1SDimitry Andric                                                   "^(S|U)(ADD|SUB)(L|L2|W|W2)v")>;
1485*0fca6ea1SDimitry Andric
1486*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^PMUL(L|L2)v","^SABA(L|L2)v",
1487*0fca6ea1SDimitry Andric                                                   "^(S|U|SQ)(MLA|MSL|MUL)(L|L2)v")>;
1488*0fca6ea1SDimitry Andric
1489*0fca6ea1SDimitry Andric//==========
1490*0fca6ea1SDimitry Andric// SIMD unary arithmetic instructions
1491*0fca6ea1SDimitry Andric//==========
1492*0fca6ea1SDimitry Andric//^MVNv is an alias of ^NOTv
1493*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^ABSv", "^CLSv","^CLZv", "^CNTv",
1494*0fca6ea1SDimitry Andric                                                   "^NEGv", "^NOTv",
1495*0fca6ea1SDimitry Andric                                                   "^RBITv", "^REV(16|32|64)v",
1496*0fca6ea1SDimitry Andric                                                   "^SQ(ABS|NEG)v", "^SQ(XT|XTU)(N|N2)v",
1497*0fca6ea1SDimitry Andric                                                   "^(SU|US)QADDv",
1498*0fca6ea1SDimitry Andric                                                   "^UQXT(N|N2)v", "^XTN2?v")>;
1499*0fca6ea1SDimitry Andric
1500*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^FCVT(L|L2|N|N2|XN|XN2)v",
1501*0fca6ea1SDimitry Andric                                                   "^FRINT[AIMNPXZ]v",
1502*0fca6ea1SDimitry Andric                                                   "^FRSQRTEv",
1503*0fca6ea1SDimitry Andric                                                   "^(S|U)ADALPv",
1504*0fca6ea1SDimitry Andric                                                   "^(S|U)ADDLPv")>;
1505*0fca6ea1SDimitry Andric
1506*0fca6ea1SDimitry Andric
1507*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0], (instregex "^URECPEv", "^URSQRTEv",
1508*0fca6ea1SDimitry Andric                                                "^FRECPEv", "^FRECPXv")>;
1509*0fca6ea1SDimitry Andric
1510*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_8Cyc_FP3_RC], (instregex "^FSQRTv.*16$")>;
1511*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_10Cyc_FP3_RC], (instregex "^FSQRTv.*32$")>;
1512*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_13Cyc_FP3_RC], (instregex "^FSQRTv.*64$")>;
1513*0fca6ea1SDimitry Andric
1514*0fca6ea1SDimitry Andric//==========
1515*0fca6ea1SDimitry Andric// SIMD binary elememt arithmetic instructions
1516*0fca6ea1SDimitry Andric//==========
1517*0fca6ea1SDimitry Andric
1518*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123], (instregex "^FMLAv", "^FMLSv")>;
1519*0fca6ea1SDimitry Andric
1520*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex  "^SQDMULHv",
1521*0fca6ea1SDimitry Andric                                                   "^SQRD(MLA|MLS|MUL)Hv")>;
1522*0fca6ea1SDimitry Andric
1523*0fca6ea1SDimitry Andric//==========
1524*0fca6ea1SDimitry Andric// SIMD permute instructions
1525*0fca6ea1SDimitry Andric//==========
1526*0fca6ea1SDimitry Andric
1527*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^EXTv", "^TRN(1|2)v",
1528*0fca6ea1SDimitry Andric                                                   "^UZP(1|2)v", "^ZIP(1|2)v")>;
1529*0fca6ea1SDimitry Andric
1530*0fca6ea1SDimitry Andric//==========
1531*0fca6ea1SDimitry Andric// SIMD immediate instructions
1532*0fca6ea1SDimitry Andric//==========
1533*0fca6ea1SDimitry Andric
1534*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex  "^MOVIv", "^MVNIv")>;
1535*0fca6ea1SDimitry Andric
1536*0fca6ea1SDimitry Andric//==========
1537*0fca6ea1SDimitry Andric// SIMD shift(immediate) instructions
1538*0fca6ea1SDimitry Andric//==========
1539*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^RSHR(N|N2)v", "^SHLv",
1540*0fca6ea1SDimitry Andric                                                   "^(SHL|SHR)(N|N2)v",
1541*0fca6ea1SDimitry Andric                                                   "^SLIv",
1542*0fca6ea1SDimitry Andric                                                   "^(SQ|SQR)SHR(U)?(N|N2)v",
1543*0fca6ea1SDimitry Andric                                                   "^(UQ|UQR)SHR(N|N2)v",
1544*0fca6ea1SDimitry Andric                                                   "^SQSHLUv",
1545*0fca6ea1SDimitry Andric                                                   "^SRIv",
1546*0fca6ea1SDimitry Andric                                                   "^(S|SR|U|UR)SHRv",
1547*0fca6ea1SDimitry Andric                                                   "^(S|SR|U|UR)SRAv",
1548*0fca6ea1SDimitry Andric                                                   "^(S|U)SHL(L|L2)v")>;
1549*0fca6ea1SDimitry Andric
1550*0fca6ea1SDimitry Andric//==========
1551*0fca6ea1SDimitry Andric// SIMD floating-point and integer conversion instructions
1552*0fca6ea1SDimitry Andric//==========
1553*0fca6ea1SDimitry Andric// same as above conversion
1554*0fca6ea1SDimitry Andric
1555*0fca6ea1SDimitry Andric//==========
1556*0fca6ea1SDimitry Andric// SIMD reduce (acoss vector lanes) instructions
1557*0fca6ea1SDimitry Andric//==========
1558*0fca6ea1SDimitry Andric
1559*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^ADDVv",
1560*0fca6ea1SDimitry Andric                                                   "^(FMAX|FMIN)(V|NMV)v",
1561*0fca6ea1SDimitry Andric                                                   "^(S|U)ADDLVv",
1562*0fca6ea1SDimitry Andric                                                   "^(S|U)(MAX|MIN)Vv")>;
1563*0fca6ea1SDimitry Andric//==========
1564*0fca6ea1SDimitry Andric// SIMD pairwise arithmetic instructions
1565*0fca6ea1SDimitry Andric//==========
1566*0fca6ea1SDimitry Andric
1567*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^ADDPv", "^FADDPv",
1568*0fca6ea1SDimitry Andric                                                   "^(FMAX|FMIN)(NMP|P)v",
1569*0fca6ea1SDimitry Andric                                                   "^(S|U)(MIN|MAX)Pv")>;
1570*0fca6ea1SDimitry Andric//==========
1571*0fca6ea1SDimitry Andric// SIMD dot prodcut instructions
1572*0fca6ea1SDimitry Andric//==========
1573*0fca6ea1SDimitry Andric
1574*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^(U|S)DOTv")>;
1575*0fca6ea1SDimitry Andric
1576*0fca6ea1SDimitry Andric//==========
1577*0fca6ea1SDimitry Andric// SIMD table lookup instructions
1578*0fca6ea1SDimitry Andric//==========
1579*0fca6ea1SDimitry Andric// TBL 1-reg/2-reg; TBX 1-reg, 1uOp, throughput=4 latency=2
1580*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instrs TBLv8i8One, TBLv16i8One,
1581*0fca6ea1SDimitry Andric                                                TBXv8i8One, TBXv16i8One,
1582*0fca6ea1SDimitry Andric                                                TBLv8i8Two, TBLv16i8Two)>;
1583*0fca6ea1SDimitry Andric
1584*0fca6ea1SDimitry Andric// TBL 3-reg/4-reg, 3uops, throughtput=4/3=1.33 latency=4
1585*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123_FP0123_FP0123_RC],
1586*0fca6ea1SDimitry Andric            (instrs TBLv8i8Three, TBLv16i8Three,
1587*0fca6ea1SDimitry Andric                    TBLv8i8Four, TBLv16i8Four)>;
1588*0fca6ea1SDimitry Andric
1589*0fca6ea1SDimitry Andric
1590*0fca6ea1SDimitry Andric// TBX 2-reg 2 uOps, throughput=2 latency=4
1591*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123_FP0123_RC], (instrs TBXv8i8Two, TBXv16i8Two)>;
1592*0fca6ea1SDimitry Andric
1593*0fca6ea1SDimitry Andric// TBX 3-reg/4-reg, 4uOps, throughput=1, latency=6
1594*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_6Cyc_FP0123_FP0123_FP0123_FP0123_RC],
1595*0fca6ea1SDimitry Andric            (instrs TBXv8i8Three, TBXv16i8Three,
1596*0fca6ea1SDimitry Andric                    TBXv8i8Four, TBXv16i8Four)>;
1597*0fca6ea1SDimitry Andric
1598*0fca6ea1SDimitry Andric
1599*0fca6ea1SDimitry Andric//==========
1600*0fca6ea1SDimitry Andric// SIMD complex number arithmetic instructions
1601*0fca6ea1SDimitry Andric//==========
1602*0fca6ea1SDimitry Andric
1603*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123], (instregex "^FCADDv", "^FCMLAv")>;
1604*0fca6ea1SDimitry Andric
1605*0fca6ea1SDimitry Andric//==========
1606*0fca6ea1SDimitry Andric// SIMD cryptographic instructions
1607*0fca6ea1SDimitry Andric//==========
1608*0fca6ea1SDimitry Andric// 3,4 on IMLA, CRYP
1609*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^AES[DE]",
1610*0fca6ea1SDimitry Andric                                                   "^SM3(TT1|TT2)(A|B)")>;
1611*0fca6ea1SDimitry Andric
1612*0fca6ea1SDimitry Andric// 2,4 on CRYP
1613*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^AESI?MC",
1614*0fca6ea1SDimitry Andric                                                   "^EOR3",
1615*0fca6ea1SDimitry Andric                                                   "^RAX1",
1616*0fca6ea1SDimitry Andric                                                   "^XAR",
1617*0fca6ea1SDimitry Andric                                                   "^BCAX",
1618*0fca6ea1SDimitry Andric                                                   "^SM3SS1",
1619*0fca6ea1SDimitry Andric                                                   "^SM3PART(W1|W2)")>;
1620*0fca6ea1SDimitry Andric// 5,1 on CRYP
1621*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_FP1], (instregex "^SM4E",
1622*0fca6ea1SDimitry Andric                                                "^SM4EKEY")>;
1623*0fca6ea1SDimitry Andric
1624*0fca6ea1SDimitry Andric// 2,1 on CRYP
1625*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP1], (instregex "^SHA1(H|SU0|SU1)",
1626*0fca6ea1SDimitry Andric                                                "^SHA256SU0",
1627*0fca6ea1SDimitry Andric                                                "^SHA512(SU0|SU1)")>;
1628*0fca6ea1SDimitry Andric
1629*0fca6ea1SDimitry Andric// 3,1 on CRYP
1630*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP1], (instregex "^SHA256SU1",
1631*0fca6ea1SDimitry Andric                                                "^SHA512(H|H2)")>;
1632*0fca6ea1SDimitry Andric
1633*0fca6ea1SDimitry Andric// 4,0.25 on CRYP
1634*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP1_RC4], (instregex "^SHA1(C|P|M)",
1635*0fca6ea1SDimitry Andric                                                "^SHA256(H|H2)")>;
1636*0fca6ea1SDimitry Andric
1637*0fca6ea1SDimitry Andric//==========
1638*0fca6ea1SDimitry Andric// SIMD v8.6 instructions
1639*0fca6ea1SDimitry Andric//==========
1640*0fca6ea1SDimitry Andric// 4,2 on IMLA
1641*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123_RC], (instregex "^(S|U|US)MMLA$")>;
1642*0fca6ea1SDimitry Andric
1643*0fca6ea1SDimitry Andric// 4,0.5 on IMLA
1644*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_8Cyc_FP0123_RC], (instregex "^BFMMLA$")>;
1645*0fca6ea1SDimitry Andric
1646*0fca6ea1SDimitry Andric// 4,0.5 on IMLA
1647*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_8Cyc_FP0123_RC], (instregex "^BFMLAL(B|T)")>;
1648*0fca6ea1SDimitry Andric
1649*0fca6ea1SDimitry Andric// 3,4
1650*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^(US|SU)DOTv")>;
1651*0fca6ea1SDimitry Andric
1652*0fca6ea1SDimitry Andric// 3,1
1653*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123], (instregex "^BF(16)?DOTv")>;
1654*0fca6ea1SDimitry Andric
1655*0fca6ea1SDimitry Andric// 3,4
1656*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^BFCVT(N|N2)?$")>;
1657*0fca6ea1SDimitry Andric
1658*0fca6ea1SDimitry Andric
1659*0fca6ea1SDimitry Andric} // SchedModel = OryonModel
1660