xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64SchedNeoverseN2.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1753f127fSDimitry Andric//=- AArch64SchedNeoverseN2.td - NeoverseN2 Scheduling Defs --*- tablegen -*-=//
2753f127fSDimitry Andric//
3753f127fSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4753f127fSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5753f127fSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6753f127fSDimitry Andric//
7753f127fSDimitry Andric//===----------------------------------------------------------------------===//
8753f127fSDimitry Andric//
9753f127fSDimitry Andric// This file defines the scheduling model for the Arm Neoverse N2 processors.
10753f127fSDimitry Andric//
11753f127fSDimitry Andric//===----------------------------------------------------------------------===//
12753f127fSDimitry Andric
13753f127fSDimitry Andricdef NeoverseN2Model : SchedMachineModel {
14753f127fSDimitry Andric  let IssueWidth            =  10; // Micro-ops dispatched at a time.
15753f127fSDimitry Andric  let MicroOpBufferSize     = 160; // Entries in micro-op re-order buffer.
16753f127fSDimitry Andric  let LoadLatency           =   4; // Optimistic load latency.
17753f127fSDimitry Andric  let MispredictPenalty     =  10; // Extra cycles for mispredicted branch.
18753f127fSDimitry Andric  let LoopMicroOpBufferSize =  16; // NOTE: Copied from Cortex-A57.
19753f127fSDimitry Andric  let CompleteModel         =   1;
20753f127fSDimitry Andric
21bdd1243dSDimitry Andric  list<Predicate> UnsupportedFeatures = !listconcat(SMEUnsupported.F,
224c2d3b02SDimitry Andric    [HasSVE2p1, HasPAuthLR, HasCPA, HasCSSC]);
23753f127fSDimitry Andric}
24753f127fSDimitry Andric
25753f127fSDimitry Andric//===----------------------------------------------------------------------===//
26753f127fSDimitry Andric// Define each kind of processor resource and number available on Neoverse N2.
27753f127fSDimitry Andric// Instructions are first fetched and then decoded into internal macro-ops
28753f127fSDimitry Andric// (MOPs). From there, the MOPs proceed through register renaming and dispatch
29753f127fSDimitry Andric// stages. A MOP can be split into two micro-ops further down the pipeline
30753f127fSDimitry Andric// after the decode stage. Once dispatched, micro-ops wait for their operands
31753f127fSDimitry Andric// and issue out-of-order to one of thirteen issue pipelines. Each issue
32753f127fSDimitry Andric// pipeline can accept one micro-op per cycle.
33753f127fSDimitry Andric
34753f127fSDimitry Andriclet SchedModel = NeoverseN2Model in {
35753f127fSDimitry Andric
36753f127fSDimitry Andric// Define the (13) issue ports.
37753f127fSDimitry Andricdef N2UnitB   : ProcResource<2>;  // Branch 0/1
38753f127fSDimitry Andricdef N2UnitS   : ProcResource<2>;  // Integer single Cycle 0/1
39753f127fSDimitry Andricdef N2UnitM0  : ProcResource<1>;  // Integer multicycle 0
40753f127fSDimitry Andricdef N2UnitM1  : ProcResource<1>;  // Integer multicycle 1
41753f127fSDimitry Andricdef N2UnitL01 : ProcResource<2>;  // Load/Store 0/1
42753f127fSDimitry Andricdef N2UnitL2  : ProcResource<1>;  // Load 2
43753f127fSDimitry Andricdef N2UnitD   : ProcResource<2>;  // Store data 0/1
44753f127fSDimitry Andricdef N2UnitV0  : ProcResource<1>;  // FP/ASIMD 0
45753f127fSDimitry Andricdef N2UnitV1  : ProcResource<1>;  // FP/ASIMD 1
46753f127fSDimitry Andric
47753f127fSDimitry Andricdef N2UnitV : ProcResGroup<[N2UnitV0, N2UnitV1]>;  // FP/ASIMD 0/1
48753f127fSDimitry Andricdef N2UnitM : ProcResGroup<[N2UnitM0, N2UnitM1]>;  // Integer single/multicycle 0/1
49753f127fSDimitry Andricdef N2UnitL : ProcResGroup<[N2UnitL01, N2UnitL2]>; // Load/Store 0/1 and Load 2
50753f127fSDimitry Andricdef N2UnitI : ProcResGroup<[N2UnitS, N2UnitM0, N2UnitM1]>; // Integer single cycle 0/1 and single/multicycle 0/1
51753f127fSDimitry Andric
52753f127fSDimitry Andric// Define commonly used read types.
53753f127fSDimitry Andric
54753f127fSDimitry Andric// No forwarding is provided for these types.
55753f127fSDimitry Andricdef : ReadAdvance<ReadI,       0>;
56753f127fSDimitry Andricdef : ReadAdvance<ReadISReg,   0>;
57753f127fSDimitry Andricdef : ReadAdvance<ReadIEReg,   0>;
58753f127fSDimitry Andricdef : ReadAdvance<ReadIM,      0>;
59753f127fSDimitry Andricdef : ReadAdvance<ReadIMA,     0>;
60753f127fSDimitry Andricdef : ReadAdvance<ReadID,      0>;
61753f127fSDimitry Andricdef : ReadAdvance<ReadExtrHi,  0>;
62753f127fSDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>;
63753f127fSDimitry Andricdef : ReadAdvance<ReadST,      0>;
64753f127fSDimitry Andricdef : ReadAdvance<ReadVLD,     0>;
65753f127fSDimitry Andric
66753f127fSDimitry Andricdef : WriteRes<WriteAtomic,  []> { let Unsupported = 1; }
67753f127fSDimitry Andricdef : WriteRes<WriteBarrier, []> { let Latency = 1; }
68753f127fSDimitry Andricdef : WriteRes<WriteHint,    []> { let Latency = 1; }
69753f127fSDimitry Andricdef : WriteRes<WriteLDHi,    []> { let Latency = 4; }
70753f127fSDimitry Andric
71753f127fSDimitry Andric//===----------------------------------------------------------------------===//
72753f127fSDimitry Andric// Define customized scheduler read/write types specific to the Neoverse N2.
73753f127fSDimitry Andric
74753f127fSDimitry Andric//===----------------------------------------------------------------------===//
75753f127fSDimitry Andric// Define generic 1 micro-op types
76753f127fSDimitry Andric
77753f127fSDimitry Andricdef N2Write_1cyc_1B   : SchedWriteRes<[N2UnitB]>   { let Latency = 1; }
78753f127fSDimitry Andricdef N2Write_1cyc_1I   : SchedWriteRes<[N2UnitI]>   { let Latency = 1; }
79753f127fSDimitry Andricdef N2Write_1cyc_1M   : SchedWriteRes<[N2UnitM]>   { let Latency = 1; }
80753f127fSDimitry Andricdef N2Write_1cyc_1M0  : SchedWriteRes<[N2UnitM0]>  { let Latency = 1; }
81753f127fSDimitry Andricdef N2Write_1cyc_1L01 : SchedWriteRes<[N2UnitL01]> { let Latency = 1; }
82753f127fSDimitry Andricdef N2Write_2cyc_1M   : SchedWriteRes<[N2UnitM]>   { let Latency = 2; }
83753f127fSDimitry Andricdef N2Write_3cyc_1M   : SchedWriteRes<[N2UnitM]>   { let Latency = 3; }
84753f127fSDimitry Andricdef N2Write_2cyc_1M0  : SchedWriteRes<[N2UnitM0]>  { let Latency = 2;
855f757f3fSDimitry Andric                                                     let ReleaseAtCycles = [2]; }
86753f127fSDimitry Andricdef N2Write_3cyc_1M0  : SchedWriteRes<[N2UnitM0]>  { let Latency = 3;
875f757f3fSDimitry Andric                                                     let ReleaseAtCycles = [3]; }
88753f127fSDimitry Andricdef N2Write_5cyc_1M0  : SchedWriteRes<[N2UnitM0]>  { let Latency = 5;
895f757f3fSDimitry Andric                                                     let ReleaseAtCycles = [5]; }
90753f127fSDimitry Andricdef N2Write_12cyc_1M0 : SchedWriteRes<[N2UnitM0]>  { let Latency = 12;
915f757f3fSDimitry Andric                                                     let ReleaseAtCycles = [12]; }
92753f127fSDimitry Andricdef N2Write_20cyc_1M0 : SchedWriteRes<[N2UnitM0]>  { let Latency = 20;
935f757f3fSDimitry Andric                                                     let ReleaseAtCycles = [20]; }
94753f127fSDimitry Andricdef N2Write_4cyc_1L   : SchedWriteRes<[N2UnitL]>   { let Latency = 4; }
95753f127fSDimitry Andricdef N2Write_6cyc_1L   : SchedWriteRes<[N2UnitL]>   { let Latency = 6; }
96753f127fSDimitry Andricdef N2Write_2cyc_1V   : SchedWriteRes<[N2UnitV]>   { let Latency = 2; }
97753f127fSDimitry Andricdef N2Write_3cyc_1V   : SchedWriteRes<[N2UnitV]>   { let Latency = 3; }
98753f127fSDimitry Andricdef N2Write_4cyc_1V   : SchedWriteRes<[N2UnitV]>   { let Latency = 4; }
99753f127fSDimitry Andricdef N2Write_5cyc_1V   : SchedWriteRes<[N2UnitV]>   { let Latency = 5; }
100753f127fSDimitry Andricdef N2Write_12cyc_1V  : SchedWriteRes<[N2UnitV]>   { let Latency = 12; }
101753f127fSDimitry Andricdef N2Write_2cyc_1V0  : SchedWriteRes<[N2UnitV0]>  { let Latency = 2; }
102753f127fSDimitry Andricdef N2Write_3cyc_1V0  : SchedWriteRes<[N2UnitV0]>  { let Latency = 3; }
103753f127fSDimitry Andricdef N2Write_4cyc_1V0  : SchedWriteRes<[N2UnitV0]>  { let Latency = 4; }
104753f127fSDimitry Andricdef N2Write_7cyc_1V0  : SchedWriteRes<[N2UnitV0]>  { let Latency = 7;
1055f757f3fSDimitry Andric                                                     let ReleaseAtCycles = [7]; }
106753f127fSDimitry Andricdef N2Write_9cyc_1V0  : SchedWriteRes<[N2UnitV0]>  { let Latency = 9; }
107753f127fSDimitry Andricdef N2Write_10cyc_1V0 : SchedWriteRes<[N2UnitV0]>  { let Latency = 10; }
108753f127fSDimitry Andricdef N2Write_12cyc_1V0 : SchedWriteRes<[N2UnitV0]>  { let Latency = 12; }
109753f127fSDimitry Andricdef N2Write_13cyc_1V0 : SchedWriteRes<[N2UnitV0]>  { let Latency = 13; }
110753f127fSDimitry Andricdef N2Write_15cyc_1V0 : SchedWriteRes<[N2UnitV0]>  { let Latency = 15; }
111753f127fSDimitry Andricdef N2Write_16cyc_1V0 : SchedWriteRes<[N2UnitV0]>  { let Latency = 16; }
112753f127fSDimitry Andricdef N2Write_20cyc_1V0 : SchedWriteRes<[N2UnitV0]>  { let Latency = 20; }
113753f127fSDimitry Andricdef N2Write_2cyc_1V1  : SchedWriteRes<[N2UnitV1]>  { let Latency = 2; }
114753f127fSDimitry Andricdef N2Write_3cyc_1V1  : SchedWriteRes<[N2UnitV1]>  { let Latency = 3; }
115753f127fSDimitry Andricdef N2Write_4cyc_1V1  : SchedWriteRes<[N2UnitV1]>  { let Latency = 4; }
116753f127fSDimitry Andricdef N2Write_6cyc_1V1  : SchedWriteRes<[N2UnitV1]>  { let Latency = 6; }
117753f127fSDimitry Andricdef N2Write_10cyc_1V1 : SchedWriteRes<[N2UnitV1]>  { let Latency = 10; }
118753f127fSDimitry Andricdef N2Write_6cyc_1L01 : SchedWriteRes<[N2UnitL01]> { let Latency = 6; }
119753f127fSDimitry Andric
120753f127fSDimitry Andric//===----------------------------------------------------------------------===//
121753f127fSDimitry Andric// Define generic 2 micro-op types
122753f127fSDimitry Andric
123753f127fSDimitry Andricdef N2Write_1cyc_1B_1S : SchedWriteRes<[N2UnitB, N2UnitS]> {
124753f127fSDimitry Andric  let Latency     = 1;
125753f127fSDimitry Andric  let NumMicroOps = 2;
126753f127fSDimitry Andric}
127753f127fSDimitry Andric
128753f127fSDimitry Andricdef N2Write_6cyc_1M0_1B : SchedWriteRes<[N2UnitM0, N2UnitB]> {
129753f127fSDimitry Andric  let Latency     = 6;
130753f127fSDimitry Andric  let NumMicroOps = 2;
131753f127fSDimitry Andric}
132753f127fSDimitry Andric
133753f127fSDimitry Andricdef N2Write_9cyc_1M0_1L : SchedWriteRes<[N2UnitM0, N2UnitL]> {
134753f127fSDimitry Andric  let Latency     = 9;
135753f127fSDimitry Andric  let NumMicroOps = 2;
136753f127fSDimitry Andric}
137753f127fSDimitry Andric
138753f127fSDimitry Andricdef N2Write_3cyc_1I_1M : SchedWriteRes<[N2UnitI, N2UnitM]> {
139753f127fSDimitry Andric  let Latency     = 3;
140753f127fSDimitry Andric  let NumMicroOps = 2;
141753f127fSDimitry Andric}
142753f127fSDimitry Andric
143753f127fSDimitry Andricdef N2Write_4cyc_1I_1L : SchedWriteRes<[N2UnitI, N2UnitL]> {
144753f127fSDimitry Andric  let Latency     = 4;
145753f127fSDimitry Andric  let NumMicroOps = 2;
146753f127fSDimitry Andric}
147753f127fSDimitry Andric
148753f127fSDimitry Andricdef N2Write_5cyc_1I_1L : SchedWriteRes<[N2UnitI, N2UnitL]> {
149753f127fSDimitry Andric  let Latency     = 5;
150753f127fSDimitry Andric  let NumMicroOps = 2;
151753f127fSDimitry Andric}
152753f127fSDimitry Andric
153753f127fSDimitry Andricdef N2Write_6cyc_1I_1L : SchedWriteRes<[N2UnitI, N2UnitL]> {
154753f127fSDimitry Andric  let Latency     = 6;
155753f127fSDimitry Andric  let NumMicroOps = 2;
156753f127fSDimitry Andric}
157753f127fSDimitry Andric
158753f127fSDimitry Andricdef N2Write_7cyc_1I_1L : SchedWriteRes<[N2UnitI, N2UnitL]> {
159753f127fSDimitry Andric  let Latency     = 7;
160753f127fSDimitry Andric  let NumMicroOps = 2;
161753f127fSDimitry Andric}
162753f127fSDimitry Andric
163753f127fSDimitry Andricdef N2Write_1cyc_1L01_1D : SchedWriteRes<[N2UnitL01, N2UnitD]> {
164753f127fSDimitry Andric  let Latency     = 1;
165753f127fSDimitry Andric  let NumMicroOps = 2;
166753f127fSDimitry Andric}
167753f127fSDimitry Andric
168753f127fSDimitry Andricdef N2Write_5cyc_1M0_1V : SchedWriteRes<[N2UnitM0, N2UnitV]> {
169753f127fSDimitry Andric  let Latency     = 5;
170753f127fSDimitry Andric  let NumMicroOps = 2;
171753f127fSDimitry Andric}
172753f127fSDimitry Andric
173753f127fSDimitry Andricdef N2Write_2cyc_1L01_1V : SchedWriteRes<[N2UnitL01, N2UnitV]> {
174753f127fSDimitry Andric  let Latency     = 2;
175753f127fSDimitry Andric  let NumMicroOps = 2;
176753f127fSDimitry Andric}
177753f127fSDimitry Andric
178753f127fSDimitry Andricdef N2Write_4cyc_1V1_1V : SchedWriteRes<[N2UnitV1, N2UnitV]> {
179753f127fSDimitry Andric  let Latency     = 4;
180753f127fSDimitry Andric  let NumMicroOps = 2;
181753f127fSDimitry Andric}
182753f127fSDimitry Andric
183753f127fSDimitry Andricdef N2Write_4cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> {
184753f127fSDimitry Andric  let Latency     = 4;
185753f127fSDimitry Andric  let NumMicroOps = 2;
186753f127fSDimitry Andric}
187753f127fSDimitry Andric
188753f127fSDimitry Andricdef N2Write_10cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> {
189753f127fSDimitry Andric  let Latency = 10;
190753f127fSDimitry Andric  let NumMicroOps = 2;
1915f757f3fSDimitry Andric  let ReleaseAtCycles = [5, 5];
192753f127fSDimitry Andric}
193753f127fSDimitry Andric
194753f127fSDimitry Andricdef N2Write_13cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> {
195753f127fSDimitry Andric  let Latency = 13;
196753f127fSDimitry Andric  let NumMicroOps = 2;
1975f757f3fSDimitry Andric  let ReleaseAtCycles = [6, 7];
198753f127fSDimitry Andric}
199753f127fSDimitry Andric
200753f127fSDimitry Andricdef N2Write_15cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> {
201753f127fSDimitry Andric  let Latency = 15;
202753f127fSDimitry Andric  let NumMicroOps = 2;
2035f757f3fSDimitry Andric  let ReleaseAtCycles = [7, 8];
204753f127fSDimitry Andric}
205753f127fSDimitry Andric
206753f127fSDimitry Andricdef N2Write_16cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> {
207753f127fSDimitry Andric  let Latency = 16;
208753f127fSDimitry Andric  let NumMicroOps = 2;
2095f757f3fSDimitry Andric  let ReleaseAtCycles = [8, 8];
210753f127fSDimitry Andric}
211753f127fSDimitry Andric
212753f127fSDimitry Andricdef N2Write_4cyc_2V : SchedWriteRes<[N2UnitV, N2UnitV]> {
213753f127fSDimitry Andric  let Latency     = 4;
214753f127fSDimitry Andric  let NumMicroOps = 2;
215753f127fSDimitry Andric}
216753f127fSDimitry Andric
217753f127fSDimitry Andricdef N2Write_6cyc_2V : SchedWriteRes<[N2UnitV, N2UnitV]> {
218753f127fSDimitry Andric  let Latency     = 6;
219753f127fSDimitry Andric  let NumMicroOps = 2;
220753f127fSDimitry Andric}
221753f127fSDimitry Andric
222753f127fSDimitry Andricdef N2Write_6cyc_2L : SchedWriteRes<[N2UnitL, N2UnitL]> {
223753f127fSDimitry Andric  let Latency     = 6;
224753f127fSDimitry Andric  let NumMicroOps = 2;
225753f127fSDimitry Andric}
226753f127fSDimitry Andric
227753f127fSDimitry Andricdef N2Write_8cyc_1L_1V : SchedWriteRes<[N2UnitL, N2UnitV]> {
228753f127fSDimitry Andric  let Latency     = 8;
229753f127fSDimitry Andric  let NumMicroOps = 2;
230753f127fSDimitry Andric}
231753f127fSDimitry Andric
232753f127fSDimitry Andricdef N2Write_4cyc_1L01_1V : SchedWriteRes<[N2UnitL01, N2UnitV]> {
233753f127fSDimitry Andric  let Latency     = 4;
234753f127fSDimitry Andric  let NumMicroOps = 2;
235753f127fSDimitry Andric}
236753f127fSDimitry Andric
237753f127fSDimitry Andricdef N2Write_3cyc_1M0_1M  : SchedWriteRes<[N2UnitM0, N2UnitM]> {
238753f127fSDimitry Andric  let Latency     = 3;
239753f127fSDimitry Andric  let NumMicroOps = 2;
240753f127fSDimitry Andric}
241753f127fSDimitry Andric
242753f127fSDimitry Andricdef N2Write_2cyc_1M0_1M  : SchedWriteRes<[N2UnitM0, N2UnitM]> {
243753f127fSDimitry Andric  let Latency     = 2;
244753f127fSDimitry Andric  let NumMicroOps = 2;
245753f127fSDimitry Andric}
246753f127fSDimitry Andric
247753f127fSDimitry Andricdef N2Write_6cyc_2V1 : SchedWriteRes<[N2UnitV1, N2UnitV1]> {
248753f127fSDimitry Andric  let Latency     = 6;
249753f127fSDimitry Andric  let NumMicroOps = 2;
250753f127fSDimitry Andric}
251753f127fSDimitry Andric
252753f127fSDimitry Andricdef N2Write_4cyc_1V0_1M : SchedWriteRes<[N2UnitV0, N2UnitM]> {
253753f127fSDimitry Andric  let Latency     = 4;
254753f127fSDimitry Andric  let NumMicroOps = 2;
255753f127fSDimitry Andric}
256753f127fSDimitry Andric
257753f127fSDimitry Andricdef N2Write_5cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> {
258753f127fSDimitry Andric  let Latency     = 5;
259753f127fSDimitry Andric  let NumMicroOps = 2;
260753f127fSDimitry Andric}
261753f127fSDimitry Andric
262753f127fSDimitry Andricdef N2Write_5cyc_1V1_1M0 : SchedWriteRes<[N2UnitV1, N2UnitM0]> {
263753f127fSDimitry Andric  let Latency     = 5;
264753f127fSDimitry Andric  let NumMicroOps = 2;
265753f127fSDimitry Andric}
266753f127fSDimitry Andric
267753f127fSDimitry Andricdef N2Write_7cyc_1M0_1V0 : SchedWriteRes<[N2UnitM0, N2UnitV0]> {
268753f127fSDimitry Andric  let Latency     = 7;
269753f127fSDimitry Andric  let NumMicroOps = 2;
270753f127fSDimitry Andric}
271753f127fSDimitry Andric
272753f127fSDimitry Andricdef N2Write_2cyc_1V0_1M : SchedWriteRes<[N2UnitV0, N2UnitM]> {
273753f127fSDimitry Andric  let Latency     = 2;
274753f127fSDimitry Andric  let NumMicroOps = 2;
275753f127fSDimitry Andric}
276753f127fSDimitry Andric
277753f127fSDimitry Andricdef N2Write_6cyc_1V_1V1 : SchedWriteRes<[N2UnitV, N2UnitV1]> {
278753f127fSDimitry Andric  let Latency     = 6;
279753f127fSDimitry Andric  let NumMicroOps = 2;
280753f127fSDimitry Andric}
281753f127fSDimitry Andric
282753f127fSDimitry Andricdef N2Write_6cyc_1L_1M : SchedWriteRes<[N2UnitL, N2UnitM]> {
283753f127fSDimitry Andric  let Latency     = 6;
284753f127fSDimitry Andric  let NumMicroOps = 2;
285753f127fSDimitry Andric}
286753f127fSDimitry Andric
287753f127fSDimitry Andricdef N2Write_6cyc_1L_1S : SchedWriteRes<[N2UnitL, N2UnitS]> {
288753f127fSDimitry Andric  let Latency     = 6;
289753f127fSDimitry Andric  let NumMicroOps = 2;
290753f127fSDimitry Andric}
291753f127fSDimitry Andric
292753f127fSDimitry Andricdef N2Write_9cyc_1L_1V : SchedWriteRes<[N2UnitL, N2UnitV]> {
293753f127fSDimitry Andric  let Latency     = 9;
294753f127fSDimitry Andric  let NumMicroOps = 2;
295753f127fSDimitry Andric}
296753f127fSDimitry Andric
297753f127fSDimitry Andricdef N2Write_4cyc_2V1 : SchedWriteRes<[N2UnitV1, N2UnitV1]> {
298753f127fSDimitry Andric  let Latency     = 4;
299753f127fSDimitry Andric  let NumMicroOps = 2;
300753f127fSDimitry Andric}
301753f127fSDimitry Andric
302753f127fSDimitry Andric//===----------------------------------------------------------------------===//
303753f127fSDimitry Andric// Define generic 3 micro-op types
304753f127fSDimitry Andric
305753f127fSDimitry Andricdef N2Write_1cyc_1L01_1D_1I : SchedWriteRes<[N2UnitL01, N2UnitD, N2UnitI]> {
306753f127fSDimitry Andric  let Latency     = 1;
307753f127fSDimitry Andric  let NumMicroOps = 3;
308753f127fSDimitry Andric}
309753f127fSDimitry Andric
310753f127fSDimitry Andricdef N2Write_2cyc_1L01_1V_1I : SchedWriteRes<[N2UnitL01, N2UnitV, N2UnitI]> {
311753f127fSDimitry Andric  let Latency     = 2;
312753f127fSDimitry Andric  let NumMicroOps = 3;
313753f127fSDimitry Andric}
314753f127fSDimitry Andric
315753f127fSDimitry Andricdef N2Write_2cyc_1L01_2V : SchedWriteRes<[N2UnitL01, N2UnitV, N2UnitV]> {
316753f127fSDimitry Andric  let Latency     = 2;
317753f127fSDimitry Andric  let NumMicroOps = 3;
318753f127fSDimitry Andric}
319753f127fSDimitry Andric
320753f127fSDimitry Andricdef N2Write_7cyc_1M_1M0_1V : SchedWriteRes<[N2UnitM, N2UnitM0, N2UnitV]> {
321753f127fSDimitry Andric  let Latency     = 7;
322753f127fSDimitry Andric  let NumMicroOps = 3;
323753f127fSDimitry Andric}
324753f127fSDimitry Andric
325753f127fSDimitry Andricdef N2Write_8cyc_1M0_1V1_1V : SchedWriteRes<[N2UnitM0, N2UnitV1, N2UnitV]> {
326753f127fSDimitry Andric  let Latency     = 8;
327753f127fSDimitry Andric  let NumMicroOps = 3;
328753f127fSDimitry Andric}
329753f127fSDimitry Andric
330753f127fSDimitry Andricdef N2Write_10cyc_1V_1L_1S : SchedWriteRes<[N2UnitV, N2UnitL, N2UnitL]> {
331753f127fSDimitry Andric  let Latency     = 10;
332753f127fSDimitry Andric  let NumMicroOps = 3;
333753f127fSDimitry Andric}
334753f127fSDimitry Andric
335753f127fSDimitry Andricdef N2Write_2cyc_1L01_1S_1V : SchedWriteRes<[N2UnitL01, N2UnitS, N2UnitV]> {
336753f127fSDimitry Andric  let Latency     = 2;
337753f127fSDimitry Andric  let NumMicroOps = 3;
338753f127fSDimitry Andric}
339753f127fSDimitry Andric
340753f127fSDimitry Andricdef N2Write_4cyc_1L01_1S_1V : SchedWriteRes<[N2UnitL01, N2UnitS, N2UnitV]> {
341753f127fSDimitry Andric  let Latency     = 4;
342753f127fSDimitry Andric  let NumMicroOps = 3;
343753f127fSDimitry Andric}
344753f127fSDimitry Andric
345753f127fSDimitry Andricdef N2Write_6cyc_3L : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL]> {
346753f127fSDimitry Andric  let Latency     = 6;
347753f127fSDimitry Andric  let NumMicroOps = 3;
348753f127fSDimitry Andric}
349753f127fSDimitry Andric
350753f127fSDimitry Andricdef N2Write_8cyc_1L_2V : SchedWriteRes<[N2UnitL, N2UnitV, N2UnitV]> {
351753f127fSDimitry Andric  let Latency     = 8;
352753f127fSDimitry Andric  let NumMicroOps = 3;
353753f127fSDimitry Andric}
354753f127fSDimitry Andric
355753f127fSDimitry Andric//===----------------------------------------------------------------------===//
356753f127fSDimitry Andric// Define generic 4 micro-op types
357753f127fSDimitry Andric
358753f127fSDimitry Andricdef N2Write_2cyc_1L01_2V_1I : SchedWriteRes<[N2UnitL01, N2UnitV, N2UnitV,
359753f127fSDimitry Andric                                             N2UnitI]> {
360753f127fSDimitry Andric  let Latency     = 2;
361753f127fSDimitry Andric  let NumMicroOps = 4;
362753f127fSDimitry Andric}
363753f127fSDimitry Andric
364753f127fSDimitry Andricdef N2Write_6cyc_4V0 : SchedWriteRes<[N2UnitV0, N2UnitV0, N2UnitV0, N2UnitV0]> {
365753f127fSDimitry Andric  let Latency     = 6;
366753f127fSDimitry Andric  let NumMicroOps = 4;
367753f127fSDimitry Andric}
368753f127fSDimitry Andric
369753f127fSDimitry Andricdef N2Write_4cyc_4V : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV, N2UnitV]> {
370753f127fSDimitry Andric  let Latency     = 4;
371753f127fSDimitry Andric  let NumMicroOps = 4;
372753f127fSDimitry Andric}
373753f127fSDimitry Andric
374753f127fSDimitry Andricdef N2Write_6cyc_4V : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV, N2UnitV]> {
375753f127fSDimitry Andric  let Latency     = 6;
376753f127fSDimitry Andric  let NumMicroOps = 4;
377753f127fSDimitry Andric}
378753f127fSDimitry Andric
379753f127fSDimitry Andricdef N2Write_8cyc_2L_2V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitV, N2UnitV]> {
380753f127fSDimitry Andric  let Latency     = 8;
381753f127fSDimitry Andric  let NumMicroOps = 4;
382753f127fSDimitry Andric}
383753f127fSDimitry Andric
384753f127fSDimitry Andricdef N2Write_9cyc_2L_2V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitV, N2UnitV]> {
385753f127fSDimitry Andric  let Latency     = 9;
386753f127fSDimitry Andric  let NumMicroOps = 4;
387753f127fSDimitry Andric}
388753f127fSDimitry Andric
389753f127fSDimitry Andricdef N2Write_2cyc_2L01_2V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitV,
390753f127fSDimitry Andric                                          N2UnitV]> {
391753f127fSDimitry Andric  let Latency     = 2;
392753f127fSDimitry Andric  let NumMicroOps = 4;
393753f127fSDimitry Andric}
394753f127fSDimitry Andric
395753f127fSDimitry Andricdef N2Write_4cyc_2L01_2V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitV,
396753f127fSDimitry Andric                                          N2UnitV]> {
397753f127fSDimitry Andric  let Latency     = 4;
398753f127fSDimitry Andric  let NumMicroOps = 4;
399753f127fSDimitry Andric}
400753f127fSDimitry Andric
401753f127fSDimitry Andricdef N2Write_5cyc_2L01_2V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitV,
402753f127fSDimitry Andric                                          N2UnitV]> {
403753f127fSDimitry Andric  let Latency     = 5;
404753f127fSDimitry Andric  let NumMicroOps = 4;
405753f127fSDimitry Andric}
406753f127fSDimitry Andric
407753f127fSDimitry Andricdef N2Write_8cyc_2M0_2V0 : SchedWriteRes<[N2UnitM0, N2UnitM0, N2UnitV0,
408753f127fSDimitry Andric                                          N2UnitV0]> {
409753f127fSDimitry Andric  let Latency     = 8;
410753f127fSDimitry Andric  let NumMicroOps = 4;
411753f127fSDimitry Andric}
412753f127fSDimitry Andric
413753f127fSDimitry Andricdef N2Write_11cyc_2V_2V1 : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV1,
414753f127fSDimitry Andric                                          N2UnitV1]> {
415753f127fSDimitry Andric  let Latency     = 11;
416753f127fSDimitry Andric  let NumMicroOps = 4;
417753f127fSDimitry Andric}
418753f127fSDimitry Andric
419753f127fSDimitry Andricdef N2Write_9cyc_2V_2V1 : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV1,
420753f127fSDimitry Andric                                         N2UnitV1]> {
421753f127fSDimitry Andric  let Latency     = 9;
422753f127fSDimitry Andric  let NumMicroOps = 4;
423753f127fSDimitry Andric}
424753f127fSDimitry Andric
425753f127fSDimitry Andricdef N2Write_8cyc_2V_2V1 : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV1,
426753f127fSDimitry Andric                                         N2UnitV1]> {
427753f127fSDimitry Andric  let Latency     = 8;
428753f127fSDimitry Andric  let NumMicroOps = 4;
429753f127fSDimitry Andric}
430753f127fSDimitry Andric
431753f127fSDimitry Andricdef N2Write_10cyc_2L_2V1 : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV1,
432753f127fSDimitry Andric                                          N2UnitV1]> {
433753f127fSDimitry Andric  let Latency     = 10;
434753f127fSDimitry Andric  let NumMicroOps = 4;
435753f127fSDimitry Andric}
436753f127fSDimitry Andric
437753f127fSDimitry Andricdef N2Write_10cyc_2L_2V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitV, N2UnitV]> {
438753f127fSDimitry Andric  let Latency     = 10;
439753f127fSDimitry Andric  let NumMicroOps = 4;
440753f127fSDimitry Andric}
441753f127fSDimitry Andric
442753f127fSDimitry Andricdef N2Write_4cyc_2M0_2M : SchedWriteRes<[N2UnitM0, N2UnitM0, N2UnitM,
443753f127fSDimitry Andric                                         N2UnitM]> {
444753f127fSDimitry Andric  let Latency     = 4;
445753f127fSDimitry Andric  let NumMicroOps = 4;
446753f127fSDimitry Andric}
447753f127fSDimitry Andric
448753f127fSDimitry Andricdef N2Write_6cyc_2I_2L : SchedWriteRes<[N2UnitI, N2UnitI, N2UnitL, N2UnitL]> {
449753f127fSDimitry Andric  let Latency     = 6;
450753f127fSDimitry Andric  let NumMicroOps = 4;
451753f127fSDimitry Andric}
452753f127fSDimitry Andric
453753f127fSDimitry Andricdef N2Write_7cyc_4L : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL, N2UnitL]> {
454753f127fSDimitry Andric  let Latency     = 7;
455753f127fSDimitry Andric  let NumMicroOps = 4;
456753f127fSDimitry Andric}
457753f127fSDimitry Andric
458753f127fSDimitry Andric//===----------------------------------------------------------------------===//
459753f127fSDimitry Andric// Define generic 5 micro-op types
460753f127fSDimitry Andric
461753f127fSDimitry Andricdef N2Write_2cyc_1L01_2V_2I : SchedWriteRes<[N2UnitL01, N2UnitV, N2UnitV,
462753f127fSDimitry Andric                                             N2UnitI, N2UnitI]> {
463753f127fSDimitry Andric  let Latency     = 2;
464753f127fSDimitry Andric  let NumMicroOps = 5;
465753f127fSDimitry Andric}
466753f127fSDimitry Andric
467753f127fSDimitry Andricdef N2Write_8cyc_2L_3V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitV, N2UnitV,
468753f127fSDimitry Andric                                        N2UnitV]> {
469753f127fSDimitry Andric  let Latency     = 8;
470753f127fSDimitry Andric  let NumMicroOps = 5;
471753f127fSDimitry Andric}
472753f127fSDimitry Andric
473753f127fSDimitry Andric//===----------------------------------------------------------------------===//
474753f127fSDimitry Andric// Define generic 6 micro-op types
475753f127fSDimitry Andric
476753f127fSDimitry Andricdef N2Write_8cyc_3L_3V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL,
477753f127fSDimitry Andric                                        N2UnitV, N2UnitV, N2UnitV]> {
478753f127fSDimitry Andric  let Latency     = 8;
479753f127fSDimitry Andric  let NumMicroOps = 6;
480753f127fSDimitry Andric}
481753f127fSDimitry Andric
482753f127fSDimitry Andricdef N2Write_2cyc_3L01_3V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01,
483753f127fSDimitry Andric                                          N2UnitV, N2UnitV, N2UnitV]> {
484753f127fSDimitry Andric  let Latency     = 2;
485753f127fSDimitry Andric  let NumMicroOps = 6;
486753f127fSDimitry Andric}
487753f127fSDimitry Andric
488753f127fSDimitry Andricdef N2Write_6cyc_3L01_3V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01,
489753f127fSDimitry Andric                                          N2UnitV, N2UnitV, N2UnitV]> {
490753f127fSDimitry Andric  let Latency     = 6;
491753f127fSDimitry Andric  let NumMicroOps = 6;
492753f127fSDimitry Andric}
493753f127fSDimitry Andric
494753f127fSDimitry Andricdef N2Write_4cyc_3L01_3V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01,
495753f127fSDimitry Andric                                          N2UnitV, N2UnitV, N2UnitV]> {
496753f127fSDimitry Andric  let Latency     = 4;
497753f127fSDimitry Andric  let NumMicroOps = 6;
498753f127fSDimitry Andric}
499753f127fSDimitry Andric
500753f127fSDimitry Andricdef N2Write_10cyc_2L_2V_2S : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitV, N2UnitV,
501753f127fSDimitry Andric                                            N2UnitS, N2UnitS]> {
502753f127fSDimitry Andric  let Latency     = 10;
503753f127fSDimitry Andric  let NumMicroOps = 6;
504753f127fSDimitry Andric}
505753f127fSDimitry Andric
506753f127fSDimitry Andric//===----------------------------------------------------------------------===//
507753f127fSDimitry Andric// Define generic 7 micro-op types
508753f127fSDimitry Andric
509753f127fSDimitry Andricdef N2Write_8cyc_3L_4V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL,
510753f127fSDimitry Andric                                        N2UnitV, N2UnitV, N2UnitV, N2UnitV]> {
511753f127fSDimitry Andric  let Latency     = 8;
512753f127fSDimitry Andric  let NumMicroOps = 7;
513753f127fSDimitry Andric}
514753f127fSDimitry Andric
515753f127fSDimitry Andric//===----------------------------------------------------------------------===//
516753f127fSDimitry Andric// Define generic 8 micro-op types
517753f127fSDimitry Andric
518753f127fSDimitry Andricdef N2Write_6cyc_8V : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV, N2UnitV,
519753f127fSDimitry Andric                                     N2UnitV, N2UnitV, N2UnitV, N2UnitV]> {
520753f127fSDimitry Andric  let Latency     = 6;
521753f127fSDimitry Andric  let NumMicroOps = 8;
522753f127fSDimitry Andric}
523753f127fSDimitry Andric
524753f127fSDimitry Andricdef N2Write_2cyc_4L01_4V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01,
525753f127fSDimitry Andric                                          N2UnitL01, N2UnitV, N2UnitV, N2UnitV,
526753f127fSDimitry Andric                                          N2UnitV]> {
527753f127fSDimitry Andric  let Latency     = 2;
528753f127fSDimitry Andric  let NumMicroOps = 8;
529753f127fSDimitry Andric}
530753f127fSDimitry Andric
531753f127fSDimitry Andricdef N2Write_5cyc_4L01_4V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01,
532753f127fSDimitry Andric                                          N2UnitL01, N2UnitV, N2UnitV, N2UnitV,
533753f127fSDimitry Andric                                          N2UnitV]> {
534753f127fSDimitry Andric  let Latency     = 5;
535753f127fSDimitry Andric  let NumMicroOps = 8;
536753f127fSDimitry Andric}
537753f127fSDimitry Andric
538753f127fSDimitry Andricdef N2Write_8cyc_4L_4V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL, N2UnitL,
539753f127fSDimitry Andric                                        N2UnitV, N2UnitV, N2UnitV, N2UnitV]> {
540753f127fSDimitry Andric  let Latency     = 8;
541753f127fSDimitry Andric  let NumMicroOps = 8;
542753f127fSDimitry Andric}
543753f127fSDimitry Andric
544753f127fSDimitry Andricdef N2Write_9cyc_4L_4V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL, N2UnitL,
545753f127fSDimitry Andric                                        N2UnitV, N2UnitV, N2UnitV, N2UnitV]> {
546753f127fSDimitry Andric  let Latency     = 9;
547753f127fSDimitry Andric  let NumMicroOps = 8;
548753f127fSDimitry Andric}
549753f127fSDimitry Andric
550753f127fSDimitry Andric//===----------------------------------------------------------------------===//
551753f127fSDimitry Andric// Define generic 10 micro-op types
552753f127fSDimitry Andric
553753f127fSDimitry Andricdef N2Write_7cyc_5L01_5V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01,
554753f127fSDimitry Andric                                          N2UnitL01, N2UnitL01, N2UnitV,
555753f127fSDimitry Andric                                          N2UnitV, N2UnitV, N2UnitV, N2UnitV]> {
556753f127fSDimitry Andric  let Latency     = 7;
557753f127fSDimitry Andric  let NumMicroOps = 10;
558753f127fSDimitry Andric}
559753f127fSDimitry Andric
560753f127fSDimitry Andric//===----------------------------------------------------------------------===//
561753f127fSDimitry Andric// Define generic 12 micro-op types
562753f127fSDimitry Andric
563753f127fSDimitry Andricdef N2Write_7cyc_6L01_6V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01,
564753f127fSDimitry Andric                                          N2UnitL01, N2UnitL01, N2UnitL01,
565753f127fSDimitry Andric                                          N2UnitV, N2UnitV, N2UnitV, N2UnitV,
566753f127fSDimitry Andric                                          N2UnitV, N2UnitV]> {
567753f127fSDimitry Andric  let Latency     = 7;
568753f127fSDimitry Andric  let NumMicroOps = 12;
569753f127fSDimitry Andric}
570753f127fSDimitry Andric
571753f127fSDimitry Andric//===----------------------------------------------------------------------===//
572753f127fSDimitry Andric// Define generic 15 micro-op types
573753f127fSDimitry Andric
574753f127fSDimitry Andricdef N2Write_7cyc_5L01_5S_5V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01,
575753f127fSDimitry Andric                                             N2UnitL01, N2UnitL01, N2UnitS,
576753f127fSDimitry Andric                                             N2UnitS, N2UnitS, N2UnitS,
577753f127fSDimitry Andric                                             N2UnitS, N2UnitV, N2UnitV,
578753f127fSDimitry Andric                                             N2UnitV, N2UnitV, N2UnitV]> {
579753f127fSDimitry Andric  let Latency     = 7;
580753f127fSDimitry Andric  let NumMicroOps = 15;
581753f127fSDimitry Andric}
582753f127fSDimitry Andric
583753f127fSDimitry Andric//===----------------------------------------------------------------------===//
584753f127fSDimitry Andric// Define generic 18 micro-op types
585753f127fSDimitry Andric
586753f127fSDimitry Andricdef N2Write_11cyc_9L01_9V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01,
587753f127fSDimitry Andric                                           N2UnitL01, N2UnitL01, N2UnitL01,
588753f127fSDimitry Andric                                           N2UnitL01, N2UnitL01, N2UnitL01,
589753f127fSDimitry Andric                                           N2UnitV, N2UnitV, N2UnitV,
590753f127fSDimitry Andric                                           N2UnitV, N2UnitV, N2UnitV,
591753f127fSDimitry Andric                                           N2UnitV, N2UnitV, N2UnitV]> {
592753f127fSDimitry Andric  let Latency     = 11;
593753f127fSDimitry Andric  let NumMicroOps = 18;
594753f127fSDimitry Andric}
595753f127fSDimitry Andric
596753f127fSDimitry Andric//===----------------------------------------------------------------------===//
597753f127fSDimitry Andric// Define generic 27 micro-op types
598753f127fSDimitry Andric
599753f127fSDimitry Andricdef N2Write_11cyc_9L01_9S_9V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01,
600753f127fSDimitry Andric                                              N2UnitL01, N2UnitL01, N2UnitL01,
601753f127fSDimitry Andric                                              N2UnitL01, N2UnitL01, N2UnitL01,
602753f127fSDimitry Andric                                              N2UnitS, N2UnitS, N2UnitS,
603753f127fSDimitry Andric                                              N2UnitS, N2UnitS, N2UnitS,
604753f127fSDimitry Andric                                              N2UnitS, N2UnitS, N2UnitS,
605753f127fSDimitry Andric                                              N2UnitV, N2UnitV, N2UnitV,
606753f127fSDimitry Andric                                              N2UnitV, N2UnitV, N2UnitV,
607753f127fSDimitry Andric                                              N2UnitV, N2UnitV, N2UnitV]> {
608753f127fSDimitry Andric  let Latency     = 11;
609753f127fSDimitry Andric  let NumMicroOps = 27;
610753f127fSDimitry Andric}
611753f127fSDimitry Andric
61206c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
61306c3fb27SDimitry Andric// Define types for arithmetic and logical ops with short shifts
61406c3fb27SDimitry Andricdef N2Write_Arith : SchedWriteVariant<[
61506c3fb27SDimitry Andric                      SchedVar<IsCheapLSL,  [N2Write_1cyc_1I]>,
61606c3fb27SDimitry Andric                      SchedVar<NoSchedPred, [N2Write_2cyc_1M]>]>;
61706c3fb27SDimitry Andric
61806c3fb27SDimitry Andricdef N2Write_Logical: SchedWriteVariant<[
61906c3fb27SDimitry Andric                       SchedVar<NeoverseNoLSL, [N2Write_1cyc_1I]>,
62006c3fb27SDimitry Andric                       SchedVar<NoSchedPred,   [N2Write_2cyc_1M]>]>;
62106c3fb27SDimitry Andric
622753f127fSDimitry Andric// Miscellaneous
623753f127fSDimitry Andric// -----------------------------------------------------------------------------
624753f127fSDimitry Andric
625753f127fSDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>;
626753f127fSDimitry Andric
627753f127fSDimitry Andric// Branch Instructions
628753f127fSDimitry Andric// -----------------------------------------------------------------------------
629753f127fSDimitry Andric
630753f127fSDimitry Andric// Branch, immed
631753f127fSDimitry Andric// Compare and branch
632753f127fSDimitry Andricdef : SchedAlias<WriteBr,    N2Write_1cyc_1B>;
633753f127fSDimitry Andric
634753f127fSDimitry Andric// Branch, register
635753f127fSDimitry Andricdef : SchedAlias<WriteBrReg, N2Write_1cyc_1B>;
636753f127fSDimitry Andric
637753f127fSDimitry Andric// Branch and link, immed
638753f127fSDimitry Andric// Branch and link, register
639753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1B_1S], (instrs BL, BLR)>;
640753f127fSDimitry Andric
641753f127fSDimitry Andric// Arithmetic and Logical Instructions
642753f127fSDimitry Andric// -----------------------------------------------------------------------------
643753f127fSDimitry Andric
644753f127fSDimitry Andric// ALU, basic
645753f127fSDimitry Andric// ALU, basic, flagset
646753f127fSDimitry Andricdef : SchedAlias<WriteI,     N2Write_1cyc_1I>;
647753f127fSDimitry Andric
648753f127fSDimitry Andric// ALU, extend and shift
649753f127fSDimitry Andricdef : SchedAlias<WriteIEReg, N2Write_2cyc_1M>;
650753f127fSDimitry Andric
65106c3fb27SDimitry Andric// Arithmetic, LSL shift, shift <= 4
65206c3fb27SDimitry Andric// Arithmetic, flagset, LSL shift, shift <= 4
65306c3fb27SDimitry Andric// Arithmetic, LSR/ASR/ROR shift or LSL shift > 4
65406c3fb27SDimitry Andricdef : SchedAlias<WriteISReg, N2Write_Arith>;
65506c3fb27SDimitry Andric
65606c3fb27SDimitry Andric// Logical, shift, no flagset
65706c3fb27SDimitry Andricdef : InstRW<[N2Write_1cyc_1I],
65806c3fb27SDimitry Andric             (instregex "^(AND|BIC|EON|EOR|ORN|ORR)[WX]rs$")>;
65906c3fb27SDimitry Andric
66006c3fb27SDimitry Andric// Logical, shift, flagset
66106c3fb27SDimitry Andricdef : InstRW<[N2Write_Logical], (instregex "^(AND|BIC)S[WX]rs$")>;
66206c3fb27SDimitry Andric
663753f127fSDimitry Andric// Arithmetic, immediate to logical address tag
664753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instrs ADDG, SUBG)>;
665753f127fSDimitry Andric
666753f127fSDimitry Andric// Convert floating-point condition flags
667753f127fSDimitry Andric// Flag manipulation instructions
668753f127fSDimitry Andricdef : WriteRes<WriteSys, []> { let Latency = 1; }
669753f127fSDimitry Andric
670753f127fSDimitry Andric// Insert Random Tags
671753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instrs IRG, IRGstack)>;
672753f127fSDimitry Andric
673753f127fSDimitry Andric// Insert Tag Mask
674753f127fSDimitry Andric// Subtract Pointer
675753f127fSDimitry Andric// Subtract Pointer, flagset
676753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1I], (instrs GMI, SUBP, SUBPS)>;
677753f127fSDimitry Andric
678753f127fSDimitry Andric// Move and shift instructions
679753f127fSDimitry Andric// -----------------------------------------------------------------------------
680753f127fSDimitry Andric
681753f127fSDimitry Andricdef : SchedAlias<WriteImm, N2Write_1cyc_1I>;
682753f127fSDimitry Andric
683753f127fSDimitry Andric// Divide and Multiply Instructions
684753f127fSDimitry Andric// -----------------------------------------------------------------------------
685753f127fSDimitry Andric
686753f127fSDimitry Andric// SDIV, UDIV
687753f127fSDimitry Andricdef : SchedAlias<WriteID32,  N2Write_12cyc_1M0>;
688753f127fSDimitry Andricdef : SchedAlias<WriteID64,  N2Write_20cyc_1M0>;
689753f127fSDimitry Andric
690753f127fSDimitry Andricdef : WriteRes<WriteIM32, [N2UnitM]> { let Latency = 2; }
691753f127fSDimitry Andricdef : WriteRes<WriteIM64, [N2UnitM]> { let Latency = 2; }
692753f127fSDimitry Andric
693753f127fSDimitry Andric// Multiply high
694753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], (instrs SMULHrr, UMULHrr)>;
695753f127fSDimitry Andric
696753f127fSDimitry Andric// Pointer Authentication Instructions (v8.3 PAC)
697753f127fSDimitry Andric// -----------------------------------------------------------------------------
698753f127fSDimitry Andric
699753f127fSDimitry Andric// Authenticate data address
700753f127fSDimitry Andric// Authenticate instruction address
701753f127fSDimitry Andric// Compute pointer authentication code for data address
702753f127fSDimitry Andric// Compute pointer authentication code, using generic key
703753f127fSDimitry Andric// Compute pointer authentication code for instruction address
704753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1M0], (instregex "^AUT", "^PAC")>;
705753f127fSDimitry Andric
706753f127fSDimitry Andric// Branch and link, register, with pointer authentication
707753f127fSDimitry Andric// Branch, register, with pointer authentication
708753f127fSDimitry Andric// Branch, return, with pointer authentication
709753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1M0_1B], (instrs BLRAA, BLRAAZ, BLRAB, BLRABZ, BRAA,
710753f127fSDimitry Andric                                            BRAAZ, BRAB, BRABZ, RETAA, RETAB,
711753f127fSDimitry Andric                                            ERETAA, ERETAB)>;
712753f127fSDimitry Andric
713753f127fSDimitry Andric
714753f127fSDimitry Andric// Load register, with pointer authentication
715753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_1M0_1L], (instregex "^LDRA[AB](indexed|writeback)")>;
716753f127fSDimitry Andric
717753f127fSDimitry Andric// Strip pointer authentication code
718753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M0], (instrs XPACD, XPACI, XPACLRI)>;
719753f127fSDimitry Andric
720753f127fSDimitry Andric// Miscellaneous data-processing instructions
721753f127fSDimitry Andric// -----------------------------------------------------------------------------
722753f127fSDimitry Andric
723753f127fSDimitry Andric// Bitfield extract, one reg
724753f127fSDimitry Andric// Bitfield extract, two regs
725753f127fSDimitry Andric// NOTE: We don't model the difference between EXTR where both operands are the
726753f127fSDimitry Andric// same (one reg).
727753f127fSDimitry Andricdef : SchedAlias<WriteExtr, N2Write_3cyc_1I_1M>;
728753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1I_1M], (instrs EXTRWrri, EXTRXrri)>;
729753f127fSDimitry Andric
730753f127fSDimitry Andric// Bitfield move, basic
731753f127fSDimitry Andricdef : SchedAlias<WriteIS, N2Write_1cyc_1I>;
732753f127fSDimitry Andric
733753f127fSDimitry Andric// Bitfield move, insert
734753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instregex "^BFM[WX]ri$")>;
735753f127fSDimitry Andric
736753f127fSDimitry Andric// Load instructions
737753f127fSDimitry Andric// -----------------------------------------------------------------------------
738753f127fSDimitry Andric
739753f127fSDimitry Andricdef : SchedAlias<WriteLD,    N2Write_4cyc_1L>;
740753f127fSDimitry Andricdef : SchedAlias<WriteLDIdx, N2Write_4cyc_1I_1L>;
741753f127fSDimitry Andric
742753f127fSDimitry Andric// Load pair, signed immed offset, signed words
743753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1M0, WriteLDHi], (instrs LDPSWi)>;
744753f127fSDimitry Andric// Load pair, immed post-index or immed pre-index, signed words
7455f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_5cyc_1M0, WriteLDHi],
746753f127fSDimitry Andric             (instregex "^LDPSW(post|pre)$")>;
747753f127fSDimitry Andric
748753f127fSDimitry Andric// Store instructions
749753f127fSDimitry Andric// -----------------------------------------------------------------------------
750753f127fSDimitry Andric
751753f127fSDimitry Andricdef : SchedAlias<WriteST,    N2Write_1cyc_1L01_1D>;
752753f127fSDimitry Andricdef : SchedAlias<WriteSTIdx, N2Write_1cyc_1L01_1D_1I>;
753753f127fSDimitry Andricdef : SchedAlias<WriteSTP,   N2Write_1cyc_1L01_1D>;
754753f127fSDimitry Andricdef : SchedAlias<WriteAdr,   N2Write_1cyc_1I>; // copied from A57.
755753f127fSDimitry Andric
756753f127fSDimitry Andric// Tag load instructions
757753f127fSDimitry Andric// -----------------------------------------------------------------------------
758753f127fSDimitry Andric
759753f127fSDimitry Andric// Load allocation tag
760753f127fSDimitry Andric// Load multiple allocation tags
761753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L], (instrs LDG, LDGM)>;
762753f127fSDimitry Andric
763753f127fSDimitry Andric// Tag store instructions
764753f127fSDimitry Andric// -----------------------------------------------------------------------------
765753f127fSDimitry Andric
766753f127fSDimitry Andric// Store allocation tags to one or two granules, post-index
767753f127fSDimitry Andric// Store allocation tags to one or two granules, pre-index
768753f127fSDimitry Andric// Store allocation tag to one or two granules, zeroing, post-index
769753f127fSDimitry Andric// Store Allocation Tag to one or two granules, zeroing, pre-index
770753f127fSDimitry Andric// Store allocation tag and reg pair to memory, post-Index
771753f127fSDimitry Andric// Store allocation tag and reg pair to memory, pre-Index
772753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1L01_1D_1I], (instrs STGPreIndex, STGPostIndex,
773753f127fSDimitry Andric                                                ST2GPreIndex, ST2GPostIndex,
774753f127fSDimitry Andric                                                STZGPreIndex, STZGPostIndex,
775753f127fSDimitry Andric                                                STZ2GPreIndex, STZ2GPostIndex,
776753f127fSDimitry Andric                                                STGPpre, STGPpost)>;
777753f127fSDimitry Andric
778753f127fSDimitry Andric// Store allocation tags to one or two granules, signed offset
779753f127fSDimitry Andric// Store allocation tag to two granules, zeroing, signed offset
780753f127fSDimitry Andric// Store allocation tag and reg pair to memory, signed offset
781753f127fSDimitry Andric// Store multiple allocation tags
78206c3fb27SDimitry Andricdef : InstRW<[N2Write_1cyc_1L01_1D], (instrs STGi, ST2Gi, STZGi,
78306c3fb27SDimitry Andric                                             STZ2Gi, STGPi, STGM, STZGM)>;
784753f127fSDimitry Andric
785753f127fSDimitry Andric// FP data processing instructions
786753f127fSDimitry Andric// -----------------------------------------------------------------------------
787753f127fSDimitry Andric
788753f127fSDimitry Andric// FP absolute value
789753f127fSDimitry Andric// FP arithmetic
790753f127fSDimitry Andric// FP min/max
791753f127fSDimitry Andric// FP negate
792753f127fSDimitry Andric// FP select
793753f127fSDimitry Andricdef : SchedAlias<WriteF,     N2Write_2cyc_1V>;
794753f127fSDimitry Andric
795753f127fSDimitry Andric// FP compare
796753f127fSDimitry Andricdef : SchedAlias<WriteFCmp,  N2Write_2cyc_1V0>;
797753f127fSDimitry Andric
798753f127fSDimitry Andric// FP divide, square root
799753f127fSDimitry Andricdef : SchedAlias<WriteFDiv,  N2Write_7cyc_1V0>;
800753f127fSDimitry Andric
801753f127fSDimitry Andric// FP divide, H-form
802753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1V0],  (instrs FDIVHrr)>;
803753f127fSDimitry Andric// FP divide, S-form
804753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_1V0], (instrs FDIVSrr)>;
805753f127fSDimitry Andric// FP divide, D-form
806753f127fSDimitry Andricdef : InstRW<[N2Write_15cyc_1V0], (instrs FDIVDrr)>;
807753f127fSDimitry Andric
808753f127fSDimitry Andric// FP square root, H-form
809753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1V0],  (instrs FSQRTHr)>;
810753f127fSDimitry Andric// FP square root, S-form
811753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_1V0],  (instrs FSQRTSr)>;
812753f127fSDimitry Andric// FP square root, D-form
813753f127fSDimitry Andricdef : InstRW<[N2Write_16cyc_1V0], (instrs FSQRTDr)>;
814753f127fSDimitry Andric
815753f127fSDimitry Andric// FP multiply
816753f127fSDimitry Andricdef : WriteRes<WriteFMul, [N2UnitV]> { let Latency = 3; }
817753f127fSDimitry Andric
818753f127fSDimitry Andric// FP multiply accumulate
819753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FN?M(ADD|SUB)[HSD]rrr$")>;
820753f127fSDimitry Andric
821753f127fSDimitry Andric// FP round to integral
822753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FRINT[AIMNPXZ][HSD]r$",
823753f127fSDimitry Andric                                            "^FRINT(32|64)[XZ][SD]r$")>;
824753f127fSDimitry Andric
825753f127fSDimitry Andric// FP miscellaneous instructions
826753f127fSDimitry Andric// -----------------------------------------------------------------------------
827753f127fSDimitry Andric
828753f127fSDimitry Andric// FP convert, from gen to vec reg
829753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M0], (instregex "^[SU]CVTF[SU][WX][HSD]ri$")>;
830753f127fSDimitry Andric
831753f127fSDimitry Andric// FP convert, from vec to gen reg
832753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^FCVT[AMNPZ][SU][SU][WX][HSD]r$")>;
833753f127fSDimitry Andric
834753f127fSDimitry Andric// FP convert, Javascript from vec to gen reg
835753f127fSDimitry Andric// FP convert, from vec to vec reg
836753f127fSDimitry Andricdef : SchedAlias<WriteFCvt, N2Write_3cyc_1V0>;
837753f127fSDimitry Andric
838753f127fSDimitry Andric// FP move, immed
839753f127fSDimitry Andric// FP move, register
840753f127fSDimitry Andricdef : SchedAlias<WriteFImm, N2Write_2cyc_1V>;
841753f127fSDimitry Andric
842753f127fSDimitry Andric// FP transfer, from gen to low half of vec reg
843753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M0], (instrs FMOVWHr, FMOVXHr, FMOVWSr, FMOVXDr,
844753f127fSDimitry Andric                                         FMOVHWr, FMOVHXr, FMOVSWr, FMOVDXr)>;
845753f127fSDimitry Andric
846753f127fSDimitry Andric// FP transfer, from gen to high half of vec reg
847753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1M0_1V], (instrs FMOVXDHighr)>;
848753f127fSDimitry Andric
849753f127fSDimitry Andric// FP transfer, from vec to gen reg
850753f127fSDimitry Andricdef : SchedAlias<WriteFCopy, N2Write_2cyc_1V>;
851753f127fSDimitry Andric
852753f127fSDimitry Andric// FP load instructions
853753f127fSDimitry Andric// -----------------------------------------------------------------------------
854753f127fSDimitry Andric
855753f127fSDimitry Andric// Load vector reg, literal, S/D/Q forms
856753f127fSDimitry Andric// Load vector reg, unscaled immed
857753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LDR[SDQ]l$",
858753f127fSDimitry Andric                                           "^LDUR[BHSDQ]i$")>;
859753f127fSDimitry Andric
860753f127fSDimitry Andric// Load vector reg, immed post-index
861753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1I_1L, WriteI], (instregex "^LDR[BHSDQ]post$")>;
862753f127fSDimitry Andric// Load vector reg, immed pre-index
8635f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_1I_1L], (instregex "^LDR[BHSDQ]pre$")>;
864753f127fSDimitry Andric
865753f127fSDimitry Andric// Load vector reg, unsigned immed
866753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LDR[BHSDQ]ui$")>;
867753f127fSDimitry Andric
868753f127fSDimitry Andric// Load vector reg, register offset, basic
869753f127fSDimitry Andric// Load vector reg, register offset, scale, S/D-form
870753f127fSDimitry Andric// Load vector reg, register offset, extend
871753f127fSDimitry Andric// Load vector reg, register offset, extend, scale, S/D-form
872753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L, ReadAdrBase], (instregex "^LDR[BSD]ro[WX]$")>;
873753f127fSDimitry Andric
874753f127fSDimitry Andric// Load vector reg, register offset, scale, H/Q-form
875753f127fSDimitry Andric// Load vector reg, register offset, extend, scale, H/Q-form
876753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1I_1L, ReadAdrBase], (instregex "^LDR[HQ]ro[WX]$")>;
877753f127fSDimitry Andric
878753f127fSDimitry Andric// Load vector pair, immed offset, S/D-form
879753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L, WriteLDHi], (instregex "^LDN?P[SD]i$")>;
880753f127fSDimitry Andric
881753f127fSDimitry Andric// Load vector pair, immed offset, Q-form
882753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_2L, WriteLDHi], (instrs LDPQi, LDNPQi)>;
883753f127fSDimitry Andric
884753f127fSDimitry Andric// Load vector pair, immed post-index, S/D-form
885753f127fSDimitry Andric// Load vector pair, immed pre-index, S/D-form
8865f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_1I_1L, WriteLDHi],
887753f127fSDimitry Andric             (instregex "^LDP[SD](pre|post)$")>;
888753f127fSDimitry Andric
889753f127fSDimitry Andric// Load vector pair, immed post-index, Q-form
890753f127fSDimitry Andric// Load vector pair, immed pre-index, Q-form
8915f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_2I_2L, WriteLDHi], (instrs LDPQpost,
892753f127fSDimitry Andric                                                                LDPQpre)>;
893753f127fSDimitry Andric
894753f127fSDimitry Andric// FP store instructions
895753f127fSDimitry Andric// -----------------------------------------------------------------------------
896753f127fSDimitry Andric
897753f127fSDimitry Andric// Store vector reg, unscaled immed, B/H/S/D-form
898753f127fSDimitry Andric// Store vector reg, unscaled immed, Q-form
899753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STUR[BHSDQ]i$")>;
900753f127fSDimitry Andric
901753f127fSDimitry Andric// Store vector reg, immed post-index, B/H/S/D-form
902753f127fSDimitry Andric// Store vector reg, immed post-index, Q-form
903753f127fSDimitry Andric// Store vector reg, immed pre-index, B/H/S/D-form
904753f127fSDimitry Andric// Store vector reg, immed pre-index, Q-form
905753f127fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_1L01_1V_1I, ReadAdrBase],
906753f127fSDimitry Andric             (instregex "^STR[BHSDQ](pre|post)$")>;
907753f127fSDimitry Andric
908753f127fSDimitry Andric// Store vector reg, unsigned immed, B/H/S/D-form
909753f127fSDimitry Andric// Store vector reg, unsigned immed, Q-form
910753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STR[BHSDQ]ui$")>;
911753f127fSDimitry Andric
912753f127fSDimitry Andric// Store vector reg, register offset, basic, B/H/S/D-form
913753f127fSDimitry Andric// Store vector reg, register offset, basic, Q-form
914753f127fSDimitry Andric// Store vector reg, register offset, scale, S/D-form
915753f127fSDimitry Andric// Store vector reg, register offset, extend, B/H/S/D-form
916753f127fSDimitry Andric// Store vector reg, register offset, extend, Q-form
917753f127fSDimitry Andric// Store vector reg, register offset, extend, scale, S/D-form
918753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V, ReadAdrBase],
919753f127fSDimitry Andric             (instregex "^STR[BSD]ro[WX]$")>;
920753f127fSDimitry Andric
921753f127fSDimitry Andric// Store vector reg, register offset, scale, H-form
922753f127fSDimitry Andric// Store vector reg, register offset, scale, Q-form
923753f127fSDimitry Andric// Store vector reg, register offset, extend, scale, H-form
924753f127fSDimitry Andric// Store vector reg, register offset, extend, scale, Q-form
925753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V, ReadAdrBase],
926753f127fSDimitry Andric             (instregex "^STR[HQ]ro[WX]$")>;
927753f127fSDimitry Andric
928753f127fSDimitry Andric// Store vector pair, immed offset, S-form
929753f127fSDimitry Andric// Store vector pair, immed offset, D-form
930753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STN?P[SD]i$")>;
931753f127fSDimitry Andric
932753f127fSDimitry Andric// Store vector pair, immed offset, Q-form
933753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_2V], (instrs STPQi, STNPQi)>;
934753f127fSDimitry Andric
935753f127fSDimitry Andric// Store vector pair, immed post-index, S-form
936753f127fSDimitry Andric// Store vector pair, immed post-index, D-form
937753f127fSDimitry Andric// Store vector pair, immed pre-index, S-form
938753f127fSDimitry Andric// Store vector pair, immed pre-index, D-form
939753f127fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_1L01_1V_1I],
940753f127fSDimitry Andric             (instregex "^STP[SD](pre|post)$")>;
941753f127fSDimitry Andric
942753f127fSDimitry Andric// Store vector pair, immed post-index, Q-form
943753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_2V_1I], (instrs STPQpost)>;
944753f127fSDimitry Andric
945753f127fSDimitry Andric// Store vector pair, immed pre-index, Q-form
946753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_2V_2I], (instrs STPQpre)>;
947753f127fSDimitry Andric
948753f127fSDimitry Andric// ASIMD integer instructions
949753f127fSDimitry Andric// -----------------------------------------------------------------------------
950753f127fSDimitry Andric
951753f127fSDimitry Andric// ASIMD absolute diff
952753f127fSDimitry Andric// ASIMD absolute diff long
953753f127fSDimitry Andric// ASIMD arith, basic
954753f127fSDimitry Andric// ASIMD arith, complex
955753f127fSDimitry Andric// ASIMD arith, pair-wise
956753f127fSDimitry Andric// ASIMD compare
957753f127fSDimitry Andric// ASIMD logical
958753f127fSDimitry Andric// ASIMD max/min, basic and pair-wise
959753f127fSDimitry Andricdef : SchedAlias<WriteVd, N2Write_2cyc_1V>;
960753f127fSDimitry Andricdef : SchedAlias<WriteVq, N2Write_2cyc_1V>;
961753f127fSDimitry Andric
962753f127fSDimitry Andric// ASIMD absolute diff accum
963753f127fSDimitry Andric// ASIMD absolute diff accum long
964753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1],
965753f127fSDimitry Andric             (instregex "^SABAv", "^UABAv", "^SABALv", "^UABALv")>;
966753f127fSDimitry Andric
967753f127fSDimitry Andric// ASIMD arith, reduce, 4H/4S
968753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^(ADDV|[SU]ADDLV)v4(i16|i32)v$")>;
969753f127fSDimitry Andric
970753f127fSDimitry Andric// ASIMD arith, reduce, 8B/8H
971753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1_1V],
972753f127fSDimitry Andric             (instregex "^(ADDV|[SU]ADDLV)v8(i8|i16)v$")>;
973753f127fSDimitry Andric
974753f127fSDimitry Andric// ASIMD arith, reduce, 16B
975753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instrs ADDVv16i8v, SADDLVv16i8v,
976753f127fSDimitry Andric                                         UADDLVv16i8v)>;
977753f127fSDimitry Andric
978753f127fSDimitry Andric// ASIMD dot product
979753f127fSDimitry Andric// ASIMD dot product using signed and unsigned integers
980753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V],
981753f127fSDimitry Andric             (instregex "^([SU]|SU|US)DOT(lane)?(v8|v16)i8$")>;
982753f127fSDimitry Andric
983753f127fSDimitry Andric// ASIMD matrix multiply-accumulate
984753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instrs SMMLA, UMMLA, USMMLA)>;
985753f127fSDimitry Andric
986753f127fSDimitry Andric// ASIMD max/min, reduce, 4H/4S
987753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^[SU](MAX|MIN)Vv4i16v$",
988753f127fSDimitry Andric                                            "^[SU](MAX|MIN)Vv4i32v$")>;
989753f127fSDimitry Andric
990753f127fSDimitry Andric// ASIMD max/min, reduce, 8B/8H
991753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1_1V], (instregex "^[SU](MAX|MIN)Vv8i8v$",
992753f127fSDimitry Andric                                               "^[SU](MAX|MIN)Vv8i16v$")>;
993753f127fSDimitry Andric
994753f127fSDimitry Andric// ASIMD max/min, reduce, 16B
995753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V1], (instregex "[SU](MAX|MIN)Vv16i8v$")>;
996753f127fSDimitry Andric
997753f127fSDimitry Andric// ASIMD multiply
998753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^MULv", "^SQ(R)?DMULHv")>;
999753f127fSDimitry Andric
1000753f127fSDimitry Andric// ASIMD multiply accumulate
1001753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^MLAv", "^MLSv")>;
1002753f127fSDimitry Andric
1003753f127fSDimitry Andric// ASIMD multiply accumulate high
1004753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQRDMLAHv", "^SQRDMLSHv")>;
1005753f127fSDimitry Andric
1006753f127fSDimitry Andric// ASIMD multiply accumulate long
1007753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^[SU]MLALv", "^[SU]MLSLv")>;
1008753f127fSDimitry Andric
1009753f127fSDimitry Andric// ASIMD multiply accumulate saturating long
1010753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQDMLALv", "^SQDMLSLv")>;
1011753f127fSDimitry Andric
1012753f127fSDimitry Andric// ASIMD multiply/multiply long (8x8) polynomial, D-form
1013753f127fSDimitry Andric// ASIMD multiply/multiply long (8x8) polynomial, Q-form
1014753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^PMULL?(v8i8|v16i8)$")>;
1015753f127fSDimitry Andric
1016753f127fSDimitry Andric// ASIMD multiply long
1017753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^[SU]MULLv", "^SQDMULLv")>;
1018753f127fSDimitry Andric
1019753f127fSDimitry Andric// ASIMD pairwise add and accumulate long
1020753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]ADALPv")>;
1021753f127fSDimitry Andric
1022753f127fSDimitry Andric// ASIMD shift accumulate
1023753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]SRAv", "^[SU]RSRAv")>;
1024753f127fSDimitry Andric
1025753f127fSDimitry Andric// ASIMD shift by immed, basic
1026753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^SHLv", "^SHLLv", "^SHRNv",
1027753f127fSDimitry Andric                                            "^SSHLLv", "^SSHRv", "^USHLLv",
1028753f127fSDimitry Andric                                            "^USHRv")>;
1029753f127fSDimitry Andric
1030753f127fSDimitry Andric// ASIMD shift by immed and insert, basic
1031753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^SLIv", "^SRIv")>;
1032753f127fSDimitry Andric
1033753f127fSDimitry Andric// ASIMD shift by immed, complex
1034753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1],
1035753f127fSDimitry Andric             (instregex "^RSHRNv", "^SQRSHRNv", "^SQRSHRUNv",
1036753f127fSDimitry Andric                        "^(SQSHLU?|UQSHL)[bhsd]$",
1037753f127fSDimitry Andric                        "^(SQSHLU?|UQSHL)(v8i8|v16i8|v4i16|v8i16|v2i32|v4i32|v2i64)_shift$",
1038753f127fSDimitry Andric                        "^SQSHRNv", "^SQSHRUNv", "^SRSHRv", "^UQRSHRNv",
1039753f127fSDimitry Andric                        "^UQSHRNv", "^URSHRv")>;
1040753f127fSDimitry Andric
1041753f127fSDimitry Andric// ASIMD shift by register, basic
1042753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^[SU]SHLv")>;
1043753f127fSDimitry Andric
1044753f127fSDimitry Andric// ASIMD shift by register, complex
1045753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1],
1046753f127fSDimitry Andric             (instregex "^[SU]RSHLv", "^[SU]QRSHLv",
1047753f127fSDimitry Andric                        "^[SU]QSHL(v1i8|v1i16|v1i32|v1i64|v8i8|v16i8|v4i16|v8i16|v2i32|v4i32|v2i64)$")>;
1048753f127fSDimitry Andric
1049753f127fSDimitry Andric// ASIMD floating-point instructions
1050753f127fSDimitry Andric// -----------------------------------------------------------------------------
1051753f127fSDimitry Andric
1052753f127fSDimitry Andric// ASIMD FP absolute value/difference
1053753f127fSDimitry Andric// ASIMD FP arith, normal
1054753f127fSDimitry Andric// ASIMD FP compare
1055753f127fSDimitry Andric// ASIMD FP complex add
1056753f127fSDimitry Andric// ASIMD FP max/min, normal
1057753f127fSDimitry Andric// ASIMD FP max/min, pairwise
1058753f127fSDimitry Andric// ASIMD FP negate
1059753f127fSDimitry Andric// Handled by SchedAlias<WriteV[dq], ...>
1060753f127fSDimitry Andric
1061753f127fSDimitry Andric// ASIMD FP complex multiply add
1062753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FCMLAv")>;
1063753f127fSDimitry Andric
1064753f127fSDimitry Andric// ASIMD FP convert, long (F16 to F32)
1065753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FCVTL(v4|v8)i16")>;
1066753f127fSDimitry Andric
1067753f127fSDimitry Andric// ASIMD FP convert, long (F32 to F64)
1068753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FCVTL(v2|v4)i32")>;
1069753f127fSDimitry Andric
1070753f127fSDimitry Andric// ASIMD FP convert, narrow (F32 to F16)
1071753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FCVTN(v4|v8)i16")>;
1072753f127fSDimitry Andric
1073753f127fSDimitry Andric// ASIMD FP convert, narrow (F64 to F32)
1074753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FCVTN(v2|v4)i32",
1075753f127fSDimitry Andric                                            "^FCVTXN(v2|v4)f32")>;
1076753f127fSDimitry Andric
1077753f127fSDimitry Andric// ASIMD FP convert, other, D-form F32 and Q-form F64
1078753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^[FSU]CVT[AMNPZ][SU]v2f(32|64)$",
1079753f127fSDimitry Andric                                            "^[SU]CVTFv2f(32|64)$")>;
1080753f127fSDimitry Andric
1081753f127fSDimitry Andric// ASIMD FP convert, other, D-form F16 and Q-form F32
1082753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^[FSU]CVT[AMNPZ][SU]v4f(16|32)$",
1083753f127fSDimitry Andric                                            "^[SU]CVTFv4f(16|32)$")>;
1084753f127fSDimitry Andric
1085753f127fSDimitry Andric// ASIMD FP convert, other, Q-form F16
1086753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^[FSU]CVT[AMNPZ][SU]v8f16$",
1087753f127fSDimitry Andric                                            "^[SU]CVTFv8f16$")>;
1088753f127fSDimitry Andric
1089753f127fSDimitry Andric// ASIMD FP divide, D-form, F16
1090753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1V0], (instrs FDIVv4f16)>;
1091753f127fSDimitry Andric
1092753f127fSDimitry Andric// ASIMD FP divide, D-form, F32
1093753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2V0], (instrs FDIVv2f32)>;
1094753f127fSDimitry Andric
1095753f127fSDimitry Andric// ASIMD FP divide, Q-form, F16
1096753f127fSDimitry Andricdef : InstRW<[N2Write_13cyc_2V0], (instrs FDIVv8f16)>;
1097753f127fSDimitry Andric
1098753f127fSDimitry Andric// ASIMD FP divide, Q-form, F32
1099753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2V0], (instrs FDIVv4f32)>;
1100753f127fSDimitry Andric
1101753f127fSDimitry Andric// ASIMD FP divide, Q-form, F64
1102753f127fSDimitry Andricdef : InstRW<[N2Write_15cyc_2V0], (instrs FDIVv2f64)>;
1103753f127fSDimitry Andric
1104753f127fSDimitry Andric// ASIMD FP max/min, reduce, F32 and D-form F16
1105753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^(FMAX|FMIN)(NM)?Vv4(i16|i32)v$")>;
1106753f127fSDimitry Andric
1107753f127fSDimitry Andric// ASIMD FP max/min, reduce, Q-form F16
1108753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_2V], (instregex "^(FMAX|FMIN)(NM)?Vv8i16v$")>;
1109753f127fSDimitry Andric
1110753f127fSDimitry Andric// ASIMD FP multiply
1111753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^FMULv", "^FMULXv")>;
1112753f127fSDimitry Andric
1113753f127fSDimitry Andric// ASIMD FP multiply accumulate
1114753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FMLAv", "^FMLSv")>;
1115753f127fSDimitry Andric
1116753f127fSDimitry Andric// ASIMD FP multiply accumulate long
1117753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1V], (instregex "^FMLALv", "^FMLSLv")>;
1118753f127fSDimitry Andric
1119753f127fSDimitry Andric// ASIMD FP round, D-form F32 and Q-form F64
1120753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0],
1121753f127fSDimitry Andric             (instregex "^FRINT[AIMNPXZ]v2f(32|64)$",
1122753f127fSDimitry Andric                        "^FRINT[32|64)[XZ]v2f(32|64)$")>;
1123753f127fSDimitry Andric
1124753f127fSDimitry Andric// ASIMD FP round, D-form F16 and Q-form F32
1125753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0],
1126753f127fSDimitry Andric             (instregex "^FRINT[AIMNPXZ]v4f(16|32)$",
1127753f127fSDimitry Andric                        "^FRINT(32|64)[XZ]v4f32$")>;
1128753f127fSDimitry Andric
1129753f127fSDimitry Andric
1130753f127fSDimitry Andric// ASIMD FP round, Q-form F16
1131753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^FRINT[AIMNPXZ]v8f16$")>;
1132753f127fSDimitry Andric
1133753f127fSDimitry Andric// ASIMD FP square root, D-form, F16
1134753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1V0], (instrs FSQRTv4f16)>;
1135753f127fSDimitry Andric
1136753f127fSDimitry Andric// ASIMD FP square root, D-form, F32
1137753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2V0], (instrs FSQRTv2f32)>;
1138753f127fSDimitry Andric
1139753f127fSDimitry Andric// ASIMD FP square root, Q-form, F16
1140753f127fSDimitry Andricdef : InstRW<[N2Write_13cyc_2V0], (instrs FSQRTv8f16)>;
1141753f127fSDimitry Andric
1142753f127fSDimitry Andric// ASIMD FP square root, Q-form, F32
1143753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2V0], (instrs FSQRTv4f32)>;
1144753f127fSDimitry Andric
1145753f127fSDimitry Andric// ASIMD FP square root, Q-form, F64
1146753f127fSDimitry Andricdef : InstRW<[N2Write_16cyc_2V0], (instrs FSQRTv2f64)>;
1147753f127fSDimitry Andric
1148753f127fSDimitry Andric// ASIMD BFloat16 (BF16) instructions
1149753f127fSDimitry Andric// -----------------------------------------------------------------------------
1150753f127fSDimitry Andric
1151753f127fSDimitry Andric// ASIMD convert, F32 to BF16
1152753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instrs BFCVTN, BFCVTN2)>;
1153753f127fSDimitry Andric
1154753f127fSDimitry Andric// ASIMD dot product
1155753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instrs BFDOTv4bf16, BFDOTv8bf16)>;
1156753f127fSDimitry Andric
1157753f127fSDimitry Andric// ASIMD matrix multiply accumulate
1158753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1V], (instrs BFMMLA)>;
1159753f127fSDimitry Andric
1160753f127fSDimitry Andric// ASIMD multiply accumulate long
1161753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instrs BFMLALB, BFMLALBIdx, BFMLALT,
1162753f127fSDimitry Andric                                        BFMLALTIdx)>;
1163753f127fSDimitry Andric
1164753f127fSDimitry Andric// Scalar convert, F32 to BF16
1165753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instrs BFCVT)>;
1166753f127fSDimitry Andric
1167753f127fSDimitry Andric// ASIMD miscellaneous instructions
1168753f127fSDimitry Andric// -----------------------------------------------------------------------------
1169753f127fSDimitry Andric
1170753f127fSDimitry Andric// ASIMD bit reverse
1171753f127fSDimitry Andric// ASIMD bitwise insert
1172753f127fSDimitry Andric// ASIMD count
1173753f127fSDimitry Andric// ASIMD duplicate, element
1174753f127fSDimitry Andric// ASIMD extract
1175753f127fSDimitry Andric// ASIMD extract narrow
1176753f127fSDimitry Andric// ASIMD insert, element to element
1177753f127fSDimitry Andric// ASIMD move, FP immed
1178753f127fSDimitry Andric// ASIMD move, integer immed
1179753f127fSDimitry Andric// ASIMD reverse
1180753f127fSDimitry Andric// ASIMD table lookup, 1 or 2 table regs
1181753f127fSDimitry Andric// ASIMD table lookup extension, 1 table reg
1182753f127fSDimitry Andric// ASIMD transfer, element to gen reg
1183753f127fSDimitry Andric// ASIMD transpose
1184753f127fSDimitry Andric// ASIMD unzip/zip
1185753f127fSDimitry Andric// Handled by SchedAlias<WriteV[dq], ...>
1186753f127fSDimitry Andric
1187753f127fSDimitry Andric// ASIMD duplicate, gen reg
1188753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M0], (instregex "^DUPv.+gpr")>;
1189753f127fSDimitry Andric
1190753f127fSDimitry Andric// ASIMD extract narrow, saturating
1191753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]QXTNv", "^SQXTUNv")>;
1192753f127fSDimitry Andric
1193753f127fSDimitry Andric// ASIMD reciprocal and square root estimate, D-form U32
1194753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instrs URECPEv2i32, URSQRTEv2i32)>;
1195753f127fSDimitry Andric
1196753f127fSDimitry Andric// ASIMD reciprocal and square root estimate, Q-form U32
1197753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instrs URECPEv4i32, URSQRTEv4i32)>;
1198753f127fSDimitry Andric
1199753f127fSDimitry Andric// ASIMD reciprocal and square root estimate, D-form F32 and scalar forms
1200753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instrs FRECPEv1f16, FRECPEv1i32,
1201753f127fSDimitry Andric                                         FRECPEv1i64, FRECPEv2f32,
1202753f127fSDimitry Andric                                         FRSQRTEv1f16, FRSQRTEv1i32,
1203753f127fSDimitry Andric                                         FRSQRTEv1i64, FRSQRTEv2f32)>;
1204753f127fSDimitry Andric
1205753f127fSDimitry Andric// ASIMD reciprocal and square root estimate, D-form F16 and Q-form F32
1206753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instrs FRECPEv4f16, FRECPEv4f32,
1207753f127fSDimitry Andric                                         FRSQRTEv4f16, FRSQRTEv4f32)>;
1208753f127fSDimitry Andric
1209753f127fSDimitry Andric// ASIMD reciprocal and square root estimate, Q-form F16
1210753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instrs FRECPEv8f16, FRSQRTEv8f16)>;
1211753f127fSDimitry Andric
1212753f127fSDimitry Andric// ASIMD reciprocal exponent
1213753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FRECPXv")>;
1214753f127fSDimitry Andric
1215753f127fSDimitry Andric// ASIMD reciprocal step
1216753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FRECPSv", "^FRSQRTSv")>;
1217753f127fSDimitry Andric
1218753f127fSDimitry Andric// ASIMD table lookup, 3 table regs
1219753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V], (instrs TBLv8i8Three, TBLv16i8Three)>;
1220753f127fSDimitry Andric
1221753f127fSDimitry Andric// ASIMD table lookup, 4 table regs
1222753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_4V], (instrs TBLv8i8Four, TBLv16i8Four)>;
1223753f127fSDimitry Andric
1224753f127fSDimitry Andric// ASIMD table lookup extension, 2 table reg
1225753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V], (instrs TBXv8i8Two, TBXv16i8Two)>;
1226753f127fSDimitry Andric
1227753f127fSDimitry Andric// ASIMD table lookup extension, 3 table reg
1228753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_4V], (instrs TBXv8i8Three, TBXv16i8Three)>;
1229753f127fSDimitry Andric
1230753f127fSDimitry Andric// ASIMD table lookup extension, 4 table reg
1231753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_8V], (instrs TBXv8i8Four, TBXv16i8Four)>;
1232753f127fSDimitry Andric
1233753f127fSDimitry Andric// ASIMD transfer, gen reg to element
123406c3fb27SDimitry Andricdef : InstRW<[N2Write_5cyc_1M0_1V], (instregex "^INSvi(8|16|32|64)gpr$")>;
1235753f127fSDimitry Andric
1236753f127fSDimitry Andric// ASIMD load instructions
1237753f127fSDimitry Andric// -----------------------------------------------------------------------------
1238753f127fSDimitry Andric
1239753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, D-form
1240753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LD1Onev(8b|4h|2s|1d)$")>;
12415f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_1L],
1242753f127fSDimitry Andric             (instregex "^LD1Onev(8b|4h|2s|1d)_POST$")>;
1243753f127fSDimitry Andric
1244753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, Q-form
1245753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LD1Onev(16b|8h|4s|2d)$")>;
12465f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_1L],
1247753f127fSDimitry Andric             (instregex "^LD1Onev(16b|8h|4s|2d)_POST$")>;
1248753f127fSDimitry Andric
1249753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, D-form
1250753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_2L], (instregex "^LD1Twov(8b|4h|2s|1d)$")>;
12515f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_2L],
1252753f127fSDimitry Andric             (instregex "^LD1Twov(8b|4h|2s|1d)_POST$")>;
1253753f127fSDimitry Andric
1254753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, Q-form
1255753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_2L], (instregex "^LD1Twov(16b|8h|4s|2d)$")>;
12565f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_2L],
1257753f127fSDimitry Andric             (instregex "^LD1Twov(16b|8h|4s|2d)_POST$")>;
1258753f127fSDimitry Andric
1259753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, D-form
1260753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L], (instregex "^LD1Threev(8b|4h|2s|1d)$")>;
12615f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L],
1262753f127fSDimitry Andric             (instregex "^LD1Threev(8b|4h|2s|1d)_POST$")>;
1263753f127fSDimitry Andric
1264753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, Q-form
1265753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L], (instregex "^LD1Threev(16b|8h|4s|2d)$")>;
12665f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L],
1267753f127fSDimitry Andric             (instregex "^LD1Threev(16b|8h|4s|2d)_POST$")>;
1268753f127fSDimitry Andric
1269753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, D-form
1270753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_4L], (instregex "^LD1Fourv(8b|4h|2s|1d)$")>;
12715f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_7cyc_4L],
1272753f127fSDimitry Andric             (instregex "^LD1Fourv(8b|4h|2s|1d)_POST$")>;
1273753f127fSDimitry Andric
1274753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, Q-form
1275753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_4L], (instregex "^LD1Fourv(16b|8h|4s|2d)$")>;
12765f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_7cyc_4L],
1277753f127fSDimitry Andric             (instregex "^LD1Fourv(16b|8h|4s|2d)_POST$")>;
1278753f127fSDimitry Andric
1279753f127fSDimitry Andric// ASIMD load, 1 element, one lane, B/H/S
1280753f127fSDimitry Andric// ASIMD load, 1 element, one lane, D
1281753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_1V],           (instregex "LD1i(8|16|32|64)$")>;
12825f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_1V], (instregex "LD1i(8|16|32|64)_POST$")>;
1283753f127fSDimitry Andric
1284753f127fSDimitry Andric// ASIMD load, 1 element, all lanes, D-form, B/H/S
1285753f127fSDimitry Andric// ASIMD load, 1 element, all lanes, D-form, D
1286753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_1V],           (instregex "LD1Rv(8b|4h|2s|1d)$")>;
12875f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_1V], (instregex "LD1Rv(8b|4h|2s|1d)_POST$")>;
1288753f127fSDimitry Andric
1289753f127fSDimitry Andric// ASIMD load, 1 element, all lanes, Q-form
1290753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_1V],           (instregex "LD1Rv(16b|8h|4s|2d)$")>;
12915f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_1V], (instregex "LD1Rv(16b|8h|4s|2d)_POST$")>;
1292753f127fSDimitry Andric
1293753f127fSDimitry Andric// ASIMD load, 2 element, multiple, D-form, B/H/S
1294753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_2V],           (instregex "LD2Twov(8b|4h|2s)$")>;
12955f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_2V], (instregex "LD2Twov(8b|4h|2s)_POST$")>;
1296753f127fSDimitry Andric
1297753f127fSDimitry Andric// ASIMD load, 2 element, multiple, Q-form, B/H/S
1298753f127fSDimitry Andric// ASIMD load, 2 element, multiple, Q-form, D
1299753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2L_2V],           (instregex "LD2Twov(16b|8h|4s|2d)$")>;
13005f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_2L_2V], (instregex "LD2Twov(16b|8h|4s|2d)_POST$")>;
1301753f127fSDimitry Andric
1302753f127fSDimitry Andric// ASIMD load, 2 element, one lane, B/H
1303753f127fSDimitry Andric// ASIMD load, 2 element, one lane, S
1304753f127fSDimitry Andric// ASIMD load, 2 element, one lane, D
1305753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_2V],           (instregex "LD2i(8|16|32|64)$")>;
13065f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_2V], (instregex "LD2i(8|16|32|64)_POST$")>;
1307753f127fSDimitry Andric
1308753f127fSDimitry Andric// ASIMD load, 2 element, all lanes, D-form, B/H/S
1309753f127fSDimitry Andric// ASIMD load, 2 element, all lanes, D-form, D
1310753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_2V],            (instregex "LD2Rv(8b|4h|2s|1d)$")>;
13115f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_2V],  (instregex "LD2Rv(8b|4h|2s|1d)_POST$")>;
1312753f127fSDimitry Andric
1313753f127fSDimitry Andric// ASIMD load, 2 element, all lanes, Q-form
1314753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_2V],           (instregex "LD2Rv(16b|8h|4s|2d)$")>;
13155f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_2V], (instregex "LD2Rv(16b|8h|4s|2d)_POST$")>;
1316753f127fSDimitry Andric
1317753f127fSDimitry Andric// ASIMD load, 3 element, multiple, D-form, B/H/S
1318753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2L_3V],           (instregex "LD3Threev(8b|4h|2s)$")>;
13195f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_2L_3V], (instregex "LD3Threev(8b|4h|2s)_POST$")>;
1320753f127fSDimitry Andric
1321753f127fSDimitry Andric// ASIMD load, 3 element, multiple, Q-form, B/H/S
1322753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_3V],           (instregex "LD3Threev(16b|8h|4s)$")>;
13235f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_3V], (instregex "LD3Threev(16b|8h|4s)_POST$")>;
1324753f127fSDimitry Andric
1325753f127fSDimitry Andric// ASIMD load, 3 element, multiple, Q-form, D
1326753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_3V],           (instregex "LD3Threev(2d)$")>;
13275f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_3V], (instregex "LD3Threev(2d)_POST$")>;
1328753f127fSDimitry Andric
1329753f127fSDimitry Andric// ASIMD load, 3 element, one lane, B/H
1330753f127fSDimitry Andric// ASIMD load, 3 element, one lane, S
1331753f127fSDimitry Andric// ASIMD load, 3 element, one lane, D
1332753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2L_3V],           (instregex "LD3i(8|16|32|64)$")>;
13335f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_2L_3V], (instregex "LD3i(8|16|32|64)_POST$")>;
1334753f127fSDimitry Andric
1335753f127fSDimitry Andric// ASIMD load, 3 element, all lanes, D-form, B/H/S
1336753f127fSDimitry Andric// ASIMD load, 3 element, all lanes, D-form, D
1337753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2L_3V],           (instregex "LD3Rv(8b|4h|2s|1d)$")>;
13385f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_2L_3V], (instregex "LD3Rv(8b|4h|2s|1d)_POST$")>;
1339753f127fSDimitry Andric
1340753f127fSDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, B/H/S
1341753f127fSDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, D
1342753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_3V],           (instregex "LD3Rv(16b|8h|4s|2d)$")>;
13435f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_3V], (instregex "LD3Rv(16b|8h|4s|2d)_POST$")>;
1344753f127fSDimitry Andric
1345753f127fSDimitry Andric// ASIMD load, 4 element, multiple, D-form, B/H/S
1346753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_4V],           (instregex "LD4Fourv(8b|4h|2s)$")>;
13475f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_4V], (instregex "LD4Fourv(8b|4h|2s)_POST$")>;
1348753f127fSDimitry Andric
1349753f127fSDimitry Andric// ASIMD load, 4 element, multiple, Q-form, B/H/S
1350753f127fSDimitry Andric// ASIMD load, 4 element, multiple, Q-form, D
1351753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_4L_4V],           (instregex "LD4Fourv(16b|8h|4s|2d)$")>;
13525f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_9cyc_4L_4V], (instregex "LD4Fourv(16b|8h|4s|2d)_POST$")>;
1353753f127fSDimitry Andric
1354753f127fSDimitry Andric// ASIMD load, 4 element, one lane, B/H
1355753f127fSDimitry Andric// ASIMD load, 4 element, one lane, S
1356753f127fSDimitry Andric// ASIMD load, 4 element, one lane, D
1357753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_4V],           (instregex "LD4i(8|16|32|64)$")>;
13585f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_4V], (instregex "LD4i(8|16|32|64)_POST$")>;
1359753f127fSDimitry Andric
1360753f127fSDimitry Andric// ASIMD load, 4 element, all lanes, D-form, B/H/S
1361753f127fSDimitry Andric// ASIMD load, 4 element, all lanes, D-form, D
1362753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_4V],              (instregex "LD4Rv(8b|4h|2s|1d)$")>;
13635f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_4V],    (instregex "LD4Rv(8b|4h|2s|1d)_POST$")>;
1364753f127fSDimitry Andric
1365753f127fSDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, B/H/S
1366753f127fSDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, D
1367753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_4L_4V],            (instregex "LD4Rv(16b|8h|4s|2d)$")>;
13685f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_4L_4V],  (instregex "LD4Rv(16b|8h|4s|2d)_POST$")>;
1369753f127fSDimitry Andric
1370753f127fSDimitry Andric// ASIMD store instructions
1371753f127fSDimitry Andric// -----------------------------------------------------------------------------
1372753f127fSDimitry Andric
1373753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, D-form
1374753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V],           (instregex "ST1Onev(8b|4h|2s|1d)$")>;
13755f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_1L01_1V], (instregex "ST1Onev(8b|4h|2s|1d)_POST$")>;
1376753f127fSDimitry Andric
1377753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, Q-form
1378753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V],           (instregex "ST1Onev(16b|8h|4s|2d)$")>;
13795f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_1L01_1V], (instregex "ST1Onev(16b|8h|4s|2d)_POST$")>;
1380753f127fSDimitry Andric
1381753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, D-form
1382753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V],           (instregex "ST1Twov(8b|4h|2s|1d)$")>;
13835f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_1L01_1V], (instregex "ST1Twov(8b|4h|2s|1d)_POST$")>;
1384753f127fSDimitry Andric
1385753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, Q-form
1386753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_2L01_2V],           (instregex "ST1Twov(16b|8h|4s|2d)$")>;
13875f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_2L01_2V], (instregex "ST1Twov(16b|8h|4s|2d)_POST$")>;
1388753f127fSDimitry Andric
1389753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, D-form
1390753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_2L01_2V],           (instregex "ST1Threev(8b|4h|2s|1d)$")>;
13915f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_2L01_2V], (instregex "ST1Threev(8b|4h|2s|1d)_POST$")>;
1392753f127fSDimitry Andric
1393753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, Q-form
1394753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_3L01_3V],           (instregex "ST1Threev(16b|8h|4s|2d)$")>;
13955f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_3L01_3V], (instregex "ST1Threev(16b|8h|4s|2d)_POST$")>;
1396753f127fSDimitry Andric
1397753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, D-form
1398753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_2L01_2V],           (instregex "ST1Fourv(8b|4h|2s|1d)$")>;
13995f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_2L01_2V], (instregex "ST1Fourv(8b|4h|2s|1d)_POST$")>;
1400753f127fSDimitry Andric
1401753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, Q-form
1402753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_4L01_4V],           (instregex "ST1Fourv(16b|8h|4s|2d)$")>;
14035f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_4L01_4V], (instregex "ST1Fourv(16b|8h|4s|2d)_POST$")>;
1404753f127fSDimitry Andric
1405753f127fSDimitry Andric// ASIMD store, 1 element, one lane, B/H/S
1406753f127fSDimitry Andric// ASIMD store, 1 element, one lane, D
1407753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1V],           (instregex "ST1i(8|16|32|64)$")>;
14085f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_4cyc_1L01_1V], (instregex "ST1i(8|16|32|64)_POST$")>;
1409753f127fSDimitry Andric
1410753f127fSDimitry Andric// ASIMD store, 2 element, multiple, D-form, B/H/S
1411753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1V],           (instregex "ST2Twov(8b|4h|2s)$")>;
14125f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_4cyc_1L01_1V], (instregex "ST2Twov(8b|4h|2s)_POST$")>;
1413753f127fSDimitry Andric
1414753f127fSDimitry Andric// ASIMD store, 2 element, multiple, Q-form, B/H/S
1415753f127fSDimitry Andric// ASIMD store, 2 element, multiple, Q-form, D
1416753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2L01_2V],           (instregex "ST2Twov(16b|8h|4s|2d)$")>;
14175f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_4cyc_2L01_2V], (instregex "ST2Twov(16b|8h|4s|2d)_POST$")>;
1418753f127fSDimitry Andric
1419753f127fSDimitry Andric// ASIMD store, 2 element, one lane, B/H/S
1420753f127fSDimitry Andric// ASIMD store, 2 element, one lane, D
1421753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1V],           (instregex "ST2i(8|16|32|64)$")>;
14225f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_4cyc_1L01_1V], (instregex "ST2i(8|16|32|64)_POST$")>;
1423753f127fSDimitry Andric
1424753f127fSDimitry Andric// ASIMD store, 3 element, multiple, D-form, B/H/S
1425753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2L01_2V],           (instregex "ST3Threev(8b|4h|2s)$")>;
14265f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_5cyc_2L01_2V], (instregex "ST3Threev(8b|4h|2s)_POST$")>;
1427753f127fSDimitry Andric
1428753f127fSDimitry Andric// ASIMD store, 3 element, multiple, Q-form, B/H/S
1429753f127fSDimitry Andric// ASIMD store, 3 element, multiple, Q-form, D
1430753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L01_3V],           (instregex "ST3Threev(16b|8h|4s|2d)$")>;
14315f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L01_3V], (instregex "ST3Threev(16b|8h|4s|2d)_POST$")>;
1432753f127fSDimitry Andric
1433753f127fSDimitry Andric// ASIMD store, 3 element, one lane, B/H
1434753f127fSDimitry Andric// ASIMD store, 3 element, one lane, S
1435753f127fSDimitry Andric// ASIMD store, 3 element, one lane, D
1436753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L01_3V],           (instregex "ST3i(8|16|32|64)$")>;
14375f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L01_3V], (instregex "ST3i(8|16|32|64)_POST$")>;
1438753f127fSDimitry Andric
1439753f127fSDimitry Andric// ASIMD store, 4 element, multiple, D-form, B/H/S
1440753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L01_3V],           (instregex "ST4Fourv(8b|4h|2s)$")>;
14415f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L01_3V], (instregex "ST4Fourv(8b|4h|2s)_POST$")>;
1442753f127fSDimitry Andric
1443753f127fSDimitry Andric// ASIMD store, 4 element, multiple, Q-form, B/H/S
1444753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_6L01_6V],           (instregex "ST4Fourv(16b|8h|4s)$")>;
14455f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_7cyc_6L01_6V], (instregex "ST4Fourv(16b|8h|4s)_POST$")>;
1446753f127fSDimitry Andric
1447753f127fSDimitry Andric// ASIMD store, 4 element, multiple, Q-form, D
1448753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_4L01_4V],           (instregex "ST4Fourv(2d)$")>;
14495f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_5cyc_4L01_4V], (instregex "ST4Fourv(2d)_POST$")>;
1450753f127fSDimitry Andric
1451753f127fSDimitry Andric// ASIMD store, 4 element, one lane, B/H/S
1452753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L01_3V],           (instregex "ST4i(8|16|32)$")>;
14535f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L01_3V], (instregex "ST4i(8|16|32)_POST$")>;
1454753f127fSDimitry Andric
1455753f127fSDimitry Andric// ASIMD store, 4 element, one lane, D
1456753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_3L01_3V],            (instregex "ST4i(64)$")>;
14575f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_4cyc_3L01_3V],  (instregex "ST4i(64)_POST$")>;
1458753f127fSDimitry Andric
1459753f127fSDimitry Andric// Cryptography extensions
1460753f127fSDimitry Andric// -----------------------------------------------------------------------------
1461753f127fSDimitry Andric
1462753f127fSDimitry Andric// Crypto AES ops
1463753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^AES[DE]rr$", "^AESI?MCrr")>;
1464753f127fSDimitry Andric
1465753f127fSDimitry Andric// Crypto polynomial (64x64) multiply long
1466753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instrs PMULLv1i64, PMULLv2i64)>;
1467753f127fSDimitry Andric
1468753f127fSDimitry Andric// Crypto SHA1 hash acceleration op
1469753f127fSDimitry Andric// Crypto SHA1 schedule acceleration ops
1470753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^SHA1(H|SU0|SU1)")>;
1471753f127fSDimitry Andric
1472753f127fSDimitry Andric// Crypto SHA1 hash acceleration ops
1473753f127fSDimitry Andric// Crypto SHA256 hash acceleration ops
1474753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SHA1[CMP]", "^SHA256H2?")>;
1475753f127fSDimitry Andric
1476753f127fSDimitry Andric// Crypto SHA256 schedule acceleration ops
1477753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^SHA256SU[01]")>;
1478753f127fSDimitry Andric
1479753f127fSDimitry Andric// Crypto SHA512 hash acceleration ops
1480753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^SHA512(H|H2|SU0|SU1)")>;
1481753f127fSDimitry Andric
1482753f127fSDimitry Andric// Crypto SHA3 ops
1483753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instrs BCAX, EOR3, RAX1, XAR)>;
1484753f127fSDimitry Andric
1485753f127fSDimitry Andric// Crypto SM3 ops
1486753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^SM3PARTW[12]$", "^SM3SS1$",
1487753f127fSDimitry Andric                                            "^SM3TT[12][AB]$")>;
1488753f127fSDimitry Andric
1489753f127fSDimitry Andric// Crypto SM4 ops
1490753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instrs SM4E, SM4ENCKEY)>;
1491753f127fSDimitry Andric
1492753f127fSDimitry Andric// CRC
1493753f127fSDimitry Andric// -----------------------------------------------------------------------------
1494753f127fSDimitry Andric
1495753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M0], (instregex "^CRC32")>;
1496753f127fSDimitry Andric
1497753f127fSDimitry Andric// SVE Predicate instructions
1498753f127fSDimitry Andric// -----------------------------------------------------------------------------
1499753f127fSDimitry Andric
1500753f127fSDimitry Andric// Loop control, based on predicate
1501753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instrs BRKA_PPmP, BRKA_PPzP,
1502753f127fSDimitry Andric                                        BRKB_PPmP, BRKB_PPzP)>;
1503753f127fSDimitry Andric
1504753f127fSDimitry Andric// Loop control, based on predicate and flag setting
1505753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], (instrs BRKAS_PPzP, BRKBS_PPzP)>;
1506753f127fSDimitry Andric
1507753f127fSDimitry Andric// Loop control, propagating
1508753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M0], (instrs BRKN_PPzP, BRKPA_PPzPP, BRKPB_PPzPP)>;
1509753f127fSDimitry Andric
1510753f127fSDimitry Andric// Loop control, propagating and flag setting
1511753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M0_1M], (instrs BRKNS_PPzP, BRKPAS_PPzPP,
1512753f127fSDimitry Andric                                            BRKPBS_PPzPP)>;
1513753f127fSDimitry Andric
1514753f127fSDimitry Andric// Loop control, based on GPR
1515753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M],
1516753f127fSDimitry Andric             (instregex "^WHILE(GE|GT|HI|HS|LE|LO|LS|LT)_P(WW|XX)_[BHSD]$")>;
1517753f127fSDimitry Andric
1518753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], (instregex "^WHILE(RW|WR)_PXX_[BHSD]$")>;
1519753f127fSDimitry Andric
1520753f127fSDimitry Andric// Loop terminate
1521753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1M], (instregex "^CTERM(EQ|NE)_(WW|XX)$")>;
1522753f127fSDimitry Andric
1523753f127fSDimitry Andric// Predicate counting scalar
1524753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instrs ADDPL_XXI, ADDVL_XXI, RDVLI_XI)>;
1525753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M],
1526753f127fSDimitry Andric             (instregex "^(CNT|DEC|INC|SQDEC|SQINC|UQDEC|UQINC)[BHWD]_XPiI$",
1527753f127fSDimitry Andric                        "^SQ(DEC|INC)[BHWD]_XPiWdI$",
1528753f127fSDimitry Andric                        "^(UQDEC|UQINC)[BHWD]_WPiI$")>;
1529753f127fSDimitry Andric
1530753f127fSDimitry Andric// Predicate counting scalar, active predicate
1531753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M],
1532753f127fSDimitry Andric             (instregex "^CNTP_XPP_[BHSD]$",
1533753f127fSDimitry Andric                        "^(DEC|INC|SQDEC|SQINC|UQDEC|UQINC)P_XP_[BHSD]$",
1534753f127fSDimitry Andric                        "^(UQDEC|UQINC)P_WP_[BHSD]$",
1535753f127fSDimitry Andric                        "^(SQDEC|SQINC|UQDEC|UQINC)P_XPWd_[BHSD]$")>;
1536753f127fSDimitry Andric
1537753f127fSDimitry Andric// Predicate counting vector, active predicate
1538753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1M_1M0_1V],
1539753f127fSDimitry Andric             (instregex "^(DEC|INC|SQDEC|SQINC|UQDEC|UQINC)P_ZP_[HSD]$")>;
1540753f127fSDimitry Andric
1541753f127fSDimitry Andric// Predicate logical
1542753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1M0],
1543753f127fSDimitry Andric             (instregex "^(AND|BIC|EOR|NAND|NOR|ORN|ORR)_PPzPP$")>;
1544753f127fSDimitry Andric
1545753f127fSDimitry Andric// Predicate logical, flag setting
1546753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M0_1M],
1547753f127fSDimitry Andric             (instregex "^(ANDS|BICS|EORS|NANDS|NORS|ORNS|ORRS)_PPzPP$")>;
1548753f127fSDimitry Andric
1549753f127fSDimitry Andric// Predicate reverse
1550753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instregex "^REV_PP_[BHSD]$")>;
1551753f127fSDimitry Andric
1552753f127fSDimitry Andric// Predicate select
1553753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1M0], (instrs SEL_PPPP)>;
1554753f127fSDimitry Andric
1555753f127fSDimitry Andric// Predicate set
1556753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instregex "^PFALSE$", "^PTRUE_[BHSD]$")>;
1557753f127fSDimitry Andric
1558753f127fSDimitry Andric// Predicate set/initialize, set flags
1559753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], (instregex "^PTRUES_[BHSD]$")>;
1560753f127fSDimitry Andric
1561753f127fSDimitry Andric// Predicate find first/next
1562753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], (instregex "^PFIRST_B$", "^PNEXT_[BHSD]$")>;
1563753f127fSDimitry Andric
1564753f127fSDimitry Andric// Predicate test
1565753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1M], (instrs PTEST_PP)>;
1566753f127fSDimitry Andric
1567753f127fSDimitry Andric// Predicate transpose
1568753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instregex "^TRN[12]_PPP_[BHSDQ]$")>;
1569753f127fSDimitry Andric
1570753f127fSDimitry Andric// Predicate unpack and widen
1571753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instrs PUNPKHI_PP, PUNPKLO_PP)>;
1572753f127fSDimitry Andric
1573753f127fSDimitry Andric// Predicate zip/unzip
1574753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instregex "^(ZIP|UZP)[12]_PPP_[BHSDQ]$")>;
1575753f127fSDimitry Andric
1576753f127fSDimitry Andric// SVE integer instructions
1577753f127fSDimitry Andric// -----------------------------------------------------------------------------
1578753f127fSDimitry Andric
1579753f127fSDimitry Andric// Arithmetic, absolute diff
1580*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^[SU]ABD_ZPmZ_[BHSD]",
1581*0fca6ea1SDimitry Andric                                           "^[SU]ABD_ZPZZ_[BHSD]")>;
1582753f127fSDimitry Andric
1583753f127fSDimitry Andric// Arithmetic, absolute diff accum
1584753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]ABA_ZZZ_[BHSD]$")>;
1585753f127fSDimitry Andric
1586753f127fSDimitry Andric// Arithmetic, absolute diff accum long
1587753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]ABAL[TB]_ZZZ_[HSD]$")>;
1588753f127fSDimitry Andric
1589753f127fSDimitry Andric// Arithmetic, absolute diff long
1590753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^[SU]ABDL[TB]_ZZZ_[HSD]$")>;
1591753f127fSDimitry Andric
1592753f127fSDimitry Andric// Arithmetic, basic
1593753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V],
1594*0fca6ea1SDimitry Andric             (instregex "^(ABS|ADD|CNOT|NEG|SUB|SUBR)_ZPmZ_[BHSD]",
1595*0fca6ea1SDimitry Andric                        "^(ADD|SUB)_ZZZ_[BHSD]",
1596*0fca6ea1SDimitry Andric                        "^(ADD|SUB|SUBR)_ZPZZ_[BHSD]",
1597*0fca6ea1SDimitry Andric                        "^(ADD|SUB|SUBR)_ZI_[BHSD]",
1598*0fca6ea1SDimitry Andric                        "^ADR_[SU]XTW_ZZZ_D_[0123]",
1599*0fca6ea1SDimitry Andric                        "^ADR_LSL_ZZZ_[SD]_[0123]",
1600*0fca6ea1SDimitry Andric                        "^[SU](ADD|SUB)[LW][BT]_ZZZ_[HSD]",
1601*0fca6ea1SDimitry Andric                        "^SADDLBT_ZZZ_[HSD]",
1602*0fca6ea1SDimitry Andric                        "^[SU]H(ADD|SUB|SUBR)_ZPmZ_[BHSD]",
1603*0fca6ea1SDimitry Andric                        "^SSUBL(BT|TB)_ZZZ_[HSD]")>;
1604753f127fSDimitry Andric
1605753f127fSDimitry Andric// Arithmetic, complex
1606753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V],
1607*0fca6ea1SDimitry Andric             (instregex "^R?(ADD|SUB)HN[BT]_ZZZ_[BHS]",
1608*0fca6ea1SDimitry Andric                        "^SQ(ABS|ADD|NEG|SUB|SUBR)_ZPmZ_[BHSD]",
1609*0fca6ea1SDimitry Andric                        "^[SU]Q(ADD|SUB)_ZZZ_[BHSD]",
1610*0fca6ea1SDimitry Andric                        "^[SU]Q(ADD|SUB)_ZI_[BHSD]",
1611*0fca6ea1SDimitry Andric                        "^(SRH|SUQ|UQ|USQ|URH)ADD_ZPmZ_[BHSD]",
1612*0fca6ea1SDimitry Andric                        "^(UQSUB|UQSUBR)_ZPmZ_[BHSD]")>;
1613753f127fSDimitry Andric
1614753f127fSDimitry Andric// Arithmetic, large integer
1615753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^(AD|SB)CL[BT]_ZZZ_[SD]$")>;
1616753f127fSDimitry Andric
1617753f127fSDimitry Andric// Arithmetic, pairwise add
1618753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^ADDP_ZPmZ_[BHSD]$")>;
1619753f127fSDimitry Andric
1620753f127fSDimitry Andric// Arithmetic, pairwise add and accum long
1621753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]ADALP_ZPmZ_[HSD]$")>;
1622753f127fSDimitry Andric
1623753f127fSDimitry Andric// Arithmetic, shift
1624753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1],
1625*0fca6ea1SDimitry Andric             (instregex "^(ASR|LSL|LSR)_WIDE_ZPmZ_[BHS]",
1626*0fca6ea1SDimitry Andric                        "^(ASR|LSL|LSR)_WIDE_ZZZ_[BHS]",
1627*0fca6ea1SDimitry Andric                        "^(ASR|LSL|LSR)_ZPmI_[BHSD]",
1628*0fca6ea1SDimitry Andric                        "^(ASR|LSL|LSR)_ZPmZ_[BHSD]",
1629*0fca6ea1SDimitry Andric                        "^(ASR|LSL|LSR)_ZZI_[BHSD]",
1630*0fca6ea1SDimitry Andric                        "^(ASR|LSL|LSR)_ZPZ[IZ]_[BHSD]",
1631*0fca6ea1SDimitry Andric                        "^(ASRR|LSLR|LSRR)_ZPmZ_[BHSD]")>;
1632753f127fSDimitry Andric
1633753f127fSDimitry Andric// Arithmetic, shift and accumulate
1634753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1],
1635753f127fSDimitry Andric             (instregex "^(SRSRA|SSRA|URSRA|USRA)_ZZI_[BHSD]$")>;
1636753f127fSDimitry Andric
1637753f127fSDimitry Andric// Arithmetic, shift by immediate
1638753f127fSDimitry Andric// Arithmetic, shift by immediate and insert
1639753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1],
1640753f127fSDimitry Andric             (instregex "^(SHRNB|SHRNT|SSHLLB|SSHLLT|USHLLB|USHLLT|SLI|SRI)_ZZI_[BHSD]$")>;
1641753f127fSDimitry Andric
1642753f127fSDimitry Andric// Arithmetic, shift complex
1643753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1],
1644*0fca6ea1SDimitry Andric             (instregex "^(SQ)?RSHRU?N[BT]_ZZI_[BHS]",
1645*0fca6ea1SDimitry Andric                        "^(SQRSHL|SQRSHLR|SQSHL|SQSHLR|UQRSHL|UQRSHLR|UQSHL|UQSHLR)_ZPmZ_[BHSD]",
1646*0fca6ea1SDimitry Andric                        "^[SU]QR?SHL_ZPZZ_[BHSD]",
1647*0fca6ea1SDimitry Andric                        "^(SQSHL|SQSHLU|UQSHL)_(ZPmI|ZPZI)_[BHSD]",
1648*0fca6ea1SDimitry Andric                        "^SQSHRU?N[BT]_ZZI_[BHS]",
1649*0fca6ea1SDimitry Andric                        "^UQR?SHRN[BT]_ZZI_[BHS]")>;
1650753f127fSDimitry Andric
1651753f127fSDimitry Andric// Arithmetic, shift right for divide
1652*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^ASRD_(ZPmI|ZPZI)_[BHSD]")>;
1653753f127fSDimitry Andric
1654753f127fSDimitry Andric// Arithmetic, shift rounding
1655*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]RSHLR?_ZPmZ_[BHSD]",
1656*0fca6ea1SDimitry Andric                                             "^[SU]RSHL_ZPZZ_[BHSD]",
1657*0fca6ea1SDimitry Andric                                             "^[SU]RSHR_(ZPmI|ZPZI)_[BHSD]")>;
1658753f127fSDimitry Andric
1659753f127fSDimitry Andric// Bit manipulation
1660*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_2V1], (instregex "^(BDEP|BEXT|BGRP)_ZZZ_[BHSD]")>;
1661753f127fSDimitry Andric
1662753f127fSDimitry Andric// Bitwise select
1663753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^(BSL|BSL1N|BSL2N|NBSL)_ZZZZ$")>;
1664753f127fSDimitry Andric
1665753f127fSDimitry Andric// Count/reverse bits
1666*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^(CLS|CLZ|CNT|RBIT)_ZPmZ_[BHSD]")>;
1667753f127fSDimitry Andric
1668753f127fSDimitry Andric// Broadcast logical bitmask immediate to vector
1669753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instrs DUPM_ZI)>;
1670753f127fSDimitry Andric
1671753f127fSDimitry Andric// Compare and set flags
1672753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0_1M],
1673753f127fSDimitry Andric             (instregex "^CMP(EQ|GE|GT|HI|HS|LE|LO|LS|LT|NE)_PPzZ[IZ]_[BHSD]$",
1674753f127fSDimitry Andric                        "^CMP(EQ|GE|GT|HI|HS|LE|LO|LS|LT|NE)_WIDE_PPzZZ_[BHS]$")>;
1675753f127fSDimitry Andric
1676753f127fSDimitry Andric// Complex add
1677753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^(SQ)?CADD_ZZI_[BHSD]$")>;
1678753f127fSDimitry Andric
1679753f127fSDimitry Andric// Complex dot product 8-bit element
1680753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instrs CDOT_ZZZ_S, CDOT_ZZZI_S)>;
1681753f127fSDimitry Andric
1682753f127fSDimitry Andric// Complex dot product 16-bit element
1683753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instrs CDOT_ZZZ_D, CDOT_ZZZI_D)>;
1684753f127fSDimitry Andric
1685753f127fSDimitry Andric// Complex multiply-add B, H, S element size
1686753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^CMLA_ZZZ_[BHS]$",
1687753f127fSDimitry Andric                                            "^CMLA_ZZZI_[HS]$")>;
1688753f127fSDimitry Andric
1689753f127fSDimitry Andric// Complex multiply-add D element size
1690753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instrs CMLA_ZZZ_D)>;
1691753f127fSDimitry Andric
1692753f127fSDimitry Andric// Conditional extract operations, scalar form
1693753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1M0_1V1_1V], (instregex "^CLAST[AB]_RPZ_[BHSD]$")>;
1694753f127fSDimitry Andric
1695753f127fSDimitry Andric// Conditional extract operations, SIMD&FP scalar and vector forms
1696753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V1], (instregex "^CLAST[AB]_[VZ]PZ_[BHSD]$",
1697753f127fSDimitry Andric                                            "^COMPACT_ZPZ_[SD]$",
1698753f127fSDimitry Andric                                            "^SPLICE_ZPZZ?_[BHSD]$")>;
1699753f127fSDimitry Andric
1700753f127fSDimitry Andric// Convert to floating point, 64b to float or convert to double
1701*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^[SU]CVTF_ZPmZ_Dto[HSD]",
1702*0fca6ea1SDimitry Andric                                            "^[SU]CVTF_ZPmZ_StoD")>;
1703753f127fSDimitry Andric
1704753f127fSDimitry Andric// Convert to floating point, 32b to single or half
1705*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^[SU]CVTF_ZPmZ_Sto[HS]")>;
1706753f127fSDimitry Andric
1707753f127fSDimitry Andric// Convert to floating point, 16b to half
1708*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^[SU]CVTF_ZPmZ_HtoH")>;
1709753f127fSDimitry Andric
1710753f127fSDimitry Andric// Copy, scalar
1711753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1M0_1V], (instregex "^CPY_ZPmR_[BHSD]$")>;
1712753f127fSDimitry Andric
1713753f127fSDimitry Andric// Copy, scalar SIMD&FP or imm
1714753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^CPY_ZPm[IV]_[BHSD]$",
1715753f127fSDimitry Andric                                           "^CPY_ZPzI_[BHSD]$")>;
1716753f127fSDimitry Andric
1717753f127fSDimitry Andric// Divides, 32 bit
1718*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_12cyc_1V0], (instregex "^[SU]DIVR?_ZPmZ_S",
1719*0fca6ea1SDimitry Andric                                             "^[SU]DIV_ZPZZ_S")>;
1720753f127fSDimitry Andric
1721753f127fSDimitry Andric// Divides, 64 bit
1722*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_20cyc_1V0], (instregex "^[SU]DIVR?_ZPmZ_D",
1723*0fca6ea1SDimitry Andric                                             "^[SU]DIV_ZPZZ_D")>;
1724753f127fSDimitry Andric
1725753f127fSDimitry Andric// Dot product, 8 bit
1726753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^[SU]DOT_ZZZI?_S$")>;
1727753f127fSDimitry Andric
1728753f127fSDimitry Andric// Dot product, 8 bit, using signed and unsigned integers
1729753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instrs SUDOT_ZZZI, USDOT_ZZZI, USDOT_ZZZ)>;
1730753f127fSDimitry Andric
1731753f127fSDimitry Andric// Dot product, 16 bit
1732753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^[SU]DOT_ZZZI?_D$")>;
1733753f127fSDimitry Andric
1734753f127fSDimitry Andric// Duplicate, immediate and indexed form
1735753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^DUP_ZI_[BHSD]$",
1736753f127fSDimitry Andric                                           "^DUP_ZZI_[BHSDQ]$")>;
1737753f127fSDimitry Andric
1738753f127fSDimitry Andric// Duplicate, scalar form
1739753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M0], (instregex "^DUP_ZR_[BHSD]$")>;
1740753f127fSDimitry Andric
1741753f127fSDimitry Andric// Extend, sign or zero
1742*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^[SU]XTB_ZPmZ_[HSD]",
1743*0fca6ea1SDimitry Andric                                            "^[SU]XTH_ZPmZ_[SD]",
1744*0fca6ea1SDimitry Andric                                            "^[SU]XTW_ZPmZ_[D]")>;
1745753f127fSDimitry Andric
1746753f127fSDimitry Andric// Extract
1747753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instrs EXT_ZZI, EXT_ZZI_B)>;
1748753f127fSDimitry Andric
1749753f127fSDimitry Andric// Extract narrow saturating
1750753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]QXTN[BT]_ZZ_[BHS]$",
1751753f127fSDimitry Andric                                            "^SQXTUN[BT]_ZZ_[BHS]$")>;
1752753f127fSDimitry Andric
1753753f127fSDimitry Andric// Extract/insert operation, SIMD and FP scalar form
1754753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V1], (instregex "^LAST[AB]_VPZ_[BHSD]$",
1755753f127fSDimitry Andric                                            "^INSR_ZV_[BHSD]$")>;
1756753f127fSDimitry Andric
1757753f127fSDimitry Andric// Extract/insert operation, scalar
1758753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1V1_1M0], (instregex "^LAST[AB]_RPZ_[BHSD]$",
1759753f127fSDimitry Andric                                                "^INSR_ZR_[BHSD]$")>;
1760753f127fSDimitry Andric
1761753f127fSDimitry Andric// Histogram operations
1762753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^HISTCNT_ZPzZZ_[SD]$",
1763753f127fSDimitry Andric                                           "^HISTSEG_ZZZ$")>;
1764753f127fSDimitry Andric
1765753f127fSDimitry Andric// Horizontal operations, B, H, S form, immediate operands only
1766753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^INDEX_II_[BHS]$")>;
1767753f127fSDimitry Andric
1768753f127fSDimitry Andric// Horizontal operations, B, H, S form, scalar, immediate operands/ scalar
1769753f127fSDimitry Andric// operands only / immediate, scalar operands
1770753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1M0_1V0], (instregex "^INDEX_(IR|RI|RR)_[BHS]$")>;
1771753f127fSDimitry Andric
1772753f127fSDimitry Andric// Horizontal operations, D form, immediate operands only
1773753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instrs INDEX_II_D)>;
1774753f127fSDimitry Andric
1775753f127fSDimitry Andric// Horizontal operations, D form, scalar, immediate operands)/ scalar operands
1776753f127fSDimitry Andric// only / immediate, scalar operands
1777753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2M0_2V0], (instregex "^INDEX_(IR|RI|RR)_D$")>;
1778753f127fSDimitry Andric
1779753f127fSDimitry Andric// Logical
1780753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V],
1781*0fca6ea1SDimitry Andric             (instregex "^(AND|EOR|ORR)_ZI",
1782*0fca6ea1SDimitry Andric                        "^(AND|BIC|EOR|ORR)_ZZZ",
1783*0fca6ea1SDimitry Andric                        "^EOR(BT|TB)_ZZZ_[BHSD]",
1784*0fca6ea1SDimitry Andric                        "^(AND|BIC|EOR|NOT|ORR)_(ZPmZ|ZPZZ)_[BHSD]",
1785*0fca6ea1SDimitry Andric                        "^NOT_ZPmZ_[BHSD]")>;
1786753f127fSDimitry Andric
1787753f127fSDimitry Andric// Max/min, basic and pairwise
1788*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^[SU](MAX|MIN)_ZI_[BHSD]",
1789*0fca6ea1SDimitry Andric                                           "^[SU](MAX|MIN)P?_ZPmZ_[BHSD]",
1790*0fca6ea1SDimitry Andric                                           "^[SU](MAX|MIN)_ZPZZ_[BHSD]")>;
1791753f127fSDimitry Andric
1792753f127fSDimitry Andric// Matching operations
1793753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0_1M], (instregex "^N?MATCH_PPzZZ_[BH]$")>;
1794753f127fSDimitry Andric
1795753f127fSDimitry Andric// Matrix multiply-accumulate
1796753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instrs SMMLA_ZZZ, UMMLA_ZZZ, USMMLA_ZZZ)>;
1797753f127fSDimitry Andric
1798753f127fSDimitry Andric// Move prefix
1799753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^MOVPRFX_ZP[mz]Z_[BHSD]$",
1800753f127fSDimitry Andric                                           "^MOVPRFX_ZZ$")>;
1801753f127fSDimitry Andric
1802753f127fSDimitry Andric// Multiply, B, H, S element size
1803*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^MUL_(ZI|ZPmZ|ZZZI|ZZZ)_[BHS]",
1804*0fca6ea1SDimitry Andric                                             "^MUL_ZPZZ_[BHS]",
1805*0fca6ea1SDimitry Andric                                             "^[SU]MULH_(ZPmZ|ZZZ)_[BHS]",
1806*0fca6ea1SDimitry Andric                                             "^[SU]MULH_ZPZZ_[BHS]")>;
1807753f127fSDimitry Andric
1808753f127fSDimitry Andric// Multiply, D element size
1809*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instregex "^MUL_(ZI|ZPmZ|ZZZI|ZZZ)_D",
1810*0fca6ea1SDimitry Andric                                             "^MUL_ZPZZ_D",
1811*0fca6ea1SDimitry Andric                                             "^[SU]MULH_(ZPmZ|ZZZ)_D",
1812*0fca6ea1SDimitry Andric                                             "^[SU]MULH_ZPZZ_D")>;
1813753f127fSDimitry Andric
1814753f127fSDimitry Andric// Multiply long
1815753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^[SU]MULL[BT]_ZZZI_[SD]$",
1816753f127fSDimitry Andric                                            "^[SU]MULL[BT]_ZZZ_[HSD]$")>;
1817753f127fSDimitry Andric
1818753f127fSDimitry Andric// Multiply accumulate, B, H, S element size
1819753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^ML[AS]_ZZZI_[BHS]$",
1820*0fca6ea1SDimitry Andric                                            "^(ML[AS]|MAD|MSB)_(ZPmZZ|ZPZZZ)_[BHS]")>;
1821753f127fSDimitry Andric
1822753f127fSDimitry Andric// Multiply accumulate, D element size
1823753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instregex "^ML[AS]_ZZZI_D$",
1824*0fca6ea1SDimitry Andric                                            "^(ML[AS]|MAD|MSB)_(ZPmZZ|ZPZZZ)_D")>;
1825753f127fSDimitry Andric
1826753f127fSDimitry Andric// Multiply accumulate long
1827753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^[SU]ML[AS]L[BT]_ZZZ_[HSD]$",
1828753f127fSDimitry Andric                                            "^[SU]ML[AS]L[BT]_ZZZI_[SD]$")>;
1829753f127fSDimitry Andric
1830753f127fSDimitry Andric// Multiply accumulate saturating doubling long regular
1831753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQDML[AS](LB|LT|LBT)_ZZZ_[HSD]$",
1832753f127fSDimitry Andric                                            "^SQDML[AS](LB|LT)_ZZZI_[SD]$")>;
1833753f127fSDimitry Andric
1834753f127fSDimitry Andric// Multiply saturating doubling high, B, H, S element size
1835753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQDMULH_ZZZ_[BHS]$",
1836753f127fSDimitry Andric                                            "^SQDMULH_ZZZI_[HS]$")>;
1837753f127fSDimitry Andric
1838753f127fSDimitry Andric// Multiply saturating doubling high, D element size
1839753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instrs SQDMULH_ZZZ_D, SQDMULH_ZZZI_D)>;
1840753f127fSDimitry Andric
1841753f127fSDimitry Andric// Multiply saturating doubling long
1842753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQDMULL[BT]_ZZZ_[HSD]$",
1843753f127fSDimitry Andric                                            "^SQDMULL[BT]_ZZZI_[SD]$")>;
1844753f127fSDimitry Andric
1845753f127fSDimitry Andric// Multiply saturating rounding doubling regular/complex accumulate, B, H, S
1846753f127fSDimitry Andric// element size
1847753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQRDML[AS]H_ZZZ_[BHS]$",
1848753f127fSDimitry Andric                                            "^SQRDCMLAH_ZZZ_[BHS]$",
1849753f127fSDimitry Andric                                            "^SQRDML[AS]H_ZZZI_[HS]$",
1850753f127fSDimitry Andric                                            "^SQRDCMLAH_ZZZI_[HS]$")>;
1851753f127fSDimitry Andric
1852753f127fSDimitry Andric// Multiply saturating rounding doubling regular/complex accumulate, D element
1853753f127fSDimitry Andric// size
1854753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instregex "^SQRDML[AS]H_ZZZI?_D$",
1855753f127fSDimitry Andric                                            "^SQRDCMLAH_ZZZ_D$")>;
1856753f127fSDimitry Andric
1857753f127fSDimitry Andric// Multiply saturating rounding doubling regular/complex, B, H, S element size
1858753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQRDMULH_ZZZ_[BHS]$",
1859753f127fSDimitry Andric                                            "^SQRDMULH_ZZZI_[HS]$")>;
1860753f127fSDimitry Andric
1861753f127fSDimitry Andric// Multiply saturating rounding doubling regular/complex, D element size
1862753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instregex "^SQRDMULH_ZZZI?_D$")>;
1863753f127fSDimitry Andric
1864753f127fSDimitry Andric// Multiply/multiply long, (8x8) polynomial
1865753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^PMUL_ZZZ_B$",
1866753f127fSDimitry Andric                                            "^PMULL[BT]_ZZZ_[HDQ]$")>;
1867753f127fSDimitry Andric
1868753f127fSDimitry Andric// Predicate counting vector
1869753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0],
1870753f127fSDimitry Andric             (instregex "^(DEC|INC|SQDEC|SQINC|UQDEC|UQINC)[HWD]_ZPiI$")>;
1871753f127fSDimitry Andric
1872753f127fSDimitry Andric// Reciprocal estimate
1873*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^URECPE_ZPmZ_S", "^URSQRTE_ZPmZ_S")>;
1874753f127fSDimitry Andric
1875753f127fSDimitry Andric// Reduction, arithmetic, B form
1876753f127fSDimitry Andricdef : InstRW<[N2Write_11cyc_2V_2V1], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_B")>;
1877753f127fSDimitry Andric
1878753f127fSDimitry Andric// Reduction, arithmetic, H form
1879753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_2V_2V1], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_H")>;
1880753f127fSDimitry Andric
1881753f127fSDimitry Andric// Reduction, arithmetic, S form
1882753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2V_2V1], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_S")>;
1883753f127fSDimitry Andric
1884753f127fSDimitry Andric// Reduction, arithmetic, D form
1885753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2V_2V1], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_D")>;
1886753f127fSDimitry Andric
1887753f127fSDimitry Andric// Reduction, logical
1888753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1V_1V1], (instregex "^(ANDV|EORV|ORV)_VPZ_[BHSD]$")>;
1889753f127fSDimitry Andric
1890753f127fSDimitry Andric// Reverse, vector
1891753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^REV_ZZ_[BHSD]$",
1892753f127fSDimitry Andric                                           "^REVB_ZPmZ_[HSD]$",
1893753f127fSDimitry Andric                                           "^REVH_ZPmZ_[SD]$",
1894753f127fSDimitry Andric                                           "^REVW_ZPmZ_D$")>;
1895753f127fSDimitry Andric
1896753f127fSDimitry Andric// Select, vector form
1897753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^SEL_ZPZZ_[BHSD]$")>;
1898753f127fSDimitry Andric
1899753f127fSDimitry Andric// Table lookup
1900753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^TBL_ZZZZ?_[BHSD]$")>;
1901753f127fSDimitry Andric
1902753f127fSDimitry Andric// Table lookup extension
1903753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^TBX_ZZZ_[BHSD]$")>;
1904753f127fSDimitry Andric
1905753f127fSDimitry Andric// Transpose, vector form
1906753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^TRN[12]_ZZZ_[BHSDQ]$")>;
1907753f127fSDimitry Andric
1908753f127fSDimitry Andric// Unpack and extend
1909753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^[SU]UNPK(HI|LO)_ZZ_[HSD]$")>;
1910753f127fSDimitry Andric
1911753f127fSDimitry Andric// Zip/unzip
1912753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^(UZP|ZIP)[12]_ZZZ_[BHSDQ]$")>;
1913753f127fSDimitry Andric
1914753f127fSDimitry Andric// SVE floating-point instructions
1915753f127fSDimitry Andric// -----------------------------------------------------------------------------
1916753f127fSDimitry Andric
1917753f127fSDimitry Andric// Floating point absolute value/difference
1918*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^FAB[SD]_ZPmZ_[HSD]",
1919*0fca6ea1SDimitry Andric                                           "^FABD_ZPZZ_[HSD]",
1920*0fca6ea1SDimitry Andric                                           "^FABS_ZPmZ_[HSD]")>;
1921753f127fSDimitry Andric
1922753f127fSDimitry Andric// Floating point arithmetic
1923*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^F(ADD|SUB)_(ZPm[IZ]|ZZZ)_[HSD]",
1924*0fca6ea1SDimitry Andric                                           "^F(ADD|SUB)_ZPZ[IZ]_[HSD]",
1925*0fca6ea1SDimitry Andric                                           "^FADDP_ZPmZZ_[HSD]",
1926*0fca6ea1SDimitry Andric                                           "^FNEG_ZPmZ_[HSD]",
1927*0fca6ea1SDimitry Andric                                           "^FSUBR_ZPm[IZ]_[HSD]",
1928*0fca6ea1SDimitry Andric                                           "^FSUBR_(ZPZI|ZPZZ)_[HSD]")>;
1929753f127fSDimitry Andric
1930753f127fSDimitry Andric// Floating point associative add, F16
1931753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_1V1], (instrs FADDA_VPZ_H)>;
1932753f127fSDimitry Andric
1933753f127fSDimitry Andric// Floating point associative add, F32
1934753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1V1], (instrs FADDA_VPZ_S)>;
1935753f127fSDimitry Andric
1936753f127fSDimitry Andric// Floating point associative add, F64
1937753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instrs FADDA_VPZ_D)>;
1938753f127fSDimitry Andric
1939753f127fSDimitry Andric// Floating point compare
1940753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^FACG[ET]_PPzZZ_[HSD]$",
1941753f127fSDimitry Andric                                            "^FCM(EQ|GE|GT|NE)_PPzZ[0Z]_[HSD]$",
1942753f127fSDimitry Andric                                            "^FCM(LE|LT)_PPzZ0_[HSD]$",
1943753f127fSDimitry Andric                                            "^FCMUO_PPzZZ_[HSD]$")>;
1944753f127fSDimitry Andric
1945753f127fSDimitry Andric// Floating point complex add
1946753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^FCADD_ZPmZ_[HSD]$")>;
1947753f127fSDimitry Andric
1948753f127fSDimitry Andric// Floating point complex multiply add
1949753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1V], (instregex "^FCMLA_ZPmZZ_[HSD]$",
1950753f127fSDimitry Andric                                           "^FCMLA_ZZZI_[HS]$")>;
1951753f127fSDimitry Andric
1952753f127fSDimitry Andric// Floating point convert, long or narrow (F16 to F32 or F32 to F16)
1953*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FCVT_ZPmZ_(HtoS|StoH)",
1954*0fca6ea1SDimitry Andric                                            "^FCVTLT_ZPmZ_HtoS",
1955*0fca6ea1SDimitry Andric                                            "^FCVTNT_ZPmZ_StoH")>;
1956753f127fSDimitry Andric
1957753f127fSDimitry Andric// Floating point convert, long or narrow (F16 to F64, F32 to F64, F64 to F32
1958753f127fSDimitry Andric// or F64 to F16)
1959*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FCVT_ZPmZ_(HtoD|StoD|DtoS|DtoH)",
1960*0fca6ea1SDimitry Andric                                            "^FCVTLT_ZPmZ_StoD",
1961*0fca6ea1SDimitry Andric                                            "^FCVTNT_ZPmZ_DtoS")>;
1962753f127fSDimitry Andric
1963753f127fSDimitry Andric// Floating point convert, round to odd
1964753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instrs FCVTX_ZPmZ_DtoS, FCVTXNT_ZPmZ_DtoS)>;
1965753f127fSDimitry Andric
1966753f127fSDimitry Andric// Floating point base2 log, F16
1967*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^FLOGB_(ZPmZ|ZPZZ)_H")>;
1968753f127fSDimitry Andric
1969753f127fSDimitry Andric// Floating point base2 log, F32
1970*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FLOGB_(ZPmZ|ZPZZ)_S")>;
1971753f127fSDimitry Andric
1972753f127fSDimitry Andric// Floating point base2 log, F64
1973*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FLOGB_(ZPmZ|ZPZZ)_D")>;
1974753f127fSDimitry Andric
1975753f127fSDimitry Andric// Floating point convert to integer, F16
1976*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^FCVTZ[SU]_ZPmZ_HtoH")>;
1977753f127fSDimitry Andric
1978753f127fSDimitry Andric// Floating point convert to integer, F32
1979*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FCVTZ[SU]_ZPmZ_(HtoS|StoS)")>;
1980753f127fSDimitry Andric
1981753f127fSDimitry Andric// Floating point convert to integer, F64
1982753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0],
1983*0fca6ea1SDimitry Andric             (instregex "^FCVTZ[SU]_ZPmZ_(HtoD|StoD|DtoS|DtoD)")>;
1984753f127fSDimitry Andric
1985753f127fSDimitry Andric// Floating point copy
1986753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^FCPY_ZPmI_[HSD]$",
1987753f127fSDimitry Andric                                           "^FDUP_ZI_[HSD]$")>;
1988753f127fSDimitry Andric
1989753f127fSDimitry Andric// Floating point divide, F16
1990*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_13cyc_1V0], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_H")>;
1991753f127fSDimitry Andric
1992753f127fSDimitry Andric// Floating point divide, F32
1993*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_10cyc_1V0], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_S")>;
1994753f127fSDimitry Andric
1995753f127fSDimitry Andric// Floating point divide, F64
1996*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_15cyc_1V0], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_D")>;
1997753f127fSDimitry Andric
1998753f127fSDimitry Andric// Floating point min/max pairwise
1999*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^F(MAX|MIN)(NM)?P_ZPmZZ_[HSD]")>;
2000753f127fSDimitry Andric
2001753f127fSDimitry Andric// Floating point min/max
2002*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^F(MAX|MIN)(NM)?_ZPm[IZ]_[HSD]",
2003*0fca6ea1SDimitry Andric                                           "^F(MAX|MIN)(NM)?_ZPZ[IZ]_[HSD]")>;
2004753f127fSDimitry Andric
2005753f127fSDimitry Andric// Floating point multiply
2006*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^(FSCALE|FMULX)_ZPmZ_[HSD]",
2007*0fca6ea1SDimitry Andric                                           "^FMULX_ZPZZ_[HSD]",
2008*0fca6ea1SDimitry Andric                                           "^FMUL_(ZPm[IZ]|ZZZI?)_[HSD]",
2009*0fca6ea1SDimitry Andric                                           "^FMUL_ZPZ[IZ]_[HSD]")>;
2010753f127fSDimitry Andric
2011753f127fSDimitry Andric// Floating point multiply accumulate
2012*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^F(N?M(AD|SB)|N?ML[AS])_ZPmZZ_[HSD]$",
2013*0fca6ea1SDimitry Andric                                           "^FN?ML[AS]_ZPZZZ_[HSD]",
2014*0fca6ea1SDimitry Andric                                           "^FML[AS]_ZZZI_[HSD]$")>;
2015753f127fSDimitry Andric
2016753f127fSDimitry Andric// Floating point multiply add/sub accumulate long
2017753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FML[AS]L[BT]_ZZZI?_SHH$")>;
2018753f127fSDimitry Andric
2019753f127fSDimitry Andric// Floating point reciprocal estimate, F16
2020*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^FR(ECP|SQRT)E_ZZ_H", "^FRECPX_ZPmZ_H")>;
2021753f127fSDimitry Andric
2022753f127fSDimitry Andric// Floating point reciprocal estimate, F32
2023*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FR(ECP|SQRT)E_ZZ_S", "^FRECPX_ZPmZ_S")>;
2024753f127fSDimitry Andric
2025753f127fSDimitry Andric// Floating point reciprocal estimate, F64
2026*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FR(ECP|SQRT)E_ZZ_D", "^FRECPX_ZPmZ_D")>;
2027753f127fSDimitry Andric
2028753f127fSDimitry Andric// Floating point reciprocal step
2029753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^F(RECPS|RSQRTS)_ZZZ_[HSD]$")>;
2030753f127fSDimitry Andric
2031753f127fSDimitry Andric// Floating point reduction, F16
2032753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_2V],
2033753f127fSDimitry Andric             (instregex "^(FADDV|FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_H$")>;
2034753f127fSDimitry Andric
2035753f127fSDimitry Andric// Floating point reduction, F32
2036753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V],
2037753f127fSDimitry Andric             (instregex "^(FADDV|FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_S$")>;
2038753f127fSDimitry Andric
2039753f127fSDimitry Andric// Floating point reduction, F64
2040753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V],
2041753f127fSDimitry Andric             (instregex "^(FADDV|FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_D$")>;
2042753f127fSDimitry Andric
2043753f127fSDimitry Andric// Floating point round to integral, F16
2044*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^FRINT[AIMNPXZ]_ZPmZ_H")>;
2045753f127fSDimitry Andric
2046753f127fSDimitry Andric// Floating point round to integral, F32
2047*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FRINT[AIMNPXZ]_ZPmZ_S")>;
2048753f127fSDimitry Andric
2049753f127fSDimitry Andric// Floating point round to integral, F64
2050*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FRINT[AIMNPXZ]_ZPmZ_D")>;
2051753f127fSDimitry Andric
2052753f127fSDimitry Andric// Floating point square root, F16
2053*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_13cyc_1V0], (instregex "^FSQRT_ZPmZ_H")>;
2054753f127fSDimitry Andric
2055753f127fSDimitry Andric// Floating point square root, F32
2056*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_10cyc_1V0], (instregex "^FSQRT_ZPmZ_S")>;
2057753f127fSDimitry Andric
2058753f127fSDimitry Andric// Floating point square root, F64
2059*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_16cyc_1V0], (instregex "^FSQRT_ZPmZ_D")>;
2060753f127fSDimitry Andric
2061753f127fSDimitry Andric// Floating point trigonometric exponentiation
2062753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V1], (instregex "^FEXPA_ZZ_[HSD]$")>;
2063753f127fSDimitry Andric
2064753f127fSDimitry Andric// Floating point trigonometric multiply add
2065753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FTMAD_ZZI_[HSD]$")>;
2066753f127fSDimitry Andric
2067753f127fSDimitry Andric// Floating point trigonometric, miscellaneous
2068753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^FTS(MUL|SEL)_ZZZ_[HSD]$")>;
2069753f127fSDimitry Andric
2070753f127fSDimitry Andric// SVE BFloat16 (BF16) instructions
2071753f127fSDimitry Andric// -----------------------------------------------------------------------------
2072753f127fSDimitry Andric
2073753f127fSDimitry Andric// Convert, F32 to BF16
2074753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instrs BFCVT_ZPmZ, BFCVTNT_ZPmZ)>;
2075753f127fSDimitry Andric
2076753f127fSDimitry Andric// Dot product
2077753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instrs BFDOT_ZZI, BFDOT_ZZZ)>;
2078753f127fSDimitry Andric
2079753f127fSDimitry Andric// Matrix multiply accumulate
2080753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1V], (instrs BFMMLA_ZZZ)>;
2081753f127fSDimitry Andric
2082753f127fSDimitry Andric// Multiply accumulate long
2083bdd1243dSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^BFMLAL[BT]_ZZZ(I)?$")>;
2084753f127fSDimitry Andric
2085753f127fSDimitry Andric// SVE Load instructions
2086753f127fSDimitry Andric// -----------------------------------------------------------------------------
2087753f127fSDimitry Andric
2088753f127fSDimitry Andric// Load vector
2089753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instrs LDR_ZXI)>;
2090753f127fSDimitry Andric
2091753f127fSDimitry Andric// Load predicate
2092753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L_1M], (instrs LDR_PXI)>;
2093753f127fSDimitry Andric
2094753f127fSDimitry Andric// Contiguous load, scalar + imm
20955f757f3fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LD1[BHWD]_IMM$",
20965f757f3fSDimitry Andric                                           "^LD1S?B_[HSD]_IMM$",
20975f757f3fSDimitry Andric                                           "^LD1S?H_[SD]_IMM$",
20985f757f3fSDimitry Andric                                           "^LD1S?W_D_IMM$" )>;
2099753f127fSDimitry Andric// Contiguous load, scalar + scalar
2100753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L01], (instregex "^LD1[BHWD]$",
2101753f127fSDimitry Andric                                             "^LD1S?B_[HSD]$",
2102753f127fSDimitry Andric                                             "^LD1S?H_[SD]$",
2103753f127fSDimitry Andric                                             "^LD1S?W_D$" )>;
2104753f127fSDimitry Andric
2105753f127fSDimitry Andric// Contiguous load broadcast, scalar + imm
2106753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LD1R[BHWD]_IMM$",
2107753f127fSDimitry Andric                                           "^LD1RSW_IMM$",
2108753f127fSDimitry Andric                                           "^LD1RS?B_[HSD]_IMM$",
2109753f127fSDimitry Andric                                           "^LD1RS?H_[SD]_IMM$",
2110753f127fSDimitry Andric                                           "^LD1RS?W_D_IMM$",
2111753f127fSDimitry Andric                                           "^LD1RQ_[BHWD]_IMM$")>;
2112753f127fSDimitry Andric
2113753f127fSDimitry Andric// Contiguous load broadcast, scalar + scalar
2114753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LD1RQ_[BHWD]$")>;
2115753f127fSDimitry Andric
2116753f127fSDimitry Andric// Non temporal load, scalar + imm
2117753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LDNT1[BHWD]_ZRI$")>;
2118753f127fSDimitry Andric
2119753f127fSDimitry Andric// Non temporal load, scalar + scalar
2120753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L_1S], (instregex "^LDNT1[BHWD]_ZRR$")>;
2121753f127fSDimitry Andric
2122753f127fSDimitry Andric// Non temporal gather load, vector + scalar 32-bit element size
2123*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_9cyc_1L_1V], (instregex "^LDNT1[BHW]_ZZR_S$",
2124*0fca6ea1SDimitry Andric                                              "^LDNT1S[BH]_ZZR_S$")>;
2125753f127fSDimitry Andric
2126753f127fSDimitry Andric// Non temporal gather load, vector + scalar 64-bit element size
2127*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_10cyc_2L_2V1], (instregex "^LDNT1S?[BHW]_ZZR_D$")>;
2128*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_10cyc_2L_2V1], (instrs LDNT1D_ZZR_D)>;
2129753f127fSDimitry Andric
2130753f127fSDimitry Andric// Contiguous first faulting load, scalar + scalar
2131*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_1L_1S], (instregex "^LDFF1[BHWD]$",
2132*0fca6ea1SDimitry Andric                                              "^LDFF1S?B_[HSD]$",
2133*0fca6ea1SDimitry Andric                                              "^LDFF1S?H_[SD]$",
2134*0fca6ea1SDimitry Andric                                              "^LDFF1S?W_D$")>;
2135753f127fSDimitry Andric
2136753f127fSDimitry Andric// Contiguous non faulting load, scalar + imm
2137*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LDNF1[BHWD]_IMM$",
2138*0fca6ea1SDimitry Andric                                           "^LDNF1S?B_[HSD]_IMM$",
2139*0fca6ea1SDimitry Andric                                           "^LDNF1S?H_[SD]_IMM$",
2140*0fca6ea1SDimitry Andric                                           "^LDNF1S?W_D_IMM$")>;
2141753f127fSDimitry Andric
2142753f127fSDimitry Andric// Contiguous Load two structures to two vectors, scalar + imm
2143753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_1V], (instregex "^LD2[BHWD]_IMM$")>;
2144753f127fSDimitry Andric
2145753f127fSDimitry Andric// Contiguous Load two structures to two vectors, scalar + scalar
2146753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_1L_1V], (instregex "^LD2[BHWD]$")>;
2147753f127fSDimitry Andric
2148753f127fSDimitry Andric// Contiguous Load three structures to three vectors, scalar + imm
2149753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_1L_1V], (instregex "^LD3[BHWD]_IMM$")>;
2150753f127fSDimitry Andric
2151753f127fSDimitry Andric// Contiguous Load three structures to three vectors, scalar + scalar
2152753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_1V_1L_1S], (instregex "^LD3[BHWD]$")>;
2153753f127fSDimitry Andric
2154753f127fSDimitry Andric// Contiguous Load four structures to four vectors, scalar + imm
2155753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_2L_2V], (instregex "^LD4[BHWD]_IMM$")>;
2156753f127fSDimitry Andric
2157753f127fSDimitry Andric// Contiguous Load four structures to four vectors, scalar + scalar
2158753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2L_2V_2S], (instregex "^LD4[BHWD]$")>;
2159753f127fSDimitry Andric
2160753f127fSDimitry Andric// Gather load, vector + imm, 32-bit element size
2161*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_9cyc_1L_1V], (instregex "^GLD(FF)?1S?[BH]_S_IMM$",
2162*0fca6ea1SDimitry Andric                                              "^GLD(FF)?1W_IMM$")>;
2163753f127fSDimitry Andric
2164753f127fSDimitry Andric// Gather load, vector + imm, 64-bit element size
2165*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_9cyc_2L_2V], (instregex "^GLD(FF)?1S?[BHW]_D_IMM$",
2166*0fca6ea1SDimitry Andric                                              "^GLD(FF)?1D_IMM$")>;
2167753f127fSDimitry Andric
2168753f127fSDimitry Andric// Gather load, 64-bit element size
2169753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_2L_2V],
2170*0fca6ea1SDimitry Andric             (instregex "^GLD(FF)?1S?[BHW]_D_[SU]XTW(_SCALED)?$",
2171*0fca6ea1SDimitry Andric                        "^GLD(FF)?1S?[BHW]_D(_SCALED)?$",
2172*0fca6ea1SDimitry Andric                        "^GLD(FF)?1D_[SU]XTW(_SCALED)?$",
2173*0fca6ea1SDimitry Andric                        "^GLD(FF)?1D(_SCALED)?$")>;
2174753f127fSDimitry Andric
2175753f127fSDimitry Andric// Gather load, 32-bit scaled offset
2176753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2L_2V],
2177*0fca6ea1SDimitry Andric             (instregex "^GLD(FF)?1S?[HW]_S_[SU]XTW_SCALED$",
2178*0fca6ea1SDimitry Andric                        "^GLD(FF)?1W_[SU]XTW_SCALED")>;
2179753f127fSDimitry Andric
2180753f127fSDimitry Andric// Gather load, 32-bit unpacked unscaled offset
2181*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_9cyc_1L_1V], (instregex "^GLD(FF)?1S?[BH]_S_[SU]XTW$",
2182*0fca6ea1SDimitry Andric                                              "^GLD(FF)?1W_[SU]XTW$")>;
2183753f127fSDimitry Andric
2184753f127fSDimitry Andric// SVE Store instructions
2185753f127fSDimitry Andric// -----------------------------------------------------------------------------
2186753f127fSDimitry Andric
2187753f127fSDimitry Andric// Store from predicate reg
2188753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1L01], (instrs STR_PXI)>;
2189753f127fSDimitry Andric
2190753f127fSDimitry Andric// Store from vector reg
2191753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instrs STR_ZXI)>;
2192753f127fSDimitry Andric
2193753f127fSDimitry Andric// Contiguous store, scalar + imm
2194753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^ST1[BHWD]_IMM$",
2195753f127fSDimitry Andric                                                "^ST1B_[HSD]_IMM$",
2196753f127fSDimitry Andric                                                "^ST1H_[SD]_IMM$",
2197753f127fSDimitry Andric                                                "^ST1W_D_IMM$")>;
2198753f127fSDimitry Andric
2199753f127fSDimitry Andric// Contiguous store, scalar + scalar
2200753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1S_1V], (instregex "^ST1H(_[SD])?$")>;
2201753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^ST1[BWD]$",
2202753f127fSDimitry Andric                                                "^ST1B_[HSD]$",
2203753f127fSDimitry Andric                                                "^ST1W_D$")>;
2204753f127fSDimitry Andric
2205753f127fSDimitry Andric// Contiguous store two structures from two vectors, scalar + imm
2206753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1V], (instregex "^ST2[BHWD]_IMM$")>;
2207753f127fSDimitry Andric
2208753f127fSDimitry Andric// Contiguous store two structures from two vectors, scalar + scalar
2209753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1S_1V], (instrs ST2H)>;
2210753f127fSDimitry Andric
2211753f127fSDimitry Andric// Contiguous store two structures from two vectors, scalar + scalar
2212753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1V], (instregex "^ST2[BWD]$")>;
2213753f127fSDimitry Andric
2214753f127fSDimitry Andric// Contiguous store three structures from three vectors, scalar + imm
2215753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_5L01_5V], (instregex "^ST3[BHWD]_IMM$")>;
2216753f127fSDimitry Andric
2217753f127fSDimitry Andric// Contiguous store three structures from three vectors, scalar + scalar
2218753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_5L01_5S_5V], (instrs ST3H)>;
2219753f127fSDimitry Andric
2220753f127fSDimitry Andric// Contiguous store three structures from three vectors, scalar + scalar
2221753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_5L01_5S_5V], (instregex "^ST3[BWD]$")>;
2222753f127fSDimitry Andric
2223753f127fSDimitry Andric// Contiguous store four structures from four vectors, scalar + imm
2224753f127fSDimitry Andricdef : InstRW<[N2Write_11cyc_9L01_9V], (instregex "^ST4[BHWD]_IMM$")>;
2225753f127fSDimitry Andric
2226753f127fSDimitry Andric// Contiguous store four structures from four vectors, scalar + scalar
2227753f127fSDimitry Andricdef : InstRW<[N2Write_11cyc_9L01_9S_9V], (instrs ST4H)>;
2228753f127fSDimitry Andric
2229753f127fSDimitry Andric// Contiguous store four structures from four vectors, scalar + scalar
2230753f127fSDimitry Andricdef : InstRW<[N2Write_11cyc_9L01_9S_9V], (instregex "^ST4[BWD]$")>;
2231753f127fSDimitry Andric
2232753f127fSDimitry Andric// Non temporal store, scalar + imm
2233753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STNT1[BHWD]_ZRI$")>;
2234753f127fSDimitry Andric
2235753f127fSDimitry Andric// Non temporal store, scalar + scalar
2236753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1S_1V], (instrs STNT1H_ZRR)>;
2237753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STNT1[BWD]_ZRR$")>;
2238753f127fSDimitry Andric
2239753f127fSDimitry Andric// Scatter non temporal store, vector + scalar 32-bit element size
2240753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2L01_2V], (instregex "^STNT1[BHW]_ZZR_S")>;
2241753f127fSDimitry Andric
2242753f127fSDimitry Andric// Scatter non temporal store, vector + scalar 64-bit element size
2243753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STNT1[BHWD]_ZZR_D")>;
2244753f127fSDimitry Andric
2245753f127fSDimitry Andric// Scatter store vector + imm 32-bit element size
2246753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2L01_2V], (instregex "^SST1[BH]_S_IMM$",
2247753f127fSDimitry Andric                                                "^SST1W_IMM$")>;
2248753f127fSDimitry Andric
2249753f127fSDimitry Andric// Scatter store vector + imm 64-bit element size
2250753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^SST1[BHW]_D_IMM$",
2251753f127fSDimitry Andric                                                "^SST1D_IMM$")>;
2252753f127fSDimitry Andric
2253753f127fSDimitry Andric// Scatter store, 32-bit scaled offset
2254753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2L01_2V],
2255753f127fSDimitry Andric             (instregex "^SST1(H_S|W)_[SU]XTW_SCALED$")>;
2256753f127fSDimitry Andric
2257753f127fSDimitry Andric// Scatter store, 32-bit unpacked unscaled offset
2258753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^SST1[BHW]_D_[SU]XTW$",
2259753f127fSDimitry Andric                                                "^SST1D_[SU]XTW$")>;
2260753f127fSDimitry Andric
2261753f127fSDimitry Andric// Scatter store, 32-bit unpacked scaled offset
2262753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^SST1[HW]_D_[SU]XTW_SCALED$",
2263753f127fSDimitry Andric                                                "^SST1D_[SU]XTW_SCALED$")>;
2264753f127fSDimitry Andric
2265753f127fSDimitry Andric// Scatter store, 32-bit unscaled offset
2266753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2L01_2V], (instregex "^SST1[BH]_S_[SU]XTW$",
2267753f127fSDimitry Andric                                                "^SST1W_[SU]XTW$")>;
2268753f127fSDimitry Andric
2269753f127fSDimitry Andric// Scatter store, 64-bit scaled offset
2270753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^SST1[HW]_D_SCALED$",
2271753f127fSDimitry Andric                                                "^SST1D_SCALED$")>;
2272753f127fSDimitry Andric
2273753f127fSDimitry Andric// Scatter store, 64-bit unscaled offset
2274753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^SST1[BHW]_D$",
2275753f127fSDimitry Andric                                                "^SST1D$")>;
2276753f127fSDimitry Andric
2277753f127fSDimitry Andric// SVE Miscellaneous instructions
2278753f127fSDimitry Andric// -----------------------------------------------------------------------------
2279753f127fSDimitry Andric
2280753f127fSDimitry Andric// Read first fault register, unpredicated
2281*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1M0], (instrs RDFFR_P)>;
2282753f127fSDimitry Andric
2283753f127fSDimitry Andric// Read first fault register, predicated
2284*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1M0_1M], (instrs RDFFR_PPz)>;
2285753f127fSDimitry Andric
2286753f127fSDimitry Andric// Read first fault register and set flags
2287753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2M0_2M], (instrs RDFFRS_PPz)>;
2288753f127fSDimitry Andric
2289753f127fSDimitry Andric// Set first fault register
2290753f127fSDimitry Andric// Write to first fault register
2291753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M0], (instrs SETFFR, WRFFR)>;
2292753f127fSDimitry Andric
2293753f127fSDimitry Andric// Prefetch
2294753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L], (instregex "^PRF[BHWD]")>;
2295753f127fSDimitry Andric
2296753f127fSDimitry Andric// SVE Cryptographic instructions
2297753f127fSDimitry Andric// -----------------------------------------------------------------------------
2298753f127fSDimitry Andric
2299753f127fSDimitry Andric// Crypto AES ops
2300753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^AES[DE]_ZZZ_B$",
2301753f127fSDimitry Andric                                           "^AESI?MC_ZZ_B$")>;
2302753f127fSDimitry Andric
2303753f127fSDimitry Andric// Crypto SHA3 ops
2304753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^(BCAX|EOR3)_ZZZZ$",
2305753f127fSDimitry Andric                                            "^RAX1_ZZZ_D$",
2306753f127fSDimitry Andric                                            "^XAR_ZZZI_[BHSD]$")>;
2307753f127fSDimitry Andric
2308753f127fSDimitry Andric// Crypto SM4 ops
2309753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SM4E(KEY)?_ZZZ_S$")>;
2310753f127fSDimitry Andric
2311753f127fSDimitry Andric}
2312