xref: /aosp_15_r20/external/llvm/lib/Target/AArch64/AArch64SchedVulcan.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//=- AArch64SchedVulcan.td - Vulcan Scheduling Defs ----------*- 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// 1. Introduction
10*9880d681SAndroid Build Coastguard Worker//
11*9880d681SAndroid Build Coastguard Worker// This file defines the machine model for Broadcom Vulcan to support
12*9880d681SAndroid Build Coastguard Worker// instruction scheduling and other instruction cost heuristics.
13*9880d681SAndroid Build Coastguard Worker//
14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
17*9880d681SAndroid Build Coastguard Worker// 2. Pipeline Description.
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdef VulcanModel : SchedMachineModel {
20*9880d681SAndroid Build Coastguard Worker  let IssueWidth            =   4; // 4 micro-ops dispatched at a time.
21*9880d681SAndroid Build Coastguard Worker  let MicroOpBufferSize     = 180; // 180 entries in micro-op re-order buffer.
22*9880d681SAndroid Build Coastguard Worker  let LoadLatency           =   4; // Optimistic load latency.
23*9880d681SAndroid Build Coastguard Worker  let MispredictPenalty     =  12; // Extra cycles for mispredicted branch.
24*9880d681SAndroid Build Coastguard Worker  // Determined via a mix of micro-arch details and experimentation.
25*9880d681SAndroid Build Coastguard Worker  let LoopMicroOpBufferSize =  32;
26*9880d681SAndroid Build Coastguard Worker  let PostRAScheduler       =   1; // Using PostRA sched.
27*9880d681SAndroid Build Coastguard Worker  let CompleteModel         =   1;
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker// Define the issue ports.
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker// Port 0: ALU, FP/SIMD.
33*9880d681SAndroid Build Coastguard Workerdef VulcanP0 : ProcResource<1>;
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker// Port 1: ALU, FP/SIMD, integer mul/div.
36*9880d681SAndroid Build Coastguard Workerdef VulcanP1 : ProcResource<1>;
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker// Port 2: ALU, Branch.
39*9880d681SAndroid Build Coastguard Workerdef VulcanP2 : ProcResource<1>;
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker// Port 3: Store data.
42*9880d681SAndroid Build Coastguard Workerdef VulcanP3 : ProcResource<1>;
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker// Port 4: Load/store.
45*9880d681SAndroid Build Coastguard Workerdef VulcanP4 : ProcResource<1>;
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker// Port 5: Load/store.
48*9880d681SAndroid Build Coastguard Workerdef VulcanP5 : ProcResource<1>;
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerlet SchedModel = VulcanModel in {
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker// Define groups for the functional units on each
53*9880d681SAndroid Build Coastguard Worker// issue port.  Each group created will be used
54*9880d681SAndroid Build Coastguard Worker// by a WriteRes later on.
55*9880d681SAndroid Build Coastguard Worker//
56*9880d681SAndroid Build Coastguard Worker// NOTE: Some groups only contain one member.  This
57*9880d681SAndroid Build Coastguard Worker// is a way to create names for the various functional
58*9880d681SAndroid Build Coastguard Worker// units that share a single issue port.  For example,
59*9880d681SAndroid Build Coastguard Worker// "VulcanI1" for ALU ops on port 1 and "VulcanF1" for
60*9880d681SAndroid Build Coastguard Worker// FP ops on port 1.
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker// Integer divide and multiply micro-ops only on port 1.
63*9880d681SAndroid Build Coastguard Workerdef VulcanI1 : ProcResGroup<[VulcanP1]>;
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker// Branch micro-ops only on port 2.
66*9880d681SAndroid Build Coastguard Workerdef VulcanI2 : ProcResGroup<[VulcanP2]>;
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker// ALU micro-ops on ports 0, 1, and 2.
69*9880d681SAndroid Build Coastguard Workerdef VulcanI012 : ProcResGroup<[VulcanP0, VulcanP1, VulcanP2]>;
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker// Crypto FP/SIMD micro-ops only on port 1.
72*9880d681SAndroid Build Coastguard Workerdef VulcanF1 : ProcResGroup<[VulcanP1]>;
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker// FP/SIMD micro-ops on ports 0 and 1.
75*9880d681SAndroid Build Coastguard Workerdef VulcanF01 : ProcResGroup<[VulcanP0, VulcanP1]>;
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker// Store data micro-ops only on port 3.
78*9880d681SAndroid Build Coastguard Workerdef VulcanSD : ProcResGroup<[VulcanP3]>;
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker// Load/store micro-ops on ports 4 and 5.
81*9880d681SAndroid Build Coastguard Workerdef VulcanLS01 : ProcResGroup<[VulcanP4, VulcanP5]>;
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker// 60 entry unified scheduler.
84*9880d681SAndroid Build Coastguard Workerdef VulcanAny : ProcResGroup<[VulcanP0, VulcanP1, VulcanP2,
85*9880d681SAndroid Build Coastguard Worker                              VulcanP3, VulcanP4, VulcanP5]> {
86*9880d681SAndroid Build Coastguard Worker  let BufferSize=60;
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker// Define commonly used write types for InstRW specializations.
90*9880d681SAndroid Build Coastguard Worker// All definitions follow the format: VulcanWrite_<NumCycles>Cyc_<Resources>.
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker// 3 cycles on I1.
93*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_3Cyc_I1 : SchedWriteRes<[VulcanI1]> { let Latency = 3; }
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker// 4 cycles on I1.
96*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_4Cyc_I1 : SchedWriteRes<[VulcanI1]> { let Latency = 4; }
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker// 1 cycle on I0, I1, or I2.
99*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_1Cyc_I012 : SchedWriteRes<[VulcanI012]> { let Latency = 1; }
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker// 5 cycles on F1.
102*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_5Cyc_F1 : SchedWriteRes<[VulcanF1]> { let Latency = 5; }
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker// 7 cycles on F1.
105*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_7Cyc_F1 : SchedWriteRes<[VulcanF1]> { let Latency = 7; }
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker// 4 cycles on F0 or F1.
108*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_4Cyc_F01 : SchedWriteRes<[VulcanF01]> { let Latency = 4; }
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker// 5 cycles on F0 or F1.
111*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_5Cyc_F01 : SchedWriteRes<[VulcanF01]> { let Latency = 5; }
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker// 6 cycles on F0 or F1.
114*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_6Cyc_F01 : SchedWriteRes<[VulcanF01]> { let Latency = 6; }
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker// 7 cycles on F0 or F1.
117*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_7Cyc_F01 : SchedWriteRes<[VulcanF01]> { let Latency = 7; }
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker// 8 cycles on F0 or F1.
120*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_8Cyc_F01 : SchedWriteRes<[VulcanF01]> { let Latency = 8; }
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker// 16 cycles on F0 or F1.
123*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_16Cyc_F01 : SchedWriteRes<[VulcanF01]> {
124*9880d681SAndroid Build Coastguard Worker  let Latency = 16;
125*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [8];
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker// 23 cycles on F0 or F1.
129*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_23Cyc_F01 : SchedWriteRes<[VulcanF01]> {
130*9880d681SAndroid Build Coastguard Worker  let Latency = 23;
131*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [11];
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker// 1 cycles on LS0 or LS1.
135*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_1Cyc_LS01 : SchedWriteRes<[VulcanLS01]> { let Latency = 1; }
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker// 4 cycles on LS0 or LS1.
138*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_4Cyc_LS01 : SchedWriteRes<[VulcanLS01]> { let Latency = 4; }
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker// 5 cycles on LS0 or LS1.
141*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_5Cyc_LS01 : SchedWriteRes<[VulcanLS01]> { let Latency = 5; }
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker// 6 cycles on LS0 or LS1.
144*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_6Cyc_LS01 : SchedWriteRes<[VulcanLS01]> { let Latency = 6; }
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker// 5 cycles on LS0 or LS1 and I0, I1, or I2.
147*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_5Cyc_LS01_I012 : SchedWriteRes<[VulcanLS01, VulcanI012]> {
148*9880d681SAndroid Build Coastguard Worker  let Latency = 5;
149*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 2;
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker// 5 cycles on LS0 or LS1 and 2 of I0, I1, or I2.
153*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_6Cyc_LS01_I012_I012 :
154*9880d681SAndroid Build Coastguard Worker  SchedWriteRes<[VulcanLS01, VulcanI012, VulcanI012]> {
155*9880d681SAndroid Build Coastguard Worker  let Latency = 6;
156*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 3;
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker// 1 cycles on LS0 or LS1 and F0 or F1.
160*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_1Cyc_LS01_F01 : SchedWriteRes<[VulcanLS01, VulcanF01]> {
161*9880d681SAndroid Build Coastguard Worker  let Latency = 1;
162*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 2;
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker// 5 cycles on LS0 or LS1 and F0 or F1.
166*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_5Cyc_LS01_F01 : SchedWriteRes<[VulcanLS01, VulcanF01]> {
167*9880d681SAndroid Build Coastguard Worker  let Latency = 5;
168*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 2;
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker// 6 cycles on LS0 or LS1 and F0 or F1.
172*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_6Cyc_LS01_F01 : SchedWriteRes<[VulcanLS01, VulcanF01]> {
173*9880d681SAndroid Build Coastguard Worker  let Latency = 6;
174*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 2;
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker// 7 cycles on LS0 or LS1 and F0 or F1.
178*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_7Cyc_LS01_F01 : SchedWriteRes<[VulcanLS01, VulcanF01]> {
179*9880d681SAndroid Build Coastguard Worker  let Latency = 7;
180*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 2;
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker// 8 cycles on LS0 or LS1 and F0 or F1.
184*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_8Cyc_LS01_F01 : SchedWriteRes<[VulcanLS01, VulcanF01]> {
185*9880d681SAndroid Build Coastguard Worker  let Latency = 8;
186*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 2;
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker// Define commonly used read types.
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker// No forwarding is provided for these types.
192*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadI,       0>;
193*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadISReg,   0>;
194*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIEReg,   0>;
195*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIM,      0>;
196*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIMA,     0>;
197*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadID,      0>;
198*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadExtrHi,  0>;
199*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadAdrBase, 0>;
200*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadVLD,     0>;
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
206*9880d681SAndroid Build Coastguard Worker// 3. Instruction Tables.
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Workerlet SchedModel = VulcanModel in {
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker//---
211*9880d681SAndroid Build Coastguard Worker// 3.1 Branch Instructions
212*9880d681SAndroid Build Coastguard Worker//---
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker// Branch, immed
215*9880d681SAndroid Build Coastguard Worker// Branch and link, immed
216*9880d681SAndroid Build Coastguard Worker// Compare and branch
217*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBr,      [VulcanI2]> { let Latency = 1; }
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSys,     []> { let Latency = 1; }
220*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBarrier, []> { let Latency = 1; }
221*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteHint,    []> { let Latency = 1; }
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAtomic,  []> { let Unsupported = 1; }
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker// Branch, register
226*9880d681SAndroid Build Coastguard Worker// Branch and link, register != LR
227*9880d681SAndroid Build Coastguard Worker// Branch and link, register = LR
228*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBrReg,   [VulcanI2]> { let Latency = 1; }
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker//---
231*9880d681SAndroid Build Coastguard Worker// 3.2 Arithmetic and Logical Instructions
232*9880d681SAndroid Build Coastguard Worker// 3.3 Move and Shift Instructions
233*9880d681SAndroid Build Coastguard Worker//---
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker// ALU, basic
236*9880d681SAndroid Build Coastguard Worker// Conditional compare
237*9880d681SAndroid Build Coastguard Worker// Conditional select
238*9880d681SAndroid Build Coastguard Worker// Address generation
239*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteI,       [VulcanI012]> { let Latency = 1; }
240*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteI], (instrs COPY)>;
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker// ALU, extend and/or shift
243*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteISReg,   [VulcanI012]> {
244*9880d681SAndroid Build Coastguard Worker  let Latency = 2;
245*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2];
246*9880d681SAndroid Build Coastguard Worker}
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIEReg,   [VulcanI012]> {
249*9880d681SAndroid Build Coastguard Worker  let Latency = 2;
250*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2];
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker// Move immed
254*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteImm,     [VulcanI012]> { let Latency = 1; }
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Worker// Variable shift
257*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIS,      [VulcanI012]> { let Latency = 1; }
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker//---
260*9880d681SAndroid Build Coastguard Worker// 3.4 Divide and Multiply Instructions
261*9880d681SAndroid Build Coastguard Worker//---
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker// Divide, W-form
264*9880d681SAndroid Build Coastguard Worker// Latency range of 13-23.  Take the average.
265*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID32,    [VulcanI1]> {
266*9880d681SAndroid Build Coastguard Worker  let Latency = 18;
267*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [18];
268*9880d681SAndroid Build Coastguard Worker}
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker// Divide, X-form
271*9880d681SAndroid Build Coastguard Worker// Latency range of 13-39.  Take the average.
272*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID64,    [VulcanI1]> {
273*9880d681SAndroid Build Coastguard Worker  let Latency = 26;
274*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [26];
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker// Multiply accumulate, W-form
278*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM32,    [VulcanI012]> { let Latency = 5; }
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Worker// Multiply accumulate, X-form
281*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM64,    [VulcanI012]> { let Latency = 5; }
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker// Bitfield extract, two reg
284*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteExtr,    [VulcanI012]> { let Latency = 1; }
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker// Bitfield move, basic
287*9880d681SAndroid Build Coastguard Worker// Bitfield move, insert
288*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteIS.
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker// Count leading
291*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_3Cyc_I1], (instregex "^CLS(W|X)r$",
292*9880d681SAndroid Build Coastguard Worker                                               "^CLZ(W|X)r$")>;
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Worker// Reverse bits/bytes
295*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteI.
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Worker//---
298*9880d681SAndroid Build Coastguard Worker// 3.6 Load Instructions
299*9880d681SAndroid Build Coastguard Worker// 3.10 FP Load Instructions
300*9880d681SAndroid Build Coastguard Worker//---
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker// Load register, literal
303*9880d681SAndroid Build Coastguard Worker// Load register, unscaled immed
304*9880d681SAndroid Build Coastguard Worker// Load register, immed unprivileged
305*9880d681SAndroid Build Coastguard Worker// Load register, unsigned immed
306*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLD,      [VulcanLS01]> { let Latency = 4; }
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Worker// Load register, immed post-index
309*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteLD, WriteI.
310*9880d681SAndroid Build Coastguard Worker// Load register, immed pre-index
311*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteLD, WriteAdr.
312*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAdr,     [VulcanI012]> { let Latency = 1; }
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker// Load register offset, basic
315*9880d681SAndroid Build Coastguard Worker// Load register, register offset, scale by 4/8
316*9880d681SAndroid Build Coastguard Worker// Load register, register offset, scale by 2
317*9880d681SAndroid Build Coastguard Worker// Load register offset, extend
318*9880d681SAndroid Build Coastguard Worker// Load register, register offset, extend, scale by 4/8
319*9880d681SAndroid Build Coastguard Worker// Load register, register offset, extend, scale by 2
320*9880d681SAndroid Build Coastguard Workerdef VulcanWriteLDIdx : SchedWriteVariant<[
321*9880d681SAndroid Build Coastguard Worker  SchedVar<ScaledIdxPred, [VulcanWrite_6Cyc_LS01_I012_I012]>,
322*9880d681SAndroid Build Coastguard Worker  SchedVar<NoSchedPred,   [VulcanWrite_5Cyc_LS01_I012]>]>;
323*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<WriteLDIdx, VulcanWriteLDIdx>;
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Workerdef VulcanReadAdrBase : SchedReadVariant<[
326*9880d681SAndroid Build Coastguard Worker  SchedVar<ScaledIdxPred, [ReadDefault]>,
327*9880d681SAndroid Build Coastguard Worker  SchedVar<NoSchedPred,   [ReadDefault]>]>;
328*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<ReadAdrBase, VulcanReadAdrBase>;
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker// Load pair, immed offset, normal
331*9880d681SAndroid Build Coastguard Worker// Load pair, immed offset, signed words, base != SP
332*9880d681SAndroid Build Coastguard Worker// Load pair, immed offset signed words, base = SP
333*9880d681SAndroid Build Coastguard Worker// LDP only breaks into *one* LS micro-op.  Thus
334*9880d681SAndroid Build Coastguard Worker// the resources are handling by WriteLD.
335*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLDHi,    []> {
336*9880d681SAndroid Build Coastguard Worker  let Latency = 5;
337*9880d681SAndroid Build Coastguard Worker}
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Worker// Load pair, immed pre-index, normal
340*9880d681SAndroid Build Coastguard Worker// Load pair, immed pre-index, signed words
341*9880d681SAndroid Build Coastguard Worker// Load pair, immed post-index, normal
342*9880d681SAndroid Build Coastguard Worker// Load pair, immed post-index, signed words
343*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteLD, WriteLDHi, WriteAdr.
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker//--
346*9880d681SAndroid Build Coastguard Worker// 3.7 Store Instructions
347*9880d681SAndroid Build Coastguard Worker// 3.11 FP Store Instructions
348*9880d681SAndroid Build Coastguard Worker//--
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Worker// Store register, unscaled immed
351*9880d681SAndroid Build Coastguard Worker// Store register, immed unprivileged
352*9880d681SAndroid Build Coastguard Worker// Store register, unsigned immed
353*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteST,      [VulcanLS01, VulcanSD]> {
354*9880d681SAndroid Build Coastguard Worker  let Latency = 1;
355*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 2;
356*9880d681SAndroid Build Coastguard Worker}
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker// Store register, immed post-index
359*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteAdr, WriteST, ReadAdrBase
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker// Store register, immed pre-index
362*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteAdr, WriteST
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Worker// Store register, register offset, basic
365*9880d681SAndroid Build Coastguard Worker// Store register, register offset, scaled by 4/8
366*9880d681SAndroid Build Coastguard Worker// Store register, register offset, scaled by 2
367*9880d681SAndroid Build Coastguard Worker// Store register, register offset, extend
368*9880d681SAndroid Build Coastguard Worker// Store register, register offset, extend, scale by 4/8
369*9880d681SAndroid Build Coastguard Worker// Store register, register offset, extend, scale by 1
370*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSTIdx, [VulcanLS01, VulcanSD, VulcanI012]> {
371*9880d681SAndroid Build Coastguard Worker  let Latency = 1;
372*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 3;
373*9880d681SAndroid Build Coastguard Worker}
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Worker// Store pair, immed offset, W-form
376*9880d681SAndroid Build Coastguard Worker// Store pair, immed offset, X-form
377*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSTP,     [VulcanLS01, VulcanSD]> {
378*9880d681SAndroid Build Coastguard Worker  let Latency = 1;
379*9880d681SAndroid Build Coastguard Worker  let NumMicroOps = 2;
380*9880d681SAndroid Build Coastguard Worker}
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Worker// Store pair, immed post-index, W-form
383*9880d681SAndroid Build Coastguard Worker// Store pair, immed post-index, X-form
384*9880d681SAndroid Build Coastguard Worker// Store pair, immed pre-index, W-form
385*9880d681SAndroid Build Coastguard Worker// Store pair, immed pre-index, X-form
386*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteAdr, WriteSTP.
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Worker//---
389*9880d681SAndroid Build Coastguard Worker// 3.8 FP Data Processing Instructions
390*9880d681SAndroid Build Coastguard Worker//---
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker// FP absolute value
393*9880d681SAndroid Build Coastguard Worker// FP min/max
394*9880d681SAndroid Build Coastguard Worker// FP negate
395*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteF,       [VulcanF01]> { let Latency = 5; }
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Worker// FP arithmetic
398*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FADD", "^FSUB")>;
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard Worker// FP compare
401*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCmp,    [VulcanF01]> { let Latency = 5; }
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Worker// FP divide, S-form
404*9880d681SAndroid Build Coastguard Worker// FP square root, S-form
405*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFDiv,    [VulcanF01]> {
406*9880d681SAndroid Build Coastguard Worker  let Latency = 16;
407*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [8];
408*9880d681SAndroid Build Coastguard Worker}
409*9880d681SAndroid Build Coastguard Worker
410*9880d681SAndroid Build Coastguard Worker// FP divide, D-form
411*9880d681SAndroid Build Coastguard Worker// FP square root, D-form
412*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_23Cyc_F01], (instrs FDIVDrr, FSQRTDr)>;
413*9880d681SAndroid Build Coastguard Worker
414*9880d681SAndroid Build Coastguard Worker// FP multiply
415*9880d681SAndroid Build Coastguard Worker// FP multiply accumulate
416*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFMul, [VulcanF01]> { let Latency = 6; }
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Worker// FP round to integral
419*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_F01],
420*9880d681SAndroid Build Coastguard Worker            (instregex "^FRINT(A|I|M|N|P|X|Z)(Sr|Dr)")>;
421*9880d681SAndroid Build Coastguard Worker
422*9880d681SAndroid Build Coastguard Worker// FP select
423*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_F01], (instregex "^FCSEL")>;
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Worker//---
426*9880d681SAndroid Build Coastguard Worker// 3.9 FP Miscellaneous Instructions
427*9880d681SAndroid Build Coastguard Worker//---
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Worker// FP convert, from vec to vec reg
430*9880d681SAndroid Build Coastguard Worker// FP convert, from gen to vec reg
431*9880d681SAndroid Build Coastguard Worker// FP convert, from vec to gen reg
432*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCvt, [VulcanF01]> { let Latency = 7; }
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Worker// FP move, immed
435*9880d681SAndroid Build Coastguard Worker// FP move, register
436*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFImm, [VulcanF01]> { let Latency = 4; }
437*9880d681SAndroid Build Coastguard Worker
438*9880d681SAndroid Build Coastguard Worker// FP transfer, from gen to vec reg
439*9880d681SAndroid Build Coastguard Worker// FP transfer, from vec to gen reg
440*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCopy, [VulcanF01]> { let Latency = 4; }
441*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instrs FMOVXDHighr, FMOVDXHighr)>;
442*9880d681SAndroid Build Coastguard Worker
443*9880d681SAndroid Build Coastguard Worker//---
444*9880d681SAndroid Build Coastguard Worker// 3.12 ASIMD Integer Instructions
445*9880d681SAndroid Build Coastguard Worker//---
446*9880d681SAndroid Build Coastguard Worker
447*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff, D-form
448*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff, Q-form
449*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff accum, D-form
450*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff accum, Q-form
451*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff accum long
452*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff long
453*9880d681SAndroid Build Coastguard Worker// ASIMD arith, basic
454*9880d681SAndroid Build Coastguard Worker// ASIMD arith, complex
455*9880d681SAndroid Build Coastguard Worker// ASIMD compare
456*9880d681SAndroid Build Coastguard Worker// ASIMD logical (AND, BIC, EOR)
457*9880d681SAndroid Build Coastguard Worker// ASIMD max/min, basic
458*9880d681SAndroid Build Coastguard Worker// ASIMD max/min, reduce, 4H/4S
459*9880d681SAndroid Build Coastguard Worker// ASIMD max/min, reduce, 8B/8H
460*9880d681SAndroid Build Coastguard Worker// ASIMD max/min, reduce, 16B
461*9880d681SAndroid Build Coastguard Worker// ASIMD multiply, D-form
462*9880d681SAndroid Build Coastguard Worker// ASIMD multiply, Q-form
463*9880d681SAndroid Build Coastguard Worker// ASIMD multiply accumulate long
464*9880d681SAndroid Build Coastguard Worker// ASIMD multiply accumulate saturating long
465*9880d681SAndroid Build Coastguard Worker// ASIMD multiply long
466*9880d681SAndroid Build Coastguard Worker// ASIMD pairwise add and accumulate
467*9880d681SAndroid Build Coastguard Worker// ASIMD shift accumulate
468*9880d681SAndroid Build Coastguard Worker// ASIMD shift by immed, basic
469*9880d681SAndroid Build Coastguard Worker// ASIMD shift by immed and insert, basic, D-form
470*9880d681SAndroid Build Coastguard Worker// ASIMD shift by immed and insert, basic, Q-form
471*9880d681SAndroid Build Coastguard Worker// ASIMD shift by immed, complex
472*9880d681SAndroid Build Coastguard Worker// ASIMD shift by register, basic, D-form
473*9880d681SAndroid Build Coastguard Worker// ASIMD shift by register, basic, Q-form
474*9880d681SAndroid Build Coastguard Worker// ASIMD shift by register, complex, D-form
475*9880d681SAndroid Build Coastguard Worker// ASIMD shift by register, complex, Q-form
476*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteV, [VulcanF01]> { let Latency = 7; }
477*9880d681SAndroid Build Coastguard Worker
478*9880d681SAndroid Build Coastguard Worker// ASIMD arith, reduce, 4H/4S
479*9880d681SAndroid Build Coastguard Worker// ASIMD arith, reduce, 8B/8H
480*9880d681SAndroid Build Coastguard Worker// ASIMD arith, reduce, 16B
481*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01],
482*9880d681SAndroid Build Coastguard Worker            (instregex "^ADDVv", "^SADDLVv", "^UADDLVv")>;
483*9880d681SAndroid Build Coastguard Worker
484*9880d681SAndroid Build Coastguard Worker// ASIMD logical (MOV, MVN, ORN, ORR)
485*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^ORRv", "^ORNv", "^NOTv")>;
486*9880d681SAndroid Build Coastguard Worker
487*9880d681SAndroid Build Coastguard Worker// ASIMD polynomial (8x8) multiply long
488*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instrs PMULLv8i8, PMULLv16i8)>;
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Worker//---
491*9880d681SAndroid Build Coastguard Worker// 3.13 ASIMD Floating-point Instructions
492*9880d681SAndroid Build Coastguard Worker//---
493*9880d681SAndroid Build Coastguard Worker
494*9880d681SAndroid Build Coastguard Worker// ASIMD FP absolute value
495*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FABSv")>;
496*9880d681SAndroid Build Coastguard Worker
497*9880d681SAndroid Build Coastguard Worker// ASIMD FP arith, normal, D-form
498*9880d681SAndroid Build Coastguard Worker// ASIMD FP arith, normal, Q-form
499*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FABDv", "^FADDv", "^FSUBv")>;
500*9880d681SAndroid Build Coastguard Worker
501*9880d681SAndroid Build Coastguard Worker// ASIMD FP arith,pairwise, D-form
502*9880d681SAndroid Build Coastguard Worker// ASIMD FP arith, pairwise, Q-form
503*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FADDPv")>;
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard Worker// ASIMD FP compare, D-form
506*9880d681SAndroid Build Coastguard Worker// ASIMD FP compare, Q-form
507*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FACGEv", "^FACGTv")>;
508*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FCMEQv", "^FCMGEv",
509*9880d681SAndroid Build Coastguard Worker                                                "^FCMGTv", "^FCMLEv",
510*9880d681SAndroid Build Coastguard Worker                                                "^FCMLTv")>;
511*9880d681SAndroid Build Coastguard Worker
512*9880d681SAndroid Build Coastguard Worker// ASIMD FP convert, long
513*9880d681SAndroid Build Coastguard Worker// ASIMD FP convert, narrow
514*9880d681SAndroid Build Coastguard Worker// ASIMD FP convert, other, D-form
515*9880d681SAndroid Build Coastguard Worker// ASIMD FP convert, other, Q-form
516*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteV.
517*9880d681SAndroid Build Coastguard Worker
518*9880d681SAndroid Build Coastguard Worker// ASIMD FP divide, D-form, F32
519*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_16Cyc_F01], (instrs FDIVv2f32)>;
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Worker// ASIMD FP divide, Q-form, F32
522*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_16Cyc_F01], (instrs FDIVv4f32)>;
523*9880d681SAndroid Build Coastguard Worker
524*9880d681SAndroid Build Coastguard Worker// ASIMD FP divide, Q-form, F64
525*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_23Cyc_F01], (instrs FDIVv2f64)>;
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Worker// ASIMD FP max/min, normal, D-form
528*9880d681SAndroid Build Coastguard Worker// ASIMD FP max/min, normal, Q-form
529*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FMAXv", "^FMAXNMv",
530*9880d681SAndroid Build Coastguard Worker                                                "^FMINv", "^FMINNMv")>;
531*9880d681SAndroid Build Coastguard Worker
532*9880d681SAndroid Build Coastguard Worker// ASIMD FP max/min, pairwise, D-form
533*9880d681SAndroid Build Coastguard Worker// ASIMD FP max/min, pairwise, Q-form
534*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FMAXPv", "^FMAXNMPv",
535*9880d681SAndroid Build Coastguard Worker                                                "^FMINPv", "^FMINNMPv")>;
536*9880d681SAndroid Build Coastguard Worker
537*9880d681SAndroid Build Coastguard Worker// ASIMD FP max/min, reduce
538*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FMAXVv", "^FMAXNMVv",
539*9880d681SAndroid Build Coastguard Worker                                                "^FMINVv", "^FMINNMVv")>;
540*9880d681SAndroid Build Coastguard Worker
541*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply, D-form, FZ
542*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply, D-form, no FZ
543*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply, Q-form, FZ
544*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply, Q-form, no FZ
545*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FMULv", "^FMULXv")>;
546*9880d681SAndroid Build Coastguard Worker
547*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply accumulate, Dform, FZ
548*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply accumulate, Dform, no FZ
549*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply accumulate, Qform, FZ
550*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply accumulate, Qform, no FZ
551*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FMLAv", "^FMLSv")>;
552*9880d681SAndroid Build Coastguard Worker
553*9880d681SAndroid Build Coastguard Worker// ASIMD FP negate
554*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FNEGv")>;
555*9880d681SAndroid Build Coastguard Worker
556*9880d681SAndroid Build Coastguard Worker// ASIMD FP round, D-form
557*9880d681SAndroid Build Coastguard Worker// ASIMD FP round, Q-form
558*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteV.
559*9880d681SAndroid Build Coastguard Worker
560*9880d681SAndroid Build Coastguard Worker//--
561*9880d681SAndroid Build Coastguard Worker// 3.14 ASIMD Miscellaneous Instructions
562*9880d681SAndroid Build Coastguard Worker//--
563*9880d681SAndroid Build Coastguard Worker
564*9880d681SAndroid Build Coastguard Worker// ASIMD bit reverse
565*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^RBITv")>;
566*9880d681SAndroid Build Coastguard Worker
567*9880d681SAndroid Build Coastguard Worker// ASIMD bitwise insert, D-form
568*9880d681SAndroid Build Coastguard Worker// ASIMD bitwise insert, Q-form
569*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^BIFv", "^BITv", "^BSLv")>;
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Worker// ASIMD count, D-form
572*9880d681SAndroid Build Coastguard Worker// ASIMD count, Q-form
573*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^CLSv", "^CLZv", "^CNTv")>;
574*9880d681SAndroid Build Coastguard Worker
575*9880d681SAndroid Build Coastguard Worker// ASIMD duplicate, gen reg
576*9880d681SAndroid Build Coastguard Worker// ASIMD duplicate, element
577*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^DUPv")>;
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Worker// ASIMD extract
580*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^EXTv")>;
581*9880d681SAndroid Build Coastguard Worker
582*9880d681SAndroid Build Coastguard Worker// ASIMD extract narrow
583*9880d681SAndroid Build Coastguard Worker// ASIMD extract narrow, saturating
584*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteV.
585*9880d681SAndroid Build Coastguard Worker
586*9880d681SAndroid Build Coastguard Worker// ASIMD insert, element to element
587*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^INSv")>;
588*9880d681SAndroid Build Coastguard Worker
589*9880d681SAndroid Build Coastguard Worker// ASIMD move, integer immed
590*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^MOVIv", "^MOVIDv")>;
591*9880d681SAndroid Build Coastguard Worker
592*9880d681SAndroid Build Coastguard Worker// ASIMD move, FP immed
593*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FMOVv")>;
594*9880d681SAndroid Build Coastguard Worker
595*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal estimate, D-form
596*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal estimate, Q-form
597*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01],
598*9880d681SAndroid Build Coastguard Worker            (instregex "^FRECPEv", "^FRECPXv", "^URECPEv",
599*9880d681SAndroid Build Coastguard Worker                                   "^FRSQRTEv", "^URSQRTEv")>;
600*9880d681SAndroid Build Coastguard Worker
601*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal step, D-form, FZ
602*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal step, D-form, no FZ
603*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal step, Q-form, FZ
604*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal step, Q-form, no FZ
605*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FRECPSv", "^FRSQRTSv")>;
606*9880d681SAndroid Build Coastguard Worker
607*9880d681SAndroid Build Coastguard Worker// ASIMD reverse
608*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01],
609*9880d681SAndroid Build Coastguard Worker            (instregex "^REV16v", "^REV32v", "^REV64v")>;
610*9880d681SAndroid Build Coastguard Worker
611*9880d681SAndroid Build Coastguard Worker// ASIMD table lookup, D-form
612*9880d681SAndroid Build Coastguard Worker// ASIMD table lookup, Q-form
613*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_8Cyc_F01], (instregex "^TBLv", "^TBXv")>;
614*9880d681SAndroid Build Coastguard Worker
615*9880d681SAndroid Build Coastguard Worker// ASIMD transfer, element to word or word
616*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^UMOVv")>;
617*9880d681SAndroid Build Coastguard Worker
618*9880d681SAndroid Build Coastguard Worker// ASIMD transfer, element to gen reg
619*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^SMOVv", "^UMOVv")>;
620*9880d681SAndroid Build Coastguard Worker
621*9880d681SAndroid Build Coastguard Worker// ASIMD transfer gen reg to element
622*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^INSv")>;
623*9880d681SAndroid Build Coastguard Worker
624*9880d681SAndroid Build Coastguard Worker// ASIMD transpose
625*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^TRN1v", "^TRN2v",
626*9880d681SAndroid Build Coastguard Worker                                                "^UZP1v", "^UZP2v")>;
627*9880d681SAndroid Build Coastguard Worker
628*9880d681SAndroid Build Coastguard Worker// ASIMD unzip/zip
629*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^ZIP1v", "^ZIP2v")>;
630*9880d681SAndroid Build Coastguard Worker
631*9880d681SAndroid Build Coastguard Worker//--
632*9880d681SAndroid Build Coastguard Worker// 3.15 ASIMD Load Instructions
633*9880d681SAndroid Build Coastguard Worker//--
634*9880d681SAndroid Build Coastguard Worker
635*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 1 reg, D-form
636*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 1 reg, Q-form
637*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_LS01],
638*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
639*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_LS01, WriteAdr],
640*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
641*9880d681SAndroid Build Coastguard Worker
642*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 2 reg, D-form
643*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 2 reg, Q-form
644*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_LS01],
645*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
646*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_LS01, WriteAdr],
647*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
648*9880d681SAndroid Build Coastguard Worker
649*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 3 reg, D-form
650*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 3 reg, Q-form
651*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01],
652*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
653*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01, WriteAdr],
654*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
655*9880d681SAndroid Build Coastguard Worker
656*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 4 reg, D-form
657*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 4 reg, Q-form
658*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01],
659*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
660*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01, WriteAdr],
661*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
662*9880d681SAndroid Build Coastguard Worker
663*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, one lane, B/H/S
664*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, one lane, D
665*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01], (instregex "^LD1i(8|16|32|64)$")>;
666*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01, WriteAdr],
667*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1i(8|16|32|64)_POST$")>;
668*9880d681SAndroid Build Coastguard Worker
669*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, all lanes, D-form, B/H/S
670*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, all lanes, D-form, D
671*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, all lanes, Q-form
672*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01],
673*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
674*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01, WriteAdr],
675*9880d681SAndroid Build Coastguard Worker            (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
676*9880d681SAndroid Build Coastguard Worker
677*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, multiple, D-form, B/H/S
678*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, multiple, Q-form, D
679*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01],
680*9880d681SAndroid Build Coastguard Worker            (instregex "^LD2Twov(8b|4h|2s|16b|8h|4s|2d)$")>;
681*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01, WriteAdr],
682*9880d681SAndroid Build Coastguard Worker            (instregex "^LD2Twov(8b|4h|2s|16b|8h|4s|2d)_POST$")>;
683*9880d681SAndroid Build Coastguard Worker
684*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, one lane, B/H
685*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, one lane, S
686*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, one lane, D
687*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01], (instregex "^LD2i(8|16|32|64)$")>;
688*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01, WriteAdr],
689*9880d681SAndroid Build Coastguard Worker            (instregex "^LD2i(8|16|32|64)_POST$")>;
690*9880d681SAndroid Build Coastguard Worker
691*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, all lanes, D-form, B/H/S
692*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, all lanes, D-form, D
693*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, all lanes, Q-form
694*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01],
695*9880d681SAndroid Build Coastguard Worker            (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
696*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01, WriteAdr],
697*9880d681SAndroid Build Coastguard Worker            (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
698*9880d681SAndroid Build Coastguard Worker
699*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, multiple, D-form, B/H/S
700*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, multiple, Q-form, B/H/S
701*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, multiple, Q-form, D
702*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_8Cyc_LS01_F01],
703*9880d681SAndroid Build Coastguard Worker            (instregex "^LD3Threev(8b|4h|2s|16b|8h|4s|2d)$")>;
704*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_8Cyc_LS01_F01, WriteAdr],
705*9880d681SAndroid Build Coastguard Worker            (instregex "^LD3Threev(8b|4h|2s|16b|8h|4s|2d)_POST$")>;
706*9880d681SAndroid Build Coastguard Worker
707*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, one lone, B/H
708*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, one lane, S
709*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, one lane, D
710*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_LS01_F01], (instregex "^LD3i(8|16|32|64)$")>;
711*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_LS01_F01, WriteAdr],
712*9880d681SAndroid Build Coastguard Worker            (instregex "^LD3i(8|16|32|64)_POST$")>;
713*9880d681SAndroid Build Coastguard Worker
714*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, all lanes, D-form, B/H/S
715*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, all lanes, D-form, D
716*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, all lanes, Q-form, B/H/S
717*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, all lanes, Q-form, D
718*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_LS01_F01],
719*9880d681SAndroid Build Coastguard Worker            (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
720*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_LS01_F01, WriteAdr],
721*9880d681SAndroid Build Coastguard Worker            (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
722*9880d681SAndroid Build Coastguard Worker
723*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, multiple, D-form, B/H/S
724*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, multiple, Q-form, B/H/S
725*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, multiple, Q-form, D
726*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_8Cyc_LS01_F01],
727*9880d681SAndroid Build Coastguard Worker            (instregex "^LD4Fourv(8b|4h|2s|16b|8h|4s|2d)$")>;
728*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_8Cyc_LS01_F01, WriteAdr],
729*9880d681SAndroid Build Coastguard Worker            (instregex "^LD4Fourv(8b|4h|2s|16b|8h|4s|2d)_POST$")>;
730*9880d681SAndroid Build Coastguard Worker
731*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, one lane, B/H
732*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, one lane, S
733*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, one lane, D
734*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01_F01], (instregex "^LD4i(8|16|32|64)$")>;
735*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01_F01, WriteAdr],
736*9880d681SAndroid Build Coastguard Worker            (instregex "^LD4i(8|16|32|64)_POST$")>;
737*9880d681SAndroid Build Coastguard Worker
738*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, all lanes, D-form, B/H/S
739*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, all lanes, D-form, D
740*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, all lanes, Q-form, B/H/S
741*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, all lanes, Q-form, D
742*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01_F01],
743*9880d681SAndroid Build Coastguard Worker            (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
744*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01_F01, WriteAdr],
745*9880d681SAndroid Build Coastguard Worker            (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
746*9880d681SAndroid Build Coastguard Worker
747*9880d681SAndroid Build Coastguard Worker//--
748*9880d681SAndroid Build Coastguard Worker// 3.16 ASIMD Store Instructions
749*9880d681SAndroid Build Coastguard Worker//--
750*9880d681SAndroid Build Coastguard Worker
751*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 1 reg, D-form
752*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 1 reg, Q-form
753*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01],
754*9880d681SAndroid Build Coastguard Worker            (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
755*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01, WriteAdr],
756*9880d681SAndroid Build Coastguard Worker            (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
757*9880d681SAndroid Build Coastguard Worker
758*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 2 reg, D-form
759*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 2 reg, Q-form
760*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01],
761*9880d681SAndroid Build Coastguard Worker            (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
762*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01, WriteAdr],
763*9880d681SAndroid Build Coastguard Worker            (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
764*9880d681SAndroid Build Coastguard Worker
765*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 3 reg, D-form
766*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 3 reg, Q-form
767*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01],
768*9880d681SAndroid Build Coastguard Worker            (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
769*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01, WriteAdr],
770*9880d681SAndroid Build Coastguard Worker            (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
771*9880d681SAndroid Build Coastguard Worker
772*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 4 reg, D-form
773*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 4 reg, Q-form
774*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01],
775*9880d681SAndroid Build Coastguard Worker            (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
776*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01, WriteAdr],
777*9880d681SAndroid Build Coastguard Worker            (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
778*9880d681SAndroid Build Coastguard Worker
779*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, one lane, B/H/S
780*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, one lane, D
781*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01],
782*9880d681SAndroid Build Coastguard Worker            (instregex "^ST1i(8|16|32|64)$")>;
783*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr],
784*9880d681SAndroid Build Coastguard Worker            (instregex "^ST1i(8|16|32|64)_POST$")>;
785*9880d681SAndroid Build Coastguard Worker
786*9880d681SAndroid Build Coastguard Worker// ASIMD store, 2 element, multiple, D-form, B/H/S
787*9880d681SAndroid Build Coastguard Worker// ASIMD store, 2 element, multiple, Q-form, B/H/S
788*9880d681SAndroid Build Coastguard Worker// ASIMD store, 2 element, multiple, Q-form, D
789*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01],
790*9880d681SAndroid Build Coastguard Worker            (instregex "^ST2Twov(8b|4h|2s|16b|8h|4s|2d)$")>;
791*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr],
792*9880d681SAndroid Build Coastguard Worker            (instregex "^ST2Twov(8b|4h|2s|16b|8h|4s|2d)_POST$")>;
793*9880d681SAndroid Build Coastguard Worker
794*9880d681SAndroid Build Coastguard Worker// ASIMD store, 2 element, one lane, B/H/S
795*9880d681SAndroid Build Coastguard Worker// ASIMD store, 2 element, one lane, D
796*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01],
797*9880d681SAndroid Build Coastguard Worker            (instregex "^ST2i(8|16|32|64)$")>;
798*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr],
799*9880d681SAndroid Build Coastguard Worker            (instregex "^ST2i(8|16|32|64)_POST$")>;
800*9880d681SAndroid Build Coastguard Worker
801*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, multiple, D-form, B/H/S
802*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, multiple, Q-form, B/H/S
803*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, multiple, Q-form, D
804*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01],
805*9880d681SAndroid Build Coastguard Worker            (instregex "^ST3Threev(8b|4h|2s|16b|8h|4s|2d)$")>;
806*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr],
807*9880d681SAndroid Build Coastguard Worker            (instregex "^ST3Threev(8b|4h|2s|16b|8h|4s|2d)_POST$")>;
808*9880d681SAndroid Build Coastguard Worker
809*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, one lane, B/H
810*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, one lane, S
811*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, one lane, D
812*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01], (instregex "^ST3i(8|16|32|64)$")>;
813*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr],
814*9880d681SAndroid Build Coastguard Worker            (instregex "^ST3i(8|16|32|64)_POST$")>;
815*9880d681SAndroid Build Coastguard Worker
816*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, multiple, D-form, B/H/S
817*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, multiple, Q-form, B/H/S
818*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, multiple, Q-form, D
819*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01],
820*9880d681SAndroid Build Coastguard Worker            (instregex "^ST4Fourv(8b|4h|2s|16b|8h|4s|2d)$")>;
821*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr],
822*9880d681SAndroid Build Coastguard Worker            (instregex "^ST4Fourv(8b|4h|2s|16b|8h|4s|2d)_POST$")>;
823*9880d681SAndroid Build Coastguard Worker
824*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, one lane, B/H
825*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, one lane, S
826*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, one lane, D
827*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01], (instregex "^ST4i(8|16|32|64)$")>;
828*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr],
829*9880d681SAndroid Build Coastguard Worker            (instregex "^ST4i(8|16|32|64)_POST$")>;
830*9880d681SAndroid Build Coastguard Worker
831*9880d681SAndroid Build Coastguard Worker//--
832*9880d681SAndroid Build Coastguard Worker// 3.17 Cryptography Extensions
833*9880d681SAndroid Build Coastguard Worker//--
834*9880d681SAndroid Build Coastguard Worker
835*9880d681SAndroid Build Coastguard Worker// Crypto AES ops
836*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F1], (instregex "^AES")>;
837*9880d681SAndroid Build Coastguard Worker
838*9880d681SAndroid Build Coastguard Worker// Crypto polynomial (64x64) multiply long
839*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F1], (instrs PMULLv1i64, PMULLv2i64)>;
840*9880d681SAndroid Build Coastguard Worker
841*9880d681SAndroid Build Coastguard Worker// Crypto SHA1 xor ops
842*9880d681SAndroid Build Coastguard Worker// Crypto SHA1 schedule acceleration ops
843*9880d681SAndroid Build Coastguard Worker// Crypto SHA256 schedule acceleration op (1 u-op)
844*9880d681SAndroid Build Coastguard Worker// Crypto SHA256 schedule acceleration op (2 u-ops)
845*9880d681SAndroid Build Coastguard Worker// Crypto SHA256 hash acceleration ops
846*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_F1], (instregex "^SHA")>;
847*9880d681SAndroid Build Coastguard Worker
848*9880d681SAndroid Build Coastguard Worker//--
849*9880d681SAndroid Build Coastguard Worker// 3.18 CRC
850*9880d681SAndroid Build Coastguard Worker//--
851*9880d681SAndroid Build Coastguard Worker
852*9880d681SAndroid Build Coastguard Worker// CRC checksum ops
853*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_I1], (instregex "^CRC32")>;
854*9880d681SAndroid Build Coastguard Worker
855*9880d681SAndroid Build Coastguard Worker} // SchedModel = VulcanModel
856