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