xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64SchedA57.td (revision 4c2d3b022a1d543dbbff75a0c53e8d3d7242216d)
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
34e837bb5cSDimitry Andric  list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F,
35fe6060f1SDimitry Andric                                                    PAUnsupported.F,
36753f127fSDimitry Andric                                                    SMEUnsupported.F,
37*4c2d3b02SDimitry Andric                                                    [HasMTE, HasCSSC]);
380b57cec5SDimitry Andric}
390b57cec5SDimitry Andric
400b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
410b57cec5SDimitry Andric// Define each kind of processor resource and number available on Cortex-A57.
420b57cec5SDimitry Andric// Cortex A-57 has 8 pipelines that each has its own 8-entry queue where
430b57cec5SDimitry Andric// micro-ops wait for their operands and then issue out-of-order.
440b57cec5SDimitry Andric
450b57cec5SDimitry Andricdef A57UnitB : ProcResource<1>;  // Type B micro-ops
460b57cec5SDimitry Andricdef A57UnitI : ProcResource<2>;  // Type I micro-ops
470b57cec5SDimitry Andricdef A57UnitM : ProcResource<1>;  // Type M micro-ops
480b57cec5SDimitry Andricdef A57UnitL : ProcResource<1>;  // Type L micro-ops
490b57cec5SDimitry Andricdef A57UnitS : ProcResource<1>;  // Type S micro-ops
500b57cec5SDimitry Andricdef A57UnitX : ProcResource<1>;  // Type X micro-ops
510b57cec5SDimitry Andricdef A57UnitW : ProcResource<1>;  // Type W micro-ops
520b57cec5SDimitry Andriclet SchedModel = CortexA57Model in {
530b57cec5SDimitry Andric  def A57UnitV : ProcResGroup<[A57UnitX, A57UnitW]>;    // Type V micro-ops
540b57cec5SDimitry Andric}
550b57cec5SDimitry Andric
560b57cec5SDimitry Andriclet SchedModel = CortexA57Model in {
570b57cec5SDimitry Andric
580b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
590b57cec5SDimitry Andric// Define customized scheduler read/write types specific to the Cortex-A57.
600b57cec5SDimitry Andric
610b57cec5SDimitry Andricinclude "AArch64SchedA57WriteRes.td"
620b57cec5SDimitry Andric
630b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
640b57cec5SDimitry Andric// Map the target-defined scheduler read/write resources and latency for
650b57cec5SDimitry Andric// Cortex-A57. The Cortex-A57 types are directly associated with resources, so
660b57cec5SDimitry Andric// defining the aliases precludes the need for mapping them using WriteRes. The
670b57cec5SDimitry Andric// aliases are sufficient for creating a coarse, working model. As the model
680b57cec5SDimitry Andric// evolves, InstRWs will be used to override some of these SchedAliases.
690b57cec5SDimitry Andric//
700b57cec5SDimitry Andric// WARNING: Using SchedAliases is convenient and works well for latency and
710b57cec5SDimitry Andric//          resource lookup for instructions. However, this creates an entry in
720b57cec5SDimitry Andric//          AArch64WriteLatencyTable with a WriteResourceID of 0, breaking
730b57cec5SDimitry Andric//          any SchedReadAdvance since the lookup will fail.
740b57cec5SDimitry Andric
750b57cec5SDimitry Andricdef : SchedAlias<WriteImm,   A57Write_1cyc_1I>;
760b57cec5SDimitry Andricdef : SchedAlias<WriteI,     A57Write_1cyc_1I>;
770b57cec5SDimitry Andricdef : SchedAlias<WriteISReg, A57Write_2cyc_1M>;
780b57cec5SDimitry Andricdef : SchedAlias<WriteIEReg, A57Write_2cyc_1M>;
790b57cec5SDimitry Andricdef : SchedAlias<WriteExtr,  A57Write_1cyc_1I>;
800b57cec5SDimitry Andricdef : SchedAlias<WriteIS,    A57Write_1cyc_1I>;
810b57cec5SDimitry Andricdef : SchedAlias<WriteID32,  A57Write_19cyc_1M>;
820b57cec5SDimitry Andricdef : SchedAlias<WriteID64,  A57Write_35cyc_1M>;
830b57cec5SDimitry Andricdef : WriteRes<WriteIM32, [A57UnitM]> { let Latency = 3; }
840b57cec5SDimitry Andricdef : WriteRes<WriteIM64, [A57UnitM]> { let Latency = 5; }
850b57cec5SDimitry Andricdef : SchedAlias<WriteBr,    A57Write_1cyc_1B>;
860b57cec5SDimitry Andricdef : SchedAlias<WriteBrReg, A57Write_1cyc_1B>;
870b57cec5SDimitry Andricdef : SchedAlias<WriteLD,    A57Write_4cyc_1L>;
880b57cec5SDimitry Andricdef : SchedAlias<WriteST,    A57Write_1cyc_1S>;
890b57cec5SDimitry Andricdef : SchedAlias<WriteSTP,   A57Write_1cyc_1S>;
900b57cec5SDimitry Andricdef : SchedAlias<WriteAdr,   A57Write_1cyc_1I>;
910b57cec5SDimitry Andricdef : SchedAlias<WriteLDIdx, A57Write_4cyc_1I_1L>;
920b57cec5SDimitry Andricdef : SchedAlias<WriteSTIdx, A57Write_1cyc_1I_1S>;
930b57cec5SDimitry Andricdef : SchedAlias<WriteF,     A57Write_3cyc_1V>;
940b57cec5SDimitry Andricdef : SchedAlias<WriteFCmp,  A57Write_3cyc_1V>;
950b57cec5SDimitry Andricdef : SchedAlias<WriteFCvt,  A57Write_5cyc_1V>;
960b57cec5SDimitry Andricdef : SchedAlias<WriteFCopy, A57Write_5cyc_1L>;
970b57cec5SDimitry Andricdef : SchedAlias<WriteFImm,  A57Write_3cyc_1V>;
98e8d8bef9SDimitry Andricdef : WriteRes<WriteFMul, [A57UnitV]> { let Latency = 5;}
990b57cec5SDimitry Andricdef : SchedAlias<WriteFDiv,  A57Write_17cyc_1W>;
100349cc55cSDimitry Andricdef : SchedAlias<WriteVd,    A57Write_3cyc_1V>;
101349cc55cSDimitry Andricdef : SchedAlias<WriteVq,    A57Write_3cyc_1V>;
1020b57cec5SDimitry Andricdef : SchedAlias<WriteVLD,   A57Write_5cyc_1L>;
1030b57cec5SDimitry Andricdef : SchedAlias<WriteVST,   A57Write_1cyc_1S>;
1040b57cec5SDimitry Andric
1050b57cec5SDimitry Andricdef : WriteRes<WriteAtomic,  []> { let Unsupported = 1; }
1060b57cec5SDimitry Andric
1070b57cec5SDimitry Andricdef : WriteRes<WriteSys,     []> { let Latency = 1; }
1080b57cec5SDimitry Andricdef : WriteRes<WriteBarrier, []> { let Latency = 1; }
1090b57cec5SDimitry Andricdef : WriteRes<WriteHint,    []> { let Latency = 1; }
1100b57cec5SDimitry Andric
1110b57cec5SDimitry Andricdef : WriteRes<WriteLDHi,    []> { let Latency = 4; }
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andric// Forwarding logic is only modeled for multiply and accumulate
1140b57cec5SDimitry Andricdef : ReadAdvance<ReadI,       0>;
1150b57cec5SDimitry Andricdef : ReadAdvance<ReadISReg,   0>;
1160b57cec5SDimitry Andricdef : ReadAdvance<ReadIEReg,   0>;
1170b57cec5SDimitry Andricdef : ReadAdvance<ReadIM,      0>;
1180b57cec5SDimitry Andricdef : ReadAdvance<ReadIMA,     2, [WriteIM32, WriteIM64]>;
1190b57cec5SDimitry Andricdef : ReadAdvance<ReadID,      0>;
1200b57cec5SDimitry Andricdef : ReadAdvance<ReadExtrHi,  0>;
121349cc55cSDimitry Andricdef : ReadAdvance<ReadST,      0>;
1220b57cec5SDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>;
1230b57cec5SDimitry Andricdef : ReadAdvance<ReadVLD,     0>;
1240b57cec5SDimitry Andric
1250b57cec5SDimitry Andric
1260b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1270b57cec5SDimitry Andric// Specialize the coarse model by associating instruction groups with the
1280b57cec5SDimitry Andric// subtarget-defined types. As the modeled is refined, this will override most
1290b57cec5SDimitry Andric// of the above ShchedAlias mappings.
1300b57cec5SDimitry Andric
1310b57cec5SDimitry Andric// Miscellaneous
1320b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1330b57cec5SDimitry Andric
1340b57cec5SDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>;
1350b57cec5SDimitry Andric
1360b57cec5SDimitry Andric
1370b57cec5SDimitry Andric// Branch Instructions
1380b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1390b57cec5SDimitry Andric
1400b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1B_1I], (instrs BL)>;
1410b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1B_1I], (instrs BLR)>;
1420b57cec5SDimitry Andric
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andric// Shifted Register with Shift == 0
1450b57cec5SDimitry Andric// ----------------------------------------------------------------------------
1460b57cec5SDimitry Andric
1470b57cec5SDimitry Andricdef A57WriteISReg : SchedWriteVariant<[
1480b57cec5SDimitry Andric       SchedVar<RegShiftedPred, [WriteISReg]>,
1490b57cec5SDimitry Andric       SchedVar<NoSchedPred, [WriteI]>]>;
1500b57cec5SDimitry Andricdef : InstRW<[A57WriteISReg], (instregex ".*rs$")>;
1510b57cec5SDimitry Andric
1520b57cec5SDimitry Andric
1530b57cec5SDimitry Andric// Divide and Multiply Instructions
1540b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1550b57cec5SDimitry Andric
1560b57cec5SDimitry Andric// Multiply high
1570b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1M], (instrs SMULHrr, UMULHrr)>;
1580b57cec5SDimitry Andric
1590b57cec5SDimitry Andric
1600b57cec5SDimitry Andric// Miscellaneous Data-Processing Instructions
1610b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1620b57cec5SDimitry Andric
1630b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1I],    (instrs EXTRWrri)>;
1640b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1M], (instrs EXTRXrri)>;
1650b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1M],    (instregex "BFM")>;
1660b57cec5SDimitry Andric
1670b57cec5SDimitry Andric
1680b57cec5SDimitry Andric// Cryptography Extensions
1690b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1700b57cec5SDimitry Andric
1710b57cec5SDimitry Andricdef A57ReadAES  : SchedReadAdvance<3, [A57Write_3cyc_1W]>;
1720b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^AES[DE]")>;
1730b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W, A57ReadAES], (instregex "^AESI?MC")>;
1740b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2V], (instregex "^SHA1SU0")>;
1750b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^SHA1(H|SU1)")>;
1760b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^SHA1[CMP]")>;
1770b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^SHA256SU0")>;
1780b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^SHA256(H|H2|SU1)")>;
1790b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^CRC32")>;
1800b57cec5SDimitry Andric
1810b57cec5SDimitry Andric
1820b57cec5SDimitry Andric// Vector Load
1830b57cec5SDimitry Andric// -----------------------------------------------------------------------------
1840b57cec5SDimitry Andric
1850b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],           (instregex "LD1i(8|16|32)$")>;
1865f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V], (instregex "LD1i(8|16|32)_POST$")>;
1870b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],            (instregex "LD1i(64)$")>;
1885f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L],  (instregex "LD1i(64)_POST$")>;
1890b57cec5SDimitry Andric
1900b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],           (instregex "LD1Rv(8b|4h|2s)$")>;
1915f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V], (instregex "LD1Rv(8b|4h|2s)_POST$")>;
1920b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],            (instregex "LD1Rv(1d)$")>;
1935f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L],  (instregex "LD1Rv(1d)_POST$")>;
1940b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],           (instregex "LD1Rv(16b|8h|4s|2d)$")>;
1955f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V], (instregex "LD1Rv(16b|8h|4s|2d)_POST$")>;
1960b57cec5SDimitry Andric
1970b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],              (instregex "LD1Onev(8b|4h|2s|1d)$")>;
1985f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L],    (instregex "LD1Onev(8b|4h|2s|1d)_POST$")>;
1990b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],              (instregex "LD1Onev(16b|8h|4s|2d)$")>;
2005f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L],    (instregex "LD1Onev(16b|8h|4s|2d)_POST$")>;
2010b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],              (instregex "LD1Twov(8b|4h|2s|1d)$")>;
2025f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L],    (instregex "LD1Twov(8b|4h|2s|1d)_POST$")>;
2030b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],             (instregex "LD1Twov(16b|8h|4s|2d)$")>;
2045f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L],   (instregex "LD1Twov(16b|8h|4s|2d)_POST$")>;
2050b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],             (instregex "LD1Threev(8b|4h|2s|1d)$")>;
2065f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L],   (instregex "LD1Threev(8b|4h|2s|1d)_POST$")>;
2070b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_3L],            (instregex "LD1Threev(16b|8h|4s|2d)$")>;
2085f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_7cyc_3L],  (instregex "LD1Threev(16b|8h|4s|2d)_POST$")>;
2090b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],             (instregex "LD1Fourv(8b|4h|2s|1d)$")>;
2105f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L],   (instregex "LD1Fourv(8b|4h|2s|1d)_POST$")>;
2110b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L],           (instregex "LD1Fourv(16b|8h|4s|2d)$")>;
2125f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_4L], (instregex "LD1Fourv(16b|8h|4s|2d)_POST$")>;
2130b57cec5SDimitry Andric
2140b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],           (instregex "LD2i(8|16)$")>;
2155f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V], (instregex "LD2i(8|16)_POST$")>;
2160b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],            (instregex "LD2i(32)$")>;
2175f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L],  (instregex "LD2i(32)_POST$")>;
2180b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],            (instregex "LD2i(64)$")>;
2195f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V],  (instregex "LD2i(64)_POST$")>;
2200b57cec5SDimitry Andric
2210b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],            (instregex "LD2Rv(8b|4h|2s)$")>;
2225f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V],  (instregex "LD2Rv(8b|4h|2s)_POST$")>;
2230b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L],             (instregex "LD2Rv(1d)$")>;
2245f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L],   (instregex "LD2Rv(1d)_POST$")>;
2250b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],           (instregex "LD2Rv(16b|8h|4s|2d)$")>;
2265f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V], (instregex "LD2Rv(16b|8h|4s|2d)_POST$")>;
2270b57cec5SDimitry Andric
2280b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V],             (instregex "LD2Twov(8b|4h|2s)$")>;
2295f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V],   (instregex "LD2Twov(8b|4h|2s)_POST$")>;
2300b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V],           (instregex "LD2Twov(16b|8h|4s)$")>;
2315f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_2V], (instregex "LD2Twov(16b|8h|4s)_POST$")>;
2320b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],             (instregex "LD2Twov(2d)$")>;
2335f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L],   (instregex "LD2Twov(2d)_POST$")>;
2340b57cec5SDimitry Andric
2350b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V],           (instregex "LD3i(8|16)$")>;
2365f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_1L_3V], (instregex "LD3i(8|16)_POST$")>;
2370b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],            (instregex "LD3i(32)$")>;
2385f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V],  (instregex "LD3i(32)_POST$")>;
2390b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],             (instregex "LD3i(64)$")>;
2405f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L],   (instregex "LD3i(64)_POST$")>;
2410b57cec5SDimitry Andric
2420b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],             (instregex "LD3Rv(8b|4h|2s)$")>;
2435f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V],   (instregex "LD3Rv(8b|4h|2s)_POST$")>;
2440b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],              (instregex "LD3Rv(1d)$")>;
2455f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L],    (instregex "LD3Rv(1d)_POST$")>;
2460b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V],            (instregex "LD3Rv(16b|8h|4s)$")>;
2475f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_1L_3V],  (instregex "LD3Rv(16b|8h|4s)_POST$")>;
2480b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V],           (instregex "LD3Rv(2d)$")>;
2495f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_3V], (instregex "LD3Rv(2d)_POST$")>;
2500b57cec5SDimitry Andric
2510b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V],               (instregex "LD3Threev(8b|4h|2s)$")>;
2525f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_2V],     (instregex "LD3Threev(8b|4h|2s)_POST$")>;
2530b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_3L_4V],           (instregex "LD3Threev(16b|8h|4s)$")>;
2545f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_10cyc_3L_4V], (instregex "LD3Threev(16b|8h|4s)_POST$")>;
2550b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L],               (instregex "LD3Threev(2d)$")>;
2565f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_4L],     (instregex "LD3Threev(2d)_POST$")>;
2570b57cec5SDimitry Andric
2580b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V],           (instregex "LD4i(8|16)$")>;
2595f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_3V], (instregex "LD4i(8|16)_POST$")>;
2600b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],             (instregex "LD4i(32)$")>;
2615f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V],   (instregex "LD4i(32)_POST$")>;
2620b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V],           (instregex "LD4i(64)$")>;
2635f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_3V], (instregex "LD4i(64)_POST$")>;
2640b57cec5SDimitry Andric
2650b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V],              (instregex "LD4Rv(8b|4h|2s)$")>;
2665f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V],    (instregex "LD4Rv(8b|4h|2s)_POST$")>;
2670b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L],               (instregex "LD4Rv(1d)$")>;
2685f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L],     (instregex "LD4Rv(1d)_POST$")>;
2690b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V],            (instregex "LD4Rv(16b|8h|4s)$")>;
2705f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_3V],  (instregex "LD4Rv(16b|8h|4s)_POST$")>;
2710b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_4V],           (instregex "LD4Rv(2d)$")>;
2725f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_4V], (instregex "LD4Rv(2d)_POST$")>;
2730b57cec5SDimitry Andric
2740b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V],                (instregex "LD4Fourv(8b|4h|2s)$")>;
2755f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_2V],      (instregex "LD4Fourv(8b|4h|2s)_POST$")>;
2760b57cec5SDimitry Andricdef : InstRW<[A57Write_11cyc_4L_4V],           (instregex "LD4Fourv(16b|8h|4s)$")>;
2775f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_11cyc_4L_4V], (instregex "LD4Fourv(16b|8h|4s)_POST$")>;
2780b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L],                (instregex "LD4Fourv(2d)$")>;
2795f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_4L],      (instregex "LD4Fourv(2d)_POST$")>;
2800b57cec5SDimitry Andric
2810b57cec5SDimitry Andric// Vector Store
2820b57cec5SDimitry Andric// -----------------------------------------------------------------------------
2830b57cec5SDimitry Andric
2840b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S],            (instregex "ST1i(8|16|32)$")>;
2855f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1S],  (instregex "ST1i(8|16|32)_POST$")>;
2860b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V],           (instregex "ST1i(64)$")>;
2875f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_1S_1V], (instregex "ST1i(64)_POST$")>;
2880b57cec5SDimitry Andric
2890b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S],                  (instregex "ST1Onev(8b|4h|2s|1d)$")>;
2905f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1S],        (instregex "ST1Onev(8b|4h|2s|1d)_POST$")>;
2910b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S],                 (instregex "ST1Onev(16b|8h|4s|2d)$")>;
2925f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_2S],       (instregex "ST1Onev(16b|8h|4s|2d)_POST$")>;
2930b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S],                 (instregex "ST1Twov(8b|4h|2s|1d)$")>;
2945f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_2S],       (instregex "ST1Twov(8b|4h|2s|1d)_POST$")>;
2950b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S],               (instregex "ST1Twov(16b|8h|4s|2d)$")>;
2965f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S],     (instregex "ST1Twov(16b|8h|4s|2d)_POST$")>;
2970b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S],                (instregex "ST1Threev(8b|4h|2s|1d)$")>;
2985f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_3S],      (instregex "ST1Threev(8b|4h|2s|1d)_POST$")>;
2990b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S],             (instregex "ST1Threev(16b|8h|4s|2d)$")>;
3005f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_6S],   (instregex "ST1Threev(16b|8h|4s|2d)_POST$")>;
3010b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S],               (instregex "ST1Fourv(8b|4h|2s|1d)$")>;
3025f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S],     (instregex "ST1Fourv(8b|4h|2s|1d)_POST$")>;
3030b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S],           (instregex "ST1Fourv(16b|8h|4s|2d)$")>;
3045f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_8S], (instregex "ST1Fourv(16b|8h|4s|2d)_POST$")>;
3050b57cec5SDimitry Andric
3060b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V],           (instregex "ST2i(8|16|32)$")>;
3075f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_1S_1V], (instregex "ST2i(8|16|32)_POST$")>;
3080b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S],           (instregex "ST2i(64)$")>;
3095f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_2S], (instregex "ST2i(64)_POST$")>;
3100b57cec5SDimitry Andric
3110b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V],              (instregex "ST2Twov(8b|4h|2s)$")>;
3125f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_2S_1V],    (instregex "ST2Twov(8b|4h|2s)_POST$")>;
3130b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V],           (instregex "ST2Twov(16b|8h|4s)$")>;
3145f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S_2V], (instregex "ST2Twov(16b|8h|4s)_POST$")>;
3150b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S],             (instregex "ST2Twov(2d)$")>;
3165f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S],   (instregex "ST2Twov(2d)_POST$")>;
3170b57cec5SDimitry Andric
3180b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V],            (instregex "ST3i(8|16)$")>;
3195f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_1S_1V],  (instregex "ST3i(8|16)_POST$")>;
3200b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S],           (instregex "ST3i(32)$")>;
3215f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_3S], (instregex "ST3i(32)_POST$")>;
3220b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V],           (instregex "ST3i(64)$")>;
3235f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_2S_1V], (instregex "ST3i(64)_POST$")>;
3240b57cec5SDimitry Andric
3250b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S_2V],                 (instregex "ST3Threev(8b|4h|2s)$")>;
3265f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_3S_2V],       (instregex "ST3Threev(8b|4h|2s)_POST$")>;
3270b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S_4V],           (instregex "ST3Threev(16b|8h|4s)$")>;
3285f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_6S_4V], (instregex "ST3Threev(16b|8h|4s)_POST$")>;
3290b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S],                (instregex "ST3Threev(2d)$")>;
3305f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_6S],      (instregex "ST3Threev(2d)_POST$")>;
3310b57cec5SDimitry Andric
3320b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V],             (instregex "ST4i(8|16)$")>;
3335f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_1S_1V],   (instregex "ST4i(8|16)_POST$")>;
3340b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S],           (instregex "ST4i(32)$")>;
3355f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S], (instregex "ST4i(32)_POST$")>;
3360b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V],            (instregex "ST4i(64)$")>;
3375f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_2S_1V],  (instregex "ST4i(64)_POST$")>;
3380b57cec5SDimitry Andric
3390b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V],                  (instregex "ST4Fourv(8b|4h|2s)$")>;
3405f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S_2V],        (instregex "ST4Fourv(8b|4h|2s)_POST$")>;
3410b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S_4V],           (instregex "ST4Fourv(16b|8h|4s)$")>;
3425f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_8S_4V], (instregex "ST4Fourv(16b|8h|4s)_POST$")>;
3430b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S],                (instregex "ST4Fourv(2d)$")>;
3445f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_8S],      (instregex "ST4Fourv(2d)_POST$")>;
3450b57cec5SDimitry Andric
3460b57cec5SDimitry Andric// Vector - Integer
3470b57cec5SDimitry Andric// -----------------------------------------------------------------------------
3480b57cec5SDimitry Andric
3490b57cec5SDimitry Andric// Reference for forms in this group
3500b57cec5SDimitry Andric//   D form - v8i8, v4i16, v2i32
3510b57cec5SDimitry Andric//   Q form - v16i8, v8i16, v4i32
3520b57cec5SDimitry Andric//   D form - v1i8, v1i16, v1i32, v1i64
3530b57cec5SDimitry Andric//   Q form - v16i8, v8i16, v4i32, v2i64
3540b57cec5SDimitry Andric//   D form - v8i8_v8i16, v4i16_v4i32, v2i32_v2i64
3550b57cec5SDimitry Andric//   Q form - v16i8_v8i16, v8i16_v4i32, v4i32_v2i64
3560b57cec5SDimitry Andric
357e8d8bef9SDimitry Andric// Cortex A57 Software Optimization Guide Sec 3.14
358e8d8bef9SDimitry Andric// Advance for absolute diff accum, pairwise add and accumulate, shift accumulate
359e8d8bef9SDimitry Andricdef A57ReadIVA3 : SchedReadAdvance<3, [A57Write_4cyc_1X_NonMul_Forward, A57Write_5cyc_2X_NonMul_Forward]>;
360e8d8bef9SDimitry Andric
3610b57cec5SDimitry Andric// ASIMD absolute diff accum, D-form
362e8d8bef9SDimitry Andricdef : InstRW<[A57Write_4cyc_1X_NonMul_Forward, A57ReadIVA3], (instregex "^[SU]ABA(v8i8|v4i16|v2i32)$")>;
3630b57cec5SDimitry Andric// ASIMD absolute diff accum, Q-form
364e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_2X_NonMul_Forward, A57ReadIVA3], (instregex "^[SU]ABA(v16i8|v8i16|v4i32)$")>;
3650b57cec5SDimitry Andric// ASIMD absolute diff accum long
366e8d8bef9SDimitry Andricdef : InstRW<[A57Write_4cyc_1X_NonMul_Forward, A57ReadIVA3], (instregex "^[SU]ABAL")>;
3670b57cec5SDimitry Andric
3680b57cec5SDimitry Andric// ASIMD arith, reduce, 4H/4S
3690b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]?ADDL?V(v8i8|v4i16|v2i32)v$")>;
3700b57cec5SDimitry Andric// ASIMD arith, reduce, 8B/8H
3710b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_1V_1X], (instregex "^[SU]?ADDL?V(v8i16|v4i32)v$")>;
3720b57cec5SDimitry Andric// ASIMD arith, reduce, 16B
3730b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_2X], (instregex "^[SU]?ADDL?Vv16i8v$")>;
3740b57cec5SDimitry Andric
3750b57cec5SDimitry Andric// ASIMD max/min, reduce, 4H/4S
3760b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU](MIN|MAX)V(v4i16|v4i32)v$")>;
3770b57cec5SDimitry Andric// ASIMD max/min, reduce, 8B/8H
3780b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_1V_1X], (instregex "^[SU](MIN|MAX)V(v8i8|v8i16)v$")>;
3790b57cec5SDimitry Andric// ASIMD max/min, reduce, 16B
3800b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_2X], (instregex "^[SU](MIN|MAX)Vv16i8v$")>;
3810b57cec5SDimitry Andric
3820b57cec5SDimitry Andric// ASIMD multiply, D-form
383e8d8bef9SDimitry Andric// MUL
384e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W_Mul_Forward], (instregex "^MUL(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)(_indexed)?$")>;
385e8d8bef9SDimitry Andric// PMUL, SQDMULH, SQRDMULH
386e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^(PMUL|SQR?DMULH)(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)(_indexed)?$")>;
387e8d8bef9SDimitry Andric
3880b57cec5SDimitry Andric// ASIMD multiply, Q-form
389e8d8bef9SDimitry Andric// MUL
390e8d8bef9SDimitry Andricdef : InstRW<[A57Write_6cyc_2W_Mul_Forward], (instregex "^MUL(v16i8|v8i16|v4i32)(_indexed)?$")>;
391e8d8bef9SDimitry Andric// PMUL, SQDMULH, SQRDMULH
392e8d8bef9SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^(PMUL|SQR?DMULH)(v16i8|v8i16|v4i32)(_indexed)?$")>;
393e8d8bef9SDimitry Andric
394e8d8bef9SDimitry Andric// Cortex A57 Software Optimization Guide Sec 3.14
395e8d8bef9SDimitry Andricdef A57ReadIVMA4   : SchedReadAdvance<4 , [A57Write_5cyc_1W_Mul_Forward, A57Write_6cyc_2W_Mul_Forward]>;
396e8d8bef9SDimitry Andricdef A57ReadIVMA3   : SchedReadAdvance<3 , [A57Write_5cyc_1W_Mul_Forward, A57Write_6cyc_2W_Mul_Forward]>;
3970b57cec5SDimitry Andric
3980b57cec5SDimitry Andric// ASIMD multiply accumulate, D-form
399e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W_Mul_Forward, A57ReadIVMA4], (instregex "^ML[AS](v8i8|v4i16|v2i32)(_indexed)?$")>;
4000b57cec5SDimitry Andric// ASIMD multiply accumulate, Q-form
401e8d8bef9SDimitry Andricdef : InstRW<[A57Write_6cyc_2W_Mul_Forward, A57ReadIVMA4], (instregex "^ML[AS](v16i8|v8i16|v4i32)(_indexed)?$")>;
4020b57cec5SDimitry Andric
4030b57cec5SDimitry Andric// ASIMD multiply accumulate long
4040b57cec5SDimitry Andric// ASIMD multiply accumulate saturating long
405e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W_Mul_Forward, A57ReadIVMA4], (instregex "^(S|U)ML[AS]L")>;
406e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W_Mul_Forward, A57ReadIVMA3], (instregex "^SQDML[AS]L")>;
4070b57cec5SDimitry Andric
4080b57cec5SDimitry Andric// ASIMD multiply long
409e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W_Mul_Forward], (instregex "^(S|U)MULL")>;
410e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^SQDMULL")>;
4110b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^PMULL(v8i8|v16i8)")>;
4120b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^PMULL(v1i64|v2i64)")>;
4130b57cec5SDimitry Andric
4140b57cec5SDimitry Andric// ASIMD pairwise add and accumulate
4150b57cec5SDimitry Andric// ASIMD shift accumulate
416e8d8bef9SDimitry Andricdef : InstRW<[A57Write_4cyc_1X_NonMul_Forward, A57ReadIVA3], (instregex "^[SU]ADALP")>;
417e8d8bef9SDimitry Andricdef : InstRW<[A57Write_4cyc_1X_NonMul_Forward, A57ReadIVA3], (instregex "^(S|SR|U|UR)SRA")>;
4180b57cec5SDimitry Andric
4190b57cec5SDimitry Andric// ASIMD shift by immed, complex
4200b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]?(Q|R){1,2}SHR")>;
4210b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^SQSHLU")>;
4220b57cec5SDimitry Andric
4230b57cec5SDimitry Andric
4240b57cec5SDimitry Andric// ASIMD shift by register, basic, Q-form
4250b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_2X], (instregex "^[SU]SHL(v16i8|v8i16|v4i32|v2i64)")>;
4260b57cec5SDimitry Andric
4270b57cec5SDimitry Andric// ASIMD shift by register, complex, D-form
4280b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU][QR]{1,2}SHL(v1i8|v1i16|v1i32|v1i64|v8i8|v4i16|v2i32|b|d|h|s)")>;
4290b57cec5SDimitry Andric
4300b57cec5SDimitry Andric// ASIMD shift by register, complex, Q-form
4310b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2X], (instregex "^[SU][QR]{1,2}SHL(v16i8|v8i16|v4i32|v2i64)")>;
4320b57cec5SDimitry Andric
4330b57cec5SDimitry Andric
4340b57cec5SDimitry Andric// Vector - Floating Point
4350b57cec5SDimitry Andric// -----------------------------------------------------------------------------
4360b57cec5SDimitry Andric
4370b57cec5SDimitry Andric// Reference for forms in this group
4380b57cec5SDimitry Andric//   D form - v2f32
4390b57cec5SDimitry Andric//   Q form - v4f32, v2f64
4400b57cec5SDimitry Andric//   D form - 32, 64
4410b57cec5SDimitry Andric//   D form - v1i32, v1i64
4420b57cec5SDimitry Andric//   D form - v2i32
4430b57cec5SDimitry Andric//   Q form - v4i32, v2i64
4440b57cec5SDimitry Andric
4450b57cec5SDimitry Andric// ASIMD FP arith, normal, D-form
4460b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FABD|FADD|FSUB)(v2f32|32|64|v2i32p)")>;
4470b57cec5SDimitry Andric// ASIMD FP arith, normal, Q-form
4480b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FABD|FADD|FSUB)(v4f32|v2f64|v2i64p)")>;
4490b57cec5SDimitry Andric
4500b57cec5SDimitry Andric// ASIMD FP arith, pairwise, D-form
4510b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FADDP(v2f32|32|64|v2i32)")>;
4520b57cec5SDimitry Andric// ASIMD FP arith, pairwise, Q-form
4530b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^FADDP(v4f32|v2f64|v2i64)")>;
4540b57cec5SDimitry Andric
4550b57cec5SDimitry Andric// ASIMD FP compare, D-form
4560b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FACGE|FACGT|FCMEQ|FCMGE|FCMGT|FCMLE|FCMLT)(v2f32|32|64|v1i32|v2i32|v1i64)")>;
4570b57cec5SDimitry Andric// ASIMD FP compare, Q-form
4580b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FACGE|FACGT|FCMEQ|FCMGE|FCMGT|FCMLE|FCMLT)(v4f32|v2f64|v4i32|v2i64)")>;
4590b57cec5SDimitry Andric
4600b57cec5SDimitry Andric// ASIMD FP convert, long and narrow
4610b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_3V], (instregex "^FCVT(L|N|XN)v")>;
4620b57cec5SDimitry Andric// ASIMD FP convert, other, D-form
463753f127fSDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^[FSU]CVT([AMNPZ][SU])?(_Int)?(v2f32|v1i32|v2i32|v1i64)")>;
4640b57cec5SDimitry Andric// ASIMD FP convert, other, Q-form
465753f127fSDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^[FSU]CVT([AMNPZ][SU])?(_Int)?(v4f32|v2f64|v4i32|v2i64)")>;
4660b57cec5SDimitry Andric
4670b57cec5SDimitry Andric// ASIMD FP divide, D-form, F32
4680b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instregex "FDIVv2f32")>;
4690b57cec5SDimitry Andric// ASIMD FP divide, Q-form, F32
4700b57cec5SDimitry Andricdef : InstRW<[A57Write_34cyc_2W], (instregex "FDIVv4f32")>;
4710b57cec5SDimitry Andric// ASIMD FP divide, Q-form, F64
4720b57cec5SDimitry Andricdef : InstRW<[A57Write_64cyc_2W], (instregex "FDIVv2f64")>;
4730b57cec5SDimitry Andric
4740b57cec5SDimitry Andric// Note: These were simply duplicated from ASIMD FDIV because of missing documentation
4750b57cec5SDimitry Andric// ASIMD FP square root, D-form, F32
4760b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instregex "FSQRTv2f32")>;
4770b57cec5SDimitry Andric// ASIMD FP square root, Q-form, F32
4780b57cec5SDimitry Andricdef : InstRW<[A57Write_34cyc_2W], (instregex "FSQRTv4f32")>;
4790b57cec5SDimitry Andric// ASIMD FP square root, Q-form, F64
4800b57cec5SDimitry Andricdef : InstRW<[A57Write_64cyc_2W], (instregex "FSQRTv2f64")>;
4810b57cec5SDimitry Andric
4820b57cec5SDimitry Andric// ASIMD FP max/min, normal, D-form
4830b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FMAX|FMIN)(NM)?(v2f32)")>;
4840b57cec5SDimitry Andric// ASIMD FP max/min, normal, Q-form
4850b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FMAX|FMIN)(NM)?(v4f32|v2f64)")>;
4860b57cec5SDimitry Andric// ASIMD FP max/min, pairwise, D-form
4870b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FMAX|FMIN)(NM)?P(v2f32|v2i32)")>;
4880b57cec5SDimitry Andric// ASIMD FP max/min, pairwise, Q-form
4890b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^(FMAX|FMIN)(NM)?P(v4f32|v2f64|v2i64)")>;
4900b57cec5SDimitry Andric// ASIMD FP max/min, reduce
4910b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_3V], (instregex "^(FMAX|FMIN)(NM)?Vv")>;
4920b57cec5SDimitry Andric
4930b57cec5SDimitry Andric// ASIMD FP multiply, D-form, FZ
494e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1V_FP_Forward], (instregex "^FMULX?(v2f32|v1i32|v2i32|v1i64|32|64)")>;
4950b57cec5SDimitry Andric// ASIMD FP multiply, Q-form, FZ
496e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_2V_FP_Forward], (instregex "^FMULX?(v4f32|v2f64|v4i32|v2i64)")>;
4970b57cec5SDimitry Andric
4980b57cec5SDimitry Andric// ASIMD FP multiply accumulate, D-form, FZ
4990b57cec5SDimitry Andric// ASIMD FP multiply accumulate, Q-form, FZ
5000b57cec5SDimitry Andricdef A57WriteFPVMAD : SchedWriteRes<[A57UnitV]> { let Latency = 9;  }
5010b57cec5SDimitry Andricdef A57WriteFPVMAQ : SchedWriteRes<[A57UnitV, A57UnitV]> { let Latency = 10;  }
502e8d8bef9SDimitry Andric
503e8d8bef9SDimitry Andric// Cortex A57 Software Optimization Guide Sec 3.15
504e8d8bef9SDimitry Andric// Advances from FP mul and mul-accum to mul-accum
505e8d8bef9SDimitry Andricdef A57ReadFPVMA5  : SchedReadAdvance<5, [A57WriteFPVMAD, A57WriteFPVMAQ, A57Write_5cyc_1V_FP_Forward, A57Write_5cyc_2V_FP_Forward]>;
506e8d8bef9SDimitry Andricdef A57ReadFPVMA6  : SchedReadAdvance<6, [A57WriteFPVMAD, A57WriteFPVMAQ, A57Write_5cyc_1V_FP_Forward, A57Write_5cyc_2V_FP_Forward]>;
507e8d8bef9SDimitry Andric
5080b57cec5SDimitry Andricdef : InstRW<[A57WriteFPVMAD, A57ReadFPVMA5], (instregex "^FML[AS](v2f32|v1i32|v2i32|v1i64)")>;
509e8d8bef9SDimitry Andricdef : InstRW<[A57WriteFPVMAQ, A57ReadFPVMA6], (instregex "^FML[AS](v4f32|v2f64|v4i32|v2i64)")>;
5100b57cec5SDimitry Andric
5110b57cec5SDimitry Andric// ASIMD FP round, D-form
5120b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FRINT[AIMNPXZ](v2f32)")>;
5130b57cec5SDimitry Andric// ASIMD FP round, Q-form
5140b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^FRINT[AIMNPXZ](v4f32|v2f64)")>;
5150b57cec5SDimitry Andric
5160b57cec5SDimitry Andric
5170b57cec5SDimitry Andric// Vector - Miscellaneous
5180b57cec5SDimitry Andric// -----------------------------------------------------------------------------
5190b57cec5SDimitry Andric
5200b57cec5SDimitry Andric// Reference for forms in this group
5210b57cec5SDimitry Andric//   D form - v8i8, v4i16, v2i32
5220b57cec5SDimitry Andric//   Q form - v16i8, v8i16, v4i32
5230b57cec5SDimitry Andric//   D form - v1i8, v1i16, v1i32, v1i64
5240b57cec5SDimitry Andric//   Q form - v16i8, v8i16, v4i32, v2i64
5250b57cec5SDimitry Andric
5260b57cec5SDimitry Andric// ASIMD bitwise insert, Q-form
5275ffd83dbSDimitry Andricdef : InstRW<[A57Write_3cyc_2V], (instregex "^(BIF|BIT|BSL|BSP)v16i8")>;
5280b57cec5SDimitry Andric
5290b57cec5SDimitry Andric// ASIMD duplicate, gen reg, D-form and Q-form
53004eeddc0SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^DUP(i8|i16|i32|i64)$")>;
5310b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^DUPv.+gpr")>;
5320b57cec5SDimitry Andric
5330b57cec5SDimitry Andric// ASIMD move, saturating
5340b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]QXTU?N")>;
5350b57cec5SDimitry Andric
5360b57cec5SDimitry Andric// ASIMD reciprocal estimate, D-form
5370b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^[FU](RECP|RSQRT)(E|X)(v2f32|v1i32|v2i32|v1i64)")>;
5380b57cec5SDimitry Andric// ASIMD reciprocal estimate, Q-form
5390b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^[FU](RECP|RSQRT)(E|X)(v2f64|v4f32|v4i32)")>;
5400b57cec5SDimitry Andric
5410b57cec5SDimitry Andric// ASIMD reciprocal step, D-form, FZ
5420b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1V], (instregex "^F(RECP|RSQRT)S(v2f32|v1i32|v2i32|v1i64|32|64)")>;
5430b57cec5SDimitry Andric// ASIMD reciprocal step, Q-form, FZ
5440b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2V], (instregex "^F(RECP|RSQRT)S(v2f64|v4f32|v4i32)")>;
5450b57cec5SDimitry Andric
5460b57cec5SDimitry Andric// ASIMD table lookup, D-form
5470b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1V], (instregex "^TB[LX]v8i8One")>;
5480b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2V], (instregex "^TB[LX]v8i8Two")>;
5490b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^TB[LX]v8i8Three")>;
5500b57cec5SDimitry Andricdef : InstRW<[A57Write_12cyc_4V], (instregex "^TB[LX]v8i8Four")>;
5510b57cec5SDimitry Andric// ASIMD table lookup, Q-form
5520b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_3V], (instregex "^TB[LX]v16i8One")>;
5530b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_5V], (instregex "^TB[LX]v16i8Two")>;
5540b57cec5SDimitry Andricdef : InstRW<[A57Write_12cyc_7V], (instregex "^TB[LX]v16i8Three")>;
5550b57cec5SDimitry Andricdef : InstRW<[A57Write_15cyc_9V], (instregex "^TB[LX]v16i8Four")>;
5560b57cec5SDimitry Andric
5570b57cec5SDimitry Andric// ASIMD transfer, element to gen reg
5580b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L], (instregex "^[SU]MOVv")>;
5590b57cec5SDimitry Andric
5600b57cec5SDimitry Andric// ASIMD transfer, gen reg to element
5610b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^INSv")>;
5620b57cec5SDimitry Andric
5630b57cec5SDimitry Andric// ASIMD unzip/zip, Q-form
5640b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_3V], (instregex "^(UZP|ZIP)(1|2)(v16i8|v8i16|v4i32|v2i64)")>;
5650b57cec5SDimitry Andric
5660b57cec5SDimitry Andric
5670b57cec5SDimitry Andric// Remainder
5680b57cec5SDimitry Andric// -----------------------------------------------------------------------------
5690b57cec5SDimitry Andric
5700b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^F(ADD|SUB)[DS]rr")>;
5710b57cec5SDimitry Andric
572e8d8bef9SDimitry Andric// Cortex A57 Software Optimization Guide Sec 3.10
5730b57cec5SDimitry Andricdef A57WriteFPMA  : SchedWriteRes<[A57UnitV]> { let Latency = 9;  }
574e8d8bef9SDimitry Andricdef A57ReadFPMA5  : SchedReadAdvance<5, [A57WriteFPMA, WriteFMul]>;
5750b57cec5SDimitry Andricdef A57ReadFPM    : SchedReadAdvance<0>;
5760b57cec5SDimitry Andricdef : InstRW<[A57WriteFPMA, A57ReadFPM, A57ReadFPM, A57ReadFPMA5], (instregex "^FN?M(ADD|SUB)[DS]rrr")>;
5770b57cec5SDimitry Andric
5780b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_1L_1V], (instregex "^[FSU]CVT[AMNPZ][SU](_Int)?[SU]?[XW]?[DS]?[rds]i?")>;
5790b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_1L_1V], (instregex "^[SU]CVTF")>;
5800b57cec5SDimitry Andric
5810b57cec5SDimitry Andricdef : InstRW<[A57Write_32cyc_1W], (instrs FDIVDrr)>;
5820b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instrs FDIVSrr)>;
5830b57cec5SDimitry Andric
5840b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^F(MAX|MIN).+rr")>;
5850b57cec5SDimitry Andric
5860b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FRINT.+r")>;
5870b57cec5SDimitry Andric
5880b57cec5SDimitry Andricdef : InstRW<[A57Write_32cyc_1W], (instrs FSQRTDr)>;
5890b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instrs FSQRTSr)>;
5900b57cec5SDimitry Andric
5910b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDNPDi)>;
5920b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi], (instrs LDNPQi)>;
5930b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDNPSi)>;
5940b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDPDi)>;
5955f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L, WriteLDHi], (instrs LDPDpost)>;
5965f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L, WriteLDHi], (instrs LDPDpre)>;
5970b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi], (instrs LDPQi)>;
5985f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L, WriteLDHi], (instrs LDPQpost)>;
5995f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L, WriteLDHi], (instrs LDPQpre)>;
6000b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_2L, WriteLDHi], (instrs LDPSWi)>;
6015f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1I_2L, WriteLDHi], (instrs LDPSWpost)>;
6025f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1I_2L, WriteLDHi], (instrs LDPSWpre)>;
6030b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDPSi)>;
6045f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L, WriteLDHi], (instrs LDPSpost)>;
6055f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L, WriteLDHi], (instrs LDPSpre)>;
6060b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRBpost)>;
6075f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instrs LDRBpre)>;
6080b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRBroW)>;
6090b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRBroX)>;
6100b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRBui)>;
6110b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRDl)>;
6120b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRDpost)>;
6135f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instrs LDRDpre)>;
6140b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRDroW)>;
6150b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRDroX)>;
6160b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRDui)>;
6170b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRHHroW)>;
6180b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRHHroX)>;
6190b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRHpost)>;
6205f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instrs LDRHpre)>;
6210b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRHroW)>;
6220b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRHroX)>;
6230b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRHui)>;
6240b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRQl)>;
6250b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRQpost)>;
6265f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instrs LDRQpre)>;
6270b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRQroW)>;
6280b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRQroX)>;
6290b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRQui)>;
6300b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHWroW)>;
6310b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHWroX)>;
6320b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHXroW)>;
6330b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHXroX)>;
6340b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRSl)>;
6350b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRSpost)>;
6365f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instrs LDRSpre)>;
6370b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRSroW)>;
6380b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRSroX)>;
6390b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRSui)>;
6400b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURBi)>;
6410b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURDi)>;
6420b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURHi)>;
6430b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURQi)>;
6440b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURSi)>;
6450b57cec5SDimitry Andric
6460b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STNPDi)>;
6470b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1I_4S], (instrs STNPQi)>;
6480b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STNPXi)>;
6490b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STPDi)>;
6500b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPDpost)>;
6510b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPDpre)>;
6520b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1I_4S], (instrs STPQi)>;
6530b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_1I_4S], (instrs STPQpost)>;
6540b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_2I_4S], (instrs STPQpre)>;
6550b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPSpost)>;
6560b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPSpre)>;
6570b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPWpost)>;
6580b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPWpre)>;
6590b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STPXi)>;
6600b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPXpost)>;
6610b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPXpre)>;
6620b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBBpost)>;
6630b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBBpre)>;
6640b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBpost)>;
6650b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRBpre)>;
6660b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRBroW)>;
6670b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRBroX)>;
6680b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRDpost)>;
6690b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRDpre)>;
6700b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHHpost)>;
6710b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHHpre)>;
6720b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHHroW)>;
6730b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHHroX)>;
6740b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHpost)>;
6750b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRHpre)>;
6760b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHroW)>;
6770b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHroX)>;
6780b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQpost)>;
6790b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STRQpre)>;
6800b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQroW)>;
6810b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQroX)>;
6820b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S], (instrs STRQui)>;
6830b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRSpost)>;
6840b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRSpre)>;
6850b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRWpost)>;
6860b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRWpre)>;
6870b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRXpost)>;
6880b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRXpre)>;
6890b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STURQi)>;
6900b57cec5SDimitry Andric
6910b57cec5SDimitry Andric} // SchedModel = CortexA57Model
692