xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64SchedThunderX.td (revision 4c2d3b022a1d543dbbff75a0c53e8d3d7242216d)
10b57cec5SDimitry Andric//==- AArch64SchedThunderX.td - Cavium ThunderX T8X 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 itinerary class data for the ARM ThunderX T8X
100b57cec5SDimitry Andric// (T88, T81, T83) processors.
110b57cec5SDimitry Andric// Loosely based on Cortex-A53 which is somewhat similar.
120b57cec5SDimitry Andric//
130b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric
150b57cec5SDimitry Andric// ===---------------------------------------------------------------------===//
160b57cec5SDimitry Andric// The following definitions describe the simpler per-operand machine model.
170b57cec5SDimitry Andric// This works with MachineScheduler. See llvm/MC/MCSchedule.h for details.
180b57cec5SDimitry Andric
190b57cec5SDimitry Andric// Cavium ThunderX T8X scheduling machine model.
200b57cec5SDimitry Andricdef ThunderXT8XModel : SchedMachineModel {
210b57cec5SDimitry Andric  let IssueWidth = 2;         // 2 micro-ops dispatched per cycle.
220b57cec5SDimitry Andric  let MicroOpBufferSize = 0;  // ThunderX T88/T81/T83 are in-order.
230b57cec5SDimitry Andric  let LoadLatency = 3;        // Optimistic load latency.
240b57cec5SDimitry Andric  let MispredictPenalty = 8;  // Branch mispredict penalty.
250b57cec5SDimitry Andric  let PostRAScheduler = 1;    // Use PostRA scheduler.
260b57cec5SDimitry Andric  let CompleteModel = 1;
270b57cec5SDimitry Andric
28e837bb5cSDimitry Andric  list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F,
29fe6060f1SDimitry Andric                                                    PAUnsupported.F,
30753f127fSDimitry Andric                                                    SMEUnsupported.F,
31*4c2d3b02SDimitry Andric                                                    [HasMTE, HasCSSC]);
320b57cec5SDimitry Andric  // FIXME: Remove when all errors have been fixed.
330b57cec5SDimitry Andric  let FullInstRWOverlapCheck = 0;
340b57cec5SDimitry Andric}
350b57cec5SDimitry Andric
360b57cec5SDimitry Andric// Modeling each pipeline with BufferSize == 0 since T8X is in-order.
370b57cec5SDimitry Andricdef THXT8XUnitALU    : ProcResource<2> { let BufferSize = 0; } // Int ALU
380b57cec5SDimitry Andricdef THXT8XUnitMAC    : ProcResource<1> { let BufferSize = 0; } // Int MAC
390b57cec5SDimitry Andricdef THXT8XUnitDiv    : ProcResource<1> { let BufferSize = 0; } // Int Division
400b57cec5SDimitry Andricdef THXT8XUnitLdSt   : ProcResource<1> { let BufferSize = 0; } // Load/Store
410b57cec5SDimitry Andricdef THXT8XUnitBr     : ProcResource<1> { let BufferSize = 0; } // Branch
420b57cec5SDimitry Andricdef THXT8XUnitFPALU  : ProcResource<1> { let BufferSize = 0; } // FP ALU
430b57cec5SDimitry Andricdef THXT8XUnitFPMDS  : ProcResource<1> { let BufferSize = 0; } // FP Mul/Div/Sqrt
440b57cec5SDimitry Andric
450b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
460b57cec5SDimitry Andric// Subtarget-specific SchedWrite types mapping the ProcResources and
470b57cec5SDimitry Andric// latencies.
480b57cec5SDimitry Andric
490b57cec5SDimitry Andriclet SchedModel = ThunderXT8XModel in {
500b57cec5SDimitry Andric
510b57cec5SDimitry Andric// ALU
520b57cec5SDimitry Andricdef : WriteRes<WriteImm, [THXT8XUnitALU]> { let Latency = 1; }
530b57cec5SDimitry Andricdef : WriteRes<WriteI, [THXT8XUnitALU]> { let Latency = 1; }
540b57cec5SDimitry Andricdef : WriteRes<WriteISReg, [THXT8XUnitALU]> { let Latency = 2; }
550b57cec5SDimitry Andricdef : WriteRes<WriteIEReg, [THXT8XUnitALU]> { let Latency = 2; }
560b57cec5SDimitry Andricdef : WriteRes<WriteIS, [THXT8XUnitALU]> { let Latency = 2; }
570b57cec5SDimitry Andricdef : WriteRes<WriteExtr, [THXT8XUnitALU]> { let Latency = 2; }
580b57cec5SDimitry Andric
590b57cec5SDimitry Andric// MAC
600b57cec5SDimitry Andricdef : WriteRes<WriteIM32, [THXT8XUnitMAC]> {
610b57cec5SDimitry Andric  let Latency = 4;
625f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
630b57cec5SDimitry Andric}
640b57cec5SDimitry Andric
650b57cec5SDimitry Andricdef : WriteRes<WriteIM64, [THXT8XUnitMAC]> {
660b57cec5SDimitry Andric  let Latency = 4;
675f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
680b57cec5SDimitry Andric}
690b57cec5SDimitry Andric
700b57cec5SDimitry Andric// Div
710b57cec5SDimitry Andricdef : WriteRes<WriteID32, [THXT8XUnitDiv]> {
720b57cec5SDimitry Andric  let Latency = 12;
735f757f3fSDimitry Andric  let ReleaseAtCycles = [6];
740b57cec5SDimitry Andric}
750b57cec5SDimitry Andric
760b57cec5SDimitry Andricdef : WriteRes<WriteID64, [THXT8XUnitDiv]> {
770b57cec5SDimitry Andric  let Latency = 14;
785f757f3fSDimitry Andric  let ReleaseAtCycles = [8];
790b57cec5SDimitry Andric}
800b57cec5SDimitry Andric
810b57cec5SDimitry Andric// Load
820b57cec5SDimitry Andricdef : WriteRes<WriteLD, [THXT8XUnitLdSt]> { let Latency = 3; }
830b57cec5SDimitry Andricdef : WriteRes<WriteLDIdx, [THXT8XUnitLdSt]> { let Latency = 3; }
840b57cec5SDimitry Andricdef : WriteRes<WriteLDHi, [THXT8XUnitLdSt]> { let Latency = 3; }
850b57cec5SDimitry Andric
860b57cec5SDimitry Andric// Vector Load
870b57cec5SDimitry Andricdef : WriteRes<WriteVLD, [THXT8XUnitLdSt]> {
880b57cec5SDimitry Andric  let Latency = 8;
895f757f3fSDimitry Andric  let ReleaseAtCycles = [3];
900b57cec5SDimitry Andric}
910b57cec5SDimitry Andric
920b57cec5SDimitry Andricdef THXT8XWriteVLD1 : SchedWriteRes<[THXT8XUnitLdSt]> {
930b57cec5SDimitry Andric  let Latency = 6;
945f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
950b57cec5SDimitry Andric}
960b57cec5SDimitry Andric
970b57cec5SDimitry Andricdef THXT8XWriteVLD2 : SchedWriteRes<[THXT8XUnitLdSt]> {
980b57cec5SDimitry Andric  let Latency = 11;
995f757f3fSDimitry Andric  let ReleaseAtCycles = [7];
1000b57cec5SDimitry Andric}
1010b57cec5SDimitry Andric
1020b57cec5SDimitry Andricdef THXT8XWriteVLD3 : SchedWriteRes<[THXT8XUnitLdSt]> {
1030b57cec5SDimitry Andric  let Latency = 12;
1045f757f3fSDimitry Andric  let ReleaseAtCycles = [8];
1050b57cec5SDimitry Andric}
1060b57cec5SDimitry Andric
1070b57cec5SDimitry Andricdef THXT8XWriteVLD4 : SchedWriteRes<[THXT8XUnitLdSt]> {
1080b57cec5SDimitry Andric  let Latency = 13;
1095f757f3fSDimitry Andric  let ReleaseAtCycles = [9];
1100b57cec5SDimitry Andric}
1110b57cec5SDimitry Andric
1120b57cec5SDimitry Andricdef THXT8XWriteVLD5 : SchedWriteRes<[THXT8XUnitLdSt]> {
1130b57cec5SDimitry Andric  let Latency = 13;
1145f757f3fSDimitry Andric  let ReleaseAtCycles = [9];
1150b57cec5SDimitry Andric}
1160b57cec5SDimitry Andric
1170b57cec5SDimitry Andric// Pre/Post Indexing
1180b57cec5SDimitry Andricdef : WriteRes<WriteAdr, []> { let Latency = 0; }
1190b57cec5SDimitry Andric
1200b57cec5SDimitry Andric// Store
1210b57cec5SDimitry Andricdef : WriteRes<WriteST, [THXT8XUnitLdSt]> { let Latency = 1; }
1220b57cec5SDimitry Andricdef : WriteRes<WriteSTP, [THXT8XUnitLdSt]> { let Latency = 1; }
1230b57cec5SDimitry Andricdef : WriteRes<WriteSTIdx, [THXT8XUnitLdSt]> { let Latency = 1; }
1240b57cec5SDimitry Andricdef : WriteRes<WriteSTX, [THXT8XUnitLdSt]> { let Latency = 1; }
1250b57cec5SDimitry Andric
1260b57cec5SDimitry Andric// Vector Store
1270b57cec5SDimitry Andricdef : WriteRes<WriteVST, [THXT8XUnitLdSt]>;
1280b57cec5SDimitry Andricdef THXT8XWriteVST1 : SchedWriteRes<[THXT8XUnitLdSt]>;
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andricdef THXT8XWriteVST2 : SchedWriteRes<[THXT8XUnitLdSt]> {
1310b57cec5SDimitry Andric  let Latency = 10;
1325f757f3fSDimitry Andric  let ReleaseAtCycles = [9];
1330b57cec5SDimitry Andric}
1340b57cec5SDimitry Andric
1350b57cec5SDimitry Andricdef THXT8XWriteVST3 : SchedWriteRes<[THXT8XUnitLdSt]> {
1360b57cec5SDimitry Andric  let Latency = 11;
1375f757f3fSDimitry Andric  let ReleaseAtCycles = [10];
1380b57cec5SDimitry Andric}
1390b57cec5SDimitry Andric
1400b57cec5SDimitry Andricdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; }
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric// Branch
1430b57cec5SDimitry Andricdef : WriteRes<WriteBr, [THXT8XUnitBr]>;
1440b57cec5SDimitry Andricdef THXT8XWriteBR : SchedWriteRes<[THXT8XUnitBr]>;
1450b57cec5SDimitry Andricdef : WriteRes<WriteBrReg, [THXT8XUnitBr]>;
1460b57cec5SDimitry Andricdef THXT8XWriteBRR : SchedWriteRes<[THXT8XUnitBr]>;
1470b57cec5SDimitry Andricdef THXT8XWriteRET : SchedWriteRes<[THXT8XUnitALU]>;
1480b57cec5SDimitry Andricdef : WriteRes<WriteSys, [THXT8XUnitBr]>;
1490b57cec5SDimitry Andricdef : WriteRes<WriteBarrier, [THXT8XUnitBr]>;
1500b57cec5SDimitry Andricdef : WriteRes<WriteHint, [THXT8XUnitBr]>;
1510b57cec5SDimitry Andric
1520b57cec5SDimitry Andric// FP ALU
1530b57cec5SDimitry Andricdef : WriteRes<WriteF, [THXT8XUnitFPALU]> { let Latency = 6; }
1540b57cec5SDimitry Andricdef : WriteRes<WriteFCmp, [THXT8XUnitFPALU]> { let Latency = 6; }
1550b57cec5SDimitry Andricdef : WriteRes<WriteFCvt, [THXT8XUnitFPALU]> { let Latency = 6; }
1560b57cec5SDimitry Andricdef : WriteRes<WriteFCopy, [THXT8XUnitFPALU]> { let Latency = 6; }
1570b57cec5SDimitry Andricdef : WriteRes<WriteFImm, [THXT8XUnitFPALU]> { let Latency = 6; }
158349cc55cSDimitry Andricdef : WriteRes<WriteVd, [THXT8XUnitFPALU]> { let Latency = 6; }
159349cc55cSDimitry Andricdef : WriteRes<WriteVq, [THXT8XUnitFPALU]> { let Latency = 6; }
1600b57cec5SDimitry Andric
1610b57cec5SDimitry Andric// FP Mul, Div, Sqrt
1620b57cec5SDimitry Andricdef : WriteRes<WriteFMul, [THXT8XUnitFPMDS]> { let Latency = 6; }
1630b57cec5SDimitry Andricdef : WriteRes<WriteFDiv, [THXT8XUnitFPMDS]> {
1640b57cec5SDimitry Andric  let Latency = 22;
1655f757f3fSDimitry Andric  let ReleaseAtCycles = [19];
1660b57cec5SDimitry Andric}
1670b57cec5SDimitry Andric
1680b57cec5SDimitry Andricdef THXT8XWriteFMAC : SchedWriteRes<[THXT8XUnitFPMDS]> { let Latency = 10; }
1690b57cec5SDimitry Andric
1700b57cec5SDimitry Andricdef THXT8XWriteFDivSP : SchedWriteRes<[THXT8XUnitFPMDS]> {
1710b57cec5SDimitry Andric  let Latency = 12;
1725f757f3fSDimitry Andric  let ReleaseAtCycles = [9];
1730b57cec5SDimitry Andric}
1740b57cec5SDimitry Andric
1750b57cec5SDimitry Andricdef THXT8XWriteFDivDP : SchedWriteRes<[THXT8XUnitFPMDS]> {
1760b57cec5SDimitry Andric  let Latency = 22;
1775f757f3fSDimitry Andric  let ReleaseAtCycles = [19];
1780b57cec5SDimitry Andric}
1790b57cec5SDimitry Andric
1800b57cec5SDimitry Andricdef THXT8XWriteFSqrtSP : SchedWriteRes<[THXT8XUnitFPMDS]> {
1810b57cec5SDimitry Andric  let Latency = 17;
1825f757f3fSDimitry Andric  let ReleaseAtCycles = [14];
1830b57cec5SDimitry Andric}
1840b57cec5SDimitry Andric
1850b57cec5SDimitry Andricdef THXT8XWriteFSqrtDP : SchedWriteRes<[THXT8XUnitFPMDS]> {
1860b57cec5SDimitry Andric  let Latency = 31;
1875f757f3fSDimitry Andric  let ReleaseAtCycles = [28];
1880b57cec5SDimitry Andric}
1890b57cec5SDimitry Andric
1900b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1910b57cec5SDimitry Andric// Subtarget-specific SchedRead types.
1920b57cec5SDimitry Andric
1930b57cec5SDimitry Andric// No forwarding for these reads.
1940b57cec5SDimitry Andricdef : ReadAdvance<ReadExtrHi, 1>;
1950b57cec5SDimitry Andricdef : ReadAdvance<ReadAdrBase, 2>;
1960b57cec5SDimitry Andricdef : ReadAdvance<ReadVLD, 2>;
197349cc55cSDimitry Andricdef : ReadAdvance<ReadST, 2>;
1980b57cec5SDimitry Andric
1990b57cec5SDimitry Andric// FIXME: This needs more targeted benchmarking.
2000b57cec5SDimitry Andric// ALU - Most operands in the ALU pipes are not needed for two cycles. Shiftable
2010b57cec5SDimitry Andric//       operands are needed one cycle later if and only if they are to be
2020b57cec5SDimitry Andric//       shifted. Otherwise, they too are needed two cycles later. This same
2030b57cec5SDimitry Andric//       ReadAdvance applies to Extended registers as well, even though there is
2040b57cec5SDimitry Andric//       a separate SchedPredicate for them.
2050b57cec5SDimitry Andricdef : ReadAdvance<ReadI, 2, [WriteImm, WriteI,
2060b57cec5SDimitry Andric                             WriteISReg, WriteIEReg, WriteIS,
2070b57cec5SDimitry Andric                             WriteID32, WriteID64,
2080b57cec5SDimitry Andric                             WriteIM32, WriteIM64]>;
2090b57cec5SDimitry Andricdef THXT8XReadShifted : SchedReadAdvance<1, [WriteImm, WriteI,
2100b57cec5SDimitry Andric                                          WriteISReg, WriteIEReg, WriteIS,
2110b57cec5SDimitry Andric                                          WriteID32, WriteID64,
2120b57cec5SDimitry Andric                                          WriteIM32, WriteIM64]>;
2130b57cec5SDimitry Andricdef THXT8XReadNotShifted : SchedReadAdvance<2, [WriteImm, WriteI,
2140b57cec5SDimitry Andric                                             WriteISReg, WriteIEReg, WriteIS,
2150b57cec5SDimitry Andric                                             WriteID32, WriteID64,
2160b57cec5SDimitry Andric                                             WriteIM32, WriteIM64]>;
2170b57cec5SDimitry Andricdef THXT8XReadISReg : SchedReadVariant<[
2180b57cec5SDimitry Andric	SchedVar<RegShiftedPred, [THXT8XReadShifted]>,
2190b57cec5SDimitry Andric	SchedVar<NoSchedPred, [THXT8XReadNotShifted]>]>;
2200b57cec5SDimitry Andricdef : SchedAlias<ReadISReg, THXT8XReadISReg>;
2210b57cec5SDimitry Andric
2220b57cec5SDimitry Andricdef THXT8XReadIEReg : SchedReadVariant<[
2230b57cec5SDimitry Andric	SchedVar<RegExtendedPred, [THXT8XReadShifted]>,
2240b57cec5SDimitry Andric	SchedVar<NoSchedPred, [THXT8XReadNotShifted]>]>;
2250b57cec5SDimitry Andricdef : SchedAlias<ReadIEReg, THXT8XReadIEReg>;
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andric// MAC - Operands are generally needed one cycle later in the MAC pipe.
2280b57cec5SDimitry Andric//       Accumulator operands are needed two cycles later.
2290b57cec5SDimitry Andricdef : ReadAdvance<ReadIM, 1, [WriteImm,WriteI,
2300b57cec5SDimitry Andric                              WriteISReg, WriteIEReg, WriteIS,
2310b57cec5SDimitry Andric                              WriteID32, WriteID64,
2320b57cec5SDimitry Andric                              WriteIM32, WriteIM64]>;
2330b57cec5SDimitry Andricdef : ReadAdvance<ReadIMA, 2, [WriteImm, WriteI,
2340b57cec5SDimitry Andric                               WriteISReg, WriteIEReg, WriteIS,
2350b57cec5SDimitry Andric                               WriteID32, WriteID64,
2360b57cec5SDimitry Andric                               WriteIM32, WriteIM64]>;
2370b57cec5SDimitry Andric
2380b57cec5SDimitry Andric// Div
2390b57cec5SDimitry Andricdef : ReadAdvance<ReadID, 1, [WriteImm, WriteI,
2400b57cec5SDimitry Andric                              WriteISReg, WriteIEReg, WriteIS,
2410b57cec5SDimitry Andric                              WriteID32, WriteID64,
2420b57cec5SDimitry Andric                              WriteIM32, WriteIM64]>;
2430b57cec5SDimitry Andric
2440b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2450b57cec5SDimitry Andric// Subtarget-specific InstRW.
2460b57cec5SDimitry Andric
2470b57cec5SDimitry Andric//---
2480b57cec5SDimitry Andric// Branch
2490b57cec5SDimitry Andric//---
2500b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteBR], (instregex "^B$")>;
2510b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteBR], (instregex "^BL$")>;
2520b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteBR], (instregex "^B..$")>;
2530b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteBR], (instregex "^CBNZ")>;
2540b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteBR], (instregex "^CBZ")>;
2550b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteBR], (instregex "^TBNZ")>;
2560b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteBR], (instregex "^TBZ")>;
2570b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteBRR], (instregex "^BR$")>;
2580b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteBRR], (instregex "^BLR$")>;
2590b57cec5SDimitry Andric
2600b57cec5SDimitry Andric//---
2610b57cec5SDimitry Andric// Ret
2620b57cec5SDimitry Andric//---
2630b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteRET], (instregex "^RET$")>;
2640b57cec5SDimitry Andric
2650b57cec5SDimitry Andric//---
2660b57cec5SDimitry Andric// Miscellaneous
2670b57cec5SDimitry Andric//---
2680b57cec5SDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>;
2690b57cec5SDimitry Andric
2700b57cec5SDimitry Andric//---
2710b57cec5SDimitry Andric// Vector Loads
2720b57cec5SDimitry Andric//---
2730b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD1], (instregex "LD1i(8|16|32|64)$")>;
2740b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD1], (instregex "LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
2750b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD1], (instregex "LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
2760b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2], (instregex "LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
2770b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD3], (instregex "LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
2780b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD4], (instregex "LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
2790b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD1, WriteAdr], (instregex "LD1i(8|16|32|64)_POST$")>;
2800b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD1, WriteAdr], (instregex "LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
2810b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD1, WriteAdr], (instregex "LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
2820b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
2830b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD3, WriteAdr], (instregex "LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
2840b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD4, WriteAdr], (instregex "LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
2850b57cec5SDimitry Andric
2860b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD1], (instregex "LD2i(8|16|32|64)$")>;
2870b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD1], (instregex "LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
2880b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2], (instregex "LD2Twov(8b|4h|2s)$")>;
2890b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD4], (instregex "LD2Twov(16b|8h|4s|2d)$")>;
2900b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD1, WriteAdr], (instregex "LD2i(8|16|32|64)(_POST)?$")>;
2910b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD1, WriteAdr], (instregex "LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)(_POST)?$")>;
2920b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD2Twov(8b|4h|2s)(_POST)?$")>;
2930b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD4, WriteAdr], (instregex "LD2Twov(16b|8h|4s|2d)(_POST)?$")>;
2940b57cec5SDimitry Andric
2950b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2], (instregex "LD3i(8|16|32|64)$")>;
2960b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2], (instregex "LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
2970b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD4], (instregex "LD3Threev(8b|4h|2s|1d|16b|8h|4s)$")>;
2980b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD3], (instregex "LD3Threev(2d)$")>;
2990b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD3i(8|16|32|64)_POST$")>;
3000b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
3010b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD4, WriteAdr], (instregex "LD3Threev(8b|4h|2s|1d|16b|8h|4s)_POST$")>;
3020b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD3, WriteAdr], (instregex "LD3Threev(2d)_POST$")>;
3030b57cec5SDimitry Andric
3040b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2], (instregex "LD4i(8|16|32|64)$")>;
3050b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2], (instregex "LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
3060b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD5], (instregex "LD4Fourv(8b|4h|2s|1d|16b|8h|4s)$")>;
3070b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD4], (instregex "LD4Fourv(2d)$")>;
3080b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD4i(8|16|32|64)_POST$")>;
3090b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
3100b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD5, WriteAdr], (instregex "LD4Fourv(8b|4h|2s|1d|16b|8h|4s)_POST$")>;
3110b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVLD4, WriteAdr], (instregex "LD4Fourv(2d)_POST$")>;
3120b57cec5SDimitry Andric
3130b57cec5SDimitry Andric//---
3140b57cec5SDimitry Andric// Vector Stores
3150b57cec5SDimitry Andric//---
3160b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST1], (instregex "ST1i(8|16|32|64)$")>;
3170b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST1], (instregex "ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
3180b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST1], (instregex "ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
3190b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2], (instregex "ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
3200b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2], (instregex "ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
3210b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST1, WriteAdr], (instregex "ST1i(8|16|32|64)_POST$")>;
3220b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST1, WriteAdr], (instregex "ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
3230b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST1, WriteAdr], (instregex "ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
3240b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
3250b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
3260b57cec5SDimitry Andric
3270b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST1], (instregex "ST2i(8|16|32|64)$")>;
3280b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST1], (instregex "ST2Twov(8b|4h|2s)$")>;
3290b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2], (instregex "ST2Twov(16b|8h|4s|2d)$")>;
3300b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST1, WriteAdr], (instregex "ST2i(8|16|32|64)_POST$")>;
3310b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST1, WriteAdr], (instregex "ST2Twov(8b|4h|2s)_POST$")>;
3320b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST2Twov(16b|8h|4s|2d)_POST$")>;
3330b57cec5SDimitry Andric
3340b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2], (instregex "ST3i(8|16|32|64)$")>;
3350b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST3], (instregex "ST3Threev(8b|4h|2s|1d|16b|8h|4s)$")>;
3360b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2], (instregex "ST3Threev(2d)$")>;
3370b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST3i(8|16|32|64)_POST$")>;
3380b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST3, WriteAdr], (instregex "ST3Threev(8b|4h|2s|1d|16b|8h|4s)_POST$")>;
3390b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST3Threev(2d)_POST$")>;
3400b57cec5SDimitry Andric
3410b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2], (instregex "ST4i(8|16|32|64)$")>;
3420b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST3], (instregex "ST4Fourv(8b|4h|2s|1d|16b|8h|4s)$")>;
3430b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2], (instregex "ST4Fourv(2d)$")>;
3440b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST4i(8|16|32|64)_POST$")>;
3450b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST3, WriteAdr], (instregex "ST4Fourv(8b|4h|2s|1d|16b|8h|4s)_POST$")>;
3460b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST4Fourv(2d)_POST$")>;
3470b57cec5SDimitry Andric
3480b57cec5SDimitry Andric//---
3490b57cec5SDimitry Andric// Floating Point MAC, DIV, SQRT
3500b57cec5SDimitry Andric//---
3510b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteFMAC], (instregex "^FN?M(ADD|SUB).*")>;
3520b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteFMAC], (instregex "^FML(A|S).*")>;
3530b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteFDivSP], (instrs FDIVSrr)>;
3540b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteFDivDP], (instrs FDIVDrr)>;
3550b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteFDivSP], (instregex "^FDIVv.*32$")>;
3560b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteFDivDP], (instregex "^FDIVv.*64$")>;
3570b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteFSqrtSP], (instregex "^.*SQRT.*32$")>;
3580b57cec5SDimitry Andricdef : InstRW<[THXT8XWriteFSqrtDP], (instregex "^.*SQRT.*64$")>;
3590b57cec5SDimitry Andric
3600b57cec5SDimitry Andric}
361