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