10b57cec5SDimitry Andric//=- AArch64SchedA57.td - ARM Cortex-A57 Scheduling Defs -----*- tablegen -*-=// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// 90b57cec5SDimitry Andric// This file defines the machine model for ARM Cortex-A57 to support 100b57cec5SDimitry Andric// instruction scheduling and other instruction cost heuristics. 110b57cec5SDimitry Andric// 120b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 150b57cec5SDimitry Andric// The Cortex-A57 is a traditional superscalar microprocessor with a 160b57cec5SDimitry Andric// conservative 3-wide in-order stage for decode and dispatch. Combined with the 170b57cec5SDimitry Andric// much wider out-of-order issue stage, this produced a need to carefully 180b57cec5SDimitry Andric// schedule micro-ops so that all three decoded each cycle are successfully 190b57cec5SDimitry Andric// issued as the reservation station(s) simply don't stay occupied for long. 200b57cec5SDimitry Andric// Therefore, IssueWidth is set to the narrower of the two at three, while still 210b57cec5SDimitry Andric// modeling the machine as out-of-order. 220b57cec5SDimitry Andric 230b57cec5SDimitry Andricdef CortexA57Model : SchedMachineModel { 240b57cec5SDimitry Andric let IssueWidth = 3; // 3-way decode and dispatch 250b57cec5SDimitry Andric let MicroOpBufferSize = 128; // 128 micro-op re-order buffer 260b57cec5SDimitry Andric let LoadLatency = 4; // Optimistic load latency 270b57cec5SDimitry Andric let MispredictPenalty = 14; // Fetch + Decode/Rename/Dispatch + Branch 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric // Enable partial & runtime unrolling. The magic number is chosen based on 300b57cec5SDimitry Andric // experiments and benchmarking data. 310b57cec5SDimitry Andric let LoopMicroOpBufferSize = 16; 320b57cec5SDimitry Andric let CompleteModel = 1; 330b57cec5SDimitry Andric 34e837bb5cSDimitry Andric list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F, 35fe6060f1SDimitry Andric PAUnsupported.F, 36753f127fSDimitry Andric SMEUnsupported.F, 37*4c2d3b02SDimitry Andric [HasMTE, HasCSSC]); 380b57cec5SDimitry Andric} 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 410b57cec5SDimitry Andric// Define each kind of processor resource and number available on Cortex-A57. 420b57cec5SDimitry Andric// Cortex A-57 has 8 pipelines that each has its own 8-entry queue where 430b57cec5SDimitry Andric// micro-ops wait for their operands and then issue out-of-order. 440b57cec5SDimitry Andric 450b57cec5SDimitry Andricdef A57UnitB : ProcResource<1>; // Type B micro-ops 460b57cec5SDimitry Andricdef A57UnitI : ProcResource<2>; // Type I micro-ops 470b57cec5SDimitry Andricdef A57UnitM : ProcResource<1>; // Type M micro-ops 480b57cec5SDimitry Andricdef A57UnitL : ProcResource<1>; // Type L micro-ops 490b57cec5SDimitry Andricdef A57UnitS : ProcResource<1>; // Type S micro-ops 500b57cec5SDimitry Andricdef A57UnitX : ProcResource<1>; // Type X micro-ops 510b57cec5SDimitry Andricdef A57UnitW : ProcResource<1>; // Type W micro-ops 520b57cec5SDimitry Andriclet SchedModel = CortexA57Model in { 530b57cec5SDimitry Andric def A57UnitV : ProcResGroup<[A57UnitX, A57UnitW]>; // Type V micro-ops 540b57cec5SDimitry Andric} 550b57cec5SDimitry Andric 560b57cec5SDimitry Andriclet SchedModel = CortexA57Model in { 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 590b57cec5SDimitry Andric// Define customized scheduler read/write types specific to the Cortex-A57. 600b57cec5SDimitry Andric 610b57cec5SDimitry Andricinclude "AArch64SchedA57WriteRes.td" 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 640b57cec5SDimitry Andric// Map the target-defined scheduler read/write resources and latency for 650b57cec5SDimitry Andric// Cortex-A57. The Cortex-A57 types are directly associated with resources, so 660b57cec5SDimitry Andric// defining the aliases precludes the need for mapping them using WriteRes. The 670b57cec5SDimitry Andric// aliases are sufficient for creating a coarse, working model. As the model 680b57cec5SDimitry Andric// evolves, InstRWs will be used to override some of these SchedAliases. 690b57cec5SDimitry Andric// 700b57cec5SDimitry Andric// WARNING: Using SchedAliases is convenient and works well for latency and 710b57cec5SDimitry Andric// resource lookup for instructions. However, this creates an entry in 720b57cec5SDimitry Andric// AArch64WriteLatencyTable with a WriteResourceID of 0, breaking 730b57cec5SDimitry Andric// any SchedReadAdvance since the lookup will fail. 740b57cec5SDimitry Andric 750b57cec5SDimitry Andricdef : SchedAlias<WriteImm, A57Write_1cyc_1I>; 760b57cec5SDimitry Andricdef : SchedAlias<WriteI, A57Write_1cyc_1I>; 770b57cec5SDimitry Andricdef : SchedAlias<WriteISReg, A57Write_2cyc_1M>; 780b57cec5SDimitry Andricdef : SchedAlias<WriteIEReg, A57Write_2cyc_1M>; 790b57cec5SDimitry Andricdef : SchedAlias<WriteExtr, A57Write_1cyc_1I>; 800b57cec5SDimitry Andricdef : SchedAlias<WriteIS, A57Write_1cyc_1I>; 810b57cec5SDimitry Andricdef : SchedAlias<WriteID32, A57Write_19cyc_1M>; 820b57cec5SDimitry Andricdef : SchedAlias<WriteID64, A57Write_35cyc_1M>; 830b57cec5SDimitry Andricdef : WriteRes<WriteIM32, [A57UnitM]> { let Latency = 3; } 840b57cec5SDimitry Andricdef : WriteRes<WriteIM64, [A57UnitM]> { let Latency = 5; } 850b57cec5SDimitry Andricdef : SchedAlias<WriteBr, A57Write_1cyc_1B>; 860b57cec5SDimitry Andricdef : SchedAlias<WriteBrReg, A57Write_1cyc_1B>; 870b57cec5SDimitry Andricdef : SchedAlias<WriteLD, A57Write_4cyc_1L>; 880b57cec5SDimitry Andricdef : SchedAlias<WriteST, A57Write_1cyc_1S>; 890b57cec5SDimitry Andricdef : SchedAlias<WriteSTP, A57Write_1cyc_1S>; 900b57cec5SDimitry Andricdef : SchedAlias<WriteAdr, A57Write_1cyc_1I>; 910b57cec5SDimitry Andricdef : SchedAlias<WriteLDIdx, A57Write_4cyc_1I_1L>; 920b57cec5SDimitry Andricdef : SchedAlias<WriteSTIdx, A57Write_1cyc_1I_1S>; 930b57cec5SDimitry Andricdef : SchedAlias<WriteF, A57Write_3cyc_1V>; 940b57cec5SDimitry Andricdef : SchedAlias<WriteFCmp, A57Write_3cyc_1V>; 950b57cec5SDimitry Andricdef : SchedAlias<WriteFCvt, A57Write_5cyc_1V>; 960b57cec5SDimitry Andricdef : SchedAlias<WriteFCopy, A57Write_5cyc_1L>; 970b57cec5SDimitry Andricdef : SchedAlias<WriteFImm, A57Write_3cyc_1V>; 98e8d8bef9SDimitry Andricdef : WriteRes<WriteFMul, [A57UnitV]> { let Latency = 5;} 990b57cec5SDimitry Andricdef : SchedAlias<WriteFDiv, A57Write_17cyc_1W>; 100349cc55cSDimitry Andricdef : SchedAlias<WriteVd, A57Write_3cyc_1V>; 101349cc55cSDimitry Andricdef : SchedAlias<WriteVq, A57Write_3cyc_1V>; 1020b57cec5SDimitry Andricdef : SchedAlias<WriteVLD, A57Write_5cyc_1L>; 1030b57cec5SDimitry Andricdef : SchedAlias<WriteVST, A57Write_1cyc_1S>; 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andricdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; } 1060b57cec5SDimitry Andric 1070b57cec5SDimitry Andricdef : WriteRes<WriteSys, []> { let Latency = 1; } 1080b57cec5SDimitry Andricdef : WriteRes<WriteBarrier, []> { let Latency = 1; } 1090b57cec5SDimitry Andricdef : WriteRes<WriteHint, []> { let Latency = 1; } 1100b57cec5SDimitry Andric 1110b57cec5SDimitry Andricdef : WriteRes<WriteLDHi, []> { let Latency = 4; } 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric// Forwarding logic is only modeled for multiply and accumulate 1140b57cec5SDimitry Andricdef : ReadAdvance<ReadI, 0>; 1150b57cec5SDimitry Andricdef : ReadAdvance<ReadISReg, 0>; 1160b57cec5SDimitry Andricdef : ReadAdvance<ReadIEReg, 0>; 1170b57cec5SDimitry Andricdef : ReadAdvance<ReadIM, 0>; 1180b57cec5SDimitry Andricdef : ReadAdvance<ReadIMA, 2, [WriteIM32, WriteIM64]>; 1190b57cec5SDimitry Andricdef : ReadAdvance<ReadID, 0>; 1200b57cec5SDimitry Andricdef : ReadAdvance<ReadExtrHi, 0>; 121349cc55cSDimitry Andricdef : ReadAdvance<ReadST, 0>; 1220b57cec5SDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>; 1230b57cec5SDimitry Andricdef : ReadAdvance<ReadVLD, 0>; 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric 1260b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1270b57cec5SDimitry Andric// Specialize the coarse model by associating instruction groups with the 1280b57cec5SDimitry Andric// subtarget-defined types. As the modeled is refined, this will override most 1290b57cec5SDimitry Andric// of the above ShchedAlias mappings. 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andric// Miscellaneous 1320b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>; 1350b57cec5SDimitry Andric 1360b57cec5SDimitry Andric 1370b57cec5SDimitry Andric// Branch Instructions 1380b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1B_1I], (instrs BL)>; 1410b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1B_1I], (instrs BLR)>; 1420b57cec5SDimitry Andric 1430b57cec5SDimitry Andric 1440b57cec5SDimitry Andric// Shifted Register with Shift == 0 1450b57cec5SDimitry Andric// ---------------------------------------------------------------------------- 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andricdef A57WriteISReg : SchedWriteVariant<[ 1480b57cec5SDimitry Andric SchedVar<RegShiftedPred, [WriteISReg]>, 1490b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteI]>]>; 1500b57cec5SDimitry Andricdef : InstRW<[A57WriteISReg], (instregex ".*rs$")>; 1510b57cec5SDimitry Andric 1520b57cec5SDimitry Andric 1530b57cec5SDimitry Andric// Divide and Multiply Instructions 1540b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric// Multiply high 1570b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1M], (instrs SMULHrr, UMULHrr)>; 1580b57cec5SDimitry Andric 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andric// Miscellaneous Data-Processing Instructions 1610b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 1620b57cec5SDimitry Andric 1630b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1I], (instrs EXTRWrri)>; 1640b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1M], (instrs EXTRXrri)>; 1650b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1M], (instregex "BFM")>; 1660b57cec5SDimitry Andric 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric// Cryptography Extensions 1690b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andricdef A57ReadAES : SchedReadAdvance<3, [A57Write_3cyc_1W]>; 1720b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^AES[DE]")>; 1730b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W, A57ReadAES], (instregex "^AESI?MC")>; 1740b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2V], (instregex "^SHA1SU0")>; 1750b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^SHA1(H|SU1)")>; 1760b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^SHA1[CMP]")>; 1770b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^SHA256SU0")>; 1780b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^SHA256(H|H2|SU1)")>; 1790b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^CRC32")>; 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andric 1820b57cec5SDimitry Andric// Vector Load 1830b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD1i(8|16|32)$")>; 1865f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V], (instregex "LD1i(8|16|32)_POST$")>; 1870b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD1i(64)$")>; 1885f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instregex "LD1i(64)_POST$")>; 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD1Rv(8b|4h|2s)$")>; 1915f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V], (instregex "LD1Rv(8b|4h|2s)_POST$")>; 1920b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD1Rv(1d)$")>; 1935f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instregex "LD1Rv(1d)_POST$")>; 1940b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD1Rv(16b|8h|4s|2d)$")>; 1955f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V], (instregex "LD1Rv(16b|8h|4s|2d)_POST$")>; 1960b57cec5SDimitry Andric 1970b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD1Onev(8b|4h|2s|1d)$")>; 1985f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instregex "LD1Onev(8b|4h|2s|1d)_POST$")>; 1990b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD1Onev(16b|8h|4s|2d)$")>; 2005f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instregex "LD1Onev(16b|8h|4s|2d)_POST$")>; 2010b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD1Twov(8b|4h|2s|1d)$")>; 2025f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instregex "LD1Twov(8b|4h|2s|1d)_POST$")>; 2030b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD1Twov(16b|8h|4s|2d)$")>; 2045f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L], (instregex "LD1Twov(16b|8h|4s|2d)_POST$")>; 2050b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD1Threev(8b|4h|2s|1d)$")>; 2065f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L], (instregex "LD1Threev(8b|4h|2s|1d)_POST$")>; 2070b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_3L], (instregex "LD1Threev(16b|8h|4s|2d)$")>; 2085f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_7cyc_3L], (instregex "LD1Threev(16b|8h|4s|2d)_POST$")>; 2090b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD1Fourv(8b|4h|2s|1d)$")>; 2105f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L], (instregex "LD1Fourv(8b|4h|2s|1d)_POST$")>; 2110b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L], (instregex "LD1Fourv(16b|8h|4s|2d)$")>; 2125f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_4L], (instregex "LD1Fourv(16b|8h|4s|2d)_POST$")>; 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD2i(8|16)$")>; 2155f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V], (instregex "LD2i(8|16)_POST$")>; 2160b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD2i(32)$")>; 2175f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L], (instregex "LD2i(32)_POST$")>; 2180b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD2i(64)$")>; 2195f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V], (instregex "LD2i(64)_POST$")>; 2200b57cec5SDimitry Andric 2210b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD2Rv(8b|4h|2s)$")>; 2225f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V], (instregex "LD2Rv(8b|4h|2s)_POST$")>; 2230b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instregex "LD2Rv(1d)$")>; 2245f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instregex "LD2Rv(1d)_POST$")>; 2250b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD2Rv(16b|8h|4s|2d)$")>; 2265f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V], (instregex "LD2Rv(16b|8h|4s|2d)_POST$")>; 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "LD2Twov(8b|4h|2s)$")>; 2295f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_1V], (instregex "LD2Twov(8b|4h|2s)_POST$")>; 2300b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V], (instregex "LD2Twov(16b|8h|4s)$")>; 2315f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_2V], (instregex "LD2Twov(16b|8h|4s)_POST$")>; 2320b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD2Twov(2d)$")>; 2335f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L], (instregex "LD2Twov(2d)_POST$")>; 2340b57cec5SDimitry Andric 2350b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V], (instregex "LD3i(8|16)$")>; 2365f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_1L_3V], (instregex "LD3i(8|16)_POST$")>; 2370b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD3i(32)$")>; 2385f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V], (instregex "LD3i(32)_POST$")>; 2390b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD3i(64)$")>; 2405f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L], (instregex "LD3i(64)_POST$")>; 2410b57cec5SDimitry Andric 2420b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD3Rv(8b|4h|2s)$")>; 2435f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V], (instregex "LD3Rv(8b|4h|2s)_POST$")>; 2440b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD3Rv(1d)$")>; 2455f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L], (instregex "LD3Rv(1d)_POST$")>; 2460b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1L_3V], (instregex "LD3Rv(16b|8h|4s)$")>; 2475f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_1L_3V], (instregex "LD3Rv(16b|8h|4s)_POST$")>; 2480b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V], (instregex "LD3Rv(2d)$")>; 2495f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_3V], (instregex "LD3Rv(2d)_POST$")>; 2500b57cec5SDimitry Andric 2510b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V], (instregex "LD3Threev(8b|4h|2s)$")>; 2525f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_2V], (instregex "LD3Threev(8b|4h|2s)_POST$")>; 2530b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_3L_4V], (instregex "LD3Threev(16b|8h|4s)$")>; 2545f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_10cyc_3L_4V], (instregex "LD3Threev(16b|8h|4s)_POST$")>; 2550b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L], (instregex "LD3Threev(2d)$")>; 2565f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_4L], (instregex "LD3Threev(2d)_POST$")>; 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V], (instregex "LD4i(8|16)$")>; 2595f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_3V], (instregex "LD4i(8|16)_POST$")>; 2600b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD4i(32)$")>; 2615f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V], (instregex "LD4i(32)_POST$")>; 2620b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V], (instregex "LD4i(64)$")>; 2635f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_3V], (instregex "LD4i(64)_POST$")>; 2640b57cec5SDimitry Andric 2650b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_2V], (instregex "LD4Rv(8b|4h|2s)$")>; 2665f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_1L_2V], (instregex "LD4Rv(8b|4h|2s)_POST$")>; 2670b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L], (instregex "LD4Rv(1d)$")>; 2685f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L], (instregex "LD4Rv(1d)_POST$")>; 2690b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_3V], (instregex "LD4Rv(16b|8h|4s)$")>; 2705f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_3V], (instregex "LD4Rv(16b|8h|4s)_POST$")>; 2710b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_4V], (instregex "LD4Rv(2d)$")>; 2725f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_4V], (instregex "LD4Rv(2d)_POST$")>; 2730b57cec5SDimitry Andric 2740b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2L_2V], (instregex "LD4Fourv(8b|4h|2s)$")>; 2755f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_9cyc_2L_2V], (instregex "LD4Fourv(8b|4h|2s)_POST$")>; 2760b57cec5SDimitry Andricdef : InstRW<[A57Write_11cyc_4L_4V], (instregex "LD4Fourv(16b|8h|4s)$")>; 2775f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_11cyc_4L_4V], (instregex "LD4Fourv(16b|8h|4s)_POST$")>; 2780b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_4L], (instregex "LD4Fourv(2d)$")>; 2795f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_4L], (instregex "LD4Fourv(2d)_POST$")>; 2800b57cec5SDimitry Andric 2810b57cec5SDimitry Andric// Vector Store 2820b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 2830b57cec5SDimitry Andric 2840b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S], (instregex "ST1i(8|16|32)$")>; 2855f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1S], (instregex "ST1i(8|16|32)_POST$")>; 2860b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V], (instregex "ST1i(64)$")>; 2875f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_1S_1V], (instregex "ST1i(64)_POST$")>; 2880b57cec5SDimitry Andric 2890b57cec5SDimitry Andricdef : InstRW<[A57Write_1cyc_1S], (instregex "ST1Onev(8b|4h|2s|1d)$")>; 2905f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1S], (instregex "ST1Onev(8b|4h|2s|1d)_POST$")>; 2910b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instregex "ST1Onev(16b|8h|4s|2d)$")>; 2925f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_2S], (instregex "ST1Onev(16b|8h|4s|2d)_POST$")>; 2930b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instregex "ST1Twov(8b|4h|2s|1d)$")>; 2945f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_2S], (instregex "ST1Twov(8b|4h|2s|1d)_POST$")>; 2950b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S], (instregex "ST1Twov(16b|8h|4s|2d)$")>; 2965f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S], (instregex "ST1Twov(16b|8h|4s|2d)_POST$")>; 2970b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S], (instregex "ST1Threev(8b|4h|2s|1d)$")>; 2985f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_3S], (instregex "ST1Threev(8b|4h|2s|1d)_POST$")>; 2990b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S], (instregex "ST1Threev(16b|8h|4s|2d)$")>; 3005f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_6S], (instregex "ST1Threev(16b|8h|4s|2d)_POST$")>; 3010b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S], (instregex "ST1Fourv(8b|4h|2s|1d)$")>; 3025f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S], (instregex "ST1Fourv(8b|4h|2s|1d)_POST$")>; 3030b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S], (instregex "ST1Fourv(16b|8h|4s|2d)$")>; 3045f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_8S], (instregex "ST1Fourv(16b|8h|4s|2d)_POST$")>; 3050b57cec5SDimitry Andric 3060b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V], (instregex "ST2i(8|16|32)$")>; 3075f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_1S_1V], (instregex "ST2i(8|16|32)_POST$")>; 3080b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instregex "ST2i(64)$")>; 3095f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_2S], (instregex "ST2i(64)_POST$")>; 3100b57cec5SDimitry Andric 3110b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V], (instregex "ST2Twov(8b|4h|2s)$")>; 3125f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_2S_1V], (instregex "ST2Twov(8b|4h|2s)_POST$")>; 3130b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V], (instregex "ST2Twov(16b|8h|4s)$")>; 3145f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S_2V], (instregex "ST2Twov(16b|8h|4s)_POST$")>; 3150b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S], (instregex "ST2Twov(2d)$")>; 3165f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S], (instregex "ST2Twov(2d)_POST$")>; 3170b57cec5SDimitry Andric 3180b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V], (instregex "ST3i(8|16)$")>; 3195f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_1S_1V], (instregex "ST3i(8|16)_POST$")>; 3200b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S], (instregex "ST3i(32)$")>; 3215f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_3S], (instregex "ST3i(32)_POST$")>; 3220b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V], (instregex "ST3i(64)$")>; 3235f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_2S_1V], (instregex "ST3i(64)_POST$")>; 3240b57cec5SDimitry Andric 3250b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_3S_2V], (instregex "ST3Threev(8b|4h|2s)$")>; 3265f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_3S_2V], (instregex "ST3Threev(8b|4h|2s)_POST$")>; 3270b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S_4V], (instregex "ST3Threev(16b|8h|4s)$")>; 3285f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_6S_4V], (instregex "ST3Threev(16b|8h|4s)_POST$")>; 3290b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_6S], (instregex "ST3Threev(2d)$")>; 3305f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_6S], (instregex "ST3Threev(2d)_POST$")>; 3310b57cec5SDimitry Andric 3320b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1S_1V], (instregex "ST4i(8|16)$")>; 3335f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_1S_1V], (instregex "ST4i(8|16)_POST$")>; 3340b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S], (instregex "ST4i(32)$")>; 3355f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S], (instregex "ST4i(32)_POST$")>; 3360b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_2S_1V], (instregex "ST4i(64)$")>; 3375f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_3cyc_2S_1V], (instregex "ST4i(64)_POST$")>; 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_4S_2V], (instregex "ST4Fourv(8b|4h|2s)$")>; 3405f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_4S_2V], (instregex "ST4Fourv(8b|4h|2s)_POST$")>; 3410b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S_4V], (instregex "ST4Fourv(16b|8h|4s)$")>; 3425f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_8S_4V], (instregex "ST4Fourv(16b|8h|4s)_POST$")>; 3430b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_8S], (instregex "ST4Fourv(2d)$")>; 3445f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_8cyc_8S], (instregex "ST4Fourv(2d)_POST$")>; 3450b57cec5SDimitry Andric 3460b57cec5SDimitry Andric// Vector - Integer 3470b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 3480b57cec5SDimitry Andric 3490b57cec5SDimitry Andric// Reference for forms in this group 3500b57cec5SDimitry Andric// D form - v8i8, v4i16, v2i32 3510b57cec5SDimitry Andric// Q form - v16i8, v8i16, v4i32 3520b57cec5SDimitry Andric// D form - v1i8, v1i16, v1i32, v1i64 3530b57cec5SDimitry Andric// Q form - v16i8, v8i16, v4i32, v2i64 3540b57cec5SDimitry Andric// D form - v8i8_v8i16, v4i16_v4i32, v2i32_v2i64 3550b57cec5SDimitry Andric// Q form - v16i8_v8i16, v8i16_v4i32, v4i32_v2i64 3560b57cec5SDimitry Andric 357e8d8bef9SDimitry Andric// Cortex A57 Software Optimization Guide Sec 3.14 358e8d8bef9SDimitry Andric// Advance for absolute diff accum, pairwise add and accumulate, shift accumulate 359e8d8bef9SDimitry Andricdef A57ReadIVA3 : SchedReadAdvance<3, [A57Write_4cyc_1X_NonMul_Forward, A57Write_5cyc_2X_NonMul_Forward]>; 360e8d8bef9SDimitry Andric 3610b57cec5SDimitry Andric// ASIMD absolute diff accum, D-form 362e8d8bef9SDimitry Andricdef : InstRW<[A57Write_4cyc_1X_NonMul_Forward, A57ReadIVA3], (instregex "^[SU]ABA(v8i8|v4i16|v2i32)$")>; 3630b57cec5SDimitry Andric// ASIMD absolute diff accum, Q-form 364e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_2X_NonMul_Forward, A57ReadIVA3], (instregex "^[SU]ABA(v16i8|v8i16|v4i32)$")>; 3650b57cec5SDimitry Andric// ASIMD absolute diff accum long 366e8d8bef9SDimitry Andricdef : InstRW<[A57Write_4cyc_1X_NonMul_Forward, A57ReadIVA3], (instregex "^[SU]ABAL")>; 3670b57cec5SDimitry Andric 3680b57cec5SDimitry Andric// ASIMD arith, reduce, 4H/4S 3690b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]?ADDL?V(v8i8|v4i16|v2i32)v$")>; 3700b57cec5SDimitry Andric// ASIMD arith, reduce, 8B/8H 3710b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_1V_1X], (instregex "^[SU]?ADDL?V(v8i16|v4i32)v$")>; 3720b57cec5SDimitry Andric// ASIMD arith, reduce, 16B 3730b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_2X], (instregex "^[SU]?ADDL?Vv16i8v$")>; 3740b57cec5SDimitry Andric 3750b57cec5SDimitry Andric// ASIMD max/min, reduce, 4H/4S 3760b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU](MIN|MAX)V(v4i16|v4i32)v$")>; 3770b57cec5SDimitry Andric// ASIMD max/min, reduce, 8B/8H 3780b57cec5SDimitry Andricdef : InstRW<[A57Write_7cyc_1V_1X], (instregex "^[SU](MIN|MAX)V(v8i8|v8i16)v$")>; 3790b57cec5SDimitry Andric// ASIMD max/min, reduce, 16B 3800b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_2X], (instregex "^[SU](MIN|MAX)Vv16i8v$")>; 3810b57cec5SDimitry Andric 3820b57cec5SDimitry Andric// ASIMD multiply, D-form 383e8d8bef9SDimitry Andric// MUL 384e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W_Mul_Forward], (instregex "^MUL(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)(_indexed)?$")>; 385e8d8bef9SDimitry Andric// PMUL, SQDMULH, SQRDMULH 386e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^(PMUL|SQR?DMULH)(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)(_indexed)?$")>; 387e8d8bef9SDimitry Andric 3880b57cec5SDimitry Andric// ASIMD multiply, Q-form 389e8d8bef9SDimitry Andric// MUL 390e8d8bef9SDimitry Andricdef : InstRW<[A57Write_6cyc_2W_Mul_Forward], (instregex "^MUL(v16i8|v8i16|v4i32)(_indexed)?$")>; 391e8d8bef9SDimitry Andric// PMUL, SQDMULH, SQRDMULH 392e8d8bef9SDimitry Andricdef : InstRW<[A57Write_6cyc_2W], (instregex "^(PMUL|SQR?DMULH)(v16i8|v8i16|v4i32)(_indexed)?$")>; 393e8d8bef9SDimitry Andric 394e8d8bef9SDimitry Andric// Cortex A57 Software Optimization Guide Sec 3.14 395e8d8bef9SDimitry Andricdef A57ReadIVMA4 : SchedReadAdvance<4 , [A57Write_5cyc_1W_Mul_Forward, A57Write_6cyc_2W_Mul_Forward]>; 396e8d8bef9SDimitry Andricdef A57ReadIVMA3 : SchedReadAdvance<3 , [A57Write_5cyc_1W_Mul_Forward, A57Write_6cyc_2W_Mul_Forward]>; 3970b57cec5SDimitry Andric 3980b57cec5SDimitry Andric// ASIMD multiply accumulate, D-form 399e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W_Mul_Forward, A57ReadIVMA4], (instregex "^ML[AS](v8i8|v4i16|v2i32)(_indexed)?$")>; 4000b57cec5SDimitry Andric// ASIMD multiply accumulate, Q-form 401e8d8bef9SDimitry Andricdef : InstRW<[A57Write_6cyc_2W_Mul_Forward, A57ReadIVMA4], (instregex "^ML[AS](v16i8|v8i16|v4i32)(_indexed)?$")>; 4020b57cec5SDimitry Andric 4030b57cec5SDimitry Andric// ASIMD multiply accumulate long 4040b57cec5SDimitry Andric// ASIMD multiply accumulate saturating long 405e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W_Mul_Forward, A57ReadIVMA4], (instregex "^(S|U)ML[AS]L")>; 406e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W_Mul_Forward, A57ReadIVMA3], (instregex "^SQDML[AS]L")>; 4070b57cec5SDimitry Andric 4080b57cec5SDimitry Andric// ASIMD multiply long 409e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W_Mul_Forward], (instregex "^(S|U)MULL")>; 410e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^SQDMULL")>; 4110b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1W], (instregex "^PMULL(v8i8|v16i8)")>; 4120b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1W], (instregex "^PMULL(v1i64|v2i64)")>; 4130b57cec5SDimitry Andric 4140b57cec5SDimitry Andric// ASIMD pairwise add and accumulate 4150b57cec5SDimitry Andric// ASIMD shift accumulate 416e8d8bef9SDimitry Andricdef : InstRW<[A57Write_4cyc_1X_NonMul_Forward, A57ReadIVA3], (instregex "^[SU]ADALP")>; 417e8d8bef9SDimitry Andricdef : InstRW<[A57Write_4cyc_1X_NonMul_Forward, A57ReadIVA3], (instregex "^(S|SR|U|UR)SRA")>; 4180b57cec5SDimitry Andric 4190b57cec5SDimitry Andric// ASIMD shift by immed, complex 4200b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]?(Q|R){1,2}SHR")>; 4210b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^SQSHLU")>; 4220b57cec5SDimitry Andric 4230b57cec5SDimitry Andric 4240b57cec5SDimitry Andric// ASIMD shift by register, basic, Q-form 4250b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_2X], (instregex "^[SU]SHL(v16i8|v8i16|v4i32|v2i64)")>; 4260b57cec5SDimitry Andric 4270b57cec5SDimitry Andric// ASIMD shift by register, complex, D-form 4280b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU][QR]{1,2}SHL(v1i8|v1i16|v1i32|v1i64|v8i8|v4i16|v2i32|b|d|h|s)")>; 4290b57cec5SDimitry Andric 4300b57cec5SDimitry Andric// ASIMD shift by register, complex, Q-form 4310b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2X], (instregex "^[SU][QR]{1,2}SHL(v16i8|v8i16|v4i32|v2i64)")>; 4320b57cec5SDimitry Andric 4330b57cec5SDimitry Andric 4340b57cec5SDimitry Andric// Vector - Floating Point 4350b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 4360b57cec5SDimitry Andric 4370b57cec5SDimitry Andric// Reference for forms in this group 4380b57cec5SDimitry Andric// D form - v2f32 4390b57cec5SDimitry Andric// Q form - v4f32, v2f64 4400b57cec5SDimitry Andric// D form - 32, 64 4410b57cec5SDimitry Andric// D form - v1i32, v1i64 4420b57cec5SDimitry Andric// D form - v2i32 4430b57cec5SDimitry Andric// Q form - v4i32, v2i64 4440b57cec5SDimitry Andric 4450b57cec5SDimitry Andric// ASIMD FP arith, normal, D-form 4460b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FABD|FADD|FSUB)(v2f32|32|64|v2i32p)")>; 4470b57cec5SDimitry Andric// ASIMD FP arith, normal, Q-form 4480b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FABD|FADD|FSUB)(v4f32|v2f64|v2i64p)")>; 4490b57cec5SDimitry Andric 4500b57cec5SDimitry Andric// ASIMD FP arith, pairwise, D-form 4510b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FADDP(v2f32|32|64|v2i32)")>; 4520b57cec5SDimitry Andric// ASIMD FP arith, pairwise, Q-form 4530b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^FADDP(v4f32|v2f64|v2i64)")>; 4540b57cec5SDimitry Andric 4550b57cec5SDimitry Andric// ASIMD FP compare, D-form 4560b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FACGE|FACGT|FCMEQ|FCMGE|FCMGT|FCMLE|FCMLT)(v2f32|32|64|v1i32|v2i32|v1i64)")>; 4570b57cec5SDimitry Andric// ASIMD FP compare, Q-form 4580b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FACGE|FACGT|FCMEQ|FCMGE|FCMGT|FCMLE|FCMLT)(v4f32|v2f64|v4i32|v2i64)")>; 4590b57cec5SDimitry Andric 4600b57cec5SDimitry Andric// ASIMD FP convert, long and narrow 4610b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_3V], (instregex "^FCVT(L|N|XN)v")>; 4620b57cec5SDimitry Andric// ASIMD FP convert, other, D-form 463753f127fSDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^[FSU]CVT([AMNPZ][SU])?(_Int)?(v2f32|v1i32|v2i32|v1i64)")>; 4640b57cec5SDimitry Andric// ASIMD FP convert, other, Q-form 465753f127fSDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^[FSU]CVT([AMNPZ][SU])?(_Int)?(v4f32|v2f64|v4i32|v2i64)")>; 4660b57cec5SDimitry Andric 4670b57cec5SDimitry Andric// ASIMD FP divide, D-form, F32 4680b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instregex "FDIVv2f32")>; 4690b57cec5SDimitry Andric// ASIMD FP divide, Q-form, F32 4700b57cec5SDimitry Andricdef : InstRW<[A57Write_34cyc_2W], (instregex "FDIVv4f32")>; 4710b57cec5SDimitry Andric// ASIMD FP divide, Q-form, F64 4720b57cec5SDimitry Andricdef : InstRW<[A57Write_64cyc_2W], (instregex "FDIVv2f64")>; 4730b57cec5SDimitry Andric 4740b57cec5SDimitry Andric// Note: These were simply duplicated from ASIMD FDIV because of missing documentation 4750b57cec5SDimitry Andric// ASIMD FP square root, D-form, F32 4760b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instregex "FSQRTv2f32")>; 4770b57cec5SDimitry Andric// ASIMD FP square root, Q-form, F32 4780b57cec5SDimitry Andricdef : InstRW<[A57Write_34cyc_2W], (instregex "FSQRTv4f32")>; 4790b57cec5SDimitry Andric// ASIMD FP square root, Q-form, F64 4800b57cec5SDimitry Andricdef : InstRW<[A57Write_64cyc_2W], (instregex "FSQRTv2f64")>; 4810b57cec5SDimitry Andric 4820b57cec5SDimitry Andric// ASIMD FP max/min, normal, D-form 4830b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FMAX|FMIN)(NM)?(v2f32)")>; 4840b57cec5SDimitry Andric// ASIMD FP max/min, normal, Q-form 4850b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^(FMAX|FMIN)(NM)?(v4f32|v2f64)")>; 4860b57cec5SDimitry Andric// ASIMD FP max/min, pairwise, D-form 4870b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^(FMAX|FMIN)(NM)?P(v2f32|v2i32)")>; 4880b57cec5SDimitry Andric// ASIMD FP max/min, pairwise, Q-form 4890b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^(FMAX|FMIN)(NM)?P(v4f32|v2f64|v2i64)")>; 4900b57cec5SDimitry Andric// ASIMD FP max/min, reduce 4910b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_3V], (instregex "^(FMAX|FMIN)(NM)?Vv")>; 4920b57cec5SDimitry Andric 4930b57cec5SDimitry Andric// ASIMD FP multiply, D-form, FZ 494e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_1V_FP_Forward], (instregex "^FMULX?(v2f32|v1i32|v2i32|v1i64|32|64)")>; 4950b57cec5SDimitry Andric// ASIMD FP multiply, Q-form, FZ 496e8d8bef9SDimitry Andricdef : InstRW<[A57Write_5cyc_2V_FP_Forward], (instregex "^FMULX?(v4f32|v2f64|v4i32|v2i64)")>; 4970b57cec5SDimitry Andric 4980b57cec5SDimitry Andric// ASIMD FP multiply accumulate, D-form, FZ 4990b57cec5SDimitry Andric// ASIMD FP multiply accumulate, Q-form, FZ 5000b57cec5SDimitry Andricdef A57WriteFPVMAD : SchedWriteRes<[A57UnitV]> { let Latency = 9; } 5010b57cec5SDimitry Andricdef A57WriteFPVMAQ : SchedWriteRes<[A57UnitV, A57UnitV]> { let Latency = 10; } 502e8d8bef9SDimitry Andric 503e8d8bef9SDimitry Andric// Cortex A57 Software Optimization Guide Sec 3.15 504e8d8bef9SDimitry Andric// Advances from FP mul and mul-accum to mul-accum 505e8d8bef9SDimitry Andricdef A57ReadFPVMA5 : SchedReadAdvance<5, [A57WriteFPVMAD, A57WriteFPVMAQ, A57Write_5cyc_1V_FP_Forward, A57Write_5cyc_2V_FP_Forward]>; 506e8d8bef9SDimitry Andricdef A57ReadFPVMA6 : SchedReadAdvance<6, [A57WriteFPVMAD, A57WriteFPVMAQ, A57Write_5cyc_1V_FP_Forward, A57Write_5cyc_2V_FP_Forward]>; 507e8d8bef9SDimitry Andric 5080b57cec5SDimitry Andricdef : InstRW<[A57WriteFPVMAD, A57ReadFPVMA5], (instregex "^FML[AS](v2f32|v1i32|v2i32|v1i64)")>; 509e8d8bef9SDimitry Andricdef : InstRW<[A57WriteFPVMAQ, A57ReadFPVMA6], (instregex "^FML[AS](v4f32|v2f64|v4i32|v2i64)")>; 5100b57cec5SDimitry Andric 5110b57cec5SDimitry Andric// ASIMD FP round, D-form 5120b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FRINT[AIMNPXZ](v2f32)")>; 5130b57cec5SDimitry Andric// ASIMD FP round, Q-form 5140b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^FRINT[AIMNPXZ](v4f32|v2f64)")>; 5150b57cec5SDimitry Andric 5160b57cec5SDimitry Andric 5170b57cec5SDimitry Andric// Vector - Miscellaneous 5180b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 5190b57cec5SDimitry Andric 5200b57cec5SDimitry Andric// Reference for forms in this group 5210b57cec5SDimitry Andric// D form - v8i8, v4i16, v2i32 5220b57cec5SDimitry Andric// Q form - v16i8, v8i16, v4i32 5230b57cec5SDimitry Andric// D form - v1i8, v1i16, v1i32, v1i64 5240b57cec5SDimitry Andric// Q form - v16i8, v8i16, v4i32, v2i64 5250b57cec5SDimitry Andric 5260b57cec5SDimitry Andric// ASIMD bitwise insert, Q-form 5275ffd83dbSDimitry Andricdef : InstRW<[A57Write_3cyc_2V], (instregex "^(BIF|BIT|BSL|BSP)v16i8")>; 5280b57cec5SDimitry Andric 5290b57cec5SDimitry Andric// ASIMD duplicate, gen reg, D-form and Q-form 53004eeddc0SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^DUP(i8|i16|i32|i64)$")>; 5310b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^DUPv.+gpr")>; 5320b57cec5SDimitry Andric 5330b57cec5SDimitry Andric// ASIMD move, saturating 5340b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1X], (instregex "^[SU]QXTU?N")>; 5350b57cec5SDimitry Andric 5360b57cec5SDimitry Andric// ASIMD reciprocal estimate, D-form 5370b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^[FU](RECP|RSQRT)(E|X)(v2f32|v1i32|v2i32|v1i64)")>; 5380b57cec5SDimitry Andric// ASIMD reciprocal estimate, Q-form 5390b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_2V], (instregex "^[FU](RECP|RSQRT)(E|X)(v2f64|v4f32|v4i32)")>; 5400b57cec5SDimitry Andric 5410b57cec5SDimitry Andric// ASIMD reciprocal step, D-form, FZ 5420b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_1V], (instregex "^F(RECP|RSQRT)S(v2f32|v1i32|v2i32|v1i64|32|64)")>; 5430b57cec5SDimitry Andric// ASIMD reciprocal step, Q-form, FZ 5440b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_2V], (instregex "^F(RECP|RSQRT)S(v2f64|v4f32|v4i32)")>; 5450b57cec5SDimitry Andric 5460b57cec5SDimitry Andric// ASIMD table lookup, D-form 5470b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1V], (instregex "^TB[LX]v8i8One")>; 5480b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2V], (instregex "^TB[LX]v8i8Two")>; 5490b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_3V], (instregex "^TB[LX]v8i8Three")>; 5500b57cec5SDimitry Andricdef : InstRW<[A57Write_12cyc_4V], (instregex "^TB[LX]v8i8Four")>; 5510b57cec5SDimitry Andric// ASIMD table lookup, Q-form 5520b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_3V], (instregex "^TB[LX]v16i8One")>; 5530b57cec5SDimitry Andricdef : InstRW<[A57Write_9cyc_5V], (instregex "^TB[LX]v16i8Two")>; 5540b57cec5SDimitry Andricdef : InstRW<[A57Write_12cyc_7V], (instregex "^TB[LX]v16i8Three")>; 5550b57cec5SDimitry Andricdef : InstRW<[A57Write_15cyc_9V], (instregex "^TB[LX]v16i8Four")>; 5560b57cec5SDimitry Andric 5570b57cec5SDimitry Andric// ASIMD transfer, element to gen reg 5580b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L], (instregex "^[SU]MOVv")>; 5590b57cec5SDimitry Andric 5600b57cec5SDimitry Andric// ASIMD transfer, gen reg to element 5610b57cec5SDimitry Andricdef : InstRW<[A57Write_8cyc_1L_1V], (instregex "^INSv")>; 5620b57cec5SDimitry Andric 5630b57cec5SDimitry Andric// ASIMD unzip/zip, Q-form 5640b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_3V], (instregex "^(UZP|ZIP)(1|2)(v16i8|v8i16|v4i32|v2i64)")>; 5650b57cec5SDimitry Andric 5660b57cec5SDimitry Andric 5670b57cec5SDimitry Andric// Remainder 5680b57cec5SDimitry Andric// ----------------------------------------------------------------------------- 5690b57cec5SDimitry Andric 5700b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^F(ADD|SUB)[DS]rr")>; 5710b57cec5SDimitry Andric 572e8d8bef9SDimitry Andric// Cortex A57 Software Optimization Guide Sec 3.10 5730b57cec5SDimitry Andricdef A57WriteFPMA : SchedWriteRes<[A57UnitV]> { let Latency = 9; } 574e8d8bef9SDimitry Andricdef A57ReadFPMA5 : SchedReadAdvance<5, [A57WriteFPMA, WriteFMul]>; 5750b57cec5SDimitry Andricdef A57ReadFPM : SchedReadAdvance<0>; 5760b57cec5SDimitry Andricdef : InstRW<[A57WriteFPMA, A57ReadFPM, A57ReadFPM, A57ReadFPMA5], (instregex "^FN?M(ADD|SUB)[DS]rrr")>; 5770b57cec5SDimitry Andric 5780b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_1L_1V], (instregex "^[FSU]CVT[AMNPZ][SU](_Int)?[SU]?[XW]?[DS]?[rds]i?")>; 5790b57cec5SDimitry Andricdef : InstRW<[A57Write_10cyc_1L_1V], (instregex "^[SU]CVTF")>; 5800b57cec5SDimitry Andric 5810b57cec5SDimitry Andricdef : InstRW<[A57Write_32cyc_1W], (instrs FDIVDrr)>; 5820b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instrs FDIVSrr)>; 5830b57cec5SDimitry Andric 5840b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^F(MAX|MIN).+rr")>; 5850b57cec5SDimitry Andric 5860b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1V], (instregex "^FRINT.+r")>; 5870b57cec5SDimitry Andric 5880b57cec5SDimitry Andricdef : InstRW<[A57Write_32cyc_1W], (instrs FSQRTDr)>; 5890b57cec5SDimitry Andricdef : InstRW<[A57Write_17cyc_1W], (instrs FSQRTSr)>; 5900b57cec5SDimitry Andric 5910b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDNPDi)>; 5920b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi], (instrs LDNPQi)>; 5930b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDNPSi)>; 5940b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDPDi)>; 5955f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L, WriteLDHi], (instrs LDPDpost)>; 5965f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L, WriteLDHi], (instrs LDPDpre)>; 5970b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_2L, WriteLDHi], (instrs LDPQi)>; 5985f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L, WriteLDHi], (instrs LDPQpost)>; 5995f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_6cyc_2L, WriteLDHi], (instrs LDPQpre)>; 6000b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_2L, WriteLDHi], (instrs LDPSWi)>; 6015f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1I_2L, WriteLDHi], (instrs LDPSWpost)>; 6025f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1I_2L, WriteLDHi], (instrs LDPSWpre)>; 6030b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteLDHi], (instrs LDPSi)>; 6045f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L, WriteLDHi], (instrs LDPSpost)>; 6055f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L, WriteLDHi], (instrs LDPSpre)>; 6060b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRBpost)>; 6075f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instrs LDRBpre)>; 6080b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRBroW)>; 6090b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRBroX)>; 6100b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRBui)>; 6110b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRDl)>; 6120b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRDpost)>; 6135f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instrs LDRDpre)>; 6140b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRDroW)>; 6150b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRDroX)>; 6160b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRDui)>; 6170b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRHHroW)>; 6180b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRHHroX)>; 6190b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRHpost)>; 6205f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instrs LDRHpre)>; 6210b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRHroW)>; 6220b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRHroX)>; 6230b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRHui)>; 6240b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRQl)>; 6250b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRQpost)>; 6265f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instrs LDRQpre)>; 6270b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRQroW)>; 6280b57cec5SDimitry Andricdef : InstRW<[A57Write_6cyc_1I_1L, ReadAdrBase], (instrs LDRQroX)>; 6290b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRQui)>; 6300b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHWroW)>; 6310b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHWroX)>; 6320b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHXroW)>; 6330b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1I_1L, ReadAdrBase], (instrs LDRSHXroX)>; 6340b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRSl)>; 6350b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, WriteI], (instrs LDRSpost)>; 6365f757f3fSDimitry Andricdef : InstRW<[WriteAdr, A57Write_5cyc_1L], (instrs LDRSpre)>; 6370b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRSroW)>; 6380b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L, ReadAdrBase], (instrs LDRSroX)>; 6390b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDRSui)>; 6400b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURBi)>; 6410b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURDi)>; 6420b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURHi)>; 6430b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURQi)>; 6440b57cec5SDimitry Andricdef : InstRW<[A57Write_5cyc_1L], (instrs LDURSi)>; 6450b57cec5SDimitry Andric 6460b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STNPDi)>; 6470b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1I_4S], (instrs STNPQi)>; 6480b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STNPXi)>; 6490b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STPDi)>; 6500b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPDpost)>; 6510b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPDpre)>; 6520b57cec5SDimitry Andricdef : InstRW<[A57Write_4cyc_1I_4S], (instrs STPQi)>; 6530b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_1I_4S], (instrs STPQpost)>; 6540b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_4cyc_2I_4S], (instrs STPQpre)>; 6550b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPSpost)>; 6560b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPSpre)>; 6570b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPWpost)>; 6580b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STPWpre)>; 6590b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STPXi)>; 6600b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPXpost)>; 6610b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STPXpre)>; 6620b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBBpost)>; 6630b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBBpre)>; 6640b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRBpost)>; 6650b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRBpre)>; 6660b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRBroW)>; 6670b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRBroX)>; 6680b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRDpost)>; 6690b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRDpre)>; 6700b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHHpost)>; 6710b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHHpre)>; 6720b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHHroW)>; 6730b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHHroX)>; 6740b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRHpost)>; 6750b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRHpre)>; 6760b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHroW)>; 6770b57cec5SDimitry Andricdef : InstRW<[A57Write_3cyc_1I_1S, ReadAdrBase], (instrs STRHroX)>; 6780b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQpost)>; 6790b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_2cyc_1I_2S], (instrs STRQpre)>; 6800b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQroW)>; 6810b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S, ReadAdrBase], (instrs STRQroX)>; 6820b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_1I_2S], (instrs STRQui)>; 6830b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRSpost)>; 6840b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S], (instrs STRSpre)>; 6850b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRWpost)>; 6860b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRWpre)>; 6870b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRXpost)>; 6880b57cec5SDimitry Andricdef : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRXpre)>; 6890b57cec5SDimitry Andricdef : InstRW<[A57Write_2cyc_2S], (instrs STURQi)>; 6900b57cec5SDimitry Andric 6910b57cec5SDimitry Andric} // SchedModel = CortexA57Model 692