1//==- AArch64SchedTSV110.td - Huawei TSV110 Scheduling Definitions -*- tablegen -*-=//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the machine model for Huawei TSV110 to support
10// instruction scheduling and other instruction cost heuristics.
11//
12//===----------------------------------------------------------------------===//
13
14// ===---------------------------------------------------------------------===//
15// The following definitions describe the simpler per-operand machine model.
16// This works with MachineScheduler. See llvm/MC/MCSchedule.h for details.
17
18// Huawei TSV110 scheduling machine model.
19def TSV110Model : SchedMachineModel {
20  let IssueWidth            =   4; // 4 micro-ops dispatched  per cycle.
21  let MicroOpBufferSize     = 128; // 128 micro-op re-order buffer
22  let LoopMicroOpBufferSize =  16;
23  let LoadLatency           =   4; // Optimistic load latency.
24  let MispredictPenalty     =  14; // Fetch + Decode/Rename/Dispatch + Branch
25  let CompleteModel         =   1;
26
27  list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F,
28                                                    PAUnsupported.F,
29                                                    SMEUnsupported.F);
30}
31
32// Define each kind of processor resource and number available on the TSV110,
33// which has 8 pipelines, each with its own queue where micro-ops wait for
34// their operands and issue out-of-order to one of eight execution pipelines.
35let SchedModel = TSV110Model in {
36  def TSV110UnitALU  : ProcResource<1>; // Int ALU
37  def TSV110UnitAB   : ProcResource<2>; // Int ALU/BRU
38  def TSV110UnitMDU  : ProcResource<1>; // Multi-Cycle
39  def TSV110UnitFSU1 : ProcResource<1>; // FP/ASIMD
40  def TSV110UnitFSU2 : ProcResource<1>; // FP/ASIMD
41  def TSV110UnitLdSt : ProcResource<2>; // Load/Store
42
43  def TSV110UnitF     : ProcResGroup<[TSV110UnitFSU1, TSV110UnitFSU2]>;
44  def TSV110UnitALUAB : ProcResGroup<[TSV110UnitALU, TSV110UnitAB]>;
45  def TSV110UnitFLdSt : ProcResGroup<[TSV110UnitFSU1, TSV110UnitFSU2, TSV110UnitLdSt]>;
46}
47
48let SchedModel = TSV110Model in {
49
50//===----------------------------------------------------------------------===//
51// Map the target-defined scheduler read/write resources and latency for
52// TSV110
53
54// Integer ALU
55def : WriteRes<WriteImm,   [TSV110UnitALUAB]> { let Latency = 1; }
56def : WriteRes<WriteI,     [TSV110UnitALUAB]> { let Latency = 1; }
57def : WriteRes<WriteISReg, [TSV110UnitMDU]>   { let Latency = 2; }
58def : WriteRes<WriteIEReg, [TSV110UnitMDU]>   { let Latency = 2; }
59def : WriteRes<WriteExtr,  [TSV110UnitALUAB]> { let Latency = 1; }
60def : WriteRes<WriteIS,    [TSV110UnitALUAB]> { let Latency = 1; }
61
62// Integer Mul/MAC/Div
63def : WriteRes<WriteID32,  [TSV110UnitMDU]> { let Latency = 12;
64                                              let ResourceCycles = [12]; }
65def : WriteRes<WriteID64,  [TSV110UnitMDU]> { let Latency = 20;
66                                              let ResourceCycles = [20]; }
67def : WriteRes<WriteIM32,  [TSV110UnitMDU]> { let Latency = 3; }
68def : WriteRes<WriteIM64,  [TSV110UnitMDU]> { let Latency = 4; }
69
70// Load
71def : WriteRes<WriteLD,    [TSV110UnitLdSt]> { let Latency = 4; }
72def : WriteRes<WriteLDIdx, [TSV110UnitLdSt]> { let Latency = 4; }
73def : WriteRes<WriteLDHi,  []> { let Latency = 4; }
74
75// Pre/Post Indexing
76def : WriteRes<WriteAdr,   [TSV110UnitALUAB]> { let Latency = 1; }
77
78// Store
79def : WriteRes<WriteST,    [TSV110UnitLdSt]> { let Latency = 1; }
80def : WriteRes<WriteSTP,   [TSV110UnitLdSt]> { let Latency = 1; }
81def : WriteRes<WriteSTIdx, [TSV110UnitLdSt]> { let Latency = 1; }
82
83// FP
84def : WriteRes<WriteF,     [TSV110UnitF]> { let Latency = 2; }
85def : WriteRes<WriteFCmp,  [TSV110UnitF]> { let Latency = 3; }
86def : WriteRes<WriteFCvt,  [TSV110UnitF]> { let Latency = 3; }
87def : WriteRes<WriteFCopy, [TSV110UnitF]> { let Latency = 2; }
88def : WriteRes<WriteFImm,  [TSV110UnitF]> { let Latency = 2; }
89def : WriteRes<WriteFMul,  [TSV110UnitF]> { let Latency = 5; }
90
91// FP Div, Sqrt
92def : WriteRes<WriteFDiv,  [TSV110UnitFSU1]> { let Latency = 18; }
93
94def : WriteRes<WriteVd,    [TSV110UnitF]>     { let Latency = 4; }
95def : WriteRes<WriteVq,    [TSV110UnitF]>     { let Latency = 4; }
96def : WriteRes<WriteVLD,   [TSV110UnitFLdSt]> { let Latency = 5; }
97def : WriteRes<WriteVST,   [TSV110UnitF]>     { let Latency = 1; }
98
99// Branch
100def : WriteRes<WriteBr,    [TSV110UnitAB]> { let Latency = 1; }
101def : WriteRes<WriteBrReg, [TSV110UnitAB]> { let Latency = 1; }
102def : WriteRes<WriteSys,     []> { let Latency = 1; }
103def : WriteRes<WriteBarrier, []> { let Latency = 1; }
104def : WriteRes<WriteHint,    []> { let Latency = 1; }
105
106def : WriteRes<WriteAtomic, []> { let Unsupported = 1; }
107
108// Forwarding logic is modeled only for multiply and accumulate.
109def : ReadAdvance<ReadI,       0>;
110def : ReadAdvance<ReadISReg,   0>;
111def : ReadAdvance<ReadIEReg,   0>;
112def : ReadAdvance<ReadIM,      0>;
113def : ReadAdvance<ReadIMA,     2, [WriteIM32, WriteIM64]>;
114def : ReadAdvance<ReadID,      0>;
115def : ReadAdvance<ReadExtrHi,  0>;
116def : ReadAdvance<ReadAdrBase, 0>;
117def : ReadAdvance<ReadVLD,     0>;
118def : ReadAdvance<ReadST,      0>;
119
120def : InstRW<[WriteI], (instrs COPY)>;
121
122// Detailed Refinements
123//===----------------------------------------------------------------------===//
124
125// Contains all of the TSV110 specific SchedWriteRes types. The approach
126// below is to define a generic SchedWriteRes for every combination of
127// latency and microOps. The naming conventions is to use a prefix, one field
128// for latency, and one or more microOp count/type designators.
129//   Prefix: TSV110Wr
130//       Latency: #cyc
131//   MicroOp Count/Types: #(ALU|AB|MDU|FSU1|FSU2|LdSt|ALUAB|F|FLdSt)
132//
133// e.g. TSV110Wr_6cyc_1ALU_6MDU_4LdSt means the total latency is 6 and there are
134//      1 micro-ops to be issued down one ALU pipe, six MDU pipes and four LdSt pipes.
135//
136
137//===----------------------------------------------------------------------===//
138// Define Generic 1 micro-op types
139
140def TSV110Wr_1cyc_1AB    : SchedWriteRes<[TSV110UnitAB]>    { let Latency = 1; }
141def TSV110Wr_1cyc_1ALU   : SchedWriteRes<[TSV110UnitALU]>   { let Latency = 1; }
142def TSV110Wr_1cyc_1ALUAB : SchedWriteRes<[TSV110UnitALUAB]> { let Latency = 1; }
143def TSV110Wr_1cyc_1LdSt  : SchedWriteRes<[TSV110UnitLdSt]>  { let Latency = 1; }
144
145def TSV110Wr_2cyc_1AB    : SchedWriteRes<[TSV110UnitAB]>    { let Latency = 2; }
146def TSV110Wr_2cyc_1ALU   : SchedWriteRes<[TSV110UnitALU]>   { let Latency = 2; }
147def TSV110Wr_2cyc_1LdSt  : SchedWriteRes<[TSV110UnitLdSt]>  { let Latency = 2; }
148def TSV110Wr_2cyc_1MDU   : SchedWriteRes<[TSV110UnitMDU]>   { let Latency = 2; }
149def TSV110Wr_2cyc_1FSU1  : SchedWriteRes<[TSV110UnitFSU1]>  { let Latency = 2; }
150def TSV110Wr_2cyc_1F     : SchedWriteRes<[TSV110UnitF]>     { let Latency = 2; }
151
152def TSV110Wr_3cyc_1F     : SchedWriteRes<[TSV110UnitF]>     { let Latency = 3; }
153def TSV110Wr_3cyc_1FSU1  : SchedWriteRes<[TSV110UnitFSU1]>  { let Latency = 3; }
154def TSV110Wr_3cyc_1MDU   : SchedWriteRes<[TSV110UnitMDU]>   { let Latency = 3; }
155
156def TSV110Wr_4cyc_1FSU1  : SchedWriteRes<[TSV110UnitFSU1]>  { let Latency = 4; }
157def TSV110Wr_4cyc_1F     : SchedWriteRes<[TSV110UnitF]>     { let Latency = 4; }
158def TSV110Wr_4cyc_1LdSt  : SchedWriteRes<[TSV110UnitLdSt]>  { let Latency = 4; }
159def TSV110Wr_4cyc_1MDU   : SchedWriteRes<[TSV110UnitMDU]>   { let Latency = 4; }
160
161def TSV110Wr_5cyc_1F     : SchedWriteRes<[TSV110UnitF]>     { let Latency = 5; }
162def TSV110Wr_5cyc_1FSU1  : SchedWriteRes<[TSV110UnitFSU1]>  { let Latency = 5; }
163def TSV110Wr_5cyc_1FSU2  : SchedWriteRes<[TSV110UnitFSU2]>  { let Latency = 5; }
164def TSV110Wr_5cyc_1LdSt  : SchedWriteRes<[TSV110UnitLdSt]>  { let Latency = 5; }
165
166def TSV110Wr_6cyc_1F     : SchedWriteRes<[TSV110UnitF]>     { let Latency = 6; }
167
168def TSV110Wr_7cyc_1F     : SchedWriteRes<[TSV110UnitF]>     { let Latency = 7; }
169
170def TSV110Wr_8cyc_1F     : SchedWriteRes<[TSV110UnitF]>     { let Latency = 8; }
171
172def TSV110Wr_11cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]>  { let Latency = 11; }
173
174def TSV110Wr_12cyc_1MDU  : SchedWriteRes<[TSV110UnitMDU]>   { let Latency = 12; }
175
176def TSV110Wr_17cyc_1FSU2 : SchedWriteRes<[TSV110UnitFSU2]>  { let Latency = 17; }
177
178def TSV110Wr_18cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]>  { let Latency = 18; }
179
180def TSV110Wr_20cyc_1MDU  : SchedWriteRes<[TSV110UnitMDU]>   { let Latency = 20; }
181
182def TSV110Wr_24cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]>  { let Latency = 24; }
183
184def TSV110Wr_31cyc_1FSU2 : SchedWriteRes<[TSV110UnitFSU2]>  { let Latency = 31; }
185
186def TSV110Wr_36cyc_1FSU2 : SchedWriteRes<[TSV110UnitFSU2]>  { let Latency = 36; }
187
188def TSV110Wr_38cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]>  { let Latency = 38; }
189
190def TSV110Wr_64cyc_1FSU2 : SchedWriteRes<[TSV110UnitFSU2]>  { let Latency = 64; }
191
192//===----------------------------------------------------------------------===//
193// Define Generic 2 micro-op types
194
195def TSV110Wr_1cyc_1LdSt_1ALUAB : SchedWriteRes<[TSV110UnitLdSt,
196                                                TSV110UnitALUAB]> {
197  let Latency = 1;
198  let NumMicroOps = 2;
199}
200
201def TSV110Wr_2cyc_1LdSt_1ALUAB :  SchedWriteRes<[TSV110UnitLdSt,
202                                                 TSV110UnitALUAB]> {
203  let Latency = 2;
204  let NumMicroOps = 2;
205}
206
207def TSV110Wr_2cyc_2LdSt        : SchedWriteRes<[TSV110UnitLdSt,
208                                                TSV110UnitLdSt]> {
209  let Latency = 2;
210  let NumMicroOps = 2;
211}
212
213def TSV110Wr_2cyc_2F           : SchedWriteRes<[TSV110UnitF,
214                                                TSV110UnitF]> {
215  let Latency = 2;
216  let NumMicroOps = 2;
217}
218
219def TSV110Wr_2cyc_1FSU1_1FSU2  : SchedWriteRes<[TSV110UnitFSU1,
220                                                TSV110UnitFSU2]> {
221  let Latency = 2;
222  let NumMicroOps = 2;
223}
224
225def TSV110Wr_4cyc_2F           : SchedWriteRes<[TSV110UnitF,
226                                                TSV110UnitF]> {
227  let Latency = 4;
228  let NumMicroOps = 2;
229}
230
231def TSV110Wr_4cyc_1FSU1_1FSU2  : SchedWriteRes<[TSV110UnitFSU1,
232                                                TSV110UnitFSU2]> {
233  let Latency = 4;
234  let NumMicroOps = 2;
235}
236
237def TSV110Wr_4cyc_1LdSt_1ALUAB : SchedWriteRes<[TSV110UnitLdSt,
238                                                TSV110UnitALUAB]> {
239  let Latency = 4;
240  let NumMicroOps = 2;
241}
242
243def TSV110Wr_5cyc_1ALU_1F      : SchedWriteRes<[TSV110UnitALU,
244                                                TSV110UnitF]> {
245  let Latency     = 5;
246  let NumMicroOps = 2;
247}
248
249def TSV110Wr_6cyc_2LdSt        : SchedWriteRes<[TSV110UnitLdSt,
250                                                TSV110UnitLdSt]> {
251  let Latency = 6;
252  let NumMicroOps = 2;
253}
254
255def TSV110Wr_6cyc_1LdSt_1ALUAB : SchedWriteRes<[TSV110UnitLdSt,
256                                                TSV110UnitALUAB]> {
257  let Latency = 6;
258  let NumMicroOps = 2;
259}
260
261def TSV110Wr_7cyc_1F_1LdSt     : SchedWriteRes<[TSV110UnitF,
262                                                TSV110UnitLdSt]> {
263  let Latency = 7;
264  let NumMicroOps = 2;
265}
266
267def TSV110Wr_8cyc_2FSU1        : SchedWriteRes<[TSV110UnitFSU1,
268                                                TSV110UnitFSU1]> {
269  let Latency = 8;
270  let NumMicroOps = 2;
271}
272
273
274def TSV110Wr_8cyc_1FSU1_1FSU2  : SchedWriteRes<[TSV110UnitFSU1,
275                                                TSV110UnitFSU2]> {
276  let Latency = 8;
277  let NumMicroOps = 2;
278}
279
280//===----------------------------------------------------------------------===//
281// Define Generic 3 micro-op types
282
283def TSV110Wr_6cyc_3F       : SchedWriteRes<[TSV110UnitF, TSV110UnitF,
284                                            TSV110UnitF]> {
285  let Latency     = 6;
286  let NumMicroOps = 3;
287}
288
289def TSV110Wr_6cyc_3LdSt    : SchedWriteRes<[TSV110UnitLdSt, TSV110UnitLdSt,
290                                            TSV110UnitLdSt]> {
291  let Latency = 6;
292  let NumMicroOps = 3;
293}
294
295def TSV110Wr_7cyc_2F_1LdSt : SchedWriteRes<[TSV110UnitF, TSV110UnitF,
296                                                         TSV110UnitLdSt]> {
297  let Latency = 7;
298  let NumMicroOps = 3;
299}
300
301//===----------------------------------------------------------------------===//
302// Define Generic 4 micro-op types
303
304def TSV110Wr_8cyc_4F          : SchedWriteRes<[TSV110UnitF, TSV110UnitF,
305                                               TSV110UnitF, TSV110UnitF]> {
306  let Latency = 8;
307  let NumMicroOps = 4;
308}
309
310def TSV110Wr_8cyc_3F_1LdSt    : SchedWriteRes<[TSV110UnitF, TSV110UnitF,
311                                               TSV110UnitF, TSV110UnitLdSt]> {
312  let Latency = 8;
313  let NumMicroOps = 4;
314}
315
316//===----------------------------------------------------------------------===//
317// Define Generic 5 micro-op types
318
319def TSV110Wr_8cyc_3F_2LdSt : SchedWriteRes<[TSV110UnitF, TSV110UnitF, TSV110UnitF,
320                                            TSV110UnitLdSt, TSV110UnitLdSt]> {
321  let Latency = 8;
322  let NumMicroOps = 5;
323}
324
325//===----------------------------------------------------------------------===//
326// Define Generic 8 micro-op types
327
328def TSV110Wr_10cyc_4F_4LdSt : SchedWriteRes<[TSV110UnitF, TSV110UnitF,
329                                             TSV110UnitF, TSV110UnitF,
330                                             TSV110UnitLdSt, TSV110UnitLdSt,
331                                             TSV110UnitLdSt, TSV110UnitLdSt]> {
332  let Latency = 10;
333  let NumMicroOps = 8;
334}
335
336
337// Branch Instructions
338// -----------------------------------------------------------------------------
339
340def : InstRW<[TSV110Wr_1cyc_1AB], (instrs B)>;
341def : InstRW<[TSV110Wr_1cyc_1AB], (instrs BL)>;
342def : InstRW<[TSV110Wr_1cyc_1AB], (instrs BLR)>;
343def : InstRW<[TSV110Wr_1cyc_1AB], (instregex "^(BR|RET|(CBZ|CBNZ|TBZ|TBNZ))$")>;
344
345
346// Cryptography Extensions
347// -----------------------------------------------------------------------------
348
349def : InstRW<[TSV110Wr_3cyc_1FSU1], (instregex "^AES[DE]")>;
350def : InstRW<[TSV110Wr_3cyc_1FSU1], (instregex "^AESI?MC")>;
351def : InstRW<[TSV110Wr_2cyc_1FSU1], (instregex "^SHA1SU1")>;
352def : InstRW<[TSV110Wr_2cyc_2F],    (instregex "^SHA1(H|SU0)")>;
353def : InstRW<[TSV110Wr_5cyc_1FSU1], (instregex "^SHA1[CMP]")>;
354def : InstRW<[TSV110Wr_2cyc_1FSU1], (instregex "^SHA256SU0")>;
355def : InstRW<[TSV110Wr_3cyc_1FSU1], (instregex "^SHA256SU1")>;
356def : InstRW<[TSV110Wr_5cyc_1FSU1], (instregex "^SHA256(H|H2)")>;
357def TSV110ReadCRC: SchedReadAdvance<1, [TSV110Wr_2cyc_1MDU]>;
358def : InstRW<[TSV110Wr_2cyc_1MDU, TSV110ReadCRC],  (instregex "^CRC32.*$")>;
359
360
361// Arithmetic and Logical Instructions
362// -----------------------------------------------------------------------------
363
364def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "(BIC|EON|ORN)[WX]rr")>;
365def : InstRW<[TSV110Wr_1cyc_1AB],    (instregex "(BIC)S[WX]rr")>;
366
367def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "(ADD|AND|EOR|ORR|SUB)[WX]r(r|i)")>;
368def : InstRW<[TSV110Wr_1cyc_1AB],    (instregex "(ADD|AND|EOR|ORR|SUB)S[WX]r(r|i)")>;
369
370def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "^(ADC|SBC|BIC)[WX]r$")>;
371def : InstRW<[TSV110Wr_1cyc_1AB],    (instregex "^(ADC|SBC)S[WX]r$")>;
372
373def : InstRW<[TSV110Wr_2cyc_1MDU],   (instregex "^(AND|BIC|EON|EOR|ORN|ORR)[WX]rs$")>;
374def : InstRW<[TSV110Wr_2cyc_1AB],    (instregex "^(AND|BIC|EON|EOR|ORN|ORR)S[WX]rs$")>;
375def : InstRW<[TSV110Wr_2cyc_1MDU],   (instregex "^(ADD|SUB)[WX]r(s|x|x64)$")>;
376def : InstRW<[TSV110Wr_2cyc_1AB],    (instregex "^(ADD|SUB)S[WX]r(s|x|x64)$")>;
377
378def : InstRW<[TSV110Wr_1cyc_1AB],    (instregex "^(CCMN|CCMP)(W|X)(r|i)$")>;
379def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "^(CSEL|CSINC|CSINV|CSNEG)(W|X)r$")>;
380
381
382// Move and Shift Instructions
383// -----------------------------------------------------------------------------
384
385def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instrs ADR, ADRP)>;
386def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "^MOV[NZK][WX]i")>;
387def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "(LSLV|LSRV|ASRV|RORV)(W|X)r")>;
388
389
390// Divide and Multiply Instructions
391// -----------------------------------------------------------------------------
392
393def : InstRW<[TSV110Wr_12cyc_1MDU],  (instregex "^(S|U)DIVWr$")>;
394def : InstRW<[TSV110Wr_20cyc_1MDU],  (instregex "^(S|U)DIVXr$")>;
395
396def TSV110ReadMAW : SchedReadAdvance<2, [TSV110Wr_3cyc_1MDU]>;
397def : InstRW<[TSV110Wr_3cyc_1MDU, TSV110ReadMAW], (instrs MADDWrrr, MSUBWrrr)>;
398def TSV110ReadMAQ : SchedReadAdvance<3, [TSV110Wr_4cyc_1MDU]>;
399def : InstRW<[TSV110Wr_4cyc_1MDU, TSV110ReadMAQ], (instrs MADDXrrr, MSUBXrrr)>;
400def : InstRW<[TSV110Wr_3cyc_1MDU, TSV110ReadMAW], (instregex "(S|U)(MADDL|MSUBL)rrr")>;
401def : InstRW<[TSV110Wr_4cyc_1MDU], (instregex "^(S|U)MULHrr$")>;
402
403
404// Miscellaneous Data-Processing Instructions
405// -----------------------------------------------------------------------------
406
407def : InstRW<[TSV110Wr_1cyc_1ALUAB],    (instregex "^EXTR(W|X)rri$")>;
408def : InstRW<[TSV110Wr_1cyc_1ALUAB],    (instregex "^(S|U)?BFM(W|X)ri$")>;
409def : InstRW<[TSV110Wr_1cyc_1ALUAB],    (instregex "^(CLS|CLZ|RBIT|REV(16|32)?)(W|X)r$")>;
410
411
412// Load Instructions
413// -----------------------------------------------------------------------------
414
415def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instregex "^LDR(W|X)l$")>;
416def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instrs LDRSWl)>;
417
418def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instregex "^LDR(BB|HH|W|X)ui$")>;
419def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instregex "^LDRS(BW|BX|HW|HX|W)ui$")>;
420
421def : InstRW<[TSV110Wr_4cyc_1LdSt, WriteAdr],     (instregex "^LDR(BB|HH|W|X)(post|pre)$")>;
422def : InstRW<[TSV110Wr_4cyc_1LdSt, WriteAdr],     (instregex "^LDRS(BW|BX|HW|HX|W)(post|pre)$")>;
423
424def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instregex "^LDTR(B|H|W|X)i$")>;
425def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instregex "^LDUR(BB|HH|W|X)i$")>;
426def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instregex "^LDTRS(BW|BX|HW|HX|W)i$")>;
427def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instregex "^LDURS(BW|BX|HW|HX|W)i$")>;
428
429def : InstRW<[TSV110Wr_4cyc_1LdSt, WriteLDHi],     (instregex "^LDNP(W|X)i$")>;
430def : InstRW<[TSV110Wr_4cyc_1LdSt, WriteLDHi],     (instregex "^LDP(W|X)i$")>;
431def : InstRW<[TSV110Wr_4cyc_1LdSt_1ALUAB, WriteLDHi, WriteAdr],(instregex "^LDP(W|X)(post|pre)$")>;
432
433def : InstRW<[TSV110Wr_4cyc_1LdSt, WriteLDHi],           (instrs LDPSWi)>;
434def : InstRW<[TSV110Wr_4cyc_1LdSt, WriteLDHi, WriteAdr], (instrs LDPSWpost)>;
435def : InstRW<[TSV110Wr_4cyc_1LdSt, WriteLDHi, WriteAdr], (instrs LDPSWpre)>;
436
437def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instrs PRFMl)>;
438def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instrs PRFUMi)>;
439def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instregex "^PRFMui$")>;
440def : InstRW<[TSV110Wr_4cyc_1LdSt],     (instregex "^PRFMro(W|X)$")>;
441
442
443// Store Instructions
444// -----------------------------------------------------------------------------
445
446def : InstRW<[TSV110Wr_1cyc_1LdSt],            (instregex "^STN?P(W|X)i$")>;
447def : InstRW<[TSV110Wr_1cyc_1LdSt, WriteAdr],  (instregex "^STP(W|X)(post|pre)$")>;
448def : InstRW<[TSV110Wr_1cyc_1LdSt],            (instregex "^STUR(BB|HH|W|X)i$")>;
449def : InstRW<[TSV110Wr_1cyc_1LdSt],            (instregex "^STTR(B|H|W|X)i$")>;
450def : InstRW<[TSV110Wr_1cyc_1LdSt],            (instregex "^STR(BB|HH|W|X)ui$")>;
451
452def : InstRW<[TSV110Wr_1cyc_1LdSt, WriteAdr],  (instregex "^STR(BB|HH|W|X)(post|pre)$")>;
453def : InstRW<[TSV110Wr_1cyc_1LdSt, WriteAdr],  (instregex "^STR(BB|HH|W|X)ro(W|X)$")>;
454
455
456// FP Data Processing Instructions
457// -----------------------------------------------------------------------------
458
459def : InstRW<[TSV110Wr_2cyc_1F], (instregex "F(ABS|NEG)(D|S)r")>;
460def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FCCMP(E)?(S|D)rr$")>;
461def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FCMP(E)?(S|D)r(r|i)$")>;
462def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FCSEL(S|D)rrr$")>;
463
464def : InstRW<[TSV110Wr_11cyc_1FSU1], (instrs FDIVSrr)>;
465def : InstRW<[TSV110Wr_18cyc_1FSU1], (instrs FDIVDrr)>;
466def : InstRW<[TSV110Wr_17cyc_1FSU2], (instrs FSQRTSr)>;
467def : InstRW<[TSV110Wr_31cyc_1FSU2], (instrs FSQRTDr)>;
468
469def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^F(MAX|MIN).+rr")>;
470
471def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^FN?M(ADD|SUB)Hrrr")>;
472def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^FN?M(ADD|SUB)Srrr")>;
473def : InstRW<[TSV110Wr_7cyc_1F], (instregex "^FN?M(ADD|SUB)Drrr")>;
474
475def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^F(ADD|SUB)Hrr")>;
476def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^F(ADD|SUB)Srr")>;
477def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^F(ADD|SUB)Drr")>;
478
479def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^F(N)?MULHrr$")>;
480def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^F(N)?MULSrr$")>;
481def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^F(N)?MULDrr$")>;
482
483def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FRINT.+r")>;
484
485
486// FP Miscellaneous Instructions
487// -----------------------------------------------------------------------------
488
489def : InstRW<[TSV110Wr_5cyc_1ALU_1F], (instregex "^[SU]CVTF[SU][WX][SD]ri")>;
490def : InstRW<[TSV110Wr_4cyc_1FSU1],   (instregex "^FCVT(A|M|N|P|Z)(S|U)U(W|X)(S|D)r$")>;
491def : InstRW<[TSV110Wr_3cyc_1F],      (instregex "^FCVT[HSD][HSD]r")>;
492
493def : InstRW<[TSV110Wr_2cyc_1FSU1],   (instregex "^FMOV(DX|WS|XD|SW|DXHigh|XDHigh)r$")>;
494def : InstRW<[TSV110Wr_2cyc_1F],      (instregex "^FMOV[SD][ir]$")>;
495
496
497// FP Load Instructions
498// -----------------------------------------------------------------------------
499
500def : InstRW<[TSV110Wr_5cyc_1LdSt],                      (instregex "^LDR[DSQ]l")>;
501def : InstRW<[TSV110Wr_5cyc_1LdSt],                      (instregex "^LDUR[BDHSQ]i")>;
502def : InstRW<[TSV110Wr_5cyc_1LdSt, WriteAdr],            (instregex "^LDR[BDHSQ](post|pre)")>;
503def : InstRW<[TSV110Wr_5cyc_1LdSt],                      (instregex "^LDR[BDHSQ]ui")>;
504def : InstRW<[TSV110Wr_6cyc_1LdSt_1ALUAB, ReadAdrBase],  (instregex "^LDR(Q|D|H|S|B)ro(W|X)$")>;
505def : InstRW<[TSV110Wr_5cyc_1LdSt, WriteLDHi],           (instregex "^LDN?P[DQS]i")>;
506def : InstRW<[TSV110Wr_5cyc_1LdSt, WriteLDHi, WriteAdr], (instregex "^LDP[DQS](post|pre)")>;
507
508
509// FP Store Instructions
510// -----------------------------------------------------------------------------
511
512def : InstRW<[TSV110Wr_1cyc_1LdSt],                     (instregex "^STUR[BHSDQ]i")>;
513def : InstRW<[TSV110Wr_1cyc_1LdSt_1ALUAB, ReadAdrBase], (instregex "^STR[BHSDQ](post|pre)")>;
514def : InstRW<[TSV110Wr_1cyc_1LdSt],                     (instregex "^STR[BHSDQ]ui")>;
515def : InstRW<[TSV110Wr_2cyc_1LdSt_1ALUAB, ReadAdrBase], (instregex "^STR[BHSDQ]ro[WX]")>;
516def : InstRW<[TSV110Wr_2cyc_2LdSt],                     (instregex "^STN?P[SDQ]i")>;
517def : InstRW<[TSV110Wr_2cyc_2LdSt, WriteAdr],           (instregex "^STP[SDQ](post|pre)")>;
518
519
520// ASIMD Integer Instructions
521// -----------------------------------------------------------------------------
522
523// Reference for forms in this group
524//   D form - v8i8, v4i16, v2i32
525//   Q form - v16i8, v8i16, v4i32
526//   D form - v1i8, v1i16, v1i32, v1i64
527//   Q form - v16i8, v8i16, v4i32, v2i64
528//   D form - v8i8_v8i16, v4i16_v4i32, v2i32_v2i64
529//   Q form - v16i8_v8i16, v8i16_v4i32, v4i32_v2i64
530
531// ASIMD simple arithmetic
532def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^(ABS|ADD(P)?|NEG|SUB)v")>;
533def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^[SU](ADD(L|LP|W)|SUB(L|W))v")>;
534
535// ASIMD complex arithmetic
536def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]H(ADD|SUB)v")>;
537def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^R?(ADD|SUB)HN2?v")>;
538def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]Q(ADD|SUB)v")>;
539def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^(SU|US)QADDv")>;
540def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]RHADDv")>;
541def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]ABAL?v")>;
542def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]ABDL?v")>;
543def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]ADALPv")>;
544def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^((SQ)(ABS|NEG))v")>;
545
546// ASIMD compare
547def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^CM(EQ|GE|GT|HI|HS|LE|LT|TST)v")>;
548
549// ASIMD max/min
550def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^[SU](MIN|MAX)P?v")>;
551
552// ASIMD logical
553def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^(AND|BIC|BIF|BIT|BSL|EOR|MVN|NOT|ORN|ORR)v")>;
554
555// ASIMD multiply accumulate, D-form
556def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^(MUL|ML[AS]|SQR?D(MULH))(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)")>;
557// ASIMD multiply accumulate, Q-form
558def : InstRW<[TSV110Wr_8cyc_2FSU1], (instregex "^(MUL|ML[AS]|SQR?D(MULH))(v16i8|v8i16|v4i32)")>;
559
560// ASIMD multiply accumulate long
561def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "(S|U|SQD)(MLAL|MLSL|MULL)v.*")>;
562def : InstRW<[TSV110Wr_2cyc_1FSU1], (instregex "^PMULL(v8i8|v16i8)")>;
563def : InstRW<[TSV110Wr_2cyc_1FSU1], (instregex "^PMULL(v1i64|v2i64)")>;
564
565// ASIMD shift
566// ASIMD shift accumulate
567def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^(S|SR|U|UR)SRA")>;
568// ASIMD shift by immed, basic
569def : InstRW<[TSV110Wr_4cyc_1FSU1],
570            (instregex "SHLv","SLIv","SRIv","SHRNv","SQXTNv","SQXTUNv","UQXTNv")>;
571// ASIMD shift by immed, complex
572def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^[SU]?(Q|R){1,2}SHR")>;
573def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^SQSHLU")>;
574// ASIMD shift by register, basic, Q-form
575def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^[SU]SHL(v16i8|v8i16|v4i32|v2i64)")>;
576// ASIMD shift by register, complex, D-form
577def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^[SU][QR]{1,2}SHL(v1i8|v1i16|v1i32|v1i64|v8i8|v4i16|v2i32|b|d|h|s)")>;
578// ASIMD shift by register, complex, Q-form
579def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^[SU][QR]{1,2}SHL(v16i8|v8i16|v4i32|v2i64)")>;
580
581// ASIMD reduction
582// ASIMD arith, reduce, 4H/4S
583def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]?ADDL?V(v8i8|v4i16|v2i32)v$")>;
584// ASIMD arith, reduce, 8B/8H
585def : InstRW<[TSV110Wr_8cyc_1FSU1_1FSU2], (instregex "^[SU]?ADDL?V(v8i16|v4i32)v$")>;
586// ASIMD arith, reduce, 16B
587def : InstRW<[TSV110Wr_8cyc_1FSU1_1FSU2], (instregex "^[SU]?ADDL?Vv16i8v$")>;
588
589// ASIMD max/min, reduce, 4H/4S
590def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU](MIN|MAX)V(v4i16|v4i32)v$")>;
591// ASIMD max/min, reduce, 8B/8H
592def : InstRW<[TSV110Wr_8cyc_1FSU1_1FSU2], (instregex "^[SU](MIN|MAX)V(v8i8|v8i16)v$")>;
593// ASIMD max/min, reduce, 16B
594def : InstRW<[TSV110Wr_8cyc_1FSU1_1FSU2], (instregex "^[SU](MIN|MAX)Vv16i8v$")>;
595
596
597// Vector - Floating Point
598// -----------------------------------------------------------------------------
599
600// Reference for forms in this group
601//   D form - v2f32
602//   Q form - v4f32, v2f64
603//   D form - 32, 64
604//   D form - v1i32, v1i64
605//   D form - v2i32
606//   Q form - v4i32, v2i64
607
608// ASIMD FP sign manipulation
609def : InstRW<[TSV110Wr_2cyc_1F],  (instregex "^FABSv")>;
610def : InstRW<[TSV110Wr_2cyc_1F],  (instregex "^FNEGv")>;
611
612// ASIMD FP compare
613def : InstRW<[TSV110Wr_2cyc_1F],  (instregex "^F(AC|CM)(EQ|GE|GT|LE|LT)v")>;
614
615// ASIMD FP convert
616def : InstRW<[TSV110Wr_2cyc_1F],  (instregex "^FCVT[AMNPZ][SU]v")>;
617def : InstRW<[TSV110Wr_3cyc_1F],  (instregex "^FCVT(L)v")>;
618def : InstRW<[TSV110Wr_5cyc_1F],  (instregex "^FCVT(N|XN)v")>;
619
620// ASIMD FP divide, D-form, F32
621def : InstRW<[TSV110Wr_11cyc_1FSU1], (instregex "FDIVv2f32")>;
622// ASIMD FP divide, Q-form, F32
623def : InstRW<[TSV110Wr_24cyc_1FSU1], (instregex "FDIVv4f32")>;
624// ASIMD FP divide, Q-form, F64
625def : InstRW<[TSV110Wr_38cyc_1FSU1], (instregex "FDIVv2f64")>;
626
627// ASIMD FP SQRT
628def : InstRW<[TSV110Wr_17cyc_1FSU2], (instrs FSQRTv2f32)>;
629def : InstRW<[TSV110Wr_36cyc_1FSU2], (instrs FSQRTv4f32)>;
630def : InstRW<[TSV110Wr_64cyc_1FSU2], (instrs FSQRTv2f64)>;
631
632// ASIMD FP max,min
633def : InstRW<[TSV110Wr_2cyc_1F],  (instregex "^F(MAX|MIN)(NM)?v")>;
634def : InstRW<[TSV110Wr_2cyc_1F],  (instregex "^F(MAX|MIN)(NM)?Pv")>;
635def : InstRW<[TSV110Wr_4cyc_1F],  (instregex "^F(MAX|MIN)(NM)?Vv")>;
636
637// ASIMD FP add
638def : InstRW<[TSV110Wr_5cyc_1F],  (instregex "^F(ADD|ADDP|SUB)v")>;
639
640// ASIMD FP multiply
641def : InstRW<[TSV110Wr_5cyc_1F],  (instregex "^FMULX?v")>;
642
643
644// ASIMD Miscellaneous Instructions
645// -----------------------------------------------------------------------------
646
647def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^(CLS|CLZ|CNT)v")>;
648def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^(DUP|INS)v.+lane")>;
649def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^REV(16|32|64)v")>;
650def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^(UZP|ZIP)[12]v")>;
651
652def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^EXTv")>;
653def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^XTNv")>;
654def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^RBITv")>;
655
656def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^(INS|DUP)v.+gpr")>;
657
658def : InstRW<[TSV110Wr_3cyc_1FSU1], (instregex "^[SU]MOVv")>;
659
660// ASIMD table lookup, D-form
661def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^TB[LX]v8i8One")>;
662def : InstRW<[TSV110Wr_4cyc_2F], (instregex "^TB[LX]v8i8Two")>;
663def : InstRW<[TSV110Wr_6cyc_3F], (instregex "^TB[LX]v8i8Three")>;
664def : InstRW<[TSV110Wr_8cyc_4F], (instregex "^TB[LX]v8i8Four")>;
665// ASIMD table lookup, Q-form
666def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^TB[LX]v16i8One")>;
667def : InstRW<[TSV110Wr_4cyc_2F], (instregex "^TB[LX]v16i8Two")>;
668def : InstRW<[TSV110Wr_6cyc_3F], (instregex "^TB[LX]v16i8Three")>;
669def : InstRW<[TSV110Wr_8cyc_4F], (instregex "^TB[LX]v16i8Four")>;
670
671def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^FMOVv")>;
672
673def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FRINT[AIMNPXZ]v")>;
674def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^[SU]CVTFv")>;
675def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^[FU](RECP|RSQRT)(E|X)v")>;
676
677
678// ASIMD Load Instructions
679// -----------------------------------------------------------------------------
680
681def : InstRW<[TSV110Wr_7cyc_1F_1LdSt],            (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
682def : InstRW<[TSV110Wr_7cyc_1F_1LdSt, WriteAdr],  (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
683def : InstRW<[TSV110Wr_7cyc_2F_1LdSt],            (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
684def : InstRW<[TSV110Wr_7cyc_2F_1LdSt, WriteAdr],  (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
685def : InstRW<[TSV110Wr_8cyc_3F_1LdSt],            (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
686def : InstRW<[TSV110Wr_8cyc_3F_1LdSt, WriteAdr],  (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
687def : InstRW<[TSV110Wr_8cyc_3F_2LdSt],            (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
688def : InstRW<[TSV110Wr_8cyc_3F_2LdSt, WriteAdr],  (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
689
690def  : InstRW<[TSV110Wr_7cyc_1F_1LdSt],           (instregex "LD1i(8|16|32|64)$")>;
691def  : InstRW<[TSV110Wr_7cyc_1F_1LdSt, WriteAdr], (instregex "LD1i(8|16|32|64)_POST$")>;
692def  : InstRW<[TSV110Wr_7cyc_2F_1LdSt],           (instregex "LD2i(8|16|32|64)$")>;
693def  : InstRW<[TSV110Wr_7cyc_2F_1LdSt, WriteAdr], (instregex "LD2i(8|16|32|64)_POST$")>;
694def  : InstRW<[TSV110Wr_8cyc_3F_1LdSt],           (instregex "LD3i(8|16|32|64)$")>;
695def  : InstRW<[TSV110Wr_8cyc_3F_1LdSt, WriteAdr], (instregex "LD3i(8|16|32|64)_POST$")>;
696def  : InstRW<[TSV110Wr_8cyc_3F_2LdSt],           (instregex "LD4i(8|16|32|64)$")>;
697def  : InstRW<[TSV110Wr_8cyc_3F_2LdSt, WriteAdr], (instregex "LD4i(8|16|32|64)_POST$")>;
698
699def : InstRW<[TSV110Wr_5cyc_1LdSt],               (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
700def : InstRW<[TSV110Wr_5cyc_1LdSt, WriteAdr],     (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
701def : InstRW<[TSV110Wr_5cyc_1LdSt],               (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
702def : InstRW<[TSV110Wr_5cyc_1LdSt, WriteAdr],     (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
703def : InstRW<[TSV110Wr_6cyc_3LdSt],               (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
704def : InstRW<[TSV110Wr_6cyc_3LdSt, WriteAdr],     (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
705def : InstRW<[TSV110Wr_6cyc_2LdSt],               (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
706def : InstRW<[TSV110Wr_6cyc_2LdSt, WriteAdr],     (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
707
708def : InstRW<[TSV110Wr_7cyc_2F_1LdSt],            (instregex "^LD2Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
709def : InstRW<[TSV110Wr_7cyc_2F_1LdSt, WriteAdr],  (instregex "^LD2Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
710
711def : InstRW<[TSV110Wr_8cyc_3F_1LdSt],            (instregex "^LD3Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
712def : InstRW<[TSV110Wr_8cyc_3F_1LdSt, WriteAdr],  (instregex "^LD3Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
713
714def : InstRW<[TSV110Wr_10cyc_4F_4LdSt],           (instregex "^LD4Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
715def : InstRW<[TSV110Wr_10cyc_4F_4LdSt, WriteAdr], (instregex "^LD4Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
716
717
718// ASIMD Store Instructions
719// -----------------------------------------------------------------------------
720
721def  : InstRW<[TSV110Wr_3cyc_1F],             (instregex "ST1i(8|16|32|64)$")>;
722def  : InstRW<[TSV110Wr_3cyc_1F, WriteAdr],   (instregex "ST1i(8|16|32|64)_POST$")>;
723def  : InstRW<[TSV110Wr_4cyc_1F],             (instregex "ST2i(8|16|32|64)$")>;
724def  : InstRW<[TSV110Wr_4cyc_1F, WriteAdr],   (instregex "ST2i(8|16|32|64)_POST$")>;
725def  : InstRW<[TSV110Wr_5cyc_1F],             (instregex "ST3i(8|16|32|64)$")>;
726def  : InstRW<[TSV110Wr_5cyc_1F, WriteAdr],   (instregex "ST3i(8|16|32|64)_POST$")>;
727def  : InstRW<[TSV110Wr_6cyc_1F],             (instregex "ST4i(8|16|32|64)$")>;
728def  : InstRW<[TSV110Wr_6cyc_1F, WriteAdr],   (instregex "ST4i(8|16|32|64)_POST$")>;
729
730def : InstRW<[TSV110Wr_3cyc_1F],              (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
731def : InstRW<[TSV110Wr_3cyc_1F, WriteAdr],    (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
732def : InstRW<[TSV110Wr_4cyc_1F],              (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
733def : InstRW<[TSV110Wr_4cyc_1F, WriteAdr],    (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
734def : InstRW<[TSV110Wr_5cyc_1F],              (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
735def : InstRW<[TSV110Wr_5cyc_1F, WriteAdr],    (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
736def : InstRW<[TSV110Wr_6cyc_1F],              (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
737def : InstRW<[TSV110Wr_6cyc_1F, WriteAdr],    (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
738
739def : InstRW<[TSV110Wr_4cyc_1F],              (instregex "^ST2Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
740def : InstRW<[TSV110Wr_4cyc_1F, WriteAdr],    (instregex "^ST2Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
741
742def : InstRW<[TSV110Wr_5cyc_1F],              (instregex "^ST3Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
743def : InstRW<[TSV110Wr_5cyc_1F, WriteAdr],    (instregex "^ST3Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
744
745def : InstRW<[TSV110Wr_8cyc_1F],              (instregex "^ST4Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
746def : InstRW<[TSV110Wr_8cyc_1F, WriteAdr],    (instregex "^ST4Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
747
748} // SchedModel = TSV110Model
749