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