1*0fca6ea1SDimitry Andric//=- AArch64SchedOryon.td - Qualcomm Oryon CPU 001 ---*- tablegen -*-=// 2*0fca6ea1SDimitry Andric// 3*0fca6ea1SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric// 7*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric// 9*0fca6ea1SDimitry Andric// This file defines the scheduling model for Qualcomm Oryon 10*0fca6ea1SDimitry Andric// family of processors. 11*0fca6ea1SDimitry Andric// 12*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 13*0fca6ea1SDimitry Andric 14*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 15*0fca6ea1SDimitry Andric// Pipeline Description. 16*0fca6ea1SDimitry Andric 17*0fca6ea1SDimitry Andricdef OryonModel : SchedMachineModel { 18*0fca6ea1SDimitry Andric let IssueWidth = 14; 19*0fca6ea1SDimitry Andric let MicroOpBufferSize = 376; 20*0fca6ea1SDimitry Andric let LoadLatency = 4; 21*0fca6ea1SDimitry Andric let MispredictPenalty = 13; // 13 cycles for mispredicted branch. 22*0fca6ea1SDimitry Andric let LoopMicroOpBufferSize = 0; // Do not have a LoopMicroOpBuffer 23*0fca6ea1SDimitry Andric let PostRAScheduler = 1; // Using PostRA sched. 24*0fca6ea1SDimitry Andric let CompleteModel = 1; 25*0fca6ea1SDimitry Andric 26*0fca6ea1SDimitry Andric list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F, 27*0fca6ea1SDimitry Andric SMEUnsupported.F, 28*0fca6ea1SDimitry Andric MTEUnsupported.F, 29*0fca6ea1SDimitry Andric PAUnsupported.F, 30*0fca6ea1SDimitry Andric [HasPAuth, HasCSSC]); 31*0fca6ea1SDimitry Andric} 32*0fca6ea1SDimitry Andric 33*0fca6ea1SDimitry Andriclet SchedModel = OryonModel in { 34*0fca6ea1SDimitry Andric 35*0fca6ea1SDimitry Andric// Issue ports. 36*0fca6ea1SDimitry Andric// IXU has 6 ports p0 ~ p5 37*0fca6ea1SDimitry Andric// LSU has 4 ports p6 ~ p9(ls0 ~ ls3), p10/p11(std0, std1) has to work with ls0~ls3 38*0fca6ea1SDimitry Andric// VXU has 4 ports p12 ~ p15 39*0fca6ea1SDimitry Andric 40*0fca6ea1SDimitry Andric// cross IXU/LSU/VXU resource group for FMOV P41 of VXU 41*0fca6ea1SDimitry Andric// I2V 42*0fca6ea1SDimitry Andricdef ORYONI4FP0 : ProcResource<1>; 43*0fca6ea1SDimitry Andricdef ORYONI5FP1 : ProcResource<1>; 44*0fca6ea1SDimitry Andric// V2I 45*0fca6ea1SDimitry Andricdef ORYONFP0I4 : ProcResource<1>; 46*0fca6ea1SDimitry Andricdef ORYONFP1I5 : ProcResource<1>; 47*0fca6ea1SDimitry Andric 48*0fca6ea1SDimitry Andric// store 1 for normal store instructions 49*0fca6ea1SDimitry Andricdef ORYONST0 : ProcResource<1>; 50*0fca6ea1SDimitry Andric// store 2 for normal store instructions 51*0fca6ea1SDimitry Andricdef ORYONST1 : ProcResource<1>; 52*0fca6ea1SDimitry Andric 53*0fca6ea1SDimitry Andric// Port 0: ALU/Indirect/Direct Branch. 54*0fca6ea1SDimitry Andricdef ORYONP0 : ProcResource<1>; 55*0fca6ea1SDimitry Andric 56*0fca6ea1SDimitry Andric// Port 1: ALU/Direct Branch. 57*0fca6ea1SDimitry Andricdef ORYONP1 : ProcResource<1>; 58*0fca6ea1SDimitry Andric 59*0fca6ea1SDimitry Andric// Port 2: ALU. 60*0fca6ea1SDimitry Andricdef ORYONP2 : ProcResource<1>; 61*0fca6ea1SDimitry Andric 62*0fca6ea1SDimitry Andric// Port 3: ALU. 63*0fca6ea1SDimitry Andricdef ORYONP3 : ProcResource<1>; 64*0fca6ea1SDimitry Andric 65*0fca6ea1SDimitry Andric// Port 4: ALU. 66*0fca6ea1SDimitry Andricdef ORYONP4 : ProcResource<1> { 67*0fca6ea1SDimitry Andric let Super = ORYONI4FP0; 68*0fca6ea1SDimitry Andric let Super = ORYONFP0I4; } 69*0fca6ea1SDimitry Andric 70*0fca6ea1SDimitry Andric// Port 5: ALU. 71*0fca6ea1SDimitry Andricdef ORYONP5 : ProcResource<1> { 72*0fca6ea1SDimitry Andric let Super = ORYONI5FP1; 73*0fca6ea1SDimitry Andric let Super = ORYONFP1I5; } 74*0fca6ea1SDimitry Andric 75*0fca6ea1SDimitry Andric// Port 6: Load/Store. LS0 76*0fca6ea1SDimitry Andricdef ORYONP6 : ProcResource<1> { 77*0fca6ea1SDimitry Andric let Super = ORYONST0; } 78*0fca6ea1SDimitry Andric 79*0fca6ea1SDimitry Andric// Port 7: Load/store. LS1 80*0fca6ea1SDimitry Andricdef ORYONP7 : ProcResource<1> { 81*0fca6ea1SDimitry Andric let Super = ORYONST0; } 82*0fca6ea1SDimitry Andric 83*0fca6ea1SDimitry Andric// Port 8: Load/Store. LS2 84*0fca6ea1SDimitry Andricdef ORYONP8 : ProcResource<1> { 85*0fca6ea1SDimitry Andric let Super = ORYONST1; } 86*0fca6ea1SDimitry Andric 87*0fca6ea1SDimitry Andric// Port 9: Load/store. LS3 88*0fca6ea1SDimitry Andricdef ORYONP9 : ProcResource<1> { 89*0fca6ea1SDimitry Andric let Super = ORYONST1; } 90*0fca6ea1SDimitry Andric 91*0fca6ea1SDimitry Andric// Port 10: Load/Store. STD0 92*0fca6ea1SDimitry Andricdef ORYONP10SD0 : ProcResource<1> { 93*0fca6ea1SDimitry Andric let Super = ORYONST0; } 94*0fca6ea1SDimitry Andric 95*0fca6ea1SDimitry Andric// Port 11: Load/store. STD1 96*0fca6ea1SDimitry Andricdef ORYONP11SD1 : ProcResource<1> { 97*0fca6ea1SDimitry Andric let Super = ORYONST1; } 98*0fca6ea1SDimitry Andric 99*0fca6ea1SDimitry Andric// Port 12: FP/Neon/SIMD/Crypto. 100*0fca6ea1SDimitry Andricdef ORYONP12FP0 : ProcResource<1> { 101*0fca6ea1SDimitry Andric let Super = ORYONI4FP0; 102*0fca6ea1SDimitry Andric let Super = ORYONFP0I4; } 103*0fca6ea1SDimitry Andric 104*0fca6ea1SDimitry Andric// Port 13: FP/Neon/SIMD/Crypto. 105*0fca6ea1SDimitry Andricdef ORYONP13FP1 : ProcResource<1> { 106*0fca6ea1SDimitry Andric let Super = ORYONI5FP1; 107*0fca6ea1SDimitry Andric let Super = ORYONFP1I5; } 108*0fca6ea1SDimitry Andric 109*0fca6ea1SDimitry Andric// Port 14: FP/Neon/SIMD/Crypto. 110*0fca6ea1SDimitry Andricdef ORYONP14FP2 : ProcResource<1>; 111*0fca6ea1SDimitry Andric 112*0fca6ea1SDimitry Andric// Port 15: FP/Neon/SIMD/Crypto. 113*0fca6ea1SDimitry Andricdef ORYONP15FP3 : ProcResource<1>; 114*0fca6ea1SDimitry Andric 115*0fca6ea1SDimitry Andric// Define groups for the functional units on each issue port. Each group 116*0fca6ea1SDimitry Andric// created will be used by a WriteRes. 117*0fca6ea1SDimitry Andric 118*0fca6ea1SDimitry Andric// Integer add/shift/logical/misc. instructions on port I0/I1/I2/I3/I4/I5. 119*0fca6ea1SDimitry Andricdef ORYONI012345 : ProcResGroup<[ORYONP0, ORYONP1, ORYONP2, 120*0fca6ea1SDimitry Andric ORYONP3, ORYONP4, ORYONP5]> { 121*0fca6ea1SDimitry Andric let BufferSize = 120; 122*0fca6ea1SDimitry Andric} 123*0fca6ea1SDimitry Andric 124*0fca6ea1SDimitry Andric// Direct Conditional Branch instructions on ports I0/I1. 125*0fca6ea1SDimitry Andricdef ORYONI01 : ProcResGroup<[ORYONP0, ORYONP1]> { 126*0fca6ea1SDimitry Andric let BufferSize = 40; 127*0fca6ea1SDimitry Andric} 128*0fca6ea1SDimitry Andric 129*0fca6ea1SDimitry Andric// Indirect/crypto Conditional Branch instructions on ports I0. 130*0fca6ea1SDimitry Andricdef ORYONI0 : ProcResGroup<[ORYONP0]> { 131*0fca6ea1SDimitry Andric let BufferSize = 20; 132*0fca6ea1SDimitry Andric} 133*0fca6ea1SDimitry Andric 134*0fca6ea1SDimitry Andric// Crypto/CRC/PAU instructions on ports I2. 135*0fca6ea1SDimitry Andricdef ORYONI2 : ProcResGroup<[ORYONP2]> { 136*0fca6ea1SDimitry Andric let BufferSize = 20; 137*0fca6ea1SDimitry Andric} 138*0fca6ea1SDimitry Andric 139*0fca6ea1SDimitry Andric// Multiply/Multiply-ADD instructions on ports I4/I5. 140*0fca6ea1SDimitry Andricdef ORYONI45 : ProcResGroup<[ORYONP4, ORYONP5]> { 141*0fca6ea1SDimitry Andric let BufferSize = 40; 142*0fca6ea1SDimitry Andric} 143*0fca6ea1SDimitry Andric 144*0fca6ea1SDimitry Andric// Divide instructions on ports I5. 145*0fca6ea1SDimitry Andricdef ORYONI5 : ProcResGroup<[ORYONP5]> { 146*0fca6ea1SDimitry Andric let BufferSize = 20; 147*0fca6ea1SDimitry Andric} 148*0fca6ea1SDimitry Andric 149*0fca6ea1SDimitry Andric// Comparison instructions on ports I0/I1/I2/I3. 150*0fca6ea1SDimitry Andricdef ORYONI0123 : ProcResGroup<[ORYONP0, ORYONP1, 151*0fca6ea1SDimitry Andric ORYONP2, ORYONP3]> { 152*0fca6ea1SDimitry Andric let BufferSize = 80; 153*0fca6ea1SDimitry Andric} 154*0fca6ea1SDimitry Andric 155*0fca6ea1SDimitry Andric// Load instructions on ports P6/P7/P8/P9. 156*0fca6ea1SDimitry Andricdef ORYONLD : ProcResGroup<[ORYONP6, ORYONP7, ORYONP8, ORYONP9]> { 157*0fca6ea1SDimitry Andric let BufferSize = 64; 158*0fca6ea1SDimitry Andric} 159*0fca6ea1SDimitry Andric 160*0fca6ea1SDimitry Andric// Store instructions on combo of STA/STD pipes 161*0fca6ea1SDimitry Andricdef ORYONST : ProcResGroup<[ORYONST0, ORYONST1]> { 162*0fca6ea1SDimitry Andric let BufferSize = 64; 163*0fca6ea1SDimitry Andric} 164*0fca6ea1SDimitry Andric 165*0fca6ea1SDimitry Andric// Arithmetic and CRYP-AED ASIMD/FP instructions on ports FP0/FP1/FP2/FP3. 166*0fca6ea1SDimitry Andricdef ORYONFP0123 : ProcResGroup<[ORYONP12FP0, ORYONP13FP1, 167*0fca6ea1SDimitry Andric ORYONP14FP2, ORYONP15FP3]> { 168*0fca6ea1SDimitry Andric let BufferSize = 192; 169*0fca6ea1SDimitry Andric} 170*0fca6ea1SDimitry Andric 171*0fca6ea1SDimitry Andric// FP Comparison and F/I move instructions on ports FP0/FP1. 172*0fca6ea1SDimitry Andricdef ORYONFP01 : ProcResGroup<[ORYONP12FP0, ORYONP13FP1]> { 173*0fca6ea1SDimitry Andric let BufferSize = 96; 174*0fca6ea1SDimitry Andric} 175*0fca6ea1SDimitry Andric 176*0fca6ea1SDimitry Andric// FDIV instructions on ports FP3. 177*0fca6ea1SDimitry Andricdef ORYONFP3 : ProcResGroup<[ORYONP15FP3]> { 178*0fca6ea1SDimitry Andric let BufferSize = 48; 179*0fca6ea1SDimitry Andric} 180*0fca6ea1SDimitry Andric 181*0fca6ea1SDimitry Andric// CRYP-SHA instructions on ports FP1. 182*0fca6ea1SDimitry Andricdef ORYONFP1 : ProcResGroup<[ORYONP14FP2]> { 183*0fca6ea1SDimitry Andric let BufferSize = 48; 184*0fca6ea1SDimitry Andric} 185*0fca6ea1SDimitry Andric 186*0fca6ea1SDimitry Andricdef ORYONFP2 : ProcResGroup<[ORYONP14FP2]> { 187*0fca6ea1SDimitry Andric let BufferSize = 48; 188*0fca6ea1SDimitry Andric} 189*0fca6ea1SDimitry Andric 190*0fca6ea1SDimitry Andric// Reciprocal, Squre root on FP0. 191*0fca6ea1SDimitry Andricdef ORYONFP0 : ProcResGroup<[ORYONP12FP0]> { 192*0fca6ea1SDimitry Andric let BufferSize = 48; 193*0fca6ea1SDimitry Andric} 194*0fca6ea1SDimitry Andric 195*0fca6ea1SDimitry Andric// cross IXU/LSU/VXU resource group for FMOV P41 of VXU 196*0fca6ea1SDimitry Andric// I2V 197*0fca6ea1SDimitry Andricdef ORYONI2V : ProcResGroup<[ORYONI4FP0, ORYONI5FP1]> { 198*0fca6ea1SDimitry Andric let BufferSize = 40; 199*0fca6ea1SDimitry Andric} 200*0fca6ea1SDimitry Andric 201*0fca6ea1SDimitry Andric// V2I 202*0fca6ea1SDimitry Andricdef ORYONV2I : ProcResGroup<[ORYONFP0I4, ORYONFP1I5]> { 203*0fca6ea1SDimitry Andric let BufferSize = 96; 204*0fca6ea1SDimitry Andric} 205*0fca6ea1SDimitry Andric 206*0fca6ea1SDimitry Andric// Define commonly used write types for InstRW specializations. 207*0fca6ea1SDimitry Andric// All definitions follow the format: ORYONWrite_<NumCycles>Cyc_<Resources>. 208*0fca6ea1SDimitry Andric 209*0fca6ea1SDimitry Andric// Because of the complexity of Oryon CPU, we skip the following 210*0fca6ea1SDimitry Andric// generic definitions and define each instruction specifically 211*0fca6ea1SDimitry Andric 212*0fca6ea1SDimitry Andric// These WriteRes entries are not used in the Falkor sched model. 213*0fca6ea1SDimitry Andricdef : WriteRes<WriteImm, []> { let Unsupported = 1; } 214*0fca6ea1SDimitry Andricdef : WriteRes<WriteI, []> { let Unsupported = 1; } 215*0fca6ea1SDimitry Andricdef : WriteRes<WriteISReg, []> { let Unsupported = 1; } 216*0fca6ea1SDimitry Andricdef : WriteRes<WriteIEReg, []> { let Unsupported = 1; } 217*0fca6ea1SDimitry Andricdef : WriteRes<WriteExtr, []> { let Unsupported = 1; } 218*0fca6ea1SDimitry Andricdef : WriteRes<WriteIS, []> { let Unsupported = 1; } 219*0fca6ea1SDimitry Andricdef : WriteRes<WriteID32, []> { let Unsupported = 1; } 220*0fca6ea1SDimitry Andricdef : WriteRes<WriteID64, []> { let Unsupported = 1; } 221*0fca6ea1SDimitry Andricdef : WriteRes<WriteIM32, []> { let Unsupported = 1; } 222*0fca6ea1SDimitry Andricdef : WriteRes<WriteIM64, []> { let Unsupported = 1; } 223*0fca6ea1SDimitry Andricdef : WriteRes<WriteBr, []> { let Unsupported = 1; } 224*0fca6ea1SDimitry Andricdef : WriteRes<WriteBrReg, []> { let Unsupported = 1; } 225*0fca6ea1SDimitry Andricdef : WriteRes<WriteLD, []> { let Unsupported = 1; } 226*0fca6ea1SDimitry Andricdef : WriteRes<WriteST, []> { let Unsupported = 1; } 227*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTP, []> { let Unsupported = 1; } 228*0fca6ea1SDimitry Andricdef : WriteRes<WriteAdr, []> { let Unsupported = 1; } 229*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDIdx, []> { let Unsupported = 1; } 230*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTIdx, []> { let Unsupported = 1; } 231*0fca6ea1SDimitry Andricdef : WriteRes<WriteF, []> { let Unsupported = 1; } 232*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCmp, []> { let Unsupported = 1; } 233*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvt, []> { let Unsupported = 1; } 234*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCopy, []> { let Unsupported = 1; } 235*0fca6ea1SDimitry Andricdef : WriteRes<WriteFImm, []> { let Unsupported = 1; } 236*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMul, []> { let Unsupported = 1; } 237*0fca6ea1SDimitry Andricdef : WriteRes<WriteFDiv, []> { let Unsupported = 1; } 238*0fca6ea1SDimitry Andricdef : WriteRes<WriteVd, []> { let Unsupported = 1; } 239*0fca6ea1SDimitry Andricdef : WriteRes<WriteVq, []> { let Unsupported = 1; } 240*0fca6ea1SDimitry Andricdef : WriteRes<WriteVLD, []> { let Unsupported = 1; } 241*0fca6ea1SDimitry Andricdef : WriteRes<WriteVST, []> { let Unsupported = 1; } 242*0fca6ea1SDimitry Andricdef : WriteRes<WriteSys, []> { let Unsupported = 1; } 243*0fca6ea1SDimitry Andricdef : WriteRes<WriteBarrier, []> { let Unsupported = 1; } 244*0fca6ea1SDimitry Andricdef : WriteRes<WriteHint, []> { let Unsupported = 1; } 245*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDHi, []> { let Unsupported = 1; } 246*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; } 247*0fca6ea1SDimitry Andric 248*0fca6ea1SDimitry Andric// These ReadAdvance entries will be defined in later implementation 249*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadI, 0>; 250*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadISReg, 0>; 251*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIEReg, 0>; 252*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIM, 0>; 253*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIMA, 0>; 254*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadID, 0>; 255*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadExtrHi, 0>; 256*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>; 257*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVLD, 0>; 258*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadST, 0>; 259*0fca6ea1SDimitry Andric 260*0fca6ea1SDimitry Andric 261*0fca6ea1SDimitry Andric//IXU resource definition 262*0fca6ea1SDimitry Andric// 1 cycles NO pipe 263*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_NONE : SchedWriteRes<[]>; 264*0fca6ea1SDimitry Andric 265*0fca6ea1SDimitry Andric// 1 cycles on I01. 266*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_I01 : SchedWriteRes<[ORYONI01]>; 267*0fca6ea1SDimitry Andric 268*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_2Uops_I01 : SchedWriteRes<[ORYONI01]> { 269*0fca6ea1SDimitry Andric let NumMicroOps = 2; 270*0fca6ea1SDimitry Andric} 271*0fca6ea1SDimitry Andric 272*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_I0 : SchedWriteRes<[ORYONI0]>; 273*0fca6ea1SDimitry Andric 274*0fca6ea1SDimitry Andric// 7 cycles on I2. PAC*/AUT* instructions 275*0fca6ea1SDimitry Andricdef ORYONWrite_7Cyc_I2 : SchedWriteRes<[ORYONI2]> { 276*0fca6ea1SDimitry Andric let Latency = 7; 277*0fca6ea1SDimitry Andric} 278*0fca6ea1SDimitry Andric 279*0fca6ea1SDimitry Andric// 7 cycles on I2. PAC*/AUT* instructions 280*0fca6ea1SDimitry Andricdef ORYONWrite_7Cyc_3Uops_I2 : SchedWriteRes<[ORYONI2]> { 281*0fca6ea1SDimitry Andric let Latency = 7; 282*0fca6ea1SDimitry Andric let NumMicroOps = 3; 283*0fca6ea1SDimitry Andric} 284*0fca6ea1SDimitry Andric 285*0fca6ea1SDimitry Andric// 9 (7+1+1) cycles on I2 and I0/I1, I0. Authentication branch instructions 286*0fca6ea1SDimitry Andric// these instructions are broken down to three uops 287*0fca6ea1SDimitry Andric// a. PtrAuth on pipe 2 taking 7 cycles 288*0fca6ea1SDimitry Andric// b. Link Register Update on pipes 0 and 1 taking 1 cycle 289*0fca6ea1SDimitry Andric// c. Indirect branch on pipe 0 taking 1 cycle 290*0fca6ea1SDimitry Andric 291*0fca6ea1SDimitry Andricdef ORYONWrite_9Cyc_I012 : SchedWriteRes<[ORYONI2, ORYONI01]> { 292*0fca6ea1SDimitry Andric let Latency = 9; 293*0fca6ea1SDimitry Andric let NumMicroOps = 3; 294*0fca6ea1SDimitry Andric} 295*0fca6ea1SDimitry Andric 296*0fca6ea1SDimitry Andric// 3 cycles on I2. CRC32 and CRC32C instructions 297*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_I2 : SchedWriteRes<[ORYONI2]> { 298*0fca6ea1SDimitry Andric let Latency = 3; 299*0fca6ea1SDimitry Andric} 300*0fca6ea1SDimitry Andric 301*0fca6ea1SDimitry Andric// 1 cycle on I012345 302*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_I012345 : SchedWriteRes<[ORYONI012345]>; 303*0fca6ea1SDimitry Andric 304*0fca6ea1SDimitry Andric// 1 cycle on I0123 305*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_I0123 : SchedWriteRes<[ORYONI0123]>; 306*0fca6ea1SDimitry Andric 307*0fca6ea1SDimitry Andric// 1 cycle on 2 of I012345 308*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_I012345_I012345 : 309*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONI012345, ORYONI012345]> ; 310*0fca6ea1SDimitry Andric 311*0fca6ea1SDimitry Andric// 2 cycle on 2 of I0123 with ReleaseAtCycles 312*0fca6ea1SDimitry Andricdef ORYONWrite_2Cyc_I0123_I0123_RC : 313*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONI0123, ORYONI0123]> { 314*0fca6ea1SDimitry Andric let Latency = 2; 315*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2,2]; 316*0fca6ea1SDimitry Andric} 317*0fca6ea1SDimitry Andric 318*0fca6ea1SDimitry Andric// 2 cycle on 2 of I012345 319*0fca6ea1SDimitry Andricdef ORYONWrite_2Cyc_I012345_I012345_RC : 320*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONI012345, ORYONI012345]> { 321*0fca6ea1SDimitry Andric let Latency = 2; 322*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2,2]; 323*0fca6ea1SDimitry Andric} 324*0fca6ea1SDimitry Andric 325*0fca6ea1SDimitry Andric// 3 cycle on 2 of I45 326*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_I45_I45_RC : 327*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONI45, ORYONI45]> { 328*0fca6ea1SDimitry Andric let Latency = 3; 329*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2,2]; 330*0fca6ea1SDimitry Andric} 331*0fca6ea1SDimitry Andric 332*0fca6ea1SDimitry Andric// 3 cycle on I45 333*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_I45 : SchedWriteRes<[ORYONI45]> { 334*0fca6ea1SDimitry Andric let Latency = 3; 335*0fca6ea1SDimitry Andric} 336*0fca6ea1SDimitry Andric 337*0fca6ea1SDimitry Andric// 7 cycle on I2 32-bit integer division 338*0fca6ea1SDimitry Andricdef ORYONWrite_7Cyc_I2_RC : SchedWriteRes<[ORYONI2]> { 339*0fca6ea1SDimitry Andric let Latency = 7; 340*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2]; 341*0fca6ea1SDimitry Andric} 342*0fca6ea1SDimitry Andric 343*0fca6ea1SDimitry Andric// 9 cycle on I2 64-bit integer division 344*0fca6ea1SDimitry Andricdef ORYONWrite_9Cyc_I2_RC : SchedWriteRes<[ORYONI2]> { 345*0fca6ea1SDimitry Andric let Latency = 9; 346*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2]; 347*0fca6ea1SDimitry Andric} 348*0fca6ea1SDimitry Andric 349*0fca6ea1SDimitry Andric// LSU resource definition 350*0fca6ea1SDimitry Andric// need to define WriteLDAdr, WriteAdrAdr, WriteLDHi, WriteSTX 351*0fca6ea1SDimitry Andric// 4 cycle on LS(P6789) 352*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_LD : SchedWriteRes<[ORYONLD]> { 353*0fca6ea1SDimitry Andric let Latency = 4; 354*0fca6ea1SDimitry Andric} 355*0fca6ea1SDimitry Andric 356*0fca6ea1SDimitry Andric// 4 cycle for Post/Pre inc/dec access, also covers all pair loads Post/Pre 357*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> { 358*0fca6ea1SDimitry Andric let Latency = 4; 359*0fca6ea1SDimitry Andric} 360*0fca6ea1SDimitry Andric 361*0fca6ea1SDimitry Andric// 5 (4+1) for VXU SIMD access/could also include FP 362*0fca6ea1SDimitry Andric// resource might not be correct, as VXU resource not included 363*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_LD : SchedWriteRes<[ORYONLD]> { 364*0fca6ea1SDimitry Andric let Latency = 5; 365*0fca6ea1SDimitry Andric} 366*0fca6ea1SDimitry Andric 367*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_2Uops_LD : SchedWriteRes<[ORYONLD]> { 368*0fca6ea1SDimitry Andric let Latency = 5; 369*0fca6ea1SDimitry Andric let NumMicroOps = 2; 370*0fca6ea1SDimitry Andric} 371*0fca6ea1SDimitry Andric 372*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_3Uops_LD : SchedWriteRes<[ORYONLD]> { 373*0fca6ea1SDimitry Andric let Latency = 5; 374*0fca6ea1SDimitry Andric let NumMicroOps = 3; 375*0fca6ea1SDimitry Andric} 376*0fca6ea1SDimitry Andric 377*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_4Uops_LD : SchedWriteRes<[ORYONLD]> { 378*0fca6ea1SDimitry Andric let Latency = 5; 379*0fca6ea1SDimitry Andric let NumMicroOps = 4; 380*0fca6ea1SDimitry Andric} 381*0fca6ea1SDimitry Andric 382*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_5Uops_LD : SchedWriteRes<[ORYONLD]> { 383*0fca6ea1SDimitry Andric let Latency = 5; 384*0fca6ea1SDimitry Andric let NumMicroOps = 5; 385*0fca6ea1SDimitry Andric} 386*0fca6ea1SDimitry Andric 387*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_6Uops_LD : SchedWriteRes<[ORYONLD]> { 388*0fca6ea1SDimitry Andric let Latency = 5; 389*0fca6ea1SDimitry Andric let NumMicroOps = 6; 390*0fca6ea1SDimitry Andric} 391*0fca6ea1SDimitry Andric 392*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_8Uops_LD : SchedWriteRes<[ORYONLD]> { 393*0fca6ea1SDimitry Andric let Latency = 5; 394*0fca6ea1SDimitry Andric let NumMicroOps = 8; 395*0fca6ea1SDimitry Andric} 396*0fca6ea1SDimitry Andric 397*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_10Uops_LD : SchedWriteRes<[ORYONLD]> { 398*0fca6ea1SDimitry Andric let Latency = 5; 399*0fca6ea1SDimitry Andric let NumMicroOps = 10; 400*0fca6ea1SDimitry Andric} 401*0fca6ea1SDimitry Andric 402*0fca6ea1SDimitry Andric// 6 cycle for Post/Pre inc/dec access 403*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> { 404*0fca6ea1SDimitry Andric let Latency = 5; 405*0fca6ea1SDimitry Andric} 406*0fca6ea1SDimitry Andric 407*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_2Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> { 408*0fca6ea1SDimitry Andric let Latency = 5; 409*0fca6ea1SDimitry Andric let NumMicroOps = 2; 410*0fca6ea1SDimitry Andric} 411*0fca6ea1SDimitry Andric 412*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_3Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> { 413*0fca6ea1SDimitry Andric let Latency = 5; 414*0fca6ea1SDimitry Andric let NumMicroOps = 3; 415*0fca6ea1SDimitry Andric} 416*0fca6ea1SDimitry Andric 417*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_4Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> { 418*0fca6ea1SDimitry Andric let Latency = 5; 419*0fca6ea1SDimitry Andric let NumMicroOps = 4; 420*0fca6ea1SDimitry Andric} 421*0fca6ea1SDimitry Andric 422*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_5Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> { 423*0fca6ea1SDimitry Andric let Latency = 5; 424*0fca6ea1SDimitry Andric let NumMicroOps = 5; 425*0fca6ea1SDimitry Andric} 426*0fca6ea1SDimitry Andric 427*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_6Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> { 428*0fca6ea1SDimitry Andric let Latency = 5; 429*0fca6ea1SDimitry Andric let NumMicroOps = 6; 430*0fca6ea1SDimitry Andric} 431*0fca6ea1SDimitry Andric 432*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_8Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> { 433*0fca6ea1SDimitry Andric let Latency = 5; 434*0fca6ea1SDimitry Andric let NumMicroOps = 8; 435*0fca6ea1SDimitry Andric} 436*0fca6ea1SDimitry Andric 437*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_10Uops_LD_I012345 : SchedWriteRes<[ORYONLD, ORYONI012345]> { 438*0fca6ea1SDimitry Andric let Latency = 5; 439*0fca6ea1SDimitry Andric let NumMicroOps = 10; 440*0fca6ea1SDimitry Andric} 441*0fca6ea1SDimitry Andric 442*0fca6ea1SDimitry Andric// 1 cycle for all generic stores 443*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_ST : SchedWriteRes<[ORYONST]>; 444*0fca6ea1SDimitry Andric 445*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_2Uops_ST : SchedWriteRes<[ORYONST]> { 446*0fca6ea1SDimitry Andric let NumMicroOps = 2; 447*0fca6ea1SDimitry Andric} 448*0fca6ea1SDimitry Andric 449*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_3Uops_ST : SchedWriteRes<[ORYONST]> { 450*0fca6ea1SDimitry Andric let NumMicroOps = 3; 451*0fca6ea1SDimitry Andric} 452*0fca6ea1SDimitry Andric 453*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_4Uops_ST : SchedWriteRes<[ORYONST]> { 454*0fca6ea1SDimitry Andric let NumMicroOps = 4; 455*0fca6ea1SDimitry Andric} 456*0fca6ea1SDimitry Andric 457*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_5Uops_ST : SchedWriteRes<[ORYONST]> { 458*0fca6ea1SDimitry Andric let NumMicroOps = 5; 459*0fca6ea1SDimitry Andric} 460*0fca6ea1SDimitry Andric 461*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_6Uops_ST : SchedWriteRes<[ORYONST]> { 462*0fca6ea1SDimitry Andric let NumMicroOps = 6; 463*0fca6ea1SDimitry Andric} 464*0fca6ea1SDimitry Andric 465*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_8Uops_ST : SchedWriteRes<[ORYONST]> { 466*0fca6ea1SDimitry Andric let NumMicroOps = 8; 467*0fca6ea1SDimitry Andric} 468*0fca6ea1SDimitry Andric 469*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_10Uops_ST : SchedWriteRes<[ORYONST]> { 470*0fca6ea1SDimitry Andric let NumMicroOps = 10; 471*0fca6ea1SDimitry Andric} 472*0fca6ea1SDimitry Andric 473*0fca6ea1SDimitry Andric// 1 cycle for neon write: float + ASIMD with Post/Pre Inc/Dec access 474*0fca6ea1SDimitry Andric// also includes Pair store until further informed 475*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> { 476*0fca6ea1SDimitry Andric let NumMicroOps = 3; 477*0fca6ea1SDimitry Andric} 478*0fca6ea1SDimitry Andric 479*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_2Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> { 480*0fca6ea1SDimitry Andric let NumMicroOps = 2; 481*0fca6ea1SDimitry Andric} 482*0fca6ea1SDimitry Andric 483*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_3Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> { 484*0fca6ea1SDimitry Andric let NumMicroOps = 3; 485*0fca6ea1SDimitry Andric} 486*0fca6ea1SDimitry Andric 487*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_4Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> { 488*0fca6ea1SDimitry Andric let NumMicroOps = 4; 489*0fca6ea1SDimitry Andric} 490*0fca6ea1SDimitry Andric 491*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_5Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> { 492*0fca6ea1SDimitry Andric let NumMicroOps = 5; 493*0fca6ea1SDimitry Andric} 494*0fca6ea1SDimitry Andric 495*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_6Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> { 496*0fca6ea1SDimitry Andric let NumMicroOps = 6; 497*0fca6ea1SDimitry Andric} 498*0fca6ea1SDimitry Andric 499*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_8Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> { 500*0fca6ea1SDimitry Andric let NumMicroOps = 8; 501*0fca6ea1SDimitry Andric} 502*0fca6ea1SDimitry Andric 503*0fca6ea1SDimitry Andricdef ORYONWrite_1Cyc_10Uops_ST_I012345 : SchedWriteRes<[ORYONST, ORYONI012345]> { 504*0fca6ea1SDimitry Andric let NumMicroOps = 10; 505*0fca6ea1SDimitry Andric} 506*0fca6ea1SDimitry Andric 507*0fca6ea1SDimitry Andric// VXU resource definition 508*0fca6ea1SDimitry Andric 509*0fca6ea1SDimitry Andric// I2V instruction has 1 uOp 510*0fca6ea1SDimitry Andric// I2v with convert has 2 uOps 511*0fca6ea1SDimitry Andric// all I2V, V2I's throughputs are 2 512*0fca6ea1SDimitry Andric// On VXU doc, p37 -- latencies and throughput 513*0fca6ea1SDimitry Andric// P41, resource taken, P42, uOps 514*0fca6ea1SDimitry Andricdef ORYONWrite_I2V_4Cyc_I45 : SchedWriteRes<[ORYONI2V]> { 515*0fca6ea1SDimitry Andric let Latency = 4; 516*0fca6ea1SDimitry Andric} 517*0fca6ea1SDimitry Andric 518*0fca6ea1SDimitry Andric// inline a FCVT, so add one more uOp 519*0fca6ea1SDimitry Andricdef ORYONWrite_I2V_7Cyc_I45 : SchedWriteRes<[ORYONI2V]> { 520*0fca6ea1SDimitry Andric let Latency = 7; 521*0fca6ea1SDimitry Andric let NumMicroOps = 2; 522*0fca6ea1SDimitry Andric} 523*0fca6ea1SDimitry Andric 524*0fca6ea1SDimitry Andric// V2I move instruction has 1/2 uOps, P42 in VXU doc 525*0fca6ea1SDimitry Andric// Latency is 3, FCVT is also 3 cycle 526*0fca6ea1SDimitry Andric// move + convert is 6 (3+3) cycles 527*0fca6ea1SDimitry Andric// throughput is 2 528*0fca6ea1SDimitry Andricdef ORYONWrite_V2I_3Cyc_FP01 : SchedWriteRes<[ORYONV2I]> { 529*0fca6ea1SDimitry Andric let Latency = 3; 530*0fca6ea1SDimitry Andric} 531*0fca6ea1SDimitry Andric 532*0fca6ea1SDimitry Andric// inline a FCVT, so add one more uOp 533*0fca6ea1SDimitry Andricdef ORYONWrite_V2I_6Cyc_FP01 : SchedWriteRes<[ORYONV2I]> { 534*0fca6ea1SDimitry Andric let Latency = 6; 535*0fca6ea1SDimitry Andric let NumMicroOps = 2; 536*0fca6ea1SDimitry Andric} 537*0fca6ea1SDimitry Andric 538*0fca6ea1SDimitry Andricdef ORYONWrite_V2V_2Cyc_FP0123 : SchedWriteRes<[ORYONFP0123]> { 539*0fca6ea1SDimitry Andric let Latency = 2; 540*0fca6ea1SDimitry Andric} 541*0fca6ea1SDimitry Andric 542*0fca6ea1SDimitry Andricdef ORYONWrite_V2V_3Cyc_FP0123 : SchedWriteRes<[ORYONFP0123]> { 543*0fca6ea1SDimitry Andric let Latency = 3; 544*0fca6ea1SDimitry Andric} 545*0fca6ea1SDimitry Andric 546*0fca6ea1SDimitry Andricdef ORYONWrite_V2V_6Cyc_FP01 : SchedWriteRes<[ORYONFP0123]> { 547*0fca6ea1SDimitry Andric let Latency = 6; 548*0fca6ea1SDimitry Andric let NumMicroOps = 3; 549*0fca6ea1SDimitry Andric} 550*0fca6ea1SDimitry Andric 551*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_FP0123 : SchedWriteRes<[ORYONFP0123]> { 552*0fca6ea1SDimitry Andric let Latency = 4; 553*0fca6ea1SDimitry Andric} 554*0fca6ea1SDimitry Andric 555*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_FP0 : SchedWriteRes<[ORYONFP0]> { 556*0fca6ea1SDimitry Andric let Latency = 3; 557*0fca6ea1SDimitry Andric} 558*0fca6ea1SDimitry Andric 559*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_FP0123 : SchedWriteRes<[ORYONFP0123]> { 560*0fca6ea1SDimitry Andric let Latency = 3; 561*0fca6ea1SDimitry Andric} 562*0fca6ea1SDimitry Andric 563*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_2Uops_FP0123 : SchedWriteRes<[ORYONFP0123]> { 564*0fca6ea1SDimitry Andric let Latency = 3; 565*0fca6ea1SDimitry Andric let NumMicroOps = 2; 566*0fca6ea1SDimitry Andric} 567*0fca6ea1SDimitry Andric 568*0fca6ea1SDimitry Andricdef ORYONWrite_2Cyc_FP0123 : SchedWriteRes<[ORYONFP0123]> { 569*0fca6ea1SDimitry Andric let Latency = 2; 570*0fca6ea1SDimitry Andric} 571*0fca6ea1SDimitry Andric 572*0fca6ea1SDimitry Andricdef ORYONWrite_2Cyc_FP01 : SchedWriteRes<[ORYONFP01]> { 573*0fca6ea1SDimitry Andric let Latency = 2; 574*0fca6ea1SDimitry Andric} 575*0fca6ea1SDimitry Andric 576*0fca6ea1SDimitry Andric// 2 cycle on FP1 577*0fca6ea1SDimitry Andricdef ORYONWrite_2Cyc_FP1 : SchedWriteRes<[ORYONFP1]> { 578*0fca6ea1SDimitry Andric let Latency = 2; 579*0fca6ea1SDimitry Andric} 580*0fca6ea1SDimitry Andric 581*0fca6ea1SDimitry Andric// 3 cycle on FP1 582*0fca6ea1SDimitry Andricdef ORYONWrite_3Cyc_FP1 : SchedWriteRes<[ORYONFP1]> { 583*0fca6ea1SDimitry Andric let Latency = 3; 584*0fca6ea1SDimitry Andric} 585*0fca6ea1SDimitry Andric 586*0fca6ea1SDimitry Andric// 4 cycle , 0.5 throughput on FP1 587*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_FP1_RC4 : SchedWriteRes<[ORYONFP1]> { 588*0fca6ea1SDimitry Andric let Latency = 4; 589*0fca6ea1SDimitry Andric let ReleaseAtCycles = [4]; 590*0fca6ea1SDimitry Andric} 591*0fca6ea1SDimitry Andric 592*0fca6ea1SDimitry Andric// 5 cycle , 1 throughput on FP1 593*0fca6ea1SDimitry Andricdef ORYONWrite_5Cyc_FP1 : SchedWriteRes<[ORYONFP1]> { 594*0fca6ea1SDimitry Andric let Latency = 5; 595*0fca6ea1SDimitry Andric} 596*0fca6ea1SDimitry Andric 597*0fca6ea1SDimitry Andric// 8 cycle , 2 throughput on FP0123 598*0fca6ea1SDimitry Andricdef ORYONWrite_8Cyc_FP0123_RC : SchedWriteRes<[ORYONFP0123]> { 599*0fca6ea1SDimitry Andric let Latency = 8; 600*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2]; 601*0fca6ea1SDimitry Andric} 602*0fca6ea1SDimitry Andric 603*0fca6ea1SDimitry Andricdef ORYONWrite_6Cyc_FP3 : SchedWriteRes<[ORYONFP3]> { 604*0fca6ea1SDimitry Andric let Latency = 6; 605*0fca6ea1SDimitry Andric} 606*0fca6ea1SDimitry Andric 607*0fca6ea1SDimitry Andricdef ORYONWrite_7Cyc_FP3 : SchedWriteRes<[ORYONFP3]> { 608*0fca6ea1SDimitry Andric let Latency = 7; 609*0fca6ea1SDimitry Andric} 610*0fca6ea1SDimitry Andric 611*0fca6ea1SDimitry Andricdef ORYONWrite_8Cyc_FP3 : SchedWriteRes<[ORYONFP3]> { 612*0fca6ea1SDimitry Andric let Latency = 8; 613*0fca6ea1SDimitry Andric} 614*0fca6ea1SDimitry Andric 615*0fca6ea1SDimitry Andricdef ORYONWrite_9Cyc_FP3 : SchedWriteRes<[ORYONFP3]> { 616*0fca6ea1SDimitry Andric let Latency = 9; 617*0fca6ea1SDimitry Andric} 618*0fca6ea1SDimitry Andric 619*0fca6ea1SDimitry Andricdef ORYONWrite_10Cyc_FP3 : SchedWriteRes<[ORYONFP3]> { 620*0fca6ea1SDimitry Andric let Latency = 10; 621*0fca6ea1SDimitry Andric} 622*0fca6ea1SDimitry Andric 623*0fca6ea1SDimitry Andricdef ORYONWrite_8Cyc_FP3_RC : SchedWriteRes<[ORYONFP3]> { 624*0fca6ea1SDimitry Andric let Latency = 8; 625*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2]; 626*0fca6ea1SDimitry Andric} 627*0fca6ea1SDimitry Andric 628*0fca6ea1SDimitry Andricdef ORYONWrite_10Cyc_FP3_RC : SchedWriteRes<[ORYONFP3]> { 629*0fca6ea1SDimitry Andric let Latency = 10; 630*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2]; 631*0fca6ea1SDimitry Andric} 632*0fca6ea1SDimitry Andric 633*0fca6ea1SDimitry Andricdef ORYONWrite_13Cyc_FP3_RC : SchedWriteRes<[ORYONFP3]> { 634*0fca6ea1SDimitry Andric let Latency = 13; 635*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2]; 636*0fca6ea1SDimitry Andric} 637*0fca6ea1SDimitry Andric 638*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_FP0123_RC : 639*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONFP0123]> { 640*0fca6ea1SDimitry Andric let Latency = 4; 641*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2]; 642*0fca6ea1SDimitry Andric} 643*0fca6ea1SDimitry Andric 644*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_FP0123_FP0123_RC : 645*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONFP0123, ORYONFP0123]> { 646*0fca6ea1SDimitry Andric let Latency = 4; 647*0fca6ea1SDimitry Andric let NumMicroOps = 2; 648*0fca6ea1SDimitry Andric let ReleaseAtCycles = [2,2]; 649*0fca6ea1SDimitry Andric} 650*0fca6ea1SDimitry Andric 651*0fca6ea1SDimitry Andricdef ORYONWrite_4Cyc_FP0123_FP0123_FP0123_RC : 652*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONFP0123, ORYONFP0123, ORYONFP0123]> { 653*0fca6ea1SDimitry Andric let Latency = 4; 654*0fca6ea1SDimitry Andric let NumMicroOps = 3; 655*0fca6ea1SDimitry Andric let ReleaseAtCycles = [3,3,3]; 656*0fca6ea1SDimitry Andric} 657*0fca6ea1SDimitry Andric 658*0fca6ea1SDimitry Andricdef ORYONWrite_6Cyc_FP0123_FP0123_FP0123_FP0123_RC : 659*0fca6ea1SDimitry AndricSchedWriteRes<[ORYONFP0123, ORYONFP0123, ORYONFP0123, ORYONFP0123]> { 660*0fca6ea1SDimitry Andric let Latency = 6; 661*0fca6ea1SDimitry Andric let NumMicroOps = 4; 662*0fca6ea1SDimitry Andric let ReleaseAtCycles = [6,6,6,6]; 663*0fca6ea1SDimitry Andric} 664*0fca6ea1SDimitry Andric 665*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 666*0fca6ea1SDimitry Andric// Instruction Tables in IXU 667*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 668*0fca6ea1SDimitry Andric 669*0fca6ea1SDimitry Andric//--- 670*0fca6ea1SDimitry Andric// Arithmetic Instructions 671*0fca6ea1SDimitry Andric//--- 672*0fca6ea1SDimitry Andric 673*0fca6ea1SDimitry Andric//1, 1, 6 674*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345], 675*0fca6ea1SDimitry Andric (instregex "^ADD(W|X)r(i|r|x)", "^SUB(W|X)r(i|r|x)")>; 676*0fca6ea1SDimitry Andric 677*0fca6ea1SDimitry Andric//2,2,3 678*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_I012345_I012345_RC], 679*0fca6ea1SDimitry Andric (instregex "^ADD(W|X)rs", "^SUB(W|X)rs")>; 680*0fca6ea1SDimitry Andric 681*0fca6ea1SDimitry Andric//1,1,4 alias CMP, CMN on page 75 682*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123], 683*0fca6ea1SDimitry Andric (instregex "^ADDS(W|X)r(i|r|x)(64)?", "^SUBS(W|X)r(i|r|x)")>; 684*0fca6ea1SDimitry Andric 685*0fca6ea1SDimitry Andric//2,2,2 alias CMP, CMN on page 75 686*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_I0123_I0123_RC], 687*0fca6ea1SDimitry Andric (instregex "^ADDS(W|X)rs", "^SUBS(W|X)rs")>; 688*0fca6ea1SDimitry Andric 689*0fca6ea1SDimitry Andric//1,1,4 690*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123], 691*0fca6ea1SDimitry Andric (instregex "^ADC(W|X)r","^SBC(W|X)r", 692*0fca6ea1SDimitry Andric "^ADCS(W|X)r","^SBCS(W|X)r")>; 693*0fca6ea1SDimitry Andric 694*0fca6ea1SDimitry Andric//1,1,2 695*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_I01], 696*0fca6ea1SDimitry Andric (instrs ADR,ADRP)>; 697*0fca6ea1SDimitry Andric 698*0fca6ea1SDimitry Andric//1,1,4 699*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123], 700*0fca6ea1SDimitry Andric (instregex "^CSEL(W|X)r", "^CSINV(W|X)r", 701*0fca6ea1SDimitry Andric "^CSNEG(W|X)r", "^CSINC(W|X)r")>; 702*0fca6ea1SDimitry Andric 703*0fca6ea1SDimitry Andric//--- 704*0fca6ea1SDimitry Andric//Compare Instruciton 705*0fca6ea1SDimitry Andric//--- 706*0fca6ea1SDimitry Andric 707*0fca6ea1SDimitry Andric// We have CCMP, CCMN as LLVM DAG node 708*0fca6ea1SDimitry Andric// CMP is an alias of SUBS as above 709*0fca6ea1SDimitry Andric// CMN is an alias of ADDS as above 710*0fca6ea1SDimitry Andric// We also have no way to get shift compare node in LLVM 711*0fca6ea1SDimitry Andric//2,2,1.5 CMP, CMN 712*0fca6ea1SDimitry Andric 713*0fca6ea1SDimitry Andric//1,1,4 714*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123], 715*0fca6ea1SDimitry Andric (instregex "^CCMP(W|X)(i|r)", "^CCMN(W|X)(i|r)")>; 716*0fca6ea1SDimitry Andric 717*0fca6ea1SDimitry Andric//--- 718*0fca6ea1SDimitry Andric// Branch 719*0fca6ea1SDimitry Andric//--- 720*0fca6ea1SDimitry Andric 721*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_NONE], (instrs B)>; 722*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I01], (instrs BL)>; 723*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I01], 724*0fca6ea1SDimitry Andric (instrs Bcc, CBZW, CBZX, CBNZW, CBNZX, TBZW, TBZX, TBNZW, TBNZX)>; 725*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0], (instrs BR, BLR)>; 726*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0], (instrs RET)>; 727*0fca6ea1SDimitry Andric 728*0fca6ea1SDimitry Andric// 3 uOp, 1 cycle for branch, 7 cycle for Authentication, 729*0fca6ea1SDimitry Andric// 1 cycle for updating link register 730*0fca6ea1SDimitry Andric// V8.3a PAC 731*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_9Cyc_I012], 732*0fca6ea1SDimitry Andric (instrs BLRAA, BLRAAZ, BLRAB, BLRABZ, 733*0fca6ea1SDimitry Andric BRAA, BRAAZ, BRAB, BRABZ)>; 734*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_9Cyc_I012], (instrs RETAA, RETAB, ERETAA, ERETAB)>; 735*0fca6ea1SDimitry Andric 736*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_3Uops_I2], (instregex "^LDRAA", "^LDRAB")>; 737*0fca6ea1SDimitry Andric 738*0fca6ea1SDimitry Andric// Logical Instructions 739*0fca6ea1SDimitry Andric//--- 740*0fca6ea1SDimitry Andric 741*0fca6ea1SDimitry Andric//1,1,4 TST is an alias of ANDS 742*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123], 743*0fca6ea1SDimitry Andric (instregex "^ANDS(W|X)r(i|r|x)", "^BICS(W|X)r(i|r|x)")>; 744*0fca6ea1SDimitry Andric 745*0fca6ea1SDimitry Andric//2,2,2 TST shift is an alias 746*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_I0123_I0123_RC], 747*0fca6ea1SDimitry Andric (instregex "^ANDS(W|X)rs", "^BICS(W|X)rs")>; 748*0fca6ea1SDimitry Andric 749*0fca6ea1SDimitry Andric//1,1,6 750*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345], 751*0fca6ea1SDimitry Andric (instregex "^AND(W|X)r(i|r|x)", "^EOR(W|X)r(i|r|x)", 752*0fca6ea1SDimitry Andric "^ORR(W|X)r(i|r|x)", "^BIC(W|X)r(i|r|x)", 753*0fca6ea1SDimitry Andric "^EON(W|X)r(i|r|x)", "^ORN(W|X)r(i|r|x)")>; 754*0fca6ea1SDimitry Andric 755*0fca6ea1SDimitry Andric//2,2,3 756*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_I012345_I012345_RC], 757*0fca6ea1SDimitry Andric (instregex "^AND(W|X)rs", "^EOR(W|X)rs", "^ORR(W|X)rs", 758*0fca6ea1SDimitry Andric "^BIC(W|X)rs", "^EON(W|X)rs", "^ORN(W|X)rs")>; 759*0fca6ea1SDimitry Andric 760*0fca6ea1SDimitry Andric 761*0fca6ea1SDimitry Andric//--- 762*0fca6ea1SDimitry Andric// Shift Instructions 763*0fca6ea1SDimitry Andric//--- 764*0fca6ea1SDimitry Andric 765*0fca6ea1SDimitry Andric//1,1,6 766*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345], 767*0fca6ea1SDimitry Andric (instregex "^ASRV(W|X)r", "^LSLV(W|X)r", 768*0fca6ea1SDimitry Andric "^LSRV(W|X)r", "^RORV(W|X)r", 769*0fca6ea1SDimitry Andric "RMIF")>; 770*0fca6ea1SDimitry Andric 771*0fca6ea1SDimitry Andric//--- 772*0fca6ea1SDimitry Andric// Move-Data Bit-field and Sign_Extension Instructions 773*0fca6ea1SDimitry Andric//--- 774*0fca6ea1SDimitry Andric 775*0fca6ea1SDimitry Andric//1,1,6 776*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345], 777*0fca6ea1SDimitry Andric (instregex "^MOVK(W|X)i", "^MOVN(W|X)i", 778*0fca6ea1SDimitry Andric "^MOVZ(W|X)i", "^SBFM(W|X)ri", 779*0fca6ea1SDimitry Andric "^UBFM(W|X)ri", "^BFM(W|X)ri", 780*0fca6ea1SDimitry Andric "^SXT(W|B|H|X)", "^UXT(H|B)")>; 781*0fca6ea1SDimitry Andric 782*0fca6ea1SDimitry Andric// COPY instruction is an LLVM internal DAG node, needs further study 783*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345], (instrs COPY)>; 784*0fca6ea1SDimitry Andric 785*0fca6ea1SDimitry Andric//--- 786*0fca6ea1SDimitry Andric// Reverse Instructions 787*0fca6ea1SDimitry Andric//--- 788*0fca6ea1SDimitry Andric 789*0fca6ea1SDimitry Andric//1,1,6 790*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345], 791*0fca6ea1SDimitry Andric (instregex "^RBIT(W|X)r", "^REV(16|32|64)?(W|X)r")>; 792*0fca6ea1SDimitry Andric 793*0fca6ea1SDimitry Andric 794*0fca6ea1SDimitry Andric//--- 795*0fca6ea1SDimitry Andric// Flag Manipulate Instructions 796*0fca6ea1SDimitry Andric//--- 797*0fca6ea1SDimitry Andric 798*0fca6ea1SDimitry Andric//1,1,4 799*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I0123], 800*0fca6ea1SDimitry Andric (instregex "^SETF8", "^SETF16", "^CFINV")>; 801*0fca6ea1SDimitry Andric 802*0fca6ea1SDimitry Andric//--- 803*0fca6ea1SDimitry Andric// Miscellaneous Instructions 804*0fca6ea1SDimitry Andric//--- 805*0fca6ea1SDimitry Andric 806*0fca6ea1SDimitry Andric//1,1,6 807*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_I012345], 808*0fca6ea1SDimitry Andric (instregex "^CLS(W|X)r$", "^CLZ(W|X)r$", "^EXTR(W|X)rri")>; 809*0fca6ea1SDimitry Andric 810*0fca6ea1SDimitry Andric 811*0fca6ea1SDimitry Andric//--- 812*0fca6ea1SDimitry Andric// Multiply Instructions 813*0fca6ea1SDimitry Andric//--- 814*0fca6ea1SDimitry Andric 815*0fca6ea1SDimitry Andric//1,3,2 816*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_I45], 817*0fca6ea1SDimitry Andric (instregex "^MADD(W|X)rrr", "^MSUB(W|X)rrr", 818*0fca6ea1SDimitry Andric "^(S|U)MADDLrrr", "^(S|U)MSUBLrrr", 819*0fca6ea1SDimitry Andric "^(S|U)MULHrr")>; 820*0fca6ea1SDimitry Andric 821*0fca6ea1SDimitry Andric//--- 822*0fca6ea1SDimitry Andric// Divide Instructions 823*0fca6ea1SDimitry Andric//--- 824*0fca6ea1SDimitry Andric 825*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_I2_RC], 826*0fca6ea1SDimitry Andric (instregex "^(S|U)DIVWr")>; 827*0fca6ea1SDimitry Andric 828*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_9Cyc_I2_RC], 829*0fca6ea1SDimitry Andric (instregex "^(S|U)DIVXr")>; 830*0fca6ea1SDimitry Andric 831*0fca6ea1SDimitry Andric 832*0fca6ea1SDimitry Andric//--- 833*0fca6ea1SDimitry Andric// Cryptgraphy Instructions 834*0fca6ea1SDimitry Andric// 835*0fca6ea1SDimitry Andric//1,3,1 on I2 836*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_I2], 837*0fca6ea1SDimitry Andric (instregex "^CRC32(B|H|W|X)rr", "^CRC32C(B|H|W|X)rr")>; 838*0fca6ea1SDimitry Andric 839*0fca6ea1SDimitry Andric//--- 840*0fca6ea1SDimitry Andric// PAU instructions 841*0fca6ea1SDimitry Andric//--- 842*0fca6ea1SDimitry Andric 843*0fca6ea1SDimitry Andric// on p47 of IXU document, we have 7 cycles for all PAU instructions 844*0fca6ea1SDimitry Andric// here we just assume all signing and pauth instructions are 7 cycles 845*0fca6ea1SDimitry Andric// assume all are 7 cycles here 846*0fca6ea1SDimitry Andric 847*0fca6ea1SDimitry Andric// signing instrucitons 848*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_I2], (instrs PACIA, PACIB, 849*0fca6ea1SDimitry Andric PACDA, PACDB, 850*0fca6ea1SDimitry Andric PACIZA, PACIZB, 851*0fca6ea1SDimitry Andric PACDZA, PACDZB, 852*0fca6ea1SDimitry Andric PACGA)>; 853*0fca6ea1SDimitry Andric// authentication instrucitons 854*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_I2], (instrs AUTIA, AUTIB, 855*0fca6ea1SDimitry Andric AUTDA, AUTDB, 856*0fca6ea1SDimitry Andric AUTIZA, AUTIZB, 857*0fca6ea1SDimitry Andric AUTDZA, AUTDZB)>; 858*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_I2], (instrs XPACI, XPACD)>; 859*0fca6ea1SDimitry Andric 860*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 861*0fca6ea1SDimitry Andric// Instruction Tables in LSU 862*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 863*0fca6ea1SDimitry Andric 864*0fca6ea1SDimitry Andric// 4 cycle Load-to-use from L1D$ 865*0fca6ea1SDimitry Andric// Neon load with 5 cycle 866*0fca6ea1SDimitry Andric// 6 cycle to STA ? 867*0fca6ea1SDimitry Andric// STD cycle ? 868*0fca6ea1SDimitry Andric// NEON STD + 2 869*0fca6ea1SDimitry Andric 870*0fca6ea1SDimitry Andric// Load Instructions 871*0fca6ea1SDimitry Andric// FP Load Instructions 872*0fca6ea1SDimitry Andric 873*0fca6ea1SDimitry Andric// Load pair, immed pre-index, normal 874*0fca6ea1SDimitry Andric// Load pair, immed pre-index, signed words 875*0fca6ea1SDimitry Andric// Load pair, immed post-index, normal 876*0fca6ea1SDimitry Andric// Load pair, immed post-index, signed words 877*0fca6ea1SDimitry Andric// NOTE: Handled by WriteLD, WriteLDHi, WriteAdr. 878*0fca6ea1SDimitry Andric 879*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDNPDi)>; 880*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDNPQi)>; 881*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDNPSi)>; 882*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDNPWi)>; 883*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDNPXi)>; 884*0fca6ea1SDimitry Andric 885*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPDi)>; 886*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPQi)>; 887*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPSi)>; 888*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPSWi)>; 889*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPWi)>; 890*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDPXi)>; 891*0fca6ea1SDimitry Andric 892*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRBui)>; 893*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRDui)>; 894*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRHui)>; 895*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRQui)>; 896*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSui)>; 897*0fca6ea1SDimitry Andric 898*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRDl)>; 899*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRQl)>; 900*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRWl)>; 901*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRXl)>; 902*0fca6ea1SDimitry Andric 903*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRBi)>; 904*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRHi)>; 905*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRWi)>; 906*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRXi)>; 907*0fca6ea1SDimitry Andric 908*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRSBWi)>; 909*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRSBXi)>; 910*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRSHWi)>; 911*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRSHXi)>; 912*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDTRSWi)>; 913*0fca6ea1SDimitry Andric 914*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], 915*0fca6ea1SDimitry Andric (instrs LDPDpre)>; 916*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], 917*0fca6ea1SDimitry Andric (instrs LDPQpre)>; 918*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], 919*0fca6ea1SDimitry Andric (instrs LDPSpre)>; 920*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], 921*0fca6ea1SDimitry Andric (instrs LDPWpre)>; 922*0fca6ea1SDimitry Andric 923*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRBpre)>; 924*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRDpre)>; 925*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRHpre)>; 926*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRQpre)>; 927*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSpre)>; 928*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRWpre)>; 929*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRXpre)>; 930*0fca6ea1SDimitry Andric 931*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSBWpre)>; 932*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSBXpre)>; 933*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSBWpost)>; 934*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSBXpost)>; 935*0fca6ea1SDimitry Andric 936*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSHWpre)>; 937*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSHXpre)>; 938*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSHWpost)>; 939*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSHXpost)>; 940*0fca6ea1SDimitry Andric 941*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRBBpre)>; 942*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRBBpost)>; 943*0fca6ea1SDimitry Andric 944*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRHHpre)>; 945*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRHHpost)>; 946*0fca6ea1SDimitry Andric 947*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], 948*0fca6ea1SDimitry Andric (instrs LDPDpost)>; 949*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], 950*0fca6ea1SDimitry Andric (instrs LDPQpost)>; 951*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], 952*0fca6ea1SDimitry Andric (instrs LDPSpost)>; 953*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], 954*0fca6ea1SDimitry Andric (instrs LDPWpost)>; 955*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], 956*0fca6ea1SDimitry Andric (instrs LDPXpost)>; 957*0fca6ea1SDimitry Andric 958*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRBpost)>; 959*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRDpost)>; 960*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRHpost)>; 961*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRQpost)>; 962*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRSpost)>; 963*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRWpost)>; 964*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD_I012345], (instrs LDRXpost)>; 965*0fca6ea1SDimitry Andric 966*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRBroW)>; 967*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRDroW)>; 968*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRHroW)>; 969*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRHHroW)>; 970*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRQroW)>; 971*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSroW)>; 972*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSHWroW)>; 973*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSHXroW)>; 974*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRWroW)>; 975*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRXroW)>; 976*0fca6ea1SDimitry Andric 977*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRBroX)>; 978*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRDroX)>; 979*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRHHroX)>; 980*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRHroX)>; 981*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRQroX)>; 982*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSroX)>; 983*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSHWroX)>; 984*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRSHXroX)>; 985*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRWroX)>; 986*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDRXroX)>; 987*0fca6ea1SDimitry Andric 988*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURBi)>; 989*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURBBi)>; 990*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURDi)>; 991*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURHi)>; 992*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURHHi)>; 993*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURQi)>; 994*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSi)>; 995*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURXi)>; 996*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSBWi)>; 997*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSBXi)>; 998*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSHWi)>; 999*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSHXi)>; 1000*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_LD], (instrs LDURSWi)>; 1001*0fca6ea1SDimitry Andric 1002*0fca6ea1SDimitry Andric 1003*0fca6ea1SDimitry Andric 1004*0fca6ea1SDimitry Andric// Store register, immed post-index 1005*0fca6ea1SDimitry Andric// NOTE: Handled by WriteST, ReadAdrBase 1006*0fca6ea1SDimitry Andric 1007*0fca6ea1SDimitry Andric// Store register, immed pre-index 1008*0fca6ea1SDimitry Andric// NOTE: Handled by WriteST 1009*0fca6ea1SDimitry Andric 1010*0fca6ea1SDimitry Andric// Store pair, immed post-index, W-form 1011*0fca6ea1SDimitry Andric// Store pair, immed post-indx, X-form 1012*0fca6ea1SDimitry Andric// Store pair, immed pre-index, W-form 1013*0fca6ea1SDimitry Andric// Store pair, immed pre-index, X-form 1014*0fca6ea1SDimitry Andric// NOTE: Handled by WriteSTP. 1015*0fca6ea1SDimitry Andric 1016*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURBi)>; 1017*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURBBi)>; 1018*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURDi)>; 1019*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURHi)>; 1020*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURHHi)>; 1021*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURQi)>; 1022*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURSi)>; 1023*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURWi)>; 1024*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STURXi)>; 1025*0fca6ea1SDimitry Andric 1026*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STTRBi)>; 1027*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STTRHi)>; 1028*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STTRWi)>; 1029*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STTRXi)>; 1030*0fca6ea1SDimitry Andric 1031*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STNPDi)>; 1032*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STNPQi)>; 1033*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STNPXi)>; 1034*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STNPWi)>; 1035*0fca6ea1SDimitry Andric 1036*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STPDi)>; 1037*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STPQi)>; 1038*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STPXi)>; 1039*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STPWi)>; 1040*0fca6ea1SDimitry Andric 1041*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRBui)>; 1042*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRDui)>; 1043*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRHui)>; 1044*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRQui)>; 1045*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRXui)>; 1046*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], (instrs STRWui)>; 1047*0fca6ea1SDimitry Andric 1048*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1049*0fca6ea1SDimitry Andric (instrs STPDpre, STPDpost)>; 1050*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1051*0fca6ea1SDimitry Andric (instrs STPSpre, STPSpost)>; 1052*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1053*0fca6ea1SDimitry Andric (instrs STPWpre, STPWpost)>; 1054*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1055*0fca6ea1SDimitry Andric (instrs STPXpre, STPXpost)>; 1056*0fca6ea1SDimitry Andric 1057*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1058*0fca6ea1SDimitry Andric (instrs STRBpre, STRBpost)>; 1059*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1060*0fca6ea1SDimitry Andric (instrs STRBBpre, STRBBpost)>; 1061*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1062*0fca6ea1SDimitry Andric (instrs STRDpre, STRDpost)>; 1063*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1064*0fca6ea1SDimitry Andric (instrs STRHpre, STRHpost)>; 1065*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1066*0fca6ea1SDimitry Andric (instrs STRHHpre, STRHHpost)>; 1067*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1068*0fca6ea1SDimitry Andric (instrs STRQpre, STRQpost)>; 1069*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1070*0fca6ea1SDimitry Andric (instrs STRSpre, STRSpost)>; 1071*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1072*0fca6ea1SDimitry Andric (instrs STRWpre, STRWpost)>; 1073*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1074*0fca6ea1SDimitry Andric (instrs STRXpre, STRXpost)>; 1075*0fca6ea1SDimitry Andric 1076*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], 1077*0fca6ea1SDimitry Andric (instrs STRBroW, STRBroX)>; 1078*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], 1079*0fca6ea1SDimitry Andric (instrs STRDroW, STRDroX)>; 1080*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], 1081*0fca6ea1SDimitry Andric (instrs STRHroW, STRHroX)>; 1082*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], 1083*0fca6ea1SDimitry Andric (instrs STRHHroW, STRHHroX)>; 1084*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], 1085*0fca6ea1SDimitry Andric (instrs STRQroW, STRQroX)>; 1086*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], 1087*0fca6ea1SDimitry Andric (instrs STRSroW, STRSroX)>; 1088*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], 1089*0fca6ea1SDimitry Andric (instrs STRWroW, STRWroX)>; 1090*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], 1091*0fca6ea1SDimitry Andric (instrs STRXroW, STRXroX)>; 1092*0fca6ea1SDimitry Andric 1093*0fca6ea1SDimitry Andric// ASIMD Load instructions, 4 cycle access + 2 cycle NEON access 1094*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, D-form 1uOps 1095*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, Q-form 1uOps 1096*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_LD], 1097*0fca6ea1SDimitry Andric (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1098*0fca6ea1SDimitry Andric 1099*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_LD_I012345], 1100*0fca6ea1SDimitry Andric (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1101*0fca6ea1SDimitry Andric 1102*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, D-form 3 uOps 1103*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, Q-form 2 uOps 1104*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD], 1105*0fca6ea1SDimitry Andric (instregex "^LD1Twov(8b|4h|2s|1d)$")>; 1106*0fca6ea1SDimitry Andric 1107*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD], 1108*0fca6ea1SDimitry Andric (instregex "^LD1Twov(16b|8h|4s|2d)$")>; 1109*0fca6ea1SDimitry Andric 1110*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD_I012345], 1111*0fca6ea1SDimitry Andric (instregex "^LD1Twov(8b|4h|2s|1d)_POST$")>; 1112*0fca6ea1SDimitry Andric 1113*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD_I012345], 1114*0fca6ea1SDimitry Andric (instregex "^LD1Twov(16b|8h|4s|2d)_POST$")>; 1115*0fca6ea1SDimitry Andric 1116*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, D-form 4 uOps 1117*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, Q-form 3 uOps 1118*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD], 1119*0fca6ea1SDimitry Andric (instregex "^LD1Threev(8b|4h|2s|1d)$")>; 1120*0fca6ea1SDimitry Andric 1121*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD], 1122*0fca6ea1SDimitry Andric (instregex "^LD1Threev(16b|8h|4s|2d)$")>; 1123*0fca6ea1SDimitry Andric 1124*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD_I012345], 1125*0fca6ea1SDimitry Andric (instregex "^LD1Threev(8b|4h|2s|1d)_POST$")>; 1126*0fca6ea1SDimitry Andric 1127*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD_I012345], 1128*0fca6ea1SDimitry Andric (instregex "^LD1Threev(16b|8h|4s|2d)_POST$")>; 1129*0fca6ea1SDimitry Andric 1130*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, D-form 6 uOps 1131*0fca6ea1SDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, Q-form 4 uOps 1132*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD], 1133*0fca6ea1SDimitry Andric (instregex "^LD1Fourv(8b|4h|2s|1d)$")>; 1134*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD], 1135*0fca6ea1SDimitry Andric (instregex "^LD1Fourv(16b|8h|4s|2d)$")>; 1136*0fca6ea1SDimitry Andric 1137*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD_I012345], 1138*0fca6ea1SDimitry Andric (instregex "^LD1Fourv(8b|4h|2s|1d)_POST$")>; 1139*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD_I012345], 1140*0fca6ea1SDimitry Andric (instregex "^LD1Fourv(16b|8h|4s|2d)_POST$")>; 1141*0fca6ea1SDimitry Andric 1142*0fca6ea1SDimitry Andric// ASIMD load, 1 element, one lane, B/H/S 2uOps 1143*0fca6ea1SDimitry Andric// ASIMD load, 1 element, one lane, D 2UOps 1144*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD], (instregex "^LD1i(8|16|32|64)$")>; 1145*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD_I012345], 1146*0fca6ea1SDimitry Andric (instregex "^LD1i(8|16|32|64)_POST$")>; 1147*0fca6ea1SDimitry Andric 1148*0fca6ea1SDimitry Andric// ASIMD load, 1 element, all lanes, D-form, B/H/S 2uOps 1149*0fca6ea1SDimitry Andric// ASIMD load, 1 element, all lanes, D-form, D 2uOps 1150*0fca6ea1SDimitry Andric// ASIMD load, 1 element, all lanes, Q-form 2uOps 1151*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD], 1152*0fca6ea1SDimitry Andric (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1153*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_2Uops_LD_I012345], 1154*0fca6ea1SDimitry Andric (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1155*0fca6ea1SDimitry Andric 1156*0fca6ea1SDimitry Andric// ASIMD load, 2 element, multiple, D-form, B/H/S 3 uOps 1157*0fca6ea1SDimitry Andric// ASIMD load, 2 element, multiple, Q-form, D 4 uOps 1158*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD], 1159*0fca6ea1SDimitry Andric (instregex "^LD2Twov(8b|4h|2s)$")>; 1160*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD], 1161*0fca6ea1SDimitry Andric (instregex "^LD2Twov(16b|8h|4s|2d)$")>; 1162*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD_I012345], 1163*0fca6ea1SDimitry Andric (instregex "^LD2Twov(8b|4h|2s)_POST$")>; 1164*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD_I012345], 1165*0fca6ea1SDimitry Andric (instregex "^LD2Twov(16b|8h|4s|2d)_POST$")>; 1166*0fca6ea1SDimitry Andric 1167*0fca6ea1SDimitry Andric// ASIMD load, 2 element, one lane, B/H 3 uOps 1168*0fca6ea1SDimitry Andric// ASIMD load, 2 element, one lane, S 3 uOps 1169*0fca6ea1SDimitry Andric// ASIMD load, 2 element, one lane, D 3 uOps 1170*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD], (instregex "^LD2i(8|16|32|64)$")>; 1171*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD_I012345], 1172*0fca6ea1SDimitry Andric (instregex "^LD2i(8|16|32|64)_POST$")>; 1173*0fca6ea1SDimitry Andric 1174*0fca6ea1SDimitry Andric// ASIMD load, 2 element, all lanes, D-form, B/H/S 3 uOps 1175*0fca6ea1SDimitry Andric// ASIMD load, 2 element, all lanes, D-form, D 3 uOps 1176*0fca6ea1SDimitry Andric// ASIMD load, 2 element, all lanes, Q-form 3 uOps 1177*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD], 1178*0fca6ea1SDimitry Andric (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1179*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_3Uops_LD_I012345], 1180*0fca6ea1SDimitry Andric (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1181*0fca6ea1SDimitry Andric 1182*0fca6ea1SDimitry Andric// ASIMD load, 3 element, multiple, D-form, B/H/S 5 uOps 1183*0fca6ea1SDimitry Andric// ASIMD load, 3 element, multiple, Q-form, B/H/S 6 uOps 1184*0fca6ea1SDimitry Andric// ASIMD load, 3 element, multiple, Q-form, D 6 uOps 1185*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD], 1186*0fca6ea1SDimitry Andric (instregex "^LD3Threev(8b|4h|2s)$")>; 1187*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD], 1188*0fca6ea1SDimitry Andric (instregex "^LD3Threev(16b|8h|4s|2d)$")>; 1189*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD_I012345], 1190*0fca6ea1SDimitry Andric (instregex "^LD3Threev(8b|4h|2s)_POST$")>; 1191*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD_I012345], 1192*0fca6ea1SDimitry Andric (instregex "^LD3Threev(16b|8h|4s|2d)_POST$")>; 1193*0fca6ea1SDimitry Andric 1194*0fca6ea1SDimitry Andric// ASIMD load, 3 element, one lone, B/H 4 uOps 1195*0fca6ea1SDimitry Andric// ASIMD load, 3 element, one lane, S 4 uOps 1196*0fca6ea1SDimitry Andric// ASIMD load, 3 element, one lane, D 5 uOps 1197*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD], (instregex "^LD3i(8|16|32)$")>; 1198*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD], (instregex "^LD3i(64)$")>; 1199*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD_I012345], 1200*0fca6ea1SDimitry Andric (instregex "^LD3i(8|16|32)_POST$")>; 1201*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD_I012345], 1202*0fca6ea1SDimitry Andric (instregex "^LD3i(64)_POST$")>; 1203*0fca6ea1SDimitry Andric 1204*0fca6ea1SDimitry Andric// ASIMD load, 3 element, all lanes, D-form, B/H/S 4 uOps 1205*0fca6ea1SDimitry Andric// ASIMD load, 3 element, all lanes, D-form, D 5 uOps 1206*0fca6ea1SDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, B/H/S 4 uOps 1207*0fca6ea1SDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, D 5 uOps 1208*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD], 1209*0fca6ea1SDimitry Andric (instregex "^LD3Rv(8b|4h|2s|16b|8h|4s)$")>; 1210*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD], 1211*0fca6ea1SDimitry Andric (instregex "^LD3Rv(1d|2d)$")>; 1212*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_4Uops_LD_I012345], 1213*0fca6ea1SDimitry Andric (instregex "^LD3Rv(8b|4h|2s|16b|8h|4s)_POST$")>; 1214*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD_I012345], 1215*0fca6ea1SDimitry Andric (instregex "^LD3Rv(1d|2d)_POST$")>; 1216*0fca6ea1SDimitry Andric 1217*0fca6ea1SDimitry Andric// ASIMD load, 4 element, multiple, D-form, B/H/S 6 uOps 1218*0fca6ea1SDimitry Andric// ASIMD load, 4 element, multiple, Q-form, B/H/S 10 uOps 1219*0fca6ea1SDimitry Andric// ASIMD load, 4 element, multiple, Q-form, D 8 uOps 1220*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD], 1221*0fca6ea1SDimitry Andric (instregex "^LD4Fourv(8b|4h|2s)$")>; 1222*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_10Uops_LD], 1223*0fca6ea1SDimitry Andric (instregex "^LD4Fourv(16b|8h|4s)$")>; 1224*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_8Uops_LD], 1225*0fca6ea1SDimitry Andric (instregex "^LD4Fourv(2d)$")>; 1226*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD_I012345], 1227*0fca6ea1SDimitry Andric (instregex "^LD4Fourv(8b|4h|2s)_POST$")>; 1228*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_10Uops_LD_I012345], 1229*0fca6ea1SDimitry Andric (instregex "^LD4Fourv(16b|8h|4s)_POST$")>; 1230*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_8Uops_LD_I012345], 1231*0fca6ea1SDimitry Andric (instregex "^LD4Fourv(2d)_POST$")>; 1232*0fca6ea1SDimitry Andric 1233*0fca6ea1SDimitry Andric// ASIMD load, 4 element, one lane, B/H 5 uOps 1234*0fca6ea1SDimitry Andric// ASIMD load, 4 element, one lane, S 5 uOps 1235*0fca6ea1SDimitry Andric// ASIMD load, 4 element, one lane, D 6 uOps 1236*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD], (instregex "^LD4i(8|16|32)$")>; 1237*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD], (instregex "^LD4i(64)$")>; 1238*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD_I012345], 1239*0fca6ea1SDimitry Andric (instregex "^LD4i(8|16|32)_POST$")>; 1240*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD_I012345], 1241*0fca6ea1SDimitry Andric (instregex "^LD4i(64)_POST$")>; 1242*0fca6ea1SDimitry Andric 1243*0fca6ea1SDimitry Andric// ASIMD load, 4 element, all lanes, D-form, B/H/S 5 uOps 1244*0fca6ea1SDimitry Andric// ASIMD load, 4 element, all lanes, D-form, D 6 uOps 1245*0fca6ea1SDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, B/H/S 5 uOps 1246*0fca6ea1SDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, D 6 uOps 1247*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD], 1248*0fca6ea1SDimitry Andric (instregex "^LD4Rv(8b|4h|2s|16b|8h|4s)$")>; 1249*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD], 1250*0fca6ea1SDimitry Andric (instregex "^LD4Rv(1d|2d)$")>; 1251*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_5Uops_LD_I012345], 1252*0fca6ea1SDimitry Andric (instregex "^LD4Rv(8b|4h|2s|16b|8h|4s)_POST$")>; 1253*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_6Uops_LD_I012345], 1254*0fca6ea1SDimitry Andric (instregex "^LD4Rv(1d|2d)_POST$")>; 1255*0fca6ea1SDimitry Andric 1256*0fca6ea1SDimitry Andric// ASIMD Store Instructions 1257*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, D-form 1 uOps 1258*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, Q-form 1 uops 1259*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST], 1260*0fca6ea1SDimitry Andric (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1261*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_ST_I012345], 1262*0fca6ea1SDimitry Andric (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1263*0fca6ea1SDimitry Andric 1264*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, D-form 2 uOps 1265*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, Q-form 2 uOps 1266*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST], 1267*0fca6ea1SDimitry Andric (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1268*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST_I012345], 1269*0fca6ea1SDimitry Andric (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1270*0fca6ea1SDimitry Andric 1271*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, D-form 3 uOps 1272*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, Q-form 3 uOps 1273*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_3Uops_ST], 1274*0fca6ea1SDimitry Andric (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1275*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_3Uops_ST_I012345], 1276*0fca6ea1SDimitry Andric (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1277*0fca6ea1SDimitry Andric 1278*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, D-form 4 uOps 1279*0fca6ea1SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, Q-form 4 uOps 1280*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST], 1281*0fca6ea1SDimitry Andric (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1282*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST_I012345], 1283*0fca6ea1SDimitry Andric (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1284*0fca6ea1SDimitry Andric 1285*0fca6ea1SDimitry Andric// ASIMD store, 1 element, one lane, B/H/S 2 uOps 1286*0fca6ea1SDimitry Andric// ASIMD store, 1 element, one lane, D 2 uOps 1287*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST], 1288*0fca6ea1SDimitry Andric (instregex "^ST1i(8|16|32|64)$")>; 1289*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST_I012345], 1290*0fca6ea1SDimitry Andric (instregex "^ST1i(8|16|32|64)_POST$")>; 1291*0fca6ea1SDimitry Andric 1292*0fca6ea1SDimitry Andric// ASIMD store, 2 element, multiple, D-form, B/H/S 2 uOps 1293*0fca6ea1SDimitry Andric// ASIMD store, 2 element, multiple, Q-form, B/H/S 4 uOps 1294*0fca6ea1SDimitry Andric// ASIMD store, 2 element, multiple, Q-form, D 4 uOps 1295*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST], 1296*0fca6ea1SDimitry Andric (instregex "^ST2Twov(8b|4h|2s)$")>; 1297*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST], 1298*0fca6ea1SDimitry Andric (instregex "^ST2Twov(16b|8h|4s|2d)$")>; 1299*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST_I012345], 1300*0fca6ea1SDimitry Andric (instregex "^ST2Twov(8b|4h|2s)_POST$")>; 1301*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST_I012345], 1302*0fca6ea1SDimitry Andric (instregex "^ST2Twov(16b|8h|4s|2d)_POST$")>; 1303*0fca6ea1SDimitry Andric 1304*0fca6ea1SDimitry Andric// ASIMD store, 2 element, one lane, B/H/S 2 uOps 1305*0fca6ea1SDimitry Andric// ASIMD store, 2 element, one lane, D 2 uOps 1306*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST], 1307*0fca6ea1SDimitry Andric (instregex "^ST2i(8|16|32|64)$")>; 1308*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST_I012345], 1309*0fca6ea1SDimitry Andric (instregex "^ST2i(8|16|32|64)_POST$")>; 1310*0fca6ea1SDimitry Andric 1311*0fca6ea1SDimitry Andric// ASIMD store, 3 element, multiple, D-form, B/H/S 4 uOps 1312*0fca6ea1SDimitry Andric// ASIMD store, 3 element, multiple, Q-form, B/H/S 6 uOps 1313*0fca6ea1SDimitry Andric// ASIMD store, 3 element, multiple, Q-form, D 6 uOps 1314*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST], 1315*0fca6ea1SDimitry Andric (instregex "^ST3Threev(8b|4h|2s)$")>; 1316*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_6Uops_ST], 1317*0fca6ea1SDimitry Andric (instregex "^ST3Threev(16b|8h|4s|2d)$")>; 1318*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST_I012345], 1319*0fca6ea1SDimitry Andric (instregex "^ST3Threev(8b|4h|2s)_POST$")>; 1320*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_6Uops_ST_I012345], 1321*0fca6ea1SDimitry Andric (instregex "^ST3Threev(16b|8h|4s|2d)_POST$")>; 1322*0fca6ea1SDimitry Andric 1323*0fca6ea1SDimitry Andric// ASIMD store, 3 element, one lane, B/H 2 uOps 1324*0fca6ea1SDimitry Andric// ASIMD store, 3 element, one lane, S 2 uOps 1325*0fca6ea1SDimitry Andric// ASIMD store, 3 element, one lane, D 4 uOps 1326*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST], (instregex "^ST3i(8|16|32)$")>; 1327*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST], (instregex "^ST3i(64)$")>; 1328*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_2Uops_ST_I012345], 1329*0fca6ea1SDimitry Andric (instregex "^ST3i(8|16|32)_POST$")>; 1330*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST_I012345], 1331*0fca6ea1SDimitry Andric (instregex "^ST3i(64)_POST$")>; 1332*0fca6ea1SDimitry Andric 1333*0fca6ea1SDimitry Andric 1334*0fca6ea1SDimitry Andric// ASIMD store, 4 element, multiple, D-form, B/H/S 5 uOps 1335*0fca6ea1SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, B/H/S 10 uOps 1336*0fca6ea1SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, D 8 uOps 1337*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_5Uops_ST], 1338*0fca6ea1SDimitry Andric (instregex "^ST4Fourv(8b|4h|2s)$")>; 1339*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_10Uops_ST], 1340*0fca6ea1SDimitry Andric (instregex "^ST4Fourv(16b|8h|4s)$")>; 1341*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_8Uops_ST], 1342*0fca6ea1SDimitry Andric (instregex "^ST4Fourv(2d)$")>; 1343*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_5Uops_ST_I012345], 1344*0fca6ea1SDimitry Andric (instregex "^ST4Fourv(8b|4h|2s)_POST$")>; 1345*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_10Uops_ST_I012345], 1346*0fca6ea1SDimitry Andric (instregex "^ST4Fourv(16b|8h|4s)_POST$")>; 1347*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_8Uops_ST_I012345], 1348*0fca6ea1SDimitry Andric (instregex "^ST4Fourv(2d)_POST$")>; 1349*0fca6ea1SDimitry Andric 1350*0fca6ea1SDimitry Andric// ASIMD store, 4 element, one lane, B/H 3 uOps 1351*0fca6ea1SDimitry Andric// ASIMD store, 4 element, one lane, S 3 uOps 1352*0fca6ea1SDimitry Andric// ASIMD store, 4 element, one lane, D 4 uOps 1353*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_3Uops_ST], (instregex "^ST4i(8|16|32)$")>; 1354*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST], (instregex "^ST4i(64)$")>; 1355*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_3Uops_ST_I012345], 1356*0fca6ea1SDimitry Andric (instregex "^ST4i(8|16|32)_POST$")>; 1357*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_1Cyc_4Uops_ST_I012345], 1358*0fca6ea1SDimitry Andric (instregex "^ST4i(64)_POST$")>; 1359*0fca6ea1SDimitry Andric 1360*0fca6ea1SDimitry Andric 1361*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1362*0fca6ea1SDimitry Andric// Instruction Tables in VXU 1363*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1364*0fca6ea1SDimitry Andric// all uOps are not clearly written in the VXU document 1365*0fca6ea1SDimitry Andric 1366*0fca6ea1SDimitry Andric// I2V 1367*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_I2V_4Cyc_I45], (instregex "^FMOV[HSD][WX]r", "^FMOVDXHighr")>; 1368*0fca6ea1SDimitry Andric 1369*0fca6ea1SDimitry Andric// I2V with convert 1370*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_I2V_7Cyc_I45], (instregex "^[SU]CVTF[SU][XW][HSD]ri")>; 1371*0fca6ea1SDimitry Andric 1372*0fca6ea1SDimitry Andric// V2I 1373*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2I_3Cyc_FP01], (instregex "^FMOV[WX][HSD]r", "FMOVXDHighr")>; 1374*0fca6ea1SDimitry Andric 1375*0fca6ea1SDimitry Andric// V2I with convert 2nd [SU] necessary? 1376*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2I_6Cyc_FP01], (instregex "^FCVT[AMNPZ][SU][SU][XW][HSD]r")>; 1377*0fca6ea1SDimitry Andric 1378*0fca6ea1SDimitry Andric// float to float move immediate, row 7 in big chart 1379*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2V_2Cyc_FP0123], (instregex "^FMOV[HSD]r")>; 1380*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2V_2Cyc_FP0123], (instregex "^FMOV[HSD]i")>; 1381*0fca6ea1SDimitry Andric 1382*0fca6ea1SDimitry Andric// float to float conversion within VXU, precision conversion 1383*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2V_6Cyc_FP01], (instregex "^FJCVTZS")>; 1384*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_V2V_3Cyc_FP0123], (instregex "^FCVT[HSD][HSD]r", 1385*0fca6ea1SDimitry Andric "^FRINT(A|I|M|N|P|X|Z)(Sr|Dr)")>; 1386*0fca6ea1SDimitry Andric 1387*0fca6ea1SDimitry Andric// floating comparison write to NZCV 1388*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP01], (instregex "^FCMP(E)?[HSD]r[ir]")>; 1389*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP01], (instregex "^FCCMP(E)?[HSD]rr")>; 1390*0fca6ea1SDimitry Andric 1391*0fca6ea1SDimitry Andric// floating point conditional select 1392*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^FCSEL")>; 1393*0fca6ea1SDimitry Andric 1394*0fca6ea1SDimitry Andric// floating multiply-add 1395*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123], (instregex "^(F|FN)MADD", "^(F|FN)MSUB")>; 1396*0fca6ea1SDimitry Andric 1397*0fca6ea1SDimitry Andric// floating unary, cycle/throughput? xls row14 1398*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^F(ABS|NEG)[SD]r")>; 1399*0fca6ea1SDimitry Andric 1400*0fca6ea1SDimitry Andric//floating division/square root 1401*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_FP3], (instregex "^FDIVHrr")>; 1402*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_8Cyc_FP3], (instregex "^FDIVSrr")>; 1403*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_10Cyc_FP3], (instregex "^FDIVDrr")>; 1404*0fca6ea1SDimitry Andric 1405*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_8Cyc_FP3_RC], (instregex "^FSQRTHr")>; 1406*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_10Cyc_FP3_RC], (instregex "^FSQRTSr")>; 1407*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_13Cyc_FP3_RC], (instregex "^FSQRTDr")>; 1408*0fca6ea1SDimitry Andric 1409*0fca6ea1SDimitry Andric//========== 1410*0fca6ea1SDimitry Andric// SIMD move instructions 1411*0fca6ea1SDimitry Andric//========== 1412*0fca6ea1SDimitry Andric 1413*0fca6ea1SDimitry Andric// ASIMD DUP element 1414*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^DUPv.+lane")>; 1415*0fca6ea1SDimitry Andric// ASIMD DUP general thoughput undecided, 3? FP0123 1416*0fca6ea1SDimitry Andric// VXU doc, p42, 2 uOps 1417*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_2Uops_FP0123], (instregex "^DUPv.+gpr")>; 1418*0fca6ea1SDimitry Andric 1419*0fca6ea1SDimitry Andric// ASIMD insert, element to element 1420*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^INSv.+lane")>; 1421*0fca6ea1SDimitry Andric// ASIMD insert, gen reg 3? FP0123? 1422*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_2Uops_FP0123], (instregex "^INSv.+gpr")>; 1423*0fca6ea1SDimitry Andric 1424*0fca6ea1SDimitry Andric// ASIMD move, FP immed 1425*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^FMOVv")>; 1426*0fca6ea1SDimitry Andric 1427*0fca6ea1SDimitry Andric// ASIMD transfer, element to gen reg 1428*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^[SU]MOVv")>; 1429*0fca6ea1SDimitry Andric 1430*0fca6ea1SDimitry Andric//========== 1431*0fca6ea1SDimitry Andric// SIMD arithmetic instructions 1432*0fca6ea1SDimitry Andric//========== 1433*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^ADDv", "^SUBv", 1434*0fca6ea1SDimitry Andric "^BIFv", "^BITv", "^BSLv", 1435*0fca6ea1SDimitry Andric "^ANDv", "^BICv", "^EORv", 1436*0fca6ea1SDimitry Andric "^ORRv", "^ORNv")>; 1437*0fca6ea1SDimitry Andric 1438*0fca6ea1SDimitry Andric 1439*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^FABDv", "^FADDv", "^FSUBv")>; 1440*0fca6ea1SDimitry Andric 1441*0fca6ea1SDimitry Andric// floating division 1442*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_6Cyc_FP3], (instregex "^FDIVv.*16$")>; 1443*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_7Cyc_FP3], (instregex "^FDIVv.*32$")>; 1444*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_9Cyc_FP3], (instregex "^FDIVv.*64$")>; 1445*0fca6ea1SDimitry Andric 1446*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123], (instregex "^FMUL(X)?v", 1447*0fca6ea1SDimitry Andric "^FRECPSv", "^FRSQRTSv")>; 1448*0fca6ea1SDimitry Andric 1449*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^MLAv","^MLSv", "^MULv", 1450*0fca6ea1SDimitry Andric "^PMULv", "UABAv")>; 1451*0fca6ea1SDimitry Andric 1452*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "SABAv", "SABDv", 1453*0fca6ea1SDimitry Andric "^(SH|UH)(ADD|SUB)v", 1454*0fca6ea1SDimitry Andric "^S(MAX|MIN)v", 1455*0fca6ea1SDimitry Andric "^(SQ|UQ)(ADD|SUB)v", 1456*0fca6ea1SDimitry Andric "^(SQ|SQR|UQ|UQR)SHLv", 1457*0fca6ea1SDimitry Andric "^(SR|UR)HADDv", 1458*0fca6ea1SDimitry Andric "^(SR|UR)SHLv", 1459*0fca6ea1SDimitry Andric "^UABDv", 1460*0fca6ea1SDimitry Andric "^U(MAX|MIN)v")>; 1461*0fca6ea1SDimitry Andric// IMAX or UMAX in the above line 1462*0fca6ea1SDimitry Andric//========== 1463*0fca6ea1SDimitry Andric// SIMD compare instructions 1464*0fca6ea1SDimitry Andric//========== 1465*0fca6ea1SDimitry Andric 1466*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^CMEQv","^CMGEv","^CMGTv", 1467*0fca6ea1SDimitry Andric "^CMLEv","^CMLTv", "^CMHIv", 1468*0fca6ea1SDimitry Andric "^CMHSv", 1469*0fca6ea1SDimitry Andric "^FCMEQv", "^FCMGEv", 1470*0fca6ea1SDimitry Andric "^FCMGTv", "^FCMLEv", 1471*0fca6ea1SDimitry Andric "^FCMLTv", 1472*0fca6ea1SDimitry Andric "^FACGEv", "^FACGTv")>; 1473*0fca6ea1SDimitry Andric 1474*0fca6ea1SDimitry Andric//========== 1475*0fca6ea1SDimitry Andric// SIMD widening and narrowing arithmetic instructions 1476*0fca6ea1SDimitry Andric//========== 1477*0fca6ea1SDimitry Andric// NO need to list ADDHN2, RADDHN2, RSUBHN2 as they are not distinguished 1478*0fca6ea1SDimitry Andric// from ADDHN, RADDHN, RSUBHN in td file(v16i8, v8i16, v4i32). 1479*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^ADDHNv", 1480*0fca6ea1SDimitry Andric "^SUBHNv", 1481*0fca6ea1SDimitry Andric "^RADDHNv", 1482*0fca6ea1SDimitry Andric "^RSUBHNv", 1483*0fca6ea1SDimitry Andric "^SABD(L|L2)v", "^UABD(L|L2)v", 1484*0fca6ea1SDimitry Andric "^(S|U)(ADD|SUB)(L|L2|W|W2)v")>; 1485*0fca6ea1SDimitry Andric 1486*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^PMUL(L|L2)v","^SABA(L|L2)v", 1487*0fca6ea1SDimitry Andric "^(S|U|SQ)(MLA|MSL|MUL)(L|L2)v")>; 1488*0fca6ea1SDimitry Andric 1489*0fca6ea1SDimitry Andric//========== 1490*0fca6ea1SDimitry Andric// SIMD unary arithmetic instructions 1491*0fca6ea1SDimitry Andric//========== 1492*0fca6ea1SDimitry Andric//^MVNv is an alias of ^NOTv 1493*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^ABSv", "^CLSv","^CLZv", "^CNTv", 1494*0fca6ea1SDimitry Andric "^NEGv", "^NOTv", 1495*0fca6ea1SDimitry Andric "^RBITv", "^REV(16|32|64)v", 1496*0fca6ea1SDimitry Andric "^SQ(ABS|NEG)v", "^SQ(XT|XTU)(N|N2)v", 1497*0fca6ea1SDimitry Andric "^(SU|US)QADDv", 1498*0fca6ea1SDimitry Andric "^UQXT(N|N2)v", "^XTN2?v")>; 1499*0fca6ea1SDimitry Andric 1500*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^FCVT(L|L2|N|N2|XN|XN2)v", 1501*0fca6ea1SDimitry Andric "^FRINT[AIMNPXZ]v", 1502*0fca6ea1SDimitry Andric "^FRSQRTEv", 1503*0fca6ea1SDimitry Andric "^(S|U)ADALPv", 1504*0fca6ea1SDimitry Andric "^(S|U)ADDLPv")>; 1505*0fca6ea1SDimitry Andric 1506*0fca6ea1SDimitry Andric 1507*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0], (instregex "^URECPEv", "^URSQRTEv", 1508*0fca6ea1SDimitry Andric "^FRECPEv", "^FRECPXv")>; 1509*0fca6ea1SDimitry Andric 1510*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_8Cyc_FP3_RC], (instregex "^FSQRTv.*16$")>; 1511*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_10Cyc_FP3_RC], (instregex "^FSQRTv.*32$")>; 1512*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_13Cyc_FP3_RC], (instregex "^FSQRTv.*64$")>; 1513*0fca6ea1SDimitry Andric 1514*0fca6ea1SDimitry Andric//========== 1515*0fca6ea1SDimitry Andric// SIMD binary elememt arithmetic instructions 1516*0fca6ea1SDimitry Andric//========== 1517*0fca6ea1SDimitry Andric 1518*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123], (instregex "^FMLAv", "^FMLSv")>; 1519*0fca6ea1SDimitry Andric 1520*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^SQDMULHv", 1521*0fca6ea1SDimitry Andric "^SQRD(MLA|MLS|MUL)Hv")>; 1522*0fca6ea1SDimitry Andric 1523*0fca6ea1SDimitry Andric//========== 1524*0fca6ea1SDimitry Andric// SIMD permute instructions 1525*0fca6ea1SDimitry Andric//========== 1526*0fca6ea1SDimitry Andric 1527*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^EXTv", "^TRN(1|2)v", 1528*0fca6ea1SDimitry Andric "^UZP(1|2)v", "^ZIP(1|2)v")>; 1529*0fca6ea1SDimitry Andric 1530*0fca6ea1SDimitry Andric//========== 1531*0fca6ea1SDimitry Andric// SIMD immediate instructions 1532*0fca6ea1SDimitry Andric//========== 1533*0fca6ea1SDimitry Andric 1534*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^MOVIv", "^MVNIv")>; 1535*0fca6ea1SDimitry Andric 1536*0fca6ea1SDimitry Andric//========== 1537*0fca6ea1SDimitry Andric// SIMD shift(immediate) instructions 1538*0fca6ea1SDimitry Andric//========== 1539*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^RSHR(N|N2)v", "^SHLv", 1540*0fca6ea1SDimitry Andric "^(SHL|SHR)(N|N2)v", 1541*0fca6ea1SDimitry Andric "^SLIv", 1542*0fca6ea1SDimitry Andric "^(SQ|SQR)SHR(U)?(N|N2)v", 1543*0fca6ea1SDimitry Andric "^(UQ|UQR)SHR(N|N2)v", 1544*0fca6ea1SDimitry Andric "^SQSHLUv", 1545*0fca6ea1SDimitry Andric "^SRIv", 1546*0fca6ea1SDimitry Andric "^(S|SR|U|UR)SHRv", 1547*0fca6ea1SDimitry Andric "^(S|SR|U|UR)SRAv", 1548*0fca6ea1SDimitry Andric "^(S|U)SHL(L|L2)v")>; 1549*0fca6ea1SDimitry Andric 1550*0fca6ea1SDimitry Andric//========== 1551*0fca6ea1SDimitry Andric// SIMD floating-point and integer conversion instructions 1552*0fca6ea1SDimitry Andric//========== 1553*0fca6ea1SDimitry Andric// same as above conversion 1554*0fca6ea1SDimitry Andric 1555*0fca6ea1SDimitry Andric//========== 1556*0fca6ea1SDimitry Andric// SIMD reduce (acoss vector lanes) instructions 1557*0fca6ea1SDimitry Andric//========== 1558*0fca6ea1SDimitry Andric 1559*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^ADDVv", 1560*0fca6ea1SDimitry Andric "^(FMAX|FMIN)(V|NMV)v", 1561*0fca6ea1SDimitry Andric "^(S|U)ADDLVv", 1562*0fca6ea1SDimitry Andric "^(S|U)(MAX|MIN)Vv")>; 1563*0fca6ea1SDimitry Andric//========== 1564*0fca6ea1SDimitry Andric// SIMD pairwise arithmetic instructions 1565*0fca6ea1SDimitry Andric//========== 1566*0fca6ea1SDimitry Andric 1567*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^ADDPv", "^FADDPv", 1568*0fca6ea1SDimitry Andric "^(FMAX|FMIN)(NMP|P)v", 1569*0fca6ea1SDimitry Andric "^(S|U)(MIN|MAX)Pv")>; 1570*0fca6ea1SDimitry Andric//========== 1571*0fca6ea1SDimitry Andric// SIMD dot prodcut instructions 1572*0fca6ea1SDimitry Andric//========== 1573*0fca6ea1SDimitry Andric 1574*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^(U|S)DOTv")>; 1575*0fca6ea1SDimitry Andric 1576*0fca6ea1SDimitry Andric//========== 1577*0fca6ea1SDimitry Andric// SIMD table lookup instructions 1578*0fca6ea1SDimitry Andric//========== 1579*0fca6ea1SDimitry Andric// TBL 1-reg/2-reg; TBX 1-reg, 1uOp, throughput=4 latency=2 1580*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instrs TBLv8i8One, TBLv16i8One, 1581*0fca6ea1SDimitry Andric TBXv8i8One, TBXv16i8One, 1582*0fca6ea1SDimitry Andric TBLv8i8Two, TBLv16i8Two)>; 1583*0fca6ea1SDimitry Andric 1584*0fca6ea1SDimitry Andric// TBL 3-reg/4-reg, 3uops, throughtput=4/3=1.33 latency=4 1585*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123_FP0123_FP0123_RC], 1586*0fca6ea1SDimitry Andric (instrs TBLv8i8Three, TBLv16i8Three, 1587*0fca6ea1SDimitry Andric TBLv8i8Four, TBLv16i8Four)>; 1588*0fca6ea1SDimitry Andric 1589*0fca6ea1SDimitry Andric 1590*0fca6ea1SDimitry Andric// TBX 2-reg 2 uOps, throughput=2 latency=4 1591*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123_FP0123_RC], (instrs TBXv8i8Two, TBXv16i8Two)>; 1592*0fca6ea1SDimitry Andric 1593*0fca6ea1SDimitry Andric// TBX 3-reg/4-reg, 4uOps, throughput=1, latency=6 1594*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_6Cyc_FP0123_FP0123_FP0123_FP0123_RC], 1595*0fca6ea1SDimitry Andric (instrs TBXv8i8Three, TBXv16i8Three, 1596*0fca6ea1SDimitry Andric TBXv8i8Four, TBXv16i8Four)>; 1597*0fca6ea1SDimitry Andric 1598*0fca6ea1SDimitry Andric 1599*0fca6ea1SDimitry Andric//========== 1600*0fca6ea1SDimitry Andric// SIMD complex number arithmetic instructions 1601*0fca6ea1SDimitry Andric//========== 1602*0fca6ea1SDimitry Andric 1603*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123], (instregex "^FCADDv", "^FCMLAv")>; 1604*0fca6ea1SDimitry Andric 1605*0fca6ea1SDimitry Andric//========== 1606*0fca6ea1SDimitry Andric// SIMD cryptographic instructions 1607*0fca6ea1SDimitry Andric//========== 1608*0fca6ea1SDimitry Andric// 3,4 on IMLA, CRYP 1609*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^AES[DE]", 1610*0fca6ea1SDimitry Andric "^SM3(TT1|TT2)(A|B)")>; 1611*0fca6ea1SDimitry Andric 1612*0fca6ea1SDimitry Andric// 2,4 on CRYP 1613*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP0123], (instregex "^AESI?MC", 1614*0fca6ea1SDimitry Andric "^EOR3", 1615*0fca6ea1SDimitry Andric "^RAX1", 1616*0fca6ea1SDimitry Andric "^XAR", 1617*0fca6ea1SDimitry Andric "^BCAX", 1618*0fca6ea1SDimitry Andric "^SM3SS1", 1619*0fca6ea1SDimitry Andric "^SM3PART(W1|W2)")>; 1620*0fca6ea1SDimitry Andric// 5,1 on CRYP 1621*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_5Cyc_FP1], (instregex "^SM4E", 1622*0fca6ea1SDimitry Andric "^SM4EKEY")>; 1623*0fca6ea1SDimitry Andric 1624*0fca6ea1SDimitry Andric// 2,1 on CRYP 1625*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_2Cyc_FP1], (instregex "^SHA1(H|SU0|SU1)", 1626*0fca6ea1SDimitry Andric "^SHA256SU0", 1627*0fca6ea1SDimitry Andric "^SHA512(SU0|SU1)")>; 1628*0fca6ea1SDimitry Andric 1629*0fca6ea1SDimitry Andric// 3,1 on CRYP 1630*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP1], (instregex "^SHA256SU1", 1631*0fca6ea1SDimitry Andric "^SHA512(H|H2)")>; 1632*0fca6ea1SDimitry Andric 1633*0fca6ea1SDimitry Andric// 4,0.25 on CRYP 1634*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP1_RC4], (instregex "^SHA1(C|P|M)", 1635*0fca6ea1SDimitry Andric "^SHA256(H|H2)")>; 1636*0fca6ea1SDimitry Andric 1637*0fca6ea1SDimitry Andric//========== 1638*0fca6ea1SDimitry Andric// SIMD v8.6 instructions 1639*0fca6ea1SDimitry Andric//========== 1640*0fca6ea1SDimitry Andric// 4,2 on IMLA 1641*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123_RC], (instregex "^(S|U|US)MMLA$")>; 1642*0fca6ea1SDimitry Andric 1643*0fca6ea1SDimitry Andric// 4,0.5 on IMLA 1644*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_8Cyc_FP0123_RC], (instregex "^BFMMLA$")>; 1645*0fca6ea1SDimitry Andric 1646*0fca6ea1SDimitry Andric// 4,0.5 on IMLA 1647*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_8Cyc_FP0123_RC], (instregex "^BFMLAL(B|T)")>; 1648*0fca6ea1SDimitry Andric 1649*0fca6ea1SDimitry Andric// 3,4 1650*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^(US|SU)DOTv")>; 1651*0fca6ea1SDimitry Andric 1652*0fca6ea1SDimitry Andric// 3,1 1653*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_4Cyc_FP0123], (instregex "^BF(16)?DOTv")>; 1654*0fca6ea1SDimitry Andric 1655*0fca6ea1SDimitry Andric// 3,4 1656*0fca6ea1SDimitry Andricdef : InstRW<[ORYONWrite_3Cyc_FP0123], (instregex "^BFCVT(N|N2)?$")>; 1657*0fca6ea1SDimitry Andric 1658*0fca6ea1SDimitry Andric 1659*0fca6ea1SDimitry Andric} // SchedModel = OryonModel 1660