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