xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/ARM/ARMScheduleR52.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric//==- ARMScheduleR52.td - Cortex-R52 Scheduling Definitions -*- 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 SchedRead/Write data for the ARM Cortex-R52 processor.
100b57cec5SDimitry Andric//
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric// ===---------------------------------------------------------------------===//
140b57cec5SDimitry Andric// The Cortex-R52 is an in-order pipelined superscalar microprocessor with
150b57cec5SDimitry Andric// a 8 stage pipeline. It can issue maximum two instructions in each cycle.
160b57cec5SDimitry Andric// There are two ALUs, one LDST, one MUL  and a non-pipelined integer DIV.
170b57cec5SDimitry Andric// A number of forwarding paths enable results of computations to be input
180b57cec5SDimitry Andric// to subsequent operations before they are written to registers.
190b57cec5SDimitry Andric// This scheduler is a MachineScheduler. See TargetSchedule.td for details.
200b57cec5SDimitry Andric
210b57cec5SDimitry Andricdef CortexR52Model : SchedMachineModel {
220b57cec5SDimitry Andric  let MicroOpBufferSize = 0;  // R52 is in-order processor
230b57cec5SDimitry Andric  let IssueWidth = 2;         // 2 micro-ops dispatched per cycle
240b57cec5SDimitry Andric  let LoadLatency = 1;        // Optimistic, assuming no misses
250b57cec5SDimitry Andric  let MispredictPenalty = 8;  // A branch direction mispredict, including PFU
260b57cec5SDimitry Andric  let CompleteModel = 0;      // Covers instructions applicable to cortex-r52.
270b57cec5SDimitry Andric}
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric
300b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
310b57cec5SDimitry Andric// Define each kind of processor resource and number available.
320b57cec5SDimitry Andric
330b57cec5SDimitry Andric// Modeling each pipeline as a ProcResource using the BufferSize = 0 since
340b57cec5SDimitry Andric// Cortex-R52 is an in-order processor.
350b57cec5SDimitry Andric
360b57cec5SDimitry Andricdef R52UnitALU    : ProcResource<2> { let BufferSize = 0; } // Int ALU
370b57cec5SDimitry Andricdef R52UnitMAC    : ProcResource<1> { let BufferSize = 0; } // Int MAC
380b57cec5SDimitry Andricdef R52UnitDiv    : ProcResource<1> { let BufferSize = 0; } // Int Division
390b57cec5SDimitry Andricdef R52UnitLd     : ProcResource<1> { let BufferSize = 0; } // Load/Store
400b57cec5SDimitry Andricdef R52UnitB      : ProcResource<1> { let BufferSize = 0; } // Branch
410b57cec5SDimitry Andricdef R52UnitFPALU  : ProcResource<2> { let BufferSize = 0; } // FP ALU
420b57cec5SDimitry Andricdef R52UnitFPMUL  : ProcResource<2> { let BufferSize = 0; } // FP MUL
430b57cec5SDimitry Andricdef R52UnitFPDIV  : ProcResource<1> { let BufferSize = 0; } // FP DIV
440b57cec5SDimitry Andric
450b57cec5SDimitry Andric// Cortex-R52 specific SchedReads
460b57cec5SDimitry Andricdef R52Read_ISS   : SchedRead;
470b57cec5SDimitry Andricdef R52Read_EX1   : SchedRead;
480b57cec5SDimitry Andricdef R52Read_EX2   : SchedRead;
490b57cec5SDimitry Andricdef R52Read_WRI   : SchedRead;
500b57cec5SDimitry Andricdef R52Read_F0    : SchedRead; // F0 maps to ISS stage of integer pipe
510b57cec5SDimitry Andricdef R52Read_F1    : SchedRead;
520b57cec5SDimitry Andricdef R52Read_F2    : SchedRead;
530b57cec5SDimitry Andric
540b57cec5SDimitry Andric
550b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
560b57cec5SDimitry Andric// Subtarget-specific SchedWrite types which map ProcResources and set latency.
570b57cec5SDimitry Andric
580b57cec5SDimitry Andriclet SchedModel = CortexR52Model in {
590b57cec5SDimitry Andric
600b57cec5SDimitry Andric// ALU - Write occurs in Late EX2 (independent of whether shift was required)
610b57cec5SDimitry Andricdef : WriteRes<WriteALU, [R52UnitALU]> { let Latency = 3; }
620b57cec5SDimitry Andricdef : WriteRes<WriteALUsi, [R52UnitALU]> { let Latency = 3; }
630b57cec5SDimitry Andricdef : WriteRes<WriteALUsr, [R52UnitALU]> { let Latency = 3; }
640b57cec5SDimitry Andricdef : WriteRes<WriteALUSsr, [R52UnitALU]> { let Latency = 3; }
650b57cec5SDimitry Andric
660b57cec5SDimitry Andric// Compares
670b57cec5SDimitry Andricdef : WriteRes<WriteCMP, [R52UnitALU]> { let Latency = 0; }
680b57cec5SDimitry Andricdef : WriteRes<WriteCMPsi, [R52UnitALU]> { let Latency = 0; }
690b57cec5SDimitry Andricdef : WriteRes<WriteCMPsr, [R52UnitALU]> { let Latency = 0; }
700b57cec5SDimitry Andric
710b57cec5SDimitry Andric// Multiply - aliased to sub-target specific later
720b57cec5SDimitry Andric
730b57cec5SDimitry Andric// Div - may stall 0-9 cycles depending on input (i.e. WRI+(0-9)/2)
740b57cec5SDimitry Andricdef : WriteRes<WriteDIV, [R52UnitDiv]> {
75*5f757f3fSDimitry Andric  let Latency = 8; let ReleaseAtCycles = [8]; // non-pipelined
760b57cec5SDimitry Andric}
770b57cec5SDimitry Andric
780b57cec5SDimitry Andric// Branches  - LR written in Late EX2
790b57cec5SDimitry Andricdef : WriteRes<WriteBr, [R52UnitB]> { let Latency = 0; }
800b57cec5SDimitry Andricdef : WriteRes<WriteBrL, [R52UnitB]> { let Latency = 0; }
810b57cec5SDimitry Andricdef : WriteRes<WriteBrTbl, [R52UnitALU]> { let Latency = 0; }
820b57cec5SDimitry Andric
830b57cec5SDimitry Andric// Misc
840b57cec5SDimitry Andricdef : WriteRes<WriteNoop, []> { let Latency = 0; let NumMicroOps = 0; }
850b57cec5SDimitry Andric
860b57cec5SDimitry Andric// Integer pipeline by-passes
870b57cec5SDimitry Andricdef : ReadAdvance<ReadALU, 1>;   // Operand needed in EX1 stage
880b57cec5SDimitry Andricdef : ReadAdvance<ReadALUsr, 0>; // Shift operands needed in ISS
890b57cec5SDimitry Andricdef : ReadAdvance<ReadMUL, 0>;
900b57cec5SDimitry Andricdef : ReadAdvance<ReadMAC, 0>;
910b57cec5SDimitry Andric
920b57cec5SDimitry Andric// Floating-point. Map target-defined SchedReadWrites to subtarget
930b57cec5SDimitry Andricdef : WriteRes<WriteFPMUL32, [R52UnitFPMUL]> { let Latency = 6; }
940b57cec5SDimitry Andric
950b57cec5SDimitry Andricdef : WriteRes<WriteFPMUL64, [R52UnitFPMUL, R52UnitFPMUL]> {
960b57cec5SDimitry Andric  let Latency = 6;
970b57cec5SDimitry Andric}
980b57cec5SDimitry Andric
990b57cec5SDimitry Andricdef : WriteRes<WriteFPMAC32, [R52UnitFPMUL, R52UnitFPALU]> {
1000b57cec5SDimitry Andric  let Latency = 11;     // as it is internally two insns (MUL then ADD)
1010b57cec5SDimitry Andric}
1020b57cec5SDimitry Andric
1030b57cec5SDimitry Andricdef : WriteRes<WriteFPMAC64, [R52UnitFPMUL, R52UnitFPMUL,
1040b57cec5SDimitry Andric                              R52UnitFPALU, R52UnitFPALU]> {
1050b57cec5SDimitry Andric  let Latency = 11;
1060b57cec5SDimitry Andric}
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andricdef : WriteRes<WriteFPDIV32, [R52UnitDiv]> {
1090b57cec5SDimitry Andric  let Latency = 7;          // FP div takes fixed #cycles
110*5f757f3fSDimitry Andric  let ReleaseAtCycles = [7]; // is not pipelined
1110b57cec5SDimitry Andric}
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andricdef : WriteRes<WriteFPDIV64, [R52UnitDiv]> {
1140b57cec5SDimitry Andric  let Latency = 17;
115*5f757f3fSDimitry Andric  let ReleaseAtCycles = [17];
1160b57cec5SDimitry Andric}
1170b57cec5SDimitry Andric
1180b57cec5SDimitry Andricdef : WriteRes<WriteFPSQRT32, [R52UnitDiv]> { let Latency = 7; }
1190b57cec5SDimitry Andricdef : WriteRes<WriteFPSQRT64, [R52UnitDiv]> { let Latency = 17; }
1200b57cec5SDimitry Andric
1210b57cec5SDimitry Andric// Overriden via InstRW for this processor.
1220b57cec5SDimitry Andricdef : WriteRes<WriteVST1, []>;
1230b57cec5SDimitry Andricdef : WriteRes<WriteVST2, []>;
1240b57cec5SDimitry Andricdef : WriteRes<WriteVST3, []>;
1250b57cec5SDimitry Andricdef : WriteRes<WriteVST4, []>;
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andricdef : ReadAdvance<ReadFPMUL, 1>; // mul operand read in F1
1280b57cec5SDimitry Andricdef : ReadAdvance<ReadFPMAC, 1>; // fp-mac operand read in F1
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1310b57cec5SDimitry Andric// Subtarget-specific SchedReadWrites.
1320b57cec5SDimitry Andric
1330b57cec5SDimitry Andric// Forwarding information - based on when an operand is read
1340b57cec5SDimitry Andricdef : ReadAdvance<R52Read_ISS, 0>;
1350b57cec5SDimitry Andricdef : ReadAdvance<R52Read_EX1, 1>;
1360b57cec5SDimitry Andricdef : ReadAdvance<R52Read_EX2, 2>;
1370b57cec5SDimitry Andricdef : ReadAdvance<R52Read_F0, 0>;
1380b57cec5SDimitry Andricdef : ReadAdvance<R52Read_F1, 1>;
1390b57cec5SDimitry Andricdef : ReadAdvance<R52Read_F2, 2>;
1400b57cec5SDimitry Andric
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric// Cortex-R52 specific SchedWrites for use with InstRW
1430b57cec5SDimitry Andricdef R52WriteMAC        : SchedWriteRes<[R52UnitMAC]> { let Latency = 4; }
1440b57cec5SDimitry Andricdef R52WriteMACHi      : SchedWriteRes<[R52UnitMAC]> {
1450b57cec5SDimitry Andric  let Latency = 4; let NumMicroOps = 0;
1460b57cec5SDimitry Andric}
1470b57cec5SDimitry Andricdef R52WriteDIV        : SchedWriteRes<[R52UnitDiv]> {
148*5f757f3fSDimitry Andric  let Latency = 8; let ReleaseAtCycles = [8]; // not pipelined
1490b57cec5SDimitry Andric}
1500b57cec5SDimitry Andricdef R52WriteLd         : SchedWriteRes<[R52UnitLd]> { let Latency = 4; }
1510b57cec5SDimitry Andricdef R52WriteST         : SchedWriteRes<[R52UnitLd]> { let Latency = 4; }
1520b57cec5SDimitry Andricdef R52WriteAdr        : SchedWriteRes<[]> { let Latency = 0; }
1530b57cec5SDimitry Andricdef R52WriteCC         : SchedWriteRes<[]> { let Latency = 0; }
1540b57cec5SDimitry Andricdef R52WriteALU_EX1    : SchedWriteRes<[R52UnitALU]> { let Latency = 2; }
1550b57cec5SDimitry Andricdef R52WriteALU_EX2    : SchedWriteRes<[R52UnitALU]> { let Latency = 3; }
1560b57cec5SDimitry Andricdef R52WriteALU_WRI    : SchedWriteRes<[R52UnitALU]> { let Latency = 4; }
1570b57cec5SDimitry Andric
1580b57cec5SDimitry Andricdef R52WriteNoRSRC_EX2 : SchedWriteRes<[]> { let Latency = 3; }
1590b57cec5SDimitry Andricdef R52WriteNoRSRC_WRI : SchedWriteRes<[]> { let Latency = 4; }
1600b57cec5SDimitry Andric
1610b57cec5SDimitry Andric// Alias generics to sub-target specific
1620b57cec5SDimitry Andricdef : SchedAlias<WriteMUL16, R52WriteMAC>;
1630b57cec5SDimitry Andricdef : SchedAlias<WriteMUL32, R52WriteMAC>;
1640b57cec5SDimitry Andricdef : SchedAlias<WriteMUL64Lo, R52WriteMAC>;
1650b57cec5SDimitry Andricdef : SchedAlias<WriteMUL64Hi, R52WriteMACHi>;
1660b57cec5SDimitry Andricdef : SchedAlias<WriteMAC16, R52WriteMAC>;
1670b57cec5SDimitry Andricdef : SchedAlias<WriteMAC32, R52WriteMAC>;
1680b57cec5SDimitry Andricdef : SchedAlias<WriteMAC64Lo, R52WriteMAC>;
1690b57cec5SDimitry Andricdef : SchedAlias<WriteMAC64Hi, R52WriteMACHi>;
1700b57cec5SDimitry Andricdef : SchedAlias<WritePreLd, R52WriteLd>;
1710b57cec5SDimitry Andricdef : SchedAlias<WriteLd, R52WriteLd>;
1720b57cec5SDimitry Andricdef : SchedAlias<WriteST, R52WriteST>;
1730b57cec5SDimitry Andric
1740b57cec5SDimitry Andricdef R52WriteFPALU_F3   : SchedWriteRes<[R52UnitFPALU]> { let Latency = 4; }
1750b57cec5SDimitry Andricdef R52Write2FPALU_F3  : SchedWriteRes<[R52UnitFPALU, R52UnitFPALU]> {
1760b57cec5SDimitry Andric  let Latency = 4;
1770b57cec5SDimitry Andric}
1780b57cec5SDimitry Andricdef R52WriteFPALU_F4   : SchedWriteRes<[R52UnitFPALU]> { let Latency = 5; }
1790b57cec5SDimitry Andricdef R52Write2FPALU_F4  : SchedWriteRes<[R52UnitFPALU, R52UnitFPALU]> {
1800b57cec5SDimitry Andric  let Latency = 5;
1810b57cec5SDimitry Andric}
1820b57cec5SDimitry Andricdef R52WriteFPALU_F5   : SchedWriteRes<[R52UnitFPALU]> { let Latency = 6; }
1830b57cec5SDimitry Andricdef R52Write2FPALU_F5  : SchedWriteRes<[R52UnitFPALU, R52UnitFPALU]> {
1840b57cec5SDimitry Andric  let Latency = 6;
1850b57cec5SDimitry Andric}
1860b57cec5SDimitry Andricdef R52WriteFPMUL_F5   : SchedWriteRes<[R52UnitFPMUL]> { let Latency = 6; }
1870b57cec5SDimitry Andricdef R52Write2FPMUL_F5  : SchedWriteRes<[R52UnitFPMUL, R52UnitFPMUL]> {
1880b57cec5SDimitry Andric  let Latency = 6;
1890b57cec5SDimitry Andric}
1900b57cec5SDimitry Andricdef R52WriteFPMAC_F5   : SchedWriteRes<[R52UnitFPMUL, R52UnitFPALU]> {
1910b57cec5SDimitry Andric  let Latency = 11;     // as it is internally two insns (MUL then ADD)
1920b57cec5SDimitry Andric}
1930b57cec5SDimitry Andricdef R52Write2FPMAC_F5  : SchedWriteRes<[R52UnitFPMUL, R52UnitFPMUL,
1940b57cec5SDimitry Andric                                         R52UnitFPALU, R52UnitFPALU]> {
1950b57cec5SDimitry Andric  let Latency = 11;
1960b57cec5SDimitry Andric}
1970b57cec5SDimitry Andric
1980b57cec5SDimitry Andricdef R52WriteFPLd_F4    : SchedWriteRes<[R52UnitLd]> { let Latency = 5; }
1990b57cec5SDimitry Andricdef R52WriteFPST_F4    : SchedWriteRes<[R52UnitLd]> { let Latency = 5; }
2000b57cec5SDimitry Andric
2010b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2020b57cec5SDimitry Andric// Floating-point. Map target defined SchedReadWrites to processor specific ones
2030b57cec5SDimitry Andric//
2040b57cec5SDimitry Andricdef : SchedAlias<WriteFPCVT,   R52WriteFPALU_F5>;
2050b57cec5SDimitry Andricdef : SchedAlias<WriteFPMOV, R52WriteFPALU_F3>;
2060b57cec5SDimitry Andricdef : SchedAlias<WriteFPALU32, R52WriteFPALU_F5>;
2070b57cec5SDimitry Andricdef : SchedAlias<WriteFPALU64, R52WriteFPALU_F5>;
2080b57cec5SDimitry Andric
2090b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2100b57cec5SDimitry Andric// Subtarget-specific overrides. Map opcodes to list of SchedReadWrites types.
2110b57cec5SDimitry Andric//
2120b57cec5SDimitry Andricdef : InstRW<[WriteALU], (instrs COPY)>;
2130b57cec5SDimitry Andric
2140b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX2, R52Read_EX1, R52Read_ISS],
2150b57cec5SDimitry Andric      (instregex "SXTB", "SXTH", "SXTB16", "UXTB", "UXTH", "UXTB16",
2160b57cec5SDimitry Andric      "t2SXTB", "t2SXTH", "t2SXTB16", "t2UXTB", "t2UXTH", "t2UXTB16")>;
2170b57cec5SDimitry Andric
2180b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX1, R52Read_ISS],
2190b57cec5SDimitry Andric      (instregex "MOVCCi32imm", "MOVi32imm", "t2MOVCCi", "t2MOVi")>;
2200b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX2, R52Read_EX1],
2210b57cec5SDimitry Andric      (instregex "MOV_ga_pcrel$")>;
2220b57cec5SDimitry Andricdef : InstRW<[R52WriteLd,R52Read_ISS],
2230b57cec5SDimitry Andric      (instregex "MOV_ga_pcrel_ldr")>;
2240b57cec5SDimitry Andric
2250b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX2, R52Read_EX1, R52Read_EX1], (instregex "SEL", "t2SEL")>;
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andricdef : InstRW< [R52WriteALU_EX2, R52Read_ISS, R52Read_ISS],
2280b57cec5SDimitry Andric      (instregex "BFC", "BFI", "UBFX", "SBFX", "(t|t2)BFC", "(t|t2)BFI",
2290b57cec5SDimitry Andric      "(t|t2)UBFX", "(t|t2)SBFX")>;
2300b57cec5SDimitry Andric
2310b57cec5SDimitry Andric// Saturating arithmetic
2320b57cec5SDimitry Andricdef : InstRW< [R52WriteALU_WRI, R52Read_EX1, R52Read_EX1],
2330b57cec5SDimitry Andric      (instregex "QADD", "QSUB", "QDADD", "QDSUB", "SSAT", "SSAT16", "USAT",
2340b57cec5SDimitry Andric      "QADD8", "QADD16", "QSUB8", "QSUB16", "QASX", "QSAX",
2350b57cec5SDimitry Andric      "UQADD8", "UQADD16","UQSUB8","UQSUB16","UQASX","UQSAX", "t2QADD",
2360b57cec5SDimitry Andric      "t2QSUB", "t2QDADD", "t2QDSUB", "t2SSAT", "t2SSAT16", "t2USAT",
2370b57cec5SDimitry Andric      "t2QADD8", "t2QADD16", "t2QSUB8", "t2QSUB16", "t2QASX", "t2QSAX",
2380b57cec5SDimitry Andric      "t2UQADD8", "t2UQADD16","t2UQSUB8","t2UQSUB16","t2UQASX","t2UQSAX","t2ABS")>;
2390b57cec5SDimitry Andric
2400b57cec5SDimitry Andric// Parallel arithmetic
2410b57cec5SDimitry Andricdef : InstRW< [R52WriteALU_EX2, R52Read_EX1, R52Read_EX1],
2420b57cec5SDimitry Andric      (instregex "SADD8", "SADD16", "SSUB8", "SSUB16", "SASX", "SSAX",
2430b57cec5SDimitry Andric      "UADD8", "UADD16", "USUB8", "USUB16", "UASX", "USAX", "t2SADD8",
2440b57cec5SDimitry Andric      "t2SADD16", "t2SSUB8", "t2SSUB16", "t2SASX", "t2SSAX", "t2UADD8",
2450b57cec5SDimitry Andric      "t2UADD16", "t2USUB8", "t2USUB16", "t2UASX", "t2USAX")>;
2460b57cec5SDimitry Andric
2470b57cec5SDimitry Andric// Flag setting.
2480b57cec5SDimitry Andricdef : InstRW< [R52WriteALU_EX2, R52Read_EX1, R52Read_EX1],
2490b57cec5SDimitry Andric      (instregex "SHADD8", "SHADD16", "SHSUB8", "SHSUB16", "SHASX", "SHSAX",
2500b57cec5SDimitry Andric      "SXTAB", "SXTAB16", "SXTAH", "UHADD8", "UHADD16", "UHSUB8", "UHSUB16",
2510b57cec5SDimitry Andric      "UHASX", "UHSAX", "UXTAB", "UXTAB16", "UXTAH", "t2SHADD8", "t2SHADD16",
2520b57cec5SDimitry Andric      "t2SHSUB8", "t2SHSUB16", "t2SHASX", "t2SHSAX", "t2SXTAB", "t2SXTAB16",
2530b57cec5SDimitry Andric      "t2SXTAH", "t2UHADD8", "t2UHADD16", "t2UHSUB8", "t2UHSUB16", "t2UHASX",
2540b57cec5SDimitry Andric      "t2UHSAX", "t2UXTAB", "t2UXTAB16", "t2UXTAH")>;
2550b57cec5SDimitry Andric
2560b57cec5SDimitry Andric// Sum of Absolute Difference
2570b57cec5SDimitry Andricdef : InstRW< [R52WriteALU_WRI, R52Read_ISS, R52Read_ISS, R52Read_ISS],
2580b57cec5SDimitry Andric      (instregex "USAD8", "t2USAD8", "USADA8", "t2USADA8") >;
2590b57cec5SDimitry Andric
2600b57cec5SDimitry Andric// Integer Multiply
2610b57cec5SDimitry Andricdef : InstRW<[R52WriteMAC, R52Read_ISS, R52Read_ISS],
2620b57cec5SDimitry Andric      (instregex "MUL", "SMMUL", "SMMULR", "SMULBB", "SMULBT",
2630b57cec5SDimitry Andric      "SMULTB", "SMULTT", "SMULWB", "SMULWT", "SMUSD", "SMUSDX", "t2MUL",
2640b57cec5SDimitry Andric      "t2SMMUL", "t2SMMULR", "t2SMULBB", "t2SMULBT", "t2SMULTB", "t2SMULTT",
2650b57cec5SDimitry Andric      "t2SMULWB", "t2SMULWT", "t2SMUSD")>;
2660b57cec5SDimitry Andric
2670b57cec5SDimitry Andric// Multiply Accumulate
2680b57cec5SDimitry Andric// Even for 64-bit accumulation (or Long), the single MAC is used (not ALUs).
2690b57cec5SDimitry Andric// The store pipeline is used partly for 64-bit operations.
2700b57cec5SDimitry Andricdef : InstRW<[R52WriteMAC, R52Read_ISS, R52Read_ISS, R52Read_ISS],
2710b57cec5SDimitry Andric      (instregex "MLA", "MLS", "SMMLA", "SMMLAR", "SMMLS", "SMMLSR",
2720b57cec5SDimitry Andric      "t2MLA", "t2MLS", "t2SMMLA", "t2SMMLAR", "t2SMMLS", "t2SMMLSR",
2730b57cec5SDimitry Andric      "SMUAD", "SMUADX", "t2SMUAD", "t2SMUADX",
2740b57cec5SDimitry Andric      "SMLABB", "SMLABT", "SMLATB", "SMLATT", "SMLSD", "SMLSDX",
2750b57cec5SDimitry Andric      "SMLAWB", "SMLAWT", "t2SMLABB", "t2SMLABT", "t2SMLATB", "t2SMLATT",
2760b57cec5SDimitry Andric      "t2SMLSD", "t2SMLSDX", "t2SMLAWB", "t2SMLAWT",
2770b57cec5SDimitry Andric      "SMLAD", "SMLADX", "t2SMLAD", "t2SMLADX",
2780b57cec5SDimitry Andric      "SMULL$", "UMULL$", "t2SMULL$", "t2UMULL$",
2790b57cec5SDimitry Andric      "SMLAL", "UMLAL", "SMLALBT",
2800b57cec5SDimitry Andric      "SMLALTB", "SMLALTT", "SMLALD", "SMLALDX", "SMLSLD", "SMLSLDX",
2810b57cec5SDimitry Andric      "UMAAL", "t2SMLAL", "t2UMLAL",
2820b57cec5SDimitry Andric      "t2SMLALBT", "t2SMLALTB", "t2SMLALTT", "t2SMLALD", "t2SMLALDX",
2830b57cec5SDimitry Andric      "t2SMLSLD", "t2SMLSLDX", "t2UMAAL")>;
2840b57cec5SDimitry Andric
2850b57cec5SDimitry Andricdef : InstRW <[R52WriteDIV, R52Read_ISS, R52Read_ISS],
2860b57cec5SDimitry Andric      (instregex "t2SDIV", "t2UDIV")>;
2870b57cec5SDimitry Andric
2880b57cec5SDimitry Andric// Loads (except POST) with SHL > 2, or ror, require 2 extra cycles.
2890b57cec5SDimitry Andric// However, that's non-trivial to specify, so we keep it uniform
2900b57cec5SDimitry Andricdef : InstRW<[R52WriteLd, R52Read_ISS, R52Read_ISS],
2910b57cec5SDimitry Andric      (instregex "LDR(i12|rs)$", "LDRB(i12|rs)$", "t2LDR(i8|i12|s|pci)",
2920b57cec5SDimitry Andric      "t2LDR(H|B)(i8|i12|s|pci)", "LDREX", "t2LDREX",
2930b57cec5SDimitry Andric      "tLDR[BH](r|i|spi|pci|pciASM)", "tLDR(r|i|spi|pci|pciASM)",
2940b57cec5SDimitry Andric      "LDRH$",  "PICLDR$", "PICLDR(H|B)$", "LDRcp$",
2950b57cec5SDimitry Andric      "PICLDRS(H|B)$", "t2LDRS(H|B)(i|r|p|s)", "LDRS(H|B)$",
2960b57cec5SDimitry Andric      "t2LDRpci_pic", "tLDRS(B|H)", "t2LDRDi8", "LDRD$", "LDA", "t2LDA")>;
2970b57cec5SDimitry Andricdef : InstRW<[R52WriteLd, R52WriteAdr, R52Read_ISS, R52Read_ISS],
2980b57cec5SDimitry Andric      (instregex "LD(RB|R)(_|T_)(POST|PRE)_(IMM|REG)", "LDRH(_PRE|_POST)",
2990b57cec5SDimitry Andric      "LDRBT_POST$", "LDR(T|BT)_POST_(REG|IMM)", "LDRHT(i|r)",
3000b57cec5SDimitry Andric      "t2LD(R|RB|RH)_(PRE|POST)", "t2LD(R|RB|RH)T",
3010b57cec5SDimitry Andric      "LDR(SH|SB)(_POST|_PRE)", "t2LDR(SH|SB)(_POST|_PRE)",
3020b57cec5SDimitry Andric      "LDRS(B|H)T(i|r)", "t2LDRS(B|H)T(i|r)?",
3030b57cec5SDimitry Andric      "LDRD_(POST|PRE)", "t2LDRD_(POST|PRE)")>;
3040b57cec5SDimitry Andric
3050b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX2, R52Read_EX1], (instregex "MOVS?sr", "t2MOVS?sr")>;
3060b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_WRI, R52Read_EX2], (instregex "MOVT", "t2MOVT")>;
3070b57cec5SDimitry Andric
3080b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX2, R52Read_EX1], (instregex "AD(C|D)S?ri", "ANDS?ri",
3090b57cec5SDimitry Andric      "BICS?ri", "CLZ", "EORri", "MVNS?r", "ORRri", "RSBS?ri", "RSCri", "SBCri",
3100b57cec5SDimitry Andric      "t2AD(C|D)S?ri", "t2ANDS?ri", "t2BICS?ri","t2CLZ", "t2EORri", "t2MVN",
3110b57cec5SDimitry Andric      "t2ORRri", "t2RSBS?ri", "t2SBCri")>;
3120b57cec5SDimitry Andric
3130b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX2, R52Read_EX1, R52Read_EX1], (instregex "AD(C|D)S?rr",
3140b57cec5SDimitry Andric      "ANDS?rr", "BICS?rr", "CRC", "EORrr", "ORRrr", "RSBrr", "RSCrr", "SBCrr",
3150b57cec5SDimitry Andric      "t2AD(C|D)S?rr", "t2ANDS?rr", "t2BICS?rr", "t2CRC", "t2EORrr", "t2SBCrr")>;
3160b57cec5SDimitry Andric
3170b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX2, R52Read_EX1, R52Read_ISS], (instregex "AD(C|D)S?rsi",
3180b57cec5SDimitry Andric      "ANDS?rsi", "BICS?rsi", "EORrsi", "ORRrsi", "RSBrsi", "RSCrsi", "SBCrsi",
3190b57cec5SDimitry Andric      "t2AD(C|D)S?rs", "t2ANDS?rs", "t2BICS?rs", "t2EORrs", "t2ORRrs", "t2RSBrs", "t2SBCrs")>;
3200b57cec5SDimitry Andric
3210b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX2, R52Read_EX1, R52Read_ISS, R52Read_ISS],
3220b57cec5SDimitry Andric      (instregex "AD(C|D)S?rsr", "ANDS?rsr", "BICS?rsr", "EORrsr", "MVNS?sr",
3230b57cec5SDimitry Andric      "ORRrsr", "RSBrsr", "RSCrsr", "SBCrsr")>;
3240b57cec5SDimitry Andric
3250b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX1],
3260b57cec5SDimitry Andric    (instregex "ADR", "MOVsi", "MVNS?s?i", "t2MOVS?si")>;
3270b57cec5SDimitry Andric
3280b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX1, R52Read_ISS], (instregex "ASRi", "RORS?i")>;
3290b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX1, R52Read_ISS, R52Read_ISS],
3300b57cec5SDimitry Andric      (instregex "ASRr", "RORS?r", "LSR", "LSL")>;
3310b57cec5SDimitry Andric
3320b57cec5SDimitry Andricdef : InstRW<[R52WriteCC, R52Read_EX1], (instregex "CMPri", "CMNri")>;
3330b57cec5SDimitry Andricdef : InstRW<[R52WriteCC, R52Read_EX1, R52Read_EX1], (instregex "CMPrr", "CMNzrr")>;
3340b57cec5SDimitry Andricdef : InstRW<[R52WriteCC, R52Read_EX1, R52Read_ISS], (instregex "CMPrsi", "CMNzrsi")>;
3350b57cec5SDimitry Andricdef : InstRW<[R52WriteCC, R52Read_EX1, R52Read_ISS, R52Read_ISS], (instregex "CMPrsr", "CMNzrsr")>;
3360b57cec5SDimitry Andric
3370b57cec5SDimitry Andricdef : InstRW<[R52WriteALU_EX2, R52Read_ISS],
3380b57cec5SDimitry Andric      (instregex "t2LDC", "RBIT", "REV", "REV16", "REVSH", "RRX")>;
3390b57cec5SDimitry Andric
3400b57cec5SDimitry Andricdef : InstRW<[R52WriteCC, R52Read_ISS], (instregex "TST")>;
3410b57cec5SDimitry Andric
3420b57cec5SDimitry Andricdef : InstRW<[R52WriteLd], (instregex "MRS", "MRSbanked")>;
3430b57cec5SDimitry Andricdef : InstRW<[R52WriteLd, R52Read_EX1], (instregex "MSR", "MSRbanked")>;
3440b57cec5SDimitry Andric
3450b57cec5SDimitry Andric// Integer Load, Multiple.
3460b57cec5SDimitry Andricforeach Lat = 3-25 in {
3470b57cec5SDimitry Andric  def R52WriteILDM#Lat#Cy : SchedWriteRes<[R52UnitLd]> {
3480b57cec5SDimitry Andric    let Latency = Lat;
3490b57cec5SDimitry Andric  }
3500b57cec5SDimitry Andric  def R52WriteILDM#Lat#CyNo : SchedWriteRes<[]> {
3510b57cec5SDimitry Andric    let Latency = Lat;
3520b57cec5SDimitry Andric    let NumMicroOps = 0;
3530b57cec5SDimitry Andric  }
3540b57cec5SDimitry Andric}
3550b57cec5SDimitry Andricforeach NAddr = 1-16 in {
3560b57cec5SDimitry Andric  def R52ILDMAddr#NAddr#Pred : SchedPredicate<"TII->getNumLDMAddresses(*MI) == "#NAddr>;
3570b57cec5SDimitry Andric}
3580b57cec5SDimitry Andricdef R52WriteILDMAddrNoWB : SchedWriteRes<[R52UnitLd]> { let Latency = 0; }
3590b57cec5SDimitry Andricdef R52WriteILDMAddrWB : SchedWriteRes<[R52UnitLd]>;
3600b57cec5SDimitry Andricdef R52WriteILDM : SchedWriteVariant<[
3610b57cec5SDimitry Andric    SchedVar<R52ILDMAddr2Pred, [R52WriteILDM4Cy, R52WriteILDM5Cy]>,
3620b57cec5SDimitry Andric
3630b57cec5SDimitry Andric    SchedVar<R52ILDMAddr3Pred, [R52WriteILDM4Cy, R52WriteILDM5Cy,
3640b57cec5SDimitry Andric                                 R52WriteILDM6Cy]>,
3650b57cec5SDimitry Andric    SchedVar<R52ILDMAddr4Pred, [R52WriteILDM4Cy, R52WriteILDM5Cy,
3660b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy]>,
3670b57cec5SDimitry Andric
3680b57cec5SDimitry Andric    SchedVar<R52ILDMAddr5Pred, [R52WriteILDM4Cy, R52WriteILDM5Cy,
3690b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
3700b57cec5SDimitry Andric                                 R52WriteILDM8Cy]>,
3710b57cec5SDimitry Andric    SchedVar<R52ILDMAddr6Pred, [R52WriteILDM4Cy, R52WriteILDM5Cy,
3720b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
3730b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy]>,
3740b57cec5SDimitry Andric
3750b57cec5SDimitry Andric    SchedVar<R52ILDMAddr7Pred, [R52WriteILDM4Cy, R52WriteILDM5Cy,
3760b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
3770b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy,
3780b57cec5SDimitry Andric                                 R52WriteILDM10Cy]>,
3790b57cec5SDimitry Andric    SchedVar<R52ILDMAddr8Pred, [R52WriteILDM4Cy, R52WriteILDM5Cy,
3800b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
3810b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy,
3820b57cec5SDimitry Andric                                 R52WriteILDM10Cy, R52WriteILDM11Cy]>,
3830b57cec5SDimitry Andric
3840b57cec5SDimitry Andric    SchedVar<R52ILDMAddr9Pred, [R52WriteILDM4Cy, R52WriteILDM5Cy,
3850b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
3860b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy,
3870b57cec5SDimitry Andric                                 R52WriteILDM10Cy, R52WriteILDM11Cy,
3880b57cec5SDimitry Andric                                 R52WriteILDM12Cy]>,
3890b57cec5SDimitry Andric    SchedVar<R52ILDMAddr10Pred,[R52WriteILDM4Cy, R52WriteILDM5Cy,
3900b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
3910b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy,
3920b57cec5SDimitry Andric                                 R52WriteILDM10Cy, R52WriteILDM11Cy,
3930b57cec5SDimitry Andric                                 R52WriteILDM12Cy, R52WriteILDM13Cy]>,
3940b57cec5SDimitry Andric
3950b57cec5SDimitry Andric    SchedVar<R52ILDMAddr11Pred,[R52WriteILDM4Cy, R52WriteILDM5Cy,
3960b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
3970b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy,
3980b57cec5SDimitry Andric                                 R52WriteILDM10Cy, R52WriteILDM11Cy,
3990b57cec5SDimitry Andric                                 R52WriteILDM12Cy, R52WriteILDM13Cy,
4000b57cec5SDimitry Andric                                 R52WriteILDM14Cy]>,
4010b57cec5SDimitry Andric    SchedVar<R52ILDMAddr12Pred,[R52WriteILDM4Cy, R52WriteILDM5Cy,
4020b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
4030b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy,
4040b57cec5SDimitry Andric                                 R52WriteILDM10Cy, R52WriteILDM11Cy,
4050b57cec5SDimitry Andric                                 R52WriteILDM12Cy, R52WriteILDM13Cy,
4060b57cec5SDimitry Andric                                 R52WriteILDM14Cy, R52WriteILDM15Cy]>,
4070b57cec5SDimitry Andric
4080b57cec5SDimitry Andric    SchedVar<R52ILDMAddr13Pred,[R52WriteILDM4Cy, R52WriteILDM5Cy,
4090b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
4100b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy,
4110b57cec5SDimitry Andric                                 R52WriteILDM10Cy, R52WriteILDM11Cy,
4120b57cec5SDimitry Andric                                 R52WriteILDM12Cy, R52WriteILDM13Cy,
4130b57cec5SDimitry Andric                                 R52WriteILDM14Cy, R52WriteILDM15Cy,
4140b57cec5SDimitry Andric                                 R52WriteILDM16Cy]>,
4150b57cec5SDimitry Andric    SchedVar<R52ILDMAddr14Pred,[R52WriteILDM4Cy, R52WriteILDM5Cy,
4160b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
4170b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy,
4180b57cec5SDimitry Andric                                 R52WriteILDM10Cy, R52WriteILDM11Cy,
4190b57cec5SDimitry Andric                                 R52WriteILDM12Cy, R52WriteILDM13Cy,
4200b57cec5SDimitry Andric                                 R52WriteILDM14Cy, R52WriteILDM15Cy,
4210b57cec5SDimitry Andric                                 R52WriteILDM16Cy, R52WriteILDM17Cy]>,
4220b57cec5SDimitry Andric
4230b57cec5SDimitry Andric    SchedVar<R52ILDMAddr15Pred,[R52WriteILDM4Cy, R52WriteILDM5Cy,
4240b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
4250b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy,
4260b57cec5SDimitry Andric                                 R52WriteILDM10Cy, R52WriteILDM11Cy,
4270b57cec5SDimitry Andric                                 R52WriteILDM12Cy, R52WriteILDM13Cy,
4280b57cec5SDimitry Andric                                 R52WriteILDM14Cy, R52WriteILDM15Cy,
4290b57cec5SDimitry Andric                                 R52WriteILDM16Cy, R52WriteILDM17Cy,
4300b57cec5SDimitry Andric                                 R52WriteILDM18Cy]>,
4310b57cec5SDimitry Andric    SchedVar<R52ILDMAddr15Pred,[R52WriteILDM4Cy, R52WriteILDM5Cy,
4320b57cec5SDimitry Andric                                 R52WriteILDM6Cy, R52WriteILDM7Cy,
4330b57cec5SDimitry Andric                                 R52WriteILDM8Cy, R52WriteILDM9Cy,
4340b57cec5SDimitry Andric                                 R52WriteILDM10Cy, R52WriteILDM11Cy,
4350b57cec5SDimitry Andric                                 R52WriteILDM12Cy, R52WriteILDM13Cy,
4360b57cec5SDimitry Andric                                 R52WriteILDM14Cy, R52WriteILDM15Cy,
4370b57cec5SDimitry Andric                                 R52WriteILDM16Cy, R52WriteILDM17Cy,
4380b57cec5SDimitry Andric                                 R52WriteILDM18Cy, R52WriteILDM19Cy]>,
4390b57cec5SDimitry Andric
4400b57cec5SDimitry Andric// Unknown number of registers, just use resources for two registers.
4410b57cec5SDimitry Andric    SchedVar<NoSchedPred,      [R52WriteILDM4Cy, R52WriteILDM5Cy,
4420b57cec5SDimitry Andric                                R52WriteILDM6CyNo, R52WriteILDM7CyNo,
4430b57cec5SDimitry Andric                                R52WriteILDM8CyNo, R52WriteILDM9CyNo,
4440b57cec5SDimitry Andric                                R52WriteILDM10CyNo, R52WriteILDM11CyNo,
4450b57cec5SDimitry Andric                                R52WriteILDM12CyNo, R52WriteILDM13CyNo,
4460b57cec5SDimitry Andric                                R52WriteILDM14CyNo, R52WriteILDM15CyNo,
4470b57cec5SDimitry Andric                                R52WriteILDM16CyNo, R52WriteILDM17CyNo,
4480b57cec5SDimitry Andric                                R52WriteILDM18Cy, R52WriteILDM19Cy]>
4490b57cec5SDimitry Andric]> { let Variadic=1; }
4500b57cec5SDimitry Andric
4510b57cec5SDimitry Andric// Integer Store, Multiple
4520b57cec5SDimitry Andricdef R52WriteIStIncAddr : SchedWriteRes<[R52UnitLd]> {
4530b57cec5SDimitry Andric  let Latency = 4;
4540b57cec5SDimitry Andric  let NumMicroOps = 2;
4550b57cec5SDimitry Andric}
4560b57cec5SDimitry Andricforeach NumAddr = 1-16 in {
4570b57cec5SDimitry Andric  def R52WriteISTM#NumAddr : WriteSequence<[R52WriteIStIncAddr], NumAddr>;
4580b57cec5SDimitry Andric}
4590b57cec5SDimitry Andricdef R52WriteISTM : SchedWriteVariant<[
4600b57cec5SDimitry Andric    SchedVar<R52ILDMAddr2Pred, [R52WriteISTM2]>,
4610b57cec5SDimitry Andric    SchedVar<R52ILDMAddr3Pred, [R52WriteISTM3]>,
4620b57cec5SDimitry Andric    SchedVar<R52ILDMAddr4Pred, [R52WriteISTM4]>,
4630b57cec5SDimitry Andric    SchedVar<R52ILDMAddr5Pred, [R52WriteISTM5]>,
4640b57cec5SDimitry Andric    SchedVar<R52ILDMAddr6Pred, [R52WriteISTM6]>,
4650b57cec5SDimitry Andric    SchedVar<R52ILDMAddr7Pred, [R52WriteISTM7]>,
4660b57cec5SDimitry Andric    SchedVar<R52ILDMAddr8Pred, [R52WriteISTM8]>,
4670b57cec5SDimitry Andric    SchedVar<R52ILDMAddr9Pred, [R52WriteISTM9]>,
4680b57cec5SDimitry Andric    SchedVar<R52ILDMAddr10Pred,[R52WriteISTM10]>,
4690b57cec5SDimitry Andric    SchedVar<R52ILDMAddr11Pred,[R52WriteISTM11]>,
4700b57cec5SDimitry Andric    SchedVar<R52ILDMAddr12Pred,[R52WriteISTM12]>,
4710b57cec5SDimitry Andric    SchedVar<R52ILDMAddr13Pred,[R52WriteISTM13]>,
4720b57cec5SDimitry Andric    SchedVar<R52ILDMAddr14Pred,[R52WriteISTM14]>,
4730b57cec5SDimitry Andric    SchedVar<R52ILDMAddr15Pred,[R52WriteISTM15]>,
4740b57cec5SDimitry Andric    SchedVar<R52ILDMAddr16Pred,[R52WriteISTM16]>,
4750b57cec5SDimitry Andric    // Unknow number of registers, just use resources for two registers.
4760b57cec5SDimitry Andric    SchedVar<NoSchedPred,      [R52WriteISTM2]>
4770b57cec5SDimitry Andric]>;
4780b57cec5SDimitry Andric
4790b57cec5SDimitry Andricdef : InstRW<[R52WriteILDM, R52Read_ISS],
4800b57cec5SDimitry Andric      (instregex "LDM(IA|DA|DB|IB)$", "t2LDM(IA|DA|DB|IB)$",
4810b57cec5SDimitry Andric      "(t|sys)LDM(IA|DA|DB|IB)$")>;
4820b57cec5SDimitry Andricdef : InstRW<[R52WriteILDM, R52WriteAdr, R52Read_ISS],
4830b57cec5SDimitry Andric      (instregex "LDM(IA|DA|DB|IB)_UPD", "(t2|sys|t)LDM(IA|DA|DB|IB)_UPD")>;
4840b57cec5SDimitry Andricdef : InstRW<[R52WriteILDM, R52WriteAdr, R52Read_ISS],
4850b57cec5SDimitry Andric        (instregex "LDMIA_RET", "(t|t2)LDMIA_RET", "tPOP")>;
4860b57cec5SDimitry Andric
4870b57cec5SDimitry Andric// Integer Store, Single Element
4880b57cec5SDimitry Andricdef : InstRW<[R52WriteLd, R52Read_ISS, R52Read_EX2],
4890b57cec5SDimitry Andric      (instregex "PICSTR", "STR(i12|rs)", "STRB(i12|rs)", "STRH$", "STREX", "SRS", "t2SRS",
4900b57cec5SDimitry Andric      "t2SRSDB", "t2STREX", "t2STREXB", "t2STREXD", "t2STREXH", "t2STR(i12|i8|s)$",
4910b57cec5SDimitry Andric      "RFE", "t2RFE", "t2STR[BH](i12|i8|s)$", "tSTR[BH](i|r)", "tSTR(i|r)", "tSTRspi")>;
4920b57cec5SDimitry Andric
4930b57cec5SDimitry Andricdef : InstRW<[R52WriteLd, R52WriteAdr, R52Read_ISS, R52Read_EX2],
4940b57cec5SDimitry Andric      (instregex "STR(B_|_|BT_|T_)(PRE_IMM|PRE_REG|POST_REG|POST_IMM)",
4950b57cec5SDimitry Andric      "STR(i|r)_preidx", "STRB(i|r)_preidx", "STRH_preidx", "STR(H_|HT_)(PRE|POST)",
4960b57cec5SDimitry Andric      "STR(BT|HT|T)", "t2STR_(PRE|POST)", "t2STR[BH]_(PRE|POST)",
4970b57cec5SDimitry Andric      "t2STR_preidx", "t2STR[BH]_preidx", "t2ST(RB|RH|R)T")>;
4980b57cec5SDimitry Andric
4990b57cec5SDimitry Andric// Integer Store, Dual
5000b57cec5SDimitry Andricdef : InstRW<[R52WriteLd, R52Read_ISS, R52Read_EX2],
5010b57cec5SDimitry Andric    (instregex "STRD$", "t2STRDi8", "STL", "t2STL")>;
5020b57cec5SDimitry Andricdef : InstRW<[R52WriteLd, R52WriteAdr, R52Read_ISS, R52Read_EX2],
5030b57cec5SDimitry Andric    (instregex "(t2|t)STRD_(POST|PRE)", "STRD_(POST|PRE)")>;
5040b57cec5SDimitry Andric
5050b57cec5SDimitry Andricdef : InstRW<[R52WriteISTM, R52Read_ISS, R52Read_EX2],
5060b57cec5SDimitry Andric    (instregex "STM(IB|IA|DB|DA)$", "(t2|sys|t)STM(IB|IA|DB|DA)$")>;
5070b57cec5SDimitry Andricdef : InstRW<[R52WriteISTM, R52WriteAdr, R52Read_ISS, R52Read_EX2],
5080b57cec5SDimitry Andric    (instregex "STM(IB|IA|DB|DA)_UPD", "(t2|sys|t)STM(IB|IA|DB|DA)_UPD",
5090b57cec5SDimitry Andric    "tPUSH")>;
5100b57cec5SDimitry Andric
5110b57cec5SDimitry Andric// LDRLIT pseudo instructions, they expand to LDR + PICADD
5120b57cec5SDimitry Andricdef : InstRW<[R52WriteLd],
5130b57cec5SDimitry Andric      (instregex "t?LDRLIT_ga_abs", "t?LDRLIT_ga_pcrel$")>;
5140b57cec5SDimitry Andric// LDRLIT_ga_pcrel_ldr expands to LDR + PICLDR
5150b57cec5SDimitry Andricdef : InstRW<[R52WriteLd], (instregex "LDRLIT_ga_pcrel_ldr")>;
5160b57cec5SDimitry Andric
5170b57cec5SDimitry Andric
5180b57cec5SDimitry Andric
5190b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
5200b57cec5SDimitry Andric// VFP, Floating Point Support
5210b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F5, R52Read_F1, R52Read_F1], (instregex "VABD(fd|hd)")>;
5220b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F5, R52Read_F1, R52Read_F1], (instregex "VABD(fq|hq)")>;
5230b57cec5SDimitry Andric
5240b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F5, R52Read_F1], (instregex "VABS(D|S|H)")>;
5250b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F5, R52Read_F1], (instregex "VABS(fd|hd)")>;
5260b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F5, R52Read_F1], (instregex "VABS(fq|hq)")>;
5270b57cec5SDimitry Andric
5280b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F3, R52Read_F1, R52Read_F1], (instregex "(VACGE|VACGT)(fd|hd)")>;
5290b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F3, R52Read_F1, R52Read_F1], (instregex "(VACGE|VACGT)(fq|hq)")>;
5300b57cec5SDimitry Andric
5310b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F5, R52Read_F1, R52Read_F1], (instregex "(VADD|VSUB)(D|S|H|fd|hd)$")>;
5320b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F5, R52Read_F1, R52Read_F1], (instregex "(VADD|VSUB)(fq|hq)")>;
5330b57cec5SDimitry Andric
5340b57cec5SDimitry Andricdef : InstRW<[R52WriteFPLd_F4, R52Read_ISS, R52Read_F1], (instregex "VLDR")>;
5350b57cec5SDimitry Andricdef : InstRW<[R52WriteFPST_F4, R52Read_ISS, R52Read_F1], (instregex "VSTR")>;
5360b57cec5SDimitry Andric
5370b57cec5SDimitry Andric
5380b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
5390b57cec5SDimitry Andric// Neon Support
5400b57cec5SDimitry Andric
5410b57cec5SDimitry Andric// vector multiple load stores
5420b57cec5SDimitry Andricforeach NumAddr = 1-16 in {
5430b57cec5SDimitry Andric  def R52LMAddrPred#NumAddr :
5440b57cec5SDimitry Andric    SchedPredicate<"MI->getNumOperands() == "#NumAddr>;
5450b57cec5SDimitry Andric}
5460b57cec5SDimitry Andricforeach Lat = 1-32 in {
5470b57cec5SDimitry Andric  def R52WriteLM#Lat#Cy : SchedWriteRes<[]> {
5480b57cec5SDimitry Andric    let Latency = Lat;
5490b57cec5SDimitry Andric  }
5500b57cec5SDimitry Andric}
5510b57cec5SDimitry Andricforeach Num = 1-32 in { // reserve LdSt resource, no dual-issue
5520b57cec5SDimitry Andric  def R52ReserveLd#Num#Cy : SchedWriteRes<[R52UnitLd]> {
5530b57cec5SDimitry Andric    let Latency = 0;
5540b57cec5SDimitry Andric    let NumMicroOps = Num;
555*5f757f3fSDimitry Andric    let ReleaseAtCycles = [Num];
5560b57cec5SDimitry Andric  }
5570b57cec5SDimitry Andric}
5580b57cec5SDimitry Andricdef R52WriteVLDM : SchedWriteVariant<[
5590b57cec5SDimitry Andric  // 1 D reg
5600b57cec5SDimitry Andric  SchedVar<R52LMAddrPred1,  [R52WriteLM5Cy,
5610b57cec5SDimitry Andric                              R52ReserveLd5Cy]>,
5620b57cec5SDimitry Andric  SchedVar<R52LMAddrPred2,  [R52WriteLM5Cy,
5630b57cec5SDimitry Andric                              R52ReserveLd5Cy]>,
5640b57cec5SDimitry Andric
5650b57cec5SDimitry Andric  // 2 D reg
5660b57cec5SDimitry Andric  SchedVar<R52LMAddrPred3,  [R52WriteLM5Cy, R52WriteLM6Cy,
5670b57cec5SDimitry Andric                              R52ReserveLd6Cy]>,
5680b57cec5SDimitry Andric  SchedVar<R52LMAddrPred4,  [R52WriteLM5Cy, R52WriteLM6Cy,
5690b57cec5SDimitry Andric                              R52ReserveLd6Cy]>,
5700b57cec5SDimitry Andric
5710b57cec5SDimitry Andric  // 3 D reg
5720b57cec5SDimitry Andric  SchedVar<R52LMAddrPred5,  [R52WriteLM5Cy, R52WriteLM6Cy,
5730b57cec5SDimitry Andric                              R52WriteLM7Cy,
5740b57cec5SDimitry Andric                              R52ReserveLd4Cy]>,
5750b57cec5SDimitry Andric  SchedVar<R52LMAddrPred6,  [R52WriteLM5Cy, R52WriteLM6Cy,
5760b57cec5SDimitry Andric                              R52WriteLM7Cy,
5770b57cec5SDimitry Andric                              R52ReserveLd7Cy]>,
5780b57cec5SDimitry Andric
5790b57cec5SDimitry Andric  // 4 D reg
5800b57cec5SDimitry Andric  SchedVar<R52LMAddrPred7,  [R52WriteLM5Cy, R52WriteLM6Cy,
5810b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
5820b57cec5SDimitry Andric                              R52ReserveLd8Cy]>,
5830b57cec5SDimitry Andric  SchedVar<R52LMAddrPred8,  [R52WriteLM5Cy, R52WriteLM6Cy,
5840b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
5850b57cec5SDimitry Andric                              R52ReserveLd8Cy]>,
5860b57cec5SDimitry Andric
5870b57cec5SDimitry Andric  // 5 D reg
5880b57cec5SDimitry Andric  SchedVar<R52LMAddrPred9,  [R52WriteLM5Cy, R52WriteLM6Cy,
5890b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
5900b57cec5SDimitry Andric                              R52WriteLM9Cy,
5910b57cec5SDimitry Andric                              R52ReserveLd9Cy]>,
5920b57cec5SDimitry Andric  SchedVar<R52LMAddrPred10, [R52WriteLM5Cy, R52WriteLM6Cy,
5930b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
5940b57cec5SDimitry Andric                              R52WriteLM9Cy,
5950b57cec5SDimitry Andric                              R52ReserveLd9Cy]>,
5960b57cec5SDimitry Andric
5970b57cec5SDimitry Andric  // 6 D reg
5980b57cec5SDimitry Andric  SchedVar<R52LMAddrPred11, [R52WriteLM5Cy, R52WriteLM6Cy,
5990b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
6000b57cec5SDimitry Andric                              R52WriteLM9Cy, R52WriteLM10Cy,
6010b57cec5SDimitry Andric                              R52ReserveLd10Cy]>,
6020b57cec5SDimitry Andric  SchedVar<R52LMAddrPred12, [R52WriteLM5Cy, R52WriteLM6Cy,
6030b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
6040b57cec5SDimitry Andric                              R52WriteLM9Cy, R52WriteLM10Cy,
6050b57cec5SDimitry Andric                              R52ReserveLd10Cy]>,
6060b57cec5SDimitry Andric
6070b57cec5SDimitry Andric  // 7 D reg
6080b57cec5SDimitry Andric  SchedVar<R52LMAddrPred13, [R52WriteLM5Cy, R52WriteLM6Cy,
6090b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
6100b57cec5SDimitry Andric                              R52WriteLM9Cy, R52WriteLM10Cy,
6110b57cec5SDimitry Andric                              R52WriteLM11Cy,
6120b57cec5SDimitry Andric                              R52ReserveLd11Cy]>,
6130b57cec5SDimitry Andric  SchedVar<R52LMAddrPred14, [R52WriteLM5Cy, R52WriteLM6Cy,
6140b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
6150b57cec5SDimitry Andric                              R52WriteLM9Cy, R52WriteLM10Cy,
6160b57cec5SDimitry Andric                              R52WriteLM11Cy,
6170b57cec5SDimitry Andric                              R52ReserveLd11Cy]>,
6180b57cec5SDimitry Andric
6190b57cec5SDimitry Andric  // 8 D reg
6200b57cec5SDimitry Andric  SchedVar<R52LMAddrPred14, [R52WriteLM5Cy, R52WriteLM6Cy,
6210b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
6220b57cec5SDimitry Andric                              R52WriteLM9Cy, R52WriteLM10Cy,
6230b57cec5SDimitry Andric                              R52WriteLM11Cy, R52WriteLM12Cy,
6240b57cec5SDimitry Andric                              R52ReserveLd12Cy]>,
6250b57cec5SDimitry Andric  SchedVar<R52LMAddrPred15, [R52WriteLM5Cy, R52WriteLM6Cy,
6260b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
6270b57cec5SDimitry Andric                              R52WriteLM9Cy, R52WriteLM10Cy,
6280b57cec5SDimitry Andric                              R52WriteLM11Cy, R52WriteLM12Cy,
6290b57cec5SDimitry Andric                              R52ReserveLd12Cy]>,
6300b57cec5SDimitry Andric  // unknown number of reg.
6310b57cec5SDimitry Andric  SchedVar<NoSchedPred,      [R52WriteLM5Cy, R52WriteLM6Cy,
6320b57cec5SDimitry Andric                              R52WriteLM7Cy, R52WriteLM8Cy,
6330b57cec5SDimitry Andric                              R52WriteLM9Cy, R52WriteLM10Cy,
6340b57cec5SDimitry Andric                              R52WriteLM11Cy, R52WriteLM12Cy,
6350b57cec5SDimitry Andric                              R52ReserveLd5Cy]>
6360b57cec5SDimitry Andric]> { let Variadic=1;}
6370b57cec5SDimitry Andric
6380b57cec5SDimitry Andric// variable stores. Cannot dual-issue
6390b57cec5SDimitry Andricdef R52WriteSTM5  : SchedWriteRes<[R52UnitLd]> {
6400b57cec5SDimitry Andric  let Latency = 5;
6410b57cec5SDimitry Andric  let NumMicroOps = 2;
642*5f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
6430b57cec5SDimitry Andric}
6440b57cec5SDimitry Andricdef R52WriteSTM6  : SchedWriteRes<[R52UnitLd]> {
6450b57cec5SDimitry Andric  let Latency = 6;
6460b57cec5SDimitry Andric  let NumMicroOps = 4;
647*5f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
6480b57cec5SDimitry Andric}
6490b57cec5SDimitry Andricdef R52WriteSTM7  : SchedWriteRes<[R52UnitLd]> {
6500b57cec5SDimitry Andric  let Latency = 7;
6510b57cec5SDimitry Andric  let NumMicroOps = 6;
652*5f757f3fSDimitry Andric  let ReleaseAtCycles = [3];
6530b57cec5SDimitry Andric}
6540b57cec5SDimitry Andricdef R52WriteSTM8  : SchedWriteRes<[R52UnitLd]> {
6550b57cec5SDimitry Andric  let Latency = 8;
6560b57cec5SDimitry Andric  let NumMicroOps = 8;
657*5f757f3fSDimitry Andric  let ReleaseAtCycles = [4];
6580b57cec5SDimitry Andric}
6590b57cec5SDimitry Andricdef R52WriteSTM9  : SchedWriteRes<[R52UnitLd]> {
6600b57cec5SDimitry Andric  let Latency = 9;
6610b57cec5SDimitry Andric  let NumMicroOps = 10;
662*5f757f3fSDimitry Andric  let ReleaseAtCycles = [5];
6630b57cec5SDimitry Andric}
6640b57cec5SDimitry Andricdef R52WriteSTM10 : SchedWriteRes<[R52UnitLd]> {
6650b57cec5SDimitry Andric  let Latency = 10;
6660b57cec5SDimitry Andric  let NumMicroOps = 12;
667*5f757f3fSDimitry Andric  let ReleaseAtCycles = [6];
6680b57cec5SDimitry Andric}
6690b57cec5SDimitry Andricdef R52WriteSTM11 : SchedWriteRes<[R52UnitLd]> {
6700b57cec5SDimitry Andric  let Latency = 11;
6710b57cec5SDimitry Andric  let NumMicroOps = 14;
672*5f757f3fSDimitry Andric  let ReleaseAtCycles = [7];
6730b57cec5SDimitry Andric}
6740b57cec5SDimitry Andricdef R52WriteSTM12 : SchedWriteRes<[R52UnitLd]> {
6750b57cec5SDimitry Andric  let Latency = 12;
6760b57cec5SDimitry Andric  let NumMicroOps = 16;
677*5f757f3fSDimitry Andric  let ReleaseAtCycles = [8];
6780b57cec5SDimitry Andric}
6790b57cec5SDimitry Andricdef R52WriteSTM13 : SchedWriteRes<[R52UnitLd]> {
6800b57cec5SDimitry Andric  let Latency = 13;
6810b57cec5SDimitry Andric  let NumMicroOps = 18;
682*5f757f3fSDimitry Andric  let ReleaseAtCycles = [9];
6830b57cec5SDimitry Andric}
6840b57cec5SDimitry Andricdef R52WriteSTM14 : SchedWriteRes<[R52UnitLd]> {
6850b57cec5SDimitry Andric  let Latency = 14;
6860b57cec5SDimitry Andric  let NumMicroOps = 20;
687*5f757f3fSDimitry Andric  let ReleaseAtCycles = [10];
6880b57cec5SDimitry Andric}
6890b57cec5SDimitry Andricdef R52WriteSTM15 : SchedWriteRes<[R52UnitLd]> {
6900b57cec5SDimitry Andric  let Latency = 15;
6910b57cec5SDimitry Andric  let NumMicroOps = 22;
692*5f757f3fSDimitry Andric  let ReleaseAtCycles = [11];
6930b57cec5SDimitry Andric}
6940b57cec5SDimitry Andric
6950b57cec5SDimitry Andricdef R52WriteSTM : SchedWriteVariant<[
6960b57cec5SDimitry Andric  SchedVar<R52LMAddrPred1, [R52WriteSTM5]>,
6970b57cec5SDimitry Andric  SchedVar<R52LMAddrPred2, [R52WriteSTM5]>,
6980b57cec5SDimitry Andric  SchedVar<R52LMAddrPred3, [R52WriteSTM6]>,
6990b57cec5SDimitry Andric  SchedVar<R52LMAddrPred4, [R52WriteSTM6]>,
7000b57cec5SDimitry Andric  SchedVar<R52LMAddrPred5, [R52WriteSTM7]>,
7010b57cec5SDimitry Andric  SchedVar<R52LMAddrPred6, [R52WriteSTM7]>,
7020b57cec5SDimitry Andric  SchedVar<R52LMAddrPred7, [R52WriteSTM8]>,
7030b57cec5SDimitry Andric  SchedVar<R52LMAddrPred8, [R52WriteSTM8]>,
7040b57cec5SDimitry Andric  SchedVar<R52LMAddrPred9,  [R52WriteSTM9]>,
7050b57cec5SDimitry Andric  SchedVar<R52LMAddrPred10, [R52WriteSTM9]>,
7060b57cec5SDimitry Andric  SchedVar<R52LMAddrPred11, [R52WriteSTM10]>,
7070b57cec5SDimitry Andric  SchedVar<R52LMAddrPred12, [R52WriteSTM10]>,
7080b57cec5SDimitry Andric  SchedVar<R52LMAddrPred13, [R52WriteSTM11]>,
7090b57cec5SDimitry Andric  SchedVar<R52LMAddrPred14, [R52WriteSTM11]>,
7100b57cec5SDimitry Andric  SchedVar<R52LMAddrPred15, [R52WriteSTM12]>,
7110b57cec5SDimitry Andric  SchedVar<R52LMAddrPred16, [R52WriteSTM12]>,
7120b57cec5SDimitry Andric  // unknown number of registers, just use resources for two
7130b57cec5SDimitry Andric  SchedVar<NoSchedPred,      [R52WriteSTM6]>
7140b57cec5SDimitry Andric]>;
7150b57cec5SDimitry Andric
7160b57cec5SDimitry Andric// Vector Load/Stores. Can issue only in slot-0. Can dual-issue with
7170b57cec5SDimitry Andric// another instruction in slot-1, but only in the last issue.
7180b57cec5SDimitry Andricdef : WriteRes<WriteVLD1, [R52UnitLd]> { let Latency = 5;}
7190b57cec5SDimitry Andricdef : WriteRes<WriteVLD2, [R52UnitLd]> {
7200b57cec5SDimitry Andric  let Latency = 6;
7210b57cec5SDimitry Andric  let NumMicroOps = 3;
722*5f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
7230b57cec5SDimitry Andric  let SingleIssue = 1;
7240b57cec5SDimitry Andric}
7250b57cec5SDimitry Andricdef : WriteRes<WriteVLD3, [R52UnitLd]> {
7260b57cec5SDimitry Andric  let Latency = 7;
7270b57cec5SDimitry Andric  let NumMicroOps = 5;
728*5f757f3fSDimitry Andric  let ReleaseAtCycles = [3];
7290b57cec5SDimitry Andric  let SingleIssue = 1;
7300b57cec5SDimitry Andric}
7310b57cec5SDimitry Andricdef : WriteRes<WriteVLD4, [R52UnitLd]> {
7320b57cec5SDimitry Andric  let Latency = 8;
7330b57cec5SDimitry Andric  let NumMicroOps = 7;
734*5f757f3fSDimitry Andric  let ReleaseAtCycles = [4];
7350b57cec5SDimitry Andric  let SingleIssue = 1;
7360b57cec5SDimitry Andric}
7370b57cec5SDimitry Andricdef R52WriteVST1Mem  : SchedWriteRes<[R52UnitLd]> {
7380b57cec5SDimitry Andric  let Latency = 5;
7390b57cec5SDimitry Andric  let NumMicroOps = 1;
740*5f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
7410b57cec5SDimitry Andric}
7420b57cec5SDimitry Andricdef R52WriteVST2Mem  : SchedWriteRes<[R52UnitLd]> {
7430b57cec5SDimitry Andric  let Latency = 6;
7440b57cec5SDimitry Andric  let NumMicroOps = 3;
745*5f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
7460b57cec5SDimitry Andric}
7470b57cec5SDimitry Andricdef R52WriteVST3Mem  : SchedWriteRes<[R52UnitLd]> {
7480b57cec5SDimitry Andric  let Latency = 7;
7490b57cec5SDimitry Andric  let NumMicroOps = 5;
750*5f757f3fSDimitry Andric  let ReleaseAtCycles = [3];
7510b57cec5SDimitry Andric}
7520b57cec5SDimitry Andricdef R52WriteVST4Mem  : SchedWriteRes<[R52UnitLd]> {
7530b57cec5SDimitry Andric  let Latency = 8;
7540b57cec5SDimitry Andric  let NumMicroOps = 7;
755*5f757f3fSDimitry Andric  let ReleaseAtCycles = [4];
7560b57cec5SDimitry Andric}
7570b57cec5SDimitry Andricdef R52WriteVST5Mem  : SchedWriteRes<[R52UnitLd]> {
7580b57cec5SDimitry Andric  let Latency = 9;
7590b57cec5SDimitry Andric  let NumMicroOps = 9;
760*5f757f3fSDimitry Andric  let ReleaseAtCycles = [5];
7610b57cec5SDimitry Andric}
7620b57cec5SDimitry Andric
7630b57cec5SDimitry Andric
7640b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F5, R52Read_F1, R52Read_F1, R52Read_F1], (instregex "VABA(u|s)(v8i8|v4i16|v2i32)")>;
7650b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F5, R52Read_F1, R52Read_F1, R52Read_F1], (instregex "VABA(u|s)(v16i8|v8i16|v4i32)")>;
7660b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F5, R52Read_F1, R52Read_F1, R52Read_F1], (instregex "VABAL(u|s)(v8i16|v4i32|v2i64)")>;
7670b57cec5SDimitry Andric
7680b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F4, R52Read_F1, R52Read_F1], (instregex "VABD(u|s)(v8i8|v4i16|v2i32)")>;
7690b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F4, R52Read_F1, R52Read_F1], (instregex "VABD(u|s)(v16i8|v8i16|v4i32)")>;
7700b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F4, R52Read_F1, R52Read_F1], (instregex "VABDL(u|s)(v16i8|v8i16|v4i32)")>;
7710b57cec5SDimitry Andric
7720b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F4, R52Read_F1], (instregex "VABS(v16i8|v8i16|v4i32)")>;
7730b57cec5SDimitry Andric
7740b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F4, R52Read_F2, R52Read_F2],
7750b57cec5SDimitry Andric                               (instregex "(VADD|VSUB)(v8i8|v4i16|v2i32|v1i64)")>;
7760b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F4, R52Read_F2, R52Read_F2],
7770b57cec5SDimitry Andric                                (instregex "(VADD|VSUB)(v16i8|v8i16|v4i32|v2i64)")>;
7780b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F5, R52Read_F2, R52Read_F2],
7790b57cec5SDimitry Andric                               (instregex "(VADDHN|VRADDHN|VSUBHN|VRSUBHN)(v8i8|v4i16|v2i32)")>;
7800b57cec5SDimitry Andric
7810b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F4, R52Read_F1, R52Read_F1],
7820b57cec5SDimitry Andric                                            (instregex "VADDL", "VADDW", "VSUBL", "VSUBW")>;
7830b57cec5SDimitry Andric
7840b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F3, R52Read_F2, R52Read_F2], (instregex "(VAND|VBIC|VEOR)d")>;
7850b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F3, R52Read_F2, R52Read_F2], (instregex "(VAND|VBIC|VEOR)q")>;
7860b57cec5SDimitry Andric
7870b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F3, R52Read_F2], (instregex "VBICi(v4i16|v2i32)")>;
7880b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F3, R52Read_F2], (instregex "VBICi(v8i16|v4i32)")>;
7890b57cec5SDimitry Andric
790e8d8bef9SDimitry Andricdef : InstRW<[R52WriteFPALU_F3, R52Read_F1, R52Read_F2, R52Read_F2], (instregex "(VBIF|VBIT|VBSL|VBSP)d")>;
791e8d8bef9SDimitry Andricdef : InstRW<[R52Write2FPALU_F3, R52Read_F1, R52Read_F2, R52Read_F2], (instregex "(VBIF|VBIT|VBSL|VBSP)q")>;
7920b57cec5SDimitry Andric
7930b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F3, R52Read_F1, R52Read_F1],
7940b57cec5SDimitry Andric      (instregex "(VCEQ|VCGE|VCGT|VCLE|VCLT|VCLZ|VCMP|VCMPE|VCNT)")>;
7950b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F5, R52Read_F1, R52Read_F1],
7960b57cec5SDimitry Andric      (instregex "VCVT", "VSITO", "VUITO", "VTO")>;
7970b57cec5SDimitry Andric
7980b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F3, R52Read_ISS], (instregex "VDUP(8|16|32)d")>;
7990b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F3, R52Read_ISS], (instregex "VDUP(8|16|32)q")>;
8000b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F3, R52Read_F1], (instregex "VDUPLN(8|16|32)d")>;
8010b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F3, R52Read_F1], (instregex "VDUPLN(8|16|32)q")>;
8020b57cec5SDimitry Andric
8030b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F3, R52Read_F1, R52Read_F1], (instregex "VEXTd(8|16|32)", "VSEL")>;
8040b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F3, R52Read_F1, R52Read_F1], (instregex "VEXTq(8|16|32|64)")>;
8050b57cec5SDimitry Andric
8060b57cec5SDimitry Andricdef : InstRW<[R52WriteFPMAC_F5, R52Read_F1, R52Read_F1, R52Read_F1], (instregex "(VFMA|VFMS)(f|h)d")>;
8070b57cec5SDimitry Andricdef : InstRW<[R52Write2FPMAC_F5, R52Read_F1, R52Read_F1, R52Read_F1], (instregex "(VFMA|VFMS)(f|h)q")>;
8080b57cec5SDimitry Andric
8090b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F4, R52Read_F2, R52Read_F2], (instregex "(VHADD|VHSUB)(u|s)(v8i8|v4i16|v2i32)")>;
8100b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F4, R52Read_F2, R52Read_F2], (instregex "(VHADD|VHSUB)(u|s)(v16i8|v8i16|v4i32)")>;
8110b57cec5SDimitry Andric
8120b57cec5SDimitry Andricdef : InstRW<[R52WriteVLDM], (instregex "VLDM[SD](IA|DB)$")>;
8130b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F4, R52Read_F1, R52Read_F1], (instregex "VMAX", "VMIN", "VPMAX", "VPMIN")>;
8140b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F3, R52Read_F1, R52Read_F1], (instregex "VORR", "VORN", "VREV")>;
8150b57cec5SDimitry Andricdef : InstRW<[R52WriteNoRSRC_WRI], (instregex "VMRS")>;
8160b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F5, R52Read_F1], (instregex "VNEG")>;
8170b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F4, R52Read_F1, R52Read_F1], (instregex "VPADDi")>;
8180b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F4, R52Read_F1, R52Read_F1], (instregex "VPADAL", "VPADDL")>;
8190b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F5, R52Read_F1], (instregex "VQABS(v8i8|v4i16|v2i32|v1i64)")>;
8200b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F5, R52Read_F1], (instregex "VQABS(v16i8|v8i16|v4i32|v2i64)")>;
8210b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F5, R52Read_F2, R52Read_F2],
8220b57cec5SDimitry Andric                  (instregex "(VQADD|VQSUB)(u|s)(v8i8|v4i16|v2i32|v1i64)")>;
8230b57cec5SDimitry Andricdef : InstRW<[R52Write2FPALU_F5, R52Read_F2, R52Read_F2],
8240b57cec5SDimitry Andric                  (instregex "(VQADD|VQSUB)(u|s)(v16i8|v8i16|v4i32|v2i64)")>;
8250b57cec5SDimitry Andricdef : InstRW<[R52Write2FPMAC_F5, R52Read_F1, R52Read_F1, R52Read_F1], (instregex "VQDMLAL", "VQDMLSL")>;
8260b57cec5SDimitry Andricdef : InstRW<[R52WriteFPMUL_F5, R52Read_F1, R52Read_F1, R52Read_F1], (instregex "VQDMUL","VQRDMUL")>;
8270b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F5, R52Read_F1, R52Read_F1],
8280b57cec5SDimitry Andric                 (instregex "VQMOVN", "VQNEG", "VQSHL", "VQSHRN")>;
8290b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F4, R52Read_F1, R52Read_F1], (instregex "VRSHL", "VRSHR", "VRSHRN", "VTB")>;
8300b57cec5SDimitry Andricdef : InstRW<[R52WriteFPALU_F3, R52Read_F1, R52Read_F1], (instregex "VSWP", "VTRN", "VUZP", "VZIP")>;
8310b57cec5SDimitry Andric
8320b57cec5SDimitry Andric//---
8330b57cec5SDimitry Andric// VSTx. Vector Stores
8340b57cec5SDimitry Andric//---
8350b57cec5SDimitry Andric// 1-element structure store
8360b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52Read_ISS, R52Read_F2], (instregex "VST1d(8|16|32|64)$")>;
8370b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST1q(8|16|32|64)$")>;
8380b57cec5SDimitry Andricdef : InstRW<[R52WriteVST3Mem, R52Read_ISS, R52Read_F2], (instregex "VST1d(8|16|32|64)T$")>;
8390b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52Read_ISS, R52Read_F2], (instregex "VST1d(8|16|32|64)Q$")>;
8400b57cec5SDimitry Andricdef : InstRW<[R52WriteVST3Mem, R52Read_ISS, R52Read_F2], (instregex "VST1d64TPseudo$")>;
8410b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52Read_ISS, R52Read_F2], (instregex "VST1d64QPseudo$")>;
8420b57cec5SDimitry Andric
8430b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52Read_ISS, R52Read_F2], (instregex "VST1LNd(8|16|32)$")>;
8440b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52Read_ISS, R52Read_F2], (instregex "VST1LNdAsm_(8|16|32)$")>;
8450b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52Read_ISS, R52Read_F2], (instregex "VST1LNq(8|16|32)Pseudo$")>;
8460b57cec5SDimitry Andric
8470b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST1d(8|16|32|64)wb")>;
8480b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST1q(8|16|32|64)wb")>;
8490b57cec5SDimitry Andricdef : InstRW<[R52WriteVST3Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST1d(8|16|32|64)Twb")>;
8500b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST1d(8|16|32|64)Qwb")>;
8510b57cec5SDimitry Andricdef : InstRW<[R52WriteVST3Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST1d64TPseudoWB")>;
8520b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST1d64QPseudoWB")>;
8530b57cec5SDimitry Andric
8540b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST1LNd(8|16|32)_UPD")>;
8550b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST1LNdWB_(fixed|register)_Asm_(8|16|32)")>;
8560b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST1LNq(8|16|32)Pseudo_UPD")>;
8570b57cec5SDimitry Andric
8580b57cec5SDimitry Andric// 2-element structure store
8590b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST2(d|b)(8|16|32)$")>;
8600b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52Read_ISS, R52Read_F2], (instregex "VST2q(8|16|32)$")>;
8610b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52Read_ISS, R52Read_F2], (instregex "VST2q(8|16|32)Pseudo$")>;
8620b57cec5SDimitry Andric
8630b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52Read_ISS, R52Read_F2], (instregex "VST2LNd(8|16|32)$")>;
8640b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52Read_ISS, R52Read_F2], (instregex "VST2LNdAsm_(8|16|32)$")>;
8650b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52Read_ISS, R52Read_F2], (instregex "VST2LNd(8|16|32)Pseudo$")>;
8660b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52Read_ISS, R52Read_F2], (instregex "VST2LNq(16|32)$")>;
8670b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52Read_ISS, R52Read_F2], (instregex "VST2LNqAsm_(16|32)$")>;
8680b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52Read_ISS, R52Read_F2], (instregex "VST2LNq(16|32)Pseudo$")>;
8690b57cec5SDimitry Andric
8700b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST2(d|b)(8|16|32)wb")>;
8710b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST2q(8|16|32)wb")>;
8720b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST2q(8|16|32)PseudoWB")>;
8730b57cec5SDimitry Andric
8740b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST2LNd(8|16|32)_UPD")>;
8750b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST2LNdWB_(fixed|register)_Asm_(8|16|32)")>;
8760b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST2LNd(8|16|32)Pseudo_UPD")>;
8770b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST2LNq(16|32)_UPD")>;
8780b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST2LNqWB_(fixed|register)_Asm_(16|32)")>;
8790b57cec5SDimitry Andricdef : InstRW<[R52WriteVST1Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST2LNq(16|32)Pseudo_UPD")>;
8800b57cec5SDimitry Andric
8810b57cec5SDimitry Andric// 3-element structure store
8820b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52Read_ISS, R52Read_F2], (instregex "VST3(d|q)(8|16|32)$")>;
8830b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52Read_ISS, R52Read_F2], (instregex "VST3(d|q)Asm_(8|16|32)$")>;
8840b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52Read_ISS, R52Read_F2], (instregex "VST3d(8|16|32)(oddP|P)seudo$")>;
8850b57cec5SDimitry Andric
8860b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST3LNd(8|16|32)$")>;
8870b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST3LNdAsm_(8|16|32)$")>;
8880b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST3LNd(8|16|32)Pseudo$")>;
8890b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST3LNq(16|32)$")>;
8900b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST3LNqAsm_(16|32)$")>;
8910b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST3LNq(16|32)Pseudo$")>;
8920b57cec5SDimitry Andric
8930b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST3(d|q)(8|16|32)_UPD$")>;
8940b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST3(d|q)WB_(fixed|register)_Asm_(8|16|32)$")>;
8950b57cec5SDimitry Andricdef : InstRW<[R52WriteVST4Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST3(d|q)(8|16|32)(oddP|P)seudo_UPD$")>;
8960b57cec5SDimitry Andric
8970b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST3LNd(8|16|32)_UPD$")>;
8980b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST3LNdWB_(fixed|register)_Asm_(8|16|32)")>;
8990b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST3LNd(8|16|32)Pseudo_UPD$")>;
9000b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST3LNq(16|32)_UPD$")>;
9010b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST3LNqWB_(fixed|register)_Asm_(16|32)$")>;
9020b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST3LNq(16|32)Pseudo_UPD$")>;
9030b57cec5SDimitry Andric
9040b57cec5SDimitry Andric// 4-element structure store
9050b57cec5SDimitry Andricdef : InstRW<[R52WriteVST5Mem, R52Read_ISS, R52Read_F2], (instregex "VST4(d|q)(8|16|32)$")>;
9060b57cec5SDimitry Andricdef : InstRW<[R52WriteVST5Mem, R52Read_ISS, R52Read_F2], (instregex "VST4(d|q)Asm_(8|16|32)$")>;
9070b57cec5SDimitry Andricdef : InstRW<[R52WriteVST5Mem, R52Read_ISS, R52Read_F2], (instregex "VST4d(8|16|32)Pseudo$")>;
9080b57cec5SDimitry Andric
9090b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST4LNd(8|16|32)$")>;
9100b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST4LNdAsm_(8|16|32)$")>;
9110b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST4LNd(8|16|32)Pseudo$")>;
9120b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST4LNq(16|32)$")>;
9130b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST4LNqAsm_(16|32)$")>;
9140b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52Read_ISS, R52Read_F2], (instregex "VST4LNq(16|32)Pseudo$")>;
9150b57cec5SDimitry Andric
9160b57cec5SDimitry Andricdef : InstRW<[R52WriteVST5Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST4(d|q)(8|16|32)_UPD")>;
9170b57cec5SDimitry Andricdef : InstRW<[R52WriteVST5Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST4(d|q)WB_(fixed|register)_Asm_(8|16|32)")>;
9180b57cec5SDimitry Andricdef : InstRW<[R52WriteVST5Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST4(d|q)(8|16|32)(oddP|P)seudo_UPD")>;
9190b57cec5SDimitry Andric
9200b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST4LNd(8|16|32)_UPD")>;
9210b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST4LNdWB_(fixed|register)_Asm_(8|16|32)")>;
9220b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST4LNd(8|16|32)Pseudo_UPD")>;
9230b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST4LNq(16|32)_UPD")>;
9240b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST4LNqWB_(fixed|register)_Asm_(16|32)")>;
9250b57cec5SDimitry Andricdef : InstRW<[R52WriteVST2Mem, R52WriteAdr, R52Read_ISS, R52Read_F2], (instregex "VST4LNq(16|32)Pseudo_UPD")>;
9260b57cec5SDimitry Andric
9270b57cec5SDimitry Andric} // R52 SchedModel
928