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