xref: /aosp_15_r20/external/llvm/lib/Target/AArch64/AArch64SchedCyclone.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//=- AArch64SchedCyclone.td - Cyclone Scheduling Definitions -*- tablegen -*-=//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// This file defines the machine model for AArch64 Cyclone to support
11*9880d681SAndroid Build Coastguard Worker// instruction scheduling and other instruction cost heuristics.
12*9880d681SAndroid Build Coastguard Worker//
13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerdef CycloneModel : SchedMachineModel {
16*9880d681SAndroid Build Coastguard Worker  let IssueWidth = 6; // 6 micro-ops are dispatched per cycle.
17*9880d681SAndroid Build Coastguard Worker  let MicroOpBufferSize = 192; // Based on the reorder buffer.
18*9880d681SAndroid Build Coastguard Worker  let LoadLatency = 4; // Optimistic load latency.
19*9880d681SAndroid Build Coastguard Worker  let MispredictPenalty = 16; // 14-19 cycles are typical.
20*9880d681SAndroid Build Coastguard Worker  let CompleteModel = 1;
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
24*9880d681SAndroid Build Coastguard Worker// Define each kind of processor resource and number available on Cyclone.
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker// 4 integer pipes
27*9880d681SAndroid Build Coastguard Workerdef CyUnitI : ProcResource<4> {
28*9880d681SAndroid Build Coastguard Worker  let BufferSize = 48;
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker// 2 branch units: I[0..1]
32*9880d681SAndroid Build Coastguard Workerdef CyUnitB : ProcResource<2> {
33*9880d681SAndroid Build Coastguard Worker  let Super  = CyUnitI;
34*9880d681SAndroid Build Coastguard Worker  let BufferSize = 24;
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker// 1 indirect-branch unit: I[0]
38*9880d681SAndroid Build Coastguard Workerdef CyUnitBR : ProcResource<1> {
39*9880d681SAndroid Build Coastguard Worker  let Super  = CyUnitB;
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker// 2 shifter pipes: I[2..3]
43*9880d681SAndroid Build Coastguard Worker// When an instruction consumes a CyUnitIS, it also consumes a CyUnitI
44*9880d681SAndroid Build Coastguard Workerdef CyUnitIS : ProcResource<2> {
45*9880d681SAndroid Build Coastguard Worker  let Super = CyUnitI;
46*9880d681SAndroid Build Coastguard Worker  let BufferSize = 24;
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker// 1 mul pipe: I[0]
50*9880d681SAndroid Build Coastguard Workerdef CyUnitIM : ProcResource<1> {
51*9880d681SAndroid Build Coastguard Worker  let Super = CyUnitBR;
52*9880d681SAndroid Build Coastguard Worker  let BufferSize = 32;
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker// 1 div pipe: I[1]
56*9880d681SAndroid Build Coastguard Workerdef CyUnitID : ProcResource<1> {
57*9880d681SAndroid Build Coastguard Worker  let Super = CyUnitB;
58*9880d681SAndroid Build Coastguard Worker  let BufferSize = 16;
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker// 1 integer division unit. This is driven by the ID pipe, but only
62*9880d681SAndroid Build Coastguard Worker// consumes the pipe for one cycle at issue and another cycle at writeback.
63*9880d681SAndroid Build Coastguard Workerdef CyUnitIntDiv : ProcResource<1>;
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker// 2 ld/st pipes.
66*9880d681SAndroid Build Coastguard Workerdef CyUnitLS : ProcResource<2> {
67*9880d681SAndroid Build Coastguard Worker  let BufferSize = 28;
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker// 3 fp/vector pipes.
71*9880d681SAndroid Build Coastguard Workerdef CyUnitV : ProcResource<3> {
72*9880d681SAndroid Build Coastguard Worker  let BufferSize = 48;
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker// 2 fp/vector arithmetic and multiply pipes: V[0-1]
75*9880d681SAndroid Build Coastguard Workerdef CyUnitVM : ProcResource<2> {
76*9880d681SAndroid Build Coastguard Worker  let Super = CyUnitV;
77*9880d681SAndroid Build Coastguard Worker  let BufferSize = 32;
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker// 1 fp/vector division/sqrt pipe: V[2]
80*9880d681SAndroid Build Coastguard Workerdef CyUnitVD : ProcResource<1> {
81*9880d681SAndroid Build Coastguard Worker  let Super = CyUnitV;
82*9880d681SAndroid Build Coastguard Worker  let BufferSize = 16;
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker// 1 fp compare pipe: V[0]
85*9880d681SAndroid Build Coastguard Workerdef CyUnitVC : ProcResource<1> {
86*9880d681SAndroid Build Coastguard Worker  let Super = CyUnitVM;
87*9880d681SAndroid Build Coastguard Worker  let BufferSize = 16;
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker// 2 fp division/square-root units.  These are driven by the VD pipe,
91*9880d681SAndroid Build Coastguard Worker// but only consume the pipe for one cycle at issue and a cycle at writeback.
92*9880d681SAndroid Build Coastguard Workerdef CyUnitFloatDiv : ProcResource<2>;
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
95*9880d681SAndroid Build Coastguard Worker// Define scheduler read/write resources and latency on Cyclone.
96*9880d681SAndroid Build Coastguard Worker// This mirrors sections 7.7-7.9 of the Tuning Guide v1.0.1.
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerlet SchedModel = CycloneModel in {
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker//---
101*9880d681SAndroid Build Coastguard Worker// 7.8.1. Moves
102*9880d681SAndroid Build Coastguard Worker//---
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker// A single nop micro-op (uX).
105*9880d681SAndroid Build Coastguard Workerdef WriteX : SchedWriteRes<[]> { let Latency = 0; }
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker// Move zero is a register rename (to machine register zero).
108*9880d681SAndroid Build Coastguard Worker// The move is replaced by a single nop micro-op.
109*9880d681SAndroid Build Coastguard Worker// MOVZ Rd, #0
110*9880d681SAndroid Build Coastguard Worker// AND Rd, Rzr, #imm
111*9880d681SAndroid Build Coastguard Workerdef WriteZPred : SchedPredicate<[{TII->isGPRZero(*MI)}]>;
112*9880d681SAndroid Build Coastguard Workerdef WriteImmZ  : SchedWriteVariant<[
113*9880d681SAndroid Build Coastguard Worker                   SchedVar<WriteZPred, [WriteX]>,
114*9880d681SAndroid Build Coastguard Worker                   SchedVar<NoSchedPred, [WriteImm]>]>;
115*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteImmZ], (instrs MOVZWi,MOVZXi,ANDWri,ANDXri)>;
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker// Move GPR is a register rename and single nop micro-op.
118*9880d681SAndroid Build Coastguard Worker// ORR Xd, XZR, Xm
119*9880d681SAndroid Build Coastguard Worker// ADD Xd, Xn, #0
120*9880d681SAndroid Build Coastguard Workerdef WriteIMovPred : SchedPredicate<[{TII->isGPRCopy(*MI)}]>;
121*9880d681SAndroid Build Coastguard Workerdef WriteVMovPred : SchedPredicate<[{TII->isFPRCopy(*MI)}]>;
122*9880d681SAndroid Build Coastguard Workerdef WriteMov      : SchedWriteVariant<[
123*9880d681SAndroid Build Coastguard Worker                      SchedVar<WriteIMovPred, [WriteX]>,
124*9880d681SAndroid Build Coastguard Worker                      SchedVar<WriteVMovPred, [WriteX]>,
125*9880d681SAndroid Build Coastguard Worker                      SchedVar<NoSchedPred,   [WriteI]>]>;
126*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMov], (instrs COPY,ORRXrr,ADDXrr)>;
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker// Move non-zero immediate is an integer ALU op.
129*9880d681SAndroid Build Coastguard Worker// MOVN,MOVZ,MOVK
130*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteImm, [CyUnitI]>;
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker//---
133*9880d681SAndroid Build Coastguard Worker// 7.8.2-7.8.5. Arithmetic and Logical, Comparison, Conditional,
134*9880d681SAndroid Build Coastguard Worker//              Shifts and Bitfield Operations
135*9880d681SAndroid Build Coastguard Worker//---
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker// ADR,ADRP
138*9880d681SAndroid Build Coastguard Worker// ADD(S)ri,SUB(S)ri,AND(S)ri,EORri,ORRri
139*9880d681SAndroid Build Coastguard Worker// ADD(S)rr,SUB(S)rr,AND(S)rr,BIC(S)rr,EONrr,EORrr,ORNrr,ORRrr
140*9880d681SAndroid Build Coastguard Worker// ADC(S),SBC(S)
141*9880d681SAndroid Build Coastguard Worker// Aliases: CMN, CMP, TST
142*9880d681SAndroid Build Coastguard Worker//
143*9880d681SAndroid Build Coastguard Worker// Conditional operations.
144*9880d681SAndroid Build Coastguard Worker// CCMNi,CCMPi,CCMNr,CCMPr,
145*9880d681SAndroid Build Coastguard Worker// CSEL,CSINC,CSINV,CSNEG
146*9880d681SAndroid Build Coastguard Worker//
147*9880d681SAndroid Build Coastguard Worker// Bit counting and reversal operations.
148*9880d681SAndroid Build Coastguard Worker// CLS,CLZ,RBIT,REV,REV16,REV32
149*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteI, [CyUnitI]>;
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker// ADD with shifted register operand is a single micro-op that
152*9880d681SAndroid Build Coastguard Worker// consumes a shift pipeline for two cycles.
153*9880d681SAndroid Build Coastguard Worker// ADD(S)rs,SUB(S)rs,AND(S)rs,BIC(S)rs,EONrs,EORrs,ORNrs,ORRrs
154*9880d681SAndroid Build Coastguard Worker// EXAMPLE: ADDrs Xn, Xm LSL #imm
155*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteISReg, [CyUnitIS]> {
156*9880d681SAndroid Build Coastguard Worker  let Latency = 2;
157*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2];
158*9880d681SAndroid Build Coastguard Worker}
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker// ADD with extended register operand is the same as shifted reg operand.
161*9880d681SAndroid Build Coastguard Worker// ADD(S)re,SUB(S)re
162*9880d681SAndroid Build Coastguard Worker// EXAMPLE: ADDXre Xn, Xm, UXTB #1
163*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIEReg, [CyUnitIS]> {
164*9880d681SAndroid Build Coastguard Worker  let Latency = 2;
165*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2];
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker// Variable shift and bitfield operations.
169*9880d681SAndroid Build Coastguard Worker// ASRV,LSLV,LSRV,RORV,BFM,SBFM,UBFM
170*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIS, [CyUnitIS]>;
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker// EXTR Shifts a pair of registers and requires two micro-ops.
173*9880d681SAndroid Build Coastguard Worker// The second micro-op is delayed, as modeled by ReadExtrHi.
174*9880d681SAndroid Build Coastguard Worker// EXTR Xn, Xm, #imm
175*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteExtr, [CyUnitIS, CyUnitIS]> {
176*9880d681SAndroid Build Coastguard Worker  let Latency = 2;
177*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 2;
178*9880d681SAndroid Build Coastguard Worker}
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker// EXTR's first register read is delayed by one cycle, effectively
181*9880d681SAndroid Build Coastguard Worker// shortening its writer's latency.
182*9880d681SAndroid Build Coastguard Worker// EXTR Xn, Xm, #imm
183*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadExtrHi, 1>;
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker//---
186*9880d681SAndroid Build Coastguard Worker// 7.8.6. Multiplies
187*9880d681SAndroid Build Coastguard Worker//---
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker// MUL/MNEG are aliases for MADD/MSUB.
190*9880d681SAndroid Build Coastguard Worker// MADDW,MSUBW,SMADDL,SMSUBL,UMADDL,UMSUBL
191*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM32, [CyUnitIM]> {
192*9880d681SAndroid Build Coastguard Worker  let Latency = 4;
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker// MADDX,MSUBX,SMULH,UMULH
195*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM64, [CyUnitIM]> {
196*9880d681SAndroid Build Coastguard Worker  let Latency = 5;
197*9880d681SAndroid Build Coastguard Worker}
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker//---
200*9880d681SAndroid Build Coastguard Worker// 7.8.7. Divide
201*9880d681SAndroid Build Coastguard Worker//---
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Worker// 32-bit divide takes 7-13 cycles. 10 cycles covers a 20-bit quotient.
204*9880d681SAndroid Build Coastguard Worker// The ID pipe is consumed for 2 cycles: issue and writeback.
205*9880d681SAndroid Build Coastguard Worker// SDIVW,UDIVW
206*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID32, [CyUnitID, CyUnitIntDiv]> {
207*9880d681SAndroid Build Coastguard Worker  let Latency = 10;
208*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2, 10];
209*9880d681SAndroid Build Coastguard Worker}
210*9880d681SAndroid Build Coastguard Worker// 64-bit divide takes 7-21 cycles. 13 cycles covers a 32-bit quotient.
211*9880d681SAndroid Build Coastguard Worker// The ID pipe is consumed for 2 cycles: issue and writeback.
212*9880d681SAndroid Build Coastguard Worker// SDIVX,UDIVX
213*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID64, [CyUnitID, CyUnitIntDiv]> {
214*9880d681SAndroid Build Coastguard Worker  let Latency = 13;
215*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2, 13];
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker//---
219*9880d681SAndroid Build Coastguard Worker// 7.8.8,7.8.10. Load/Store, single element
220*9880d681SAndroid Build Coastguard Worker//---
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker// Integer loads take 4 cycles and use one LS unit for one cycle.
223*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLD, [CyUnitLS]> {
224*9880d681SAndroid Build Coastguard Worker  let Latency = 4;
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker// Store-load forwarding is 4 cycles.
228*9880d681SAndroid Build Coastguard Worker//
229*9880d681SAndroid Build Coastguard Worker// Note: The store-exclusive sequence incorporates this
230*9880d681SAndroid Build Coastguard Worker// latency. However, general heuristics should not model the
231*9880d681SAndroid Build Coastguard Worker// dependence between a store and subsequent may-alias load because
232*9880d681SAndroid Build Coastguard Worker// hardware speculation works.
233*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteST, [CyUnitLS]> {
234*9880d681SAndroid Build Coastguard Worker  let Latency = 4;
235*9880d681SAndroid Build Coastguard Worker}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker// Load from base address plus an optionally scaled register offset.
238*9880d681SAndroid Build Coastguard Worker// Rt latency is latency WriteIS + WriteLD.
239*9880d681SAndroid Build Coastguard Worker// EXAMPLE: LDR Xn, Xm [, lsl 3]
240*9880d681SAndroid Build Coastguard Workerdef CyWriteLDIdx : SchedWriteVariant<[
241*9880d681SAndroid Build Coastguard Worker  SchedVar<ScaledIdxPred, [WriteIS, WriteLD]>, // Load from scaled register.
242*9880d681SAndroid Build Coastguard Worker  SchedVar<NoSchedPred,   [WriteLD]>]>;        // Load from register offset.
243*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<WriteLDIdx, CyWriteLDIdx>;    // Map AArch64->Cyclone type.
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker// EXAMPLE: STR Xn, Xm [, lsl 3]
246*9880d681SAndroid Build Coastguard Workerdef CyWriteSTIdx : SchedWriteVariant<[
247*9880d681SAndroid Build Coastguard Worker  SchedVar<ScaledIdxPred, [WriteIS, WriteST]>, // Store to scaled register.
248*9880d681SAndroid Build Coastguard Worker  SchedVar<NoSchedPred,   [WriteST]>]>;        // Store to register offset.
249*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<WriteSTIdx, CyWriteSTIdx>;    // Map AArch64->Cyclone type.
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Worker// Read the (unshifted) base register Xn in the second micro-op one cycle later.
252*9880d681SAndroid Build Coastguard Worker// EXAMPLE: LDR Xn, Xm [, lsl 3]
253*9880d681SAndroid Build Coastguard Workerdef ReadBaseRS : SchedReadAdvance<1>;
254*9880d681SAndroid Build Coastguard Workerdef CyReadAdrBase : SchedReadVariant<[
255*9880d681SAndroid Build Coastguard Worker  SchedVar<ScaledIdxPred, [ReadBaseRS]>, // Read base reg after shifting offset.
256*9880d681SAndroid Build Coastguard Worker  SchedVar<NoSchedPred,   [ReadDefault]>]>;   // Read base reg with no shift.
257*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<ReadAdrBase, CyReadAdrBase>; // Map AArch64->Cyclone type.
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker//---
260*9880d681SAndroid Build Coastguard Worker// 7.8.9,7.8.11. Load/Store, paired
261*9880d681SAndroid Build Coastguard Worker//---
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker// Address pre/post increment is a simple ALU op with one cycle latency.
264*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAdr, [CyUnitI]>;
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker// LDP high register write is fused with the load, but a nop micro-op remains.
267*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLDHi, []> {
268*9880d681SAndroid Build Coastguard Worker  let Latency = 4;
269*9880d681SAndroid Build Coastguard Worker}
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker// STP is a vector op and store, except for QQ, which is just two stores.
272*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<WriteSTP, WriteVSTShuffle>;
273*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteST, WriteST], (instrs STPQi)>;
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Worker//---
276*9880d681SAndroid Build Coastguard Worker// 7.8.13. Branches
277*9880d681SAndroid Build Coastguard Worker//---
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Worker// Branches take a single micro-op.
280*9880d681SAndroid Build Coastguard Worker// The misprediction penalty is defined as a SchedMachineModel property.
281*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBr,    [CyUnitB]>  {let Latency = 0;}
282*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBrReg, [CyUnitBR]> {let Latency = 0;}
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Worker//---
285*9880d681SAndroid Build Coastguard Worker// 7.8.14. Never-issued Instructions, Barrier and Hint Operations
286*9880d681SAndroid Build Coastguard Worker//---
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker// NOP,SEV,SEVL,WFE,WFI,YIELD
289*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteHint, []> {let Latency = 0;}
290*9880d681SAndroid Build Coastguard Worker// ISB
291*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteI], (instrs ISB)>;
292*9880d681SAndroid Build Coastguard Worker// SLREX,DMB,DSB
293*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBarrier, [CyUnitLS]>;
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker// System instructions get an invalid latency because the latency of
296*9880d681SAndroid Build Coastguard Worker// other operations across them is meaningless.
297*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSys, []> {let Latency = -1;}
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
300*9880d681SAndroid Build Coastguard Worker// 7.9 Vector Unit Instructions
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker// Simple vector operations take 2 cycles.
303*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteV, [CyUnitV]> {let Latency = 2;}
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker// Define some longer latency vector op types for Cyclone.
306*9880d681SAndroid Build Coastguard Workerdef CyWriteV3 : SchedWriteRes<[CyUnitV]> {let Latency = 3;}
307*9880d681SAndroid Build Coastguard Workerdef CyWriteV4 : SchedWriteRes<[CyUnitV]> {let Latency = 4;}
308*9880d681SAndroid Build Coastguard Workerdef CyWriteV5 : SchedWriteRes<[CyUnitV]> {let Latency = 5;}
309*9880d681SAndroid Build Coastguard Workerdef CyWriteV6 : SchedWriteRes<[CyUnitV]> {let Latency = 6;}
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Worker// Simple floating-point operations take 2 cycles.
312*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteF, [CyUnitV]> {let Latency = 2;}
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker//---
315*9880d681SAndroid Build Coastguard Worker// 7.9.1 Vector Moves
316*9880d681SAndroid Build Coastguard Worker//---
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker// TODO: Add Cyclone-specific zero-cycle zeros. LLVM currently
319*9880d681SAndroid Build Coastguard Worker// generates expensive int-float conversion instead:
320*9880d681SAndroid Build Coastguard Worker// FMOVDi Dd, #0.0
321*9880d681SAndroid Build Coastguard Worker// FMOVv2f64ns Vd.2d, #0.0
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Worker// FMOVSi,FMOVDi
324*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFImm, [CyUnitV]> {let Latency = 2;}
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Worker// MOVI,MVNI are WriteV
327*9880d681SAndroid Build Coastguard Worker// FMOVv2f32ns,FMOVv2f64ns,FMOVv4f32ns are WriteV
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker// Move FPR is a register rename and single nop micro-op.
330*9880d681SAndroid Build Coastguard Worker// ORR.16b Vd,Vn,Vn
331*9880d681SAndroid Build Coastguard Worker// COPY is handled above in the WriteMov Variant.
332*9880d681SAndroid Build Coastguard Workerdef WriteVMov    : SchedWriteVariant<[
333*9880d681SAndroid Build Coastguard Worker                     SchedVar<WriteVMovPred, [WriteX]>,
334*9880d681SAndroid Build Coastguard Worker                     SchedVar<NoSchedPred,   [WriteV]>]>;
335*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVMov], (instrs ORRv16i8)>;
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Worker// FMOVSr,FMOVDr are WriteF.
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Worker// MOV V,V is a WriteV.
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Worker// CPY D,V[x] is a WriteV
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker// INS V[x],V[y] is a WriteV.
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker// FMOVWSr,FMOVXDr,FMOVXDHighr
346*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCopy, [CyUnitLS]> {
347*9880d681SAndroid Build Coastguard Worker  let Latency = 5;
348*9880d681SAndroid Build Coastguard Worker}
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Worker// FMOVSWr,FMOVDXr
351*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteLD], (instrs FMOVSWr,FMOVDXr,FMOVDXHighr)>;
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Worker// INS V[x],R
354*9880d681SAndroid Build Coastguard Workerdef CyWriteCopyToFPR : WriteSequence<[WriteVLD, WriteV]>;
355*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCopyToFPR], (instregex "INSv")>;
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker// SMOV,UMOV R,V[x]
358*9880d681SAndroid Build Coastguard Workerdef CyWriteCopyToGPR : WriteSequence<[WriteLD, WriteI]>;
359*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCopyToGPR], (instregex "SMOVv","UMOVv")>;
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker// DUP V,R
362*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCopyToFPR], (instregex "DUPv")>;
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Worker// DUP V,V[x] is a WriteV.
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker//---
367*9880d681SAndroid Build Coastguard Worker// 7.9.2 Integer Arithmetic, Logical, and Comparisons
368*9880d681SAndroid Build Coastguard Worker//---
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker// BIC,ORR V,#imm are WriteV
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "ABSv")>;
373*9880d681SAndroid Build Coastguard Worker
374*9880d681SAndroid Build Coastguard Worker// MVN,NEG,NOT are WriteV
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SQABSv","SQNEGv")>;
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker// ADDP is a WriteV.
379*9880d681SAndroid Build Coastguard Workerdef CyWriteVADDLP : SchedWriteRes<[CyUnitV]> {let Latency = 2;}
380*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVADDLP], (instregex "SADDLPv","UADDLPv")>;
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3],
383*9880d681SAndroid Build Coastguard Worker             (instregex "ADDVv","SMAXVv","UMAXVv","SMINVv","UMINVv")>;
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SADDLV","UADDLV")>;
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Worker// ADD,SUB are WriteV
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Worker// Forward declare.
390*9880d681SAndroid Build Coastguard Workerdef CyWriteVABD : SchedWriteRes<[CyUnitV]> {let Latency = 3;}
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker// Add/Diff and accumulate uses the vector multiply unit.
393*9880d681SAndroid Build Coastguard Workerdef CyWriteVAccum : SchedWriteRes<[CyUnitVM]> {let Latency = 3;}
394*9880d681SAndroid Build Coastguard Workerdef CyReadVAccum  : SchedReadAdvance<1,
395*9880d681SAndroid Build Coastguard Worker                    [CyWriteVAccum, CyWriteVADDLP, CyWriteVABD]>;
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVAccum, CyReadVAccum],
398*9880d681SAndroid Build Coastguard Worker             (instregex "SADALP","UADALP")>;
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVAccum, CyReadVAccum],
401*9880d681SAndroid Build Coastguard Worker             (instregex "SABAv","UABAv","SABALv","UABALv")>;
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SQADDv","SQSUBv","UQADDv","UQSUBv")>;
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SUQADDv","USQADDv")>;
406*9880d681SAndroid Build Coastguard Worker
407*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], (instregex "ADDHNv","RADDHNv", "RSUBHNv", "SUBHNv")>;
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Worker// WriteV includes:
410*9880d681SAndroid Build Coastguard Worker// AND,BIC,CMTST,EOR,ORN,ORR
411*9880d681SAndroid Build Coastguard Worker// ADDP
412*9880d681SAndroid Build Coastguard Worker// SHADD,SHSUB,SRHADD,UHADD,UHSUB,URHADD
413*9880d681SAndroid Build Coastguard Worker// SADDL,SSUBL,UADDL,USUBL
414*9880d681SAndroid Build Coastguard Worker// SADDW,SSUBW,UADDW,USUBW
415*9880d681SAndroid Build Coastguard Worker
416*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "CMEQv","CMGEv","CMGTv",
417*9880d681SAndroid Build Coastguard Worker                                     "CMLEv","CMLTv",
418*9880d681SAndroid Build Coastguard Worker                                     "CMHIv","CMHSv")>;
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SMAXv","SMINv","UMAXv","UMINv",
421*9880d681SAndroid Build Coastguard Worker                                     "SMAXPv","SMINPv","UMAXPv","UMINPv")>;
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVABD], (instregex "SABDv","UABDv",
424*9880d681SAndroid Build Coastguard Worker                                       "SABDLv","UABDLv")>;
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Worker//---
427*9880d681SAndroid Build Coastguard Worker// 7.9.3 Floating Point Arithmetic and Comparisons
428*9880d681SAndroid Build Coastguard Worker//---
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Worker// FABS,FNEG are WriteF
431*9880d681SAndroid Build Coastguard Worker
432*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], (instrs FADDPv2i32p)>;
433*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV5], (instrs FADDPv2i64p)>;
434*9880d681SAndroid Build Coastguard Worker
435*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "FMAXPv2i","FMAXNMPv2i",
436*9880d681SAndroid Build Coastguard Worker                                     "FMINPv2i","FMINNMPv2i")>;
437*9880d681SAndroid Build Coastguard Worker
438*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], (instregex "FMAXVv","FMAXNMVv","FMINVv","FMINNMVv")>;
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], (instrs FADDSrr,FADDv2f32,FADDv4f32,
441*9880d681SAndroid Build Coastguard Worker                                  FSUBSrr,FSUBv2f32,FSUBv4f32,
442*9880d681SAndroid Build Coastguard Worker                                  FADDPv2f32,FADDPv4f32,
443*9880d681SAndroid Build Coastguard Worker                                  FABD32,FABDv2f32,FABDv4f32)>;
444*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV5], (instrs FADDDrr,FADDv2f64,
445*9880d681SAndroid Build Coastguard Worker                                  FSUBDrr,FSUBv2f64,
446*9880d681SAndroid Build Coastguard Worker                                  FADDPv2f64,
447*9880d681SAndroid Build Coastguard Worker                                  FABD64,FABDv2f64)>;
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "FCMEQ","FCMGT","FCMLE","FCMLT")>;
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "FACGE","FACGT",
452*9880d681SAndroid Build Coastguard Worker                                     "FMAXS","FMAXD","FMAXv",
453*9880d681SAndroid Build Coastguard Worker                                     "FMINS","FMIND","FMINv",
454*9880d681SAndroid Build Coastguard Worker                                     "FMAXNMS","FMAXNMD","FMAXNMv",
455*9880d681SAndroid Build Coastguard Worker                                     "FMINNMS","FMINNMD","FMINNMv",
456*9880d681SAndroid Build Coastguard Worker                                     "FMAXPv2f","FMAXPv4f",
457*9880d681SAndroid Build Coastguard Worker                                     "FMINPv2f","FMINPv4f",
458*9880d681SAndroid Build Coastguard Worker                                     "FMAXNMPv2f","FMAXNMPv4f",
459*9880d681SAndroid Build Coastguard Worker                                     "FMINNMPv2f","FMINNMPv4f")>;
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Worker// FCMP,FCMPE,FCCMP,FCCMPE
462*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCmp, [CyUnitVC]> {let Latency = 4;}
463*9880d681SAndroid Build Coastguard Worker
464*9880d681SAndroid Build Coastguard Worker// FCSEL is a WriteF.
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Worker//---
467*9880d681SAndroid Build Coastguard Worker// 7.9.4 Shifts and Bitfield Operations
468*9880d681SAndroid Build Coastguard Worker//---
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Worker// SHL is a WriteV
471*9880d681SAndroid Build Coastguard Worker
472*9880d681SAndroid Build Coastguard Workerdef CyWriteVSHR : SchedWriteRes<[CyUnitV]> {let Latency = 2;}
473*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVSHR], (instregex "SSHRv","USHRv")>;
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Workerdef CyWriteVSRSHR : SchedWriteRes<[CyUnitV]> {let Latency = 3;}
476*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVSRSHR], (instregex "SRSHRv","URSHRv")>;
477*9880d681SAndroid Build Coastguard Worker
478*9880d681SAndroid Build Coastguard Worker// Shift and accumulate uses the vector multiply unit.
479*9880d681SAndroid Build Coastguard Workerdef CyWriteVShiftAcc : SchedWriteRes<[CyUnitVM]> {let Latency = 3;}
480*9880d681SAndroid Build Coastguard Workerdef CyReadVShiftAcc  : SchedReadAdvance<1,
481*9880d681SAndroid Build Coastguard Worker                        [CyWriteVShiftAcc, CyWriteVSHR, CyWriteVSRSHR]>;
482*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVShiftAcc, CyReadVShiftAcc],
483*9880d681SAndroid Build Coastguard Worker             (instregex "SRSRAv","SSRAv","URSRAv","USRAv")>;
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Worker// SSHL,USHL are WriteV.
486*9880d681SAndroid Build Coastguard Worker
487*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SRSHLv","URSHLv")>;
488*9880d681SAndroid Build Coastguard Worker
489*9880d681SAndroid Build Coastguard Worker// SQSHL,SQSHLU,UQSHL are WriteV.
490*9880d681SAndroid Build Coastguard Worker
491*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SQRSHLv","UQRSHLv")>;
492*9880d681SAndroid Build Coastguard Worker
493*9880d681SAndroid Build Coastguard Worker// WriteV includes:
494*9880d681SAndroid Build Coastguard Worker// SHLL,SSHLL,USHLL
495*9880d681SAndroid Build Coastguard Worker// SLI,SRI
496*9880d681SAndroid Build Coastguard Worker// BIF,BIT,BSL
497*9880d681SAndroid Build Coastguard Worker// EXT
498*9880d681SAndroid Build Coastguard Worker// CLS,CLZ,CNT,RBIT,REV16,REV32,REV64,XTN
499*9880d681SAndroid Build Coastguard Worker// XTN2
500*9880d681SAndroid Build Coastguard Worker
501*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4],
502*9880d681SAndroid Build Coastguard Worker             (instregex "RSHRNv","SHRNv",
503*9880d681SAndroid Build Coastguard Worker                        "SQRSHRNv","SQRSHRUNv","SQSHRNv","SQSHRUNv",
504*9880d681SAndroid Build Coastguard Worker                        "UQRSHRNv","UQSHRNv","SQXTNv","SQXTUNv","UQXTNv")>;
505*9880d681SAndroid Build Coastguard Worker
506*9880d681SAndroid Build Coastguard Worker//---
507*9880d681SAndroid Build Coastguard Worker// 7.9.5 Multiplication
508*9880d681SAndroid Build Coastguard Worker//---
509*9880d681SAndroid Build Coastguard Worker
510*9880d681SAndroid Build Coastguard Workerdef CyWriteVMul : SchedWriteRes<[CyUnitVM]> { let Latency = 4;}
511*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVMul], (instregex "MULv","SMULLv","UMULLv",
512*9880d681SAndroid Build Coastguard Worker                             "SQDMULLv","SQDMULHv","SQRDMULHv")>;
513*9880d681SAndroid Build Coastguard Worker
514*9880d681SAndroid Build Coastguard Worker// FMUL,FMULX,FNMUL default to WriteFMul.
515*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFMul, [CyUnitVM]> { let Latency = 4;}
516*9880d681SAndroid Build Coastguard Worker
517*9880d681SAndroid Build Coastguard Workerdef CyWriteV64Mul : SchedWriteRes<[CyUnitVM]> { let Latency = 5;}
518*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV64Mul], (instrs FMULDrr,FMULv2f64,FMULv2i64_indexed,
519*9880d681SAndroid Build Coastguard Worker                               FNMULDrr,FMULX64,FMULXv2f64,FMULXv2i64_indexed)>;
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Workerdef CyReadVMulAcc : SchedReadAdvance<1, [CyWriteVMul, CyWriteV64Mul]>;
522*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVMul, CyReadVMulAcc],
523*9880d681SAndroid Build Coastguard Worker             (instregex "MLA","MLS","SMLAL","SMLSL","UMLAL","UMLSL",
524*9880d681SAndroid Build Coastguard Worker              "SQDMLAL","SQDMLSL")>;
525*9880d681SAndroid Build Coastguard Worker
526*9880d681SAndroid Build Coastguard Workerdef CyWriteSMul : SchedWriteRes<[CyUnitVM]> { let Latency = 8;}
527*9880d681SAndroid Build Coastguard Workerdef CyWriteDMul : SchedWriteRes<[CyUnitVM]> { let Latency = 10;}
528*9880d681SAndroid Build Coastguard Workerdef CyReadSMul : SchedReadAdvance<4, [CyWriteSMul]>;
529*9880d681SAndroid Build Coastguard Workerdef CyReadDMul : SchedReadAdvance<5, [CyWriteDMul]>;
530*9880d681SAndroid Build Coastguard Worker
531*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteSMul, CyReadSMul],
532*9880d681SAndroid Build Coastguard Worker             (instrs FMADDSrrr,FMSUBSrrr,FNMADDSrrr,FNMSUBSrrr,
533*9880d681SAndroid Build Coastguard Worker              FMLAv2f32,FMLAv4f32,
534*9880d681SAndroid Build Coastguard Worker              FMLAv1i32_indexed,FMLAv1i64_indexed,FMLAv2i32_indexed)>;
535*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteDMul, CyReadDMul],
536*9880d681SAndroid Build Coastguard Worker             (instrs FMADDDrrr,FMSUBDrrr,FNMADDDrrr,FNMSUBDrrr,
537*9880d681SAndroid Build Coastguard Worker              FMLAv2f64,FMLAv2i64_indexed,
538*9880d681SAndroid Build Coastguard Worker              FMLSv2f64,FMLSv2i64_indexed)>;
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Workerdef CyWritePMUL : SchedWriteRes<[CyUnitVD]> { let Latency = 3; }
541*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWritePMUL], (instregex "PMULv", "PMULLv")>;
542*9880d681SAndroid Build Coastguard Worker
543*9880d681SAndroid Build Coastguard Worker//---
544*9880d681SAndroid Build Coastguard Worker// 7.9.6 Divide and Square Root
545*9880d681SAndroid Build Coastguard Worker//---
546*9880d681SAndroid Build Coastguard Worker
547*9880d681SAndroid Build Coastguard Worker// FDIV,FSQRT
548*9880d681SAndroid Build Coastguard Worker// TODO: Add 64-bit variant with 19 cycle latency.
549*9880d681SAndroid Build Coastguard Worker// TODO: Specialize FSQRT for longer latency.
550*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFDiv, [CyUnitVD, CyUnitFloatDiv]> {
551*9880d681SAndroid Build Coastguard Worker  let Latency = 17;
552*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2, 17];
553*9880d681SAndroid Build Coastguard Worker}
554*9880d681SAndroid Build Coastguard Worker
555*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], (instregex "FRECPEv","FRECPXv","URECPEv","URSQRTEv")>;
556*9880d681SAndroid Build Coastguard Worker
557*9880d681SAndroid Build Coastguard Workerdef WriteFRSQRTE : SchedWriteRes<[CyUnitVM]> { let Latency = 4; }
558*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFRSQRTE], (instregex "FRSQRTEv")>;
559*9880d681SAndroid Build Coastguard Worker
560*9880d681SAndroid Build Coastguard Workerdef WriteFRECPS : SchedWriteRes<[CyUnitVM]> { let Latency = 8; }
561*9880d681SAndroid Build Coastguard Workerdef WriteFRSQRTS : SchedWriteRes<[CyUnitVM]> { let Latency = 10; }
562*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFRECPS],  (instregex "FRECPSv")>;
563*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFRSQRTS], (instregex "FRSQRTSv")>;
564*9880d681SAndroid Build Coastguard Worker
565*9880d681SAndroid Build Coastguard Worker//---
566*9880d681SAndroid Build Coastguard Worker// 7.9.7 Integer-FP Conversions
567*9880d681SAndroid Build Coastguard Worker//---
568*9880d681SAndroid Build Coastguard Worker
569*9880d681SAndroid Build Coastguard Worker// FCVT lengthen f16/s32
570*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteV], (instrs FCVTSHr,FCVTDHr,FCVTDSr)>;
571*9880d681SAndroid Build Coastguard Worker
572*9880d681SAndroid Build Coastguard Worker// FCVT,FCVTN,FCVTXN
573*9880d681SAndroid Build Coastguard Worker// SCVTF,UCVTF V,V
574*9880d681SAndroid Build Coastguard Worker// FRINT(AIMNPXZ) V,V
575*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCvt, [CyUnitV]> {let Latency = 4;}
576*9880d681SAndroid Build Coastguard Worker
577*9880d681SAndroid Build Coastguard Worker// SCVT/UCVT S/D, Rd = VLD5+V4: 9 cycles.
578*9880d681SAndroid Build Coastguard Workerdef CyWriteCvtToFPR : WriteSequence<[WriteVLD, CyWriteV4]>;
579*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCopyToFPR], (instregex "FCVT[AMNPZ][SU][SU][WX][SD]r")>;
580*9880d681SAndroid Build Coastguard Worker
581*9880d681SAndroid Build Coastguard Worker// FCVT Rd, S/D = V6+LD4: 10 cycles
582*9880d681SAndroid Build Coastguard Workerdef CyWriteCvtToGPR : WriteSequence<[CyWriteV6, WriteLD]>;
583*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCvtToGPR], (instregex "[SU]CVTF[SU][WX][SD]r")>;
584*9880d681SAndroid Build Coastguard Worker
585*9880d681SAndroid Build Coastguard Worker// FCVTL is a WriteV
586*9880d681SAndroid Build Coastguard Worker
587*9880d681SAndroid Build Coastguard Worker//---
588*9880d681SAndroid Build Coastguard Worker// 7.9.8-7.9.10 Cryptography, Data Transposition, Table Lookup
589*9880d681SAndroid Build Coastguard Worker//---
590*9880d681SAndroid Build Coastguard Worker
591*9880d681SAndroid Build Coastguard Workerdef CyWriteCrypto2 : SchedWriteRes<[CyUnitVD]> {let Latency = 2;}
592*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCrypto2], (instrs AESIMCrr, AESMCrr, SHA1Hrr,
593*9880d681SAndroid Build Coastguard Worker                                       AESDrr, AESErr, SHA1SU1rr, SHA256SU0rr,
594*9880d681SAndroid Build Coastguard Worker                                       SHA1SU0rrr)>;
595*9880d681SAndroid Build Coastguard Worker
596*9880d681SAndroid Build Coastguard Workerdef CyWriteCrypto3 : SchedWriteRes<[CyUnitVD]> {let Latency = 3;}
597*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCrypto3], (instrs SHA256SU1rrr)>;
598*9880d681SAndroid Build Coastguard Worker
599*9880d681SAndroid Build Coastguard Workerdef CyWriteCrypto6 : SchedWriteRes<[CyUnitVD]> {let Latency = 6;}
600*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCrypto6], (instrs SHA1Crrr, SHA1Mrrr, SHA1Prrr,
601*9880d681SAndroid Build Coastguard Worker                                       SHA256Hrrr,SHA256H2rrr)>;
602*9880d681SAndroid Build Coastguard Worker
603*9880d681SAndroid Build Coastguard Worker// TRN,UZP,ZUP are WriteV.
604*9880d681SAndroid Build Coastguard Worker
605*9880d681SAndroid Build Coastguard Worker// TBL,TBX are WriteV.
606*9880d681SAndroid Build Coastguard Worker
607*9880d681SAndroid Build Coastguard Worker//---
608*9880d681SAndroid Build Coastguard Worker// 7.9.11-7.9.14 Load/Store, single element and paired
609*9880d681SAndroid Build Coastguard Worker//---
610*9880d681SAndroid Build Coastguard Worker
611*9880d681SAndroid Build Coastguard Worker// Loading into the vector unit takes 5 cycles vs 4 for integer loads.
612*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVLD, [CyUnitLS]> {
613*9880d681SAndroid Build Coastguard Worker  let Latency = 5;
614*9880d681SAndroid Build Coastguard Worker}
615*9880d681SAndroid Build Coastguard Worker
616*9880d681SAndroid Build Coastguard Worker// Store-load forwarding is 4 cycles.
617*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVST, [CyUnitLS]> {
618*9880d681SAndroid Build Coastguard Worker  let Latency = 4;
619*9880d681SAndroid Build Coastguard Worker}
620*9880d681SAndroid Build Coastguard Worker
621*9880d681SAndroid Build Coastguard Worker// WriteVLDPair/VSTPair sequences are expanded by the target description.
622*9880d681SAndroid Build Coastguard Worker
623*9880d681SAndroid Build Coastguard Worker//---
624*9880d681SAndroid Build Coastguard Worker// 7.9.15 Load, element operations
625*9880d681SAndroid Build Coastguard Worker//---
626*9880d681SAndroid Build Coastguard Worker
627*9880d681SAndroid Build Coastguard Worker// Only the first WriteVLD and WriteAdr for writeback matches def operands.
628*9880d681SAndroid Build Coastguard Worker// Subsequent WriteVLDs consume resources. Since all loaded values have the
629*9880d681SAndroid Build Coastguard Worker// same latency, this is acceptable.
630*9880d681SAndroid Build Coastguard Worker
631*9880d681SAndroid Build Coastguard Worker// Vd is read 5 cycles after issuing the vector load.
632*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadVLD, 5>;
633*9880d681SAndroid Build Coastguard Worker
634*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD],
635*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
636*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr],
637*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST")>;
638*9880d681SAndroid Build Coastguard Worker
639*9880d681SAndroid Build Coastguard Worker// Register writes from the load's high half are fused micro-ops.
640*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD],
641*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Twov(8b|4h|2s|1d)$")>;
642*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr],
643*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Twov(8b|4h|2s|1d)_POST")>;
644*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteVLD],
645*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Twov(16b|8h|4s|2d)$")>;
646*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr, WriteVLD],
647*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Twov(16b|8h|4s|2d)_POST")>;
648*9880d681SAndroid Build Coastguard Worker
649*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteVLD],
650*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Threev(8b|4h|2s|1d)$")>;
651*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr, WriteVLD],
652*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Threev(8b|4h|2s|1d)_POST")>;
653*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteVLD, WriteVLD],
654*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Threev(16b|8h|4s|2d)$")>;
655*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr, WriteVLD, WriteVLD],
656*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Threev(16b|8h|4s|2d)_POST")>;
657*9880d681SAndroid Build Coastguard Worker
658*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteVLD],
659*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Fourv(8b|4h|2s|1d)$")>;
660*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr, WriteVLD],
661*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Fourv(8b|4h|2s|1d)_POST")>;
662*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteVLD, WriteVLD, WriteVLD],
663*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Fourv(16b|8h|4s|2d)$")>;
664*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr, WriteVLD, WriteVLD, WriteVLD],
665*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Fourv(16b|8h|4s|2d)_POST")>;
666*9880d681SAndroid Build Coastguard Worker
667*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD],
668*9880d681SAndroid Build Coastguard Worker             (instregex "LD1i(8|16|32)$")>;
669*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr],
670*9880d681SAndroid Build Coastguard Worker             (instregex "LD1i(8|16|32)_POST")>;
671*9880d681SAndroid Build Coastguard Worker
672*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD],          (instrs LD1i64)>;
673*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr],(instrs LD1i64_POST)>;
674*9880d681SAndroid Build Coastguard Worker
675*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle],
676*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
677*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr],
678*9880d681SAndroid Build Coastguard Worker             (instregex "LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
679*9880d681SAndroid Build Coastguard Worker
680*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteV],
681*9880d681SAndroid Build Coastguard Worker             (instregex "LD2Twov(8b|4h|2s)$")>;
682*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteV],
683*9880d681SAndroid Build Coastguard Worker             (instregex "LD2Twov(8b|4h|2s)_POST$")>;
684*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle],
685*9880d681SAndroid Build Coastguard Worker             (instregex "LD2Twov(16b|8h|4s|2d)$")>;
686*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle],
687*9880d681SAndroid Build Coastguard Worker             (instregex "LD2Twov(16b|8h|4s|2d)_POST")>;
688*9880d681SAndroid Build Coastguard Worker
689*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteV],
690*9880d681SAndroid Build Coastguard Worker             (instregex "LD2i(8|16|32)$")>;
691*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteV],
692*9880d681SAndroid Build Coastguard Worker             (instregex "LD2i(8|16|32)_POST")>;
693*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteV],
694*9880d681SAndroid Build Coastguard Worker             (instregex "LD2i64$")>;
695*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteV],
696*9880d681SAndroid Build Coastguard Worker             (instregex "LD2i64_POST")>;
697*9880d681SAndroid Build Coastguard Worker
698*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteV],
699*9880d681SAndroid Build Coastguard Worker             (instregex "LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
700*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteV],
701*9880d681SAndroid Build Coastguard Worker             (instregex "LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST")>;
702*9880d681SAndroid Build Coastguard Worker
703*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle, WriteV],
704*9880d681SAndroid Build Coastguard Worker             (instregex "LD3Threev(8b|4h|2s)$")>;
705*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle, WriteV],
706*9880d681SAndroid Build Coastguard Worker             (instregex "LD3Threev(8b|4h|2s)_POST")>;
707*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle, WriteVLDShuffle],
708*9880d681SAndroid Build Coastguard Worker             (instregex "LD3Threev(16b|8h|4s|2d)$")>;
709*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle, WriteVLDShuffle],
710*9880d681SAndroid Build Coastguard Worker             (instregex "LD3Threev(16b|8h|4s|2d)_POST")>;
711*9880d681SAndroid Build Coastguard Worker
712*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteV, WriteV],
713*9880d681SAndroid Build Coastguard Worker             (instregex "LD3i(8|16|32)$")>;
714*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteV, WriteV],
715*9880d681SAndroid Build Coastguard Worker             (instregex "LD3i(8|16|32)_POST")>;
716*9880d681SAndroid Build Coastguard Worker
717*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteVLDShuffle, WriteV],
718*9880d681SAndroid Build Coastguard Worker             (instregex "LD3i64$")>;
719*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteVLDShuffle, WriteV],
720*9880d681SAndroid Build Coastguard Worker             (instregex "LD3i64_POST")>;
721*9880d681SAndroid Build Coastguard Worker
722*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteV, WriteV],
723*9880d681SAndroid Build Coastguard Worker             (instregex "LD3Rv(8b|4h|2s|16b|8h|4s)$")>;
724*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteV, WriteV],
725*9880d681SAndroid Build Coastguard Worker             (instregex "LD3Rv(8b|4h|2s|16b|8h|4s)_POST")>;
726*9880d681SAndroid Build Coastguard Worker
727*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle, WriteV],
728*9880d681SAndroid Build Coastguard Worker             (instrs LD3Rv1d,LD3Rv2d)>;
729*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle, WriteV],
730*9880d681SAndroid Build Coastguard Worker             (instrs LD3Rv1d_POST,LD3Rv2d_POST)>;
731*9880d681SAndroid Build Coastguard Worker
732*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle, WriteV, WriteV],
733*9880d681SAndroid Build Coastguard Worker             (instregex "LD4Fourv(8b|4h|2s)$")>;
734*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle, WriteV, WriteV],
735*9880d681SAndroid Build Coastguard Worker             (instregex "LD4Fourv(8b|4h|2s)_POST")>;
736*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDPairShuffle, WriteVLDPairShuffle,
737*9880d681SAndroid Build Coastguard Worker              WriteVLDPairShuffle, WriteVLDPairShuffle],
738*9880d681SAndroid Build Coastguard Worker             (instregex "LD4Fourv(16b|8h|4s|2d)$")>;
739*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDPairShuffle, WriteAdr, WriteVLDPairShuffle,
740*9880d681SAndroid Build Coastguard Worker              WriteVLDPairShuffle, WriteVLDPairShuffle],
741*9880d681SAndroid Build Coastguard Worker             (instregex "LD4Fourv(16b|8h|4s|2d)_POST")>;
742*9880d681SAndroid Build Coastguard Worker
743*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteV, WriteV, WriteV],
744*9880d681SAndroid Build Coastguard Worker             (instregex "LD4i(8|16|32)$")>;
745*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteV, WriteV, WriteV],
746*9880d681SAndroid Build Coastguard Worker             (instregex "LD4i(8|16|32)_POST")>;
747*9880d681SAndroid Build Coastguard Worker
748*9880d681SAndroid Build Coastguard Worker
749*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteVLDShuffle, WriteV, WriteV],
750*9880d681SAndroid Build Coastguard Worker             (instrs LD4i64)>;
751*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteVLDShuffle, WriteV],
752*9880d681SAndroid Build Coastguard Worker             (instrs LD4i64_POST)>;
753*9880d681SAndroid Build Coastguard Worker
754*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteV, WriteV, WriteV],
755*9880d681SAndroid Build Coastguard Worker             (instregex "LD4Rv(8b|4h|2s|16b|8h|4s)$")>;
756*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteV, WriteV, WriteV],
757*9880d681SAndroid Build Coastguard Worker             (instregex "LD4Rv(8b|4h|2s|16b|8h|4s)_POST")>;
758*9880d681SAndroid Build Coastguard Worker
759*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle, WriteV, WriteV],
760*9880d681SAndroid Build Coastguard Worker             (instrs LD4Rv1d,LD4Rv2d)>;
761*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle, WriteV, WriteV],
762*9880d681SAndroid Build Coastguard Worker             (instrs LD4Rv1d_POST,LD4Rv2d_POST)>;
763*9880d681SAndroid Build Coastguard Worker
764*9880d681SAndroid Build Coastguard Worker//---
765*9880d681SAndroid Build Coastguard Worker// 7.9.16 Store, element operations
766*9880d681SAndroid Build Coastguard Worker//---
767*9880d681SAndroid Build Coastguard Worker
768*9880d681SAndroid Build Coastguard Worker// Only the WriteAdr for writeback matches a def operands.
769*9880d681SAndroid Build Coastguard Worker// Subsequent WriteVLDs only consume resources.
770*9880d681SAndroid Build Coastguard Worker
771*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVST],
772*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
773*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVST],
774*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST")>;
775*9880d681SAndroid Build Coastguard Worker
776*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle],
777*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Twov(8b|4h|2s|1d)$")>;
778*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle],
779*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Twov(8b|4h|2s|1d)_POST")>;
780*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVST, WriteVST],
781*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Twov(16b|8h|4s|2d)$")>;
782*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVST, WriteVST],
783*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Twov(16b|8h|4s|2d)_POST")>;
784*9880d681SAndroid Build Coastguard Worker
785*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVST],
786*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Threev(8b|4h|2s|1d)$")>;
787*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVST],
788*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Threev(8b|4h|2s|1d)_POST")>;
789*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVST, WriteVST, WriteVST],
790*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Threev(16b|8h|4s|2d)$")>;
791*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVST, WriteVST, WriteVST],
792*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Threev(16b|8h|4s|2d)_POST")>;
793*9880d681SAndroid Build Coastguard Worker
794*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVSTShuffle],
795*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Fourv(8b|4h|2s|1d)$")>;
796*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle],
797*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Fourv(8b|4h|2s|1d)_POST")>;
798*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVST, WriteVST, WriteVST, WriteVST],
799*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Fourv(16b|8h|4s|2d)$")>;
800*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVST, WriteVST, WriteVST, WriteVST],
801*9880d681SAndroid Build Coastguard Worker             (instregex "ST1Fourv(16b|8h|4s|2d)_POST")>;
802*9880d681SAndroid Build Coastguard Worker
803*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle],           (instregex "ST1i(8|16|32)$")>;
804*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], (instregex "ST1i(8|16|32)_POST")>;
805*9880d681SAndroid Build Coastguard Worker
806*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle],           (instrs ST1i64)>;
807*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], (instrs ST1i64_POST)>;
808*9880d681SAndroid Build Coastguard Worker
809*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle],
810*9880d681SAndroid Build Coastguard Worker             (instregex "ST2Twov(8b|4h|2s)$")>;
811*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle],
812*9880d681SAndroid Build Coastguard Worker             (instregex "ST2Twov(8b|4h|2s)_POST")>;
813*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVSTShuffle],
814*9880d681SAndroid Build Coastguard Worker             (instregex "ST2Twov(16b|8h|4s|2d)$")>;
815*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle],
816*9880d681SAndroid Build Coastguard Worker             (instregex "ST2Twov(16b|8h|4s|2d)_POST")>;
817*9880d681SAndroid Build Coastguard Worker
818*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle],           (instregex "ST2i(8|16|32)$")>;
819*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], (instregex "ST2i(8|16|32)_POST")>;
820*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle],           (instrs ST2i64)>;
821*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], (instrs ST2i64_POST)>;
822*9880d681SAndroid Build Coastguard Worker
823*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVSTShuffle],
824*9880d681SAndroid Build Coastguard Worker             (instregex "ST3Threev(8b|4h|2s)$")>;
825*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle],
826*9880d681SAndroid Build Coastguard Worker             (instregex "ST3Threev(8b|4h|2s)_POST")>;
827*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVSTShuffle, WriteVSTShuffle],
828*9880d681SAndroid Build Coastguard Worker             (instregex "ST3Threev(16b|8h|4s|2d)$")>;
829*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle, WriteVSTShuffle],
830*9880d681SAndroid Build Coastguard Worker             (instregex "ST3Threev(16b|8h|4s|2d)_POST")>;
831*9880d681SAndroid Build Coastguard Worker
832*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle],           (instregex "ST3i(8|16|32)$")>;
833*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], (instregex "ST3i(8|16|32)_POST")>;
834*9880d681SAndroid Build Coastguard Worker
835*9880d681SAndroid Build Coastguard Workerdef :InstRW<[WriteVSTShuffle, WriteVSTShuffle],           (instrs ST3i64)>;
836*9880d681SAndroid Build Coastguard Workerdef :InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle], (instrs ST3i64_POST)>;
837*9880d681SAndroid Build Coastguard Worker
838*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTPairShuffle, WriteVSTPairShuffle],
839*9880d681SAndroid Build Coastguard Worker            (instregex "ST4Fourv(8b|4h|2s|1d)$")>;
840*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTPairShuffle, WriteVSTPairShuffle],
841*9880d681SAndroid Build Coastguard Worker            (instregex "ST4Fourv(8b|4h|2s|1d)_POST")>;
842*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTPairShuffle, WriteVSTPairShuffle,
843*9880d681SAndroid Build Coastguard Worker              WriteVSTPairShuffle, WriteVSTPairShuffle],
844*9880d681SAndroid Build Coastguard Worker             (instregex "ST4Fourv(16b|8h|4s|2d)$")>;
845*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTPairShuffle, WriteVSTPairShuffle,
846*9880d681SAndroid Build Coastguard Worker              WriteVSTPairShuffle, WriteVSTPairShuffle],
847*9880d681SAndroid Build Coastguard Worker             (instregex "ST4Fourv(16b|8h|4s|2d)_POST")>;
848*9880d681SAndroid Build Coastguard Worker
849*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTPairShuffle],           (instregex "ST4i(8|16|32)$")>;
850*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTPairShuffle], (instregex "ST4i(8|16|32)_POST")>;
851*9880d681SAndroid Build Coastguard Worker
852*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVSTShuffle],          (instrs ST4i64)>;
853*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle],(instrs ST4i64_POST)>;
854*9880d681SAndroid Build Coastguard Worker
855*9880d681SAndroid Build Coastguard Worker// Atomic operations are not supported.
856*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; }
857*9880d681SAndroid Build Coastguard Worker
858*9880d681SAndroid Build Coastguard Worker//---
859*9880d681SAndroid Build Coastguard Worker// Unused SchedRead types
860*9880d681SAndroid Build Coastguard Worker//---
861*9880d681SAndroid Build Coastguard Worker
862*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadI, 0>;
863*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadISReg, 0>;
864*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIEReg, 0>;
865*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIM, 0>;
866*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIMA, 0>;
867*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadID, 0>;
868*9880d681SAndroid Build Coastguard Worker
869*9880d681SAndroid Build Coastguard Worker} // SchedModel = CycloneModel
870