xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64SchedNeoverseN1.td (revision 4c2d3b022a1d543dbbff75a0c53e8d3d7242216d)
106c3fb27SDimitry Andric//=- AArch64SchedNeoverseN1.td - NeoverseN1 Scheduling Model -*- 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 N1 processors.
1006c3fb27SDimitry Andric//
1106c3fb27SDimitry Andric// References:
1206c3fb27SDimitry Andric// - "Arm Neoverse N1 Software Optimization Guide"
1306c3fb27SDimitry Andric// - https://en.wikichip.org/wiki/arm_holdings/microarchitectures/neoverse_n1
1406c3fb27SDimitry Andric//
1506c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
1606c3fb27SDimitry Andric
1706c3fb27SDimitry Andricdef NeoverseN1Model : SchedMachineModel {
1806c3fb27SDimitry Andric  let IssueWidth            =   8; // Maximum micro-ops dispatch rate.
1906c3fb27SDimitry Andric  let MicroOpBufferSize     = 128; // NOTE: Copied from Cortex-A76.
2006c3fb27SDimitry Andric  let LoadLatency           =   4; // Optimistic load latency.
2106c3fb27SDimitry Andric  let MispredictPenalty     =  11; // Cycles cost of branch mispredicted.
2206c3fb27SDimitry Andric  let LoopMicroOpBufferSize =  16; // NOTE: Copied from Cortex-A57.
2306c3fb27SDimitry Andric  let CompleteModel         =   1;
2406c3fb27SDimitry Andric
2506c3fb27SDimitry Andric  list<Predicate> UnsupportedFeatures = !listconcat(PAUnsupported.F,
2606c3fb27SDimitry Andric                                                    SMEUnsupported.F,
2706c3fb27SDimitry Andric                                                    SVEUnsupported.F,
28*4c2d3b02SDimitry Andric                                                    [HasMTE, HasCSSC]);
2906c3fb27SDimitry Andric}
3006c3fb27SDimitry Andric
3106c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
3206c3fb27SDimitry Andric// Define each kind of processor resource and number available on Neoverse N1.
3306c3fb27SDimitry Andric// Instructions are first fetched and then decoded into internal macro-ops
3406c3fb27SDimitry Andric// (MOPs).  From there, the MOPs proceed through register renaming and dispatch
3506c3fb27SDimitry Andric// stages.  A MOP can be split into one or more micro-ops further down the
3606c3fb27SDimitry Andric// pipeline, after the decode stage.  Once dispatched, micro-ops wait for their
3706c3fb27SDimitry Andric// operands and issue out-of-order to one of the issue pipelines.  Each issue
3806c3fb27SDimitry Andric// pipeline can accept one micro-op per cycle.
3906c3fb27SDimitry Andric
4006c3fb27SDimitry Andriclet SchedModel = NeoverseN1Model in {
4106c3fb27SDimitry Andric
4206c3fb27SDimitry Andric// Define the issue ports.
4306c3fb27SDimitry Andricdef N1UnitB  : ProcResource<1>;  // Branch
4406c3fb27SDimitry Andricdef N1UnitS  : ProcResource<2>;  // Integer single cycle 0/1
4506c3fb27SDimitry Andricdef N1UnitM  : ProcResource<1>;  // Integer multicycle
4606c3fb27SDimitry Andricdef N1UnitL  : ProcResource<2>;  // Load/Store 0/1
4706c3fb27SDimitry Andricdef N1UnitD  : ProcResource<2>;  // Store data 0/1
4806c3fb27SDimitry Andricdef N1UnitV0 : ProcResource<1>;  // FP/ASIMD 0
4906c3fb27SDimitry Andricdef N1UnitV1 : ProcResource<1>;  // FP/ASIMD 1
5006c3fb27SDimitry Andric
5106c3fb27SDimitry Andricdef N1UnitI : ProcResGroup<[N1UnitS, N1UnitM]>;    // Integer units
5206c3fb27SDimitry Andricdef N1UnitV : ProcResGroup<[N1UnitV0, N1UnitV1]>;  // FP/ASIMD units
5306c3fb27SDimitry Andric
5406c3fb27SDimitry Andric// Define commonly used read types.
5506c3fb27SDimitry Andric
5606c3fb27SDimitry Andric// No generic forwarding is provided for these types.
5706c3fb27SDimitry Andricdef : ReadAdvance<ReadI,       0>;
5806c3fb27SDimitry Andricdef : ReadAdvance<ReadISReg,   0>;
5906c3fb27SDimitry Andricdef : ReadAdvance<ReadIEReg,   0>;
6006c3fb27SDimitry Andricdef : ReadAdvance<ReadIM,      0>;
6106c3fb27SDimitry Andricdef : ReadAdvance<ReadIMA,     0>;
6206c3fb27SDimitry Andricdef : ReadAdvance<ReadID,      0>;
6306c3fb27SDimitry Andricdef : ReadAdvance<ReadExtrHi,  0>;
6406c3fb27SDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>;
6506c3fb27SDimitry Andricdef : ReadAdvance<ReadST,      0>;
6606c3fb27SDimitry Andricdef : ReadAdvance<ReadVLD,     0>;
6706c3fb27SDimitry Andric
6806c3fb27SDimitry Andricdef : WriteRes<WriteAtomic,  []> { let Unsupported = 1; }
6906c3fb27SDimitry Andricdef : WriteRes<WriteBarrier, []> { let Latency = 1; }
7006c3fb27SDimitry Andricdef : WriteRes<WriteHint,    []> { let Latency = 1; }
7106c3fb27SDimitry Andric
7206c3fb27SDimitry Andric
7306c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
7406c3fb27SDimitry Andric// Define generic 0 micro-op types
7506c3fb27SDimitry Andric
7606c3fb27SDimitry Andriclet Latency = 0, NumMicroOps = 0 in
7706c3fb27SDimitry Andricdef N1Write_0c_0Z : SchedWriteRes<[]>;
7806c3fb27SDimitry Andric
7906c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
8006c3fb27SDimitry Andric// Define generic 1 micro-op types
8106c3fb27SDimitry Andric
8206c3fb27SDimitry Andricdef N1Write_1c_1B     : SchedWriteRes<[N1UnitB]>  { let Latency = 1; }
8306c3fb27SDimitry Andricdef N1Write_1c_1I     : SchedWriteRes<[N1UnitI]>  { let Latency = 1; }
8406c3fb27SDimitry Andricdef N1Write_2c_1M     : SchedWriteRes<[N1UnitM]>  { let Latency = 2; }
8506c3fb27SDimitry Andricdef N1Write_3c_1M     : SchedWriteRes<[N1UnitM]>  { let Latency = 3; }
8606c3fb27SDimitry Andricdef N1Write_4c3_1M    : SchedWriteRes<[N1UnitM]>  { let Latency = 4;
875f757f3fSDimitry Andric                                                    let ReleaseAtCycles = [3]; }
8806c3fb27SDimitry Andricdef N1Write_5c3_1M    : SchedWriteRes<[N1UnitM]>  { let Latency = 5;
895f757f3fSDimitry Andric                                                    let ReleaseAtCycles = [3]; }
9006c3fb27SDimitry Andricdef N1Write_12c5_1M   : SchedWriteRes<[N1UnitM]>  { let Latency = 12;
915f757f3fSDimitry Andric                                                    let ReleaseAtCycles = [5]; }
9206c3fb27SDimitry Andricdef N1Write_20c5_1M   : SchedWriteRes<[N1UnitM]>  { let Latency = 20;
935f757f3fSDimitry Andric                                                    let ReleaseAtCycles = [5]; }
9406c3fb27SDimitry Andricdef N1Write_4c_1L     : SchedWriteRes<[N1UnitL]>  { let Latency = 4; }
9506c3fb27SDimitry Andricdef N1Write_5c_1L     : SchedWriteRes<[N1UnitL]>  { let Latency = 5; }
9606c3fb27SDimitry Andricdef N1Write_7c_1L     : SchedWriteRes<[N1UnitL]>  { let Latency = 7; }
9706c3fb27SDimitry Andricdef N1Write_2c_1V     : SchedWriteRes<[N1UnitV]>  { let Latency = 2; }
9806c3fb27SDimitry Andricdef N1Write_3c_1V     : SchedWriteRes<[N1UnitV]>  { let Latency = 3; }
9906c3fb27SDimitry Andricdef N1Write_4c_1V     : SchedWriteRes<[N1UnitV]>  { let Latency = 4; }
10006c3fb27SDimitry Andricdef N1Write_5c_1V     : SchedWriteRes<[N1UnitV]>  { let Latency = 5; }
10106c3fb27SDimitry Andricdef N1Write_2c_1V0    : SchedWriteRes<[N1UnitV0]> { let Latency = 2; }
10206c3fb27SDimitry Andricdef N1Write_3c_1V0    : SchedWriteRes<[N1UnitV0]> { let Latency = 3; }
10306c3fb27SDimitry Andricdef N1Write_4c_1V0    : SchedWriteRes<[N1UnitV0]> { let Latency = 4; }
10406c3fb27SDimitry Andricdef N1Write_7c7_1V0   : SchedWriteRes<[N1UnitV0]> { let Latency = 7;
1055f757f3fSDimitry Andric                                                    let ReleaseAtCycles = [7]; }
10606c3fb27SDimitry Andricdef N1Write_10c7_1V0  : SchedWriteRes<[N1UnitV0]> { let Latency = 10;
1075f757f3fSDimitry Andric                                                    let ReleaseAtCycles = [7]; }
10806c3fb27SDimitry Andricdef N1Write_13c10_1V0 : SchedWriteRes<[N1UnitV0]> { let Latency = 13;
1095f757f3fSDimitry Andric                                                    let ReleaseAtCycles = [10]; }
11006c3fb27SDimitry Andricdef N1Write_15c7_1V0  : SchedWriteRes<[N1UnitV0]> { let Latency = 15;
1115f757f3fSDimitry Andric                                                    let ReleaseAtCycles = [7]; }
11206c3fb27SDimitry Andricdef N1Write_17c7_1V0  : SchedWriteRes<[N1UnitV0]> { let Latency = 17;
1135f757f3fSDimitry Andric                                                    let ReleaseAtCycles = [7]; }
11406c3fb27SDimitry Andricdef N1Write_2c_1V1    : SchedWriteRes<[N1UnitV1]> { let Latency = 2; }
11506c3fb27SDimitry Andricdef N1Write_3c_1V1    : SchedWriteRes<[N1UnitV1]> { let Latency = 3; }
11606c3fb27SDimitry Andricdef N1Write_4c_1V1    : SchedWriteRes<[N1UnitV1]> { let Latency = 4; }
11706c3fb27SDimitry Andric
11806c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
11906c3fb27SDimitry Andric// Define generic 2 micro-op types
12006c3fb27SDimitry Andric
12106c3fb27SDimitry Andriclet Latency = 1, NumMicroOps = 2 in
12206c3fb27SDimitry Andricdef N1Write_1c_1B_1I   : SchedWriteRes<[N1UnitB, N1UnitI]>;
12306c3fb27SDimitry Andriclet Latency = 3, NumMicroOps = 2 in
12406c3fb27SDimitry Andricdef N1Write_3c_1I_1M   : SchedWriteRes<[N1UnitI, N1UnitM]>;
12506c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 2 in
12606c3fb27SDimitry Andricdef N1Write_2c_1I_1L   : SchedWriteRes<[N1UnitI, N1UnitL]>;
12706c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 2 in
12806c3fb27SDimitry Andricdef N1Write_5c_1I_1L   : SchedWriteRes<[N1UnitI, N1UnitL]>;
12906c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 2 in
13006c3fb27SDimitry Andricdef N1Write_6c_1I_1L   : SchedWriteRes<[N1UnitI, N1UnitL]>;
13106c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 2 in
13206c3fb27SDimitry Andricdef N1Write_7c_1I_1L   : SchedWriteRes<[N1UnitI, N1UnitL]>;
13306c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 2 in
13406c3fb27SDimitry Andricdef N1Write_5c_1M_1V   : SchedWriteRes<[N1UnitM, N1UnitV]>;
13506c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 2 in
13606c3fb27SDimitry Andricdef N1Write_6c_1M_1V0  : SchedWriteRes<[N1UnitM, N1UnitV0]>;
13706c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 2 in
13806c3fb27SDimitry Andricdef N1Write_5c_2L      : SchedWriteRes<[N1UnitL, N1UnitL]>;
13906c3fb27SDimitry Andriclet Latency = 1, NumMicroOps = 2 in
14006c3fb27SDimitry Andricdef N1Write_1c_1L_1D   : SchedWriteRes<[N1UnitL, N1UnitD]>;
14106c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 2 in
14206c3fb27SDimitry Andricdef N1Write_2c_1L_1V   : SchedWriteRes<[N1UnitL, N1UnitV]>;
14306c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 2 in
14406c3fb27SDimitry Andricdef N1Write_4c_1L_1V   : SchedWriteRes<[N1UnitL, N1UnitV]>;
14506c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 2 in
14606c3fb27SDimitry Andricdef N1Write_7c_1L_1V   : SchedWriteRes<[N1UnitL, N1UnitV]>;
14706c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 2 in
14806c3fb27SDimitry Andricdef N1Write_4c_1V0_1V1 : SchedWriteRes<[N1UnitV0, N1UnitV1]>;
14906c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 2 in
15006c3fb27SDimitry Andricdef N1Write_4c_2V0     : SchedWriteRes<[N1UnitV0, N1UnitV0]>;
15106c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 2 in
15206c3fb27SDimitry Andricdef N1Write_5c_2V0     : SchedWriteRes<[N1UnitV0, N1UnitV0]>;
15306c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 2 in
15406c3fb27SDimitry Andricdef N1Write_6c_2V1     : SchedWriteRes<[N1UnitV1, N1UnitV1]>;
15506c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 2 in
15606c3fb27SDimitry Andricdef N1Write_5c_1V1_1V  : SchedWriteRes<[N1UnitV1, N1UnitV]>;
15706c3fb27SDimitry Andric
15806c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
15906c3fb27SDimitry Andric// Define generic 3 micro-op types
16006c3fb27SDimitry Andric
16106c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 3 in
16206c3fb27SDimitry Andricdef N1Write_2c_1I_1L_1V : SchedWriteRes<[N1UnitI, N1UnitL, N1UnitV]>;
16306c3fb27SDimitry Andriclet Latency = 1, NumMicroOps = 3 in
16406c3fb27SDimitry Andricdef N1Write_1c_2L_1D    : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitD]>;
16506c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 3 in
16606c3fb27SDimitry Andricdef N1Write_2c_1L_2V    : SchedWriteRes<[N1UnitL, N1UnitV, N1UnitV]>;
16706c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 3 in
16806c3fb27SDimitry Andricdef N1Write_6c_3L       : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL]>;
16906c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 3 in
17006c3fb27SDimitry Andricdef N1Write_4c_3V       : SchedWriteRes<[N1UnitV, N1UnitV, N1UnitV]>;
17106c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 3 in
17206c3fb27SDimitry Andricdef N1Write_6c_3V       : SchedWriteRes<[N1UnitV, N1UnitV, N1UnitV]>;
17306c3fb27SDimitry Andriclet Latency = 8, NumMicroOps = 3 in
17406c3fb27SDimitry Andricdef N1Write_8c_3V       : SchedWriteRes<[N1UnitV, N1UnitV, N1UnitV]>;
17506c3fb27SDimitry Andric
17606c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
17706c3fb27SDimitry Andric// Define generic 4 micro-op types
17806c3fb27SDimitry Andric
17906c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 4 in
18006c3fb27SDimitry Andricdef N1Write_2c_2I_2L : SchedWriteRes<[N1UnitI, N1UnitI, N1UnitL, N1UnitL]>;
18106c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 4 in
18206c3fb27SDimitry Andricdef N1Write_6c_4L    : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL]>;
18306c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 4 in
18406c3fb27SDimitry Andricdef N1Write_2c_2L_2V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitV, N1UnitV]>;
18506c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 4 in
18606c3fb27SDimitry Andricdef N1Write_3c_2L_2V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitV, N1UnitV]>;
18706c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 4 in
18806c3fb27SDimitry Andricdef N1Write_5c_2L_2V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitV, N1UnitV]>;
18906c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 4 in
19006c3fb27SDimitry Andricdef N1Write_7c_2L_2V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitV, N1UnitV]>;
19106c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 4 in
19206c3fb27SDimitry Andricdef N1Write_4c_4V    : SchedWriteRes<[N1UnitV, N1UnitV, N1UnitV, N1UnitV]>;
19306c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 4 in
19406c3fb27SDimitry Andricdef N1Write_6c_4V0   : SchedWriteRes<[N1UnitV0, N1UnitV0, N1UnitV0, N1UnitV0]>;
19506c3fb27SDimitry Andric
19606c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
19706c3fb27SDimitry Andric// Define generic 5 micro-op types
19806c3fb27SDimitry Andric
19906c3fb27SDimitry Andriclet Latency = 3, NumMicroOps = 5 in
20006c3fb27SDimitry Andricdef N1Write_3c_2L_3V : SchedWriteRes<[N1UnitL, N1UnitL,
20106c3fb27SDimitry Andric                                      N1UnitV, N1UnitV, N1UnitV]>;
20206c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 5 in
20306c3fb27SDimitry Andricdef N1Write_7c_2L_3V : SchedWriteRes<[N1UnitL, N1UnitL,
20406c3fb27SDimitry Andric                                      N1UnitV, N1UnitV, N1UnitV]>;
20506c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 5 in
20606c3fb27SDimitry Andricdef N1Write_6c_5V    : SchedWriteRes<[N1UnitV, N1UnitV, N1UnitV, N1UnitV, N1UnitV]>;
20706c3fb27SDimitry Andric
20806c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
20906c3fb27SDimitry Andric// Define generic 6 micro-op types
21006c3fb27SDimitry Andric
21106c3fb27SDimitry Andriclet Latency = 3, NumMicroOps = 6 in
21206c3fb27SDimitry Andricdef N1Write_3c_4L_2V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL,
21306c3fb27SDimitry Andric                                      N1UnitV, N1UnitV]>;
21406c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 6 in
21506c3fb27SDimitry Andricdef N1Write_4c_3L_3V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL,
21606c3fb27SDimitry Andric                                      N1UnitV, N1UnitV, N1UnitV]>;
21706c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 6 in
21806c3fb27SDimitry Andricdef N1Write_5c_3L_3V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL,
21906c3fb27SDimitry Andric                                      N1UnitV, N1UnitV, N1UnitV]>;
22006c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 6 in
22106c3fb27SDimitry Andricdef N1Write_6c_3L_3V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL,
22206c3fb27SDimitry Andric                                      N1UnitV, N1UnitV, N1UnitV]>;
22306c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 6 in
22406c3fb27SDimitry Andricdef N1Write_7c_3L_3V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL,
22506c3fb27SDimitry Andric                                      N1UnitV, N1UnitV, N1UnitV]>;
22606c3fb27SDimitry Andriclet Latency = 8, NumMicroOps = 6 in
22706c3fb27SDimitry Andricdef N1Write_8c_3L_3V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL,
22806c3fb27SDimitry Andric                                      N1UnitV, N1UnitV, N1UnitV]>;
22906c3fb27SDimitry Andric
23006c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
23106c3fb27SDimitry Andric// Define generic 7 micro-op types
23206c3fb27SDimitry Andric
23306c3fb27SDimitry Andriclet Latency = 8, NumMicroOps = 7 in
23406c3fb27SDimitry Andricdef N1Write_8c_3L_4V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL,
23506c3fb27SDimitry Andric                                      N1UnitV, N1UnitV, N1UnitV, N1UnitV]>;
23606c3fb27SDimitry Andric
23706c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
23806c3fb27SDimitry Andric// Define generic 8 micro-op types
23906c3fb27SDimitry Andric
24006c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 8 in
24106c3fb27SDimitry Andricdef N1Write_5c_4L_4V  : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL,
24206c3fb27SDimitry Andric                                       N1UnitV, N1UnitV, N1UnitV, N1UnitV]>;
24306c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 8 in
24406c3fb27SDimitry Andricdef N1Write_6c_4L_4V  : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL,
24506c3fb27SDimitry Andric                                       N1UnitV, N1UnitV, N1UnitV, N1UnitV]>;
24606c3fb27SDimitry Andriclet Latency = 8, NumMicroOps = 8 in
24706c3fb27SDimitry Andricdef N1Write_8c_4L_4V  : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL,
24806c3fb27SDimitry Andric                                       N1UnitV, N1UnitV, N1UnitV, N1UnitV]>;
24906c3fb27SDimitry Andriclet Latency = 10, NumMicroOps = 8 in
25006c3fb27SDimitry Andricdef N1Write_10c_4L_4V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL,
25106c3fb27SDimitry Andric                                       N1UnitV, N1UnitV, N1UnitV, N1UnitV]>;
25206c3fb27SDimitry Andric
25306c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
25406c3fb27SDimitry Andric// Define generic 12 micro-op types
25506c3fb27SDimitry Andric
25606c3fb27SDimitry Andriclet Latency = 9, NumMicroOps = 12 in
25706c3fb27SDimitry Andricdef N1Write_9c_6L_6V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL,
25806c3fb27SDimitry Andric                                      N1UnitL, N1UnitL, N1UnitL,
25906c3fb27SDimitry Andric                                      N1UnitV, N1UnitV, N1UnitV,
26006c3fb27SDimitry Andric                                      N1UnitV, N1UnitV, N1UnitV]>;
26106c3fb27SDimitry Andric
26206c3fb27SDimitry Andric
26306c3fb27SDimitry Andric// Miscellaneous Instructions
26406c3fb27SDimitry Andric// -----------------------------------------------------------------------------
26506c3fb27SDimitry Andric
26606c3fb27SDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>;
26706c3fb27SDimitry Andric
26806c3fb27SDimitry Andric// Convert floating-point condition flags
26906c3fb27SDimitry Andric// Flag manipulation instructions
27006c3fb27SDimitry Andricdef : WriteRes<WriteSys, []> { let Latency = 1; }
27106c3fb27SDimitry Andric
27206c3fb27SDimitry Andric
27306c3fb27SDimitry Andric// Branch Instructions
27406c3fb27SDimitry Andric// -----------------------------------------------------------------------------
27506c3fb27SDimitry Andric
27606c3fb27SDimitry Andric// Branch, immed
27706c3fb27SDimitry Andric// Compare and branch
27806c3fb27SDimitry Andricdef : SchedAlias<WriteBr, N1Write_1c_1B>;
27906c3fb27SDimitry Andric
28006c3fb27SDimitry Andric// Branch, register
28106c3fb27SDimitry Andricdef : SchedAlias<WriteBrReg, N1Write_1c_1B>;
28206c3fb27SDimitry Andric
28306c3fb27SDimitry Andric// Branch and link, immed
28406c3fb27SDimitry Andric// Branch and link, register
28506c3fb27SDimitry Andricdef : InstRW<[N1Write_1c_1B_1I], (instrs BL, BLR)>;
28606c3fb27SDimitry Andric
28706c3fb27SDimitry Andric// Compare and branch
28806c3fb27SDimitry Andricdef : InstRW<[N1Write_1c_1B], (instregex "^[CT]BN?Z[XW]$")>;
28906c3fb27SDimitry Andric
29006c3fb27SDimitry Andric
29106c3fb27SDimitry Andric// Arithmetic and Logical Instructions
29206c3fb27SDimitry Andric// -----------------------------------------------------------------------------
29306c3fb27SDimitry Andric
29406c3fb27SDimitry Andric// ALU, basic
29506c3fb27SDimitry Andric// ALU, basic, flagset
29606c3fb27SDimitry Andric// Conditional compare
29706c3fb27SDimitry Andric// Conditional select
29806c3fb27SDimitry Andric// Logical, basic
29906c3fb27SDimitry Andric// Address generation
30006c3fb27SDimitry Andric// Count leading
30106c3fb27SDimitry Andric// Reverse bits/bytes
30206c3fb27SDimitry Andric// Move immediate
30306c3fb27SDimitry Andricdef : SchedAlias<WriteI, N1Write_1c_1I>;
30406c3fb27SDimitry Andric
30506c3fb27SDimitry Andric// ALU, extend and shift
30606c3fb27SDimitry Andricdef : SchedAlias<WriteIEReg, N1Write_2c_1M>;
30706c3fb27SDimitry Andric
30806c3fb27SDimitry Andric// Arithmetic, LSL shift, shift <= 4
30906c3fb27SDimitry Andric// Arithmetic, flagset, LSL shift, shift <= 4
31006c3fb27SDimitry Andric// Arithmetic, LSR/ASR/ROR shift or LSL shift > 4
31106c3fb27SDimitry Andricdef N1WriteISReg : SchedWriteVariant<[
31206c3fb27SDimitry Andric                     SchedVar<IsCheapLSL,  [N1Write_1c_1I]>,
31306c3fb27SDimitry Andric                     SchedVar<NoSchedPred, [N1Write_2c_1M]>]>;
31406c3fb27SDimitry Andricdef              : SchedAlias<WriteISReg, N1WriteISReg>;
31506c3fb27SDimitry Andric
31606c3fb27SDimitry Andric// Logical, shift, no flagset
31706c3fb27SDimitry Andricdef : InstRW<[N1Write_1c_1I],
31806c3fb27SDimitry Andric             (instregex "^(AND|BIC|EON|EOR|ORN|ORR)[WX]rs$")>;
31906c3fb27SDimitry Andric
32006c3fb27SDimitry Andric// Logical, shift, flagset
32106c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1M], (instregex "^(AND|BIC)S[WX]rs$")>;
32206c3fb27SDimitry Andric
32306c3fb27SDimitry Andric
32406c3fb27SDimitry Andric// Divide and multiply instructions
32506c3fb27SDimitry Andric// -----------------------------------------------------------------------------
32606c3fb27SDimitry Andric
32706c3fb27SDimitry Andric// Divide
32806c3fb27SDimitry Andricdef : SchedAlias<WriteID32, N1Write_12c5_1M>;
32906c3fb27SDimitry Andricdef : SchedAlias<WriteID64, N1Write_20c5_1M>;
33006c3fb27SDimitry Andric
33106c3fb27SDimitry Andric// Multiply accumulate
33206c3fb27SDimitry Andric// Multiply accumulate, long
33306c3fb27SDimitry Andricdef : SchedAlias<WriteIM32, N1Write_2c_1M>;
33406c3fb27SDimitry Andricdef : SchedAlias<WriteIM64, N1Write_4c3_1M>;
33506c3fb27SDimitry Andric
33606c3fb27SDimitry Andric// Multiply high
33706c3fb27SDimitry Andricdef : InstRW<[N1Write_5c3_1M, ReadIM, ReadIM], (instrs SMULHrr, UMULHrr)>;
33806c3fb27SDimitry Andric
33906c3fb27SDimitry Andric
34006c3fb27SDimitry Andric// Miscellaneous data-processing instructions
34106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
34206c3fb27SDimitry Andric
34306c3fb27SDimitry Andric// Bitfield extract, one reg
34406c3fb27SDimitry Andric// Bitfield extract, two regs
34506c3fb27SDimitry Andricdef N1WriteExtr : SchedWriteVariant<[
34606c3fb27SDimitry Andric                    SchedVar<IsRORImmIdiomPred, [N1Write_1c_1I]>,
34706c3fb27SDimitry Andric                    SchedVar<NoSchedPred,       [N1Write_3c_1I_1M]>]>;
34806c3fb27SDimitry Andricdef : SchedAlias<WriteExtr, N1WriteExtr>;
34906c3fb27SDimitry Andric
35006c3fb27SDimitry Andric// Bitfield move, basic
35106c3fb27SDimitry Andric// Variable shift
35206c3fb27SDimitry Andricdef : SchedAlias<WriteIS, N1Write_1c_1I>;
35306c3fb27SDimitry Andric
35406c3fb27SDimitry Andric// Bitfield move, insert
35506c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1M], (instregex "^BFM[WX]ri$")>;
35606c3fb27SDimitry Andric
35706c3fb27SDimitry Andric// Move immediate
35806c3fb27SDimitry Andricdef : SchedAlias<WriteImm, N1Write_1c_1I>;
35906c3fb27SDimitry Andric
36006c3fb27SDimitry Andric// Load instructions
36106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
36206c3fb27SDimitry Andric
36306c3fb27SDimitry Andric// Load register, immed offset
36406c3fb27SDimitry Andricdef : SchedAlias<WriteLD, N1Write_4c_1L>;
36506c3fb27SDimitry Andric
36606c3fb27SDimitry Andric// Load register, immed offset, index
36706c3fb27SDimitry Andricdef : SchedAlias<WriteLDIdx, N1Write_4c_1L>;
36806c3fb27SDimitry Andricdef : SchedAlias<WriteAdr,   N1Write_1c_1I>;
36906c3fb27SDimitry Andric
37006c3fb27SDimitry Andric// Load pair, immed offset
37106c3fb27SDimitry Andricdef : SchedAlias<WriteLDHi, N1Write_4c_1L>;
37206c3fb27SDimitry Andric
37306c3fb27SDimitry Andric// Load pair, immed offset, W-form
37406c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1L, N1Write_0c_0Z], (instrs LDPWi, LDNPWi)>;
37506c3fb27SDimitry Andric
37606c3fb27SDimitry Andric// Load pair, signed immed offset, signed words
37706c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1I_1L, N1Write_0c_0Z], (instrs LDPSWi)>;
37806c3fb27SDimitry Andric
37906c3fb27SDimitry Andric// Load pair, immed post or pre-index, signed words
3805f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_1I_1L, N1Write_0c_0Z],
38106c3fb27SDimitry Andric             (instrs LDPSWpost, LDPSWpre)>;
38206c3fb27SDimitry Andric
38306c3fb27SDimitry Andric
38406c3fb27SDimitry Andric// Store instructions
38506c3fb27SDimitry Andric// -----------------------------------------------------------------------------
38606c3fb27SDimitry Andric
38706c3fb27SDimitry Andric// Store register, immed offset
38806c3fb27SDimitry Andricdef : SchedAlias<WriteST, N1Write_1c_1L_1D>;
38906c3fb27SDimitry Andric
39006c3fb27SDimitry Andric// Store register, immed offset, index
39106c3fb27SDimitry Andricdef : SchedAlias<WriteSTIdx, N1Write_1c_1L_1D>;
39206c3fb27SDimitry Andric
39306c3fb27SDimitry Andric// Store pair, immed offset
39406c3fb27SDimitry Andricdef : SchedAlias<WriteSTP, N1Write_1c_2L_1D>;
39506c3fb27SDimitry Andric
39606c3fb27SDimitry Andric// Store pair, immed offset, W-form
39706c3fb27SDimitry Andricdef : InstRW<[N1Write_1c_1L_1D], (instrs STPWi)>;
39806c3fb27SDimitry Andric
39906c3fb27SDimitry Andric
40006c3fb27SDimitry Andric// FP data processing instructions
40106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
40206c3fb27SDimitry Andric
40306c3fb27SDimitry Andric// FP absolute value
40406c3fb27SDimitry Andric// FP arithmetic
40506c3fb27SDimitry Andric// FP min/max
40606c3fb27SDimitry Andric// FP negate
40706c3fb27SDimitry Andric// FP select
40806c3fb27SDimitry Andricdef : SchedAlias<WriteF, N1Write_2c_1V>;
40906c3fb27SDimitry Andric
41006c3fb27SDimitry Andric// FP compare
41106c3fb27SDimitry Andricdef : SchedAlias<WriteFCmp, N1Write_2c_1V0>;
41206c3fb27SDimitry Andric
41306c3fb27SDimitry Andric// FP divide
41406c3fb27SDimitry Andric// FP square root
41506c3fb27SDimitry Andricdef : SchedAlias<WriteFDiv, N1Write_10c7_1V0>;
41606c3fb27SDimitry Andric
41706c3fb27SDimitry Andric// FP divide, H-form
41806c3fb27SDimitry Andric// FP square root, H-form
41906c3fb27SDimitry Andricdef : InstRW<[N1Write_7c7_1V0], (instrs FDIVHrr, FSQRTHr)>;
42006c3fb27SDimitry Andric
42106c3fb27SDimitry Andric// FP divide, S-form
42206c3fb27SDimitry Andric// FP square root, S-form
42306c3fb27SDimitry Andricdef : InstRW<[N1Write_10c7_1V0], (instrs FDIVSrr, FSQRTSr)>;
42406c3fb27SDimitry Andric
42506c3fb27SDimitry Andric// FP divide, D-form
42606c3fb27SDimitry Andricdef : InstRW<[N1Write_15c7_1V0], (instrs FDIVDrr)>;
42706c3fb27SDimitry Andric
42806c3fb27SDimitry Andric// FP square root, D-form
42906c3fb27SDimitry Andricdef : InstRW<[N1Write_17c7_1V0], (instrs FSQRTDr)>;
43006c3fb27SDimitry Andric
43106c3fb27SDimitry Andric// FP multiply
43206c3fb27SDimitry Andricdef : SchedAlias<WriteFMul, N1Write_3c_1V>;
43306c3fb27SDimitry Andric
43406c3fb27SDimitry Andric// FP multiply accumulate
43506c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V], (instregex "^FN?M(ADD|SUB)[HSD]rrr$")>;
43606c3fb27SDimitry Andric
43706c3fb27SDimitry Andric// FP round to integral
43806c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instregex "^FRINT[AIMNPXZ][HSD]r$",
43906c3fb27SDimitry Andric                                          "^FRINT(32|64)[XZ][SD]r$")>;
44006c3fb27SDimitry Andric
44106c3fb27SDimitry Andric
44206c3fb27SDimitry Andric// FP miscellaneous instructions
44306c3fb27SDimitry Andric// -----------------------------------------------------------------------------
44406c3fb27SDimitry Andric
44506c3fb27SDimitry Andric// FP convert, from vec to vec reg
44606c3fb27SDimitry Andric// FP convert, Javascript from vec to gen reg
44706c3fb27SDimitry Andricdef : SchedAlias<WriteFCvt, N1Write_3c_1V>;
44806c3fb27SDimitry Andric
44906c3fb27SDimitry Andric// FP convert, from gen to vec reg
45006c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_1M_1V0], (instregex "^[SU]CVTF[SU][WX][HSD]ri$")>;
45106c3fb27SDimitry Andric
45206c3fb27SDimitry Andric// FP convert, from vec to gen reg
45306c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V0_1V1], (instregex "^FCVT[AMNPZ][SU][SU][WX][HSD]r$")>;
45406c3fb27SDimitry Andric
45506c3fb27SDimitry Andric// FP move, immed
45606c3fb27SDimitry Andricdef : SchedAlias<WriteFImm, N1Write_2c_1V>;
45706c3fb27SDimitry Andric
45806c3fb27SDimitry Andric// FP move, register
45906c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1V], (instrs FMOVHr, FMOVSr, FMOVDr)>;
46006c3fb27SDimitry Andric
46106c3fb27SDimitry Andric// FP transfer, from gen to low half of vec reg
46206c3fb27SDimitry Andric// FP transfer, from gen to high half of vec reg
46306c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1M], (instrs FMOVWHr, FMOVXHr, FMOVWSr, FMOVXDr,
46406c3fb27SDimitry Andric                                      FMOVXDHighr)>;
46506c3fb27SDimitry Andric
46606c3fb27SDimitry Andric// FP transfer, from vec to gen reg
46706c3fb27SDimitry Andricdef : SchedAlias<WriteFCopy, N1Write_2c_1V1>;
46806c3fb27SDimitry Andric
46906c3fb27SDimitry Andric
47006c3fb27SDimitry Andric// FP load instructions
47106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
47206c3fb27SDimitry Andric
47306c3fb27SDimitry Andric// Load vector reg, literal, S/D/Q forms
47406c3fb27SDimitry Andric// Load vector reg, unscaled immed
47506c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1L, ReadAdrBase], (instregex "^LDR[SDQ]l$",
47606c3fb27SDimitry Andric                                                      "^LDUR[BHSDQ]i$")>;
47706c3fb27SDimitry Andric
47806c3fb27SDimitry Andric// Load vector reg, immed post-index
47906c3fb27SDimitry Andric// Load vector reg, immed pre-index
4805f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_1L],
48106c3fb27SDimitry Andric             (instregex "^LDR[BHSDQ](post|pre)$")>;
48206c3fb27SDimitry Andric
48306c3fb27SDimitry Andric// Load vector reg, unsigned immed
48406c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1I_1L], (instregex "^LDR[BHSDQ]ui$")>;
48506c3fb27SDimitry Andric
48606c3fb27SDimitry Andric// Load vector reg, register offset, basic
48706c3fb27SDimitry Andric// Load vector reg, register offset, scale, S/D-form
48806c3fb27SDimitry Andric// Load vector reg, register offset, extend
48906c3fb27SDimitry Andric// Load vector reg, register offset, extend, scale, S/D-form
49006c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1I_1L, ReadAdrBase], (instregex "^LDR[BSD]ro[WX]$")>;
49106c3fb27SDimitry Andric
49206c3fb27SDimitry Andric// Load vector reg, register offset, scale, H/Q-form
49306c3fb27SDimitry Andric// Load vector reg, register offset, extend, scale, H/Q-form
49406c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_1I_1L, ReadAdrBase], (instregex "^LDR[HQ]ro[WX]$")>;
49506c3fb27SDimitry Andric
49606c3fb27SDimitry Andric// Load vector pair, immed offset, S/D-form
49706c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1I_1L, WriteLDHi], (instregex "^LDN?P[SD]i$")>;
49806c3fb27SDimitry Andric
49906c3fb27SDimitry Andric// Load vector pair, immed offset, H/Q-form
50006c3fb27SDimitry Andricdef : InstRW<[N1Write_7c_1I_1L, WriteLDHi], (instregex "^LDPN?[HQ]i$")>;
50106c3fb27SDimitry Andric
50206c3fb27SDimitry Andric// Load vector pair, immed post-index, S/D-form
50306c3fb27SDimitry Andric// Load vector pair, immed pre-index, S/D-form
5045f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_1L, WriteLDHi],
50506c3fb27SDimitry Andric             (instregex "^LDP[SD](pre|post)$")>;
50606c3fb27SDimitry Andric
50706c3fb27SDimitry Andric// Load vector pair, immed post-index, Q-form
50806c3fb27SDimitry Andric// Load vector pair, immed pre-index, Q-form
5095f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_7c_1L, WriteLDHi],
51006c3fb27SDimitry Andric             (instrs LDPQpost, LDPQpre)>;
51106c3fb27SDimitry Andric
51206c3fb27SDimitry Andric
51306c3fb27SDimitry Andric// FP store instructions
51406c3fb27SDimitry Andric// -----------------------------------------------------------------------------
51506c3fb27SDimitry Andric
51606c3fb27SDimitry Andric// Store vector reg, unscaled immed, B/H/S/D-form
51706c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1I_1L], (instregex "^STUR[BHSD]i$")>;
51806c3fb27SDimitry Andric
51906c3fb27SDimitry Andric// Store vector reg, unscaled immed, Q-form
52006c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_2I_2L], (instrs STURQi)>;
52106c3fb27SDimitry Andric
52206c3fb27SDimitry Andric// Store vector reg, immed post-index, B/H/S/D-form
52306c3fb27SDimitry Andric// Store vector reg, immed pre-index, B/H/S/D-form
5245f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_1L_1V], (instregex "^STR[BHSD](pre|post)$")>;
52506c3fb27SDimitry Andric
52606c3fb27SDimitry Andric// Store vector reg, immed pre-index, Q-form
52706c3fb27SDimitry Andric// Store vector reg, immed post-index, Q-form
5285f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_2L_2V], (instrs STRQpre, STRQpost)>;
52906c3fb27SDimitry Andric
53006c3fb27SDimitry Andric// Store vector reg, unsigned immed, B/H/S/D-form
53106c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_1V], (instregex "^STR[BHSD]ui$")>;
53206c3fb27SDimitry Andric
53306c3fb27SDimitry Andric// Store vector reg, unsigned immed, Q-form
53406c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_2L_2V], (instrs STRQui)>;
53506c3fb27SDimitry Andric
53606c3fb27SDimitry Andric// Store vector reg, register offset, basic, B/S/D-form
53706c3fb27SDimitry Andric// Store vector reg, register offset, scale, B/S/D-form
53806c3fb27SDimitry Andric// Store vector reg, register offset, extend, B/S/D-form
53906c3fb27SDimitry Andric// Store vector reg, register offset, extend, scale, B/S/D-form
54006c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_1V, ReadAdrBase], (instregex "^STR[BSD]ro[WX]$")>;
54106c3fb27SDimitry Andric
54206c3fb27SDimitry Andric// Store vector reg, register offset, basic, H-form
54306c3fb27SDimitry Andric// Store vector reg, register offset, scale, H-form
54406c3fb27SDimitry Andric// Store vector reg, register offset, extend, H-form
54506c3fb27SDimitry Andric// Store vector reg, register offset, extend, scale, H-form
54606c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1I_1L_1V, ReadAdrBase], (instregex "^STRHro[WX]$")>;
54706c3fb27SDimitry Andric
54806c3fb27SDimitry Andric// Store vector reg, register offset, basic, Q-form
54906c3fb27SDimitry Andric// Store vector reg, register offset, scale, Q-form
55006c3fb27SDimitry Andric// Store vector reg, register offset, extend, Q-form
55106c3fb27SDimitry Andric// Store vector reg, register offset, extend, scale, Q-form
55206c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_2L_2V, ReadAdrBase], (instregex "^STRQro[WX]$")>;
55306c3fb27SDimitry Andric
55406c3fb27SDimitry Andric// Store vector pair, immed offset, S-form
55506c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_1V], (instrs STPSi, STNPSi)>;
55606c3fb27SDimitry Andric
55706c3fb27SDimitry Andric// Store vector pair, immed offset, D-form
55806c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_2L_2V], (instrs STPDi, STNPDi)>;
55906c3fb27SDimitry Andric
56006c3fb27SDimitry Andric// Store vector pair, immed offset, Q-form
56106c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_4L_2V], (instrs STPQi, STNPQi)>;
56206c3fb27SDimitry Andric
56306c3fb27SDimitry Andric// Store vector pair, immed post-index, S-form
56406c3fb27SDimitry Andric// Store vector pair, immed pre-index, S-form
5655f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_1L_1V], (instrs STPSpre, STPSpost)>;
56606c3fb27SDimitry Andric
56706c3fb27SDimitry Andric// Store vector pair, immed post-index, D-form
56806c3fb27SDimitry Andric// Store vector pair, immed pre-index, D-form
5695f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_2L_2V], (instrs STPDpre, STPDpost)>;
57006c3fb27SDimitry Andric
57106c3fb27SDimitry Andric// Store vector pair, immed post-index, Q-form
57206c3fb27SDimitry Andric// Store vector pair, immed pre-index, Q-form
5735f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_3c_4L_2V], (instrs STPQpre, STPQpost)>;
57406c3fb27SDimitry Andric
57506c3fb27SDimitry Andric
57606c3fb27SDimitry Andric// ASIMD integer instructions
57706c3fb27SDimitry Andric// -----------------------------------------------------------------------------
57806c3fb27SDimitry Andric
57906c3fb27SDimitry Andric// ASIMD absolute diff
58006c3fb27SDimitry Andric// ASIMD absolute diff long
58106c3fb27SDimitry Andric// ASIMD arith, basic
58206c3fb27SDimitry Andric// ASIMD arith, complex
58306c3fb27SDimitry Andric// ASIMD arith, pair-wise
58406c3fb27SDimitry Andric// ASIMD compare
58506c3fb27SDimitry Andric// ASIMD logical
58606c3fb27SDimitry Andric// ASIMD max/min, basic and pair-wise
58706c3fb27SDimitry Andricdef : SchedAlias<WriteVd, N1Write_2c_1V>;
58806c3fb27SDimitry Andricdef : SchedAlias<WriteVq, N1Write_2c_1V>;
58906c3fb27SDimitry Andric
59006c3fb27SDimitry Andric// ASIMD absolute diff accum
59106c3fb27SDimitry Andric// ASIMD absolute diff accum long
59206c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V1], (instregex "^[SU]ABAL?v")>;
59306c3fb27SDimitry Andric
59406c3fb27SDimitry Andric// ASIMD arith, reduce, 4H/4S
59506c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V1], (instregex "^(ADDV|[SU]ADDLV)v4(i16|i32)v$")>;
59606c3fb27SDimitry Andric
59706c3fb27SDimitry Andric// ASIMD arith, reduce, 8B/8H
59806c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1V1_1V], (instregex "^(ADDV|[SU]ADDLV)v8(i8|i16)v$")>;
59906c3fb27SDimitry Andric
60006c3fb27SDimitry Andric// ASIMD arith, reduce, 16B
60106c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_2V1], (instregex "^(ADDV|[SU]ADDLV)v16i8v$")>;
60206c3fb27SDimitry Andric
60306c3fb27SDimitry Andric// ASIMD max/min, reduce, 4H/4S
60406c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V1], (instregex "^[SU](MAX|MIN)Vv4(i16|i32)v$")>;
60506c3fb27SDimitry Andric
60606c3fb27SDimitry Andric// ASIMD max/min, reduce, 8B/8H
60706c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1V1_1V], (instregex "^[SU](MAX|MIN)Vv8(i8|i16)v$")>;
60806c3fb27SDimitry Andric
60906c3fb27SDimitry Andric// ASIMD max/min, reduce, 16B
61006c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_2V1], (instregex "[SU](MAX|MIN)Vv16i8v$")>;
61106c3fb27SDimitry Andric
61206c3fb27SDimitry Andric// ASIMD multiply, D-form
61306c3fb27SDimitry Andric// ASIMD multiply accumulate, D-form
61406c3fb27SDimitry Andric// ASIMD multiply accumulate high, D-form
61506c3fb27SDimitry Andric// ASIMD multiply accumulate saturating long
61606c3fb27SDimitry Andric// ASIMD multiply long
61706c3fb27SDimitry Andric// ASIMD multiply accumulate long
61806c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V0], (instregex "^MUL(v[14]i16|v[12]i32)$",
61906c3fb27SDimitry Andric                                          "^ML[AS](v[14]i16|v[12]i32)$",
62006c3fb27SDimitry Andric                                          "^SQ(R)?DMULH(v[14]i16|v[12]i32)$",
62106c3fb27SDimitry Andric                                          "^SQRDML[AS]H(v[14]i16|v[12]i32)$",
62206c3fb27SDimitry Andric                                          "^SQDML[AS]Lv",
62306c3fb27SDimitry Andric                                          "^([SU]|SQD)MULLv",
62406c3fb27SDimitry Andric                                          "^[SU]ML[AS]Lv")>;
62506c3fb27SDimitry Andric
62606c3fb27SDimitry Andric// ASIMD multiply, Q-form
62706c3fb27SDimitry Andric// ASIMD multiply accumulate, Q-form
62806c3fb27SDimitry Andric// ASIMD multiply accumulate high, Q-form
62906c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_2V0], (instregex "^MUL(v8i16|v4i32)$",
63006c3fb27SDimitry Andric                                          "^ML[AS](v8i16|v4i32)$",
63106c3fb27SDimitry Andric                                          "^SQ(R)?DMULH(v8i16|v4i32)$",
63206c3fb27SDimitry Andric                                          "^SQRDML[AS]H(v8i16|v4i32)$")>;
63306c3fb27SDimitry Andric
63406c3fb27SDimitry Andric// ASIMD multiply/multiply long (8x8) polynomial, D-form
63506c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instrs PMULv8i8, PMULLv8i8)>;
63606c3fb27SDimitry Andric
63706c3fb27SDimitry Andric// ASIMD multiply/multiply long (8x8) polynomial, Q-form
63806c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instrs PMULv16i8, PMULLv16i8)>;
63906c3fb27SDimitry Andric
64006c3fb27SDimitry Andric// ASIMD pairwise add and accumulate long
64106c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V1], (instregex "^[SU]ADALPv")>;
64206c3fb27SDimitry Andric
64306c3fb27SDimitry Andric// ASIMD shift accumulate
64406c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V1], (instregex "^[SU]R?SRAv")>;
64506c3fb27SDimitry Andric
64606c3fb27SDimitry Andric// ASIMD shift by immed, basic
64706c3fb27SDimitry Andric// ASIMD shift by immed and insert, basic
64806c3fb27SDimitry Andric// ASIMD shift by register, basic
64906c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1V1], (instregex "^SHLL?v", "^SHRNv", "^[SU]SHLLv",
65006c3fb27SDimitry Andric                                          "^[SU]SHRv", "^S[LR]Iv", "^[SU]SHLv")>;
65106c3fb27SDimitry Andric
65206c3fb27SDimitry Andric// ASIMD shift by immed, complex
65306c3fb27SDimitry Andric// ASIMD shift by register, complex
65406c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V1],
65506c3fb27SDimitry Andric             (instregex "^RSHRNv", "^SQRSHRU?Nv", "^(SQSHLU?|UQSHL)[bhsd]$",
65606c3fb27SDimitry Andric                        "^(SQSHLU?|UQSHL)(v8i8|v16i8|v4i16|v8i16|v2i32|v4i32|v2i64)_shift$",
65706c3fb27SDimitry Andric                        "^SQSHU?RNv", "^[SU]RSHRv", "^UQR?SHRNv",
65806c3fb27SDimitry Andric                        "^[SU]Q?RSHLv", "^[SU]QSHLv")>;
65906c3fb27SDimitry Andric
66006c3fb27SDimitry Andric
66106c3fb27SDimitry Andric// ASIMD FP instructions
66206c3fb27SDimitry Andric// -----------------------------------------------------------------------------
66306c3fb27SDimitry Andric
66406c3fb27SDimitry Andric// ASIMD FP absolute value/difference
66506c3fb27SDimitry Andric// ASIMD FP arith, normal
66606c3fb27SDimitry Andric// ASIMD FP compare
66706c3fb27SDimitry Andric// ASIMD FP max/min, normal
66806c3fb27SDimitry Andric// ASIMD FP max/min, pairwise
66906c3fb27SDimitry Andric// ASIMD FP negate
67006c3fb27SDimitry Andric// Covered by "SchedAlias (WriteV[dq]...)" above
67106c3fb27SDimitry Andric
67206c3fb27SDimitry Andric// ASIMD FP convert, long (F16 to F32)
67306c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instregex "^FCVTL(v4|v8)i16$")>;
67406c3fb27SDimitry Andric
67506c3fb27SDimitry Andric// ASIMD FP convert, long (F32 to F64)
67606c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instregex "^FCVTL(v2|v4)i32$")>;
67706c3fb27SDimitry Andric
67806c3fb27SDimitry Andric// ASIMD FP convert, narrow (F32 to F16)
67906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instregex "^FCVTN(v4|v8)i16$")>;
68006c3fb27SDimitry Andric
68106c3fb27SDimitry Andric// ASIMD FP convert, narrow (F64 to F32)
68206c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instregex "^FCVTN(v2|v4)i32$",
68306c3fb27SDimitry Andric                                          "^FCVTXN(v2|v4)f32$")>;
68406c3fb27SDimitry Andric
68506c3fb27SDimitry Andric// ASIMD FP convert, other, D-form F32 and Q-form F64
68606c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instregex "^[FSU]CVT[AMNPZ][SU]v2f(32|64)$",
68706c3fb27SDimitry Andric                                          "^[SU]CVTFv2f(32|64)$")>;
68806c3fb27SDimitry Andric
68906c3fb27SDimitry Andric// ASIMD FP convert, other, D-form F16 and Q-form F32
69006c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instregex "^[FSU]CVT[AMNPZ][SU]v4f(16|32)$",
69106c3fb27SDimitry Andric                                          "^[SU]CVTFv4f(16|32)$")>;
69206c3fb27SDimitry Andric
69306c3fb27SDimitry Andric// ASIMD FP convert, other, Q-form F16
69406c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_4V0], (instregex "^[FSU]CVT[AMNPZ][SU]v8f16$",
69506c3fb27SDimitry Andric                                          "^[SU]CVTFv8f16$")>;
69606c3fb27SDimitry Andric
69706c3fb27SDimitry Andric// ASIMD FP divide, D-form, F16
69806c3fb27SDimitry Andric// ASIMD FP square root, D-form, F16
69906c3fb27SDimitry Andricdef : InstRW<[N1Write_7c7_1V0], (instrs FDIVv4f16, FSQRTv4f16)>;
70006c3fb27SDimitry Andric
70106c3fb27SDimitry Andric// ASIMD FP divide, D-form, F32
70206c3fb27SDimitry Andric// ASIMD FP square root, D-form, F32
70306c3fb27SDimitry Andricdef : InstRW<[N1Write_10c7_1V0], (instrs FDIVv2f32, FSQRTv2f32)>;
70406c3fb27SDimitry Andric
70506c3fb27SDimitry Andric// ASIMD FP divide, Q-form, F16
70606c3fb27SDimitry Andric// ASIMD FP square root, Q-form, F16
70706c3fb27SDimitry Andricdef : InstRW<[N1Write_13c10_1V0], (instrs FDIVv8f16, FSQRTv8f16)>;
70806c3fb27SDimitry Andric
70906c3fb27SDimitry Andric// ASIMD FP divide, Q-form, F32
71006c3fb27SDimitry Andric// ASIMD FP square root, Q-form, F32
71106c3fb27SDimitry Andricdef : InstRW<[N1Write_10c7_1V0], (instrs FDIVv4f32, FSQRTv4f32)>;
71206c3fb27SDimitry Andric
71306c3fb27SDimitry Andric// ASIMD FP divide, Q-form, F64
71406c3fb27SDimitry Andricdef : InstRW<[N1Write_15c7_1V0], (instrs FDIVv2f64)>;
71506c3fb27SDimitry Andric
71606c3fb27SDimitry Andric// ASIMD FP square root, Q-form, F64
71706c3fb27SDimitry Andricdef : InstRW<[N1Write_17c7_1V0], (instrs FSQRTv2f64)>;
71806c3fb27SDimitry Andric
71906c3fb27SDimitry Andric// ASIMD FP max/min, reduce, F32 and D-form F16
72006c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1V], (instregex "^F(MAX|MIN)(NM)?Vv4(i16|i32)v$")>;
72106c3fb27SDimitry Andric
72206c3fb27SDimitry Andric// ASIMD FP max/min, reduce, Q-form F16
72306c3fb27SDimitry Andricdef : InstRW<[N1Write_8c_3V], (instregex "^F(MAX|MIN)(NM)?Vv8i16v$")>;
72406c3fb27SDimitry Andric
72506c3fb27SDimitry Andric// ASIMD FP multiply
72606c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V], (instregex "^FMULX?v")>;
72706c3fb27SDimitry Andric
72806c3fb27SDimitry Andric// ASIMD FP multiply accumulate
72906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V], (instregex "^FML[AS]v")>;
73006c3fb27SDimitry Andric
73106c3fb27SDimitry Andric// ASIMD FP multiply accumulate long
73206c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1V], (instregex "^FML[AS]L2?v")>;
73306c3fb27SDimitry Andric
73406c3fb27SDimitry Andric// ASIMD FP round, D-form F32 and Q-form F64
73506c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instregex "^FRINT[AIMNPXZ]v2f(32|64)$")>;
73606c3fb27SDimitry Andric
73706c3fb27SDimitry Andric// ASIMD FP round, D-form F16 and Q-form F32
73806c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instregex "^FRINT[AIMNPXZ]v4f(16|32)$")>;
73906c3fb27SDimitry Andric
74006c3fb27SDimitry Andric// ASIMD FP round, Q-form F16
74106c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_4V0], (instregex "^FRINT[AIMNPXZ]v8f16$")>;
74206c3fb27SDimitry Andric
74306c3fb27SDimitry Andric
74406c3fb27SDimitry Andric// ASIMD miscellaneous instructions
74506c3fb27SDimitry Andric// -----------------------------------------------------------------------------
74606c3fb27SDimitry Andric
74706c3fb27SDimitry Andric// ASIMD bit reverse
74806c3fb27SDimitry Andric// ASIMD bitwise insert
74906c3fb27SDimitry Andric// ASIMD count
75006c3fb27SDimitry Andric// ASIMD duplicate, element
75106c3fb27SDimitry Andric// ASIMD extract
75206c3fb27SDimitry Andric// ASIMD extract narrow
75306c3fb27SDimitry Andric// ASIMD insert, element to element
75406c3fb27SDimitry Andric// ASIMD move, FP immed
75506c3fb27SDimitry Andric// ASIMD move, integer immed
75606c3fb27SDimitry Andric// ASIMD reverse
75706c3fb27SDimitry Andric// ASIMD table lookup, 1 or 2 table regs
75806c3fb27SDimitry Andric// ASIMD table lookup extension, 1 table reg
75906c3fb27SDimitry Andric// ASIMD transfer, element to gen reg
76006c3fb27SDimitry Andric// ASIMD transpose
76106c3fb27SDimitry Andric// ASIMD unzip/zip
76206c3fb27SDimitry Andric// Covered by "SchedAlias (WriteV[dq]...)" above
76306c3fb27SDimitry Andric
76406c3fb27SDimitry Andric// ASIMD duplicate, gen reg
76506c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1M],
76606c3fb27SDimitry Andric             (instregex "^DUP((v16|v8)i8|(v8|v4)i16|(v4|v2)i32|v2i64)gpr$")>;
76706c3fb27SDimitry Andric
76806c3fb27SDimitry Andric// ASIMD extract narrow, saturating
76906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V1], (instregex "^[SU]QXTNv", "^SQXTUNv")>;
77006c3fb27SDimitry Andric
77106c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, D-form F32 and F64
77206c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instrs FRECPEv1i32, FRECPEv2f32, FRECPEv1i64,
77306c3fb27SDimitry Andric                                       FRECPXv1i32, FRECPXv1i64,
77406c3fb27SDimitry Andric                                       URECPEv2i32,
77506c3fb27SDimitry Andric                                       FRSQRTEv1i32, FRSQRTEv2f32, FRSQRTEv1i64,
77606c3fb27SDimitry Andric                                       URSQRTEv2i32)>;
77706c3fb27SDimitry Andric
77806c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, D-form F16 and Q-form F32
77906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instrs FRECPEv1f16, FRECPEv4f16, FRECPEv4f32,
78006c3fb27SDimitry Andric                                       FRECPXv1f16,
78106c3fb27SDimitry Andric                                       URECPEv4i32,
78206c3fb27SDimitry Andric                                       FRSQRTEv1f16, FRSQRTEv4f16, FRSQRTEv4f32,
78306c3fb27SDimitry Andric                                       URSQRTEv4i32)>;
78406c3fb27SDimitry Andric
78506c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, Q-form F16
78606c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_4V0], (instrs FRECPEv8f16,
78706c3fb27SDimitry Andric                                       FRSQRTEv8f16)>;
78806c3fb27SDimitry Andric
78906c3fb27SDimitry Andric// ASIMD reciprocal step
79006c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V], (instregex "^FRECPS(16|32|64)$", "^FRECPSv",
79106c3fb27SDimitry Andric                                         "^FRSQRTS(16|32|64)$", "^FRSQRTSv")>;
79206c3fb27SDimitry Andric
79306c3fb27SDimitry Andric// ASIMD table lookup, 3 table regs
79406c3fb27SDimitry Andric// ASIMD table lookup extension, 2 table reg
79506c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_4V], (instrs TBLv8i8Three, TBLv16i8Three,
79606c3fb27SDimitry Andric                                      TBXv8i8Two, TBXv16i8Two)>;
79706c3fb27SDimitry Andric
79806c3fb27SDimitry Andric// ASIMD table lookup, 4 table regs
79906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_3V], (instrs TBLv8i8Four, TBLv16i8Four)>;
80006c3fb27SDimitry Andric
80106c3fb27SDimitry Andric// ASIMD table lookup extension, 3 table reg
80206c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_3V], (instrs TBXv8i8Three, TBXv16i8Three)>;
80306c3fb27SDimitry Andric
80406c3fb27SDimitry Andric// ASIMD table lookup extension, 4 table reg
80506c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_5V], (instrs TBXv8i8Four, TBXv16i8Four)>;
80606c3fb27SDimitry Andric
80706c3fb27SDimitry Andric// ASIMD transfer, element to gen reg
80806c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1V1], (instregex "^SMOVvi(((8|16)to(32|64))|32to64)$",
80906c3fb27SDimitry Andric                                          "^UMOVvi(8|16|32|64)$")>;
81006c3fb27SDimitry Andric
81106c3fb27SDimitry Andric// ASIMD transfer, gen reg to element
81206c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1M_1V], (instregex "^INSvi(8|16|32|64)gpr$")>;
81306c3fb27SDimitry Andric
81406c3fb27SDimitry Andric
81506c3fb27SDimitry Andric// ASIMD load instructions
81606c3fb27SDimitry Andric// -----------------------------------------------------------------------------
81706c3fb27SDimitry Andric
81806c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 1 reg
81906c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1L],
82006c3fb27SDimitry Andric             (instregex "^LD1Onev(8b|16b|4h|8h|2s|4s|1d|2d)$")>;
8215f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_1L],
82206c3fb27SDimitry Andric             (instregex "^LD1Onev(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>;
82306c3fb27SDimitry Andric
82406c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 2 reg
82506c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_2L],
82606c3fb27SDimitry Andric             (instregex "^LD1Twov(8b|16b|4h|8h|2s|4s|1d|2d)$")>;
8275f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_2L],
82806c3fb27SDimitry Andric             (instregex "^LD1Twov(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>;
82906c3fb27SDimitry Andric
83006c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 3 reg
83106c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_3L],
83206c3fb27SDimitry Andric             (instregex "^LD1Threev(8b|16b|4h|8h|2s|4s|1d|2d)$")>;
8335f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_6c_3L],
83406c3fb27SDimitry Andric             (instregex "^LD1Threev(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>;
83506c3fb27SDimitry Andric
83606c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 4 reg
83706c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_4L],
83806c3fb27SDimitry Andric             (instregex "^LD1Fourv(8b|16b|4h|8h|2s|4s|1d|2d)$")>;
8395f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_6c_4L],
84006c3fb27SDimitry Andric             (instregex "^LD1Fourv(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>;
84106c3fb27SDimitry Andric
84206c3fb27SDimitry Andric// ASIMD load, 1 element, one lane
84306c3fb27SDimitry Andric// ASIMD load, 1 element, all lanes
84406c3fb27SDimitry Andricdef : InstRW<[N1Write_7c_1L_1V],
84506c3fb27SDimitry Andric             (instregex "LD1(i|Rv)(8|16|32|64)$",
84606c3fb27SDimitry Andric                        "LD1Rv(8b|16b|4h|8h|2s|4s|1d|2d)$")>;
8475f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_7c_1L_1V],
84806c3fb27SDimitry Andric             (instregex "LD1i(8|16|32|64)_POST$",
84906c3fb27SDimitry Andric                        "LD1Rv(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>;
85006c3fb27SDimitry Andric
85106c3fb27SDimitry Andric// ASIMD load, 2 element, multiple
85206c3fb27SDimitry Andric// ASIMD load, 2 element, one lane
85306c3fb27SDimitry Andric// ASIMD load, 2 element, all lanes
85406c3fb27SDimitry Andricdef : InstRW<[N1Write_7c_2L_2V],
85506c3fb27SDimitry Andric             (instregex "LD2Twov(8b|16b|4h|8h|2s|4s|2d)$",
85606c3fb27SDimitry Andric                        "LD2i(8|16|32|64)$",
85706c3fb27SDimitry Andric                        "LD2Rv(8b|16b|4h|8h|2s|4s|1d|2d)$")>;
8585f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_7c_2L_2V],
85906c3fb27SDimitry Andric             (instregex "LD2Twov(8b|16b|4h|8h|2s|4s|2d)_POST$",
86006c3fb27SDimitry Andric                        "LD2i(8|16|32|64)_POST$",
86106c3fb27SDimitry Andric                        "LD2Rv(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>;
86206c3fb27SDimitry Andric
86306c3fb27SDimitry Andric// ASIMD load, 3 element, multiple
86406c3fb27SDimitry Andricdef : InstRW<[N1Write_8c_3L_3V],
86506c3fb27SDimitry Andric             (instregex "LD3Threev(8b|16b|4h|8h|2s|4s|2d)$")>;
8665f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_8c_3L_3V],
86706c3fb27SDimitry Andric             (instregex "LD3Threev(8b|16b|4h|8h|2s|4s|2d)_POST$")>;
86806c3fb27SDimitry Andric
86906c3fb27SDimitry Andric// ASIMD load, 3 element, one lane
87006c3fb27SDimitry Andric// ASIMD load, 3 element, all lanes
87106c3fb27SDimitry Andricdef : InstRW<[N1Write_7c_2L_3V],
87206c3fb27SDimitry Andric             (instregex "LD3i(8|16|32|64)$",
87306c3fb27SDimitry Andric                        "LD3Rv(8b|16b|4h|8h|2s|4s|1d|2d)$")>;
8745f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_7c_2L_3V],
87506c3fb27SDimitry Andric             (instregex "LD3i(8|16|32|64)_POST$",
87606c3fb27SDimitry Andric                        "LD3Rv(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>;
87706c3fb27SDimitry Andric
87806c3fb27SDimitry Andric// ASIMD load, 4 element, multiple, D-form
87906c3fb27SDimitry Andricdef : InstRW<[N1Write_8c_3L_4V],
88006c3fb27SDimitry Andric             (instregex "LD4Fourv(8b|4h|2s)$")>;
8815f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_8c_3L_4V],
88206c3fb27SDimitry Andric             (instregex "LD4Fourv(8b|4h|2s)_POST$")>;
88306c3fb27SDimitry Andric
88406c3fb27SDimitry Andric// ASIMD load, 4 element, multiple, Q-form
88506c3fb27SDimitry Andricdef : InstRW<[N1Write_10c_4L_4V],
88606c3fb27SDimitry Andric             (instregex "LD4Fourv(16b|8h|4s|2d)$")>;
8875f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_10c_4L_4V],
88806c3fb27SDimitry Andric             (instregex "LD4Fourv(16b|8h|4s|2d)_POST$")>;
88906c3fb27SDimitry Andric
89006c3fb27SDimitry Andric// ASIMD load, 4 element, one lane
89106c3fb27SDimitry Andric// ASIMD load, 4 element, all lanes
89206c3fb27SDimitry Andricdef : InstRW<[N1Write_8c_4L_4V],
89306c3fb27SDimitry Andric             (instregex "LD4i(8|16|32|64)$",
89406c3fb27SDimitry Andric                        "LD4Rv(8b|16b|4h|8h|2s|4s|1d|2d)$")>;
8955f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_8c_4L_4V],
89606c3fb27SDimitry Andric             (instregex "LD4i(8|16|32|64)_POST$",
89706c3fb27SDimitry Andric                        "LD4Rv(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>;
89806c3fb27SDimitry Andric
89906c3fb27SDimitry Andric
90006c3fb27SDimitry Andric// ASIMD store instructions
90106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
90206c3fb27SDimitry Andric
90306c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, D-form
90406c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_1V],
90506c3fb27SDimitry Andric             (instregex "ST1Onev(8b|4h|2s|1d)$")>;
9065f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_1L_1V],
90706c3fb27SDimitry Andric             (instregex "ST1Onev(8b|4h|2s|1d)_POST$")>;
90806c3fb27SDimitry Andric
90906c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, Q-form
91006c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_1V],
91106c3fb27SDimitry Andric             (instregex "ST1Onev(16b|8h|4s|2d)$")>;
9125f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_1L_1V],
91306c3fb27SDimitry Andric             (instregex "ST1Onev(16b|8h|4s|2d)_POST$")>;
91406c3fb27SDimitry Andric
91506c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, D-form
91606c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_2V],
91706c3fb27SDimitry Andric             (instregex "ST1Twov(8b|4h|2s|1d)$")>;
9185f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_1L_2V],
91906c3fb27SDimitry Andric             (instregex "ST1Twov(8b|4h|2s|1d)_POST$")>;
92006c3fb27SDimitry Andric
92106c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, Q-form
92206c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_2L_2V],
92306c3fb27SDimitry Andric             (instregex "ST1Twov(16b|8h|4s|2d)$")>;
9245f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_3c_2L_2V],
92506c3fb27SDimitry Andric             (instregex "ST1Twov(16b|8h|4s|2d)_POST$")>;
92606c3fb27SDimitry Andric
92706c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, D-form
92806c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_2L_3V],
92906c3fb27SDimitry Andric             (instregex "ST1Threev(8b|4h|2s|1d)$")>;
9305f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_3c_2L_3V],
93106c3fb27SDimitry Andric             (instregex "ST1Threev(8b|4h|2s|1d)_POST$")>;
93206c3fb27SDimitry Andric
93306c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, Q-form
93406c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_3L_3V],
93506c3fb27SDimitry Andric             (instregex "ST1Threev(16b|8h|4s|2d)$")>;
9365f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_3L_3V],
93706c3fb27SDimitry Andric             (instregex "ST1Threev(16b|8h|4s|2d)_POST$")>;
93806c3fb27SDimitry Andric
93906c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, D-form
94006c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_2L_2V],
94106c3fb27SDimitry Andric             (instregex "ST1Fourv(8b|4h|2s|1d)$")>;
9425f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_3c_2L_2V],
94306c3fb27SDimitry Andric             (instregex "ST1Fourv(8b|4h|2s|1d)_POST$")>;
94406c3fb27SDimitry Andric
94506c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, Q-form
94606c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_4L_4V],
94706c3fb27SDimitry Andric             (instregex "ST1Fourv(16b|8h|4s|2d)$")>;
9485f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_4L_4V],
94906c3fb27SDimitry Andric             (instregex "ST1Fourv(16b|8h|4s|2d)_POST$")>;
95006c3fb27SDimitry Andric
95106c3fb27SDimitry Andric// ASIMD store, 1 element, one lane
95206c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1L_1V],
95306c3fb27SDimitry Andric             (instregex "ST1i(8|16|32|64)$")>;
9545f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_1L_1V],
95506c3fb27SDimitry Andric             (instregex "ST1i(8|16|32|64)_POST$")>;
95606c3fb27SDimitry Andric
95706c3fb27SDimitry Andric// ASIMD store, 2 element, multiple, D-form, B/H/S
95806c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1L_1V],
95906c3fb27SDimitry Andric             (instregex "ST2Twov(8b|4h|2s)$")>;
9605f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_1L_1V],
96106c3fb27SDimitry Andric             (instregex "ST2Twov(8b|4h|2s)_POST$")>;
96206c3fb27SDimitry Andric
96306c3fb27SDimitry Andric// ASIMD store, 2 element, multiple, Q-form
96406c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_2L_2V],
96506c3fb27SDimitry Andric             (instregex "ST2Twov(16b|8h|4s|2d)$")>;
9665f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_2L_2V],
96706c3fb27SDimitry Andric             (instregex "ST2Twov(16b|8h|4s|2d)_POST$")>;
96806c3fb27SDimitry Andric
96906c3fb27SDimitry Andric// ASIMD store, 2 element, one lane
97006c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1L_1V],
97106c3fb27SDimitry Andric             (instregex "ST2i(8|16|32|64)$")>;
9725f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_1L_1V],
97306c3fb27SDimitry Andric             (instregex "ST2i(8|16|32|64)_POST$")>;
97406c3fb27SDimitry Andric
97506c3fb27SDimitry Andric// ASIMD store, 3 element, multiple, D-form, B/H/S
97606c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_2L_2V],
97706c3fb27SDimitry Andric             (instregex "ST3Threev(8b|4h|2s)$")>;
9785f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_2L_2V],
97906c3fb27SDimitry Andric             (instregex "ST3Threev(8b|4h|2s)_POST$")>;
98006c3fb27SDimitry Andric
98106c3fb27SDimitry Andric// ASIMD store, 3 element, multiple, Q-form
98206c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_3L_3V],
98306c3fb27SDimitry Andric             (instregex "ST3Threev(16b|8h|4s|2d)$")>;
9845f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_6c_3L_3V],
98506c3fb27SDimitry Andric             (instregex "ST3Threev(16b|8h|4s|2d)_POST$")>;
98606c3fb27SDimitry Andric
98706c3fb27SDimitry Andric// ASIMD store, 3 element, one lane, B/H/S
98806c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_3L_3V],
98906c3fb27SDimitry Andric             (instregex "ST3i(8|16|32)$")>;
9905f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_3L_3V],
99106c3fb27SDimitry Andric             (instregex "ST3i(8|16|32)_POST$")>;
99206c3fb27SDimitry Andric
99306c3fb27SDimitry Andric// ASIMD store, 3 element, one lane, D
99406c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_3L_3V],
99506c3fb27SDimitry Andric             (instrs ST3i64)>;
9965f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_3L_3V],
99706c3fb27SDimitry Andric             (instrs ST3i64_POST)>;
99806c3fb27SDimitry Andric
99906c3fb27SDimitry Andric// ASIMD store, 4 element, multiple, D-form, B/H/S
100006c3fb27SDimitry Andricdef : InstRW<[N1Write_7c_3L_3V],
100106c3fb27SDimitry Andric             (instregex "ST4Fourv(8b|4h|2s)$")>;
10025f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_7c_3L_3V],
100306c3fb27SDimitry Andric             (instregex "ST4Fourv(8b|4h|2s)_POST$")>;
100406c3fb27SDimitry Andric
100506c3fb27SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, B/H/S
100606c3fb27SDimitry Andricdef : InstRW<[N1Write_9c_6L_6V],
100706c3fb27SDimitry Andric             (instregex "ST4Fourv(16b|8h|4s)$")>;
10085f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_9c_6L_6V],
100906c3fb27SDimitry Andric             (instregex "ST4Fourv(16b|8h|4s)_POST$")>;
101006c3fb27SDimitry Andric
101106c3fb27SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, D
101206c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_4L_4V],
101306c3fb27SDimitry Andric             (instrs ST4Fourv2d)>;
10145f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_6c_4L_4V],
101506c3fb27SDimitry Andric             (instrs ST4Fourv2d_POST)>;
101606c3fb27SDimitry Andric
101706c3fb27SDimitry Andric// ASIMD store, 4 element, one lane, B/H/S
101806c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_3L_3V],
101906c3fb27SDimitry Andric             (instregex "ST4i(8|16|32)$")>;
10205f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_3L_3V],
102106c3fb27SDimitry Andric             (instregex "ST4i(8|16|32)_POST$")>;
102206c3fb27SDimitry Andric
102306c3fb27SDimitry Andric// ASIMD store, 4 element, one lane, D
102406c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_3L_3V],
102506c3fb27SDimitry Andric             (instrs ST4i64)>;
10265f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_3L_3V],
102706c3fb27SDimitry Andric             (instrs ST4i64_POST)>;
102806c3fb27SDimitry Andric
102906c3fb27SDimitry Andric
103006c3fb27SDimitry Andric// Cryptography extensions
103106c3fb27SDimitry Andric// -----------------------------------------------------------------------------
103206c3fb27SDimitry Andric
103306c3fb27SDimitry Andric// Crypto AES ops
103406c3fb27SDimitry Andricdef N1WriteVC : WriteSequence<[N1Write_2c_1V0]>;
103506c3fb27SDimitry Andricdef N1ReadVC  : SchedReadAdvance<2, [N1WriteVC]>;
103606c3fb27SDimitry Andricdef           : InstRW<[N1WriteVC], (instrs AESDrr, AESErr)>;
103706c3fb27SDimitry Andricdef           : InstRW<[N1Write_2c_1V0, N1ReadVC], (instrs AESMCrr, AESIMCrr)>;
103806c3fb27SDimitry Andric
103906c3fb27SDimitry Andric// Crypto polynomial (64x64) multiply long
104006c3fb27SDimitry Andric// Crypto SHA1 hash acceleration op
104106c3fb27SDimitry Andric// Crypto SHA1 schedule acceleration ops
104206c3fb27SDimitry Andric// Crypto SHA256 schedule acceleration ops
104306c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1V0], (instregex "^PMULLv[12]i64$",
104406c3fb27SDimitry Andric                                          "^SHA1(H|SU0|SU1)rr",
104506c3fb27SDimitry Andric                                          "^SHA256SU[01]rr")>;
104606c3fb27SDimitry Andric
104706c3fb27SDimitry Andric// Crypto SHA1 hash acceleration ops
104806c3fb27SDimitry Andric// Crypto SHA256 hash acceleration ops
104906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V0], (instregex "^SHA1[CMP]rrr$",
105006c3fb27SDimitry Andric                                          "^SHA256H2?rrr$")>;
105106c3fb27SDimitry Andric
105206c3fb27SDimitry Andric
105306c3fb27SDimitry Andric// CRC
105406c3fb27SDimitry Andric// -----------------------------------------------------------------------------
105506c3fb27SDimitry Andric
105606c3fb27SDimitry Andric// CRC checksum ops
105706c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1M], (instregex "^CRC32C?[BHWX]rr$")>;
105806c3fb27SDimitry Andric
105906c3fb27SDimitry Andric
106006c3fb27SDimitry Andric}
1061