xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64SchedA57.td (revision e837bb5cfb2b3a734feb1fbe20b25dbe6d550a3c)
10b57cec5SDimitry Andric//=- AArch64SchedA57.td - ARM Cortex-A57 Scheduling Defs -----*- tablegen -*-=//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric//
90b57cec5SDimitry Andric// This file defines the machine model for ARM Cortex-A57 to support
100b57cec5SDimitry Andric// instruction scheduling and other instruction cost heuristics.
110b57cec5SDimitry Andric//
120b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric
140b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
150b57cec5SDimitry Andric// The Cortex-A57 is a traditional superscalar microprocessor with a
160b57cec5SDimitry Andric// conservative 3-wide in-order stage for decode and dispatch. Combined with the
170b57cec5SDimitry Andric// much wider out-of-order issue stage, this produced a need to carefully
180b57cec5SDimitry Andric// schedule micro-ops so that all three decoded each cycle are successfully
190b57cec5SDimitry Andric// issued as the reservation station(s) simply don't stay occupied for long.
200b57cec5SDimitry Andric// Therefore, IssueWidth is set to the narrower of the two at three, while still
210b57cec5SDimitry Andric// modeling the machine as out-of-order.
220b57cec5SDimitry Andric
230b57cec5SDimitry Andricdef CortexA57Model : SchedMachineModel {
240b57cec5SDimitry Andric  let IssueWidth        =   3; // 3-way decode and dispatch
250b57cec5SDimitry Andric  let MicroOpBufferSize = 128; // 128 micro-op re-order buffer
260b57cec5SDimitry Andric  let LoadLatency       =   4; // Optimistic load latency
270b57cec5SDimitry Andric  let MispredictPenalty =  14; // Fetch + Decode/Rename/Dispatch + Branch
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric  // Enable partial & runtime unrolling. The magic number is chosen based on
300b57cec5SDimitry Andric  // experiments and benchmarking data.
310b57cec5SDimitry Andric  let LoopMicroOpBufferSize = 16;
320b57cec5SDimitry Andric  let CompleteModel = 1;
330b57cec5SDimitry Andric
34*e837bb5cSDimitry Andric  list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F,
35*e837bb5cSDimitry Andric                                                    PAUnsupported.F);
360b57cec5SDimitry Andric}
370b57cec5SDimitry Andric
380b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
390b57cec5SDimitry Andric// Define each kind of processor resource and number available on Cortex-A57.
400b57cec5SDimitry Andric// Cortex A-57 has 8 pipelines that each has its own 8-entry queue where
410b57cec5SDimitry Andric// micro-ops wait for their operands and then issue out-of-order.
420b57cec5SDimitry Andric
430b57cec5SDimitry Andricdef A57UnitB : ProcResource<1>;  // Type B micro-ops
440b57cec5SDimitry Andricdef A57UnitI : ProcResource<2>;  // Type I micro-ops
450b57cec5SDimitry Andricdef A57UnitM : ProcResource<1>;  // Type M micro-ops
460b57cec5SDimitry Andricdef A57UnitL : ProcResource<1>;  // Type L micro-ops
470b57cec5SDimitry Andricdef A57UnitS : ProcResource<1>;  // Type S micro-ops
480b57cec5SDimitry Andricdef A57UnitX : ProcResource<1>;  // Type X micro-ops
490b57cec5SDimitry Andricdef A57UnitW : ProcResource<1>;  // Type W micro-ops
500b57cec5SDimitry Andriclet SchedModel = CortexA57Model in {
510b57cec5SDimitry Andric  def A57UnitV : ProcResGroup<[A57UnitX, A57UnitW]>;    // Type V micro-ops
520b57cec5SDimitry Andric}
530b57cec5SDimitry Andric
540b57cec5SDimitry Andriclet SchedModel = CortexA57Model in {
550b57cec5SDimitry Andric
560b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
570b57cec5SDimitry Andric// Define customized scheduler read/write types specific to the Cortex-A57.
580b57cec5SDimitry Andric
590b57cec5SDimitry Andricinclude "AArch64SchedA57WriteRes.td"
600b57cec5SDimitry Andric
610b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
620b57cec5SDimitry Andric// Map the target-defined scheduler read/write resources and latency for
630b57cec5SDimitry Andric// Cortex-A57. The Cortex-A57 types are directly associated with resources, so
640b57cec5SDimitry Andric// defining the aliases precludes the need for mapping them using WriteRes. The
650b57cec5SDimitry Andric// aliases are sufficient for creating a coarse, working model. As the model
660b57cec5SDimitry Andric// evolves, InstRWs will be used to override some of these SchedAliases.
670b57cec5SDimitry Andric//
680b57cec5SDimitry Andric// WARNING: Using SchedAliases is convenient and works well for latency and
690b57cec5SDimitry Andric//          resource lookup for instructions. However, this creates an entry in
700b57cec5SDimitry Andric//          AArch64WriteLatencyTable with a WriteResourceID of 0, breaking
710b57cec5SDimitry Andric//          any SchedReadAdvance since the lookup will fail.
720b57cec5SDimitry Andric
730b57cec5SDimitry Andricdef : SchedAlias<WriteImm,   A57Write_1cyc_1I>;
740b57cec5SDimitry Andricdef : SchedAlias<WriteI,     A57Write_1cyc_1I>;
750b57cec5SDimitry Andricdef : SchedAlias<WriteISReg, A57Write_2cyc_1M>;
760b57cec5SDimitry Andricdef : SchedAlias<WriteIEReg, A57Write_2cyc_1M>;
770b57cec5SDimitry Andricdef : SchedAlias<WriteExtr,  A57Write_1cyc_1I>;
780b57cec5SDimitry Andricdef : SchedAlias<WriteIS,    A57Write_1cyc_1I>;
790b57cec5SDimitry Andricdef : SchedAlias<WriteID32,  A57Write_19cyc_1M>;
800b57cec5SDimitry Andricdef : SchedAlias<WriteID64,  A57Write_35cyc_1M>;
810b57cec5SDimitry Andricdef : WriteRes<WriteIM32, [A57UnitM]> { let Latency = 3; }
820b57cec5SDimitry Andricdef : WriteRes<WriteIM64, [A57UnitM]> { let Latency = 5; }
830b57cec5SDimitry Andricdef : SchedAlias<WriteBr,    A57Write_1cyc_1B>;
840b57cec5SDimitry Andricdef : SchedAlias<WriteBrReg, A57Write_1cyc_1B>;
850b57cec5SDimitry Andricdef : SchedAlias<WriteLD,    A57Write_4cyc_1L>;
860b57cec5SDimitry Andricdef : SchedAlias<WriteST,    A57Write_1cyc_1S>;
870b57cec5SDimitry Andricdef : SchedAlias<WriteSTP,   A57Write_1cyc_1S>;
880b57cec5SDimitry Andricdef : SchedAlias<WriteAdr,   A57Write_1cyc_1I>;
890b57cec5SDimitry Andricdef : SchedAlias<WriteLDIdx, A57Write_4cyc_1I_1L>;
900b57cec5SDimitry Andricdef : SchedAlias<WriteSTIdx, A57Write_1cyc_1I_1S>;
910b57cec5SDimitry Andricdef : SchedAlias<WriteF,     A57Write_3cyc_1V>;
920b57cec5SDimitry Andricdef : SchedAlias<WriteFCmp,  A57Write_3cyc_1V>;
930b57cec5SDimitry Andricdef : SchedAlias<WriteFCvt,  A57Write_5cyc_1V>;
940b57cec5SDimitry Andricdef : SchedAlias<WriteFCopy, A57Write_5cyc_1L>;
950b57cec5SDimitry Andricdef : SchedAlias<WriteFImm,  A57Write_3cyc_1V>;
960b57cec5SDimitry Andricdef : SchedAlias<WriteFMul,  A57Write_5cyc_1V>;
970b57cec5SDimitry Andricdef : SchedAlias<WriteFDiv,  A57Write_17cyc_1W>;
980b57cec5SDimitry Andricdef : SchedAlias<WriteV,     A57Write_3cyc_1V>;
990b57cec5SDimitry Andricdef : SchedAlias<WriteVLD,   A57Write_5cyc_1L>;
1000b57cec5SDimitry Andricdef : SchedAlias<WriteVST,   A57Write_1cyc_1S>;
1010b57cec5SDimitry Andric
1020b57cec5SDimitry Andricdef : WriteRes<WriteAtomic,  []> { let Unsupported = 1; }
1030b57cec5SDimitry Andric
1040b57cec5SDimitry Andricdef : WriteRes<WriteSys,     []> { let Latency = 1; }
1050b57cec5SDimitry Andricdef : WriteRes<WriteBarrier, []> { let Latency = 1; }
1060b57cec5SDimitry Andricdef : WriteRes<WriteHint,    []> { let Latency = 1; }
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andricdef : WriteRes<WriteLDHi,    []> { let Latency = 4; }
1090b57cec5SDimitry Andric
1100b57cec5SDimitry Andric// Forwarding logic is only modeled for multiply and accumulate
1110b57cec5SDimitry Andricdef : ReadAdvance<ReadI,       0>;
1120b57cec5SDimitry Andricdef : ReadAdvance<ReadISReg,   0>;
1130b57cec5SDimitry Andricdef : ReadAdvance<ReadIEReg,   0>;
1140b57cec5SDimitry Andricdef : ReadAdvance<ReadIM,      0>;
1150b57cec5SDimitry Andricdef : ReadAdvance<ReadIMA,     2, [WriteIM32, WriteIM64]>;
1160b57cec5SDimitry Andricdef : ReadAdvance<ReadID,      0>;
1170b57cec5SDimitry Andricdef : ReadAdvance<ReadExtrHi,  0>;
1180b57cec5SDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>;
1190b57cec5SDimitry Andricdef : ReadAdvance<ReadVLD,     0>;
1200b57cec5SDimitry Andric
1210b57cec5SDimitry Andric
1220b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1230b57cec5SDimitry Andric// Specialize the coarse model by associating instruction groups with the
1240b57cec5SDimitry Andric// subtarget-defined types. As the modeled is refined, this will override most
1250b57cec5SDimitry Andric// of the above ShchedAlias mappings.
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric// Miscellaneous
1280b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>;
1310b57cec5SDimitry Andric
1320b57cec5SDimitry Andric
1330b57cec5SDimitry Andric// Branch Instructions
1340b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1350b57cec5SDimitry Andric
1360b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1B_1I], (instrs BL)>;
1370b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1B_1I], (instrs BLR)>;
1380b57cec5SDimitry Andric
1390b57cec5SDimitry Andric
1400b57cec5SDimitry Andric// Shifted Register with Shift == 0
1410b57cec5SDimitry Andric// ----------------------------------------------------------------------------
1420b57cec5SDimitry Andric
1430b57cec5SDimitry Andricdef A57WriteISReg : SchedWriteVariant<[
1440b57cec5SDimitry Andric       SchedVar<RegShiftedPred, [WriteISReg]>,
1450b57cec5SDimitry Andric       SchedVar<NoSchedPred, [WriteI]>]>;
1460b57cec5SDimitry Andricdef : InstRW<[A57WriteISReg], (instregex ".*rs$")>;
1470b57cec5SDimitry Andric
1480b57cec5SDimitry Andric
1490b57cec5SDimitry Andric// Divide and Multiply Instructions
1500b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1510b57cec5SDimitry Andric
1520b57cec5SDimitry Andric// Multiply high
1530b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1M], (instrs SMULHrr, UMULHrr)>;
1540b57cec5SDimitry Andric
1550b57cec5SDimitry Andric
1560b57cec5SDimitry Andric// Miscellaneous Data-Processing Instructions
1570b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1580b57cec5SDimitry Andric
1590b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1I],    (instrs EXTRWrri)>;
1600b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1M], (instrs EXTRXrri)>;
1610b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1M],    (instregex "BFM")>;
1620b57cec5SDimitry Andric
1630b57cec5SDimitry Andric
1640b57cec5SDimitry Andric// Cryptography Extensions
1650b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1660b57cec5SDimitry Andric
1670b57cec5SDimitry Andricdef A57ReadAES  : SchedReadAdvance<3, [A57Write_3cyc_1W]>;
1680b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^AES[DE]")>;
1690b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W, A57ReadAES], (instregex "^AESI?MC")>;
1700b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2V], (instregex "^SHA1SU0")>;
1710b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^SHA1(H|SU1)")>;
1720b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^SHA1[CMP]")>;
1730b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^SHA256SU0")>;
1740b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^SHA256(H|H2|SU1)")>;
1750b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^CRC32")>;
1760b57cec5SDimitry Andric
1770b57cec5SDimitry Andric
1780b57cec5SDimitry Andric// Vector Load
1790b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1800b57cec5SDimitry Andric
1810b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],           (instregex "LD1i(8|16|32)$")>;
1820b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr], (instregex "LD1i(8|16|32)_POST$")>;
1830b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],            (instregex "LD1i(64)$")>;
1840b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr],  (instregex "LD1i(64)_POST$")>;
1850b57cec5SDimitry Andric
1860b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],           (instregex "LD1Rv(8b|4h|2s)$")>;
1870b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr], (instregex "LD1Rv(8b|4h|2s)_POST$")>;
1880b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],            (instregex "LD1Rv(1d)$")>;
1890b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr],  (instregex "LD1Rv(1d)_POST$")>;
1900b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],           (instregex "LD1Rv(16b|8h|4s|2d)$")>;
1910b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr], (instregex "LD1Rv(16b|8h|4s|2d)_POST$")>;
1920b57cec5SDimitry Andric
1930b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],              (instregex "LD1Onev(8b|4h|2s|1d)$")>;
1940b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr],    (instregex "LD1Onev(8b|4h|2s|1d)_POST$")>;
1950b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],              (instregex "LD1Onev(16b|8h|4s|2d)$")>;
1960b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr],    (instregex "LD1Onev(16b|8h|4s|2d)_POST$")>;
1970b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],              (instregex "LD1Twov(8b|4h|2s|1d)$")>;
1980b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr],    (instregex "LD1Twov(8b|4h|2s|1d)_POST$")>;
1990b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],             (instregex "LD1Twov(16b|8h|4s|2d)$")>;
2000b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr],   (instregex "LD1Twov(16b|8h|4s|2d)_POST$")>;
2010b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],             (instregex "LD1Threev(8b|4h|2s|1d)$")>;
2020b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr],   (instregex "LD1Threev(8b|4h|2s|1d)_POST$")>;
2030b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_3L],            (instregex "LD1Threev(16b|8h|4s|2d)$")>;
2040b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_3L, WriteAdr],  (instregex "LD1Threev(16b|8h|4s|2d)_POST$")>;
2050b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],             (instregex "LD1Fourv(8b|4h|2s|1d)$")>;
2060b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr],   (instregex "LD1Fourv(8b|4h|2s|1d)_POST$")>;
2070b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L],           (instregex "LD1Fourv(16b|8h|4s|2d)$")>;
2080b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L, WriteAdr], (instregex "LD1Fourv(16b|8h|4s|2d)_POST$")>;
2090b57cec5SDimitry Andric
2100b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],           (instregex "LD2i(8|16)$")>;
2110b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr], (instregex "LD2i(8|16)_POST$")>;
2120b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],            (instregex "LD2i(32)$")>;
2130b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr],  (instregex "LD2i(32)_POST$")>;
2140b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],            (instregex "LD2i(64)$")>;
2150b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr],  (instregex "LD2i(64)_POST$")>;
2160b57cec5SDimitry Andric
2170b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],            (instregex "LD2Rv(8b|4h|2s)$")>;
2180b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr],  (instregex "LD2Rv(8b|4h|2s)_POST$")>;
2190b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],             (instregex "LD2Rv(1d)$")>;
2200b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr],   (instregex "LD2Rv(1d)_POST$")>;
2210b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],           (instregex "LD2Rv(16b|8h|4s|2d)$")>;
2220b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr], (instregex "LD2Rv(16b|8h|4s|2d)_POST$")>;
2230b57cec5SDimitry Andric
2240b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],             (instregex "LD2Twov(8b|4h|2s)$")>;
2250b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr],   (instregex "LD2Twov(8b|4h|2s)_POST$")>;
2260b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V],           (instregex "LD2Twov(16b|8h|4s)$")>;
2270b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V, WriteAdr], (instregex "LD2Twov(16b|8h|4s)_POST$")>;
2280b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],             (instregex "LD2Twov(2d)$")>;
2290b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr],   (instregex "LD2Twov(2d)_POST$")>;
2300b57cec5SDimitry Andric
2310b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V],           (instregex "LD3i(8|16)$")>;
2320b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V, WriteAdr], (instregex "LD3i(8|16)_POST$")>;
2330b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],            (instregex "LD3i(32)$")>;
2340b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr],  (instregex "LD3i(32)_POST$")>;
2350b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],             (instregex "LD3i(64)$")>;
2360b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr],   (instregex "LD3i(64)_POST$")>;
2370b57cec5SDimitry Andric
2380b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],             (instregex "LD3Rv(8b|4h|2s)$")>;
2390b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr],   (instregex "LD3Rv(8b|4h|2s)_POST$")>;
2400b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],              (instregex "LD3Rv(1d)$")>;
2410b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr],    (instregex "LD3Rv(1d)_POST$")>;
2420b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V],            (instregex "LD3Rv(16b|8h|4s)$")>;
2430b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V, WriteAdr],  (instregex "LD3Rv(16b|8h|4s)_POST$")>;
2440b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V],           (instregex "LD3Rv(2d)$")>;
2450b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V, WriteAdr], (instregex "LD3Rv(2d)_POST$")>;
2460b57cec5SDimitry Andric
2470b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V],               (instregex "LD3Threev(8b|4h|2s)$")>;
2480b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V, WriteAdr],     (instregex "LD3Threev(8b|4h|2s)_POST$")>;
2490b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_3L_4V],           (instregex "LD3Threev(16b|8h|4s)$")>;
2500b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_3L_4V, WriteAdr], (instregex "LD3Threev(16b|8h|4s)_POST$")>;
2510b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L],               (instregex "LD3Threev(2d)$")>;
2520b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L, WriteAdr],     (instregex "LD3Threev(2d)_POST$")>;
2530b57cec5SDimitry Andric
2540b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V],           (instregex "LD4i(8|16)$")>;
2550b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V, WriteAdr], (instregex "LD4i(8|16)_POST$")>;
2560b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],             (instregex "LD4i(32)$")>;
2570b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr],   (instregex "LD4i(32)_POST$")>;
2580b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V],           (instregex "LD4i(64)$")>;
2590b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V, WriteAdr], (instregex "LD4i(64)_POST$")>;
2600b57cec5SDimitry Andric
2610b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],              (instregex "LD4Rv(8b|4h|2s)$")>;
2620b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr],    (instregex "LD4Rv(8b|4h|2s)_POST$")>;
2630b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],               (instregex "LD4Rv(1d)$")>;
2640b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr],     (instregex "LD4Rv(1d)_POST$")>;
2650b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V],            (instregex "LD4Rv(16b|8h|4s)$")>;
2660b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V, WriteAdr],  (instregex "LD4Rv(16b|8h|4s)_POST$")>;
2670b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_4V],           (instregex "LD4Rv(2d)$")>;
2680b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_4V, WriteAdr], (instregex "LD4Rv(2d)_POST$")>;
2690b57cec5SDimitry Andric
2700b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V],                (instregex "LD4Fourv(8b|4h|2s)$")>;
2710b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V, WriteAdr],      (instregex "LD4Fourv(8b|4h|2s)_POST$")>;
2720b57cec5SDimitry Andricdef : InstRW<[A57Write_11cyc_4L_4V],           (instregex "LD4Fourv(16b|8h|4s)$")>;
2730b57cec5SDimitry Andricdef : InstRW<[A57Write_11cyc_4L_4V, WriteAdr], (instregex "LD4Fourv(16b|8h|4s)_POST$")>;
2740b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L],                (instregex "LD4Fourv(2d)$")>;
2750b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L, WriteAdr],      (instregex "LD4Fourv(2d)_POST$")>;
2760b57cec5SDimitry Andric
2770b57cec5SDimitry Andric// Vector Store
2780b57cec5SDimitry Andric// -----------------------------------------------------------------------------
2790b57cec5SDimitry Andric
2800b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S],            (instregex "ST1i(8|16|32)$")>;
2810b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S, WriteAdr],  (instregex "ST1i(8|16|32)_POST$")>;
2820b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V],           (instregex "ST1i(64)$")>;
2830b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V, WriteAdr], (instregex "ST1i(64)_POST$")>;
2840b57cec5SDimitry Andric
2850b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S],                  (instregex "ST1Onev(8b|4h|2s|1d)$")>;
2860b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S, WriteAdr],        (instregex "ST1Onev(8b|4h|2s|1d)_POST$")>;
2870b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S],                 (instregex "ST1Onev(16b|8h|4s|2d)$")>;
2880b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S, WriteAdr],       (instregex "ST1Onev(16b|8h|4s|2d)_POST$")>;
2890b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S],                 (instregex "ST1Twov(8b|4h|2s|1d)$")>;
2900b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S, WriteAdr],       (instregex "ST1Twov(8b|4h|2s|1d)_POST$")>;
2910b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S],               (instregex "ST1Twov(16b|8h|4s|2d)$")>;
2920b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S, WriteAdr],     (instregex "ST1Twov(16b|8h|4s|2d)_POST$")>;
2930b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S],                (instregex "ST1Threev(8b|4h|2s|1d)$")>;
2940b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S, WriteAdr],      (instregex "ST1Threev(8b|4h|2s|1d)_POST$")>;
2950b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S],             (instregex "ST1Threev(16b|8h|4s|2d)$")>;
2960b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S, WriteAdr],   (instregex "ST1Threev(16b|8h|4s|2d)_POST$")>;
2970b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S],               (instregex "ST1Fourv(8b|4h|2s|1d)$")>;
2980b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S, WriteAdr],     (instregex "ST1Fourv(8b|4h|2s|1d)_POST$")>;
2990b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S],           (instregex "ST1Fourv(16b|8h|4s|2d)$")>;
3000b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S, WriteAdr], (instregex "ST1Fourv(16b|8h|4s|2d)_POST$")>;
3010b57cec5SDimitry Andric
3020b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V],           (instregex "ST2i(8|16|32)$")>;
3030b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V, WriteAdr], (instregex "ST2i(8|16|32)_POST$")>;
3040b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S],           (instregex "ST2i(64)$")>;
3050b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S, WriteAdr], (instregex "ST2i(64)_POST$")>;
3060b57cec5SDimitry Andric
3070b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V],              (instregex "ST2Twov(8b|4h|2s)$")>;
3080b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V, WriteAdr],    (instregex "ST2Twov(8b|4h|2s)_POST$")>;
3090b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V],           (instregex "ST2Twov(16b|8h|4s)$")>;
3100b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V, WriteAdr], (instregex "ST2Twov(16b|8h|4s)_POST$")>;
3110b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S],             (instregex "ST2Twov(2d)$")>;
3120b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S, WriteAdr],   (instregex "ST2Twov(2d)_POST$")>;
3130b57cec5SDimitry Andric
3140b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V],            (instregex "ST3i(8|16)$")>;
3150b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V, WriteAdr],  (instregex "ST3i(8|16)_POST$")>;
3160b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S],           (instregex "ST3i(32)$")>;
3170b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S, WriteAdr], (instregex "ST3i(32)_POST$")>;
3180b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V],           (instregex "ST3i(64)$")>;
3190b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V, WriteAdr], (instregex "ST3i(64)_POST$")>;
3200b57cec5SDimitry Andric
3210b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S_2V],                 (instregex "ST3Threev(8b|4h|2s)$")>;
3220b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S_2V, WriteAdr],       (instregex "ST3Threev(8b|4h|2s)_POST$")>;
3230b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S_4V],           (instregex "ST3Threev(16b|8h|4s)$")>;
3240b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S_4V, WriteAdr], (instregex "ST3Threev(16b|8h|4s)_POST$")>;
3250b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S],                (instregex "ST3Threev(2d)$")>;
3260b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S, WriteAdr],      (instregex "ST3Threev(2d)_POST$")>;
3270b57cec5SDimitry Andric
3280b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V],             (instregex "ST4i(8|16)$")>;
3290b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V, WriteAdr],   (instregex "ST4i(8|16)_POST$")>;
3300b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S],           (instregex "ST4i(32)$")>;
3310b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S, WriteAdr], (instregex "ST4i(32)_POST$")>;
3320b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V],            (instregex "ST4i(64)$")>;
3330b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V, WriteAdr],  (instregex "ST4i(64)_POST$")>;
3340b57cec5SDimitry Andric
3350b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V],                  (instregex "ST4Fourv(8b|4h|2s)$")>;
3360b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V, WriteAdr],        (instregex "ST4Fourv(8b|4h|2s)_POST$")>;
3370b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S_4V],           (instregex "ST4Fourv(16b|8h|4s)$")>;
3380b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S_4V, WriteAdr], (instregex "ST4Fourv(16b|8h|4s)_POST$")>;
3390b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S],                (instregex "ST4Fourv(2d)$")>;
3400b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S, WriteAdr],      (instregex "ST4Fourv(2d)_POST$")>;
3410b57cec5SDimitry Andric
3420b57cec5SDimitry Andric// Vector - Integer
3430b57cec5SDimitry Andric// -----------------------------------------------------------------------------
3440b57cec5SDimitry Andric
3450b57cec5SDimitry Andric// Reference for forms in this group
3460b57cec5SDimitry Andric//   D form - v8i8, v4i16, v2i32
3470b57cec5SDimitry Andric//   Q form - v16i8, v8i16, v4i32
3480b57cec5SDimitry Andric//   D form - v1i8, v1i16, v1i32, v1i64
3490b57cec5SDimitry Andric//   Q form - v16i8, v8i16, v4i32, v2i64
3500b57cec5SDimitry Andric//   D form - v8i8_v8i16, v4i16_v4i32, v2i32_v2i64
3510b57cec5SDimitry Andric//   Q form - v16i8_v8i16, v8i16_v4i32, v4i32_v2i64
3520b57cec5SDimitry Andric
3530b57cec5SDimitry Andric// ASIMD absolute diff accum, D-form
3540b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]ABA(v8i8|v4i16|v2i32)$")>;
3550b57cec5SDimitry Andric// ASIMD absolute diff accum, Q-form
3560b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2X], (instregex "^[SU]ABA(v16i8|v8i16|v4i32)$")>;
3570b57cec5SDimitry Andric// ASIMD absolute diff accum long
3580b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]ABAL")>;
3590b57cec5SDimitry Andric
3600b57cec5SDimitry Andric// ASIMD arith, reduce, 4H/4S
3610b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]?ADDL?V(v8i8|v4i16|v2i32)v$")>;
3620b57cec5SDimitry Andric// ASIMD arith, reduce, 8B/8H
3630b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_1V_1X], (instregex "^[SU]?ADDL?V(v8i16|v4i32)v$")>;
3640b57cec5SDimitry Andric// ASIMD arith, reduce, 16B
3650b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_2X], (instregex "^[SU]?ADDL?Vv16i8v$")>;
3660b57cec5SDimitry Andric
3670b57cec5SDimitry Andric// ASIMD max/min, reduce, 4H/4S
3680b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU](MIN|MAX)V(v4i16|v4i32)v$")>;
3690b57cec5SDimitry Andric// ASIMD max/min, reduce, 8B/8H
3700b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_1V_1X], (instregex "^[SU](MIN|MAX)V(v8i8|v8i16)v$")>;
3710b57cec5SDimitry Andric// ASIMD max/min, reduce, 16B
3720b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_2X], (instregex "^[SU](MIN|MAX)Vv16i8v$")>;
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andric// ASIMD multiply, D-form
3750b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^(P?MUL|SQR?DMULH)(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)(_indexed)?$")>;
3760b57cec5SDimitry Andric// ASIMD multiply, Q-form
3770b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^(P?MUL|SQR?DMULH)(v16i8|v8i16|v4i32)(_indexed)?$")>;
3780b57cec5SDimitry Andric
3790b57cec5SDimitry Andric// ASIMD multiply accumulate, D-form
3800b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^ML[AS](v8i8|v4i16|v2i32)(_indexed)?$")>;
3810b57cec5SDimitry Andric// ASIMD multiply accumulate, Q-form
3820b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^ML[AS](v16i8|v8i16|v4i32)(_indexed)?$")>;
3830b57cec5SDimitry Andric
3840b57cec5SDimitry Andric// ASIMD multiply accumulate long
3850b57cec5SDimitry Andric// ASIMD multiply accumulate saturating long
3860b57cec5SDimitry Andricdef A57WriteIVMA   : SchedWriteRes<[A57UnitW]> { let Latency = 5;  }
3870b57cec5SDimitry Andricdef A57ReadIVMA4   : SchedReadAdvance<4, [A57WriteIVMA]>;
3880b57cec5SDimitry Andricdef : InstRW<[A57WriteIVMA, A57ReadIVMA4], (instregex "^(S|U|SQD)ML[AS]L")>;
3890b57cec5SDimitry Andric
3900b57cec5SDimitry Andric// ASIMD multiply long
3910b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^(S|U|SQD)MULL")>;
3920b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^PMULL(v8i8|v16i8)")>;
3930b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^PMULL(v1i64|v2i64)")>;
3940b57cec5SDimitry Andric
3950b57cec5SDimitry Andric// ASIMD pairwise add and accumulate
3960b57cec5SDimitry Andric// ASIMD shift accumulate
3970b57cec5SDimitry Andricdef A57WriteIVA    : SchedWriteRes<[A57UnitX]> { let Latency = 4;  }
3980b57cec5SDimitry Andricdef A57ReadIVA3    : SchedReadAdvance<3, [A57WriteIVA]>;
3990b57cec5SDimitry Andricdef : InstRW<[A57WriteIVA, A57ReadIVA3], (instregex "^[SU]ADALP")>;
4000b57cec5SDimitry Andricdef : InstRW<[A57WriteIVA, A57ReadIVA3], (instregex "^(S|SR|U|UR)SRA")>;
4010b57cec5SDimitry Andric
4020b57cec5SDimitry Andric// ASIMD shift by immed, complex
4030b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]?(Q|R){1,2}SHR")>;
4040b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^SQSHLU")>;
4050b57cec5SDimitry Andric
4060b57cec5SDimitry Andric
4070b57cec5SDimitry Andric// ASIMD shift by register, basic, Q-form
4080b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_2X], (instregex "^[SU]SHL(v16i8|v8i16|v4i32|v2i64)")>;
4090b57cec5SDimitry Andric
4100b57cec5SDimitry Andric// ASIMD shift by register, complex, D-form
4110b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU][QR]{1,2}SHL(v1i8|v1i16|v1i32|v1i64|v8i8|v4i16|v2i32|b|d|h|s)")>;
4120b57cec5SDimitry Andric
4130b57cec5SDimitry Andric// ASIMD shift by register, complex, Q-form
4140b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2X], (instregex "^[SU][QR]{1,2}SHL(v16i8|v8i16|v4i32|v2i64)")>;
4150b57cec5SDimitry Andric
4160b57cec5SDimitry Andric
4170b57cec5SDimitry Andric// Vector - Floating Point
4180b57cec5SDimitry Andric// -----------------------------------------------------------------------------
4190b57cec5SDimitry Andric
4200b57cec5SDimitry Andric// Reference for forms in this group
4210b57cec5SDimitry Andric//   D form - v2f32
4220b57cec5SDimitry Andric//   Q form - v4f32, v2f64
4230b57cec5SDimitry Andric//   D form - 32, 64
4240b57cec5SDimitry Andric//   D form - v1i32, v1i64
4250b57cec5SDimitry Andric//   D form - v2i32
4260b57cec5SDimitry Andric//   Q form - v4i32, v2i64
4270b57cec5SDimitry Andric
4280b57cec5SDimitry Andric// ASIMD FP arith, normal, D-form
4290b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FABD|FADD|FSUB)(v2f32|32|64|v2i32p)")>;
4300b57cec5SDimitry Andric// ASIMD FP arith, normal, Q-form
4310b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FABD|FADD|FSUB)(v4f32|v2f64|v2i64p)")>;
4320b57cec5SDimitry Andric
4330b57cec5SDimitry Andric// ASIMD FP arith, pairwise, D-form
4340b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FADDP(v2f32|32|64|v2i32)")>;
4350b57cec5SDimitry Andric// ASIMD FP arith, pairwise, Q-form
4360b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^FADDP(v4f32|v2f64|v2i64)")>;
4370b57cec5SDimitry Andric
4380b57cec5SDimitry Andric// ASIMD FP compare, D-form
4390b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FACGE|FACGT|FCMEQ|FCMGE|FCMGT|FCMLE|FCMLT)(v2f32|32|64|v1i32|v2i32|v1i64)")>;
4400b57cec5SDimitry Andric// ASIMD FP compare, Q-form
4410b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FACGE|FACGT|FCMEQ|FCMGE|FCMGT|FCMLE|FCMLT)(v4f32|v2f64|v4i32|v2i64)")>;
4420b57cec5SDimitry Andric
4430b57cec5SDimitry Andric// ASIMD FP convert, long and narrow
4440b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_3V], (instregex "^FCVT(L|N|XN)v")>;
4450b57cec5SDimitry Andric// ASIMD FP convert, other, D-form
4460b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^[FVSU]CVT([AMNPZ][SU])?(_Int)?(v2f32|v1i32|v2i32|v1i64)")>;
4470b57cec5SDimitry Andric// ASIMD FP convert, other, Q-form
4480b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^[FVSU]CVT([AMNPZ][SU])?(_Int)?(v4f32|v2f64|v4i32|v2i64)")>;
4490b57cec5SDimitry Andric
4500b57cec5SDimitry Andric// ASIMD FP divide, D-form, F32
4510b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instregex "FDIVv2f32")>;
4520b57cec5SDimitry Andric// ASIMD FP divide, Q-form, F32
4530b57cec5SDimitry Andricdef : InstRW<[A57Write_34cyc_2W], (instregex "FDIVv4f32")>;
4540b57cec5SDimitry Andric// ASIMD FP divide, Q-form, F64
4550b57cec5SDimitry Andricdef : InstRW<[A57Write_64cyc_2W], (instregex "FDIVv2f64")>;
4560b57cec5SDimitry Andric
4570b57cec5SDimitry Andric// Note: These were simply duplicated from ASIMD FDIV because of missing documentation
4580b57cec5SDimitry Andric// ASIMD FP square root, D-form, F32
4590b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instregex "FSQRTv2f32")>;
4600b57cec5SDimitry Andric// ASIMD FP square root, Q-form, F32
4610b57cec5SDimitry Andricdef : InstRW<[A57Write_34cyc_2W], (instregex "FSQRTv4f32")>;
4620b57cec5SDimitry Andric// ASIMD FP square root, Q-form, F64
4630b57cec5SDimitry Andricdef : InstRW<[A57Write_64cyc_2W], (instregex "FSQRTv2f64")>;
4640b57cec5SDimitry Andric
4650b57cec5SDimitry Andric// ASIMD FP max/min, normal, D-form
4660b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FMAX|FMIN)(NM)?(v2f32)")>;
4670b57cec5SDimitry Andric// ASIMD FP max/min, normal, Q-form
4680b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FMAX|FMIN)(NM)?(v4f32|v2f64)")>;
4690b57cec5SDimitry Andric// ASIMD FP max/min, pairwise, D-form
4700b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FMAX|FMIN)(NM)?P(v2f32|v2i32)")>;
4710b57cec5SDimitry Andric// ASIMD FP max/min, pairwise, Q-form
4720b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^(FMAX|FMIN)(NM)?P(v4f32|v2f64|v2i64)")>;
4730b57cec5SDimitry Andric// ASIMD FP max/min, reduce
4740b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_3V], (instregex "^(FMAX|FMIN)(NM)?Vv")>;
4750b57cec5SDimitry Andric
4760b57cec5SDimitry Andric// ASIMD FP multiply, D-form, FZ
4770b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FMULX?(v2f32|v1i32|v2i32|v1i64|32|64)")>;
4780b57cec5SDimitry Andric// ASIMD FP multiply, Q-form, FZ
4790b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^FMULX?(v4f32|v2f64|v4i32|v2i64)")>;
4800b57cec5SDimitry Andric
4810b57cec5SDimitry Andric// ASIMD FP multiply accumulate, D-form, FZ
4820b57cec5SDimitry Andric// ASIMD FP multiply accumulate, Q-form, FZ
4830b57cec5SDimitry Andricdef A57WriteFPVMAD : SchedWriteRes<[A57UnitV]> { let Latency = 9;  }
4840b57cec5SDimitry Andricdef A57WriteFPVMAQ : SchedWriteRes<[A57UnitV, A57UnitV]> { let Latency = 10;  }
4850b57cec5SDimitry Andricdef A57ReadFPVMA5  : SchedReadAdvance<5, [A57WriteFPVMAD, A57WriteFPVMAQ]>;
4860b57cec5SDimitry Andricdef : InstRW<[A57WriteFPVMAD, A57ReadFPVMA5], (instregex "^FML[AS](v2f32|v1i32|v2i32|v1i64)")>;
4870b57cec5SDimitry Andricdef : InstRW<[A57WriteFPVMAQ, A57ReadFPVMA5], (instregex "^FML[AS](v4f32|v2f64|v4i32|v2i64)")>;
4880b57cec5SDimitry Andric
4890b57cec5SDimitry Andric// ASIMD FP round, D-form
4900b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FRINT[AIMNPXZ](v2f32)")>;
4910b57cec5SDimitry Andric// ASIMD FP round, Q-form
4920b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^FRINT[AIMNPXZ](v4f32|v2f64)")>;
4930b57cec5SDimitry Andric
4940b57cec5SDimitry Andric
4950b57cec5SDimitry Andric// Vector - Miscellaneous
4960b57cec5SDimitry Andric// -----------------------------------------------------------------------------
4970b57cec5SDimitry Andric
4980b57cec5SDimitry Andric// Reference for forms in this group
4990b57cec5SDimitry Andric//   D form - v8i8, v4i16, v2i32
5000b57cec5SDimitry Andric//   Q form - v16i8, v8i16, v4i32
5010b57cec5SDimitry Andric//   D form - v1i8, v1i16, v1i32, v1i64
5020b57cec5SDimitry Andric//   Q form - v16i8, v8i16, v4i32, v2i64
5030b57cec5SDimitry Andric
5040b57cec5SDimitry Andric// ASIMD bitwise insert, Q-form
5050b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2V], (instregex "^(BIF|BIT|BSL)v16i8")>;
5060b57cec5SDimitry Andric
5070b57cec5SDimitry Andric// ASIMD duplicate, gen reg, D-form and Q-form
5080b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^CPY")>;
5090b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^DUPv.+gpr")>;
5100b57cec5SDimitry Andric
5110b57cec5SDimitry Andric// ASIMD move, saturating
5120b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]QXTU?N")>;
5130b57cec5SDimitry Andric
5140b57cec5SDimitry Andric// ASIMD reciprocal estimate, D-form
5150b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^[FU](RECP|RSQRT)(E|X)(v2f32|v1i32|v2i32|v1i64)")>;
5160b57cec5SDimitry Andric// ASIMD reciprocal estimate, Q-form
5170b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^[FU](RECP|RSQRT)(E|X)(v2f64|v4f32|v4i32)")>;
5180b57cec5SDimitry Andric
5190b57cec5SDimitry Andric// ASIMD reciprocal step, D-form, FZ
5200b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1V], (instregex "^F(RECP|RSQRT)S(v2f32|v1i32|v2i32|v1i64|32|64)")>;
5210b57cec5SDimitry Andric// ASIMD reciprocal step, Q-form, FZ
5220b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2V], (instregex "^F(RECP|RSQRT)S(v2f64|v4f32|v4i32)")>;
5230b57cec5SDimitry Andric
5240b57cec5SDimitry Andric// ASIMD table lookup, D-form
5250b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1V], (instregex "^TB[LX]v8i8One")>;
5260b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2V], (instregex "^TB[LX]v8i8Two")>;
5270b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^TB[LX]v8i8Three")>;
5280b57cec5SDimitry Andricdef : InstRW<[A57Write_12cyc_4V], (instregex "^TB[LX]v8i8Four")>;
5290b57cec5SDimitry Andric// ASIMD table lookup, Q-form
5300b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_3V], (instregex "^TB[LX]v16i8One")>;
5310b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_5V], (instregex "^TB[LX]v16i8Two")>;
5320b57cec5SDimitry Andricdef : InstRW<[A57Write_12cyc_7V], (instregex "^TB[LX]v16i8Three")>;
5330b57cec5SDimitry Andricdef : InstRW<[A57Write_15cyc_9V], (instregex "^TB[LX]v16i8Four")>;
5340b57cec5SDimitry Andric
5350b57cec5SDimitry Andric// ASIMD transfer, element to gen reg
5360b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L], (instregex "^[SU]MOVv")>;
5370b57cec5SDimitry Andric
5380b57cec5SDimitry Andric// ASIMD transfer, gen reg to element
5390b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^INSv")>;
5400b57cec5SDimitry Andric
5410b57cec5SDimitry Andric// ASIMD unzip/zip, Q-form
5420b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_3V], (instregex "^(UZP|ZIP)(1|2)(v16i8|v8i16|v4i32|v2i64)")>;
5430b57cec5SDimitry Andric
5440b57cec5SDimitry Andric
5450b57cec5SDimitry Andric// Remainder
5460b57cec5SDimitry Andric// -----------------------------------------------------------------------------
5470b57cec5SDimitry Andric
5480b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^F(ADD|SUB)[DS]rr")>;
5490b57cec5SDimitry Andric
5500b57cec5SDimitry Andricdef A57WriteFPMA  : SchedWriteRes<[A57UnitV]> { let Latency = 9;  }
5510b57cec5SDimitry Andricdef A57ReadFPMA5  : SchedReadAdvance<5, [A57WriteFPMA]>;
5520b57cec5SDimitry Andricdef A57ReadFPM    : SchedReadAdvance<0>;
5530b57cec5SDimitry Andricdef : InstRW<[A57WriteFPMA, A57ReadFPM, A57ReadFPM, A57ReadFPMA5], (instregex "^FN?M(ADD|SUB)[DS]rrr")>;
5540b57cec5SDimitry Andric
5550b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_1L_1V], (instregex "^[FSU]CVT[AMNPZ][SU](_Int)?[SU]?[XW]?[DS]?[rds]i?")>;
5560b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_1L_1V], (instregex "^[SU]CVTF")>;
5570b57cec5SDimitry Andric
5580b57cec5SDimitry Andricdef : InstRW<[A57Write_32cyc_1W], (instrs FDIVDrr)>;
5590b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instrs FDIVSrr)>;
5600b57cec5SDimitry Andric
5610b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^F(MAX|MIN).+rr")>;
5620b57cec5SDimitry Andric
5630b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FRINT.+r")>;
5640b57cec5SDimitry Andric
5650b57cec5SDimitry Andricdef : InstRW<[A57Write_32cyc_1W], (instrs FSQRTDr)>;
5660b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instrs FSQRTSr)>;
5670b57cec5SDimitry Andric
5680b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDNPDi)>;
5690b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi], (instrs LDNPQi)>;
5700b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDNPSi)>;
5710b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDPDi)>;
5720b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi, WriteAdr], (instrs LDPDpost)>;
5730b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi, WriteAdr], (instrs LDPDpre)>;
5740b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi], (instrs LDPQi)>;
5750b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi, WriteAdr], (instrs LDPQpost)>;
5760b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi, WriteAdr], (instrs LDPQpre)>;
5770b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_2L, WriteLDHi], (instrs LDPSWi)>;
5780b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_2L, WriteLDHi, WriteAdr], (instrs LDPSWpost)>;
5790b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_2L, WriteLDHi, WriteAdr], (instrs LDPSWpre)>;
5800b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDPSi)>;
5810b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi, WriteAdr], (instrs LDPSpost)>;
5820b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi, WriteAdr], (instrs LDPSpre)>;
5830b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRBpost)>;
5840b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instrs LDRBpre)>;
5850b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRBroW)>;
5860b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRBroX)>;
5870b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRBui)>;
5880b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRDl)>;
5890b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRDpost)>;
5900b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instrs LDRDpre)>;
5910b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRDroW)>;
5920b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRDroX)>;
5930b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRDui)>;
5940b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRHHroW)>;
5950b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRHHroX)>;
5960b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRHpost)>;
5970b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instrs LDRHpre)>;
5980b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRHroW)>;
5990b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRHroX)>;
6000b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRHui)>;
6010b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRQl)>;
6020b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRQpost)>;
6030b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instrs LDRQpre)>;
6040b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRQroW)>;
6050b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRQroX)>;
6060b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRQui)>;
6070b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHWroW)>;
6080b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHWroX)>;
6090b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHXroW)>;
6100b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHXroX)>;
6110b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRSl)>;
6120b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRSpost)>;
6130b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instrs LDRSpre)>;
6140b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRSroW)>;
6150b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRSroX)>;
6160b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRSui)>;
6170b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURBi)>;
6180b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURDi)>;
6190b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURHi)>;
6200b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURQi)>;
6210b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURSi)>;
6220b57cec5SDimitry Andric
6230b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STNPDi)>;
6240b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1I_4S], (instrs STNPQi)>;
6250b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STNPXi)>;
6260b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STPDi)>;
6270b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPDpost)>;
6280b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPDpre)>;
6290b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1I_4S], (instrs STPQi)>;
6300b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_1I_4S], (instrs STPQpost)>;
6310b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_2I_4S], (instrs STPQpre)>;
6320b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPSpost)>;
6330b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPSpre)>;
6340b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPWpost)>;
6350b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPWpre)>;
6360b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STPXi)>;
6370b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPXpost)>;
6380b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPXpre)>;
6390b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBBpost)>;
6400b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBBpre)>;
6410b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBpost)>;
6420b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRBpre)>;
6430b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRBroW)>;
6440b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRBroX)>;
6450b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRDpost)>;
6460b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRDpre)>;
6470b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHHpost)>;
6480b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHHpre)>;
6490b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHHroW)>;
6500b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHHroX)>;
6510b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHpost)>;
6520b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRHpre)>;
6530b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHroW)>;
6540b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHroX)>;
6550b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQpost)>;
6560b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STRQpre)>;
6570b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQroW)>;
6580b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQroX)>;
6590b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S], (instrs STRQui)>;
6600b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRSpost)>;
6610b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRSpre)>;
6620b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRWpost)>;
6630b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRWpre)>;
6640b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRXpost)>;
6650b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRXpre)>;
6660b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STURQi)>;
6670b57cec5SDimitry Andric
6680b57cec5SDimitry Andric} // SchedModel = CortexA57Model
669