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