1*0b57cec5SDimitry Andric//=- AArch64SchedA57.td - ARM Cortex-A57 Scheduling Defs -----*- tablegen -*-=// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric// 9*0b57cec5SDimitry Andric// This file defines the machine model for ARM Cortex-A57 to support 10*0b57cec5SDimitry Andric// instruction scheduling and other instruction cost heuristics. 11*0b57cec5SDimitry Andric// 12*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 13*0b57cec5SDimitry Andric 14*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 15*0b57cec5SDimitry Andric// The Cortex-A57 is a traditional superscalar microprocessor with a 16*0b57cec5SDimitry Andric// conservative 3-wide in-order stage for decode and dispatch. Combined with the 17*0b57cec5SDimitry Andric// much wider out-of-order issue stage, this produced a need to carefully 18*0b57cec5SDimitry Andric// schedule micro-ops so that all three decoded each cycle are successfully 19*0b57cec5SDimitry Andric// issued as the reservation station(s) simply don't stay occupied for long. 20*0b57cec5SDimitry Andric// Therefore, IssueWidth is set to the narrower of the two at three, while still 21*0b57cec5SDimitry Andric// modeling the machine as out-of-order. 22*0b57cec5SDimitry Andric 23*0b57cec5SDimitry Andricdef CortexA57Model : SchedMachineModel { 24*0b57cec5SDimitry Andric let IssueWidth = 3; // 3-way decode and dispatch 25*0b57cec5SDimitry Andric let MicroOpBufferSize = 128; // 128 micro-op re-order buffer 26*0b57cec5SDimitry Andric let LoadLatency = 4; // Optimistic load latency 27*0b57cec5SDimitry Andric let MispredictPenalty = 14; // Fetch + Decode/Rename/Dispatch + Branch 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric // Enable partial & runtime unrolling. The magic number is chosen based on 30*0b57cec5SDimitry Andric // experiments and benchmarking data. 31*0b57cec5SDimitry Andric let LoopMicroOpBufferSize = 16; 32*0b57cec5SDimitry Andric let CompleteModel = 1; 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry Andric list<Predicate> UnsupportedFeatures = SVEUnsupported.F; 35*0b57cec5SDimitry Andric} 36*0b57cec5SDimitry Andric 37*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 38*0b57cec5SDimitry Andric// Define each kind of processor resource and number available on Cortex-A57. 39*0b57cec5SDimitry Andric// Cortex A-57 has 8 pipelines that each has its own 8-entry queue where 40*0b57cec5SDimitry Andric// micro-ops wait for their operands and then issue out-of-order. 41*0b57cec5SDimitry Andric 42*0b57cec5SDimitry Andricdef A57UnitB : ProcResource<1>; // Type B micro-ops 43*0b57cec5SDimitry Andricdef A57UnitI : ProcResource<2>; // Type I micro-ops 44*0b57cec5SDimitry Andricdef A57UnitM : ProcResource<1>; // Type M micro-ops 45*0b57cec5SDimitry Andricdef A57UnitL : ProcResource<1>; // Type L micro-ops 46*0b57cec5SDimitry Andricdef A57UnitS : ProcResource<1>; // Type S micro-ops 47*0b57cec5SDimitry Andricdef A57UnitX : ProcResource<1>; // Type X micro-ops 48*0b57cec5SDimitry Andricdef A57UnitW : ProcResource<1>; // Type W micro-ops 49*0b57cec5SDimitry Andriclet SchedModel = CortexA57Model in { 50*0b57cec5SDimitry Andric def A57UnitV : ProcResGroup<[A57UnitX, A57UnitW]>; // Type V micro-ops 51*0b57cec5SDimitry Andric} 52*0b57cec5SDimitry Andric 53*0b57cec5SDimitry Andriclet SchedModel = CortexA57Model in { 54*0b57cec5SDimitry Andric 55*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 56*0b57cec5SDimitry Andric// Define customized scheduler read/write types specific to the Cortex-A57. 57*0b57cec5SDimitry Andric 58*0b57cec5SDimitry Andricinclude "AArch64SchedA57WriteRes.td" 59*0b57cec5SDimitry Andric 60*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 61*0b57cec5SDimitry Andric// Map the target-defined scheduler read/write resources and latency for 62*0b57cec5SDimitry Andric// Cortex-A57. The Cortex-A57 types are directly associated with resources, so 63*0b57cec5SDimitry Andric// defining the aliases precludes the need for mapping them using WriteRes. The 64*0b57cec5SDimitry Andric// aliases are sufficient for creating a coarse, working model. As the model 65*0b57cec5SDimitry Andric// evolves, InstRWs will be used to override some of these SchedAliases. 66*0b57cec5SDimitry Andric// 67*0b57cec5SDimitry Andric// WARNING: Using SchedAliases is convenient and works well for latency and 68*0b57cec5SDimitry Andric// resource lookup for instructions. However, this creates an entry in 69*0b57cec5SDimitry Andric// AArch64WriteLatencyTable with a WriteResourceID of 0, breaking 70*0b57cec5SDimitry Andric// any SchedReadAdvance since the lookup will fail. 71*0b57cec5SDimitry Andric 72*0b57cec5SDimitry Andricdef : SchedAlias<WriteImm, A57Write_1cyc_1I>; 73*0b57cec5SDimitry Andricdef : SchedAlias<WriteI, A57Write_1cyc_1I>; 74*0b57cec5SDimitry Andricdef : SchedAlias<WriteISReg, A57Write_2cyc_1M>; 75*0b57cec5SDimitry Andricdef : SchedAlias<WriteIEReg, A57Write_2cyc_1M>; 76*0b57cec5SDimitry Andricdef : SchedAlias<WriteExtr, A57Write_1cyc_1I>; 77*0b57cec5SDimitry Andricdef : SchedAlias<WriteIS, A57Write_1cyc_1I>; 78*0b57cec5SDimitry Andricdef : SchedAlias<WriteID32, A57Write_19cyc_1M>; 79*0b57cec5SDimitry Andricdef : SchedAlias<WriteID64, A57Write_35cyc_1M>; 80*0b57cec5SDimitry Andricdef : WriteRes<WriteIM32, [A57UnitM]> { let Latency = 3; } 81*0b57cec5SDimitry Andricdef : WriteRes<WriteIM64, [A57UnitM]> { let Latency = 5; } 82*0b57cec5SDimitry Andricdef : SchedAlias<WriteBr, A57Write_1cyc_1B>; 83*0b57cec5SDimitry Andricdef : SchedAlias<WriteBrReg, A57Write_1cyc_1B>; 84*0b57cec5SDimitry Andricdef : SchedAlias<WriteLD, A57Write_4cyc_1L>; 85*0b57cec5SDimitry Andricdef : SchedAlias<WriteST, A57Write_1cyc_1S>; 86*0b57cec5SDimitry Andricdef : SchedAlias<WriteSTP, A57Write_1cyc_1S>; 87*0b57cec5SDimitry Andricdef : SchedAlias<WriteAdr, A57Write_1cyc_1I>; 88*0b57cec5SDimitry Andricdef : SchedAlias<WriteLDIdx, A57Write_4cyc_1I_1L>; 89*0b57cec5SDimitry Andricdef : SchedAlias<WriteSTIdx, A57Write_1cyc_1I_1S>; 90*0b57cec5SDimitry Andricdef : SchedAlias<WriteF, A57Write_3cyc_1V>; 91*0b57cec5SDimitry Andricdef : SchedAlias<WriteFCmp, A57Write_3cyc_1V>; 92*0b57cec5SDimitry Andricdef : SchedAlias<WriteFCvt, A57Write_5cyc_1V>; 93*0b57cec5SDimitry Andricdef : SchedAlias<WriteFCopy, A57Write_5cyc_1L>; 94*0b57cec5SDimitry Andricdef : SchedAlias<WriteFImm, A57Write_3cyc_1V>; 95*0b57cec5SDimitry Andricdef : SchedAlias<WriteFMul, A57Write_5cyc_1V>; 96*0b57cec5SDimitry Andricdef : SchedAlias<WriteFDiv, A57Write_17cyc_1W>; 97*0b57cec5SDimitry Andricdef : SchedAlias<WriteV, A57Write_3cyc_1V>; 98*0b57cec5SDimitry Andricdef : SchedAlias<WriteVLD, A57Write_5cyc_1L>; 99*0b57cec5SDimitry Andricdef : SchedAlias<WriteVST, A57Write_1cyc_1S>; 100*0b57cec5SDimitry Andric 101*0b57cec5SDimitry Andricdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; } 102*0b57cec5SDimitry Andric 103*0b57cec5SDimitry Andricdef : WriteRes<WriteSys, []> { let Latency = 1; } 104*0b57cec5SDimitry Andricdef : WriteRes<WriteBarrier, []> { let Latency = 1; } 105*0b57cec5SDimitry Andricdef : WriteRes<WriteHint, []> { let Latency = 1; } 106*0b57cec5SDimitry Andric 107*0b57cec5SDimitry Andricdef : WriteRes<WriteLDHi, []> { let Latency = 4; } 108*0b57cec5SDimitry Andric 109*0b57cec5SDimitry Andric// Forwarding logic is only modeled for multiply and accumulate 110*0b57cec5SDimitry Andricdef : ReadAdvance<ReadI, 0>; 111*0b57cec5SDimitry Andricdef : ReadAdvance<ReadISReg, 0>; 112*0b57cec5SDimitry Andricdef : ReadAdvance<ReadIEReg, 0>; 113*0b57cec5SDimitry Andricdef : ReadAdvance<ReadIM, 0>; 114*0b57cec5SDimitry Andricdef : ReadAdvance<ReadIMA, 2, [WriteIM32, WriteIM64]>; 115*0b57cec5SDimitry Andricdef : ReadAdvance<ReadID, 0>; 116*0b57cec5SDimitry Andricdef : ReadAdvance<ReadExtrHi, 0>; 117*0b57cec5SDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>; 118*0b57cec5SDimitry Andricdef : ReadAdvance<ReadVLD, 0>; 119*0b57cec5SDimitry Andric 120*0b57cec5SDimitry Andric 121*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 122*0b57cec5SDimitry Andric// Specialize the coarse model by associating instruction groups with the 123*0b57cec5SDimitry Andric// subtarget-defined types. As the modeled is refined, this will override most 124*0b57cec5SDimitry Andric// of the above ShchedAlias mappings. 125*0b57cec5SDimitry Andric 126*0b57cec5SDimitry Andric// Miscellaneous 127*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 128*0b57cec5SDimitry Andric 129*0b57cec5SDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>; 130*0b57cec5SDimitry Andric 131*0b57cec5SDimitry Andric 132*0b57cec5SDimitry Andric// Branch Instructions 133*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 134*0b57cec5SDimitry Andric 135*0b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1B_1I], (instrs BL)>; 136*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1B_1I], (instrs BLR)>; 137*0b57cec5SDimitry Andric 138*0b57cec5SDimitry Andric 139*0b57cec5SDimitry Andric// Shifted Register with Shift == 0 140*0b57cec5SDimitry Andric// ---------------------------------------------------------------------------- 141*0b57cec5SDimitry Andric 142*0b57cec5SDimitry Andricdef A57WriteISReg : SchedWriteVariant<[ 143*0b57cec5SDimitry Andric SchedVar<RegShiftedPred, [WriteISReg]>, 144*0b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteI]>]>; 145*0b57cec5SDimitry Andricdef : InstRW<[A57WriteISReg], (instregex ".*rs$")>; 146*0b57cec5SDimitry Andric 147*0b57cec5SDimitry Andric 148*0b57cec5SDimitry Andric// Divide and Multiply Instructions 149*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 150*0b57cec5SDimitry Andric 151*0b57cec5SDimitry Andric// Multiply high 152*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1M], (instrs SMULHrr, UMULHrr)>; 153*0b57cec5SDimitry Andric 154*0b57cec5SDimitry Andric 155*0b57cec5SDimitry Andric// Miscellaneous Data-Processing Instructions 156*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 157*0b57cec5SDimitry Andric 158*0b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1I], (instrs EXTRWrri)>; 159*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1M], (instrs EXTRXrri)>; 160*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1M], (instregex "BFM")>; 161*0b57cec5SDimitry Andric 162*0b57cec5SDimitry Andric 163*0b57cec5SDimitry Andric// Cryptography Extensions 164*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 165*0b57cec5SDimitry Andric 166*0b57cec5SDimitry Andricdef A57ReadAES : SchedReadAdvance<3, [A57Write_3cyc_1W]>; 167*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^AES[DE]")>; 168*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W, A57ReadAES], (instregex "^AESI?MC")>; 169*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2V], (instregex "^SHA1SU0")>; 170*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^SHA1(H|SU1)")>; 171*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^SHA1[CMP]")>; 172*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^SHA256SU0")>; 173*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^SHA256(H|H2|SU1)")>; 174*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^CRC32")>; 175*0b57cec5SDimitry Andric 176*0b57cec5SDimitry Andric 177*0b57cec5SDimitry Andric// Vector Load 178*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 179*0b57cec5SDimitry Andric 180*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD1i(8|16|32)$")>; 181*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr], (instregex "LD1i(8|16|32)_POST$")>; 182*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD1i(64)$")>; 183*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instregex "LD1i(64)_POST$")>; 184*0b57cec5SDimitry Andric 185*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD1Rv(8b|4h|2s)$")>; 186*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr], (instregex "LD1Rv(8b|4h|2s)_POST$")>; 187*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD1Rv(1d)$")>; 188*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instregex "LD1Rv(1d)_POST$")>; 189*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD1Rv(16b|8h|4s|2d)$")>; 190*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr], (instregex "LD1Rv(16b|8h|4s|2d)_POST$")>; 191*0b57cec5SDimitry Andric 192*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD1Onev(8b|4h|2s|1d)$")>; 193*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instregex "LD1Onev(8b|4h|2s|1d)_POST$")>; 194*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD1Onev(16b|8h|4s|2d)$")>; 195*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instregex "LD1Onev(16b|8h|4s|2d)_POST$")>; 196*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD1Twov(8b|4h|2s|1d)$")>; 197*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instregex "LD1Twov(8b|4h|2s|1d)_POST$")>; 198*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD1Twov(16b|8h|4s|2d)$")>; 199*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr], (instregex "LD1Twov(16b|8h|4s|2d)_POST$")>; 200*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD1Threev(8b|4h|2s|1d)$")>; 201*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr], (instregex "LD1Threev(8b|4h|2s|1d)_POST$")>; 202*0b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_3L], (instregex "LD1Threev(16b|8h|4s|2d)$")>; 203*0b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_3L, WriteAdr], (instregex "LD1Threev(16b|8h|4s|2d)_POST$")>; 204*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD1Fourv(8b|4h|2s|1d)$")>; 205*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr], (instregex "LD1Fourv(8b|4h|2s|1d)_POST$")>; 206*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L], (instregex "LD1Fourv(16b|8h|4s|2d)$")>; 207*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L, WriteAdr], (instregex "LD1Fourv(16b|8h|4s|2d)_POST$")>; 208*0b57cec5SDimitry Andric 209*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD2i(8|16)$")>; 210*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr], (instregex "LD2i(8|16)_POST$")>; 211*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD2i(32)$")>; 212*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr], (instregex "LD2i(32)_POST$")>; 213*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD2i(64)$")>; 214*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr], (instregex "LD2i(64)_POST$")>; 215*0b57cec5SDimitry Andric 216*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD2Rv(8b|4h|2s)$")>; 217*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr], (instregex "LD2Rv(8b|4h|2s)_POST$")>; 218*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD2Rv(1d)$")>; 219*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instregex "LD2Rv(1d)_POST$")>; 220*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD2Rv(16b|8h|4s|2d)$")>; 221*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr], (instregex "LD2Rv(16b|8h|4s|2d)_POST$")>; 222*0b57cec5SDimitry Andric 223*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD2Twov(8b|4h|2s)$")>; 224*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V, WriteAdr], (instregex "LD2Twov(8b|4h|2s)_POST$")>; 225*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V], (instregex "LD2Twov(16b|8h|4s)$")>; 226*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V, WriteAdr], (instregex "LD2Twov(16b|8h|4s)_POST$")>; 227*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD2Twov(2d)$")>; 228*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr], (instregex "LD2Twov(2d)_POST$")>; 229*0b57cec5SDimitry Andric 230*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V], (instregex "LD3i(8|16)$")>; 231*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V, WriteAdr], (instregex "LD3i(8|16)_POST$")>; 232*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD3i(32)$")>; 233*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr], (instregex "LD3i(32)_POST$")>; 234*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD3i(64)$")>; 235*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr], (instregex "LD3i(64)_POST$")>; 236*0b57cec5SDimitry Andric 237*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD3Rv(8b|4h|2s)$")>; 238*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr], (instregex "LD3Rv(8b|4h|2s)_POST$")>; 239*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD3Rv(1d)$")>; 240*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr], (instregex "LD3Rv(1d)_POST$")>; 241*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V], (instregex "LD3Rv(16b|8h|4s)$")>; 242*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V, WriteAdr], (instregex "LD3Rv(16b|8h|4s)_POST$")>; 243*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V], (instregex "LD3Rv(2d)$")>; 244*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V, WriteAdr], (instregex "LD3Rv(2d)_POST$")>; 245*0b57cec5SDimitry Andric 246*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V], (instregex "LD3Threev(8b|4h|2s)$")>; 247*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V, WriteAdr], (instregex "LD3Threev(8b|4h|2s)_POST$")>; 248*0b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_3L_4V], (instregex "LD3Threev(16b|8h|4s)$")>; 249*0b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_3L_4V, WriteAdr], (instregex "LD3Threev(16b|8h|4s)_POST$")>; 250*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L], (instregex "LD3Threev(2d)$")>; 251*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L, WriteAdr], (instregex "LD3Threev(2d)_POST$")>; 252*0b57cec5SDimitry Andric 253*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V], (instregex "LD4i(8|16)$")>; 254*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V, WriteAdr], (instregex "LD4i(8|16)_POST$")>; 255*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD4i(32)$")>; 256*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr], (instregex "LD4i(32)_POST$")>; 257*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V], (instregex "LD4i(64)$")>; 258*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V, WriteAdr], (instregex "LD4i(64)_POST$")>; 259*0b57cec5SDimitry Andric 260*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD4Rv(8b|4h|2s)$")>; 261*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V, WriteAdr], (instregex "LD4Rv(8b|4h|2s)_POST$")>; 262*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD4Rv(1d)$")>; 263*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteAdr], (instregex "LD4Rv(1d)_POST$")>; 264*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V], (instregex "LD4Rv(16b|8h|4s)$")>; 265*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V, WriteAdr], (instregex "LD4Rv(16b|8h|4s)_POST$")>; 266*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_4V], (instregex "LD4Rv(2d)$")>; 267*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_4V, WriteAdr], (instregex "LD4Rv(2d)_POST$")>; 268*0b57cec5SDimitry Andric 269*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V], (instregex "LD4Fourv(8b|4h|2s)$")>; 270*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V, WriteAdr], (instregex "LD4Fourv(8b|4h|2s)_POST$")>; 271*0b57cec5SDimitry Andricdef : InstRW<[A57Write_11cyc_4L_4V], (instregex "LD4Fourv(16b|8h|4s)$")>; 272*0b57cec5SDimitry Andricdef : InstRW<[A57Write_11cyc_4L_4V, WriteAdr], (instregex "LD4Fourv(16b|8h|4s)_POST$")>; 273*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L], (instregex "LD4Fourv(2d)$")>; 274*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L, WriteAdr], (instregex "LD4Fourv(2d)_POST$")>; 275*0b57cec5SDimitry Andric 276*0b57cec5SDimitry Andric// Vector Store 277*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 278*0b57cec5SDimitry Andric 279*0b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S], (instregex "ST1i(8|16|32)$")>; 280*0b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S, WriteAdr], (instregex "ST1i(8|16|32)_POST$")>; 281*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V], (instregex "ST1i(64)$")>; 282*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V, WriteAdr], (instregex "ST1i(64)_POST$")>; 283*0b57cec5SDimitry Andric 284*0b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S], (instregex "ST1Onev(8b|4h|2s|1d)$")>; 285*0b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S, WriteAdr], (instregex "ST1Onev(8b|4h|2s|1d)_POST$")>; 286*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instregex "ST1Onev(16b|8h|4s|2d)$")>; 287*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S, WriteAdr], (instregex "ST1Onev(16b|8h|4s|2d)_POST$")>; 288*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instregex "ST1Twov(8b|4h|2s|1d)$")>; 289*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S, WriteAdr], (instregex "ST1Twov(8b|4h|2s|1d)_POST$")>; 290*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S], (instregex "ST1Twov(16b|8h|4s|2d)$")>; 291*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S, WriteAdr], (instregex "ST1Twov(16b|8h|4s|2d)_POST$")>; 292*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S], (instregex "ST1Threev(8b|4h|2s|1d)$")>; 293*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S, WriteAdr], (instregex "ST1Threev(8b|4h|2s|1d)_POST$")>; 294*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S], (instregex "ST1Threev(16b|8h|4s|2d)$")>; 295*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S, WriteAdr], (instregex "ST1Threev(16b|8h|4s|2d)_POST$")>; 296*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S], (instregex "ST1Fourv(8b|4h|2s|1d)$")>; 297*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S, WriteAdr], (instregex "ST1Fourv(8b|4h|2s|1d)_POST$")>; 298*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S], (instregex "ST1Fourv(16b|8h|4s|2d)$")>; 299*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S, WriteAdr], (instregex "ST1Fourv(16b|8h|4s|2d)_POST$")>; 300*0b57cec5SDimitry Andric 301*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V], (instregex "ST2i(8|16|32)$")>; 302*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V, WriteAdr], (instregex "ST2i(8|16|32)_POST$")>; 303*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instregex "ST2i(64)$")>; 304*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S, WriteAdr], (instregex "ST2i(64)_POST$")>; 305*0b57cec5SDimitry Andric 306*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V], (instregex "ST2Twov(8b|4h|2s)$")>; 307*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V, WriteAdr], (instregex "ST2Twov(8b|4h|2s)_POST$")>; 308*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V], (instregex "ST2Twov(16b|8h|4s)$")>; 309*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V, WriteAdr], (instregex "ST2Twov(16b|8h|4s)_POST$")>; 310*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S], (instregex "ST2Twov(2d)$")>; 311*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S, WriteAdr], (instregex "ST2Twov(2d)_POST$")>; 312*0b57cec5SDimitry Andric 313*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V], (instregex "ST3i(8|16)$")>; 314*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V, WriteAdr], (instregex "ST3i(8|16)_POST$")>; 315*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S], (instregex "ST3i(32)$")>; 316*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S, WriteAdr], (instregex "ST3i(32)_POST$")>; 317*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V], (instregex "ST3i(64)$")>; 318*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V, WriteAdr], (instregex "ST3i(64)_POST$")>; 319*0b57cec5SDimitry Andric 320*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S_2V], (instregex "ST3Threev(8b|4h|2s)$")>; 321*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S_2V, WriteAdr], (instregex "ST3Threev(8b|4h|2s)_POST$")>; 322*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S_4V], (instregex "ST3Threev(16b|8h|4s)$")>; 323*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S_4V, WriteAdr], (instregex "ST3Threev(16b|8h|4s)_POST$")>; 324*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S], (instregex "ST3Threev(2d)$")>; 325*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S, WriteAdr], (instregex "ST3Threev(2d)_POST$")>; 326*0b57cec5SDimitry Andric 327*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V], (instregex "ST4i(8|16)$")>; 328*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V, WriteAdr], (instregex "ST4i(8|16)_POST$")>; 329*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S], (instregex "ST4i(32)$")>; 330*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S, WriteAdr], (instregex "ST4i(32)_POST$")>; 331*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V], (instregex "ST4i(64)$")>; 332*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V, WriteAdr], (instregex "ST4i(64)_POST$")>; 333*0b57cec5SDimitry Andric 334*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V], (instregex "ST4Fourv(8b|4h|2s)$")>; 335*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V, WriteAdr], (instregex "ST4Fourv(8b|4h|2s)_POST$")>; 336*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S_4V], (instregex "ST4Fourv(16b|8h|4s)$")>; 337*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S_4V, WriteAdr], (instregex "ST4Fourv(16b|8h|4s)_POST$")>; 338*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S], (instregex "ST4Fourv(2d)$")>; 339*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S, WriteAdr], (instregex "ST4Fourv(2d)_POST$")>; 340*0b57cec5SDimitry Andric 341*0b57cec5SDimitry Andric// Vector - Integer 342*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 343*0b57cec5SDimitry Andric 344*0b57cec5SDimitry Andric// Reference for forms in this group 345*0b57cec5SDimitry Andric// D form - v8i8, v4i16, v2i32 346*0b57cec5SDimitry Andric// Q form - v16i8, v8i16, v4i32 347*0b57cec5SDimitry Andric// D form - v1i8, v1i16, v1i32, v1i64 348*0b57cec5SDimitry Andric// Q form - v16i8, v8i16, v4i32, v2i64 349*0b57cec5SDimitry Andric// D form - v8i8_v8i16, v4i16_v4i32, v2i32_v2i64 350*0b57cec5SDimitry Andric// Q form - v16i8_v8i16, v8i16_v4i32, v4i32_v2i64 351*0b57cec5SDimitry Andric 352*0b57cec5SDimitry Andric// ASIMD absolute diff accum, D-form 353*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]ABA(v8i8|v4i16|v2i32)$")>; 354*0b57cec5SDimitry Andric// ASIMD absolute diff accum, Q-form 355*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2X], (instregex "^[SU]ABA(v16i8|v8i16|v4i32)$")>; 356*0b57cec5SDimitry Andric// ASIMD absolute diff accum long 357*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]ABAL")>; 358*0b57cec5SDimitry Andric 359*0b57cec5SDimitry Andric// ASIMD arith, reduce, 4H/4S 360*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]?ADDL?V(v8i8|v4i16|v2i32)v$")>; 361*0b57cec5SDimitry Andric// ASIMD arith, reduce, 8B/8H 362*0b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_1V_1X], (instregex "^[SU]?ADDL?V(v8i16|v4i32)v$")>; 363*0b57cec5SDimitry Andric// ASIMD arith, reduce, 16B 364*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_2X], (instregex "^[SU]?ADDL?Vv16i8v$")>; 365*0b57cec5SDimitry Andric 366*0b57cec5SDimitry Andric// ASIMD max/min, reduce, 4H/4S 367*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU](MIN|MAX)V(v4i16|v4i32)v$")>; 368*0b57cec5SDimitry Andric// ASIMD max/min, reduce, 8B/8H 369*0b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_1V_1X], (instregex "^[SU](MIN|MAX)V(v8i8|v8i16)v$")>; 370*0b57cec5SDimitry Andric// ASIMD max/min, reduce, 16B 371*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_2X], (instregex "^[SU](MIN|MAX)Vv16i8v$")>; 372*0b57cec5SDimitry Andric 373*0b57cec5SDimitry Andric// ASIMD multiply, D-form 374*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^(P?MUL|SQR?DMULH)(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)(_indexed)?$")>; 375*0b57cec5SDimitry Andric// ASIMD multiply, Q-form 376*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^(P?MUL|SQR?DMULH)(v16i8|v8i16|v4i32)(_indexed)?$")>; 377*0b57cec5SDimitry Andric 378*0b57cec5SDimitry Andric// ASIMD multiply accumulate, D-form 379*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^ML[AS](v8i8|v4i16|v2i32)(_indexed)?$")>; 380*0b57cec5SDimitry Andric// ASIMD multiply accumulate, Q-form 381*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^ML[AS](v16i8|v8i16|v4i32)(_indexed)?$")>; 382*0b57cec5SDimitry Andric 383*0b57cec5SDimitry Andric// ASIMD multiply accumulate long 384*0b57cec5SDimitry Andric// ASIMD multiply accumulate saturating long 385*0b57cec5SDimitry Andricdef A57WriteIVMA : SchedWriteRes<[A57UnitW]> { let Latency = 5; } 386*0b57cec5SDimitry Andricdef A57ReadIVMA4 : SchedReadAdvance<4, [A57WriteIVMA]>; 387*0b57cec5SDimitry Andricdef : InstRW<[A57WriteIVMA, A57ReadIVMA4], (instregex "^(S|U|SQD)ML[AS]L")>; 388*0b57cec5SDimitry Andric 389*0b57cec5SDimitry Andric// ASIMD multiply long 390*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^(S|U|SQD)MULL")>; 391*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^PMULL(v8i8|v16i8)")>; 392*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^PMULL(v1i64|v2i64)")>; 393*0b57cec5SDimitry Andric 394*0b57cec5SDimitry Andric// ASIMD pairwise add and accumulate 395*0b57cec5SDimitry Andric// ASIMD shift accumulate 396*0b57cec5SDimitry Andricdef A57WriteIVA : SchedWriteRes<[A57UnitX]> { let Latency = 4; } 397*0b57cec5SDimitry Andricdef A57ReadIVA3 : SchedReadAdvance<3, [A57WriteIVA]>; 398*0b57cec5SDimitry Andricdef : InstRW<[A57WriteIVA, A57ReadIVA3], (instregex "^[SU]ADALP")>; 399*0b57cec5SDimitry Andricdef : InstRW<[A57WriteIVA, A57ReadIVA3], (instregex "^(S|SR|U|UR)SRA")>; 400*0b57cec5SDimitry Andric 401*0b57cec5SDimitry Andric// ASIMD shift by immed, complex 402*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]?(Q|R){1,2}SHR")>; 403*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^SQSHLU")>; 404*0b57cec5SDimitry Andric 405*0b57cec5SDimitry Andric 406*0b57cec5SDimitry Andric// ASIMD shift by register, basic, Q-form 407*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_2X], (instregex "^[SU]SHL(v16i8|v8i16|v4i32|v2i64)")>; 408*0b57cec5SDimitry Andric 409*0b57cec5SDimitry Andric// ASIMD shift by register, complex, D-form 410*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU][QR]{1,2}SHL(v1i8|v1i16|v1i32|v1i64|v8i8|v4i16|v2i32|b|d|h|s)")>; 411*0b57cec5SDimitry Andric 412*0b57cec5SDimitry Andric// ASIMD shift by register, complex, Q-form 413*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2X], (instregex "^[SU][QR]{1,2}SHL(v16i8|v8i16|v4i32|v2i64)")>; 414*0b57cec5SDimitry Andric 415*0b57cec5SDimitry Andric 416*0b57cec5SDimitry Andric// Vector - Floating Point 417*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 418*0b57cec5SDimitry Andric 419*0b57cec5SDimitry Andric// Reference for forms in this group 420*0b57cec5SDimitry Andric// D form - v2f32 421*0b57cec5SDimitry Andric// Q form - v4f32, v2f64 422*0b57cec5SDimitry Andric// D form - 32, 64 423*0b57cec5SDimitry Andric// D form - v1i32, v1i64 424*0b57cec5SDimitry Andric// D form - v2i32 425*0b57cec5SDimitry Andric// Q form - v4i32, v2i64 426*0b57cec5SDimitry Andric 427*0b57cec5SDimitry Andric// ASIMD FP arith, normal, D-form 428*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FABD|FADD|FSUB)(v2f32|32|64|v2i32p)")>; 429*0b57cec5SDimitry Andric// ASIMD FP arith, normal, Q-form 430*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FABD|FADD|FSUB)(v4f32|v2f64|v2i64p)")>; 431*0b57cec5SDimitry Andric 432*0b57cec5SDimitry Andric// ASIMD FP arith, pairwise, D-form 433*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FADDP(v2f32|32|64|v2i32)")>; 434*0b57cec5SDimitry Andric// ASIMD FP arith, pairwise, Q-form 435*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^FADDP(v4f32|v2f64|v2i64)")>; 436*0b57cec5SDimitry Andric 437*0b57cec5SDimitry Andric// ASIMD FP compare, D-form 438*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FACGE|FACGT|FCMEQ|FCMGE|FCMGT|FCMLE|FCMLT)(v2f32|32|64|v1i32|v2i32|v1i64)")>; 439*0b57cec5SDimitry Andric// ASIMD FP compare, Q-form 440*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FACGE|FACGT|FCMEQ|FCMGE|FCMGT|FCMLE|FCMLT)(v4f32|v2f64|v4i32|v2i64)")>; 441*0b57cec5SDimitry Andric 442*0b57cec5SDimitry Andric// ASIMD FP convert, long and narrow 443*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_3V], (instregex "^FCVT(L|N|XN)v")>; 444*0b57cec5SDimitry Andric// ASIMD FP convert, other, D-form 445*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^[FVSU]CVT([AMNPZ][SU])?(_Int)?(v2f32|v1i32|v2i32|v1i64)")>; 446*0b57cec5SDimitry Andric// ASIMD FP convert, other, Q-form 447*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^[FVSU]CVT([AMNPZ][SU])?(_Int)?(v4f32|v2f64|v4i32|v2i64)")>; 448*0b57cec5SDimitry Andric 449*0b57cec5SDimitry Andric// ASIMD FP divide, D-form, F32 450*0b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instregex "FDIVv2f32")>; 451*0b57cec5SDimitry Andric// ASIMD FP divide, Q-form, F32 452*0b57cec5SDimitry Andricdef : InstRW<[A57Write_34cyc_2W], (instregex "FDIVv4f32")>; 453*0b57cec5SDimitry Andric// ASIMD FP divide, Q-form, F64 454*0b57cec5SDimitry Andricdef : InstRW<[A57Write_64cyc_2W], (instregex "FDIVv2f64")>; 455*0b57cec5SDimitry Andric 456*0b57cec5SDimitry Andric// Note: These were simply duplicated from ASIMD FDIV because of missing documentation 457*0b57cec5SDimitry Andric// ASIMD FP square root, D-form, F32 458*0b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instregex "FSQRTv2f32")>; 459*0b57cec5SDimitry Andric// ASIMD FP square root, Q-form, F32 460*0b57cec5SDimitry Andricdef : InstRW<[A57Write_34cyc_2W], (instregex "FSQRTv4f32")>; 461*0b57cec5SDimitry Andric// ASIMD FP square root, Q-form, F64 462*0b57cec5SDimitry Andricdef : InstRW<[A57Write_64cyc_2W], (instregex "FSQRTv2f64")>; 463*0b57cec5SDimitry Andric 464*0b57cec5SDimitry Andric// ASIMD FP max/min, normal, D-form 465*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FMAX|FMIN)(NM)?(v2f32)")>; 466*0b57cec5SDimitry Andric// ASIMD FP max/min, normal, Q-form 467*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FMAX|FMIN)(NM)?(v4f32|v2f64)")>; 468*0b57cec5SDimitry Andric// ASIMD FP max/min, pairwise, D-form 469*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FMAX|FMIN)(NM)?P(v2f32|v2i32)")>; 470*0b57cec5SDimitry Andric// ASIMD FP max/min, pairwise, Q-form 471*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^(FMAX|FMIN)(NM)?P(v4f32|v2f64|v2i64)")>; 472*0b57cec5SDimitry Andric// ASIMD FP max/min, reduce 473*0b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_3V], (instregex "^(FMAX|FMIN)(NM)?Vv")>; 474*0b57cec5SDimitry Andric 475*0b57cec5SDimitry Andric// ASIMD FP multiply, D-form, FZ 476*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FMULX?(v2f32|v1i32|v2i32|v1i64|32|64)")>; 477*0b57cec5SDimitry Andric// ASIMD FP multiply, Q-form, FZ 478*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^FMULX?(v4f32|v2f64|v4i32|v2i64)")>; 479*0b57cec5SDimitry Andric 480*0b57cec5SDimitry Andric// ASIMD FP multiply accumulate, D-form, FZ 481*0b57cec5SDimitry Andric// ASIMD FP multiply accumulate, Q-form, FZ 482*0b57cec5SDimitry Andricdef A57WriteFPVMAD : SchedWriteRes<[A57UnitV]> { let Latency = 9; } 483*0b57cec5SDimitry Andricdef A57WriteFPVMAQ : SchedWriteRes<[A57UnitV, A57UnitV]> { let Latency = 10; } 484*0b57cec5SDimitry Andricdef A57ReadFPVMA5 : SchedReadAdvance<5, [A57WriteFPVMAD, A57WriteFPVMAQ]>; 485*0b57cec5SDimitry Andricdef : InstRW<[A57WriteFPVMAD, A57ReadFPVMA5], (instregex "^FML[AS](v2f32|v1i32|v2i32|v1i64)")>; 486*0b57cec5SDimitry Andricdef : InstRW<[A57WriteFPVMAQ, A57ReadFPVMA5], (instregex "^FML[AS](v4f32|v2f64|v4i32|v2i64)")>; 487*0b57cec5SDimitry Andric 488*0b57cec5SDimitry Andric// ASIMD FP round, D-form 489*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FRINT[AIMNPXZ](v2f32)")>; 490*0b57cec5SDimitry Andric// ASIMD FP round, Q-form 491*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^FRINT[AIMNPXZ](v4f32|v2f64)")>; 492*0b57cec5SDimitry Andric 493*0b57cec5SDimitry Andric 494*0b57cec5SDimitry Andric// Vector - Miscellaneous 495*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 496*0b57cec5SDimitry Andric 497*0b57cec5SDimitry Andric// Reference for forms in this group 498*0b57cec5SDimitry Andric// D form - v8i8, v4i16, v2i32 499*0b57cec5SDimitry Andric// Q form - v16i8, v8i16, v4i32 500*0b57cec5SDimitry Andric// D form - v1i8, v1i16, v1i32, v1i64 501*0b57cec5SDimitry Andric// Q form - v16i8, v8i16, v4i32, v2i64 502*0b57cec5SDimitry Andric 503*0b57cec5SDimitry Andric// ASIMD bitwise insert, Q-form 504*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2V], (instregex "^(BIF|BIT|BSL)v16i8")>; 505*0b57cec5SDimitry Andric 506*0b57cec5SDimitry Andric// ASIMD duplicate, gen reg, D-form and Q-form 507*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^CPY")>; 508*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^DUPv.+gpr")>; 509*0b57cec5SDimitry Andric 510*0b57cec5SDimitry Andric// ASIMD move, saturating 511*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]QXTU?N")>; 512*0b57cec5SDimitry Andric 513*0b57cec5SDimitry Andric// ASIMD reciprocal estimate, D-form 514*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^[FU](RECP|RSQRT)(E|X)(v2f32|v1i32|v2i32|v1i64)")>; 515*0b57cec5SDimitry Andric// ASIMD reciprocal estimate, Q-form 516*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^[FU](RECP|RSQRT)(E|X)(v2f64|v4f32|v4i32)")>; 517*0b57cec5SDimitry Andric 518*0b57cec5SDimitry Andric// ASIMD reciprocal step, D-form, FZ 519*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1V], (instregex "^F(RECP|RSQRT)S(v2f32|v1i32|v2i32|v1i64|32|64)")>; 520*0b57cec5SDimitry Andric// ASIMD reciprocal step, Q-form, FZ 521*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2V], (instregex "^F(RECP|RSQRT)S(v2f64|v4f32|v4i32)")>; 522*0b57cec5SDimitry Andric 523*0b57cec5SDimitry Andric// ASIMD table lookup, D-form 524*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1V], (instregex "^TB[LX]v8i8One")>; 525*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2V], (instregex "^TB[LX]v8i8Two")>; 526*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^TB[LX]v8i8Three")>; 527*0b57cec5SDimitry Andricdef : InstRW<[A57Write_12cyc_4V], (instregex "^TB[LX]v8i8Four")>; 528*0b57cec5SDimitry Andric// ASIMD table lookup, Q-form 529*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_3V], (instregex "^TB[LX]v16i8One")>; 530*0b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_5V], (instregex "^TB[LX]v16i8Two")>; 531*0b57cec5SDimitry Andricdef : InstRW<[A57Write_12cyc_7V], (instregex "^TB[LX]v16i8Three")>; 532*0b57cec5SDimitry Andricdef : InstRW<[A57Write_15cyc_9V], (instregex "^TB[LX]v16i8Four")>; 533*0b57cec5SDimitry Andric 534*0b57cec5SDimitry Andric// ASIMD transfer, element to gen reg 535*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L], (instregex "^[SU]MOVv")>; 536*0b57cec5SDimitry Andric 537*0b57cec5SDimitry Andric// ASIMD transfer, gen reg to element 538*0b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^INSv")>; 539*0b57cec5SDimitry Andric 540*0b57cec5SDimitry Andric// ASIMD unzip/zip, Q-form 541*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_3V], (instregex "^(UZP|ZIP)(1|2)(v16i8|v8i16|v4i32|v2i64)")>; 542*0b57cec5SDimitry Andric 543*0b57cec5SDimitry Andric 544*0b57cec5SDimitry Andric// Remainder 545*0b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 546*0b57cec5SDimitry Andric 547*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^F(ADD|SUB)[DS]rr")>; 548*0b57cec5SDimitry Andric 549*0b57cec5SDimitry Andricdef A57WriteFPMA : SchedWriteRes<[A57UnitV]> { let Latency = 9; } 550*0b57cec5SDimitry Andricdef A57ReadFPMA5 : SchedReadAdvance<5, [A57WriteFPMA]>; 551*0b57cec5SDimitry Andricdef A57ReadFPM : SchedReadAdvance<0>; 552*0b57cec5SDimitry Andricdef : InstRW<[A57WriteFPMA, A57ReadFPM, A57ReadFPM, A57ReadFPMA5], (instregex "^FN?M(ADD|SUB)[DS]rrr")>; 553*0b57cec5SDimitry Andric 554*0b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_1L_1V], (instregex "^[FSU]CVT[AMNPZ][SU](_Int)?[SU]?[XW]?[DS]?[rds]i?")>; 555*0b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_1L_1V], (instregex "^[SU]CVTF")>; 556*0b57cec5SDimitry Andric 557*0b57cec5SDimitry Andricdef : InstRW<[A57Write_32cyc_1W], (instrs FDIVDrr)>; 558*0b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instrs FDIVSrr)>; 559*0b57cec5SDimitry Andric 560*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^F(MAX|MIN).+rr")>; 561*0b57cec5SDimitry Andric 562*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FRINT.+r")>; 563*0b57cec5SDimitry Andric 564*0b57cec5SDimitry Andricdef : InstRW<[A57Write_32cyc_1W], (instrs FSQRTDr)>; 565*0b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instrs FSQRTSr)>; 566*0b57cec5SDimitry Andric 567*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDNPDi)>; 568*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi], (instrs LDNPQi)>; 569*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDNPSi)>; 570*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDPDi)>; 571*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi, WriteAdr], (instrs LDPDpost)>; 572*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi, WriteAdr], (instrs LDPDpre)>; 573*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi], (instrs LDPQi)>; 574*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi, WriteAdr], (instrs LDPQpost)>; 575*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi, WriteAdr], (instrs LDPQpre)>; 576*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_2L, WriteLDHi], (instrs LDPSWi)>; 577*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_2L, WriteLDHi, WriteAdr], (instrs LDPSWpost)>; 578*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_2L, WriteLDHi, WriteAdr], (instrs LDPSWpre)>; 579*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDPSi)>; 580*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi, WriteAdr], (instrs LDPSpost)>; 581*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi, WriteAdr], (instrs LDPSpre)>; 582*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRBpost)>; 583*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instrs LDRBpre)>; 584*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRBroW)>; 585*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRBroX)>; 586*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRBui)>; 587*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRDl)>; 588*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRDpost)>; 589*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instrs LDRDpre)>; 590*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRDroW)>; 591*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRDroX)>; 592*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRDui)>; 593*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRHHroW)>; 594*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRHHroX)>; 595*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRHpost)>; 596*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instrs LDRHpre)>; 597*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRHroW)>; 598*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRHroX)>; 599*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRHui)>; 600*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRQl)>; 601*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRQpost)>; 602*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instrs LDRQpre)>; 603*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRQroW)>; 604*0b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRQroX)>; 605*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRQui)>; 606*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHWroW)>; 607*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHWroX)>; 608*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHXroW)>; 609*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHXroX)>; 610*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRSl)>; 611*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRSpost)>; 612*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteAdr], (instrs LDRSpre)>; 613*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRSroW)>; 614*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRSroX)>; 615*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRSui)>; 616*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURBi)>; 617*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURDi)>; 618*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURHi)>; 619*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURQi)>; 620*0b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURSi)>; 621*0b57cec5SDimitry Andric 622*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STNPDi)>; 623*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1I_4S], (instrs STNPQi)>; 624*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STNPXi)>; 625*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STPDi)>; 626*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPDpost)>; 627*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPDpre)>; 628*0b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1I_4S], (instrs STPQi)>; 629*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_1I_4S], (instrs STPQpost)>; 630*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_2I_4S], (instrs STPQpre)>; 631*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPSpost)>; 632*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPSpre)>; 633*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPWpost)>; 634*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPWpre)>; 635*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STPXi)>; 636*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPXpost)>; 637*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPXpre)>; 638*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBBpost)>; 639*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBBpre)>; 640*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBpost)>; 641*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRBpre)>; 642*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRBroW)>; 643*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRBroX)>; 644*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRDpost)>; 645*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRDpre)>; 646*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHHpost)>; 647*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHHpre)>; 648*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHHroW)>; 649*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHHroX)>; 650*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHpost)>; 651*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRHpre)>; 652*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHroW)>; 653*0b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHroX)>; 654*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQpost)>; 655*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STRQpre)>; 656*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQroW)>; 657*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQroX)>; 658*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S], (instrs STRQui)>; 659*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRSpost)>; 660*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRSpre)>; 661*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRWpost)>; 662*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRWpre)>; 663*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRXpost)>; 664*0b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRXpre)>; 665*0b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STURQi)>; 666*0b57cec5SDimitry Andric 667*0b57cec5SDimitry Andric} // SchedModel = CortexA57Model 668