xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64SchedNeoverseV2.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
106c3fb27SDimitry Andric//=- AArch64SchedNeoverseV2.td - NeoverseV2 Scheduling Defs --*- tablegen -*-=//
206c3fb27SDimitry Andric//
306c3fb27SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406c3fb27SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
506c3fb27SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606c3fb27SDimitry Andric//
706c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
806c3fb27SDimitry Andric//
906c3fb27SDimitry Andric// This file defines the scheduling model for the Arm Neoverse V2 processors.
1006c3fb27SDimitry Andric// All information is taken from the V2 Software Optimisation guide:
1106c3fb27SDimitry Andric//
1206c3fb27SDimitry Andric// https://developer.arm.com/documentation/PJDOC-466751330-593177/r0p2
1306c3fb27SDimitry Andric//
1406c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
1506c3fb27SDimitry Andric
1606c3fb27SDimitry Andricdef NeoverseV2Model : SchedMachineModel {
1706c3fb27SDimitry Andric  let IssueWidth            =  16; // Micro-ops dispatched at a time.
18*0fca6ea1SDimitry Andric  let MicroOpBufferSize     = 320; // Entries in micro-op re-order buffer.
1906c3fb27SDimitry Andric  let LoadLatency           =   4; // Optimistic load latency.
2006c3fb27SDimitry Andric  let MispredictPenalty     =  10; // Extra cycles for mispredicted branch.  NOTE: Copied from N2.
2106c3fb27SDimitry Andric  let LoopMicroOpBufferSize =  16; // NOTE: Copied from Cortex-A57.
2206c3fb27SDimitry Andric  let CompleteModel         =   1;
2306c3fb27SDimitry Andric
2406c3fb27SDimitry Andric  list<Predicate> UnsupportedFeatures = !listconcat(SMEUnsupported.F,
254c2d3b02SDimitry Andric                                                    [HasSVE2p1, HasCPA,
264c2d3b02SDimitry Andric                                                    HasCSSC]);
2706c3fb27SDimitry Andric}
2806c3fb27SDimitry Andric
2906c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
3006c3fb27SDimitry Andric// Define each kind of processor resource and number available on Neoverse V2.
3106c3fb27SDimitry Andric// Instructions are first fetched and then decoded into internal macro-ops
3206c3fb27SDimitry Andric// (MOPs). From there, the MOPs proceed through register renaming and dispatch
3306c3fb27SDimitry Andric// stages. A MOP can be split into two micro-ops further down the pipeline
3406c3fb27SDimitry Andric// after the decode stage. Once dispatched, micro-ops wait for their operands
3506c3fb27SDimitry Andric// and issue out-of-order to one of seventeen issue pipelines. Each issue
3606c3fb27SDimitry Andric// pipeline can accept one micro-op per cycle.
3706c3fb27SDimitry Andric
3806c3fb27SDimitry Andriclet SchedModel = NeoverseV2Model in {
3906c3fb27SDimitry Andric
4006c3fb27SDimitry Andric// Define the (17) issue ports.
4106c3fb27SDimitry Andricdef V2UnitB   : ProcResource<2>;  // Branch 0/1
4206c3fb27SDimitry Andricdef V2UnitS0  : ProcResource<1>;  // Integer single-cycle 0
4306c3fb27SDimitry Andricdef V2UnitS1  : ProcResource<1>;  // Integer single-cycle 1
4406c3fb27SDimitry Andricdef V2UnitS2  : ProcResource<1>;  // Integer single-cycle 2
4506c3fb27SDimitry Andricdef V2UnitS3  : ProcResource<1>;  // Integer single-cycle 3
4606c3fb27SDimitry Andricdef V2UnitM0  : ProcResource<1>;  // Integer single/multicycle 0
4706c3fb27SDimitry Andricdef V2UnitM1  : ProcResource<1>;  // Integer single/multicycle 1
4806c3fb27SDimitry Andricdef V2UnitV0  : ProcResource<1>;  // FP/ASIMD 0
4906c3fb27SDimitry Andricdef V2UnitV1  : ProcResource<1>;  // FP/ASIMD 1
5006c3fb27SDimitry Andricdef V2UnitV2  : ProcResource<1>;  // FP/ASIMD 2
5106c3fb27SDimitry Andricdef V2UnitV3  : ProcResource<1>;  // FP/ASIMD 3
5206c3fb27SDimitry Andricdef V2UnitL01 : ProcResource<2>;  // Load/Store 0/1
5306c3fb27SDimitry Andricdef V2UnitL2  : ProcResource<1>;  // Load 2
5406c3fb27SDimitry Andricdef V2UnitD   : ProcResource<2>;  // Store data 0/1
5506c3fb27SDimitry Andric
5606c3fb27SDimitry Andricdef V2UnitR   : ProcResGroup<[V2UnitS0, V2UnitS1]>;  // Integer single-cycle 0/1
5706c3fb27SDimitry Andricdef V2UnitS   : ProcResGroup<[V2UnitS0, V2UnitS1, V2UnitS2, V2UnitS3]>;  // Integer single-cycle 0/1/2/3
5806c3fb27SDimitry Andricdef V2UnitF   : ProcResGroup<[V2UnitS0, V2UnitS1, V2UnitM0, V2UnitM1]>;  // Integer single-cycle 0/1 and single/multicycle 0/1
5906c3fb27SDimitry Andricdef V2UnitI   : ProcResGroup<[V2UnitS0, V2UnitS1, V2UnitS2, V2UnitS3, V2UnitM0, V2UnitM1]>;  // Integer single-cycle 0/1/2/3 and single/multicycle 0/1
6006c3fb27SDimitry Andricdef V2UnitM   : ProcResGroup<[V2UnitM0, V2UnitM1]>;  // Integer single/multicycle 0/1
6106c3fb27SDimitry Andricdef V2UnitL   : ProcResGroup<[V2UnitL01, V2UnitL2]>; // Load/Store 0/1 and Load 2
6206c3fb27SDimitry Andricdef V2UnitV   : ProcResGroup<[V2UnitV0, V2UnitV1, V2UnitV2, V2UnitV3]>;  // FP/ASIMD 0/1/2/3
6306c3fb27SDimitry Andricdef V2UnitV01 : ProcResGroup<[V2UnitV0, V2UnitV1]>;  // FP/ASIMD 0/1
6406c3fb27SDimitry Andricdef V2UnitV02 : ProcResGroup<[V2UnitV0, V2UnitV2]>;  // FP/ASIMD 0/2
6506c3fb27SDimitry Andricdef V2UnitV13 : ProcResGroup<[V2UnitV1, V2UnitV3]>;  // FP/ASIMD 1/3
6606c3fb27SDimitry Andricdef V2UnitV23 : ProcResGroup<[V2UnitV2, V2UnitV3]>;  // FP/ASIMD 2/3
6706c3fb27SDimitry Andric
6806c3fb27SDimitry Andric// Define commonly used read types.
6906c3fb27SDimitry Andric
7006c3fb27SDimitry Andric// No forwarding is provided for these types.
7106c3fb27SDimitry Andricdef : ReadAdvance<ReadI,       0>;
7206c3fb27SDimitry Andricdef : ReadAdvance<ReadISReg,   0>;
7306c3fb27SDimitry Andricdef : ReadAdvance<ReadIEReg,   0>;
7406c3fb27SDimitry Andricdef : ReadAdvance<ReadIM,      0>;
7506c3fb27SDimitry Andricdef : ReadAdvance<ReadIMA,     0>;
7606c3fb27SDimitry Andricdef : ReadAdvance<ReadID,      0>;
7706c3fb27SDimitry Andricdef : ReadAdvance<ReadExtrHi,  0>;
7806c3fb27SDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>;
7906c3fb27SDimitry Andricdef : ReadAdvance<ReadST,      0>;
8006c3fb27SDimitry Andricdef : ReadAdvance<ReadVLD,     0>;
8106c3fb27SDimitry Andric
8206c3fb27SDimitry Andric// NOTE: Copied from N2.
8306c3fb27SDimitry Andricdef : WriteRes<WriteAtomic,  []> { let Unsupported = 1; }
8406c3fb27SDimitry Andricdef : WriteRes<WriteBarrier, []> { let Latency = 1; }
8506c3fb27SDimitry Andricdef : WriteRes<WriteHint,    []> { let Latency = 1; }
8606c3fb27SDimitry Andricdef : WriteRes<WriteLDHi,    []> { let Latency = 4; }
8706c3fb27SDimitry Andric
8806c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
8906c3fb27SDimitry Andric// Define customized scheduler read/write types specific to the Neoverse V2.
9006c3fb27SDimitry Andric
9106c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
925f757f3fSDimitry Andric
935f757f3fSDimitry Andric// Define generic 0 micro-op types
945f757f3fSDimitry Andricdef V2Write_0cyc : SchedWriteRes<[]> { let Latency = 0; }
955f757f3fSDimitry Andric
9606c3fb27SDimitry Andric// Define generic 1 micro-op types
9706c3fb27SDimitry Andric
9806c3fb27SDimitry Andricdef V2Write_1cyc_1B    : SchedWriteRes<[V2UnitB]>   { let Latency = 1; }
9906c3fb27SDimitry Andricdef V2Write_1cyc_1F    : SchedWriteRes<[V2UnitF]>   { let Latency = 1; }
10006c3fb27SDimitry Andricdef V2Write_1cyc_1I    : SchedWriteRes<[V2UnitI]>   { let Latency = 1; }
10106c3fb27SDimitry Andricdef V2Write_1cyc_1M    : SchedWriteRes<[V2UnitM]>   { let Latency = 1; }
10206c3fb27SDimitry Andricdef V2Write_1cyc_1M0   : SchedWriteRes<[V2UnitM0]>  { let Latency = 1; }
10306c3fb27SDimitry Andricdef V2Write_1cyc_1L01  : SchedWriteRes<[V2UnitL01]> { let Latency = 1; }
10406c3fb27SDimitry Andricdef V2Write_2cyc_1M    : SchedWriteRes<[V2UnitM]>   { let Latency = 2; }
10506c3fb27SDimitry Andricdef V2Write_3cyc_1M    : SchedWriteRes<[V2UnitM]>   { let Latency = 3; }
10606c3fb27SDimitry Andricdef V2Write_2cyc_1M0   : SchedWriteRes<[V2UnitM0]>  { let Latency = 2; }
10706c3fb27SDimitry Andricdef V2Write_3cyc_1M0   : SchedWriteRes<[V2UnitM0]>  { let Latency = 3; }
10806c3fb27SDimitry Andricdef V2Write_5cyc_1M0   : SchedWriteRes<[V2UnitM0]>  { let Latency = 5; }
10906c3fb27SDimitry Andricdef V2Write_12cyc_1M0  : SchedWriteRes<[V2UnitM0]>  { let Latency = 12;
1105f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [12]; }
11106c3fb27SDimitry Andricdef V2Write_20cyc_1M0  : SchedWriteRes<[V2UnitM0]>  { let Latency = 20;
1125f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [20]; }
11306c3fb27SDimitry Andricdef V2Write_4cyc_1L    : SchedWriteRes<[V2UnitL]>   { let Latency = 4; }
11406c3fb27SDimitry Andricdef V2Write_6cyc_1L    : SchedWriteRes<[V2UnitL]>   { let Latency = 6; }
11506c3fb27SDimitry Andricdef V2Write_2cyc_1V    : SchedWriteRes<[V2UnitV]>   { let Latency = 2; }
11606c3fb27SDimitry Andricdef V2Write_2cyc_1V0   : SchedWriteRes<[V2UnitV0]>  { let Latency = 2; }
11706c3fb27SDimitry Andricdef V2Write_2cyc_1V01  : SchedWriteRes<[V2UnitV01]> { let Latency = 2; }
11806c3fb27SDimitry Andricdef V2Write_2cyc_1V23  : SchedWriteRes<[V2UnitV23]> { let Latency = 2; }
11906c3fb27SDimitry Andricdef V2Write_3cyc_1V    : SchedWriteRes<[V2UnitV]>   { let Latency = 3; }
12006c3fb27SDimitry Andricdef V2Write_3cyc_1V01  : SchedWriteRes<[V2UnitV01]> { let Latency = 3;
1215f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [2]; }
12206c3fb27SDimitry Andricdef V2Write_3cyc_1V23  : SchedWriteRes<[V2UnitV23]> { let Latency = 3; }
12306c3fb27SDimitry Andricdef V2Write_4cyc_1V    : SchedWriteRes<[V2UnitV]>   { let Latency = 4; }
12406c3fb27SDimitry Andricdef V2Write_5cyc_1V    : SchedWriteRes<[V2UnitV]>   { let Latency = 5; }
12506c3fb27SDimitry Andricdef V2Write_6cyc_1V    : SchedWriteRes<[V2UnitV]>   { let Latency = 6; }
12606c3fb27SDimitry Andricdef V2Write_12cyc_1V   : SchedWriteRes<[V2UnitV]>   { let Latency = 12; }
12706c3fb27SDimitry Andricdef V2Write_3cyc_1V0   : SchedWriteRes<[V2UnitV0]>  { let Latency = 3; }
12806c3fb27SDimitry Andricdef V2Write_3cyc_1V02  : SchedWriteRes<[V2UnitV02]> { let Latency = 3; }
12906c3fb27SDimitry Andricdef V2Write_4cyc_1V0   : SchedWriteRes<[V2UnitV0]>  { let Latency = 4; }
13006c3fb27SDimitry Andricdef V2Write_4cyc_1V02  : SchedWriteRes<[V2UnitV02]> { let Latency = 4; }
13106c3fb27SDimitry Andricdef V2Write_7cyc_1V0   : SchedWriteRes<[V2UnitV0]>  { let Latency = 7;
1325f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [7]; }
13306c3fb27SDimitry Andricdef V2Write_7cyc_1V02  : SchedWriteRes<[V2UnitV02]> { let Latency = 7;
1345f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [2]; }
13506c3fb27SDimitry Andricdef V2Write_9cyc_1V0   : SchedWriteRes<[V2UnitV0]>  { let Latency = 9; }
13606c3fb27SDimitry Andricdef V2Write_9cyc_1V02  : SchedWriteRes<[V2UnitV02]> { let Latency = 9;
1375f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [2]; }
13806c3fb27SDimitry Andricdef V2Write_10cyc_1V0  : SchedWriteRes<[V2UnitV0]>  { let Latency = 10; }
13906c3fb27SDimitry Andricdef V2Write_10cyc_1V02 : SchedWriteRes<[V2UnitV02]> { let Latency = 10;
1405f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [2]; }
14106c3fb27SDimitry Andricdef V2Write_12cyc_1V0  : SchedWriteRes<[V2UnitV0]>  { let Latency = 12;
1425f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [11]; }
14306c3fb27SDimitry Andricdef V2Write_13cyc_1V0  : SchedWriteRes<[V2UnitV0]>  { let Latency = 13; }
14406c3fb27SDimitry Andricdef V2Write_15cyc_1V0  : SchedWriteRes<[V2UnitV0]>  { let Latency = 15; }
14506c3fb27SDimitry Andricdef V2Write_15cyc_1V02 : SchedWriteRes<[V2UnitV02]> { let Latency = 15;
1465f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [8]; }
14706c3fb27SDimitry Andricdef V2Write_16cyc_1V0  : SchedWriteRes<[V2UnitV0]>  { let Latency = 16; }
14806c3fb27SDimitry Andricdef V2Write_16cyc_1V02 : SchedWriteRes<[V2UnitV02]> { let Latency = 16;
1495f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [8]; }
15006c3fb27SDimitry Andricdef V2Write_20cyc_1V0  : SchedWriteRes<[V2UnitV0]>  { let Latency = 20;
1515f757f3fSDimitry Andric                                                      let ReleaseAtCycles = [20]; }
15206c3fb27SDimitry Andricdef V2Write_2cyc_1V1   : SchedWriteRes<[V2UnitV1]>  { let Latency = 2; }
15306c3fb27SDimitry Andricdef V2Write_2cyc_1V13  : SchedWriteRes<[V2UnitV13]> { let Latency = 2; }
15406c3fb27SDimitry Andricdef V2Write_3cyc_1V1   : SchedWriteRes<[V2UnitV1]>  { let Latency = 3; }
15506c3fb27SDimitry Andricdef V2Write_4cyc_1V1   : SchedWriteRes<[V2UnitV1]>  { let Latency = 4; }
15606c3fb27SDimitry Andricdef V2Write_4cyc_1V13  : SchedWriteRes<[V2UnitV13]> { let Latency = 4; }
15706c3fb27SDimitry Andricdef V2Write_6cyc_1V1   : SchedWriteRes<[V2UnitV1]>  { let Latency = 6; }
15806c3fb27SDimitry Andricdef V2Write_10cyc_1V1  : SchedWriteRes<[V2UnitV1]>  { let Latency = 10; }
15906c3fb27SDimitry Andricdef V2Write_6cyc_1L01  : SchedWriteRes<[V2UnitL01]> { let Latency = 6; }
16006c3fb27SDimitry Andric
16106c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
16206c3fb27SDimitry Andric// Define generic 2 micro-op types
16306c3fb27SDimitry Andric
16406c3fb27SDimitry Andricdef V2Write_1cyc_1B_1R : SchedWriteRes<[V2UnitB, V2UnitR]> {
16506c3fb27SDimitry Andric  let Latency     = 1;
16606c3fb27SDimitry Andric  let NumMicroOps = 2;
16706c3fb27SDimitry Andric}
16806c3fb27SDimitry Andric
16906c3fb27SDimitry Andricdef V2Write_6cyc_1M0_1B : SchedWriteRes<[V2UnitM0, V2UnitB]> {
17006c3fb27SDimitry Andric  let Latency     = 6;
17106c3fb27SDimitry Andric  let NumMicroOps = 2;
17206c3fb27SDimitry Andric}
17306c3fb27SDimitry Andric
17406c3fb27SDimitry Andricdef V2Write_9cyc_1M0_1L : SchedWriteRes<[V2UnitM0, V2UnitL]> {
17506c3fb27SDimitry Andric  let Latency     = 9;
17606c3fb27SDimitry Andric  let NumMicroOps = 2;
17706c3fb27SDimitry Andric}
17806c3fb27SDimitry Andric
17906c3fb27SDimitry Andricdef V2Write_3cyc_1I_1M : SchedWriteRes<[V2UnitI, V2UnitM]> {
18006c3fb27SDimitry Andric  let Latency     = 3;
18106c3fb27SDimitry Andric  let NumMicroOps = 2;
18206c3fb27SDimitry Andric}
18306c3fb27SDimitry Andric
18406c3fb27SDimitry Andricdef V2Write_1cyc_2M : SchedWriteRes<[V2UnitM, V2UnitM]> {
18506c3fb27SDimitry Andric  let Latency     = 1;
18606c3fb27SDimitry Andric  let NumMicroOps = 2;
18706c3fb27SDimitry Andric}
18806c3fb27SDimitry Andric
18906c3fb27SDimitry Andricdef V2Write_3cyc_2M : SchedWriteRes<[V2UnitM, V2UnitM]> {
19006c3fb27SDimitry Andric  let Latency     = 3;
19106c3fb27SDimitry Andric  let NumMicroOps = 2;
19206c3fb27SDimitry Andric}
19306c3fb27SDimitry Andric
19406c3fb27SDimitry Andricdef V2Write_4cyc_2M : SchedWriteRes<[V2UnitM, V2UnitM]> {
19506c3fb27SDimitry Andric  let Latency     = 4;
19606c3fb27SDimitry Andric  let NumMicroOps = 2;
19706c3fb27SDimitry Andric}
19806c3fb27SDimitry Andric
19906c3fb27SDimitry Andricdef V2Write_5cyc_1L_1F : SchedWriteRes<[V2UnitL, V2UnitF]> {
20006c3fb27SDimitry Andric  let Latency     = 5;
20106c3fb27SDimitry Andric  let NumMicroOps = 2;
20206c3fb27SDimitry Andric}
20306c3fb27SDimitry Andric
20406c3fb27SDimitry Andricdef V2Write_6cyc_1I_1L : SchedWriteRes<[V2UnitI, V2UnitL]> {
20506c3fb27SDimitry Andric  let Latency     = 6;
20606c3fb27SDimitry Andric  let NumMicroOps = 2;
20706c3fb27SDimitry Andric}
20806c3fb27SDimitry Andric
20906c3fb27SDimitry Andricdef V2Write_7cyc_1F_1L : SchedWriteRes<[V2UnitF, V2UnitL]> {
21006c3fb27SDimitry Andric  let Latency     = 7;
21106c3fb27SDimitry Andric  let NumMicroOps = 2;
21206c3fb27SDimitry Andric}
21306c3fb27SDimitry Andric
21406c3fb27SDimitry Andricdef V2Write_7cyc_1I_1L : SchedWriteRes<[V2UnitI, V2UnitL]> {
21506c3fb27SDimitry Andric  let Latency     = 7;
21606c3fb27SDimitry Andric  let NumMicroOps = 2;
21706c3fb27SDimitry Andric}
21806c3fb27SDimitry Andric
21906c3fb27SDimitry Andricdef V2Write_1cyc_1L01_1D : SchedWriteRes<[V2UnitL01, V2UnitD]> {
22006c3fb27SDimitry Andric  let Latency     = 1;
22106c3fb27SDimitry Andric  let NumMicroOps = 2;
22206c3fb27SDimitry Andric}
22306c3fb27SDimitry Andric
22406c3fb27SDimitry Andricdef V2Write_5cyc_1M0_1V : SchedWriteRes<[V2UnitM0, V2UnitV]> {
22506c3fb27SDimitry Andric  let Latency     = 5;
22606c3fb27SDimitry Andric  let NumMicroOps = 2;
22706c3fb27SDimitry Andric}
22806c3fb27SDimitry Andric
22906c3fb27SDimitry Andricdef V2Write_2cyc_1L01_1V01 : SchedWriteRes<[V2UnitL01, V2UnitV01]> {
23006c3fb27SDimitry Andric  let Latency     = 2;
23106c3fb27SDimitry Andric  let NumMicroOps = 2;
23206c3fb27SDimitry Andric}
23306c3fb27SDimitry Andric
23406c3fb27SDimitry Andricdef V2Write_2cyc_1L01_1V : SchedWriteRes<[V2UnitL01, V2UnitV]> {
23506c3fb27SDimitry Andric  let Latency     = 2;
23606c3fb27SDimitry Andric  let NumMicroOps = 2;
23706c3fb27SDimitry Andric}
23806c3fb27SDimitry Andric
23906c3fb27SDimitry Andricdef V2Write_2cyc_2V01  : SchedWriteRes<[V2UnitV01, V2UnitV01]> {
24006c3fb27SDimitry Andric  let Latency = 2;
24106c3fb27SDimitry Andric  let NumMicroOps = 2;
24206c3fb27SDimitry Andric}
24306c3fb27SDimitry Andric
24406c3fb27SDimitry Andricdef V2Write_4cyc_2V01  : SchedWriteRes<[V2UnitV01, V2UnitV01]> {
24506c3fb27SDimitry Andric  let Latency = 4;
24606c3fb27SDimitry Andric  let NumMicroOps = 2;
24706c3fb27SDimitry Andric}
24806c3fb27SDimitry Andric
24906c3fb27SDimitry Andricdef V2Write_4cyc_1L01_1V01  : SchedWriteRes<[V2UnitL01, V2UnitV01]> {
25006c3fb27SDimitry Andric  let Latency = 4;
25106c3fb27SDimitry Andric  let NumMicroOps = 2;
25206c3fb27SDimitry Andric}
25306c3fb27SDimitry Andric
25406c3fb27SDimitry Andricdef V2Write_4cyc_1V13_1V : SchedWriteRes<[V2UnitV13, V2UnitV]> {
25506c3fb27SDimitry Andric  let Latency     = 4;
25606c3fb27SDimitry Andric  let NumMicroOps = 2;
25706c3fb27SDimitry Andric}
25806c3fb27SDimitry Andric
25906c3fb27SDimitry Andricdef V2Write_4cyc_2V0 : SchedWriteRes<[V2UnitV0, V2UnitV0]> {
26006c3fb27SDimitry Andric  let Latency     = 4;
26106c3fb27SDimitry Andric  let NumMicroOps = 2;
26206c3fb27SDimitry Andric}
26306c3fb27SDimitry Andric
26406c3fb27SDimitry Andricdef V2Write_4cyc_2V02 : SchedWriteRes<[V2UnitV02, V2UnitV02]> {
26506c3fb27SDimitry Andric  let Latency     = 4;
26606c3fb27SDimitry Andric  let NumMicroOps = 2;
26706c3fb27SDimitry Andric}
26806c3fb27SDimitry Andric
26906c3fb27SDimitry Andricdef V2Write_4cyc_2V : SchedWriteRes<[V2UnitV, V2UnitV]> {
27006c3fb27SDimitry Andric  let Latency     = 4;
27106c3fb27SDimitry Andric  let NumMicroOps = 2;
27206c3fb27SDimitry Andric}
27306c3fb27SDimitry Andric
27406c3fb27SDimitry Andricdef V2Write_6cyc_2V : SchedWriteRes<[V2UnitV, V2UnitV]> {
27506c3fb27SDimitry Andric  let Latency     = 6;
27606c3fb27SDimitry Andric  let NumMicroOps = 2;
27706c3fb27SDimitry Andric}
27806c3fb27SDimitry Andric
27906c3fb27SDimitry Andricdef V2Write_6cyc_2L : SchedWriteRes<[V2UnitL, V2UnitL]> {
28006c3fb27SDimitry Andric  let Latency     = 6;
28106c3fb27SDimitry Andric  let NumMicroOps = 2;
28206c3fb27SDimitry Andric}
28306c3fb27SDimitry Andric
28406c3fb27SDimitry Andricdef V2Write_8cyc_1L_1V : SchedWriteRes<[V2UnitL, V2UnitV]> {
28506c3fb27SDimitry Andric  let Latency     = 8;
28606c3fb27SDimitry Andric  let NumMicroOps = 2;
28706c3fb27SDimitry Andric}
28806c3fb27SDimitry Andric
28906c3fb27SDimitry Andricdef V2Write_4cyc_1L01_1V : SchedWriteRes<[V2UnitL01, V2UnitV]> {
29006c3fb27SDimitry Andric  let Latency     = 4;
29106c3fb27SDimitry Andric  let NumMicroOps = 2;
29206c3fb27SDimitry Andric}
29306c3fb27SDimitry Andric
29406c3fb27SDimitry Andricdef V2Write_3cyc_1M0_1M  : SchedWriteRes<[V2UnitM0, V2UnitM]> {
29506c3fb27SDimitry Andric  let Latency     = 3;
29606c3fb27SDimitry Andric  let NumMicroOps = 2;
29706c3fb27SDimitry Andric}
29806c3fb27SDimitry Andric
29906c3fb27SDimitry Andricdef V2Write_4cyc_1M0_1M  : SchedWriteRes<[V2UnitM0, V2UnitM]> {
30006c3fb27SDimitry Andric  let Latency     = 4;
30106c3fb27SDimitry Andric  let NumMicroOps = 2;
30206c3fb27SDimitry Andric}
30306c3fb27SDimitry Andric
30406c3fb27SDimitry Andricdef V2Write_1cyc_1M0_1M  : SchedWriteRes<[V2UnitM0, V2UnitM]> {
30506c3fb27SDimitry Andric  let Latency     = 1;
30606c3fb27SDimitry Andric  let NumMicroOps = 2;
30706c3fb27SDimitry Andric}
30806c3fb27SDimitry Andric
30906c3fb27SDimitry Andricdef V2Write_2cyc_1M0_1M  : SchedWriteRes<[V2UnitM0, V2UnitM]> {
31006c3fb27SDimitry Andric  let Latency     = 2;
31106c3fb27SDimitry Andric  let NumMicroOps = 2;
31206c3fb27SDimitry Andric}
31306c3fb27SDimitry Andric
31406c3fb27SDimitry Andricdef V2Write_6cyc_2V1 : SchedWriteRes<[V2UnitV1, V2UnitV1]> {
31506c3fb27SDimitry Andric  let Latency     = 6;
31606c3fb27SDimitry Andric  let NumMicroOps = 2;
31706c3fb27SDimitry Andric}
31806c3fb27SDimitry Andric
31906c3fb27SDimitry Andricdef V2Write_4cyc_1V0_1M0 : SchedWriteRes<[V2UnitV0, V2UnitM0]> {
32006c3fb27SDimitry Andric  let Latency     = 4;
32106c3fb27SDimitry Andric  let NumMicroOps = 2;
32206c3fb27SDimitry Andric}
32306c3fb27SDimitry Andric
32406c3fb27SDimitry Andricdef V2Write_5cyc_1V0_1M0 : SchedWriteRes<[V2UnitV0, V2UnitM0]> {
32506c3fb27SDimitry Andric  let Latency     = 5;
32606c3fb27SDimitry Andric  let NumMicroOps = 2;
32706c3fb27SDimitry Andric}
32806c3fb27SDimitry Andric
32906c3fb27SDimitry Andricdef V2Write_5cyc_2V0 : SchedWriteRes<[V2UnitV0, V2UnitV0]> {
33006c3fb27SDimitry Andric  let Latency     = 5;
33106c3fb27SDimitry Andric  let NumMicroOps = 2;
33206c3fb27SDimitry Andric}
33306c3fb27SDimitry Andric
33406c3fb27SDimitry Andricdef V2Write_5cyc_2V02 : SchedWriteRes<[V2UnitV02, V2UnitV02]> {
33506c3fb27SDimitry Andric  let Latency     = 5;
33606c3fb27SDimitry Andric  let NumMicroOps = 2;
33706c3fb27SDimitry Andric}
33806c3fb27SDimitry Andric
33906c3fb27SDimitry Andricdef V2Write_6cyc_1V1_1M0 : SchedWriteRes<[V2UnitV1, V2UnitM0]> {
34006c3fb27SDimitry Andric  let Latency     = 6;
34106c3fb27SDimitry Andric  let NumMicroOps = 2;
34206c3fb27SDimitry Andric}
34306c3fb27SDimitry Andric
34406c3fb27SDimitry Andricdef V2Write_7cyc_1M0_1V02 : SchedWriteRes<[V2UnitM0, V2UnitV02]> {
34506c3fb27SDimitry Andric  let Latency     = 7;
34606c3fb27SDimitry Andric  let NumMicroOps = 2;
34706c3fb27SDimitry Andric}
34806c3fb27SDimitry Andric
34906c3fb27SDimitry Andricdef V2Write_2cyc_1V0_1M : SchedWriteRes<[V2UnitV0, V2UnitM]> {
35006c3fb27SDimitry Andric  let Latency     = 2;
35106c3fb27SDimitry Andric  let NumMicroOps = 2;
35206c3fb27SDimitry Andric}
35306c3fb27SDimitry Andric
35406c3fb27SDimitry Andricdef V2Write_3cyc_1V0_1M : SchedWriteRes<[V2UnitV0, V2UnitM]> {
35506c3fb27SDimitry Andric  let Latency     = 3;
35606c3fb27SDimitry Andric  let NumMicroOps = 2;
35706c3fb27SDimitry Andric}
35806c3fb27SDimitry Andric
35906c3fb27SDimitry Andricdef V2Write_6cyc_1V_1V13 : SchedWriteRes<[V2UnitV, V2UnitV13]> {
36006c3fb27SDimitry Andric  let Latency     = 6;
36106c3fb27SDimitry Andric  let NumMicroOps = 2;
36206c3fb27SDimitry Andric}
36306c3fb27SDimitry Andric
36406c3fb27SDimitry Andricdef V2Write_6cyc_1L_1M : SchedWriteRes<[V2UnitL, V2UnitM]> {
36506c3fb27SDimitry Andric  let Latency     = 6;
36606c3fb27SDimitry Andric  let NumMicroOps = 2;
36706c3fb27SDimitry Andric}
36806c3fb27SDimitry Andric
36906c3fb27SDimitry Andricdef V2Write_6cyc_1L_1S : SchedWriteRes<[V2UnitL, V2UnitS]> {
37006c3fb27SDimitry Andric  let Latency     = 6;
37106c3fb27SDimitry Andric  let NumMicroOps = 2;
37206c3fb27SDimitry Andric}
37306c3fb27SDimitry Andric
37406c3fb27SDimitry Andricdef V2Write_4cyc_2V13 : SchedWriteRes<[V2UnitV13, V2UnitV13]> {
37506c3fb27SDimitry Andric  let Latency     = 4;
37606c3fb27SDimitry Andric  let NumMicroOps = 2;
37706c3fb27SDimitry Andric}
37806c3fb27SDimitry Andric
37906c3fb27SDimitry Andricdef V2Write_8cyc_1M0_1V01 : SchedWriteRes<[V2UnitM0, V2UnitV01]> {
38006c3fb27SDimitry Andric  let Latency     = 8;
38106c3fb27SDimitry Andric  let NumMicroOps = 2;
38206c3fb27SDimitry Andric}
38306c3fb27SDimitry Andric
38406c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
38506c3fb27SDimitry Andric// Define generic 3 micro-op types
38606c3fb27SDimitry Andric
38706c3fb27SDimitry Andricdef V2Write_1cyc_1L01_1D_1I : SchedWriteRes<[V2UnitL01, V2UnitD, V2UnitI]> {
38806c3fb27SDimitry Andric  let Latency     = 1;
38906c3fb27SDimitry Andric  let NumMicroOps = 3;
39006c3fb27SDimitry Andric}
39106c3fb27SDimitry Andric
39206c3fb27SDimitry Andricdef V2Write_2cyc_1L01_1V01_1I : SchedWriteRes<[V2UnitL01, V2UnitV01, V2UnitI]> {
39306c3fb27SDimitry Andric  let Latency     = 2;
39406c3fb27SDimitry Andric  let NumMicroOps = 3;
39506c3fb27SDimitry Andric}
39606c3fb27SDimitry Andric
39706c3fb27SDimitry Andricdef V2Write_2cyc_1L01_2V01 : SchedWriteRes<[V2UnitL01, V2UnitV01, V2UnitV01]> {
39806c3fb27SDimitry Andric  let Latency     = 2;
39906c3fb27SDimitry Andric  let NumMicroOps = 3;
40006c3fb27SDimitry Andric}
40106c3fb27SDimitry Andric
40206c3fb27SDimitry Andricdef V2Write_4cyc_1L01_2V01 : SchedWriteRes<[V2UnitL01, V2UnitV01, V2UnitV01]> {
40306c3fb27SDimitry Andric  let Latency     = 4;
40406c3fb27SDimitry Andric  let NumMicroOps = 3;
40506c3fb27SDimitry Andric}
40606c3fb27SDimitry Andric
40706c3fb27SDimitry Andricdef V2Write_9cyc_1L_2V : SchedWriteRes<[V2UnitL, V2UnitV, V2UnitV]> {
40806c3fb27SDimitry Andric  let Latency     = 9;
40906c3fb27SDimitry Andric  let NumMicroOps = 3;
41006c3fb27SDimitry Andric}
41106c3fb27SDimitry Andric
41206c3fb27SDimitry Andricdef V2Write_4cyc_3V01  : SchedWriteRes<[V2UnitV01, V2UnitV01, V2UnitV01]> {
41306c3fb27SDimitry Andric  let Latency = 4;
41406c3fb27SDimitry Andric  let NumMicroOps = 3;
41506c3fb27SDimitry Andric}
41606c3fb27SDimitry Andric
41706c3fb27SDimitry Andricdef V2Write_7cyc_1M_1M0_1V : SchedWriteRes<[V2UnitM, V2UnitM0, V2UnitV]> {
41806c3fb27SDimitry Andric  let Latency     = 7;
41906c3fb27SDimitry Andric  let NumMicroOps = 3;
42006c3fb27SDimitry Andric}
42106c3fb27SDimitry Andric
42206c3fb27SDimitry Andricdef V2Write_2cyc_1L01_1S_1V : SchedWriteRes<[V2UnitL01, V2UnitS, V2UnitV]> {
42306c3fb27SDimitry Andric  let Latency     = 2;
42406c3fb27SDimitry Andric  let NumMicroOps = 3;
42506c3fb27SDimitry Andric}
42606c3fb27SDimitry Andric
42706c3fb27SDimitry Andricdef V2Write_2cyc_1L01_1S_1V01 : SchedWriteRes<[V2UnitL01, V2UnitS, V2UnitV01]> {
42806c3fb27SDimitry Andric  let Latency     = 2;
42906c3fb27SDimitry Andric  let NumMicroOps = 3;
43006c3fb27SDimitry Andric}
43106c3fb27SDimitry Andric
43206c3fb27SDimitry Andricdef V2Write_6cyc_3L : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitL]> {
43306c3fb27SDimitry Andric  let Latency     = 6;
43406c3fb27SDimitry Andric  let NumMicroOps = 3;
43506c3fb27SDimitry Andric}
43606c3fb27SDimitry Andric
43706c3fb27SDimitry Andricdef V2Write_6cyc_3V : SchedWriteRes<[V2UnitV, V2UnitV, V2UnitV]> {
43806c3fb27SDimitry Andric  let Latency     = 6;
43906c3fb27SDimitry Andric  let NumMicroOps = 3;
44006c3fb27SDimitry Andric}
44106c3fb27SDimitry Andric
44206c3fb27SDimitry Andricdef V2Write_8cyc_1L_2V : SchedWriteRes<[V2UnitL, V2UnitV, V2UnitV]> {
44306c3fb27SDimitry Andric  let Latency     = 8;
44406c3fb27SDimitry Andric  let NumMicroOps = 3;
44506c3fb27SDimitry Andric}
44606c3fb27SDimitry Andric
44706c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
44806c3fb27SDimitry Andric// Define generic 4 micro-op types
44906c3fb27SDimitry Andric
45006c3fb27SDimitry Andricdef V2Write_2cyc_1L01_2V01_1I : SchedWriteRes<[V2UnitL01, V2UnitV01, V2UnitV01,
45106c3fb27SDimitry Andric                                               V2UnitI]> {
45206c3fb27SDimitry Andric  let Latency     = 2;
45306c3fb27SDimitry Andric  let NumMicroOps = 4;
45406c3fb27SDimitry Andric}
45506c3fb27SDimitry Andric
45606c3fb27SDimitry Andricdef V2Write_2cyc_2L01_2V01 : SchedWriteRes<[V2UnitL01, V2UnitL01,
45706c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01]> {
45806c3fb27SDimitry Andric  let Latency     = 2;
45906c3fb27SDimitry Andric  let NumMicroOps = 4;
46006c3fb27SDimitry Andric}
46106c3fb27SDimitry Andric
46206c3fb27SDimitry Andricdef V2Write_4cyc_2L01_2V01 : SchedWriteRes<[V2UnitL01, V2UnitL01,
46306c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01]> {
46406c3fb27SDimitry Andric  let Latency     = 4;
46506c3fb27SDimitry Andric  let NumMicroOps = 4;
46606c3fb27SDimitry Andric}
46706c3fb27SDimitry Andric
46806c3fb27SDimitry Andricdef V2Write_5cyc_1I_3L : SchedWriteRes<[V2UnitI, V2UnitL, V2UnitL, V2UnitL]> {
46906c3fb27SDimitry Andric  let Latency     = 5;
47006c3fb27SDimitry Andric  let NumMicroOps = 4;
47106c3fb27SDimitry Andric}
47206c3fb27SDimitry Andric
47306c3fb27SDimitry Andricdef V2Write_9cyc_2L_2V1 : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitV1,
47406c3fb27SDimitry Andric                                         V2UnitV1]> {
47506c3fb27SDimitry Andric  let Latency     = 9;
47606c3fb27SDimitry Andric  let NumMicroOps = 4;
47706c3fb27SDimitry Andric}
47806c3fb27SDimitry Andric
47906c3fb27SDimitry Andricdef V2Write_6cyc_4V0 : SchedWriteRes<[V2UnitV0, V2UnitV0, V2UnitV0, V2UnitV0]> {
48006c3fb27SDimitry Andric  let Latency     = 6;
48106c3fb27SDimitry Andric  let NumMicroOps = 4;
48206c3fb27SDimitry Andric}
48306c3fb27SDimitry Andric
48406c3fb27SDimitry Andricdef V2Write_8cyc_4V : SchedWriteRes<[V2UnitV, V2UnitV, V2UnitV, V2UnitV]> {
48506c3fb27SDimitry Andric  let Latency     = 8;
48606c3fb27SDimitry Andric  let NumMicroOps = 4;
48706c3fb27SDimitry Andric}
48806c3fb27SDimitry Andric
48906c3fb27SDimitry Andricdef V2Write_6cyc_2V_2V13 : SchedWriteRes<[V2UnitV, V2UnitV, V2UnitV13,
49006c3fb27SDimitry Andric                                          V2UnitV13]> {
49106c3fb27SDimitry Andric  let Latency     = 6;
49206c3fb27SDimitry Andric  let NumMicroOps = 4;
49306c3fb27SDimitry Andric}
49406c3fb27SDimitry Andric
49506c3fb27SDimitry Andricdef V2Write_8cyc_2V_2V13 : SchedWriteRes<[V2UnitV, V2UnitV, V2UnitV13,
49606c3fb27SDimitry Andric                                          V2UnitV13]> {
49706c3fb27SDimitry Andric  let Latency     = 8;
49806c3fb27SDimitry Andric  let NumMicroOps = 4;
49906c3fb27SDimitry Andric}
50006c3fb27SDimitry Andric
50106c3fb27SDimitry Andricdef V2Write_6cyc_4V02 : SchedWriteRes<[V2UnitV02, V2UnitV02, V2UnitV02,
50206c3fb27SDimitry Andric                                       V2UnitV02]> {
50306c3fb27SDimitry Andric  let Latency     = 6;
50406c3fb27SDimitry Andric  let NumMicroOps = 4;
50506c3fb27SDimitry Andric}
50606c3fb27SDimitry Andric
50706c3fb27SDimitry Andricdef V2Write_6cyc_4V : SchedWriteRes<[V2UnitV, V2UnitV, V2UnitV, V2UnitV]> {
50806c3fb27SDimitry Andric  let Latency     = 6;
50906c3fb27SDimitry Andric  let NumMicroOps = 4;
51006c3fb27SDimitry Andric}
51106c3fb27SDimitry Andric
51206c3fb27SDimitry Andricdef V2Write_8cyc_2L_2V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitV, V2UnitV]> {
51306c3fb27SDimitry Andric  let Latency     = 8;
51406c3fb27SDimitry Andric  let NumMicroOps = 4;
51506c3fb27SDimitry Andric}
51606c3fb27SDimitry Andric
51706c3fb27SDimitry Andricdef V2Write_9cyc_2L_2V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitV, V2UnitV]> {
51806c3fb27SDimitry Andric  let Latency     = 9;
51906c3fb27SDimitry Andric  let NumMicroOps = 4;
52006c3fb27SDimitry Andric}
52106c3fb27SDimitry Andric
52206c3fb27SDimitry Andricdef V2Write_2cyc_2L01_2V : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitV,
52306c3fb27SDimitry Andric                                          V2UnitV]> {
52406c3fb27SDimitry Andric  let Latency     = 2;
52506c3fb27SDimitry Andric  let NumMicroOps = 4;
52606c3fb27SDimitry Andric}
52706c3fb27SDimitry Andric
52806c3fb27SDimitry Andricdef V2Write_4cyc_2L01_2V : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitV,
52906c3fb27SDimitry Andric                                          V2UnitV]> {
53006c3fb27SDimitry Andric  let Latency     = 4;
53106c3fb27SDimitry Andric  let NumMicroOps = 4;
53206c3fb27SDimitry Andric}
53306c3fb27SDimitry Andric
53406c3fb27SDimitry Andricdef V2Write_8cyc_2M0_2V02 : SchedWriteRes<[V2UnitM0, V2UnitM0, V2UnitV02,
53506c3fb27SDimitry Andric                                          V2UnitV02]> {
53606c3fb27SDimitry Andric  let Latency     = 8;
53706c3fb27SDimitry Andric  let NumMicroOps = 4;
53806c3fb27SDimitry Andric}
53906c3fb27SDimitry Andric
54006c3fb27SDimitry Andricdef V2Write_8cyc_2V_2V1 : SchedWriteRes<[V2UnitV, V2UnitV, V2UnitV1,
54106c3fb27SDimitry Andric                                         V2UnitV1]> {
54206c3fb27SDimitry Andric  let Latency     = 8;
54306c3fb27SDimitry Andric  let NumMicroOps = 4;
54406c3fb27SDimitry Andric}
54506c3fb27SDimitry Andric
54606c3fb27SDimitry Andricdef V2Write_4cyc_2M0_2M : SchedWriteRes<[V2UnitM0, V2UnitM0, V2UnitM,
54706c3fb27SDimitry Andric                                         V2UnitM]> {
54806c3fb27SDimitry Andric  let Latency     = 4;
54906c3fb27SDimitry Andric  let NumMicroOps = 4;
55006c3fb27SDimitry Andric}
55106c3fb27SDimitry Andric
55206c3fb27SDimitry Andricdef V2Write_5cyc_2M0_2M : SchedWriteRes<[V2UnitM0, V2UnitM0, V2UnitM,
55306c3fb27SDimitry Andric                                         V2UnitM]> {
55406c3fb27SDimitry Andric  let Latency     = 5;
55506c3fb27SDimitry Andric  let NumMicroOps = 4;
55606c3fb27SDimitry Andric}
55706c3fb27SDimitry Andric
55806c3fb27SDimitry Andricdef V2Write_6cyc_2I_2L : SchedWriteRes<[V2UnitI, V2UnitI, V2UnitL, V2UnitL]> {
55906c3fb27SDimitry Andric  let Latency     = 6;
56006c3fb27SDimitry Andric  let NumMicroOps = 4;
56106c3fb27SDimitry Andric}
56206c3fb27SDimitry Andric
56306c3fb27SDimitry Andricdef V2Write_7cyc_4L : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitL, V2UnitL]> {
56406c3fb27SDimitry Andric  let Latency     = 7;
56506c3fb27SDimitry Andric  let NumMicroOps = 4;
56606c3fb27SDimitry Andric}
56706c3fb27SDimitry Andric
56806c3fb27SDimitry Andricdef V2Write_6cyc_1L01_3V01 : SchedWriteRes<[V2UnitL01, V2UnitV01, V2UnitV01,
56906c3fb27SDimitry Andric                                            V2UnitV01]> {
57006c3fb27SDimitry Andric  let Latency     = 6;
57106c3fb27SDimitry Andric  let NumMicroOps = 4;
57206c3fb27SDimitry Andric}
57306c3fb27SDimitry Andric
57406c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
57506c3fb27SDimitry Andric// Define generic 5 micro-op types
57606c3fb27SDimitry Andric
57706c3fb27SDimitry Andricdef V2Write_2cyc_1L01_2V01_2I : SchedWriteRes<[V2UnitL01, V2UnitV01, V2UnitV01,
57806c3fb27SDimitry Andric                                               V2UnitI, V2UnitI]> {
57906c3fb27SDimitry Andric  let Latency     = 2;
58006c3fb27SDimitry Andric  let NumMicroOps = 5;
58106c3fb27SDimitry Andric}
58206c3fb27SDimitry Andric
58306c3fb27SDimitry Andricdef V2Write_8cyc_2L_3V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitV, V2UnitV,
58406c3fb27SDimitry Andric                                        V2UnitV]> {
58506c3fb27SDimitry Andric  let Latency     = 8;
58606c3fb27SDimitry Andric  let NumMicroOps = 5;
58706c3fb27SDimitry Andric}
58806c3fb27SDimitry Andric
58906c3fb27SDimitry Andricdef V2Write_9cyc_1L_4V : SchedWriteRes<[V2UnitL, V2UnitV, V2UnitV, V2UnitV,
59006c3fb27SDimitry Andric                                        V2UnitV]> {
59106c3fb27SDimitry Andric  let Latency     = 9;
59206c3fb27SDimitry Andric  let NumMicroOps = 5;
59306c3fb27SDimitry Andric}
59406c3fb27SDimitry Andric
59506c3fb27SDimitry Andricdef V2Write_10cyc_1L_4V : SchedWriteRes<[V2UnitL, V2UnitV, V2UnitV, V2UnitV,
59606c3fb27SDimitry Andric                                         V2UnitV]> {
59706c3fb27SDimitry Andric  let Latency     = 10;
59806c3fb27SDimitry Andric  let NumMicroOps = 5;
59906c3fb27SDimitry Andric}
60006c3fb27SDimitry Andric
60106c3fb27SDimitry Andricdef V2Write_6cyc_5V : SchedWriteRes<[V2UnitV, V2UnitV, V2UnitV, V2UnitV,
60206c3fb27SDimitry Andric                                     V2UnitV]> {
60306c3fb27SDimitry Andric  let Latency     = 6;
60406c3fb27SDimitry Andric  let NumMicroOps = 5;
60506c3fb27SDimitry Andric}
60606c3fb27SDimitry Andric
60706c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
60806c3fb27SDimitry Andric// Define generic 6 micro-op types
60906c3fb27SDimitry Andric
61006c3fb27SDimitry Andricdef V2Write_8cyc_3L_3V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitL,
61106c3fb27SDimitry Andric                                        V2UnitV, V2UnitV, V2UnitV]> {
61206c3fb27SDimitry Andric  let Latency     = 8;
61306c3fb27SDimitry Andric  let NumMicroOps = 6;
61406c3fb27SDimitry Andric}
61506c3fb27SDimitry Andric
61606c3fb27SDimitry Andricdef V2Write_9cyc_3L_3V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitL,
61706c3fb27SDimitry Andric                                        V2UnitV, V2UnitV, V2UnitV]> {
61806c3fb27SDimitry Andric  let Latency     = 9;
61906c3fb27SDimitry Andric  let NumMicroOps = 6;
62006c3fb27SDimitry Andric}
62106c3fb27SDimitry Andric
62206c3fb27SDimitry Andricdef V2Write_9cyc_2L_4V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitV,
62306c3fb27SDimitry Andric                                        V2UnitV, V2UnitV, V2UnitV]> {
62406c3fb27SDimitry Andric  let Latency     = 9;
62506c3fb27SDimitry Andric  let NumMicroOps = 6;
62606c3fb27SDimitry Andric}
62706c3fb27SDimitry Andric
62806c3fb27SDimitry Andricdef V2Write_9cyc_2L_2V_2S : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitV,
62906c3fb27SDimitry Andric                                           V2UnitV, V2UnitS, V2UnitS]> {
63006c3fb27SDimitry Andric  let Latency     = 9;
63106c3fb27SDimitry Andric  let NumMicroOps = 6;
63206c3fb27SDimitry Andric}
63306c3fb27SDimitry Andric
63406c3fb27SDimitry Andricdef V2Write_9cyc_2V_4V13 : SchedWriteRes<[V2UnitV, V2UnitV, V2UnitV13,
63506c3fb27SDimitry Andric                                          V2UnitV13, V2UnitV13, V2UnitV13]> {
63606c3fb27SDimitry Andric  let Latency     = 9;
63706c3fb27SDimitry Andric  let NumMicroOps = 6;
63806c3fb27SDimitry Andric}
63906c3fb27SDimitry Andric
64006c3fb27SDimitry Andricdef V2Write_2cyc_3L01_3V : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
64106c3fb27SDimitry Andric                                          V2UnitV, V2UnitV, V2UnitV]> {
64206c3fb27SDimitry Andric  let Latency     = 2;
64306c3fb27SDimitry Andric  let NumMicroOps = 6;
64406c3fb27SDimitry Andric}
64506c3fb27SDimitry Andric
64606c3fb27SDimitry Andricdef V2Write_4cyc_2L01_4V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitV01,
64706c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01]> {
64806c3fb27SDimitry Andric  let Latency     = 4;
64906c3fb27SDimitry Andric  let NumMicroOps = 6;
65006c3fb27SDimitry Andric}
65106c3fb27SDimitry Andric
65206c3fb27SDimitry Andricdef V2Write_5cyc_2L01_4V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitV01,
65306c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01]> {
65406c3fb27SDimitry Andric  let Latency     = 5;
65506c3fb27SDimitry Andric  let NumMicroOps = 6;
65606c3fb27SDimitry Andric}
65706c3fb27SDimitry Andric
65806c3fb27SDimitry Andricdef V2Write_2cyc_3L01_3V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
65906c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01]> {
66006c3fb27SDimitry Andric  let Latency     = 2;
66106c3fb27SDimitry Andric  let NumMicroOps = 6;
66206c3fb27SDimitry Andric}
66306c3fb27SDimitry Andric
66406c3fb27SDimitry Andricdef V2Write_4cyc_2L01_2S_2V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitS,
66506c3fb27SDimitry Andric                                               V2UnitS, V2UnitV01, V2UnitV01]> {
66606c3fb27SDimitry Andric  let Latency     = 4;
66706c3fb27SDimitry Andric  let NumMicroOps = 6;
66806c3fb27SDimitry Andric}
66906c3fb27SDimitry Andric
67006c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
67106c3fb27SDimitry Andric// Define generic 7 micro-op types
67206c3fb27SDimitry Andric
67306c3fb27SDimitry Andricdef V2Write_8cyc_3L_4V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitL,
67406c3fb27SDimitry Andric                                        V2UnitV, V2UnitV, V2UnitV, V2UnitV]> {
67506c3fb27SDimitry Andric  let Latency     = 8;
67606c3fb27SDimitry Andric  let NumMicroOps = 7;
67706c3fb27SDimitry Andric}
67806c3fb27SDimitry Andric
67906c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
68006c3fb27SDimitry Andric// Define generic 8 micro-op types
68106c3fb27SDimitry Andric
68206c3fb27SDimitry Andricdef V2Write_2cyc_4L01_4V : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
68306c3fb27SDimitry Andric                                          V2UnitL01, V2UnitV, V2UnitV, V2UnitV,
68406c3fb27SDimitry Andric                                          V2UnitV]> {
68506c3fb27SDimitry Andric  let Latency     = 2;
68606c3fb27SDimitry Andric  let NumMicroOps = 8;
68706c3fb27SDimitry Andric}
68806c3fb27SDimitry Andric
68906c3fb27SDimitry Andricdef V2Write_2cyc_4L01_4V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
69006c3fb27SDimitry Andric                                            V2UnitL01, V2UnitV01, V2UnitV01,
69106c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01]> {
69206c3fb27SDimitry Andric  let Latency     = 2;
69306c3fb27SDimitry Andric  let NumMicroOps = 8;
69406c3fb27SDimitry Andric}
69506c3fb27SDimitry Andric
69606c3fb27SDimitry Andricdef V2Write_4cyc_4L01_4V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
69706c3fb27SDimitry Andric                                            V2UnitL01, V2UnitV01, V2UnitV01,
69806c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01]> {
69906c3fb27SDimitry Andric  let Latency     = 4;
70006c3fb27SDimitry Andric  let NumMicroOps = 8;
70106c3fb27SDimitry Andric}
70206c3fb27SDimitry Andric
70306c3fb27SDimitry Andricdef V2Write_6cyc_2L01_6V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitV01,
70406c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01,
70506c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01]> {
70606c3fb27SDimitry Andric  let Latency     = 6;
70706c3fb27SDimitry Andric  let NumMicroOps = 8;
70806c3fb27SDimitry Andric}
70906c3fb27SDimitry Andric
71006c3fb27SDimitry Andricdef V2Write_8cyc_4L_4V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitL, V2UnitL,
71106c3fb27SDimitry Andric                                        V2UnitV, V2UnitV, V2UnitV, V2UnitV]> {
71206c3fb27SDimitry Andric  let Latency     = 8;
71306c3fb27SDimitry Andric  let NumMicroOps = 8;
71406c3fb27SDimitry Andric}
71506c3fb27SDimitry Andric
71606c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
71706c3fb27SDimitry Andric// Define generic 9 micro-op types
71806c3fb27SDimitry Andric
71906c3fb27SDimitry Andricdef V2Write_6cyc_3L01_6V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
72006c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01,
72106c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01]> {
72206c3fb27SDimitry Andric  let Latency     = 6;
72306c3fb27SDimitry Andric  let NumMicroOps = 9;
72406c3fb27SDimitry Andric}
72506c3fb27SDimitry Andric
72606c3fb27SDimitry Andricdef V2Write_10cyc_1L_8V : SchedWriteRes<[V2UnitL, V2UnitV, V2UnitV, V2UnitV,
72706c3fb27SDimitry Andric                                         V2UnitV, V2UnitV, V2UnitV, V2UnitV,
72806c3fb27SDimitry Andric                                         V2UnitV]> {
72906c3fb27SDimitry Andric  let Latency     = 10;
73006c3fb27SDimitry Andric  let NumMicroOps = 9;
73106c3fb27SDimitry Andric}
73206c3fb27SDimitry Andric
73306c3fb27SDimitry Andricdef V2Write_10cyc_3V_3L_3S : SchedWriteRes<[V2UnitV, V2UnitV, V2UnitV,
73406c3fb27SDimitry Andric                                            V2UnitL, V2UnitL, V2UnitL,
73506c3fb27SDimitry Andric                                            V2UnitS, V2UnitS, V2UnitS]> {
73606c3fb27SDimitry Andric  let Latency     = 10;
73706c3fb27SDimitry Andric  let NumMicroOps = 9;
73806c3fb27SDimitry Andric}
73906c3fb27SDimitry Andric
74006c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
74106c3fb27SDimitry Andric// Define generic 10 micro-op types
74206c3fb27SDimitry Andric
74306c3fb27SDimitry Andricdef V2Write_9cyc_6L_4V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitL, V2UnitL,
74406c3fb27SDimitry Andric                                        V2UnitL, V2UnitL, V2UnitV, V2UnitV,
74506c3fb27SDimitry Andric                                        V2UnitV, V2UnitV]> {
74606c3fb27SDimitry Andric  let Latency     = 9;
74706c3fb27SDimitry Andric  let NumMicroOps = 10;
74806c3fb27SDimitry Andric}
74906c3fb27SDimitry Andric
75006c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
75106c3fb27SDimitry Andric// Define generic 12 micro-op types
75206c3fb27SDimitry Andric
75306c3fb27SDimitry Andricdef V2Write_5cyc_4L01_8V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
75406c3fb27SDimitry Andric                                            V2UnitL01, V2UnitV01, V2UnitV01,
75506c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01,
75606c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01]> {
75706c3fb27SDimitry Andric  let Latency     = 5;
75806c3fb27SDimitry Andric  let NumMicroOps = 12;
75906c3fb27SDimitry Andric}
76006c3fb27SDimitry Andric
76106c3fb27SDimitry Andricdef V2Write_9cyc_4L_8V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitL,
76206c3fb27SDimitry Andric                                        V2UnitL, V2UnitV, V2UnitV,
76306c3fb27SDimitry Andric                                        V2UnitV, V2UnitV, V2UnitV,
76406c3fb27SDimitry Andric                                        V2UnitV, V2UnitV, V2UnitV]> {
76506c3fb27SDimitry Andric  let Latency     = 9;
76606c3fb27SDimitry Andric  let NumMicroOps = 12;
76706c3fb27SDimitry Andric}
76806c3fb27SDimitry Andric
76906c3fb27SDimitry Andricdef V2Write_10cyc_4L_8V : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitL,
77006c3fb27SDimitry Andric                                         V2UnitL, V2UnitV, V2UnitV,
77106c3fb27SDimitry Andric                                         V2UnitV, V2UnitV, V2UnitV,
77206c3fb27SDimitry Andric                                         V2UnitV, V2UnitV, V2UnitV]> {
77306c3fb27SDimitry Andric  let Latency     = 10;
77406c3fb27SDimitry Andric  let NumMicroOps = 12;
77506c3fb27SDimitry Andric}
77606c3fb27SDimitry Andric
77706c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
77806c3fb27SDimitry Andric// Define generic 16 micro-op types
77906c3fb27SDimitry Andric
78006c3fb27SDimitry Andricdef V2Write_7cyc_4L01_12V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
78106c3fb27SDimitry Andric                                             V2UnitL01, V2UnitV01, V2UnitV01,
78206c3fb27SDimitry Andric                                             V2UnitV01, V2UnitV01, V2UnitV01,
78306c3fb27SDimitry Andric                                             V2UnitV01, V2UnitV01, V2UnitV01,
78406c3fb27SDimitry Andric                                             V2UnitV01, V2UnitV01, V2UnitV01,
78506c3fb27SDimitry Andric                                             V2UnitV01]> {
78606c3fb27SDimitry Andric  let Latency     = 7;
78706c3fb27SDimitry Andric  let NumMicroOps = 16;
78806c3fb27SDimitry Andric}
78906c3fb27SDimitry Andric
79006c3fb27SDimitry Andricdef V2Write_10cyc_4L_8V_4S : SchedWriteRes<[V2UnitL, V2UnitL, V2UnitL,
79106c3fb27SDimitry Andric                                            V2UnitL, V2UnitV, V2UnitV,
79206c3fb27SDimitry Andric                                            V2UnitV, V2UnitV, V2UnitV,
79306c3fb27SDimitry Andric                                            V2UnitV, V2UnitV, V2UnitV,
79406c3fb27SDimitry Andric                                            V2UnitS, V2UnitS, V2UnitS,
79506c3fb27SDimitry Andric                                            V2UnitS]> {
79606c3fb27SDimitry Andric  let Latency     = 10;
79706c3fb27SDimitry Andric  let NumMicroOps = 16;
79806c3fb27SDimitry Andric}
79906c3fb27SDimitry Andric
80006c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
80106c3fb27SDimitry Andric// Define generic 18 micro-op types
80206c3fb27SDimitry Andric
80306c3fb27SDimitry Andricdef V2Write_7cyc_9L01_9V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
80406c3fb27SDimitry Andric                                            V2UnitL01, V2UnitL01, V2UnitL01,
80506c3fb27SDimitry Andric                                            V2UnitL01, V2UnitL01, V2UnitL01,
80606c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01,
80706c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01,
80806c3fb27SDimitry Andric                                            V2UnitV01, V2UnitV01, V2UnitV01]> {
80906c3fb27SDimitry Andric  let Latency     = 7;
81006c3fb27SDimitry Andric  let NumMicroOps = 18;
81106c3fb27SDimitry Andric}
81206c3fb27SDimitry Andric
81306c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
81406c3fb27SDimitry Andric// Define generic 27 micro-op types
81506c3fb27SDimitry Andric
81606c3fb27SDimitry Andricdef V2Write_7cyc_9L01_9S_9V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
81706c3fb27SDimitry Andric                                               V2UnitL01, V2UnitL01, V2UnitL01,
81806c3fb27SDimitry Andric                                               V2UnitL01, V2UnitL01, V2UnitL01,
81906c3fb27SDimitry Andric                                               V2UnitS, V2UnitS, V2UnitS,
82006c3fb27SDimitry Andric                                               V2UnitS, V2UnitS, V2UnitS,
82106c3fb27SDimitry Andric                                               V2UnitS, V2UnitS, V2UnitS,
82206c3fb27SDimitry Andric                                               V2UnitV01, V2UnitV01, V2UnitV01,
82306c3fb27SDimitry Andric                                               V2UnitV01, V2UnitV01, V2UnitV01,
82406c3fb27SDimitry Andric                                               V2UnitV01, V2UnitV01,
82506c3fb27SDimitry Andric                                               V2UnitV01]> {
82606c3fb27SDimitry Andric  let Latency     = 7;
82706c3fb27SDimitry Andric  let NumMicroOps = 27;
82806c3fb27SDimitry Andric}
82906c3fb27SDimitry Andric
83006c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
83106c3fb27SDimitry Andric// Define generic 36 micro-op types
83206c3fb27SDimitry Andric
83306c3fb27SDimitry Andricdef V2Write_11cyc_18L01_18V01 : SchedWriteRes<[V2UnitL01, V2UnitL01, V2UnitL01,
83406c3fb27SDimitry Andric                                               V2UnitL01, V2UnitL01, V2UnitL01,
83506c3fb27SDimitry Andric                                               V2UnitL01, V2UnitL01, V2UnitL01,
83606c3fb27SDimitry Andric                                               V2UnitL01, V2UnitL01, V2UnitL01,
83706c3fb27SDimitry Andric                                               V2UnitL01, V2UnitL01, V2UnitL01,
83806c3fb27SDimitry Andric                                               V2UnitL01, V2UnitL01, V2UnitL01,
83906c3fb27SDimitry Andric                                               V2UnitV01, V2UnitV01, V2UnitV01,
84006c3fb27SDimitry Andric                                               V2UnitV01, V2UnitV01, V2UnitV01,
84106c3fb27SDimitry Andric                                               V2UnitV01, V2UnitV01, V2UnitV01,
84206c3fb27SDimitry Andric                                               V2UnitV01, V2UnitV01, V2UnitV01,
84306c3fb27SDimitry Andric                                               V2UnitV01, V2UnitV01, V2UnitV01,
84406c3fb27SDimitry Andric                                               V2UnitV01, V2UnitV01,
84506c3fb27SDimitry Andric                                               V2UnitV01]> {
84606c3fb27SDimitry Andric  let Latency     = 11;
84706c3fb27SDimitry Andric  let NumMicroOps = 36;
84806c3fb27SDimitry Andric}
84906c3fb27SDimitry Andric
85006c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
85106c3fb27SDimitry Andric// Define generic 54 micro-op types
85206c3fb27SDimitry Andric
85306c3fb27SDimitry Andricdef V2Write_11cyc_18L01_18S_18V01 : SchedWriteRes<[V2UnitL01, V2UnitL01,
85406c3fb27SDimitry Andric                                                   V2UnitL01, V2UnitL01,
85506c3fb27SDimitry Andric                                                   V2UnitL01, V2UnitL01,
85606c3fb27SDimitry Andric                                                   V2UnitL01, V2UnitL01,
85706c3fb27SDimitry Andric                                                   V2UnitL01, V2UnitL01,
85806c3fb27SDimitry Andric                                                   V2UnitL01, V2UnitL01,
85906c3fb27SDimitry Andric                                                   V2UnitL01, V2UnitL01,
86006c3fb27SDimitry Andric                                                   V2UnitL01, V2UnitL01,
86106c3fb27SDimitry Andric                                                   V2UnitL01, V2UnitL01,
86206c3fb27SDimitry Andric                                                   V2UnitS, V2UnitS, V2UnitS,
86306c3fb27SDimitry Andric                                                   V2UnitS, V2UnitS, V2UnitS,
86406c3fb27SDimitry Andric                                                   V2UnitS, V2UnitS, V2UnitS,
86506c3fb27SDimitry Andric                                                   V2UnitS, V2UnitS, V2UnitS,
86606c3fb27SDimitry Andric                                                   V2UnitS, V2UnitS, V2UnitS,
86706c3fb27SDimitry Andric                                                   V2UnitS, V2UnitS, V2UnitS,
86806c3fb27SDimitry Andric                                                   V2UnitV01, V2UnitV01,
86906c3fb27SDimitry Andric                                                   V2UnitV01, V2UnitV01,
87006c3fb27SDimitry Andric                                                   V2UnitV01, V2UnitV01,
87106c3fb27SDimitry Andric                                                   V2UnitV01, V2UnitV01,
87206c3fb27SDimitry Andric                                                   V2UnitV01, V2UnitV01,
87306c3fb27SDimitry Andric                                                   V2UnitV01, V2UnitV01,
87406c3fb27SDimitry Andric                                                   V2UnitV01, V2UnitV01,
87506c3fb27SDimitry Andric                                                   V2UnitV01, V2UnitV01,
87606c3fb27SDimitry Andric                                                   V2UnitV01, V2UnitV01]> {
87706c3fb27SDimitry Andric  let Latency     = 11;
87806c3fb27SDimitry Andric  let NumMicroOps = 54;
87906c3fb27SDimitry Andric}
88006c3fb27SDimitry Andric
88106c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
88206c3fb27SDimitry Andric// Define predicate-controlled types
88306c3fb27SDimitry Andric
88406c3fb27SDimitry Andricdef V2Write_ArithI : SchedWriteVariant<[
88506c3fb27SDimitry Andric                       SchedVar<IsCheapLSL,  [V2Write_1cyc_1I]>,
88606c3fb27SDimitry Andric                       SchedVar<NoSchedPred, [V2Write_2cyc_1M]>]>;
88706c3fb27SDimitry Andric
88806c3fb27SDimitry Andricdef V2Write_ArithF : SchedWriteVariant<[
88906c3fb27SDimitry Andric                       SchedVar<IsCheapLSL,  [V2Write_1cyc_1F]>,
89006c3fb27SDimitry Andric                       SchedVar<NoSchedPred, [V2Write_2cyc_1M]>]>;
89106c3fb27SDimitry Andric
89206c3fb27SDimitry Andricdef V2Write_Logical : SchedWriteVariant<[
89306c3fb27SDimitry Andric                        SchedVar<NeoverseNoLSL, [V2Write_1cyc_1F]>,
89406c3fb27SDimitry Andric                        SchedVar<NoSchedPred,   [V2Write_2cyc_1M]>]>;
89506c3fb27SDimitry Andric
89606c3fb27SDimitry Andricdef V2Write_Extr : SchedWriteVariant<[
89706c3fb27SDimitry Andric                     SchedVar<IsRORImmIdiomPred, [V2Write_1cyc_1I]>,
89806c3fb27SDimitry Andric                     SchedVar<NoSchedPred,       [V2Write_3cyc_1I_1M]>]>;
89906c3fb27SDimitry Andric
90006c3fb27SDimitry Andricdef V2Write_LdrHQ : SchedWriteVariant<[
90106c3fb27SDimitry Andric                      SchedVar<NeoverseHQForm,  [V2Write_7cyc_1I_1L]>,
90206c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_6cyc_1L]>]>;
90306c3fb27SDimitry Andric
90406c3fb27SDimitry Andricdef V2Write_StrHQ : SchedWriteVariant<[
90506c3fb27SDimitry Andric                      SchedVar<NeoverseHQForm,  [V2Write_2cyc_1L01_1V01_1I]>,
90606c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_2cyc_1L01_1V01]>]>;
90706c3fb27SDimitry Andric
9085f757f3fSDimitry Andricdef V2Write_0or1cyc_1I : SchedWriteVariant<[
9095f757f3fSDimitry Andric                      SchedVar<NeoverseZeroMove, [V2Write_0cyc]>,
9105f757f3fSDimitry Andric                      SchedVar<NoSchedPred,      [V2Write_1cyc_1I]>]>;
9115f757f3fSDimitry Andric
9125f757f3fSDimitry Andricdef V2Write_0or2cyc_1V : SchedWriteVariant<[
9135f757f3fSDimitry Andric                      SchedVar<NeoverseZeroMove, [V2Write_0cyc]>,
9145f757f3fSDimitry Andric                      SchedVar<NoSchedPred,      [V2Write_2cyc_1V]>]>;
9155f757f3fSDimitry Andric
9165f757f3fSDimitry Andricdef V2Write_0or3cyc_1M0 : SchedWriteVariant<[
9175f757f3fSDimitry Andric                      SchedVar<NeoverseZeroMove, [V2Write_0cyc]>,
9185f757f3fSDimitry Andric                      SchedVar<NoSchedPred,      [V2Write_3cyc_1M0]>]>;
9195f757f3fSDimitry Andric
92006c3fb27SDimitry Andricdef V2Write_2or3cyc_1M : SchedWriteVariant<[
92106c3fb27SDimitry Andric                      SchedVar<NeoversePdIsPg,  [V2Write_3cyc_1M]>,
92206c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_2cyc_1M]>]>;
92306c3fb27SDimitry Andric
92406c3fb27SDimitry Andricdef V2Write_3or4cyc_2M : SchedWriteVariant<[
92506c3fb27SDimitry Andric                      SchedVar<NeoversePdIsPg,  [V2Write_4cyc_2M]>,
92606c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_3cyc_2M]>]>;
92706c3fb27SDimitry Andric
92806c3fb27SDimitry Andricdef V2Write_1or2cyc_1M0 : SchedWriteVariant<[
92906c3fb27SDimitry Andric                      SchedVar<NeoversePdIsPg,  [V2Write_2cyc_1M0]>,
93006c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_1cyc_1M0]>]>;
93106c3fb27SDimitry Andric
93206c3fb27SDimitry Andricdef V2Write_2or3cyc_1M0 : SchedWriteVariant<[
93306c3fb27SDimitry Andric                      SchedVar<NeoversePdIsPg,  [V2Write_3cyc_1M0]>,
93406c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_2cyc_1M0]>]>;
93506c3fb27SDimitry Andric
93606c3fb27SDimitry Andricdef V2Write_1or2cyc_1M0_1M : SchedWriteVariant<[
93706c3fb27SDimitry Andric                      SchedVar<NeoversePdIsPg,  [V2Write_2cyc_1M0_1M]>,
93806c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_1cyc_1M0_1M]>]>;
93906c3fb27SDimitry Andric
94006c3fb27SDimitry Andricdef V2Write_3or4cyc_1M0_1M : SchedWriteVariant<[
94106c3fb27SDimitry Andric                      SchedVar<NeoversePdIsPg,  [V2Write_4cyc_1M0_1M]>,
94206c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_3cyc_1M0_1M]>]>;
94306c3fb27SDimitry Andric
94406c3fb27SDimitry Andricdef V2Write_4or5cyc_2M0_2M : SchedWriteVariant<[
94506c3fb27SDimitry Andric                      SchedVar<NeoversePdIsPg,  [V2Write_5cyc_2M0_2M]>,
94606c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_4cyc_2M0_2M]>]>;
94706c3fb27SDimitry Andric
94806c3fb27SDimitry Andricdef V2Write_4or5cyc_1V0_1M0 : SchedWriteVariant<[
94906c3fb27SDimitry Andric                      SchedVar<NeoversePdIsPg,  [V2Write_5cyc_1V0_1M0]>,
95006c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_4cyc_1V0_1M0]>]>;
95106c3fb27SDimitry Andric
95206c3fb27SDimitry Andricdef V2Write_2or3cyc_1V0_1M : SchedWriteVariant<[
95306c3fb27SDimitry Andric                      SchedVar<NeoversePdIsPg,  [V2Write_3cyc_1V0_1M]>,
95406c3fb27SDimitry Andric                      SchedVar<NoSchedPred,     [V2Write_2cyc_1V0_1M]>]>;
95506c3fb27SDimitry Andric
95606c3fb27SDimitry Andricdef V2Write_IncDec : SchedWriteVariant<[
95706c3fb27SDimitry Andric                      SchedVar<NeoverseCheapIncDec, [V2Write_1cyc_1F]>,
95806c3fb27SDimitry Andric                      SchedVar<NoSchedPred,         [V2Write_2cyc_1M]>]>;
95906c3fb27SDimitry Andric
96006c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
96106c3fb27SDimitry Andric// Define forwarded types
96206c3fb27SDimitry Andric
96306c3fb27SDimitry Andric// NOTE: SOG, p. 16, n. 2: Accumulator forwarding is not supported for
96406c3fb27SDimitry Andric// consumers of 64 bit multiply high operations?
96506c3fb27SDimitry Andricdef V2Wr_IM   : SchedWriteRes<[V2UnitM]>  { let Latency = 2; }
96606c3fb27SDimitry Andricdef V2Wr_IMA  : SchedWriteRes<[V2UnitM0]> { let Latency = 2; }
96706c3fb27SDimitry Andricdef V2Wr_IMUL : SchedWriteVariant<[
96806c3fb27SDimitry Andric                  SchedVar<IsReg3ZeroPred, [V2Wr_IM]>,
96906c3fb27SDimitry Andric                  SchedVar<NoSchedPred,    [V2Wr_IMA]>]>;
97006c3fb27SDimitry Andricdef V2Rd_IMA  : SchedReadAdvance<1, [V2Wr_IMA]>;
97106c3fb27SDimitry Andric
97206c3fb27SDimitry Andricdef V2Wr_FMA : SchedWriteRes<[V2UnitV]> { let Latency = 4; }
97306c3fb27SDimitry Andricdef V2Rd_FMA : SchedReadAdvance<2, [WriteFMul, V2Wr_FMA]>;
97406c3fb27SDimitry Andric
97506c3fb27SDimitry Andricdef V2Wr_VA : SchedWriteRes<[V2UnitV13]> { let Latency = 4; }
97606c3fb27SDimitry Andricdef V2Rd_VA : SchedReadAdvance<3, [V2Wr_VA]>;
97706c3fb27SDimitry Andric
97806c3fb27SDimitry Andricdef V2Wr_VDOT : SchedWriteRes<[V2UnitV]> { let Latency = 3; }
97906c3fb27SDimitry Andricdef V2Rd_VDOT : SchedReadAdvance<2, [V2Wr_VDOT]>;
98006c3fb27SDimitry Andric
98106c3fb27SDimitry Andricdef V2Wr_VMMA : SchedWriteRes<[V2UnitV]> { let Latency = 3; }
98206c3fb27SDimitry Andricdef V2Rd_VMMA : SchedReadAdvance<2, [V2Wr_VMMA]>;
98306c3fb27SDimitry Andric
98406c3fb27SDimitry Andricdef V2Wr_VMA : SchedWriteRes<[V2UnitV02]> { let Latency = 4; }
98506c3fb27SDimitry Andricdef V2Rd_VMA : SchedReadAdvance<3, [V2Wr_VMA]>;
98606c3fb27SDimitry Andric
98706c3fb27SDimitry Andricdef V2Wr_VMAH : SchedWriteRes<[V2UnitV02, V2UnitV02]> { let Latency = 4; }
98806c3fb27SDimitry Andricdef V2Rd_VMAH : SchedReadAdvance<2, [V2Wr_VMAH]>;
98906c3fb27SDimitry Andric
99006c3fb27SDimitry Andricdef V2Wr_VMAL : SchedWriteRes<[V2UnitV02]> { let Latency = 4; }
99106c3fb27SDimitry Andricdef V2Rd_VMAL : SchedReadAdvance<3, [V2Wr_VMAL]>;
99206c3fb27SDimitry Andric
99306c3fb27SDimitry Andricdef V2Wr_VPA : SchedWriteRes<[V2UnitV13]> { let Latency = 4; }
99406c3fb27SDimitry Andricdef V2Rd_VPA : SchedReadAdvance<3, [V2Wr_VPA]>;
99506c3fb27SDimitry Andric
99606c3fb27SDimitry Andricdef V2Wr_VSA : SchedWriteRes<[V2UnitV13]> { let Latency = 4; }
99706c3fb27SDimitry Andricdef V2Rd_VSA : SchedReadAdvance<3, [V2Wr_VSA]>;
99806c3fb27SDimitry Andric
99906c3fb27SDimitry Andricdef V2Wr_VFCMA : SchedWriteRes<[V2UnitV]> { let Latency = 4; }
100006c3fb27SDimitry Andricdef V2Rd_VFCMA : SchedReadAdvance<2, [V2Wr_VFCMA]>;
100106c3fb27SDimitry Andric
100206c3fb27SDimitry Andricdef V2Wr_VFM  : SchedWriteRes<[V2UnitV]> { let Latency = 3; }
100306c3fb27SDimitry Andricdef V2Wr_VFMA : SchedWriteRes<[V2UnitV]> { let Latency = 4; }
100406c3fb27SDimitry Andricdef V2Rd_VFMA : SchedReadAdvance<2, [V2Wr_VFM, V2Wr_VFMA]>;
100506c3fb27SDimitry Andric
100606c3fb27SDimitry Andricdef V2Wr_VFMAL : SchedWriteRes<[V2UnitV]> { let Latency = 4; }
100706c3fb27SDimitry Andricdef V2Rd_VFMAL : SchedReadAdvance<2, [V2Wr_VFMAL]>;
100806c3fb27SDimitry Andric
100906c3fb27SDimitry Andricdef V2Wr_VBFDOT : SchedWriteRes<[V2UnitV]> { let Latency = 5; }
101006c3fb27SDimitry Andricdef V2Rd_VBFDOT : SchedReadAdvance<2, [V2Wr_VBFDOT]>;
101106c3fb27SDimitry Andricdef V2Wr_VBFMMA : SchedWriteRes<[V2UnitV]> { let Latency = 6; }
101206c3fb27SDimitry Andricdef V2Rd_VBFMMA : SchedReadAdvance<2, [V2Wr_VBFMMA]>;
101306c3fb27SDimitry Andricdef V2Wr_VBFMAL : SchedWriteRes<[V2UnitV]> { let Latency = 5; }
101406c3fb27SDimitry Andricdef V2Rd_VBFMAL : SchedReadAdvance<3, [V2Wr_VBFMAL]>;
101506c3fb27SDimitry Andric
101606c3fb27SDimitry Andricdef V2Wr_CRC : SchedWriteRes<[V2UnitM0]> { let Latency = 2; }
101706c3fb27SDimitry Andricdef V2Rd_CRC : SchedReadAdvance<1, [V2Wr_CRC]>;
101806c3fb27SDimitry Andric
101906c3fb27SDimitry Andricdef V2Wr_ZA  : SchedWriteRes<[V2UnitV13]> { let Latency = 4; }
102006c3fb27SDimitry Andricdef V2Rd_ZA  : SchedReadAdvance<3, [V2Wr_ZA]>;
102106c3fb27SDimitry Andricdef V2Wr_ZPA : SchedWriteRes<[V2UnitV13]> { let Latency = 4; }
102206c3fb27SDimitry Andricdef V2Rd_ZPA : SchedReadAdvance<3, [V2Wr_ZPA]>;
102306c3fb27SDimitry Andricdef V2Wr_ZSA : SchedWriteRes<[V2UnitV13]> { let Latency = 4; }
102406c3fb27SDimitry Andricdef V2Rd_ZSA : SchedReadAdvance<3, [V2Wr_ZSA]>;
102506c3fb27SDimitry Andric
102606c3fb27SDimitry Andricdef V2Wr_ZDOTB : SchedWriteRes<[V2UnitV]>   { let Latency = 3; }
102706c3fb27SDimitry Andricdef V2Rd_ZDOTB : SchedReadAdvance<2, [V2Wr_ZDOTB]>;
102806c3fb27SDimitry Andricdef V2Wr_ZDOTH : SchedWriteRes<[V2UnitV02]> { let Latency = 4; }
102906c3fb27SDimitry Andricdef V2Rd_ZDOTH : SchedReadAdvance<3, [V2Wr_ZDOTH]>;
103006c3fb27SDimitry Andric
103106c3fb27SDimitry Andric// NOTE: SOG p. 43: Complex multiply-add B, H, S element size: How to reduce
103206c3fb27SDimitry Andric// throughput to 1 in case of forwarding?
103306c3fb27SDimitry Andricdef V2Wr_ZCMABHS : SchedWriteRes<[V2UnitV02]> { let Latency = 4; }
103406c3fb27SDimitry Andricdef V2Rd_ZCMABHS : SchedReadAdvance<3, [V2Wr_ZCMABHS]>;
103506c3fb27SDimitry Andricdef V2Wr_ZCMAD   : SchedWriteRes<[V2UnitV02, V2UnitV02]> { let Latency = 5; }
103606c3fb27SDimitry Andricdef V2Rd_ZCMAD   : SchedReadAdvance<2, [V2Wr_ZCMAD]>;
103706c3fb27SDimitry Andric
103806c3fb27SDimitry Andricdef V2Wr_ZMMA : SchedWriteRes<[V2UnitV]> { let Latency = 3; }
103906c3fb27SDimitry Andricdef V2Rd_ZMMA : SchedReadAdvance<2, [V2Wr_ZMMA]>;
104006c3fb27SDimitry Andric
104106c3fb27SDimitry Andricdef V2Wr_ZMABHS : SchedWriteRes<[V2UnitV02, V2UnitV02]> { let Latency = 4; }
104206c3fb27SDimitry Andricdef V2Rd_ZMABHS : SchedReadAdvance<3, [V2Wr_ZMABHS]>;
104306c3fb27SDimitry Andricdef V2Wr_ZMAD  : SchedWriteRes<[V2UnitV02, V2UnitV02]> { let Latency = 5; }
104406c3fb27SDimitry Andricdef V2Rd_ZMAD  : SchedReadAdvance<2, [V2Wr_ZMAD]>;
104506c3fb27SDimitry Andric
104606c3fb27SDimitry Andricdef V2Wr_ZMAL : SchedWriteRes<[V2UnitV02]> { let Latency = 4; }
104706c3fb27SDimitry Andricdef V2Rd_ZMAL : SchedReadAdvance<3, [V2Wr_ZMAL]>;
104806c3fb27SDimitry Andric
104906c3fb27SDimitry Andricdef V2Wr_ZMASQL   : SchedWriteRes<[V2UnitV02]>            { let Latency = 4; }
105006c3fb27SDimitry Andricdef V2Wr_ZMASQBHS : SchedWriteRes<[V2UnitV02]>            { let Latency = 4; }
105106c3fb27SDimitry Andricdef V2Wr_ZMASQD   : SchedWriteRes<[V2UnitV02, V2UnitV02]> { let Latency = 5; }
105206c3fb27SDimitry Andricdef V2Rd_ZMASQ    : SchedReadAdvance<2, [V2Wr_ZMASQL, V2Wr_ZMASQBHS,
105306c3fb27SDimitry Andric                                         V2Wr_ZMASQD]>;
105406c3fb27SDimitry Andric
105506c3fb27SDimitry Andricdef V2Wr_ZFCMA : SchedWriteRes<[V2UnitV]> { let Latency = 5; }
105606c3fb27SDimitry Andricdef V2Rd_ZFCMA : SchedReadAdvance<3, [V2Wr_ZFCMA]>;
105706c3fb27SDimitry Andric
105806c3fb27SDimitry Andricdef V2Wr_ZFMA : SchedWriteRes<[V2UnitV]> { let Latency = 4; }
105906c3fb27SDimitry Andricdef V2Rd_ZFMA : SchedReadAdvance<2, [V2Wr_ZFMA]>;
106006c3fb27SDimitry Andric
106106c3fb27SDimitry Andricdef V2Wr_ZFMAL : SchedWriteRes<[V2UnitV]> { let Latency = 4; }
106206c3fb27SDimitry Andricdef V2Rd_ZFMAL : SchedReadAdvance<2, [V2Wr_ZFMAL]>;
106306c3fb27SDimitry Andric
106406c3fb27SDimitry Andricdef V2Wr_ZBFDOT : SchedWriteRes<[V2UnitV]> { let Latency = 5; }
106506c3fb27SDimitry Andricdef V2Rd_ZBFDOT : SchedReadAdvance<2, [V2Wr_ZBFDOT]>;
106606c3fb27SDimitry Andricdef V2Wr_ZBFMMA : SchedWriteRes<[V2UnitV]> { let Latency = 6; }
106706c3fb27SDimitry Andricdef V2Rd_ZBFMMA : SchedReadAdvance<2, [V2Wr_ZBFMMA]>;
106806c3fb27SDimitry Andricdef V2Wr_ZBFMAL : SchedWriteRes<[V2UnitV]> { let Latency = 5; }
106906c3fb27SDimitry Andricdef V2Rd_ZBFMAL : SchedReadAdvance<3, [V2Wr_ZBFMAL]>;
107006c3fb27SDimitry Andric
107106c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
107206c3fb27SDimitry Andric// Define types with long resource cycles (rc)
107306c3fb27SDimitry Andric
10745f757f3fSDimitry Andricdef V2Write_6cyc_1V1_5rc    : SchedWriteRes<[V2UnitV1]>  { let Latency =  6; let ReleaseAtCycles = [ 5]; }
10755f757f3fSDimitry Andricdef V2Write_7cyc_1V02_7rc   : SchedWriteRes<[V2UnitV02]> { let Latency =  7; let ReleaseAtCycles = [ 7]; }
10765f757f3fSDimitry Andricdef V2Write_10cyc_1V02_5rc  : SchedWriteRes<[V2UnitV02]> { let Latency = 10; let ReleaseAtCycles = [ 5]; }
10775f757f3fSDimitry Andricdef V2Write_10cyc_1V02_9rc  : SchedWriteRes<[V2UnitV02]> { let Latency = 10; let ReleaseAtCycles = [ 9]; }
10785f757f3fSDimitry Andricdef V2Write_10cyc_1V02_10rc : SchedWriteRes<[V2UnitV02]> { let Latency = 10; let ReleaseAtCycles = [10]; }
10795f757f3fSDimitry Andricdef V2Write_10cyc_1V1_9rc   : SchedWriteRes<[V2UnitV1]>  { let Latency = 10; let ReleaseAtCycles = [ 9]; }
10805f757f3fSDimitry Andricdef V2Write_13cyc_1V02_12rc : SchedWriteRes<[V2UnitV02]> { let Latency = 13; let ReleaseAtCycles = [12]; }
10815f757f3fSDimitry Andricdef V2Write_13cyc_1V02_13rc : SchedWriteRes<[V2UnitV02]> { let Latency = 13; let ReleaseAtCycles = [13]; }
10825f757f3fSDimitry Andricdef V2Write_15cyc_1V02_14rc : SchedWriteRes<[V2UnitV02]> { let Latency = 15; let ReleaseAtCycles = [14]; }
1083*0fca6ea1SDimitry Andricdef V2Write_16cyc_1V02_14rc : SchedWriteRes<[V2UnitV02]> { let Latency = 16; let ReleaseAtCycles = [14]; }
10845f757f3fSDimitry Andricdef V2Write_16cyc_1V02_15rc : SchedWriteRes<[V2UnitV02]> { let Latency = 16; let ReleaseAtCycles = [15]; }
108506c3fb27SDimitry Andric
108606c3fb27SDimitry Andric// Miscellaneous
108706c3fb27SDimitry Andric// -----------------------------------------------------------------------------
108806c3fb27SDimitry Andric
108906c3fb27SDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>;
109006c3fb27SDimitry Andric
109106c3fb27SDimitry Andric// §3.3 Branch instructions
109206c3fb27SDimitry Andric// -----------------------------------------------------------------------------
109306c3fb27SDimitry Andric
109406c3fb27SDimitry Andric// Branch, immed
109506c3fb27SDimitry Andric// Compare and branch
109606c3fb27SDimitry Andricdef : SchedAlias<WriteBr,    V2Write_1cyc_1B>;
109706c3fb27SDimitry Andric
109806c3fb27SDimitry Andric// Branch, register
109906c3fb27SDimitry Andricdef : SchedAlias<WriteBrReg, V2Write_1cyc_1B>;
110006c3fb27SDimitry Andric
110106c3fb27SDimitry Andric// Branch and link, immed
110206c3fb27SDimitry Andric// Branch and link, register
110306c3fb27SDimitry Andricdef : InstRW<[V2Write_1cyc_1B_1R], (instrs BL, BLR)>;
110406c3fb27SDimitry Andric
110506c3fb27SDimitry Andric// §3.4 Arithmetic and Logical Instructions
110606c3fb27SDimitry Andric// -----------------------------------------------------------------------------
110706c3fb27SDimitry Andric
110806c3fb27SDimitry Andric// ALU, basic
110906c3fb27SDimitry Andric// ALU, basic, flagset
111006c3fb27SDimitry Andricdef : SchedAlias<WriteI, V2Write_1cyc_1I>;
1111*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_1cyc_1F], (instregex "^(ADD|SUB)S[WX]r[ir]$",
1112*0fca6ea1SDimitry Andric                        "^(ADC|SBC)S[WX]r$",
1113*0fca6ea1SDimitry Andric                        "^ANDS[WX]ri$")>;
11145f757f3fSDimitry Andricdef : InstRW<[V2Write_0or1cyc_1I], (instregex "^MOVZ[WX]i$")>;
111506c3fb27SDimitry Andric
111606c3fb27SDimitry Andric// ALU, extend and shift
111706c3fb27SDimitry Andricdef : SchedAlias<WriteIEReg, V2Write_2cyc_1M>;
111806c3fb27SDimitry Andric
1119*0fca6ea1SDimitry Andric// Conditional compare
1120*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_1cyc_1F], (instregex "^CCM[NP][WX][ir]")>;
1121*0fca6ea1SDimitry Andric
112206c3fb27SDimitry Andric// Arithmetic, LSL shift, shift <= 4
112306c3fb27SDimitry Andric// Arithmetic, flagset, LSL shift, shift <= 4
112406c3fb27SDimitry Andric// Arithmetic, LSR/ASR/ROR shift or LSL shift > 4
112506c3fb27SDimitry Andricdef : SchedAlias<WriteISReg, V2Write_ArithI>;
112606c3fb27SDimitry Andricdef : InstRW<[V2Write_ArithF],
112706c3fb27SDimitry Andric             (instregex "^(ADD|SUB)S[WX]rs$")>;
112806c3fb27SDimitry Andric
112906c3fb27SDimitry Andric// Arithmetic, immediate to logical address tag
113006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M], (instrs ADDG, SUBG)>;
113106c3fb27SDimitry Andric
113206c3fb27SDimitry Andric// Convert floating-point condition flags
113306c3fb27SDimitry Andric// Flag manipulation instructions
113406c3fb27SDimitry Andricdef : WriteRes<WriteSys, []> { let Latency = 1; }
113506c3fb27SDimitry Andric
113606c3fb27SDimitry Andric// Insert Random Tags
113706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M], (instrs IRG, IRGstack)>;
113806c3fb27SDimitry Andric
113906c3fb27SDimitry Andric// Insert Tag Mask
114006c3fb27SDimitry Andric// Subtract Pointer
114106c3fb27SDimitry Andric// Subtract Pointer, flagset
114206c3fb27SDimitry Andricdef : InstRW<[V2Write_1cyc_1I], (instrs GMI, SUBP, SUBPS)>;
114306c3fb27SDimitry Andric
114406c3fb27SDimitry Andric// Logical, shift, no flagset
11455f757f3fSDimitry Andricdef : InstRW<[V2Write_1cyc_1I],    (instregex "^(AND|BIC|EON|EOR|ORN)[WX]rs$")>;
11465f757f3fSDimitry Andricdef : InstRW<[V2Write_0or1cyc_1I], (instregex "^ORR[WX]rs$")>;
114706c3fb27SDimitry Andric
114806c3fb27SDimitry Andric// Logical, shift, flagset
114906c3fb27SDimitry Andricdef : InstRW<[V2Write_Logical], (instregex "^(AND|BIC)S[WX]rs$")>;
115006c3fb27SDimitry Andric
115106c3fb27SDimitry Andric// Move and shift instructions
115206c3fb27SDimitry Andric// -----------------------------------------------------------------------------
115306c3fb27SDimitry Andric
115406c3fb27SDimitry Andricdef : SchedAlias<WriteImm, V2Write_1cyc_1I>;
115506c3fb27SDimitry Andric
115606c3fb27SDimitry Andric// §3.5 Divide and multiply instructions
115706c3fb27SDimitry Andric// -----------------------------------------------------------------------------
115806c3fb27SDimitry Andric
115906c3fb27SDimitry Andric// SDIV, UDIV
116006c3fb27SDimitry Andricdef : SchedAlias<WriteID32,  V2Write_12cyc_1M0>;
116106c3fb27SDimitry Andricdef : SchedAlias<WriteID64,  V2Write_20cyc_1M0>;
116206c3fb27SDimitry Andric
116306c3fb27SDimitry Andricdef : SchedAlias<WriteIM32, V2Write_2cyc_1M>;
116406c3fb27SDimitry Andricdef : SchedAlias<WriteIM64, V2Write_2cyc_1M>;
116506c3fb27SDimitry Andric
116606c3fb27SDimitry Andric// Multiply
116706c3fb27SDimitry Andric// Multiply accumulate, W-form
116806c3fb27SDimitry Andric// Multiply accumulate, X-form
116906c3fb27SDimitry Andricdef : InstRW<[V2Wr_IMUL, ReadIM, ReadIM, V2Rd_IMA],
117006c3fb27SDimitry Andric             (instregex "^M(ADD|SUB)[WX]rrr$")>;
117106c3fb27SDimitry Andric
117206c3fb27SDimitry Andric// Multiply accumulate long
117306c3fb27SDimitry Andric// Multiply long
117406c3fb27SDimitry Andricdef : InstRW<[V2Wr_IMUL, ReadIM, ReadIM, V2Rd_IMA],
117506c3fb27SDimitry Andric             (instregex "^(S|U)M(ADD|SUB)Lrrr$")>;
117606c3fb27SDimitry Andric
117706c3fb27SDimitry Andric// Multiply high
117806c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1M], (instrs SMULHrr, UMULHrr)>;
117906c3fb27SDimitry Andric
118006c3fb27SDimitry Andric// Pointer Authentication Instructions (v8.3 PAC)
118106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
118206c3fb27SDimitry Andric
118306c3fb27SDimitry Andric// Authenticate data address
118406c3fb27SDimitry Andric// Authenticate instruction address
118506c3fb27SDimitry Andric// Compute pointer authentication code for data address
118606c3fb27SDimitry Andric// Compute pointer authentication code, using generic key
118706c3fb27SDimitry Andric// Compute pointer authentication code for instruction address
118806c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_1M0], (instregex "^AUT", "^PAC")>;
118906c3fb27SDimitry Andric
119006c3fb27SDimitry Andric// Branch and link, register, with pointer authentication
119106c3fb27SDimitry Andric// Branch, register, with pointer authentication
119206c3fb27SDimitry Andric// Branch, return, with pointer authentication
119306c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1M0_1B], (instrs BLRAA, BLRAAZ, BLRAB, BLRABZ, BRAA,
119406c3fb27SDimitry Andric                                            BRAAZ, BRAB, BRABZ, RETAA, RETAB,
119506c3fb27SDimitry Andric                                            ERETAA, ERETAB)>;
119606c3fb27SDimitry Andric
119706c3fb27SDimitry Andric
119806c3fb27SDimitry Andric// Load register, with pointer authentication
119906c3fb27SDimitry Andricdef : InstRW<[V2Write_9cyc_1M0_1L], (instregex "^LDRA[AB](indexed|writeback)")>;
120006c3fb27SDimitry Andric
120106c3fb27SDimitry Andric// Strip pointer authentication code
120206c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M0], (instrs XPACD, XPACI, XPACLRI)>;
120306c3fb27SDimitry Andric
120406c3fb27SDimitry Andric// Miscellaneous data-processing instructions
120506c3fb27SDimitry Andric// -----------------------------------------------------------------------------
120606c3fb27SDimitry Andric
120706c3fb27SDimitry Andric// Address generation
120806c3fb27SDimitry Andricdef : InstRW<[V2Write_1cyc_1F], (instrs ADR, ADRP)>;
120906c3fb27SDimitry Andric
121006c3fb27SDimitry Andric// Bitfield extract, one reg
121106c3fb27SDimitry Andric// Bitfield extract, two regs
121206c3fb27SDimitry Andricdef : SchedAlias<WriteExtr, V2Write_Extr>;
121306c3fb27SDimitry Andricdef : InstRW<[V2Write_Extr], (instrs EXTRWrri, EXTRXrri)>;
121406c3fb27SDimitry Andric
121506c3fb27SDimitry Andric// Bitfield move, basic
121606c3fb27SDimitry Andricdef : SchedAlias<WriteIS, V2Write_1cyc_1I>;
121706c3fb27SDimitry Andric
121806c3fb27SDimitry Andric// Bitfield move, insert
121906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M], (instregex "^BFM[WX]ri$")>;
122006c3fb27SDimitry Andric
122106c3fb27SDimitry Andric// Load instructions
122206c3fb27SDimitry Andric// -----------------------------------------------------------------------------
122306c3fb27SDimitry Andric
122406c3fb27SDimitry Andric// NOTE: SOG p. 19: Throughput of LDN?P X-form should be 2, but reported as 3.
122506c3fb27SDimitry Andric
122606c3fb27SDimitry Andricdef : SchedAlias<WriteLD,    V2Write_4cyc_1L>;
122706c3fb27SDimitry Andricdef : SchedAlias<WriteLDIdx, V2Write_4cyc_1L>;
122806c3fb27SDimitry Andric
122906c3fb27SDimitry Andric// Load register, literal
123006c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_1L_1F], (instrs LDRWl, LDRXl, LDRSWl, PRFMl)>;
123106c3fb27SDimitry Andric
123206c3fb27SDimitry Andric// Load pair, signed immed offset, signed words
123306c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_1I_3L, WriteLDHi], (instrs LDPSWi)>;
123406c3fb27SDimitry Andric
123506c3fb27SDimitry Andric// Load pair, immed post-index or immed pre-index, signed words
12365f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_5cyc_1I_3L, WriteLDHi],
123706c3fb27SDimitry Andric             (instregex "^LDPSW(post|pre)$")>;
123806c3fb27SDimitry Andric
123906c3fb27SDimitry Andric// Store instructions
124006c3fb27SDimitry Andric// -----------------------------------------------------------------------------
124106c3fb27SDimitry Andric
124206c3fb27SDimitry Andric// NOTE: SOG, p. 20: Unsure if STRH uses pipeline I.
124306c3fb27SDimitry Andric
124406c3fb27SDimitry Andricdef : SchedAlias<WriteST,    V2Write_1cyc_1L01_1D>;
124506c3fb27SDimitry Andricdef : SchedAlias<WriteSTIdx, V2Write_1cyc_1L01_1D>;
124606c3fb27SDimitry Andricdef : SchedAlias<WriteSTP,   V2Write_1cyc_1L01_1D>;
12475f757f3fSDimitry Andricdef : SchedAlias<WriteAdr,   V2Write_1cyc_1I>;
124806c3fb27SDimitry Andric
124906c3fb27SDimitry Andric// Tag load instructions
125006c3fb27SDimitry Andric// -----------------------------------------------------------------------------
125106c3fb27SDimitry Andric
125206c3fb27SDimitry Andric// Load allocation tag
125306c3fb27SDimitry Andric// Load multiple allocation tags
125406c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1L], (instrs LDG, LDGM)>;
125506c3fb27SDimitry Andric
125606c3fb27SDimitry Andric// Tag store instructions
125706c3fb27SDimitry Andric// -----------------------------------------------------------------------------
125806c3fb27SDimitry Andric
125906c3fb27SDimitry Andric// Store allocation tags to one or two granules, post-index
126006c3fb27SDimitry Andric// Store allocation tags to one or two granules, pre-index
126106c3fb27SDimitry Andric// Store allocation tag to one or two granules, zeroing, post-index
126206c3fb27SDimitry Andric// Store Allocation Tag to one or two granules, zeroing, pre-index
126306c3fb27SDimitry Andric// Store allocation tag and reg pair to memory, post-Index
126406c3fb27SDimitry Andric// Store allocation tag and reg pair to memory, pre-Index
126506c3fb27SDimitry Andricdef : InstRW<[V2Write_1cyc_1L01_1D_1I], (instrs STGPreIndex, STGPostIndex,
126606c3fb27SDimitry Andric                                                ST2GPreIndex, ST2GPostIndex,
126706c3fb27SDimitry Andric                                                STZGPreIndex, STZGPostIndex,
126806c3fb27SDimitry Andric                                                STZ2GPreIndex, STZ2GPostIndex,
126906c3fb27SDimitry Andric                                                STGPpre, STGPpost)>;
127006c3fb27SDimitry Andric
127106c3fb27SDimitry Andric// Store allocation tags to one or two granules, signed offset
127206c3fb27SDimitry Andric// Store allocation tag to two granules, zeroing, signed offset
127306c3fb27SDimitry Andric// Store allocation tag and reg pair to memory, signed offset
127406c3fb27SDimitry Andric// Store multiple allocation tags
127506c3fb27SDimitry Andricdef : InstRW<[V2Write_1cyc_1L01_1D], (instrs STGi, ST2Gi, STZGi,
127606c3fb27SDimitry Andric                                             STZ2Gi, STGPi, STGM, STZGM)>;
127706c3fb27SDimitry Andric
127806c3fb27SDimitry Andric// FP data processing instructions
127906c3fb27SDimitry Andric// -----------------------------------------------------------------------------
128006c3fb27SDimitry Andric
128106c3fb27SDimitry Andric// FP absolute value
128206c3fb27SDimitry Andric// FP arithmetic
128306c3fb27SDimitry Andric// FP min/max
128406c3fb27SDimitry Andric// FP negate
128506c3fb27SDimitry Andric// FP select
128606c3fb27SDimitry Andricdef : SchedAlias<WriteF,     V2Write_2cyc_1V>;
128706c3fb27SDimitry Andric
128806c3fb27SDimitry Andric// FP compare
128906c3fb27SDimitry Andricdef : SchedAlias<WriteFCmp,  V2Write_2cyc_1V0>;
129006c3fb27SDimitry Andric
129106c3fb27SDimitry Andric// FP divide, square root
129206c3fb27SDimitry Andricdef : SchedAlias<WriteFDiv,  V2Write_7cyc_1V02>;
129306c3fb27SDimitry Andric
129406c3fb27SDimitry Andric// FP divide, H-form
129506c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_1V02],  (instrs FDIVHrr)>;
129606c3fb27SDimitry Andric// FP divide, S-form
129706c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_1V02], (instrs FDIVSrr)>;
129806c3fb27SDimitry Andric// FP divide, D-form
129906c3fb27SDimitry Andricdef : InstRW<[V2Write_15cyc_1V02], (instrs FDIVDrr)>;
130006c3fb27SDimitry Andric
130106c3fb27SDimitry Andric// FP square root, H-form
130206c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_1V02],  (instrs FSQRTHr)>;
130306c3fb27SDimitry Andric// FP square root, S-form
130406c3fb27SDimitry Andricdef : InstRW<[V2Write_9cyc_1V02],  (instrs FSQRTSr)>;
130506c3fb27SDimitry Andric// FP square root, D-form
130606c3fb27SDimitry Andricdef : InstRW<[V2Write_16cyc_1V02], (instrs FSQRTDr)>;
130706c3fb27SDimitry Andric
130806c3fb27SDimitry Andric// FP multiply
130906c3fb27SDimitry Andricdef : WriteRes<WriteFMul, [V2UnitV]> { let Latency = 3; }
131006c3fb27SDimitry Andric
131106c3fb27SDimitry Andric// FP multiply accumulate
131206c3fb27SDimitry Andricdef : InstRW<[V2Wr_FMA, ReadDefault, ReadDefault, V2Rd_FMA],
131306c3fb27SDimitry Andric             (instregex "^FN?M(ADD|SUB)[HSD]rrr$")>;
131406c3fb27SDimitry Andric
131506c3fb27SDimitry Andric// FP round to integral
131606c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^FRINT[AIMNPXZ][HSD]r$",
131706c3fb27SDimitry Andric                                             "^FRINT(32|64)[XZ][SD]r$")>;
131806c3fb27SDimitry Andric
131906c3fb27SDimitry Andric// FP miscellaneous instructions
132006c3fb27SDimitry Andric// -----------------------------------------------------------------------------
132106c3fb27SDimitry Andric
132206c3fb27SDimitry Andric// FP convert, from gen to vec reg
132306c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1M0], (instregex "^[SU]CVTF[SU][WX][HSD]ri$")>;
132406c3fb27SDimitry Andric
132506c3fb27SDimitry Andric// FP convert, from vec to gen reg
132606c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V01],
132706c3fb27SDimitry Andric             (instregex "^FCVT[AMNPZ][SU][SU][WX][HSD]ri?$")>;
132806c3fb27SDimitry Andric
132906c3fb27SDimitry Andric// FP convert, Javascript from vec to gen reg
133006c3fb27SDimitry Andricdef : SchedAlias<WriteFCvt, V2Write_3cyc_1V0>;
133106c3fb27SDimitry Andric
133206c3fb27SDimitry Andric// FP convert, from vec to vec reg
133306c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instrs FCVTSHr, FCVTDHr, FCVTHSr, FCVTDSr,
133406c3fb27SDimitry Andric                                          FCVTHDr, FCVTSDr, FCVTXNv1i64)>;
133506c3fb27SDimitry Andric
133606c3fb27SDimitry Andric// FP move, immed
133706c3fb27SDimitry Andric// FP move, register
133806c3fb27SDimitry Andricdef : SchedAlias<WriteFImm, V2Write_2cyc_1V>;
133906c3fb27SDimitry Andric
134006c3fb27SDimitry Andric// FP transfer, from gen to low half of vec reg
13415f757f3fSDimitry Andricdef : InstRW<[V2Write_0or3cyc_1M0],
13425f757f3fSDimitry Andric             (instrs FMOVWHr, FMOVXHr, FMOVWSr, FMOVXDr)>;
134306c3fb27SDimitry Andric
134406c3fb27SDimitry Andric// FP transfer, from gen to high half of vec reg
134506c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_1M0_1V], (instrs FMOVXDHighr)>;
134606c3fb27SDimitry Andric
134706c3fb27SDimitry Andric// FP transfer, from vec to gen reg
134806c3fb27SDimitry Andricdef : SchedAlias<WriteFCopy, V2Write_2cyc_2V01>;
134906c3fb27SDimitry Andric
135006c3fb27SDimitry Andric// FP load instructions
135106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
135206c3fb27SDimitry Andric
135306c3fb27SDimitry Andric// Load vector reg, literal, S/D/Q forms
135406c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_1F_1L], (instregex "^LDR[SDQ]l$")>;
135506c3fb27SDimitry Andric
135606c3fb27SDimitry Andric// Load vector reg, unscaled immed
135706c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instregex "^LDUR[BHSDQ]i$")>;
135806c3fb27SDimitry Andric
135906c3fb27SDimitry Andric// Load vector reg, immed post-index
136006c3fb27SDimitry Andric// Load vector reg, immed pre-index
13615f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_1I_1L],
136206c3fb27SDimitry Andric             (instregex "^LDR[BHSDQ](pre|post)$")>;
136306c3fb27SDimitry Andric
136406c3fb27SDimitry Andric// Load vector reg, unsigned immed
136506c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instregex "^LDR[BHSDQ]ui$")>;
136606c3fb27SDimitry Andric
136706c3fb27SDimitry Andric// Load vector reg, register offset, basic
136806c3fb27SDimitry Andric// Load vector reg, register offset, scale, S/D-form
136906c3fb27SDimitry Andric// Load vector reg, register offset, scale, H/Q-form
137006c3fb27SDimitry Andric// Load vector reg, register offset, extend
137106c3fb27SDimitry Andric// Load vector reg, register offset, extend, scale, S/D-form
137206c3fb27SDimitry Andric// Load vector reg, register offset, extend, scale, H/Q-form
137306c3fb27SDimitry Andricdef : InstRW<[V2Write_LdrHQ, ReadAdrBase], (instregex "^LDR[BHSDQ]ro[WX]$")>;
137406c3fb27SDimitry Andric
137506c3fb27SDimitry Andric// Load vector pair, immed offset, S/D-form
137606c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L, WriteLDHi], (instregex "^LDN?P[SD]i$")>;
137706c3fb27SDimitry Andric
137806c3fb27SDimitry Andric// Load vector pair, immed offset, Q-form
137906c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_2L, WriteLDHi], (instrs LDPQi, LDNPQi)>;
138006c3fb27SDimitry Andric
138106c3fb27SDimitry Andric// Load vector pair, immed post-index, S/D-form
138206c3fb27SDimitry Andric// Load vector pair, immed pre-index, S/D-form
13835f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_1I_1L, WriteLDHi],
138406c3fb27SDimitry Andric             (instregex "^LDP[SD](pre|post)$")>;
138506c3fb27SDimitry Andric
138606c3fb27SDimitry Andric// Load vector pair, immed post-index, Q-form
138706c3fb27SDimitry Andric// Load vector pair, immed pre-index, Q-form
13885f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_2I_2L, WriteLDHi], (instrs LDPQpost,
138906c3fb27SDimitry Andric                                                                LDPQpre)>;
139006c3fb27SDimitry Andric
139106c3fb27SDimitry Andric// FP store instructions
139206c3fb27SDimitry Andric// -----------------------------------------------------------------------------
139306c3fb27SDimitry Andric
139406c3fb27SDimitry Andric// Store vector reg, unscaled immed, B/H/S/D-form
139506c3fb27SDimitry Andric// Store vector reg, unscaled immed, Q-form
139606c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V01], (instregex "^STUR[BHSDQ]i$")>;
139706c3fb27SDimitry Andric
139806c3fb27SDimitry Andric// Store vector reg, immed post-index, B/H/S/D-form
139906c3fb27SDimitry Andric// Store vector reg, immed post-index, Q-form
140006c3fb27SDimitry Andric// Store vector reg, immed pre-index, B/H/S/D-form
140106c3fb27SDimitry Andric// Store vector reg, immed pre-index, Q-form
140206c3fb27SDimitry Andricdef : InstRW<[WriteAdr, V2Write_2cyc_1L01_1V01_1I],
140306c3fb27SDimitry Andric             (instregex "^STR[BHSDQ](pre|post)$")>;
140406c3fb27SDimitry Andric
140506c3fb27SDimitry Andric// Store vector reg, unsigned immed, B/H/S/D-form
140606c3fb27SDimitry Andric// Store vector reg, unsigned immed, Q-form
140706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V01], (instregex "^STR[BHSDQ]ui$")>;
140806c3fb27SDimitry Andric
140906c3fb27SDimitry Andric// Store vector reg, register offset, basic, B/H/S/D-form
141006c3fb27SDimitry Andric// Store vector reg, register offset, basic, Q-form
141106c3fb27SDimitry Andric// Store vector reg, register offset, scale, H-form
141206c3fb27SDimitry Andric// Store vector reg, register offset, scale, S/D-form
141306c3fb27SDimitry Andric// Store vector reg, register offset, scale, Q-form
141406c3fb27SDimitry Andric// Store vector reg, register offset, extend, B/H/S/D-form
141506c3fb27SDimitry Andric// Store vector reg, register offset, extend, Q-form
141606c3fb27SDimitry Andric// Store vector reg, register offset, extend, scale, H-form
141706c3fb27SDimitry Andric// Store vector reg, register offset, extend, scale, S/D-form
141806c3fb27SDimitry Andric// Store vector reg, register offset, extend, scale, Q-form
141906c3fb27SDimitry Andricdef : InstRW<[V2Write_StrHQ, ReadAdrBase],
142006c3fb27SDimitry Andric             (instregex "^STR[BHSDQ]ro[WX]$")>;
142106c3fb27SDimitry Andric
142206c3fb27SDimitry Andric// Store vector pair, immed offset, S-form
142306c3fb27SDimitry Andric// Store vector pair, immed offset, D-form
142406c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V01], (instregex "^STN?P[SD]i$")>;
142506c3fb27SDimitry Andric
142606c3fb27SDimitry Andric// Store vector pair, immed offset, Q-form
142706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_2V01], (instrs STPQi, STNPQi)>;
142806c3fb27SDimitry Andric
142906c3fb27SDimitry Andric// Store vector pair, immed post-index, S-form
143006c3fb27SDimitry Andric// Store vector pair, immed post-index, D-form
143106c3fb27SDimitry Andric// Store vector pair, immed pre-index, S-form
143206c3fb27SDimitry Andric// Store vector pair, immed pre-index, D-form
143306c3fb27SDimitry Andricdef : InstRW<[WriteAdr, V2Write_2cyc_1L01_1V01_1I],
143406c3fb27SDimitry Andric             (instregex "^STP[SD](pre|post)$")>;
143506c3fb27SDimitry Andric
143606c3fb27SDimitry Andric// Store vector pair, immed post-index, Q-form
143706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_2V01_1I], (instrs STPQpost)>;
143806c3fb27SDimitry Andric
143906c3fb27SDimitry Andric// Store vector pair, immed pre-index, Q-form
144006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_2V01_2I], (instrs STPQpre)>;
144106c3fb27SDimitry Andric
144206c3fb27SDimitry Andric// ASIMD integer instructions
144306c3fb27SDimitry Andric// -----------------------------------------------------------------------------
144406c3fb27SDimitry Andric
144506c3fb27SDimitry Andric// ASIMD absolute diff
144606c3fb27SDimitry Andric// ASIMD absolute diff long
144706c3fb27SDimitry Andric// ASIMD arith, basic
144806c3fb27SDimitry Andric// ASIMD arith, complex
144906c3fb27SDimitry Andric// ASIMD arith, pair-wise
145006c3fb27SDimitry Andric// ASIMD compare
145106c3fb27SDimitry Andric// ASIMD logical
145206c3fb27SDimitry Andric// ASIMD max/min, basic and pair-wise
145306c3fb27SDimitry Andricdef : SchedAlias<WriteVd, V2Write_2cyc_1V>;
145406c3fb27SDimitry Andricdef : SchedAlias<WriteVq, V2Write_2cyc_1V>;
145506c3fb27SDimitry Andric
145606c3fb27SDimitry Andric// ASIMD absolute diff accum
145706c3fb27SDimitry Andric// ASIMD absolute diff accum long
145806c3fb27SDimitry Andricdef : InstRW<[V2Wr_VA, V2Rd_VA], (instregex "^[SU]ABAL?v")>;
145906c3fb27SDimitry Andric
146006c3fb27SDimitry Andric// ASIMD arith, reduce, 4H/4S
146106c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V13], (instregex "^(ADDV|[SU]ADDLV)v4(i16|i32)v$")>;
146206c3fb27SDimitry Andric
146306c3fb27SDimitry Andric// ASIMD arith, reduce, 8B/8H
146406c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V13_1V],
146506c3fb27SDimitry Andric             (instregex "^(ADDV|[SU]ADDLV)v8(i8|i16)v$")>;
146606c3fb27SDimitry Andric
146706c3fb27SDimitry Andric// ASIMD arith, reduce, 16B
146806c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V13], (instregex "^(ADDV|[SU]ADDLV)v16i8v$")>;
146906c3fb27SDimitry Andric
147006c3fb27SDimitry Andric// ASIMD dot product
147106c3fb27SDimitry Andric// ASIMD dot product using signed and unsigned integers
147206c3fb27SDimitry Andricdef : InstRW<[V2Wr_VDOT, V2Rd_VDOT],
147306c3fb27SDimitry Andric             (instregex "^([SU]|SU|US)DOT(lane)?(v8|v16)i8$")>;
147406c3fb27SDimitry Andric
147506c3fb27SDimitry Andric// ASIMD matrix multiply-accumulate
147606c3fb27SDimitry Andricdef : InstRW<[V2Wr_VMMA, V2Rd_VMMA], (instrs SMMLA, UMMLA, USMMLA)>;
147706c3fb27SDimitry Andric
147806c3fb27SDimitry Andric// ASIMD max/min, reduce, 4H/4S
147906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V13], (instregex "^[SU](MAX|MIN)Vv4i16v$",
148006c3fb27SDimitry Andric                                             "^[SU](MAX|MIN)Vv4i32v$")>;
148106c3fb27SDimitry Andric
148206c3fb27SDimitry Andric// ASIMD max/min, reduce, 8B/8H
148306c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V13_1V], (instregex "^[SU](MAX|MIN)Vv8i8v$",
148406c3fb27SDimitry Andric                                                "^[SU](MAX|MIN)Vv8i16v$")>;
148506c3fb27SDimitry Andric
148606c3fb27SDimitry Andric// ASIMD max/min, reduce, 16B
148706c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V13], (instregex "[SU](MAX|MIN)Vv16i8v$")>;
148806c3fb27SDimitry Andric
148906c3fb27SDimitry Andric// ASIMD multiply
149006c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V02], (instregex "^MULv", "^SQ(R)?DMULHv")>;
149106c3fb27SDimitry Andric
149206c3fb27SDimitry Andric// ASIMD multiply accumulate
149306c3fb27SDimitry Andricdef : InstRW<[V2Wr_VMA, V2Rd_VMA], (instregex "^MLAv", "^MLSv")>;
149406c3fb27SDimitry Andric
149506c3fb27SDimitry Andric// ASIMD multiply accumulate high
149606c3fb27SDimitry Andricdef : InstRW<[V2Wr_VMAH, V2Rd_VMAH], (instregex "^SQRDMLAHv", "^SQRDMLSHv")>;
149706c3fb27SDimitry Andric
149806c3fb27SDimitry Andric// ASIMD multiply accumulate long
149906c3fb27SDimitry Andricdef : InstRW<[V2Wr_VMAL, V2Rd_VMAL], (instregex "^[SU]MLALv", "^[SU]MLSLv")>;
150006c3fb27SDimitry Andric
150106c3fb27SDimitry Andric// ASIMD multiply accumulate saturating long
150206c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V02], (instregex "^SQDML[AS]L[iv]")>;
150306c3fb27SDimitry Andric
150406c3fb27SDimitry Andric// ASIMD multiply/multiply long (8x8) polynomial, D-form
150506c3fb27SDimitry Andric// ASIMD multiply/multiply long (8x8) polynomial, Q-form
150606c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V23], (instregex "^PMULL?(v8i8|v16i8)$")>;
150706c3fb27SDimitry Andric
150806c3fb27SDimitry Andric// ASIMD multiply long
150906c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^[SU]MULLv", "^SQDMULL[iv]")>;
151006c3fb27SDimitry Andric
151106c3fb27SDimitry Andric// ASIMD pairwise add and accumulate long
151206c3fb27SDimitry Andricdef : InstRW<[V2Wr_VPA, V2Rd_VPA], (instregex "^[SU]ADALPv")>;
151306c3fb27SDimitry Andric
151406c3fb27SDimitry Andric// ASIMD shift accumulate
151506c3fb27SDimitry Andricdef : InstRW<[V2Wr_VSA, V2Rd_VSA], (instregex "^[SU]SRA[dv]", "^[SU]RSRA[dv]")>;
151606c3fb27SDimitry Andric
151706c3fb27SDimitry Andric// ASIMD shift by immed, basic
151806c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V13], (instregex "^SHL[dv]", "^SHLLv", "^SHRNv",
151906c3fb27SDimitry Andric                                             "^SSHLLv", "^SSHR[dv]", "^USHLLv",
152006c3fb27SDimitry Andric                                             "^USHR[dv]")>;
152106c3fb27SDimitry Andric
152206c3fb27SDimitry Andric// ASIMD shift by immed and insert, basic
152306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V13], (instregex "^SLI[dv]", "^SRI[dv]")>;
152406c3fb27SDimitry Andric
152506c3fb27SDimitry Andric// ASIMD shift by immed, complex
152606c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V13],
152706c3fb27SDimitry Andric             (instregex "^RSHRNv", "^SQRSHRU?N[bhsv]", "^(SQSHLU?|UQSHL)[bhsd]$",
152806c3fb27SDimitry Andric                        "^(SQSHLU?|UQSHL)(v8i8|v16i8|v4i16|v8i16|v2i32|v4i32|v2i64)_shift$",
152906c3fb27SDimitry Andric                        "^SQSHRU?N[bhsv]", "^SRSHR[dv]", "^UQRSHRN[bhsv]",
153006c3fb27SDimitry Andric                        "^UQSHRN[bhsv]", "^URSHR[dv]")>;
153106c3fb27SDimitry Andric
153206c3fb27SDimitry Andric// ASIMD shift by register, basic
153306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V13], (instregex "^[SU]SHLv")>;
153406c3fb27SDimitry Andric
153506c3fb27SDimitry Andric// ASIMD shift by register, complex
153606c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V13],
153706c3fb27SDimitry Andric             (instregex "^[SU]RSHLv", "^[SU]QRSHLv",
153806c3fb27SDimitry Andric                        "^[SU]QSHL(v1i8|v1i16|v1i32|v1i64|v8i8|v16i8|v4i16|v8i16|v2i32|v4i32|v2i64)$")>;
153906c3fb27SDimitry Andric
154006c3fb27SDimitry Andric// ASIMD floating-point instructions
154106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
154206c3fb27SDimitry Andric
154306c3fb27SDimitry Andric// ASIMD FP absolute value/difference
154406c3fb27SDimitry Andric// ASIMD FP arith, normal
154506c3fb27SDimitry Andric// ASIMD FP compare
154606c3fb27SDimitry Andric// ASIMD FP complex add
154706c3fb27SDimitry Andric// ASIMD FP max/min, normal
154806c3fb27SDimitry Andric// ASIMD FP max/min, pairwise
154906c3fb27SDimitry Andric// ASIMD FP negate
155006c3fb27SDimitry Andric// Handled by SchedAlias<WriteV[dq], ...>
155106c3fb27SDimitry Andric
155206c3fb27SDimitry Andric// ASIMD FP complex multiply add
155306c3fb27SDimitry Andricdef : InstRW<[V2Wr_VFCMA, V2Rd_VFCMA], (instregex "^FCMLAv")>;
155406c3fb27SDimitry Andric
155506c3fb27SDimitry Andric// ASIMD FP convert, long (F16 to F32)
155606c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instregex "^FCVTL(v4|v8)i16")>;
155706c3fb27SDimitry Andric
155806c3fb27SDimitry Andric// ASIMD FP convert, long (F32 to F64)
155906c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^FCVTL(v2|v4)i32")>;
156006c3fb27SDimitry Andric
156106c3fb27SDimitry Andric// ASIMD FP convert, narrow (F32 to F16)
156206c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instregex "^FCVTN(v4|v8)i16")>;
156306c3fb27SDimitry Andric
156406c3fb27SDimitry Andric// ASIMD FP convert, narrow (F64 to F32)
156506c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^FCVTN(v2|v4)i32",
156606c3fb27SDimitry Andric                                             "^FCVTXN(v2|v4)f32")>;
156706c3fb27SDimitry Andric
156806c3fb27SDimitry Andric// ASIMD FP convert, other, D-form F32 and Q-form F64
156906c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^FCVT[AMNPZ][SU]v2f(32|64)$",
157006c3fb27SDimitry Andric                                             "^FCVT[AMNPZ][SU]v1i64$",
157106c3fb27SDimitry Andric                                             "^FCVTZ[SU]d$",
157206c3fb27SDimitry Andric                                             "^[SU]CVTFv2f(32|64)$",
157306c3fb27SDimitry Andric                                             "^[SU]CVTFv1i64$",
157406c3fb27SDimitry Andric                                             "^[SU]CVTFd$")>;
157506c3fb27SDimitry Andric
157606c3fb27SDimitry Andric// ASIMD FP convert, other, D-form F16 and Q-form F32
157706c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instregex "^FCVT[AMNPZ][SU]v4f(16|32)$",
157806c3fb27SDimitry Andric                                             "^FCVT[AMNPZ][SU]v1i32$",
157906c3fb27SDimitry Andric                                             "^FCVTZ[SU]s$",
158006c3fb27SDimitry Andric                                             "^[SU]CVTFv4f(16|32)$",
158106c3fb27SDimitry Andric                                             "^[SU]CVTFv1i32$",
158206c3fb27SDimitry Andric                                             "^[SU]CVTFs$")>;
158306c3fb27SDimitry Andric
158406c3fb27SDimitry Andric// ASIMD FP convert, other, Q-form F16
158506c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_4V02], (instregex "^FCVT[AMNPZ][SU]v8f16$",
158606c3fb27SDimitry Andric                                             "^FCVT[AMNPZ][SU]v1f16$",
158706c3fb27SDimitry Andric                                             "^FCVTZ[SU]h$",
158806c3fb27SDimitry Andric                                             "^[SU]CVTFv8f16$",
158906c3fb27SDimitry Andric                                             "^[SU]CVTFv1i16$",
159006c3fb27SDimitry Andric                                             "^[SU]CVTFh$")>;
159106c3fb27SDimitry Andric
159206c3fb27SDimitry Andric// ASIMD FP divide, D-form, F16
159306c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_1V02_7rc], (instrs FDIVv4f16)>;
159406c3fb27SDimitry Andric
159506c3fb27SDimitry Andric// ASIMD FP divide, D-form, F32
159606c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_1V02_5rc], (instrs FDIVv2f32)>;
159706c3fb27SDimitry Andric
159806c3fb27SDimitry Andric// ASIMD FP divide, Q-form, F16
159906c3fb27SDimitry Andricdef : InstRW<[V2Write_13cyc_1V02_13rc], (instrs FDIVv8f16)>;
160006c3fb27SDimitry Andric
160106c3fb27SDimitry Andric// ASIMD FP divide, Q-form, F32
160206c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_1V02_10rc], (instrs FDIVv4f32)>;
160306c3fb27SDimitry Andric
160406c3fb27SDimitry Andric// ASIMD FP divide, Q-form, F64
160506c3fb27SDimitry Andricdef : InstRW<[V2Write_15cyc_1V02_14rc], (instrs FDIVv2f64)>;
160606c3fb27SDimitry Andric
160706c3fb27SDimitry Andric// ASIMD FP max/min, reduce, F32 and D-form F16
160806c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V], (instregex "^(FMAX|FMIN)(NM)?Vv4(i16|i32)v$")>;
160906c3fb27SDimitry Andric
161006c3fb27SDimitry Andric// ASIMD FP max/min, reduce, Q-form F16
161106c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_3V], (instregex "^(FMAX|FMIN)(NM)?Vv8i16v$")>;
161206c3fb27SDimitry Andric
161306c3fb27SDimitry Andric// ASIMD FP multiply
161406c3fb27SDimitry Andricdef : InstRW<[V2Wr_VFM], (instregex "^FMULv", "^FMULXv")>;
161506c3fb27SDimitry Andric
161606c3fb27SDimitry Andric// ASIMD FP multiply accumulate
161706c3fb27SDimitry Andricdef : InstRW<[V2Wr_VFMA, V2Rd_VFMA], (instregex "^FMLAv", "^FMLSv")>;
161806c3fb27SDimitry Andric
161906c3fb27SDimitry Andric// ASIMD FP multiply accumulate long
162006c3fb27SDimitry Andricdef : InstRW<[V2Wr_VFMAL, V2Rd_VFMAL], (instregex "^FML[AS]L2?(lane)?v")>;
162106c3fb27SDimitry Andric
162206c3fb27SDimitry Andric// ASIMD FP round, D-form F32 and Q-form F64
162306c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02],
162406c3fb27SDimitry Andric             (instregex "^FRINT[AIMNPXZ]v2f(32|64)$",
162506c3fb27SDimitry Andric                        "^FRINT(32|64)[XZ]v2f(32|64)$")>;
162606c3fb27SDimitry Andric
162706c3fb27SDimitry Andric// ASIMD FP round, D-form F16 and Q-form F32
162806c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02],
162906c3fb27SDimitry Andric             (instregex "^FRINT[AIMNPXZ]v4f(16|32)$",
163006c3fb27SDimitry Andric                        "^FRINT(32|64)[XZ]v4f32$")>;
163106c3fb27SDimitry Andric
163206c3fb27SDimitry Andric// ASIMD FP round, Q-form F16
163306c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_4V02], (instregex "^FRINT[AIMNPXZ]v8f16$")>;
163406c3fb27SDimitry Andric
163506c3fb27SDimitry Andric// ASIMD FP square root, D-form, F16
163606c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_1V02_7rc], (instrs FSQRTv4f16)>;
163706c3fb27SDimitry Andric
163806c3fb27SDimitry Andric// ASIMD FP square root, D-form, F32
163906c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_1V02_5rc], (instrs FSQRTv2f32)>;
164006c3fb27SDimitry Andric
164106c3fb27SDimitry Andric// ASIMD FP square root, Q-form, F16
164206c3fb27SDimitry Andricdef : InstRW<[V2Write_13cyc_1V02_13rc], (instrs FSQRTv8f16)>;
164306c3fb27SDimitry Andric
164406c3fb27SDimitry Andric// ASIMD FP square root, Q-form, F32
164506c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_1V02_9rc], (instrs FSQRTv4f32)>;
164606c3fb27SDimitry Andric
164706c3fb27SDimitry Andric// ASIMD FP square root, Q-form, F64
164806c3fb27SDimitry Andricdef : InstRW<[V2Write_16cyc_1V02_15rc], (instrs FSQRTv2f64)>;
164906c3fb27SDimitry Andric
165006c3fb27SDimitry Andric// ASIMD BFloat16 (BF16) instructions
165106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
165206c3fb27SDimitry Andric
165306c3fb27SDimitry Andric// ASIMD convert, F32 to BF16
165406c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instrs BFCVTN, BFCVTN2)>;
165506c3fb27SDimitry Andric
165606c3fb27SDimitry Andric// ASIMD dot product
165706c3fb27SDimitry Andricdef : InstRW<[V2Wr_VBFDOT, V2Rd_VBFDOT], (instrs BFDOTv4bf16, BFDOTv8bf16)>;
165806c3fb27SDimitry Andric
165906c3fb27SDimitry Andric// ASIMD matrix multiply accumulate
166006c3fb27SDimitry Andricdef : InstRW<[V2Wr_VBFMMA, V2Rd_VBFMMA], (instrs BFMMLA)>;
166106c3fb27SDimitry Andric
166206c3fb27SDimitry Andric// ASIMD multiply accumulate long
166306c3fb27SDimitry Andricdef : InstRW<[V2Wr_VBFMAL, V2Rd_VBFMAL], (instrs BFMLALB, BFMLALBIdx, BFMLALT,
166406c3fb27SDimitry Andric                                                 BFMLALTIdx)>;
166506c3fb27SDimitry Andric
166606c3fb27SDimitry Andric// Scalar convert, F32 to BF16
166706c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instrs BFCVT)>;
166806c3fb27SDimitry Andric
166906c3fb27SDimitry Andric// ASIMD miscellaneous instructions
167006c3fb27SDimitry Andric// -----------------------------------------------------------------------------
167106c3fb27SDimitry Andric
167206c3fb27SDimitry Andric// ASIMD bit reverse
167306c3fb27SDimitry Andric// ASIMD bitwise insert
167406c3fb27SDimitry Andric// ASIMD count
167506c3fb27SDimitry Andric// ASIMD duplicate, element
167606c3fb27SDimitry Andric// ASIMD extract
167706c3fb27SDimitry Andric// ASIMD extract narrow
167806c3fb27SDimitry Andric// ASIMD insert, element to element
167906c3fb27SDimitry Andric// ASIMD move, FP immed
168006c3fb27SDimitry Andric// ASIMD move, integer immed
168106c3fb27SDimitry Andric// ASIMD reverse
168206c3fb27SDimitry Andric// ASIMD table lookup extension, 1 table reg
168306c3fb27SDimitry Andric// ASIMD transpose
168406c3fb27SDimitry Andric// ASIMD unzip/zip
168506c3fb27SDimitry Andric// Handled by SchedAlias<WriteV[dq], ...>
16865f757f3fSDimitry Andricdef : InstRW<[V2Write_0or2cyc_1V], (instrs MOVID, MOVIv2d_ns)>;
168706c3fb27SDimitry Andric
168806c3fb27SDimitry Andric// ASIMD duplicate, gen reg
168906c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1M0], (instregex "^DUPv.+gpr")>;
169006c3fb27SDimitry Andric
169106c3fb27SDimitry Andric// ASIMD extract narrow, saturating
169206c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V13], (instregex "^[SU]QXTNv", "^SQXTUNv")>;
169306c3fb27SDimitry Andric
169406c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, D-form U32
169506c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instrs URECPEv2i32, URSQRTEv2i32)>;
169606c3fb27SDimitry Andric
169706c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, Q-form U32
169806c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instrs URECPEv4i32, URSQRTEv4i32)>;
169906c3fb27SDimitry Andric
170006c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, D-form F32 and scalar forms
170106c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instrs FRECPEv1f16, FRECPEv1i32,
170206c3fb27SDimitry Andric                                          FRECPEv1i64, FRECPEv2f32,
170306c3fb27SDimitry Andric                                          FRSQRTEv1f16, FRSQRTEv1i32,
170406c3fb27SDimitry Andric                                          FRSQRTEv1i64, FRSQRTEv2f32)>;
170506c3fb27SDimitry Andric
170606c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, D-form F16 and Q-form F32
170706c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instrs FRECPEv4f16, FRECPEv4f32,
170806c3fb27SDimitry Andric                                          FRSQRTEv4f16, FRSQRTEv4f32)>;
170906c3fb27SDimitry Andric
171006c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, Q-form F16
171106c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_4V02], (instrs FRECPEv8f16, FRSQRTEv8f16)>;
171206c3fb27SDimitry Andric
171306c3fb27SDimitry Andric// ASIMD reciprocal exponent
171406c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^FRECPXv")>;
171506c3fb27SDimitry Andric
171606c3fb27SDimitry Andric// ASIMD reciprocal step
171706c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V], (instregex "^FRECPS(32|64|v)",
171806c3fb27SDimitry Andric                                           "^FRSQRTS(32|64|v)")>;
171906c3fb27SDimitry Andric
172006c3fb27SDimitry Andric// ASIMD table lookup, 1 or 2 table regs
172106c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V01], (instrs TBLv8i8One, TBLv16i8One,
172206c3fb27SDimitry Andric                                          TBLv8i8Two, TBLv16i8Two)>;
172306c3fb27SDimitry Andric
172406c3fb27SDimitry Andric// ASIMD table lookup, 3 table regs
172506c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V01], (instrs TBLv8i8Three, TBLv16i8Three)>;
172606c3fb27SDimitry Andric
172706c3fb27SDimitry Andric// ASIMD table lookup, 4 table regs
172806c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_3V01], (instrs TBLv8i8Four, TBLv16i8Four)>;
172906c3fb27SDimitry Andric
173006c3fb27SDimitry Andric// ASIMD table lookup extension, 2 table reg
173106c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V], (instrs TBXv8i8Two, TBXv16i8Two)>;
173206c3fb27SDimitry Andric
173306c3fb27SDimitry Andric// ASIMD table lookup extension, 3 table reg
173406c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_3V], (instrs TBXv8i8Three, TBXv16i8Three)>;
173506c3fb27SDimitry Andric
173606c3fb27SDimitry Andric// ASIMD table lookup extension, 4 table reg
173706c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_5V], (instrs TBXv8i8Four, TBXv16i8Four)>;
173806c3fb27SDimitry Andric
173906c3fb27SDimitry Andric// ASIMD transfer, element to gen reg
174006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_2V01], (instregex "^[SU]MOVv")>;
174106c3fb27SDimitry Andric
174206c3fb27SDimitry Andric// ASIMD transfer, gen reg to element
174306c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_1M0_1V], (instregex "^INSvi(8|16|32|64)gpr$")>;
174406c3fb27SDimitry Andric
174506c3fb27SDimitry Andric// ASIMD load instructions
174606c3fb27SDimitry Andric// -----------------------------------------------------------------------------
174706c3fb27SDimitry Andric
174806c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, D-form
174906c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instregex "^LD1Onev(8b|4h|2s|1d)$")>;
17505f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_1L],
175106c3fb27SDimitry Andric             (instregex "^LD1Onev(8b|4h|2s|1d)_POST$")>;
175206c3fb27SDimitry Andric
175306c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, Q-form
175406c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instregex "^LD1Onev(16b|8h|4s|2d)$")>;
17555f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_1L],
175606c3fb27SDimitry Andric             (instregex "^LD1Onev(16b|8h|4s|2d)_POST$")>;
175706c3fb27SDimitry Andric
175806c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, D-form
175906c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_2L], (instregex "^LD1Twov(8b|4h|2s|1d)$")>;
17605f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_2L],
176106c3fb27SDimitry Andric             (instregex "^LD1Twov(8b|4h|2s|1d)_POST$")>;
176206c3fb27SDimitry Andric
176306c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, Q-form
176406c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_2L], (instregex "^LD1Twov(16b|8h|4s|2d)$")>;
17655f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_2L],
176606c3fb27SDimitry Andric             (instregex "^LD1Twov(16b|8h|4s|2d)_POST$")>;
176706c3fb27SDimitry Andric
176806c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, D-form
176906c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_3L], (instregex "^LD1Threev(8b|4h|2s|1d)$")>;
17705f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_3L],
177106c3fb27SDimitry Andric             (instregex "^LD1Threev(8b|4h|2s|1d)_POST$")>;
177206c3fb27SDimitry Andric
177306c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, Q-form
177406c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_3L], (instregex "^LD1Threev(16b|8h|4s|2d)$")>;
17755f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_3L],
177606c3fb27SDimitry Andric             (instregex "^LD1Threev(16b|8h|4s|2d)_POST$")>;
177706c3fb27SDimitry Andric
177806c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, D-form
177906c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_4L], (instregex "^LD1Fourv(8b|4h|2s|1d)$")>;
17805f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_7cyc_4L],
178106c3fb27SDimitry Andric             (instregex "^LD1Fourv(8b|4h|2s|1d)_POST$")>;
178206c3fb27SDimitry Andric
178306c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, Q-form
178406c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_4L], (instregex "^LD1Fourv(16b|8h|4s|2d)$")>;
17855f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_7cyc_4L],
178606c3fb27SDimitry Andric             (instregex "^LD1Fourv(16b|8h|4s|2d)_POST$")>;
178706c3fb27SDimitry Andric
178806c3fb27SDimitry Andric// ASIMD load, 1 element, one lane, B/H/S
178906c3fb27SDimitry Andric// ASIMD load, 1 element, one lane, D
179006c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_1L_1V],           (instregex "LD1i(8|16|32|64)$")>;
17915f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_1L_1V], (instregex "LD1i(8|16|32|64)_POST$")>;
179206c3fb27SDimitry Andric
179306c3fb27SDimitry Andric// ASIMD load, 1 element, all lanes, D-form, B/H/S
179406c3fb27SDimitry Andric// ASIMD load, 1 element, all lanes, D-form, D
179506c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_1L_1V],           (instregex "LD1Rv(8b|4h|2s|1d)$")>;
17965f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_1L_1V], (instregex "LD1Rv(8b|4h|2s|1d)_POST$")>;
179706c3fb27SDimitry Andric
179806c3fb27SDimitry Andric// ASIMD load, 1 element, all lanes, Q-form
179906c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_1L_1V],           (instregex "LD1Rv(16b|8h|4s|2d)$")>;
18005f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_1L_1V], (instregex "LD1Rv(16b|8h|4s|2d)_POST$")>;
180106c3fb27SDimitry Andric
180206c3fb27SDimitry Andric// ASIMD load, 2 element, multiple, D-form, B/H/S
180306c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_1L_2V],           (instregex "LD2Twov(8b|4h|2s)$")>;
18045f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_1L_2V], (instregex "LD2Twov(8b|4h|2s)_POST$")>;
180506c3fb27SDimitry Andric
180606c3fb27SDimitry Andric// ASIMD load, 2 element, multiple, Q-form, B/H/S
180706c3fb27SDimitry Andric// ASIMD load, 2 element, multiple, Q-form, D
180806c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_2L_2V],           (instregex "LD2Twov(16b|8h|4s|2d)$")>;
18095f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_2L_2V], (instregex "LD2Twov(16b|8h|4s|2d)_POST$")>;
181006c3fb27SDimitry Andric
181106c3fb27SDimitry Andric// ASIMD load, 2 element, one lane, B/H
181206c3fb27SDimitry Andric// ASIMD load, 2 element, one lane, S
181306c3fb27SDimitry Andric// ASIMD load, 2 element, one lane, D
181406c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_1L_2V],           (instregex "LD2i(8|16|32|64)$")>;
18155f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_1L_2V], (instregex "LD2i(8|16|32|64)_POST$")>;
181606c3fb27SDimitry Andric
181706c3fb27SDimitry Andric// ASIMD load, 2 element, all lanes, D-form, B/H/S
181806c3fb27SDimitry Andric// ASIMD load, 2 element, all lanes, D-form, D
181906c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_1L_2V],            (instregex "LD2Rv(8b|4h|2s|1d)$")>;
18205f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_1L_2V],  (instregex "LD2Rv(8b|4h|2s|1d)_POST$")>;
182106c3fb27SDimitry Andric
182206c3fb27SDimitry Andric// ASIMD load, 2 element, all lanes, Q-form
182306c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_1L_2V],           (instregex "LD2Rv(16b|8h|4s|2d)$")>;
18245f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_1L_2V], (instregex "LD2Rv(16b|8h|4s|2d)_POST$")>;
182506c3fb27SDimitry Andric
182606c3fb27SDimitry Andric// ASIMD load, 3 element, multiple, D-form, B/H/S
182706c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_2L_3V],           (instregex "LD3Threev(8b|4h|2s)$")>;
18285f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_2L_3V], (instregex "LD3Threev(8b|4h|2s)_POST$")>;
182906c3fb27SDimitry Andric
183006c3fb27SDimitry Andric// ASIMD load, 3 element, multiple, Q-form, B/H/S
183106c3fb27SDimitry Andric// ASIMD load, 3 element, multiple, Q-form, D
183206c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_3L_3V],           (instregex "LD3Threev(16b|8h|4s|2d)$")>;
18335f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_3L_3V], (instregex "LD3Threev(16b|8h|4s|2d)_POST$")>;
183406c3fb27SDimitry Andric
183506c3fb27SDimitry Andric// ASIMD load, 3 element, one lane, B/H
183606c3fb27SDimitry Andric// ASIMD load, 3 element, one lane, S
183706c3fb27SDimitry Andric// ASIMD load, 3 element, one lane, D
183806c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_2L_3V],           (instregex "LD3i(8|16|32|64)$")>;
18395f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_2L_3V], (instregex "LD3i(8|16|32|64)_POST$")>;
184006c3fb27SDimitry Andric
184106c3fb27SDimitry Andric// ASIMD load, 3 element, all lanes, D-form, B/H/S
184206c3fb27SDimitry Andric// ASIMD load, 3 element, all lanes, D-form, D
184306c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_2L_3V],           (instregex "LD3Rv(8b|4h|2s|1d)$")>;
18445f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_2L_3V], (instregex "LD3Rv(8b|4h|2s|1d)_POST$")>;
184506c3fb27SDimitry Andric
184606c3fb27SDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, B/H/S
184706c3fb27SDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, D
184806c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_3L_3V],           (instregex "LD3Rv(16b|8h|4s|2d)$")>;
18495f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_3L_3V], (instregex "LD3Rv(16b|8h|4s|2d)_POST$")>;
185006c3fb27SDimitry Andric
185106c3fb27SDimitry Andric// ASIMD load, 4 element, multiple, D-form, B/H/S
185206c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_3L_4V],           (instregex "LD4Fourv(8b|4h|2s)$")>;
18535f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_3L_4V], (instregex "LD4Fourv(8b|4h|2s)_POST$")>;
185406c3fb27SDimitry Andric
185506c3fb27SDimitry Andric// ASIMD load, 4 element, multiple, Q-form, B/H/S
185606c3fb27SDimitry Andric// ASIMD load, 4 element, multiple, Q-form, D
185706c3fb27SDimitry Andricdef : InstRW<[V2Write_9cyc_6L_4V],           (instregex "LD4Fourv(16b|8h|4s|2d)$")>;
18585f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_9cyc_6L_4V], (instregex "LD4Fourv(16b|8h|4s|2d)_POST$")>;
185906c3fb27SDimitry Andric
186006c3fb27SDimitry Andric// ASIMD load, 4 element, one lane, B/H
186106c3fb27SDimitry Andric// ASIMD load, 4 element, one lane, S
186206c3fb27SDimitry Andric// ASIMD load, 4 element, one lane, D
186306c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_3L_4V],           (instregex "LD4i(8|16|32|64)$")>;
18645f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_3L_4V], (instregex "LD4i(8|16|32|64)_POST$")>;
186506c3fb27SDimitry Andric
186606c3fb27SDimitry Andric// ASIMD load, 4 element, all lanes, D-form, B/H/S
186706c3fb27SDimitry Andric// ASIMD load, 4 element, all lanes, D-form, D
186806c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_3L_4V],           (instregex "LD4Rv(8b|4h|2s|1d)$")>;
18695f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_3L_4V], (instregex "LD4Rv(8b|4h|2s|1d)_POST$")>;
187006c3fb27SDimitry Andric
187106c3fb27SDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, B/H/S
187206c3fb27SDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, D
187306c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_4L_4V],           (instregex "LD4Rv(16b|8h|4s|2d)$")>;
18745f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_8cyc_4L_4V], (instregex "LD4Rv(16b|8h|4s|2d)_POST$")>;
187506c3fb27SDimitry Andric
187606c3fb27SDimitry Andric// ASIMD store instructions
187706c3fb27SDimitry Andric// -----------------------------------------------------------------------------
187806c3fb27SDimitry Andric
187906c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, D-form
188006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V01],           (instregex "ST1Onev(8b|4h|2s|1d)$")>;
18815f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_2cyc_1L01_1V01], (instregex "ST1Onev(8b|4h|2s|1d)_POST$")>;
188206c3fb27SDimitry Andric
188306c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, Q-form
188406c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V01],           (instregex "ST1Onev(16b|8h|4s|2d)$")>;
18855f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_2cyc_1L01_1V01], (instregex "ST1Onev(16b|8h|4s|2d)_POST$")>;
188606c3fb27SDimitry Andric
188706c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, D-form
188806c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V01],           (instregex "ST1Twov(8b|4h|2s|1d)$")>;
18895f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_2cyc_1L01_1V01], (instregex "ST1Twov(8b|4h|2s|1d)_POST$")>;
189006c3fb27SDimitry Andric
189106c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, Q-form
189206c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_2L01_2V01],           (instregex "ST1Twov(16b|8h|4s|2d)$")>;
18935f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_2cyc_2L01_2V01], (instregex "ST1Twov(16b|8h|4s|2d)_POST$")>;
189406c3fb27SDimitry Andric
189506c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, D-form
189606c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_2L01_2V01],           (instregex "ST1Threev(8b|4h|2s|1d)$")>;
18975f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_2cyc_2L01_2V01], (instregex "ST1Threev(8b|4h|2s|1d)_POST$")>;
189806c3fb27SDimitry Andric
189906c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, Q-form
190006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_3L01_3V01],           (instregex "ST1Threev(16b|8h|4s|2d)$")>;
19015f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_2cyc_3L01_3V01], (instregex "ST1Threev(16b|8h|4s|2d)_POST$")>;
190206c3fb27SDimitry Andric
190306c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, D-form
190406c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_2L01_2V01],           (instregex "ST1Fourv(8b|4h|2s|1d)$")>;
19055f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_2cyc_2L01_2V01], (instregex "ST1Fourv(8b|4h|2s|1d)_POST$")>;
190606c3fb27SDimitry Andric
190706c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, Q-form
190806c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_4L01_4V01],           (instregex "ST1Fourv(16b|8h|4s|2d)$")>;
19095f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_2cyc_4L01_4V01], (instregex "ST1Fourv(16b|8h|4s|2d)_POST$")>;
191006c3fb27SDimitry Andric
191106c3fb27SDimitry Andric// ASIMD store, 1 element, one lane, B/H/S
191206c3fb27SDimitry Andric// ASIMD store, 1 element, one lane, D
191306c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1L01_2V01],           (instregex "ST1i(8|16|32|64)$")>;
19145f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_4cyc_1L01_2V01], (instregex "ST1i(8|16|32|64)_POST$")>;
191506c3fb27SDimitry Andric
191606c3fb27SDimitry Andric// ASIMD store, 2 element, multiple, D-form, B/H/S
191706c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1L01_2V01],           (instregex "ST2Twov(8b|4h|2s)$")>;
19185f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_4cyc_1L01_2V01], (instregex "ST2Twov(8b|4h|2s)_POST$")>;
191906c3fb27SDimitry Andric
192006c3fb27SDimitry Andric// ASIMD store, 2 element, multiple, Q-form, B/H/S
192106c3fb27SDimitry Andric// ASIMD store, 2 element, multiple, Q-form, D
192206c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2L01_4V01],           (instregex "ST2Twov(16b|8h|4s|2d)$")>;
19235f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_4cyc_2L01_4V01], (instregex "ST2Twov(16b|8h|4s|2d)_POST$")>;
192406c3fb27SDimitry Andric
192506c3fb27SDimitry Andric// ASIMD store, 2 element, one lane, B/H/S
192606c3fb27SDimitry Andric// ASIMD store, 2 element, one lane, D
192706c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1L01_2V01],           (instregex "ST2i(8|16|32|64)$")>;
19285f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_4cyc_1L01_2V01], (instregex "ST2i(8|16|32|64)_POST$")>;
192906c3fb27SDimitry Andric
193006c3fb27SDimitry Andric// ASIMD store, 3 element, multiple, D-form, B/H/S
193106c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_2L01_4V01],           (instregex "ST3Threev(8b|4h|2s)$")>;
19325f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_5cyc_2L01_4V01], (instregex "ST3Threev(8b|4h|2s)_POST$")>;
193306c3fb27SDimitry Andric
193406c3fb27SDimitry Andric// ASIMD store, 3 element, multiple, Q-form, B/H/S
193506c3fb27SDimitry Andric// ASIMD store, 3 element, multiple, Q-form, D
193606c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_3L01_6V01],           (instregex "ST3Threev(16b|8h|4s|2d)$")>;
19375f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_3L01_6V01], (instregex "ST3Threev(16b|8h|4s|2d)_POST$")>;
193806c3fb27SDimitry Andric
193906c3fb27SDimitry Andric// ASIMD store, 3 element, one lane, B/H
194006c3fb27SDimitry Andric// ASIMD store, 3 element, one lane, S
194106c3fb27SDimitry Andric// ASIMD store, 3 element, one lane, D
194206c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_2L01_4V01],           (instregex "ST3i(8|16|32|64)$")>;
19435f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_5cyc_2L01_4V01], (instregex "ST3i(8|16|32|64)_POST$")>;
194406c3fb27SDimitry Andric
194506c3fb27SDimitry Andric// ASIMD store, 4 element, multiple, D-form, B/H/S
194606c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_2L01_6V01],           (instregex "ST4Fourv(8b|4h|2s)$")>;
19475f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_2L01_6V01], (instregex "ST4Fourv(8b|4h|2s)_POST$")>;
194806c3fb27SDimitry Andric
194906c3fb27SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, B/H/S
195006c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_4L01_12V01],           (instregex "ST4Fourv(16b|8h|4s)$")>;
19515f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_7cyc_4L01_12V01], (instregex "ST4Fourv(16b|8h|4s)_POST$")>;
195206c3fb27SDimitry Andric
195306c3fb27SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, D
195406c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_4L01_8V01],           (instregex "ST4Fourv(2d)$")>;
19555f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_5cyc_4L01_8V01], (instregex "ST4Fourv(2d)_POST$")>;
195606c3fb27SDimitry Andric
195706c3fb27SDimitry Andric// ASIMD store, 4 element, one lane, B/H/S
195806c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L01_3V01],           (instregex "ST4i(8|16|32)$")>;
19595f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_6cyc_1L01_3V01], (instregex "ST4i(8|16|32)_POST$")>;
196006c3fb27SDimitry Andric
196106c3fb27SDimitry Andric// ASIMD store, 4 element, one lane, D
196206c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2L01_4V01],            (instregex "ST4i(64)$")>;
19635f757f3fSDimitry Andricdef : InstRW<[WriteAdr, V2Write_4cyc_2L01_4V01],  (instregex "ST4i(64)_POST$")>;
196406c3fb27SDimitry Andric
196506c3fb27SDimitry Andric// Cryptography extensions
196606c3fb27SDimitry Andric// -----------------------------------------------------------------------------
196706c3fb27SDimitry Andric
196806c3fb27SDimitry Andric// Crypto AES ops
196906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^AES[DE]rr$", "^AESI?MCrr")>;
197006c3fb27SDimitry Andric
197106c3fb27SDimitry Andric// Crypto polynomial (64x64) multiply long
197206c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instrs PMULLv1i64, PMULLv2i64)>;
197306c3fb27SDimitry Andric
197406c3fb27SDimitry Andric// Crypto SHA1 hash acceleration op
197506c3fb27SDimitry Andric// Crypto SHA1 schedule acceleration ops
197606c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V0], (instregex "^SHA1(H|SU0|SU1)")>;
197706c3fb27SDimitry Andric
197806c3fb27SDimitry Andric// Crypto SHA1 hash acceleration ops
197906c3fb27SDimitry Andric// Crypto SHA256 hash acceleration ops
198006c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V0], (instregex "^SHA1[CMP]", "^SHA256H2?")>;
198106c3fb27SDimitry Andric
198206c3fb27SDimitry Andric// Crypto SHA256 schedule acceleration ops
198306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V0], (instregex "^SHA256SU[01]")>;
198406c3fb27SDimitry Andric
198506c3fb27SDimitry Andric// Crypto SHA512 hash acceleration ops
198606c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V0], (instregex "^SHA512(H|H2|SU0|SU1)")>;
198706c3fb27SDimitry Andric
198806c3fb27SDimitry Andric// Crypto SHA3 ops
198906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V0], (instrs BCAX, EOR3, RAX1, XAR)>;
199006c3fb27SDimitry Andric
199106c3fb27SDimitry Andric// Crypto SM3 ops
199206c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V0], (instregex "^SM3PARTW[12]$", "^SM3SS1$",
199306c3fb27SDimitry Andric                                            "^SM3TT[12][AB]$")>;
199406c3fb27SDimitry Andric
199506c3fb27SDimitry Andric// Crypto SM4 ops
199606c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V0], (instrs SM4E, SM4ENCKEY)>;
199706c3fb27SDimitry Andric
199806c3fb27SDimitry Andric// CRC
199906c3fb27SDimitry Andric// -----------------------------------------------------------------------------
200006c3fb27SDimitry Andric
200106c3fb27SDimitry Andricdef : InstRW<[V2Wr_CRC, V2Rd_CRC], (instregex "^CRC32")>;
200206c3fb27SDimitry Andric
200306c3fb27SDimitry Andric// SVE Predicate instructions
200406c3fb27SDimitry Andric// -----------------------------------------------------------------------------
200506c3fb27SDimitry Andric
200606c3fb27SDimitry Andric// Loop control, based on predicate
200706c3fb27SDimitry Andricdef : InstRW<[V2Write_2or3cyc_1M], (instrs BRKA_PPmP, BRKA_PPzP,
200806c3fb27SDimitry Andric                                           BRKB_PPmP, BRKB_PPzP)>;
200906c3fb27SDimitry Andric
201006c3fb27SDimitry Andric// Loop control, based on predicate and flag setting
201106c3fb27SDimitry Andricdef : InstRW<[V2Write_3or4cyc_2M], (instrs BRKAS_PPzP, BRKBS_PPzP)>;
201206c3fb27SDimitry Andric
201306c3fb27SDimitry Andric// Loop control, propagating
201406c3fb27SDimitry Andricdef : InstRW<[V2Write_2or3cyc_1M0], (instrs BRKN_PPzP, BRKPA_PPzPP,
201506c3fb27SDimitry Andric                                            BRKPB_PPzPP)>;
201606c3fb27SDimitry Andric
201706c3fb27SDimitry Andric// Loop control, propagating and flag setting
201806c3fb27SDimitry Andricdef : InstRW<[V2Write_3or4cyc_1M0_1M], (instrs BRKNS_PPzP, BRKPAS_PPzPP,
201906c3fb27SDimitry Andric                                               BRKPBS_PPzPP)>;
202006c3fb27SDimitry Andric
202106c3fb27SDimitry Andric// Loop control, based on GPR
202206c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_2M],
202306c3fb27SDimitry Andric             (instregex "^WHILE(GE|GT|HI|HS|LE|LO|LS|LT)_P(WW|XX)_[BHSD]")>;
202406c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_2M], (instregex "^WHILE(RW|WR)_PXX_[BHSD]")>;
202506c3fb27SDimitry Andric
202606c3fb27SDimitry Andric// Loop terminate
202706c3fb27SDimitry Andricdef : InstRW<[V2Write_1cyc_2M], (instregex "^CTERM(EQ|NE)_(WW|XX)")>;
202806c3fb27SDimitry Andric
202906c3fb27SDimitry Andric// Predicate counting scalar
203006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M], (instrs ADDPL_XXI, ADDVL_XXI, RDVLI_XI)>;
203106c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M],
203206c3fb27SDimitry Andric             (instregex "^(CNT|SQDEC|SQINC|UQDEC|UQINC)[BHWD]_XPiI",
203306c3fb27SDimitry Andric                        "^SQ(DEC|INC)[BHWD]_XPiWdI",
203406c3fb27SDimitry Andric                        "^UQ(DEC|INC)[BHWD]_WPiI")>;
203506c3fb27SDimitry Andric
203606c3fb27SDimitry Andric// Predicate counting scalar, ALL, {1,2,4}
203706c3fb27SDimitry Andricdef : InstRW<[V2Write_IncDec], (instregex "^(DEC|INC)[BHWD]_XPiI")>;
203806c3fb27SDimitry Andric
203906c3fb27SDimitry Andric// Predicate counting scalar, active predicate
204006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M],
204106c3fb27SDimitry Andric             (instregex "^CNTP_XPP_[BHSD]",
204206c3fb27SDimitry Andric                        "^(DEC|INC|SQDEC|SQINC|UQDEC|UQINC)P_XP_[BHSD]",
204306c3fb27SDimitry Andric                        "^(UQDEC|UQINC)P_WP_[BHSD]",
204406c3fb27SDimitry Andric                        "^(SQDEC|SQINC)P_XPWd_[BHSD]")>;
204506c3fb27SDimitry Andric
204606c3fb27SDimitry Andric// Predicate counting vector, active predicate
204706c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_1M_1M0_1V],
204806c3fb27SDimitry Andric             (instregex "^(DEC|INC|SQDEC|SQINC|UQDEC|UQINC)P_ZP_[HSD]")>;
204906c3fb27SDimitry Andric
205006c3fb27SDimitry Andric// Predicate logical
205106c3fb27SDimitry Andricdef : InstRW<[V2Write_1or2cyc_1M0],
205206c3fb27SDimitry Andric             (instregex "^(AND|BIC|EOR|NAND|NOR|ORN|ORR)_PPzPP")>;
205306c3fb27SDimitry Andric
205406c3fb27SDimitry Andric// Predicate logical, flag setting
205506c3fb27SDimitry Andricdef : InstRW<[V2Write_1or2cyc_1M0_1M],
205606c3fb27SDimitry Andric             (instregex "^(ANDS|BICS|EORS|NANDS|NORS|ORNS|ORRS)_PPzPP")>;
205706c3fb27SDimitry Andric
205806c3fb27SDimitry Andric// Predicate reverse
205906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M], (instregex "^REV_PP_[BHSD]")>;
206006c3fb27SDimitry Andric
206106c3fb27SDimitry Andric// Predicate select
206206c3fb27SDimitry Andricdef : InstRW<[V2Write_1cyc_1M0], (instrs SEL_PPPP)>;
206306c3fb27SDimitry Andric
206406c3fb27SDimitry Andric// Predicate set
206506c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M], (instregex "^PFALSE", "^PTRUE_[BHSD]")>;
206606c3fb27SDimitry Andric
206706c3fb27SDimitry Andric// Predicate set/initialize, set flags
206806c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_2M], (instregex "^PTRUES_[BHSD]")>;
206906c3fb27SDimitry Andric
207006c3fb27SDimitry Andric// Predicate find first/next
207106c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M], (instregex "^PFIRST_B", "^PNEXT_[BHSD]")>;
207206c3fb27SDimitry Andric
207306c3fb27SDimitry Andric// Predicate test
207406c3fb27SDimitry Andricdef : InstRW<[V2Write_1cyc_1M], (instrs PTEST_PP)>;
207506c3fb27SDimitry Andric
207606c3fb27SDimitry Andric// Predicate transpose
207706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M], (instregex "^TRN[12]_PPP_[BHSD]")>;
207806c3fb27SDimitry Andric
207906c3fb27SDimitry Andric// Predicate unpack and widen
208006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M], (instrs PUNPKHI_PP, PUNPKLO_PP)>;
208106c3fb27SDimitry Andric
208206c3fb27SDimitry Andric// Predicate zip/unzip
208306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M], (instregex "^(ZIP|UZP)[12]_PPP_[BHSD]")>;
208406c3fb27SDimitry Andric
208506c3fb27SDimitry Andric// SVE integer instructions
208606c3fb27SDimitry Andric// -----------------------------------------------------------------------------
208706c3fb27SDimitry Andric
208806c3fb27SDimitry Andric// Arithmetic, absolute diff
208906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^[SU]ABD_ZPmZ_[BHSD]",
209006c3fb27SDimitry Andric                                           "^[SU]ABD_ZPZZ_[BHSD]")>;
209106c3fb27SDimitry Andric
209206c3fb27SDimitry Andric// Arithmetic, absolute diff accum
209306c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZA, V2Rd_ZA], (instregex "^[SU]ABA_ZZZ_[BHSD]")>;
209406c3fb27SDimitry Andric
209506c3fb27SDimitry Andric// Arithmetic, absolute diff accum long
209606c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZA, V2Rd_ZA], (instregex "^[SU]ABAL[TB]_ZZZ_[HSD]")>;
209706c3fb27SDimitry Andric
209806c3fb27SDimitry Andric// Arithmetic, absolute diff long
209906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^[SU]ABDL[TB]_ZZZ_[HSD]")>;
210006c3fb27SDimitry Andric
210106c3fb27SDimitry Andric// Arithmetic, basic
210206c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V],
210306c3fb27SDimitry Andric             (instregex "^(ABS|ADD|CNOT|NEG|SUB|SUBR)_ZPmZ_[BHSD]",
210406c3fb27SDimitry Andric                        "^(ADD|SUB)_ZZZ_[BHSD]",
210506c3fb27SDimitry Andric                        "^(ADD|SUB|SUBR)_ZPZZ_[BHSD]",
210606c3fb27SDimitry Andric                        "^(ADD|SUB|SUBR)_ZI_[BHSD]",
210706c3fb27SDimitry Andric                        "^ADR_[SU]XTW_ZZZ_D_[0123]",
210806c3fb27SDimitry Andric                        "^ADR_LSL_ZZZ_[SD]_[0123]",
210906c3fb27SDimitry Andric                        "^[SU](ADD|SUB)[LW][BT]_ZZZ_[HSD]",
211006c3fb27SDimitry Andric                        "^SADDLBT_ZZZ_[HSD]",
211106c3fb27SDimitry Andric                        "^[SU]H(ADD|SUB|SUBR)_ZPmZ_[BHSD]",
211206c3fb27SDimitry Andric                        "^SSUBL(BT|TB)_ZZZ_[HSD]")>;
211306c3fb27SDimitry Andric
211406c3fb27SDimitry Andric// Arithmetic, complex
211506c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V],
211606c3fb27SDimitry Andric             (instregex "^R?(ADD|SUB)HN[BT]_ZZZ_[BHS]",
211706c3fb27SDimitry Andric                        "^SQ(ABS|ADD|NEG|SUB|SUBR)_ZPmZ_[BHSD]",
211806c3fb27SDimitry Andric                        "^[SU]Q(ADD|SUB)_ZZZ_[BHSD]",
211906c3fb27SDimitry Andric                        "^[SU]Q(ADD|SUB)_ZI_[BHSD]",
212006c3fb27SDimitry Andric                        "^(SRH|SUQ|UQ|USQ|URH)ADD_ZPmZ_[BHSD]",
212106c3fb27SDimitry Andric                        "^(UQSUB|UQSUBR)_ZPmZ_[BHSD]")>;
212206c3fb27SDimitry Andric
212306c3fb27SDimitry Andric// Arithmetic, large integer
212406c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^(AD|SB)CL[BT]_ZZZ_[SD]")>;
212506c3fb27SDimitry Andric
212606c3fb27SDimitry Andric// Arithmetic, pairwise add
212706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^ADDP_ZPmZ_[BHSD]")>;
212806c3fb27SDimitry Andric
212906c3fb27SDimitry Andric// Arithmetic, pairwise add and accum long
213006c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZPA, ReadDefault, V2Rd_ZPA],
213106c3fb27SDimitry Andric             (instregex "^[SU]ADALP_ZPmZ_[HSD]")>;
213206c3fb27SDimitry Andric
213306c3fb27SDimitry Andric// Arithmetic, shift
213406c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V13],
213506c3fb27SDimitry Andric             (instregex "^(ASR|LSL|LSR)_WIDE_ZPmZ_[BHS]",
213606c3fb27SDimitry Andric                        "^(ASR|LSL|LSR)_WIDE_ZZZ_[BHS]",
213706c3fb27SDimitry Andric                        "^(ASR|LSL|LSR)_ZPmI_[BHSD]",
213806c3fb27SDimitry Andric                        "^(ASR|LSL|LSR)_ZPmZ_[BHSD]",
213906c3fb27SDimitry Andric                        "^(ASR|LSL|LSR)_ZZI_[BHSD]",
214006c3fb27SDimitry Andric                        "^(ASR|LSL|LSR)_ZPZ[IZ]_[BHSD]",
214106c3fb27SDimitry Andric                        "^(ASRR|LSLR|LSRR)_ZPmZ_[BHSD]")>;
214206c3fb27SDimitry Andric
214306c3fb27SDimitry Andric// Arithmetic, shift and accumulate
214406c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZSA, V2Rd_ZSA], (instregex "^[SU]R?SRA_ZZI_[BHSD]")>;
214506c3fb27SDimitry Andric
214606c3fb27SDimitry Andric// Arithmetic, shift by immediate
214706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V13], (instregex "^SHRN[BT]_ZZI_[BHS]",
214806c3fb27SDimitry Andric                                             "^[SU]SHLL[BT]_ZZI_[HSD]")>;
214906c3fb27SDimitry Andric
215006c3fb27SDimitry Andric// Arithmetic, shift by immediate and insert
215106c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V13], (instregex "^(SLI|SRI)_ZZI_[BHSD]")>;
215206c3fb27SDimitry Andric
215306c3fb27SDimitry Andric// Arithmetic, shift complex
215406c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V13],
215506c3fb27SDimitry Andric             (instregex "^(SQ)?RSHRU?N[BT]_ZZI_[BHS]",
215606c3fb27SDimitry Andric                        "^(SQRSHL|SQRSHLR|SQSHL|SQSHLR|UQRSHL|UQRSHLR|UQSHL|UQSHLR)_ZPmZ_[BHSD]",
215706c3fb27SDimitry Andric                        "^[SU]QR?SHL_ZPZZ_[BHSD]",
215806c3fb27SDimitry Andric                        "^(SQSHL|SQSHLU|UQSHL)_(ZPmI|ZPZI)_[BHSD]",
215906c3fb27SDimitry Andric                        "^SQSHRU?N[BT]_ZZI_[BHS]",
216006c3fb27SDimitry Andric                        "^UQR?SHRN[BT]_ZZI_[BHS]")>;
216106c3fb27SDimitry Andric
216206c3fb27SDimitry Andric// Arithmetic, shift right for divide
216306c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V13], (instregex "^ASRD_(ZPmI|ZPZI)_[BHSD]")>;
216406c3fb27SDimitry Andric
216506c3fb27SDimitry Andric// Arithmetic, shift rounding
216606c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V13], (instregex "^[SU]RSHLR?_ZPmZ_[BHSD]",
216706c3fb27SDimitry Andric                                             "^[SU]RSHL_ZPZZ_[BHSD]",
216806c3fb27SDimitry Andric                                             "^[SU]RSHR_(ZPmI|ZPZI)_[BHSD]")>;
216906c3fb27SDimitry Andric
217006c3fb27SDimitry Andric// Bit manipulation
217106c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_2V1], (instregex "^(BDEP|BEXT|BGRP)_ZZZ_[BHSD]")>;
217206c3fb27SDimitry Andric
217306c3fb27SDimitry Andric// Bitwise select
217406c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^(BSL|BSL1N|BSL2N|NBSL)_ZZZZ")>;
217506c3fb27SDimitry Andric
217606c3fb27SDimitry Andric// Count/reverse bits
217706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^(CLS|CLZ|CNT|RBIT)_ZPmZ_[BHSD]")>;
217806c3fb27SDimitry Andric
217906c3fb27SDimitry Andric// Broadcast logical bitmask immediate to vector
218006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instrs DUPM_ZI)>;
218106c3fb27SDimitry Andric
218206c3fb27SDimitry Andric// Compare and set flags
218306c3fb27SDimitry Andricdef : InstRW<[V2Write_4or5cyc_1V0_1M0],
218406c3fb27SDimitry Andric             (instregex "^CMP(EQ|GE|GT|HI|HS|LE|LO|LS|LT|NE)_PPzZ[IZ]_[BHSD]",
218506c3fb27SDimitry Andric                        "^CMP(EQ|GE|GT|HI|HS|LE|LO|LS|LT|NE)_WIDE_PPzZZ_[BHS]")>;
218606c3fb27SDimitry Andric
218706c3fb27SDimitry Andric// Complex add
218806c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^(SQ)?CADD_ZZI_[BHSD]")>;
218906c3fb27SDimitry Andric
219006c3fb27SDimitry Andric// Complex dot product 8-bit element
219106c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZDOTB, V2Rd_ZDOTB], (instrs CDOT_ZZZ_S, CDOT_ZZZI_S)>;
219206c3fb27SDimitry Andric
219306c3fb27SDimitry Andric// Complex dot product 16-bit element
219406c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZDOTH, V2Rd_ZDOTH], (instrs CDOT_ZZZ_D, CDOT_ZZZI_D)>;
219506c3fb27SDimitry Andric
219606c3fb27SDimitry Andric// Complex multiply-add B, H, S element size
219706c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZCMABHS, V2Rd_ZCMABHS], (instregex "^CMLA_ZZZ_[BHS]",
219806c3fb27SDimitry Andric                                                      "^CMLA_ZZZI_[HS]")>;
219906c3fb27SDimitry Andric
220006c3fb27SDimitry Andric// Complex multiply-add D element size
220106c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZCMAD, V2Rd_ZCMAD], (instrs CMLA_ZZZ_D)>;
220206c3fb27SDimitry Andric
220306c3fb27SDimitry Andric// Conditional extract operations, scalar form
220406c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_1M0_1V01], (instregex "^CLAST[AB]_RPZ_[BHSD]")>;
220506c3fb27SDimitry Andric
220606c3fb27SDimitry Andric// Conditional extract operations, SIMD&FP scalar and vector forms
220706c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V1], (instregex "^CLAST[AB]_[VZ]PZ_[BHSD]",
220806c3fb27SDimitry Andric                                            "^COMPACT_ZPZ_[SD]",
220906c3fb27SDimitry Andric                                            "^SPLICE_ZPZZ?_[BHSD]")>;
221006c3fb27SDimitry Andric
221106c3fb27SDimitry Andric// Convert to floating point, 64b to float or convert to double
221206c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^[SU]CVTF_ZPmZ_Dto[HSD]",
221306c3fb27SDimitry Andric                                             "^[SU]CVTF_ZPmZ_StoD")>;
221406c3fb27SDimitry Andric
221506c3fb27SDimitry Andric// Convert to floating point, 32b to single or half
221606c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instregex "^[SU]CVTF_ZPmZ_Sto[HS]")>;
221706c3fb27SDimitry Andric
221806c3fb27SDimitry Andric// Convert to floating point, 16b to half
221906c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_4V02], (instregex "^[SU]CVTF_ZPmZ_HtoH")>;
222006c3fb27SDimitry Andric
222106c3fb27SDimitry Andric// Copy, scalar
222206c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_1M0_1V], (instregex "^CPY_ZPmR_[BHSD]")>;
222306c3fb27SDimitry Andric
222406c3fb27SDimitry Andric// Copy, scalar SIMD&FP or imm
222506c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^CPY_ZPm[IV]_[BHSD]",
222606c3fb27SDimitry Andric                                           "^CPY_ZPzI_[BHSD]")>;
222706c3fb27SDimitry Andric
222806c3fb27SDimitry Andric// Divides, 32 bit
222906c3fb27SDimitry Andricdef : InstRW<[V2Write_12cyc_1V0], (instregex "^[SU]DIVR?_ZPmZ_S",
223006c3fb27SDimitry Andric                                             "^[SU]DIV_ZPZZ_S")>;
223106c3fb27SDimitry Andric
223206c3fb27SDimitry Andric// Divides, 64 bit
223306c3fb27SDimitry Andricdef : InstRW<[V2Write_20cyc_1V0], (instregex "^[SU]DIVR?_ZPmZ_D",
223406c3fb27SDimitry Andric                                             "^[SU]DIV_ZPZZ_D")>;
223506c3fb27SDimitry Andric
223606c3fb27SDimitry Andric// Dot product, 8 bit
223706c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZDOTB, V2Rd_ZDOTB], (instregex "^[SU]DOT_ZZZI?_S")>;
223806c3fb27SDimitry Andric
223906c3fb27SDimitry Andric// Dot product, 8 bit, using signed and unsigned integers
224006c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZDOTB, V2Rd_ZDOTB], (instrs SUDOT_ZZZI, USDOT_ZZZI, USDOT_ZZZ)>;
224106c3fb27SDimitry Andric
224206c3fb27SDimitry Andric// Dot product, 16 bit
224306c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZDOTH, V2Rd_ZDOTH], (instregex "^[SU]DOT_ZZZI?_D")>;
224406c3fb27SDimitry Andric
224506c3fb27SDimitry Andric// Duplicate, immediate and indexed form
224606c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^DUP_ZI_[BHSD]",
224706c3fb27SDimitry Andric                                           "^DUP_ZZI_[BHSDQ]")>;
224806c3fb27SDimitry Andric
224906c3fb27SDimitry Andric// Duplicate, scalar form
225006c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1M0], (instregex "^DUP_ZR_[BHSD]")>;
225106c3fb27SDimitry Andric
225206c3fb27SDimitry Andric// Extend, sign or zero
225306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V13], (instregex "^[SU]XTB_ZPmZ_[HSD]",
225406c3fb27SDimitry Andric                                             "^[SU]XTH_ZPmZ_[SD]",
225506c3fb27SDimitry Andric                                             "^[SU]XTW_ZPmZ_[D]")>;
225606c3fb27SDimitry Andric
225706c3fb27SDimitry Andric// Extract
225806c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instrs EXT_ZZI, EXT_ZZI_B)>;
225906c3fb27SDimitry Andric
226006c3fb27SDimitry Andric// Extract narrow saturating
226106c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V13], (instregex "^[SU]QXTN[BT]_ZZ_[BHS]",
226206c3fb27SDimitry Andric                                             "^SQXTUN[BT]_ZZ_[BHS]")>;
226306c3fb27SDimitry Andric
226406c3fb27SDimitry Andric// Extract/insert operation, SIMD and FP scalar form
226506c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V1], (instregex "^LAST[AB]_VPZ_[BHSD]",
226606c3fb27SDimitry Andric                                            "^INSR_ZV_[BHSD]")>;
226706c3fb27SDimitry Andric
226806c3fb27SDimitry Andric// Extract/insert operation, scalar
226906c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1V1_1M0], (instregex "^LAST[AB]_RPZ_[BHSD]",
227006c3fb27SDimitry Andric                                                "^INSR_ZR_[BHSD]")>;
227106c3fb27SDimitry Andric
227206c3fb27SDimitry Andric// Histogram operations
227306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^HISTCNT_ZPzZZ_[SD]",
227406c3fb27SDimitry Andric                                           "^HISTSEG_ZZZ")>;
227506c3fb27SDimitry Andric
227606c3fb27SDimitry Andric// Horizontal operations, B, H, S form, immediate operands only
227706c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V02], (instregex "^INDEX_II_[BHS]")>;
227806c3fb27SDimitry Andric
227906c3fb27SDimitry Andric// Horizontal operations, B, H, S form, scalar, immediate operands/ scalar
228006c3fb27SDimitry Andric// operands only / immediate, scalar operands
228106c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_1M0_1V02], (instregex "^INDEX_(IR|RI|RR)_[BHS]")>;
228206c3fb27SDimitry Andric
228306c3fb27SDimitry Andric// Horizontal operations, D form, immediate operands only
228406c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_2V02], (instrs INDEX_II_D)>;
228506c3fb27SDimitry Andric
228606c3fb27SDimitry Andric// Horizontal operations, D form, scalar, immediate operands)/ scalar operands
228706c3fb27SDimitry Andric// only / immediate, scalar operands
228806c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_2M0_2V02], (instregex "^INDEX_(IR|RI|RR)_D")>;
228906c3fb27SDimitry Andric
229006c3fb27SDimitry Andric// Logical
229106c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V],
229206c3fb27SDimitry Andric             (instregex "^(AND|EOR|ORR)_ZI",
229306c3fb27SDimitry Andric                        "^(AND|BIC|EOR|ORR)_ZZZ",
229406c3fb27SDimitry Andric                        "^EOR(BT|TB)_ZZZ_[BHSD]",
229506c3fb27SDimitry Andric                        "^(AND|BIC|EOR|NOT|ORR)_(ZPmZ|ZPZZ)_[BHSD]",
229606c3fb27SDimitry Andric                        "^NOT_ZPmZ_[BHSD]")>;
229706c3fb27SDimitry Andric
229806c3fb27SDimitry Andric// Max/min, basic and pairwise
229906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^[SU](MAX|MIN)_ZI_[BHSD]",
230006c3fb27SDimitry Andric                                           "^[SU](MAX|MIN)P?_ZPmZ_[BHSD]",
230106c3fb27SDimitry Andric                                           "^[SU](MAX|MIN)_ZPZZ_[BHSD]")>;
230206c3fb27SDimitry Andric
230306c3fb27SDimitry Andric// Matching operations
230406c3fb27SDimitry Andric// FIXME: SOG p. 44, n. 5: If the consuming instruction has a flag source, the
230506c3fb27SDimitry Andric// latency for this instruction is 4 cycles.
230606c3fb27SDimitry Andricdef : InstRW<[V2Write_2or3cyc_1V0_1M], (instregex "^N?MATCH_PPzZZ_[BH]")>;
230706c3fb27SDimitry Andric
230806c3fb27SDimitry Andric// Matrix multiply-accumulate
230906c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZMMA, V2Rd_ZMMA], (instrs SMMLA_ZZZ, UMMLA_ZZZ, USMMLA_ZZZ)>;
231006c3fb27SDimitry Andric
231106c3fb27SDimitry Andric// Move prefix
231206c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^MOVPRFX_ZP[mz]Z_[BHSD]",
231306c3fb27SDimitry Andric                                           "^MOVPRFX_ZZ")>;
231406c3fb27SDimitry Andric
231506c3fb27SDimitry Andric// Multiply, B, H, S element size
231606c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V02], (instregex "^MUL_(ZI|ZPmZ|ZZZI|ZZZ)_[BHS]",
231706c3fb27SDimitry Andric                                             "^MUL_ZPZZ_[BHS]",
231806c3fb27SDimitry Andric                                             "^[SU]MULH_(ZPmZ|ZZZ)_[BHS]",
231906c3fb27SDimitry Andric                                             "^[SU]MULH_ZPZZ_[BHS]")>;
232006c3fb27SDimitry Andric
232106c3fb27SDimitry Andric// Multiply, D element size
232206c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_2V02], (instregex "^MUL_(ZI|ZPmZ|ZZZI|ZZZ)_D",
232306c3fb27SDimitry Andric                                             "^MUL_ZPZZ_D",
232406c3fb27SDimitry Andric                                             "^[SU]MULH_(ZPmZ|ZZZ)_D",
232506c3fb27SDimitry Andric                                             "^[SU]MULH_ZPZZ_D")>;
232606c3fb27SDimitry Andric
232706c3fb27SDimitry Andric// Multiply long
232806c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V02], (instregex "^[SU]MULL[BT]_ZZZI_[SD]",
232906c3fb27SDimitry Andric                                             "^[SU]MULL[BT]_ZZZ_[HSD]")>;
233006c3fb27SDimitry Andric
233106c3fb27SDimitry Andric// Multiply accumulate, B, H, S element size
233206c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZMABHS, V2Rd_ZMABHS],
233306c3fb27SDimitry Andric             (instregex "^ML[AS]_ZZZI_[HS]", "^ML[AS]_ZPZZZ_[BHS]")>;
233406c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZMABHS, ReadDefault, V2Rd_ZMABHS],
233506c3fb27SDimitry Andric             (instregex "^(ML[AS]|MAD|MSB)_ZPmZZ_[BHS]")>;
233606c3fb27SDimitry Andric
233706c3fb27SDimitry Andric// Multiply accumulate, D element size
233806c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZMAD, V2Rd_ZMAD],
233906c3fb27SDimitry Andric             (instregex "^ML[AS]_ZZZI_D", "^ML[AS]_ZPZZZ_D")>;
234006c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZMAD, ReadDefault, V2Rd_ZMAD],
234106c3fb27SDimitry Andric             (instregex "^(ML[AS]|MAD|MSB)_ZPmZZ_D")>;
234206c3fb27SDimitry Andric
234306c3fb27SDimitry Andric// Multiply accumulate long
234406c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZMAL, V2Rd_ZMAL], (instregex "^[SU]ML[AS]L[BT]_ZZZ_[HSD]",
234506c3fb27SDimitry Andric                                                "^[SU]ML[AS]L[BT]_ZZZI_[SD]")>;
234606c3fb27SDimitry Andric
234706c3fb27SDimitry Andric// Multiply accumulate saturating doubling long regular
234806c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZMASQL, V2Rd_ZMASQ],
234906c3fb27SDimitry Andric             (instregex "^SQDML[AS]L(B|T|BT)_ZZZ_[HSD]",
235006c3fb27SDimitry Andric                        "^SQDML[AS]L[BT]_ZZZI_[SD]")>;
235106c3fb27SDimitry Andric
235206c3fb27SDimitry Andric// Multiply saturating doubling high, B, H, S element size
235306c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V02], (instregex "^SQDMULH_ZZZ_[BHS]",
235406c3fb27SDimitry Andric                                             "^SQDMULH_ZZZI_[HS]")>;
235506c3fb27SDimitry Andric
235606c3fb27SDimitry Andric// Multiply saturating doubling high, D element size
235706c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_2V02], (instrs SQDMULH_ZZZ_D, SQDMULH_ZZZI_D)>;
235806c3fb27SDimitry Andric
235906c3fb27SDimitry Andric// Multiply saturating doubling long
236006c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V02], (instregex "^SQDMULL[BT]_ZZZ_[HSD]",
236106c3fb27SDimitry Andric                                             "^SQDMULL[BT]_ZZZI_[SD]")>;
236206c3fb27SDimitry Andric
236306c3fb27SDimitry Andric// Multiply saturating rounding doubling regular/complex accumulate, B, H, S
236406c3fb27SDimitry Andric// element size
236506c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZMASQBHS, V2Rd_ZMASQ], (instregex "^SQRDML[AS]H_ZZZ_[BHS]",
236606c3fb27SDimitry Andric                                                     "^SQRDCMLAH_ZZZ_[BHS]",
236706c3fb27SDimitry Andric                                                     "^SQRDML[AS]H_ZZZI_[HS]",
236806c3fb27SDimitry Andric                                                     "^SQRDCMLAH_ZZZI_[HS]")>;
236906c3fb27SDimitry Andric
237006c3fb27SDimitry Andric// Multiply saturating rounding doubling regular/complex accumulate, D element
237106c3fb27SDimitry Andric// size
237206c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZMASQD, V2Rd_ZMASQ], (instregex "^SQRDML[AS]H_ZZZI?_D",
237306c3fb27SDimitry Andric                                                   "^SQRDCMLAH_ZZZ_D")>;
237406c3fb27SDimitry Andric
237506c3fb27SDimitry Andric// Multiply saturating rounding doubling regular/complex, B, H, S element size
237606c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V02], (instregex "^SQRDMULH_ZZZ_[BHS]",
237706c3fb27SDimitry Andric                                             "^SQRDMULH_ZZZI_[HS]")>;
237806c3fb27SDimitry Andric
237906c3fb27SDimitry Andric// Multiply saturating rounding doubling regular/complex, D element size
238006c3fb27SDimitry Andricdef : InstRW<[V2Write_5cyc_2V02], (instregex "^SQRDMULH_ZZZI?_D")>;
238106c3fb27SDimitry Andric
238206c3fb27SDimitry Andric// Multiply/multiply long, (8x8) polynomial
238306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V23], (instregex "^PMUL_ZZZ_B",
238406c3fb27SDimitry Andric                                             "^PMULL[BT]_ZZZ_[HDQ]")>;
238506c3fb27SDimitry Andric
238606c3fb27SDimitry Andric// Predicate counting vector
238706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^([SU]Q)?(DEC|INC)[HWD]_ZPiI")>;
238806c3fb27SDimitry Andric
238906c3fb27SDimitry Andric// Reciprocal estimate
239006c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instregex "^URECPE_ZPmZ_S", "^URSQRTE_ZPmZ_S")>;
239106c3fb27SDimitry Andric
239206c3fb27SDimitry Andric// Reduction, arithmetic, B form
239306c3fb27SDimitry Andricdef : InstRW<[V2Write_9cyc_2V_4V13], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_B")>;
239406c3fb27SDimitry Andric
239506c3fb27SDimitry Andric// Reduction, arithmetic, H form
239606c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_2V_2V13], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_H")>;
239706c3fb27SDimitry Andric
239806c3fb27SDimitry Andric// Reduction, arithmetic, S form
239906c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_2V_2V13], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_S")>;
240006c3fb27SDimitry Andric
240106c3fb27SDimitry Andric// Reduction, arithmetic, D form
240206c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_D")>;
240306c3fb27SDimitry Andric
240406c3fb27SDimitry Andric// Reduction, logical
240506c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1V_1V13], (instregex "^(AND|EOR|OR)V_VPZ_[BHSD]")>;
240606c3fb27SDimitry Andric
240706c3fb27SDimitry Andric// Reverse, vector
240806c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^REV_ZZ_[BHSD]",
240906c3fb27SDimitry Andric                                           "^REVB_ZPmZ_[HSD]",
241006c3fb27SDimitry Andric                                           "^REVH_ZPmZ_[SD]",
241106c3fb27SDimitry Andric                                           "^REVW_ZPmZ_D")>;
241206c3fb27SDimitry Andric
241306c3fb27SDimitry Andric// Select, vector form
241406c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^SEL_ZPZZ_[BHSD]")>;
241506c3fb27SDimitry Andric
241606c3fb27SDimitry Andric// Table lookup
241706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^TBL_ZZZZ?_[BHSD]")>;
241806c3fb27SDimitry Andric
241906c3fb27SDimitry Andric// Table lookup extension
242006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^TBX_ZZZ_[BHSD]")>;
242106c3fb27SDimitry Andric
242206c3fb27SDimitry Andric// Transpose, vector form
242306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^TRN[12]_ZZZ_[BHSDQ]")>;
242406c3fb27SDimitry Andric
242506c3fb27SDimitry Andric// Unpack and extend
242606c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^[SU]UNPK(HI|LO)_ZZ_[HSD]")>;
242706c3fb27SDimitry Andric
242806c3fb27SDimitry Andric// Zip/unzip
242906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^(UZP|ZIP)[12]_ZZZ_[BHSDQ]")>;
243006c3fb27SDimitry Andric
243106c3fb27SDimitry Andric// SVE floating-point instructions
243206c3fb27SDimitry Andric// -----------------------------------------------------------------------------
243306c3fb27SDimitry Andric
243406c3fb27SDimitry Andric// Floating point absolute value/difference
243506c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^FAB[SD]_ZPmZ_[HSD]",
243606c3fb27SDimitry Andric                                           "^FABD_ZPZZ_[HSD]",
243706c3fb27SDimitry Andric                                           "^FABS_ZPmZ_[HSD]")>;
243806c3fb27SDimitry Andric
243906c3fb27SDimitry Andric// Floating point arithmetic
244006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^F(ADD|SUB)_(ZPm[IZ]|ZZZ)_[HSD]",
244106c3fb27SDimitry Andric                                           "^F(ADD|SUB)_ZPZ[IZ]_[HSD]",
244206c3fb27SDimitry Andric                                           "^FADDP_ZPmZZ_[HSD]",
244306c3fb27SDimitry Andric                                           "^FNEG_ZPmZ_[HSD]",
244406c3fb27SDimitry Andric                                           "^FSUBR_ZPm[IZ]_[HSD]",
244506c3fb27SDimitry Andric                                           "^FSUBR_(ZPZI|ZPZZ)_[HSD]")>;
244606c3fb27SDimitry Andric
244706c3fb27SDimitry Andric// Floating point associative add, F16
244806c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_1V1_9rc], (instrs FADDA_VPZ_H)>;
244906c3fb27SDimitry Andric
245006c3fb27SDimitry Andric// Floating point associative add, F32
245106c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1V1_5rc], (instrs FADDA_VPZ_S)>;
245206c3fb27SDimitry Andric
245306c3fb27SDimitry Andric// Floating point associative add, F64
245406c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V], (instrs FADDA_VPZ_D)>;
245506c3fb27SDimitry Andric
245606c3fb27SDimitry Andric// Floating point compare
245706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V0], (instregex "^FACG[ET]_PPzZZ_[HSD]",
245806c3fb27SDimitry Andric                                            "^FCM(EQ|GE|GT|NE)_PPzZ[0Z]_[HSD]",
245906c3fb27SDimitry Andric                                            "^FCM(LE|LT)_PPzZ0_[HSD]",
246006c3fb27SDimitry Andric                                            "^FCMUO_PPzZZ_[HSD]")>;
246106c3fb27SDimitry Andric
246206c3fb27SDimitry Andric// Floating point complex add
246306c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V], (instregex "^FCADD_ZPmZ_[HSD]")>;
246406c3fb27SDimitry Andric
246506c3fb27SDimitry Andric// Floating point complex multiply add
246606c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZFCMA, ReadDefault, V2Rd_ZFCMA], (instregex "^FCMLA_ZPmZZ_[HSD]")>;
246706c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZFCMA, V2Rd_ZFCMA],              (instregex "^FCMLA_ZZZI_[HS]")>;
246806c3fb27SDimitry Andric
246906c3fb27SDimitry Andric// Floating point convert, long or narrow (F16 to F32 or F32 to F16)
247006c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instregex "^FCVT_ZPmZ_(HtoS|StoH)",
247106c3fb27SDimitry Andric                                             "^FCVTLT_ZPmZ_HtoS",
247206c3fb27SDimitry Andric                                             "^FCVTNT_ZPmZ_StoH")>;
247306c3fb27SDimitry Andric
247406c3fb27SDimitry Andric// Floating point convert, long or narrow (F16 to F64, F32 to F64, F64 to F32
247506c3fb27SDimitry Andric// or F64 to F16)
247606c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^FCVT_ZPmZ_(HtoD|StoD|DtoS|DtoH)",
247706c3fb27SDimitry Andric                                             "^FCVTLT_ZPmZ_StoD",
247806c3fb27SDimitry Andric                                             "^FCVTNT_ZPmZ_DtoS")>;
247906c3fb27SDimitry Andric
248006c3fb27SDimitry Andric// Floating point convert, round to odd
248106c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instrs FCVTX_ZPmZ_DtoS, FCVTXNT_ZPmZ_DtoS)>;
248206c3fb27SDimitry Andric
248306c3fb27SDimitry Andric// Floating point base2 log, F16
248406c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_4V02], (instregex "^FLOGB_(ZPmZ|ZPZZ)_H")>;
248506c3fb27SDimitry Andric
248606c3fb27SDimitry Andric// Floating point base2 log, F32
248706c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instregex "^FLOGB_(ZPmZ|ZPZZ)_S")>;
248806c3fb27SDimitry Andric
248906c3fb27SDimitry Andric// Floating point base2 log, F64
249006c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^FLOGB_(ZPmZ|ZPZZ)_D")>;
249106c3fb27SDimitry Andric
249206c3fb27SDimitry Andric// Floating point convert to integer, F16
249306c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_4V02], (instregex "^FCVTZ[SU]_ZPmZ_HtoH")>;
249406c3fb27SDimitry Andric
249506c3fb27SDimitry Andric// Floating point convert to integer, F32
249606c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instregex "^FCVTZ[SU]_ZPmZ_(HtoS|StoS)")>;
249706c3fb27SDimitry Andric
249806c3fb27SDimitry Andric// Floating point convert to integer, F64
249906c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02],
250006c3fb27SDimitry Andric             (instregex "^FCVTZ[SU]_ZPmZ_(HtoD|StoD|DtoS|DtoD)")>;
250106c3fb27SDimitry Andric
250206c3fb27SDimitry Andric// Floating point copy
250306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^FCPY_ZPmI_[HSD]",
250406c3fb27SDimitry Andric                                           "^FDUP_ZI_[HSD]")>;
250506c3fb27SDimitry Andric
250606c3fb27SDimitry Andric// Floating point divide, F16
250706c3fb27SDimitry Andricdef : InstRW<[V2Write_13cyc_1V02_12rc], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_H")>;
250806c3fb27SDimitry Andric
250906c3fb27SDimitry Andric// Floating point divide, F32
251006c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_1V02_9rc], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_S")>;
251106c3fb27SDimitry Andric
251206c3fb27SDimitry Andric// Floating point divide, F64
251306c3fb27SDimitry Andricdef : InstRW<[V2Write_15cyc_1V02_14rc], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_D")>;
251406c3fb27SDimitry Andric
251506c3fb27SDimitry Andric// Floating point min/max pairwise
251606c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^F(MAX|MIN)(NM)?P_ZPmZZ_[HSD]")>;
251706c3fb27SDimitry Andric
251806c3fb27SDimitry Andric// Floating point min/max
251906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^F(MAX|MIN)(NM)?_ZPm[IZ]_[HSD]",
252006c3fb27SDimitry Andric                                           "^F(MAX|MIN)(NM)?_ZPZ[IZ]_[HSD]")>;
252106c3fb27SDimitry Andric
252206c3fb27SDimitry Andric// Floating point multiply
252306c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V], (instregex "^(FSCALE|FMULX)_ZPmZ_[HSD]",
252406c3fb27SDimitry Andric                                           "^FMULX_ZPZZ_[HSD]",
252506c3fb27SDimitry Andric                                           "^FMUL_(ZPm[IZ]|ZZZI?)_[HSD]",
252606c3fb27SDimitry Andric                                           "^FMUL_ZPZ[IZ]_[HSD]")>;
252706c3fb27SDimitry Andric
252806c3fb27SDimitry Andric// Floating point multiply accumulate
252906c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZFMA, ReadDefault, V2Rd_ZFMA],
253006c3fb27SDimitry Andric             (instregex "^FN?ML[AS]_ZPmZZ_[HSD]",
253106c3fb27SDimitry Andric                        "^FN?(MAD|MSB)_ZPmZZ_[HSD]")>;
253206c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZFMA, V2Rd_ZFMA],
253306c3fb27SDimitry Andric             (instregex "^FML[AS]_ZZZI_[HSD]",
253406c3fb27SDimitry Andric                        "^FN?ML[AS]_ZPZZZ_[HSD]")>;
253506c3fb27SDimitry Andric
253606c3fb27SDimitry Andric// Floating point multiply add/sub accumulate long
253706c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZFMAL, V2Rd_ZFMAL], (instregex "^FML[AS]L[BT]_ZZZI?_SHH")>;
253806c3fb27SDimitry Andric
253906c3fb27SDimitry Andric// Floating point reciprocal estimate, F16
254006c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_4V02], (instregex "^FR(ECP|SQRT)E_ZZ_H", "^FRECPX_ZPmZ_H")>;
254106c3fb27SDimitry Andric
254206c3fb27SDimitry Andric// Floating point reciprocal estimate, F32
254306c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instregex "^FR(ECP|SQRT)E_ZZ_S", "^FRECPX_ZPmZ_S")>;
254406c3fb27SDimitry Andric
254506c3fb27SDimitry Andric// Floating point reciprocal estimate, F64
254606c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^FR(ECP|SQRT)E_ZZ_D", "^FRECPX_ZPmZ_D")>;
254706c3fb27SDimitry Andric
254806c3fb27SDimitry Andric// Floating point reciprocal step
254906c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V], (instregex "^F(RECPS|RSQRTS)_ZZZ_[HSD]")>;
255006c3fb27SDimitry Andric
255106c3fb27SDimitry Andric// Floating point reduction, F16
255206c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_4V],
255306c3fb27SDimitry Andric             (instregex "^(FADDV|FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_H")>;
255406c3fb27SDimitry Andric
255506c3fb27SDimitry Andric// Floating point reduction, F32
255606c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_3V],
255706c3fb27SDimitry Andric             (instregex "^(FADDV|FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_S")>;
255806c3fb27SDimitry Andric
255906c3fb27SDimitry Andric// Floating point reduction, F64
256006c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V],
256106c3fb27SDimitry Andric             (instregex "^(FADDV|FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_D")>;
256206c3fb27SDimitry Andric
256306c3fb27SDimitry Andric// Floating point round to integral, F16
256406c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_4V02], (instregex "^FRINT[AIMNPXZ]_ZPmZ_H")>;
256506c3fb27SDimitry Andric
256606c3fb27SDimitry Andric// Floating point round to integral, F32
256706c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2V02], (instregex "^FRINT[AIMNPXZ]_ZPmZ_S")>;
256806c3fb27SDimitry Andric
256906c3fb27SDimitry Andric// Floating point round to integral, F64
257006c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V02], (instregex "^FRINT[AIMNPXZ]_ZPmZ_D")>;
257106c3fb27SDimitry Andric
257206c3fb27SDimitry Andric// Floating point square root, F16
2573*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_13cyc_1V02_12rc], (instregex "^FSQRT_ZPmZ_H")>;
257406c3fb27SDimitry Andric
257506c3fb27SDimitry Andric// Floating point square root, F32
2576*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_10cyc_1V02_9rc], (instregex "^FSQRT_ZPmZ_S")>;
257706c3fb27SDimitry Andric
257806c3fb27SDimitry Andric// Floating point square root, F64
2579*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_16cyc_1V02_14rc], (instregex "^FSQRT_ZPmZ_D")>;
258006c3fb27SDimitry Andric
258106c3fb27SDimitry Andric// Floating point trigonometric exponentiation
258206c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V1], (instregex "^FEXPA_ZZ_[HSD]")>;
258306c3fb27SDimitry Andric
258406c3fb27SDimitry Andric// Floating point trigonometric multiply add
258506c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V], (instregex "^FTMAD_ZZI_[HSD]")>;
258606c3fb27SDimitry Andric
258706c3fb27SDimitry Andric// Floating point trigonometric, miscellaneous
258806c3fb27SDimitry Andricdef : InstRW<[V2Write_3cyc_1V], (instregex "^FTS(MUL|SEL)_ZZZ_[HSD]")>;
258906c3fb27SDimitry Andric
259006c3fb27SDimitry Andric// SVE BFloat16 (BF16) instructions
259106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
259206c3fb27SDimitry Andric
259306c3fb27SDimitry Andric// Convert, F32 to BF16
259406c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V02], (instrs BFCVT_ZPmZ, BFCVTNT_ZPmZ)>;
259506c3fb27SDimitry Andric
259606c3fb27SDimitry Andric// Dot product
259706c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZBFDOT, V2Rd_ZBFDOT], (instrs BFDOT_ZZI, BFDOT_ZZZ)>;
259806c3fb27SDimitry Andric
259906c3fb27SDimitry Andric// Matrix multiply accumulate
260006c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZBFMMA, V2Rd_ZBFMMA], (instrs BFMMLA_ZZZ)>;
260106c3fb27SDimitry Andric
260206c3fb27SDimitry Andric// Multiply accumulate long
260306c3fb27SDimitry Andricdef : InstRW<[V2Wr_ZBFMAL, V2Rd_ZBFMAL], (instregex "^BFMLAL[BT]_ZZZI?")>;
260406c3fb27SDimitry Andric
260506c3fb27SDimitry Andric// SVE Load instructions
260606c3fb27SDimitry Andric// -----------------------------------------------------------------------------
260706c3fb27SDimitry Andric
260806c3fb27SDimitry Andric// Load vector
260906c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instrs LDR_ZXI)>;
261006c3fb27SDimitry Andric
261106c3fb27SDimitry Andric// Load predicate
261206c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L_1M], (instrs LDR_PXI)>;
261306c3fb27SDimitry Andric
261406c3fb27SDimitry Andric// Contiguous load, scalar + imm
26155f757f3fSDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instregex "^LD1[BHWD]_IMM$",
26165f757f3fSDimitry Andric                                           "^LD1S?B_[HSD]_IMM$",
26175f757f3fSDimitry Andric                                           "^LD1S?H_[SD]_IMM$",
26185f757f3fSDimitry Andric                                           "^LD1S?W_D_IMM$" )>;
261906c3fb27SDimitry Andric// Contiguous load, scalar + scalar
262006c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instregex "^LD1[BHWD]$",
262106c3fb27SDimitry Andric                                           "^LD1S?B_[HSD]$",
262206c3fb27SDimitry Andric                                           "^LD1S?H_[SD]$",
262306c3fb27SDimitry Andric                                           "^LD1S?W_D$" )>;
262406c3fb27SDimitry Andric
262506c3fb27SDimitry Andric// Contiguous load broadcast, scalar + imm
262606c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instregex "^LD1R[BHWD]_IMM$",
262706c3fb27SDimitry Andric                                           "^LD1RS?B_[HSD]_IMM$",
262806c3fb27SDimitry Andric                                           "^LD1RS?H_[SD]_IMM$",
262906c3fb27SDimitry Andric                                           "^LD1RW_D_IMM$",
263006c3fb27SDimitry Andric                                           "^LD1RSW_IMM$",
263106c3fb27SDimitry Andric                                           "^LD1RQ_[BHWD]_IMM$")>;
263206c3fb27SDimitry Andric
263306c3fb27SDimitry Andric// Contiguous load broadcast, scalar + scalar
263406c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instregex "^LD1RQ_[BHWD]$")>;
263506c3fb27SDimitry Andric
263606c3fb27SDimitry Andric// Non temporal load, scalar + imm
263706c3fb27SDimitry Andric// Non temporal load, scalar + scalar
263806c3fb27SDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instregex "^LDNT1[BHWD]_ZR[IR]$")>;
263906c3fb27SDimitry Andric
264006c3fb27SDimitry Andric// Non temporal gather load, vector + scalar 32-bit element size
2641*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_9cyc_2L_4V], (instregex "^LDNT1[BHW]_ZZR_S$",
2642*0fca6ea1SDimitry Andric                                              "^LDNT1S[BH]_ZZR_S$")>;
264306c3fb27SDimitry Andric
264406c3fb27SDimitry Andric// Non temporal gather load, vector + scalar 64-bit element size
2645*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_9cyc_2L_2V1], (instregex "^LDNT1S?[BHW]_ZZR_D$")>;
2646*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_9cyc_2L_2V1], (instrs LDNT1D_ZZR_D)>;
264706c3fb27SDimitry Andric
264806c3fb27SDimitry Andric// Contiguous first faulting load, scalar + scalar
2649*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_6cyc_1L_1S], (instregex "^LDFF1[BHWD]$",
2650*0fca6ea1SDimitry Andric                                              "^LDFF1S?B_[HSD]$",
2651*0fca6ea1SDimitry Andric                                              "^LDFF1S?H_[SD]$",
2652*0fca6ea1SDimitry Andric                                              "^LDFF1S?W_D$")>;
265306c3fb27SDimitry Andric
265406c3fb27SDimitry Andric// Contiguous non faulting load, scalar + imm
2655*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_6cyc_1L], (instregex "^LDNF1[BHWD]_IMM$",
2656*0fca6ea1SDimitry Andric                                           "^LDNF1S?B_[HSD]_IMM$",
2657*0fca6ea1SDimitry Andric                                           "^LDNF1S?H_[SD]_IMM$",
2658*0fca6ea1SDimitry Andric                                           "^LDNF1S?W_D_IMM$")>;
265906c3fb27SDimitry Andric
266006c3fb27SDimitry Andric// Contiguous Load two structures to two vectors, scalar + imm
266106c3fb27SDimitry Andricdef : InstRW<[V2Write_8cyc_2L_2V], (instregex "^LD2[BHWD]_IMM$")>;
266206c3fb27SDimitry Andric
266306c3fb27SDimitry Andric// Contiguous Load two structures to two vectors, scalar + scalar
266406c3fb27SDimitry Andricdef : InstRW<[V2Write_9cyc_2L_2V_2S], (instregex "^LD2[BHWD]$")>;
266506c3fb27SDimitry Andric
266606c3fb27SDimitry Andric// Contiguous Load three structures to three vectors, scalar + imm
266706c3fb27SDimitry Andricdef : InstRW<[V2Write_9cyc_3L_3V], (instregex "^LD3[BHWD]_IMM$")>;
266806c3fb27SDimitry Andric
266906c3fb27SDimitry Andric// Contiguous Load three structures to three vectors, scalar + scalar
267006c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_3V_3L_3S], (instregex "^LD3[BHWD]$")>;
267106c3fb27SDimitry Andric
267206c3fb27SDimitry Andric// Contiguous Load four structures to four vectors, scalar + imm
267306c3fb27SDimitry Andricdef : InstRW<[V2Write_9cyc_4L_8V], (instregex "^LD4[BHWD]_IMM$")>;
267406c3fb27SDimitry Andric
267506c3fb27SDimitry Andric// Contiguous Load four structures to four vectors, scalar + scalar
267606c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_4L_8V_4S], (instregex "^LD4[BHWD]$")>;
267706c3fb27SDimitry Andric
267806c3fb27SDimitry Andric// Gather load, vector + imm, 32-bit element size
2679*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_9cyc_1L_4V], (instregex "^GLD(FF)?1S?[BH]_S_IMM$",
2680*0fca6ea1SDimitry Andric                                              "^GLD(FF)?1W_IMM$")>;
268106c3fb27SDimitry Andric
268206c3fb27SDimitry Andric// Gather load, vector + imm, 64-bit element size
2683*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_9cyc_1L_4V], (instregex "^GLD(FF)?1S?[BHW]_D_IMM$",
2684*0fca6ea1SDimitry Andric                                              "^GLD(FF)?1D_IMM$")>;
268506c3fb27SDimitry Andric
268606c3fb27SDimitry Andric// Gather load, 32-bit scaled offset
268706c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_1L_8V],
2688*0fca6ea1SDimitry Andric             (instregex "^GLD(FF)?1S?H_S_[SU]XTW_SCALED$",
2689*0fca6ea1SDimitry Andric                        "^GLD(FF)?1W_[SU]XTW_SCALED")>;
269006c3fb27SDimitry Andric
269106c3fb27SDimitry Andric// Gather load, 64-bit scaled offset
269206c3fb27SDimitry Andric// NOTE: These instructions are not specified in the SOG.
269306c3fb27SDimitry Andricdef : InstRW<[V2Write_10cyc_1L_4V],
2694*0fca6ea1SDimitry Andric             (instregex "^GLD(FF)?1S?[HW]_D_([SU]XTW_)?SCALED$",
2695*0fca6ea1SDimitry Andric                        "^GLD(FF)?1D_([SU]XTW_)?SCALED$")>;
269606c3fb27SDimitry Andric
269706c3fb27SDimitry Andric// Gather load, 32-bit unpacked unscaled offset
2698*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_9cyc_1L_4V], (instregex "^GLD(FF)?1S?[BH]_S_[SU]XTW$",
2699*0fca6ea1SDimitry Andric                                              "^GLD(FF)?1W_[SU]XTW$")>;
270006c3fb27SDimitry Andric
270106c3fb27SDimitry Andric// Gather load, 64-bit unpacked unscaled offset
270206c3fb27SDimitry Andric// NOTE: These instructions are not specified in the SOG.
270306c3fb27SDimitry Andricdef : InstRW<[V2Write_9cyc_1L_2V],
2704*0fca6ea1SDimitry Andric             (instregex "^GLD(FF)?1S?[BHW]_D(_[SU]XTW)?$",
2705*0fca6ea1SDimitry Andric                        "^GLD(FF)?1D(_[SU]XTW)?$")>;
270606c3fb27SDimitry Andric
270706c3fb27SDimitry Andric// SVE Store instructions
270806c3fb27SDimitry Andric// -----------------------------------------------------------------------------
270906c3fb27SDimitry Andric
271006c3fb27SDimitry Andric// Store from predicate reg
271106c3fb27SDimitry Andricdef : InstRW<[V2Write_1cyc_1L01], (instrs STR_PXI)>;
271206c3fb27SDimitry Andric
271306c3fb27SDimitry Andric// Store from vector reg
271406c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V01], (instrs STR_ZXI)>;
271506c3fb27SDimitry Andric
271606c3fb27SDimitry Andric// Contiguous store, scalar + imm
271706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V01], (instregex "^ST1[BHWD]_IMM$",
271806c3fb27SDimitry Andric                                                  "^ST1B_[HSD]_IMM$",
271906c3fb27SDimitry Andric                                                  "^ST1H_[SD]_IMM$",
272006c3fb27SDimitry Andric                                                  "^ST1W_D_IMM$")>;
272106c3fb27SDimitry Andric
272206c3fb27SDimitry Andric// Contiguous store, scalar + scalar
272306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1S_1V01], (instregex "^ST1H(_[SD])?$")>;
272406c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V01], (instregex "^ST1[BWD]$",
272506c3fb27SDimitry Andric                                                  "^ST1B_[HSD]$",
272606c3fb27SDimitry Andric                                                  "^ST1W_D$")>;
272706c3fb27SDimitry Andric
272806c3fb27SDimitry Andric// Contiguous store two structures from two vectors, scalar + imm
272906c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1L01_1V01], (instregex "^ST2[BHWD]_IMM$")>;
273006c3fb27SDimitry Andric
273106c3fb27SDimitry Andric// Contiguous store two structures from two vectors, scalar + scalar
273206c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2L01_2S_2V01], (instrs ST2H)>;
273306c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_2L01_2V01], (instregex "^ST2[BWD]$")>;
273406c3fb27SDimitry Andric
273506c3fb27SDimitry Andric// Contiguous store three structures from three vectors, scalar + imm
273606c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_9L01_9V01], (instregex "^ST3[BHWD]_IMM$")>;
273706c3fb27SDimitry Andric
273806c3fb27SDimitry Andric// Contiguous store three structures from three vectors, scalar + scalar
273906c3fb27SDimitry Andricdef : InstRW<[V2Write_7cyc_9L01_9S_9V01], (instregex "^ST3[BHWD]$")>;
274006c3fb27SDimitry Andric
274106c3fb27SDimitry Andric// Contiguous store four structures from four vectors, scalar + imm
274206c3fb27SDimitry Andricdef : InstRW<[V2Write_11cyc_18L01_18V01], (instregex "^ST4[BHWD]_IMM$")>;
274306c3fb27SDimitry Andric
274406c3fb27SDimitry Andric// Contiguous store four structures from four vectors, scalar + scalar
274506c3fb27SDimitry Andricdef : InstRW<[V2Write_11cyc_18L01_18S_18V01], (instregex "^ST4[BHWD]$")>;
274606c3fb27SDimitry Andric
274706c3fb27SDimitry Andric// Non temporal store, scalar + imm
274806c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V], (instregex "^STNT1[BHWD]_ZRI$")>;
274906c3fb27SDimitry Andric
275006c3fb27SDimitry Andric// Non temporal store, scalar + scalar
275106c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1S_1V], (instrs STNT1H_ZRR)>;
275206c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1L01_1V], (instregex "^STNT1[BWD]_ZRR$")>;
275306c3fb27SDimitry Andric
275406c3fb27SDimitry Andric// Scatter non temporal store, vector + scalar 32-bit element size
275506c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_4L01_4V01], (instregex "^STNT1[BHW]_ZZR_S")>;
275606c3fb27SDimitry Andric
275706c3fb27SDimitry Andric// Scatter non temporal store, vector + scalar 64-bit element size
275806c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_2L01_2V01], (instregex "^STNT1[BHWD]_ZZR_D")>;
275906c3fb27SDimitry Andric
276006c3fb27SDimitry Andric// Scatter store vector + imm 32-bit element size
276106c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_4L01_4V01], (instregex "^SST1[BH]_S_IMM$",
276206c3fb27SDimitry Andric                                                  "^SST1W_IMM$")>;
276306c3fb27SDimitry Andric
276406c3fb27SDimitry Andric// Scatter store vector + imm 64-bit element size
276506c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_2L01_2V01], (instregex "^SST1[BHW]_D_IMM$",
276606c3fb27SDimitry Andric                                                  "^SST1D_IMM$")>;
276706c3fb27SDimitry Andric
276806c3fb27SDimitry Andric// Scatter store, 32-bit scaled offset
276906c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_4L01_4V01],
277006c3fb27SDimitry Andric             (instregex "^SST1(H_S|W)_[SU]XTW_SCALED$")>;
277106c3fb27SDimitry Andric
277206c3fb27SDimitry Andric// Scatter store, 32-bit unpacked unscaled offset
277306c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_2L01_2V01], (instregex "^SST1[BHW]_D_[SU]XTW$",
277406c3fb27SDimitry Andric                                                  "^SST1D_[SU]XTW$")>;
277506c3fb27SDimitry Andric
277606c3fb27SDimitry Andric// Scatter store, 32-bit unpacked scaled offset
277706c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_2L01_2V01], (instregex "^SST1[HW]_D_[SU]XTW_SCALED$",
277806c3fb27SDimitry Andric                                                  "^SST1D_[SU]XTW_SCALED$")>;
277906c3fb27SDimitry Andric
278006c3fb27SDimitry Andric// Scatter store, 32-bit unscaled offset
278106c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_4L01_4V01], (instregex "^SST1[BH]_S_[SU]XTW$",
278206c3fb27SDimitry Andric                                                  "^SST1W_[SU]XTW$")>;
278306c3fb27SDimitry Andric
278406c3fb27SDimitry Andric// Scatter store, 64-bit scaled offset
278506c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_2L01_2V01], (instregex "^SST1[HW]_D_SCALED$",
278606c3fb27SDimitry Andric                                                  "^SST1D_SCALED$")>;
278706c3fb27SDimitry Andric
278806c3fb27SDimitry Andric// Scatter store, 64-bit unscaled offset
278906c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_2L01_2V01], (instregex "^SST1[BHW]_D$",
279006c3fb27SDimitry Andric                                                  "^SST1D$")>;
279106c3fb27SDimitry Andric
279206c3fb27SDimitry Andric// SVE Miscellaneous instructions
279306c3fb27SDimitry Andric// -----------------------------------------------------------------------------
279406c3fb27SDimitry Andric
279506c3fb27SDimitry Andric// Read first fault register, unpredicated
2796*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_2cyc_1M0], (instrs RDFFR_P)>;
279706c3fb27SDimitry Andric
279806c3fb27SDimitry Andric// Read first fault register, predicated
2799*0fca6ea1SDimitry Andricdef : InstRW<[V2Write_3or4cyc_1M0_1M], (instrs RDFFR_PPz)>;
280006c3fb27SDimitry Andric
280106c3fb27SDimitry Andric// Read first fault register and set flags
280206c3fb27SDimitry Andricdef : InstRW<[V2Write_4or5cyc_2M0_2M], (instrs RDFFRS_PPz)>;
280306c3fb27SDimitry Andric
280406c3fb27SDimitry Andric// Set first fault register
280506c3fb27SDimitry Andric// Write to first fault register
280606c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1M0], (instrs SETFFR, WRFFR)>;
280706c3fb27SDimitry Andric
280806c3fb27SDimitry Andric// Prefetch
280906c3fb27SDimitry Andric// NOTE: This is not specified in the SOG.
281006c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1L], (instregex "^PRF[BHWD]")>;
281106c3fb27SDimitry Andric
281206c3fb27SDimitry Andric// SVE Cryptographic instructions
281306c3fb27SDimitry Andric// -----------------------------------------------------------------------------
281406c3fb27SDimitry Andric
281506c3fb27SDimitry Andric// Crypto AES ops
281606c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V], (instregex "^AES[DE]_ZZZ_B$",
281706c3fb27SDimitry Andric                                           "^AESI?MC_ZZ_B$")>;
281806c3fb27SDimitry Andric
281906c3fb27SDimitry Andric// Crypto SHA3 ops
282006c3fb27SDimitry Andricdef : InstRW<[V2Write_2cyc_1V0], (instregex "^(BCAX|EOR3)_ZZZZ$",
282106c3fb27SDimitry Andric                                            "^RAX1_ZZZ_D$",
282206c3fb27SDimitry Andric                                            "^XAR_ZZZI_[BHSD]$")>;
282306c3fb27SDimitry Andric
282406c3fb27SDimitry Andric// Crypto SM4 ops
282506c3fb27SDimitry Andricdef : InstRW<[V2Write_4cyc_1V0], (instregex "^SM4E(KEY)?_ZZZ_S$")>;
282606c3fb27SDimitry Andric
282706c3fb27SDimitry Andric}
2828