1*9880d681SAndroid Build Coastguard Worker//=- AArch64SchedCyclone.td - Cyclone Scheduling Definitions -*- tablegen -*-=// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file defines the machine model for AArch64 Cyclone to support 11*9880d681SAndroid Build Coastguard Worker// instruction scheduling and other instruction cost heuristics. 12*9880d681SAndroid Build Coastguard Worker// 13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdef CycloneModel : SchedMachineModel { 16*9880d681SAndroid Build Coastguard Worker let IssueWidth = 6; // 6 micro-ops are dispatched per cycle. 17*9880d681SAndroid Build Coastguard Worker let MicroOpBufferSize = 192; // Based on the reorder buffer. 18*9880d681SAndroid Build Coastguard Worker let LoadLatency = 4; // Optimistic load latency. 19*9880d681SAndroid Build Coastguard Worker let MispredictPenalty = 16; // 14-19 cycles are typical. 20*9880d681SAndroid Build Coastguard Worker let CompleteModel = 1; 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 24*9880d681SAndroid Build Coastguard Worker// Define each kind of processor resource and number available on Cyclone. 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker// 4 integer pipes 27*9880d681SAndroid Build Coastguard Workerdef CyUnitI : ProcResource<4> { 28*9880d681SAndroid Build Coastguard Worker let BufferSize = 48; 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker// 2 branch units: I[0..1] 32*9880d681SAndroid Build Coastguard Workerdef CyUnitB : ProcResource<2> { 33*9880d681SAndroid Build Coastguard Worker let Super = CyUnitI; 34*9880d681SAndroid Build Coastguard Worker let BufferSize = 24; 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker// 1 indirect-branch unit: I[0] 38*9880d681SAndroid Build Coastguard Workerdef CyUnitBR : ProcResource<1> { 39*9880d681SAndroid Build Coastguard Worker let Super = CyUnitB; 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker// 2 shifter pipes: I[2..3] 43*9880d681SAndroid Build Coastguard Worker// When an instruction consumes a CyUnitIS, it also consumes a CyUnitI 44*9880d681SAndroid Build Coastguard Workerdef CyUnitIS : ProcResource<2> { 45*9880d681SAndroid Build Coastguard Worker let Super = CyUnitI; 46*9880d681SAndroid Build Coastguard Worker let BufferSize = 24; 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker// 1 mul pipe: I[0] 50*9880d681SAndroid Build Coastguard Workerdef CyUnitIM : ProcResource<1> { 51*9880d681SAndroid Build Coastguard Worker let Super = CyUnitBR; 52*9880d681SAndroid Build Coastguard Worker let BufferSize = 32; 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker// 1 div pipe: I[1] 56*9880d681SAndroid Build Coastguard Workerdef CyUnitID : ProcResource<1> { 57*9880d681SAndroid Build Coastguard Worker let Super = CyUnitB; 58*9880d681SAndroid Build Coastguard Worker let BufferSize = 16; 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker// 1 integer division unit. This is driven by the ID pipe, but only 62*9880d681SAndroid Build Coastguard Worker// consumes the pipe for one cycle at issue and another cycle at writeback. 63*9880d681SAndroid Build Coastguard Workerdef CyUnitIntDiv : ProcResource<1>; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker// 2 ld/st pipes. 66*9880d681SAndroid Build Coastguard Workerdef CyUnitLS : ProcResource<2> { 67*9880d681SAndroid Build Coastguard Worker let BufferSize = 28; 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker// 3 fp/vector pipes. 71*9880d681SAndroid Build Coastguard Workerdef CyUnitV : ProcResource<3> { 72*9880d681SAndroid Build Coastguard Worker let BufferSize = 48; 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker// 2 fp/vector arithmetic and multiply pipes: V[0-1] 75*9880d681SAndroid Build Coastguard Workerdef CyUnitVM : ProcResource<2> { 76*9880d681SAndroid Build Coastguard Worker let Super = CyUnitV; 77*9880d681SAndroid Build Coastguard Worker let BufferSize = 32; 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker// 1 fp/vector division/sqrt pipe: V[2] 80*9880d681SAndroid Build Coastguard Workerdef CyUnitVD : ProcResource<1> { 81*9880d681SAndroid Build Coastguard Worker let Super = CyUnitV; 82*9880d681SAndroid Build Coastguard Worker let BufferSize = 16; 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker// 1 fp compare pipe: V[0] 85*9880d681SAndroid Build Coastguard Workerdef CyUnitVC : ProcResource<1> { 86*9880d681SAndroid Build Coastguard Worker let Super = CyUnitVM; 87*9880d681SAndroid Build Coastguard Worker let BufferSize = 16; 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker// 2 fp division/square-root units. These are driven by the VD pipe, 91*9880d681SAndroid Build Coastguard Worker// but only consume the pipe for one cycle at issue and a cycle at writeback. 92*9880d681SAndroid Build Coastguard Workerdef CyUnitFloatDiv : ProcResource<2>; 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 95*9880d681SAndroid Build Coastguard Worker// Define scheduler read/write resources and latency on Cyclone. 96*9880d681SAndroid Build Coastguard Worker// This mirrors sections 7.7-7.9 of the Tuning Guide v1.0.1. 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerlet SchedModel = CycloneModel in { 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker//--- 101*9880d681SAndroid Build Coastguard Worker// 7.8.1. Moves 102*9880d681SAndroid Build Coastguard Worker//--- 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker// A single nop micro-op (uX). 105*9880d681SAndroid Build Coastguard Workerdef WriteX : SchedWriteRes<[]> { let Latency = 0; } 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker// Move zero is a register rename (to machine register zero). 108*9880d681SAndroid Build Coastguard Worker// The move is replaced by a single nop micro-op. 109*9880d681SAndroid Build Coastguard Worker// MOVZ Rd, #0 110*9880d681SAndroid Build Coastguard Worker// AND Rd, Rzr, #imm 111*9880d681SAndroid Build Coastguard Workerdef WriteZPred : SchedPredicate<[{TII->isGPRZero(*MI)}]>; 112*9880d681SAndroid Build Coastguard Workerdef WriteImmZ : SchedWriteVariant<[ 113*9880d681SAndroid Build Coastguard Worker SchedVar<WriteZPred, [WriteX]>, 114*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [WriteImm]>]>; 115*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteImmZ], (instrs MOVZWi,MOVZXi,ANDWri,ANDXri)>; 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker// Move GPR is a register rename and single nop micro-op. 118*9880d681SAndroid Build Coastguard Worker// ORR Xd, XZR, Xm 119*9880d681SAndroid Build Coastguard Worker// ADD Xd, Xn, #0 120*9880d681SAndroid Build Coastguard Workerdef WriteIMovPred : SchedPredicate<[{TII->isGPRCopy(*MI)}]>; 121*9880d681SAndroid Build Coastguard Workerdef WriteVMovPred : SchedPredicate<[{TII->isFPRCopy(*MI)}]>; 122*9880d681SAndroid Build Coastguard Workerdef WriteMov : SchedWriteVariant<[ 123*9880d681SAndroid Build Coastguard Worker SchedVar<WriteIMovPred, [WriteX]>, 124*9880d681SAndroid Build Coastguard Worker SchedVar<WriteVMovPred, [WriteX]>, 125*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [WriteI]>]>; 126*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMov], (instrs COPY,ORRXrr,ADDXrr)>; 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker// Move non-zero immediate is an integer ALU op. 129*9880d681SAndroid Build Coastguard Worker// MOVN,MOVZ,MOVK 130*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteImm, [CyUnitI]>; 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker//--- 133*9880d681SAndroid Build Coastguard Worker// 7.8.2-7.8.5. Arithmetic and Logical, Comparison, Conditional, 134*9880d681SAndroid Build Coastguard Worker// Shifts and Bitfield Operations 135*9880d681SAndroid Build Coastguard Worker//--- 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker// ADR,ADRP 138*9880d681SAndroid Build Coastguard Worker// ADD(S)ri,SUB(S)ri,AND(S)ri,EORri,ORRri 139*9880d681SAndroid Build Coastguard Worker// ADD(S)rr,SUB(S)rr,AND(S)rr,BIC(S)rr,EONrr,EORrr,ORNrr,ORRrr 140*9880d681SAndroid Build Coastguard Worker// ADC(S),SBC(S) 141*9880d681SAndroid Build Coastguard Worker// Aliases: CMN, CMP, TST 142*9880d681SAndroid Build Coastguard Worker// 143*9880d681SAndroid Build Coastguard Worker// Conditional operations. 144*9880d681SAndroid Build Coastguard Worker// CCMNi,CCMPi,CCMNr,CCMPr, 145*9880d681SAndroid Build Coastguard Worker// CSEL,CSINC,CSINV,CSNEG 146*9880d681SAndroid Build Coastguard Worker// 147*9880d681SAndroid Build Coastguard Worker// Bit counting and reversal operations. 148*9880d681SAndroid Build Coastguard Worker// CLS,CLZ,RBIT,REV,REV16,REV32 149*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteI, [CyUnitI]>; 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker// ADD with shifted register operand is a single micro-op that 152*9880d681SAndroid Build Coastguard Worker// consumes a shift pipeline for two cycles. 153*9880d681SAndroid Build Coastguard Worker// ADD(S)rs,SUB(S)rs,AND(S)rs,BIC(S)rs,EONrs,EORrs,ORNrs,ORRrs 154*9880d681SAndroid Build Coastguard Worker// EXAMPLE: ADDrs Xn, Xm LSL #imm 155*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteISReg, [CyUnitIS]> { 156*9880d681SAndroid Build Coastguard Worker let Latency = 2; 157*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker// ADD with extended register operand is the same as shifted reg operand. 161*9880d681SAndroid Build Coastguard Worker// ADD(S)re,SUB(S)re 162*9880d681SAndroid Build Coastguard Worker// EXAMPLE: ADDXre Xn, Xm, UXTB #1 163*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIEReg, [CyUnitIS]> { 164*9880d681SAndroid Build Coastguard Worker let Latency = 2; 165*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker// Variable shift and bitfield operations. 169*9880d681SAndroid Build Coastguard Worker// ASRV,LSLV,LSRV,RORV,BFM,SBFM,UBFM 170*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIS, [CyUnitIS]>; 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker// EXTR Shifts a pair of registers and requires two micro-ops. 173*9880d681SAndroid Build Coastguard Worker// The second micro-op is delayed, as modeled by ReadExtrHi. 174*9880d681SAndroid Build Coastguard Worker// EXTR Xn, Xm, #imm 175*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteExtr, [CyUnitIS, CyUnitIS]> { 176*9880d681SAndroid Build Coastguard Worker let Latency = 2; 177*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 178*9880d681SAndroid Build Coastguard Worker} 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker// EXTR's first register read is delayed by one cycle, effectively 181*9880d681SAndroid Build Coastguard Worker// shortening its writer's latency. 182*9880d681SAndroid Build Coastguard Worker// EXTR Xn, Xm, #imm 183*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadExtrHi, 1>; 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker//--- 186*9880d681SAndroid Build Coastguard Worker// 7.8.6. Multiplies 187*9880d681SAndroid Build Coastguard Worker//--- 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker// MUL/MNEG are aliases for MADD/MSUB. 190*9880d681SAndroid Build Coastguard Worker// MADDW,MSUBW,SMADDL,SMSUBL,UMADDL,UMSUBL 191*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM32, [CyUnitIM]> { 192*9880d681SAndroid Build Coastguard Worker let Latency = 4; 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker// MADDX,MSUBX,SMULH,UMULH 195*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM64, [CyUnitIM]> { 196*9880d681SAndroid Build Coastguard Worker let Latency = 5; 197*9880d681SAndroid Build Coastguard Worker} 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker//--- 200*9880d681SAndroid Build Coastguard Worker// 7.8.7. Divide 201*9880d681SAndroid Build Coastguard Worker//--- 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker// 32-bit divide takes 7-13 cycles. 10 cycles covers a 20-bit quotient. 204*9880d681SAndroid Build Coastguard Worker// The ID pipe is consumed for 2 cycles: issue and writeback. 205*9880d681SAndroid Build Coastguard Worker// SDIVW,UDIVW 206*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID32, [CyUnitID, CyUnitIntDiv]> { 207*9880d681SAndroid Build Coastguard Worker let Latency = 10; 208*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 10]; 209*9880d681SAndroid Build Coastguard Worker} 210*9880d681SAndroid Build Coastguard Worker// 64-bit divide takes 7-21 cycles. 13 cycles covers a 32-bit quotient. 211*9880d681SAndroid Build Coastguard Worker// The ID pipe is consumed for 2 cycles: issue and writeback. 212*9880d681SAndroid Build Coastguard Worker// SDIVX,UDIVX 213*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID64, [CyUnitID, CyUnitIntDiv]> { 214*9880d681SAndroid Build Coastguard Worker let Latency = 13; 215*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 13]; 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker//--- 219*9880d681SAndroid Build Coastguard Worker// 7.8.8,7.8.10. Load/Store, single element 220*9880d681SAndroid Build Coastguard Worker//--- 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker// Integer loads take 4 cycles and use one LS unit for one cycle. 223*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLD, [CyUnitLS]> { 224*9880d681SAndroid Build Coastguard Worker let Latency = 4; 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker// Store-load forwarding is 4 cycles. 228*9880d681SAndroid Build Coastguard Worker// 229*9880d681SAndroid Build Coastguard Worker// Note: The store-exclusive sequence incorporates this 230*9880d681SAndroid Build Coastguard Worker// latency. However, general heuristics should not model the 231*9880d681SAndroid Build Coastguard Worker// dependence between a store and subsequent may-alias load because 232*9880d681SAndroid Build Coastguard Worker// hardware speculation works. 233*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteST, [CyUnitLS]> { 234*9880d681SAndroid Build Coastguard Worker let Latency = 4; 235*9880d681SAndroid Build Coastguard Worker} 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker// Load from base address plus an optionally scaled register offset. 238*9880d681SAndroid Build Coastguard Worker// Rt latency is latency WriteIS + WriteLD. 239*9880d681SAndroid Build Coastguard Worker// EXAMPLE: LDR Xn, Xm [, lsl 3] 240*9880d681SAndroid Build Coastguard Workerdef CyWriteLDIdx : SchedWriteVariant<[ 241*9880d681SAndroid Build Coastguard Worker SchedVar<ScaledIdxPred, [WriteIS, WriteLD]>, // Load from scaled register. 242*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [WriteLD]>]>; // Load from register offset. 243*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<WriteLDIdx, CyWriteLDIdx>; // Map AArch64->Cyclone type. 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker// EXAMPLE: STR Xn, Xm [, lsl 3] 246*9880d681SAndroid Build Coastguard Workerdef CyWriteSTIdx : SchedWriteVariant<[ 247*9880d681SAndroid Build Coastguard Worker SchedVar<ScaledIdxPred, [WriteIS, WriteST]>, // Store to scaled register. 248*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [WriteST]>]>; // Store to register offset. 249*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<WriteSTIdx, CyWriteSTIdx>; // Map AArch64->Cyclone type. 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker// Read the (unshifted) base register Xn in the second micro-op one cycle later. 252*9880d681SAndroid Build Coastguard Worker// EXAMPLE: LDR Xn, Xm [, lsl 3] 253*9880d681SAndroid Build Coastguard Workerdef ReadBaseRS : SchedReadAdvance<1>; 254*9880d681SAndroid Build Coastguard Workerdef CyReadAdrBase : SchedReadVariant<[ 255*9880d681SAndroid Build Coastguard Worker SchedVar<ScaledIdxPred, [ReadBaseRS]>, // Read base reg after shifting offset. 256*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [ReadDefault]>]>; // Read base reg with no shift. 257*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<ReadAdrBase, CyReadAdrBase>; // Map AArch64->Cyclone type. 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker//--- 260*9880d681SAndroid Build Coastguard Worker// 7.8.9,7.8.11. Load/Store, paired 261*9880d681SAndroid Build Coastguard Worker//--- 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Worker// Address pre/post increment is a simple ALU op with one cycle latency. 264*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAdr, [CyUnitI]>; 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Worker// LDP high register write is fused with the load, but a nop micro-op remains. 267*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLDHi, []> { 268*9880d681SAndroid Build Coastguard Worker let Latency = 4; 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker// STP is a vector op and store, except for QQ, which is just two stores. 272*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<WriteSTP, WriteVSTShuffle>; 273*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteST, WriteST], (instrs STPQi)>; 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker//--- 276*9880d681SAndroid Build Coastguard Worker// 7.8.13. Branches 277*9880d681SAndroid Build Coastguard Worker//--- 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Worker// Branches take a single micro-op. 280*9880d681SAndroid Build Coastguard Worker// The misprediction penalty is defined as a SchedMachineModel property. 281*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBr, [CyUnitB]> {let Latency = 0;} 282*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBrReg, [CyUnitBR]> {let Latency = 0;} 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Worker//--- 285*9880d681SAndroid Build Coastguard Worker// 7.8.14. Never-issued Instructions, Barrier and Hint Operations 286*9880d681SAndroid Build Coastguard Worker//--- 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker// NOP,SEV,SEVL,WFE,WFI,YIELD 289*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteHint, []> {let Latency = 0;} 290*9880d681SAndroid Build Coastguard Worker// ISB 291*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteI], (instrs ISB)>; 292*9880d681SAndroid Build Coastguard Worker// SLREX,DMB,DSB 293*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBarrier, [CyUnitLS]>; 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Worker// System instructions get an invalid latency because the latency of 296*9880d681SAndroid Build Coastguard Worker// other operations across them is meaningless. 297*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSys, []> {let Latency = -1;} 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 300*9880d681SAndroid Build Coastguard Worker// 7.9 Vector Unit Instructions 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Worker// Simple vector operations take 2 cycles. 303*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteV, [CyUnitV]> {let Latency = 2;} 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Worker// Define some longer latency vector op types for Cyclone. 306*9880d681SAndroid Build Coastguard Workerdef CyWriteV3 : SchedWriteRes<[CyUnitV]> {let Latency = 3;} 307*9880d681SAndroid Build Coastguard Workerdef CyWriteV4 : SchedWriteRes<[CyUnitV]> {let Latency = 4;} 308*9880d681SAndroid Build Coastguard Workerdef CyWriteV5 : SchedWriteRes<[CyUnitV]> {let Latency = 5;} 309*9880d681SAndroid Build Coastguard Workerdef CyWriteV6 : SchedWriteRes<[CyUnitV]> {let Latency = 6;} 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker// Simple floating-point operations take 2 cycles. 312*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteF, [CyUnitV]> {let Latency = 2;} 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker//--- 315*9880d681SAndroid Build Coastguard Worker// 7.9.1 Vector Moves 316*9880d681SAndroid Build Coastguard Worker//--- 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker// TODO: Add Cyclone-specific zero-cycle zeros. LLVM currently 319*9880d681SAndroid Build Coastguard Worker// generates expensive int-float conversion instead: 320*9880d681SAndroid Build Coastguard Worker// FMOVDi Dd, #0.0 321*9880d681SAndroid Build Coastguard Worker// FMOVv2f64ns Vd.2d, #0.0 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Worker// FMOVSi,FMOVDi 324*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFImm, [CyUnitV]> {let Latency = 2;} 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Worker// MOVI,MVNI are WriteV 327*9880d681SAndroid Build Coastguard Worker// FMOVv2f32ns,FMOVv2f64ns,FMOVv4f32ns are WriteV 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker// Move FPR is a register rename and single nop micro-op. 330*9880d681SAndroid Build Coastguard Worker// ORR.16b Vd,Vn,Vn 331*9880d681SAndroid Build Coastguard Worker// COPY is handled above in the WriteMov Variant. 332*9880d681SAndroid Build Coastguard Workerdef WriteVMov : SchedWriteVariant<[ 333*9880d681SAndroid Build Coastguard Worker SchedVar<WriteVMovPred, [WriteX]>, 334*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [WriteV]>]>; 335*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVMov], (instrs ORRv16i8)>; 336*9880d681SAndroid Build Coastguard Worker 337*9880d681SAndroid Build Coastguard Worker// FMOVSr,FMOVDr are WriteF. 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Worker// MOV V,V is a WriteV. 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker// CPY D,V[x] is a WriteV 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Worker// INS V[x],V[y] is a WriteV. 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Worker// FMOVWSr,FMOVXDr,FMOVXDHighr 346*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCopy, [CyUnitLS]> { 347*9880d681SAndroid Build Coastguard Worker let Latency = 5; 348*9880d681SAndroid Build Coastguard Worker} 349*9880d681SAndroid Build Coastguard Worker 350*9880d681SAndroid Build Coastguard Worker// FMOVSWr,FMOVDXr 351*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteLD], (instrs FMOVSWr,FMOVDXr,FMOVDXHighr)>; 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Worker// INS V[x],R 354*9880d681SAndroid Build Coastguard Workerdef CyWriteCopyToFPR : WriteSequence<[WriteVLD, WriteV]>; 355*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCopyToFPR], (instregex "INSv")>; 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker// SMOV,UMOV R,V[x] 358*9880d681SAndroid Build Coastguard Workerdef CyWriteCopyToGPR : WriteSequence<[WriteLD, WriteI]>; 359*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCopyToGPR], (instregex "SMOVv","UMOVv")>; 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Worker// DUP V,R 362*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCopyToFPR], (instregex "DUPv")>; 363*9880d681SAndroid Build Coastguard Worker 364*9880d681SAndroid Build Coastguard Worker// DUP V,V[x] is a WriteV. 365*9880d681SAndroid Build Coastguard Worker 366*9880d681SAndroid Build Coastguard Worker//--- 367*9880d681SAndroid Build Coastguard Worker// 7.9.2 Integer Arithmetic, Logical, and Comparisons 368*9880d681SAndroid Build Coastguard Worker//--- 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Worker// BIC,ORR V,#imm are WriteV 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "ABSv")>; 373*9880d681SAndroid Build Coastguard Worker 374*9880d681SAndroid Build Coastguard Worker// MVN,NEG,NOT are WriteV 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SQABSv","SQNEGv")>; 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker// ADDP is a WriteV. 379*9880d681SAndroid Build Coastguard Workerdef CyWriteVADDLP : SchedWriteRes<[CyUnitV]> {let Latency = 2;} 380*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVADDLP], (instregex "SADDLPv","UADDLPv")>; 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], 383*9880d681SAndroid Build Coastguard Worker (instregex "ADDVv","SMAXVv","UMAXVv","SMINVv","UMINVv")>; 384*9880d681SAndroid Build Coastguard Worker 385*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SADDLV","UADDLV")>; 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Worker// ADD,SUB are WriteV 388*9880d681SAndroid Build Coastguard Worker 389*9880d681SAndroid Build Coastguard Worker// Forward declare. 390*9880d681SAndroid Build Coastguard Workerdef CyWriteVABD : SchedWriteRes<[CyUnitV]> {let Latency = 3;} 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Worker// Add/Diff and accumulate uses the vector multiply unit. 393*9880d681SAndroid Build Coastguard Workerdef CyWriteVAccum : SchedWriteRes<[CyUnitVM]> {let Latency = 3;} 394*9880d681SAndroid Build Coastguard Workerdef CyReadVAccum : SchedReadAdvance<1, 395*9880d681SAndroid Build Coastguard Worker [CyWriteVAccum, CyWriteVADDLP, CyWriteVABD]>; 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVAccum, CyReadVAccum], 398*9880d681SAndroid Build Coastguard Worker (instregex "SADALP","UADALP")>; 399*9880d681SAndroid Build Coastguard Worker 400*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVAccum, CyReadVAccum], 401*9880d681SAndroid Build Coastguard Worker (instregex "SABAv","UABAv","SABALv","UABALv")>; 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SQADDv","SQSUBv","UQADDv","UQSUBv")>; 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SUQADDv","USQADDv")>; 406*9880d681SAndroid Build Coastguard Worker 407*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], (instregex "ADDHNv","RADDHNv", "RSUBHNv", "SUBHNv")>; 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Worker// WriteV includes: 410*9880d681SAndroid Build Coastguard Worker// AND,BIC,CMTST,EOR,ORN,ORR 411*9880d681SAndroid Build Coastguard Worker// ADDP 412*9880d681SAndroid Build Coastguard Worker// SHADD,SHSUB,SRHADD,UHADD,UHSUB,URHADD 413*9880d681SAndroid Build Coastguard Worker// SADDL,SSUBL,UADDL,USUBL 414*9880d681SAndroid Build Coastguard Worker// SADDW,SSUBW,UADDW,USUBW 415*9880d681SAndroid Build Coastguard Worker 416*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "CMEQv","CMGEv","CMGTv", 417*9880d681SAndroid Build Coastguard Worker "CMLEv","CMLTv", 418*9880d681SAndroid Build Coastguard Worker "CMHIv","CMHSv")>; 419*9880d681SAndroid Build Coastguard Worker 420*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SMAXv","SMINv","UMAXv","UMINv", 421*9880d681SAndroid Build Coastguard Worker "SMAXPv","SMINPv","UMAXPv","UMINPv")>; 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVABD], (instregex "SABDv","UABDv", 424*9880d681SAndroid Build Coastguard Worker "SABDLv","UABDLv")>; 425*9880d681SAndroid Build Coastguard Worker 426*9880d681SAndroid Build Coastguard Worker//--- 427*9880d681SAndroid Build Coastguard Worker// 7.9.3 Floating Point Arithmetic and Comparisons 428*9880d681SAndroid Build Coastguard Worker//--- 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Worker// FABS,FNEG are WriteF 431*9880d681SAndroid Build Coastguard Worker 432*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], (instrs FADDPv2i32p)>; 433*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV5], (instrs FADDPv2i64p)>; 434*9880d681SAndroid Build Coastguard Worker 435*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "FMAXPv2i","FMAXNMPv2i", 436*9880d681SAndroid Build Coastguard Worker "FMINPv2i","FMINNMPv2i")>; 437*9880d681SAndroid Build Coastguard Worker 438*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], (instregex "FMAXVv","FMAXNMVv","FMINVv","FMINNMVv")>; 439*9880d681SAndroid Build Coastguard Worker 440*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], (instrs FADDSrr,FADDv2f32,FADDv4f32, 441*9880d681SAndroid Build Coastguard Worker FSUBSrr,FSUBv2f32,FSUBv4f32, 442*9880d681SAndroid Build Coastguard Worker FADDPv2f32,FADDPv4f32, 443*9880d681SAndroid Build Coastguard Worker FABD32,FABDv2f32,FABDv4f32)>; 444*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV5], (instrs FADDDrr,FADDv2f64, 445*9880d681SAndroid Build Coastguard Worker FSUBDrr,FSUBv2f64, 446*9880d681SAndroid Build Coastguard Worker FADDPv2f64, 447*9880d681SAndroid Build Coastguard Worker FABD64,FABDv2f64)>; 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "FCMEQ","FCMGT","FCMLE","FCMLT")>; 450*9880d681SAndroid Build Coastguard Worker 451*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "FACGE","FACGT", 452*9880d681SAndroid Build Coastguard Worker "FMAXS","FMAXD","FMAXv", 453*9880d681SAndroid Build Coastguard Worker "FMINS","FMIND","FMINv", 454*9880d681SAndroid Build Coastguard Worker "FMAXNMS","FMAXNMD","FMAXNMv", 455*9880d681SAndroid Build Coastguard Worker "FMINNMS","FMINNMD","FMINNMv", 456*9880d681SAndroid Build Coastguard Worker "FMAXPv2f","FMAXPv4f", 457*9880d681SAndroid Build Coastguard Worker "FMINPv2f","FMINPv4f", 458*9880d681SAndroid Build Coastguard Worker "FMAXNMPv2f","FMAXNMPv4f", 459*9880d681SAndroid Build Coastguard Worker "FMINNMPv2f","FMINNMPv4f")>; 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Worker// FCMP,FCMPE,FCCMP,FCCMPE 462*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCmp, [CyUnitVC]> {let Latency = 4;} 463*9880d681SAndroid Build Coastguard Worker 464*9880d681SAndroid Build Coastguard Worker// FCSEL is a WriteF. 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Worker//--- 467*9880d681SAndroid Build Coastguard Worker// 7.9.4 Shifts and Bitfield Operations 468*9880d681SAndroid Build Coastguard Worker//--- 469*9880d681SAndroid Build Coastguard Worker 470*9880d681SAndroid Build Coastguard Worker// SHL is a WriteV 471*9880d681SAndroid Build Coastguard Worker 472*9880d681SAndroid Build Coastguard Workerdef CyWriteVSHR : SchedWriteRes<[CyUnitV]> {let Latency = 2;} 473*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVSHR], (instregex "SSHRv","USHRv")>; 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard Workerdef CyWriteVSRSHR : SchedWriteRes<[CyUnitV]> {let Latency = 3;} 476*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVSRSHR], (instregex "SRSHRv","URSHRv")>; 477*9880d681SAndroid Build Coastguard Worker 478*9880d681SAndroid Build Coastguard Worker// Shift and accumulate uses the vector multiply unit. 479*9880d681SAndroid Build Coastguard Workerdef CyWriteVShiftAcc : SchedWriteRes<[CyUnitVM]> {let Latency = 3;} 480*9880d681SAndroid Build Coastguard Workerdef CyReadVShiftAcc : SchedReadAdvance<1, 481*9880d681SAndroid Build Coastguard Worker [CyWriteVShiftAcc, CyWriteVSHR, CyWriteVSRSHR]>; 482*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVShiftAcc, CyReadVShiftAcc], 483*9880d681SAndroid Build Coastguard Worker (instregex "SRSRAv","SSRAv","URSRAv","USRAv")>; 484*9880d681SAndroid Build Coastguard Worker 485*9880d681SAndroid Build Coastguard Worker// SSHL,USHL are WriteV. 486*9880d681SAndroid Build Coastguard Worker 487*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SRSHLv","URSHLv")>; 488*9880d681SAndroid Build Coastguard Worker 489*9880d681SAndroid Build Coastguard Worker// SQSHL,SQSHLU,UQSHL are WriteV. 490*9880d681SAndroid Build Coastguard Worker 491*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV3], (instregex "SQRSHLv","UQRSHLv")>; 492*9880d681SAndroid Build Coastguard Worker 493*9880d681SAndroid Build Coastguard Worker// WriteV includes: 494*9880d681SAndroid Build Coastguard Worker// SHLL,SSHLL,USHLL 495*9880d681SAndroid Build Coastguard Worker// SLI,SRI 496*9880d681SAndroid Build Coastguard Worker// BIF,BIT,BSL 497*9880d681SAndroid Build Coastguard Worker// EXT 498*9880d681SAndroid Build Coastguard Worker// CLS,CLZ,CNT,RBIT,REV16,REV32,REV64,XTN 499*9880d681SAndroid Build Coastguard Worker// XTN2 500*9880d681SAndroid Build Coastguard Worker 501*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], 502*9880d681SAndroid Build Coastguard Worker (instregex "RSHRNv","SHRNv", 503*9880d681SAndroid Build Coastguard Worker "SQRSHRNv","SQRSHRUNv","SQSHRNv","SQSHRUNv", 504*9880d681SAndroid Build Coastguard Worker "UQRSHRNv","UQSHRNv","SQXTNv","SQXTUNv","UQXTNv")>; 505*9880d681SAndroid Build Coastguard Worker 506*9880d681SAndroid Build Coastguard Worker//--- 507*9880d681SAndroid Build Coastguard Worker// 7.9.5 Multiplication 508*9880d681SAndroid Build Coastguard Worker//--- 509*9880d681SAndroid Build Coastguard Worker 510*9880d681SAndroid Build Coastguard Workerdef CyWriteVMul : SchedWriteRes<[CyUnitVM]> { let Latency = 4;} 511*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVMul], (instregex "MULv","SMULLv","UMULLv", 512*9880d681SAndroid Build Coastguard Worker "SQDMULLv","SQDMULHv","SQRDMULHv")>; 513*9880d681SAndroid Build Coastguard Worker 514*9880d681SAndroid Build Coastguard Worker// FMUL,FMULX,FNMUL default to WriteFMul. 515*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFMul, [CyUnitVM]> { let Latency = 4;} 516*9880d681SAndroid Build Coastguard Worker 517*9880d681SAndroid Build Coastguard Workerdef CyWriteV64Mul : SchedWriteRes<[CyUnitVM]> { let Latency = 5;} 518*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV64Mul], (instrs FMULDrr,FMULv2f64,FMULv2i64_indexed, 519*9880d681SAndroid Build Coastguard Worker FNMULDrr,FMULX64,FMULXv2f64,FMULXv2i64_indexed)>; 520*9880d681SAndroid Build Coastguard Worker 521*9880d681SAndroid Build Coastguard Workerdef CyReadVMulAcc : SchedReadAdvance<1, [CyWriteVMul, CyWriteV64Mul]>; 522*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteVMul, CyReadVMulAcc], 523*9880d681SAndroid Build Coastguard Worker (instregex "MLA","MLS","SMLAL","SMLSL","UMLAL","UMLSL", 524*9880d681SAndroid Build Coastguard Worker "SQDMLAL","SQDMLSL")>; 525*9880d681SAndroid Build Coastguard Worker 526*9880d681SAndroid Build Coastguard Workerdef CyWriteSMul : SchedWriteRes<[CyUnitVM]> { let Latency = 8;} 527*9880d681SAndroid Build Coastguard Workerdef CyWriteDMul : SchedWriteRes<[CyUnitVM]> { let Latency = 10;} 528*9880d681SAndroid Build Coastguard Workerdef CyReadSMul : SchedReadAdvance<4, [CyWriteSMul]>; 529*9880d681SAndroid Build Coastguard Workerdef CyReadDMul : SchedReadAdvance<5, [CyWriteDMul]>; 530*9880d681SAndroid Build Coastguard Worker 531*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteSMul, CyReadSMul], 532*9880d681SAndroid Build Coastguard Worker (instrs FMADDSrrr,FMSUBSrrr,FNMADDSrrr,FNMSUBSrrr, 533*9880d681SAndroid Build Coastguard Worker FMLAv2f32,FMLAv4f32, 534*9880d681SAndroid Build Coastguard Worker FMLAv1i32_indexed,FMLAv1i64_indexed,FMLAv2i32_indexed)>; 535*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteDMul, CyReadDMul], 536*9880d681SAndroid Build Coastguard Worker (instrs FMADDDrrr,FMSUBDrrr,FNMADDDrrr,FNMSUBDrrr, 537*9880d681SAndroid Build Coastguard Worker FMLAv2f64,FMLAv2i64_indexed, 538*9880d681SAndroid Build Coastguard Worker FMLSv2f64,FMLSv2i64_indexed)>; 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Workerdef CyWritePMUL : SchedWriteRes<[CyUnitVD]> { let Latency = 3; } 541*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWritePMUL], (instregex "PMULv", "PMULLv")>; 542*9880d681SAndroid Build Coastguard Worker 543*9880d681SAndroid Build Coastguard Worker//--- 544*9880d681SAndroid Build Coastguard Worker// 7.9.6 Divide and Square Root 545*9880d681SAndroid Build Coastguard Worker//--- 546*9880d681SAndroid Build Coastguard Worker 547*9880d681SAndroid Build Coastguard Worker// FDIV,FSQRT 548*9880d681SAndroid Build Coastguard Worker// TODO: Add 64-bit variant with 19 cycle latency. 549*9880d681SAndroid Build Coastguard Worker// TODO: Specialize FSQRT for longer latency. 550*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFDiv, [CyUnitVD, CyUnitFloatDiv]> { 551*9880d681SAndroid Build Coastguard Worker let Latency = 17; 552*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 17]; 553*9880d681SAndroid Build Coastguard Worker} 554*9880d681SAndroid Build Coastguard Worker 555*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteV4], (instregex "FRECPEv","FRECPXv","URECPEv","URSQRTEv")>; 556*9880d681SAndroid Build Coastguard Worker 557*9880d681SAndroid Build Coastguard Workerdef WriteFRSQRTE : SchedWriteRes<[CyUnitVM]> { let Latency = 4; } 558*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFRSQRTE], (instregex "FRSQRTEv")>; 559*9880d681SAndroid Build Coastguard Worker 560*9880d681SAndroid Build Coastguard Workerdef WriteFRECPS : SchedWriteRes<[CyUnitVM]> { let Latency = 8; } 561*9880d681SAndroid Build Coastguard Workerdef WriteFRSQRTS : SchedWriteRes<[CyUnitVM]> { let Latency = 10; } 562*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFRECPS], (instregex "FRECPSv")>; 563*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFRSQRTS], (instregex "FRSQRTSv")>; 564*9880d681SAndroid Build Coastguard Worker 565*9880d681SAndroid Build Coastguard Worker//--- 566*9880d681SAndroid Build Coastguard Worker// 7.9.7 Integer-FP Conversions 567*9880d681SAndroid Build Coastguard Worker//--- 568*9880d681SAndroid Build Coastguard Worker 569*9880d681SAndroid Build Coastguard Worker// FCVT lengthen f16/s32 570*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteV], (instrs FCVTSHr,FCVTDHr,FCVTDSr)>; 571*9880d681SAndroid Build Coastguard Worker 572*9880d681SAndroid Build Coastguard Worker// FCVT,FCVTN,FCVTXN 573*9880d681SAndroid Build Coastguard Worker// SCVTF,UCVTF V,V 574*9880d681SAndroid Build Coastguard Worker// FRINT(AIMNPXZ) V,V 575*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCvt, [CyUnitV]> {let Latency = 4;} 576*9880d681SAndroid Build Coastguard Worker 577*9880d681SAndroid Build Coastguard Worker// SCVT/UCVT S/D, Rd = VLD5+V4: 9 cycles. 578*9880d681SAndroid Build Coastguard Workerdef CyWriteCvtToFPR : WriteSequence<[WriteVLD, CyWriteV4]>; 579*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCopyToFPR], (instregex "FCVT[AMNPZ][SU][SU][WX][SD]r")>; 580*9880d681SAndroid Build Coastguard Worker 581*9880d681SAndroid Build Coastguard Worker// FCVT Rd, S/D = V6+LD4: 10 cycles 582*9880d681SAndroid Build Coastguard Workerdef CyWriteCvtToGPR : WriteSequence<[CyWriteV6, WriteLD]>; 583*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCvtToGPR], (instregex "[SU]CVTF[SU][WX][SD]r")>; 584*9880d681SAndroid Build Coastguard Worker 585*9880d681SAndroid Build Coastguard Worker// FCVTL is a WriteV 586*9880d681SAndroid Build Coastguard Worker 587*9880d681SAndroid Build Coastguard Worker//--- 588*9880d681SAndroid Build Coastguard Worker// 7.9.8-7.9.10 Cryptography, Data Transposition, Table Lookup 589*9880d681SAndroid Build Coastguard Worker//--- 590*9880d681SAndroid Build Coastguard Worker 591*9880d681SAndroid Build Coastguard Workerdef CyWriteCrypto2 : SchedWriteRes<[CyUnitVD]> {let Latency = 2;} 592*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCrypto2], (instrs AESIMCrr, AESMCrr, SHA1Hrr, 593*9880d681SAndroid Build Coastguard Worker AESDrr, AESErr, SHA1SU1rr, SHA256SU0rr, 594*9880d681SAndroid Build Coastguard Worker SHA1SU0rrr)>; 595*9880d681SAndroid Build Coastguard Worker 596*9880d681SAndroid Build Coastguard Workerdef CyWriteCrypto3 : SchedWriteRes<[CyUnitVD]> {let Latency = 3;} 597*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCrypto3], (instrs SHA256SU1rrr)>; 598*9880d681SAndroid Build Coastguard Worker 599*9880d681SAndroid Build Coastguard Workerdef CyWriteCrypto6 : SchedWriteRes<[CyUnitVD]> {let Latency = 6;} 600*9880d681SAndroid Build Coastguard Workerdef : InstRW<[CyWriteCrypto6], (instrs SHA1Crrr, SHA1Mrrr, SHA1Prrr, 601*9880d681SAndroid Build Coastguard Worker SHA256Hrrr,SHA256H2rrr)>; 602*9880d681SAndroid Build Coastguard Worker 603*9880d681SAndroid Build Coastguard Worker// TRN,UZP,ZUP are WriteV. 604*9880d681SAndroid Build Coastguard Worker 605*9880d681SAndroid Build Coastguard Worker// TBL,TBX are WriteV. 606*9880d681SAndroid Build Coastguard Worker 607*9880d681SAndroid Build Coastguard Worker//--- 608*9880d681SAndroid Build Coastguard Worker// 7.9.11-7.9.14 Load/Store, single element and paired 609*9880d681SAndroid Build Coastguard Worker//--- 610*9880d681SAndroid Build Coastguard Worker 611*9880d681SAndroid Build Coastguard Worker// Loading into the vector unit takes 5 cycles vs 4 for integer loads. 612*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVLD, [CyUnitLS]> { 613*9880d681SAndroid Build Coastguard Worker let Latency = 5; 614*9880d681SAndroid Build Coastguard Worker} 615*9880d681SAndroid Build Coastguard Worker 616*9880d681SAndroid Build Coastguard Worker// Store-load forwarding is 4 cycles. 617*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVST, [CyUnitLS]> { 618*9880d681SAndroid Build Coastguard Worker let Latency = 4; 619*9880d681SAndroid Build Coastguard Worker} 620*9880d681SAndroid Build Coastguard Worker 621*9880d681SAndroid Build Coastguard Worker// WriteVLDPair/VSTPair sequences are expanded by the target description. 622*9880d681SAndroid Build Coastguard Worker 623*9880d681SAndroid Build Coastguard Worker//--- 624*9880d681SAndroid Build Coastguard Worker// 7.9.15 Load, element operations 625*9880d681SAndroid Build Coastguard Worker//--- 626*9880d681SAndroid Build Coastguard Worker 627*9880d681SAndroid Build Coastguard Worker// Only the first WriteVLD and WriteAdr for writeback matches def operands. 628*9880d681SAndroid Build Coastguard Worker// Subsequent WriteVLDs consume resources. Since all loaded values have the 629*9880d681SAndroid Build Coastguard Worker// same latency, this is acceptable. 630*9880d681SAndroid Build Coastguard Worker 631*9880d681SAndroid Build Coastguard Worker// Vd is read 5 cycles after issuing the vector load. 632*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadVLD, 5>; 633*9880d681SAndroid Build Coastguard Worker 634*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD], 635*9880d681SAndroid Build Coastguard Worker (instregex "LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 636*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr], 637*9880d681SAndroid Build Coastguard Worker (instregex "LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST")>; 638*9880d681SAndroid Build Coastguard Worker 639*9880d681SAndroid Build Coastguard Worker// Register writes from the load's high half are fused micro-ops. 640*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD], 641*9880d681SAndroid Build Coastguard Worker (instregex "LD1Twov(8b|4h|2s|1d)$")>; 642*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr], 643*9880d681SAndroid Build Coastguard Worker (instregex "LD1Twov(8b|4h|2s|1d)_POST")>; 644*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteVLD], 645*9880d681SAndroid Build Coastguard Worker (instregex "LD1Twov(16b|8h|4s|2d)$")>; 646*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr, WriteVLD], 647*9880d681SAndroid Build Coastguard Worker (instregex "LD1Twov(16b|8h|4s|2d)_POST")>; 648*9880d681SAndroid Build Coastguard Worker 649*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteVLD], 650*9880d681SAndroid Build Coastguard Worker (instregex "LD1Threev(8b|4h|2s|1d)$")>; 651*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr, WriteVLD], 652*9880d681SAndroid Build Coastguard Worker (instregex "LD1Threev(8b|4h|2s|1d)_POST")>; 653*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteVLD, WriteVLD], 654*9880d681SAndroid Build Coastguard Worker (instregex "LD1Threev(16b|8h|4s|2d)$")>; 655*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr, WriteVLD, WriteVLD], 656*9880d681SAndroid Build Coastguard Worker (instregex "LD1Threev(16b|8h|4s|2d)_POST")>; 657*9880d681SAndroid Build Coastguard Worker 658*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteVLD], 659*9880d681SAndroid Build Coastguard Worker (instregex "LD1Fourv(8b|4h|2s|1d)$")>; 660*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr, WriteVLD], 661*9880d681SAndroid Build Coastguard Worker (instregex "LD1Fourv(8b|4h|2s|1d)_POST")>; 662*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteVLD, WriteVLD, WriteVLD], 663*9880d681SAndroid Build Coastguard Worker (instregex "LD1Fourv(16b|8h|4s|2d)$")>; 664*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLD, WriteAdr, WriteVLD, WriteVLD, WriteVLD], 665*9880d681SAndroid Build Coastguard Worker (instregex "LD1Fourv(16b|8h|4s|2d)_POST")>; 666*9880d681SAndroid Build Coastguard Worker 667*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD], 668*9880d681SAndroid Build Coastguard Worker (instregex "LD1i(8|16|32)$")>; 669*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr], 670*9880d681SAndroid Build Coastguard Worker (instregex "LD1i(8|16|32)_POST")>; 671*9880d681SAndroid Build Coastguard Worker 672*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD], (instrs LD1i64)>; 673*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr],(instrs LD1i64_POST)>; 674*9880d681SAndroid Build Coastguard Worker 675*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle], 676*9880d681SAndroid Build Coastguard Worker (instregex "LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 677*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr], 678*9880d681SAndroid Build Coastguard Worker (instregex "LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 679*9880d681SAndroid Build Coastguard Worker 680*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteV], 681*9880d681SAndroid Build Coastguard Worker (instregex "LD2Twov(8b|4h|2s)$")>; 682*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteV], 683*9880d681SAndroid Build Coastguard Worker (instregex "LD2Twov(8b|4h|2s)_POST$")>; 684*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle], 685*9880d681SAndroid Build Coastguard Worker (instregex "LD2Twov(16b|8h|4s|2d)$")>; 686*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle], 687*9880d681SAndroid Build Coastguard Worker (instregex "LD2Twov(16b|8h|4s|2d)_POST")>; 688*9880d681SAndroid Build Coastguard Worker 689*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteV], 690*9880d681SAndroid Build Coastguard Worker (instregex "LD2i(8|16|32)$")>; 691*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteV], 692*9880d681SAndroid Build Coastguard Worker (instregex "LD2i(8|16|32)_POST")>; 693*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteV], 694*9880d681SAndroid Build Coastguard Worker (instregex "LD2i64$")>; 695*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteV], 696*9880d681SAndroid Build Coastguard Worker (instregex "LD2i64_POST")>; 697*9880d681SAndroid Build Coastguard Worker 698*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteV], 699*9880d681SAndroid Build Coastguard Worker (instregex "LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 700*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteV], 701*9880d681SAndroid Build Coastguard Worker (instregex "LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST")>; 702*9880d681SAndroid Build Coastguard Worker 703*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle, WriteV], 704*9880d681SAndroid Build Coastguard Worker (instregex "LD3Threev(8b|4h|2s)$")>; 705*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle, WriteV], 706*9880d681SAndroid Build Coastguard Worker (instregex "LD3Threev(8b|4h|2s)_POST")>; 707*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle, WriteVLDShuffle], 708*9880d681SAndroid Build Coastguard Worker (instregex "LD3Threev(16b|8h|4s|2d)$")>; 709*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle, WriteVLDShuffle], 710*9880d681SAndroid Build Coastguard Worker (instregex "LD3Threev(16b|8h|4s|2d)_POST")>; 711*9880d681SAndroid Build Coastguard Worker 712*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteV, WriteV], 713*9880d681SAndroid Build Coastguard Worker (instregex "LD3i(8|16|32)$")>; 714*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteV, WriteV], 715*9880d681SAndroid Build Coastguard Worker (instregex "LD3i(8|16|32)_POST")>; 716*9880d681SAndroid Build Coastguard Worker 717*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteVLDShuffle, WriteV], 718*9880d681SAndroid Build Coastguard Worker (instregex "LD3i64$")>; 719*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteVLDShuffle, WriteV], 720*9880d681SAndroid Build Coastguard Worker (instregex "LD3i64_POST")>; 721*9880d681SAndroid Build Coastguard Worker 722*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteV, WriteV], 723*9880d681SAndroid Build Coastguard Worker (instregex "LD3Rv(8b|4h|2s|16b|8h|4s)$")>; 724*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteV, WriteV], 725*9880d681SAndroid Build Coastguard Worker (instregex "LD3Rv(8b|4h|2s|16b|8h|4s)_POST")>; 726*9880d681SAndroid Build Coastguard Worker 727*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle, WriteV], 728*9880d681SAndroid Build Coastguard Worker (instrs LD3Rv1d,LD3Rv2d)>; 729*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle, WriteV], 730*9880d681SAndroid Build Coastguard Worker (instrs LD3Rv1d_POST,LD3Rv2d_POST)>; 731*9880d681SAndroid Build Coastguard Worker 732*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle, WriteV, WriteV], 733*9880d681SAndroid Build Coastguard Worker (instregex "LD4Fourv(8b|4h|2s)$")>; 734*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle, WriteV, WriteV], 735*9880d681SAndroid Build Coastguard Worker (instregex "LD4Fourv(8b|4h|2s)_POST")>; 736*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDPairShuffle, WriteVLDPairShuffle, 737*9880d681SAndroid Build Coastguard Worker WriteVLDPairShuffle, WriteVLDPairShuffle], 738*9880d681SAndroid Build Coastguard Worker (instregex "LD4Fourv(16b|8h|4s|2d)$")>; 739*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDPairShuffle, WriteAdr, WriteVLDPairShuffle, 740*9880d681SAndroid Build Coastguard Worker WriteVLDPairShuffle, WriteVLDPairShuffle], 741*9880d681SAndroid Build Coastguard Worker (instregex "LD4Fourv(16b|8h|4s|2d)_POST")>; 742*9880d681SAndroid Build Coastguard Worker 743*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteV, WriteV, WriteV], 744*9880d681SAndroid Build Coastguard Worker (instregex "LD4i(8|16|32)$")>; 745*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteV, WriteV, WriteV], 746*9880d681SAndroid Build Coastguard Worker (instregex "LD4i(8|16|32)_POST")>; 747*9880d681SAndroid Build Coastguard Worker 748*9880d681SAndroid Build Coastguard Worker 749*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteVLDShuffle, WriteV, WriteV], 750*9880d681SAndroid Build Coastguard Worker (instrs LD4i64)>; 751*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, ReadVLD, WriteAdr, WriteVLDShuffle, WriteV], 752*9880d681SAndroid Build Coastguard Worker (instrs LD4i64_POST)>; 753*9880d681SAndroid Build Coastguard Worker 754*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteV, WriteV, WriteV], 755*9880d681SAndroid Build Coastguard Worker (instregex "LD4Rv(8b|4h|2s|16b|8h|4s)$")>; 756*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteV, WriteV, WriteV], 757*9880d681SAndroid Build Coastguard Worker (instregex "LD4Rv(8b|4h|2s|16b|8h|4s)_POST")>; 758*9880d681SAndroid Build Coastguard Worker 759*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteVLDShuffle, WriteV, WriteV], 760*9880d681SAndroid Build Coastguard Worker (instrs LD4Rv1d,LD4Rv2d)>; 761*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVLDShuffle, WriteAdr, WriteVLDShuffle, WriteV, WriteV], 762*9880d681SAndroid Build Coastguard Worker (instrs LD4Rv1d_POST,LD4Rv2d_POST)>; 763*9880d681SAndroid Build Coastguard Worker 764*9880d681SAndroid Build Coastguard Worker//--- 765*9880d681SAndroid Build Coastguard Worker// 7.9.16 Store, element operations 766*9880d681SAndroid Build Coastguard Worker//--- 767*9880d681SAndroid Build Coastguard Worker 768*9880d681SAndroid Build Coastguard Worker// Only the WriteAdr for writeback matches a def operands. 769*9880d681SAndroid Build Coastguard Worker// Subsequent WriteVLDs only consume resources. 770*9880d681SAndroid Build Coastguard Worker 771*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVST], 772*9880d681SAndroid Build Coastguard Worker (instregex "ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 773*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVST], 774*9880d681SAndroid Build Coastguard Worker (instregex "ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST")>; 775*9880d681SAndroid Build Coastguard Worker 776*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle], 777*9880d681SAndroid Build Coastguard Worker (instregex "ST1Twov(8b|4h|2s|1d)$")>; 778*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], 779*9880d681SAndroid Build Coastguard Worker (instregex "ST1Twov(8b|4h|2s|1d)_POST")>; 780*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVST, WriteVST], 781*9880d681SAndroid Build Coastguard Worker (instregex "ST1Twov(16b|8h|4s|2d)$")>; 782*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVST, WriteVST], 783*9880d681SAndroid Build Coastguard Worker (instregex "ST1Twov(16b|8h|4s|2d)_POST")>; 784*9880d681SAndroid Build Coastguard Worker 785*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVST], 786*9880d681SAndroid Build Coastguard Worker (instregex "ST1Threev(8b|4h|2s|1d)$")>; 787*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVST], 788*9880d681SAndroid Build Coastguard Worker (instregex "ST1Threev(8b|4h|2s|1d)_POST")>; 789*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVST, WriteVST, WriteVST], 790*9880d681SAndroid Build Coastguard Worker (instregex "ST1Threev(16b|8h|4s|2d)$")>; 791*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVST, WriteVST, WriteVST], 792*9880d681SAndroid Build Coastguard Worker (instregex "ST1Threev(16b|8h|4s|2d)_POST")>; 793*9880d681SAndroid Build Coastguard Worker 794*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVSTShuffle], 795*9880d681SAndroid Build Coastguard Worker (instregex "ST1Fourv(8b|4h|2s|1d)$")>; 796*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle], 797*9880d681SAndroid Build Coastguard Worker (instregex "ST1Fourv(8b|4h|2s|1d)_POST")>; 798*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVST, WriteVST, WriteVST, WriteVST], 799*9880d681SAndroid Build Coastguard Worker (instregex "ST1Fourv(16b|8h|4s|2d)$")>; 800*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVST, WriteVST, WriteVST, WriteVST], 801*9880d681SAndroid Build Coastguard Worker (instregex "ST1Fourv(16b|8h|4s|2d)_POST")>; 802*9880d681SAndroid Build Coastguard Worker 803*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle], (instregex "ST1i(8|16|32)$")>; 804*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], (instregex "ST1i(8|16|32)_POST")>; 805*9880d681SAndroid Build Coastguard Worker 806*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle], (instrs ST1i64)>; 807*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], (instrs ST1i64_POST)>; 808*9880d681SAndroid Build Coastguard Worker 809*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle], 810*9880d681SAndroid Build Coastguard Worker (instregex "ST2Twov(8b|4h|2s)$")>; 811*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], 812*9880d681SAndroid Build Coastguard Worker (instregex "ST2Twov(8b|4h|2s)_POST")>; 813*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVSTShuffle], 814*9880d681SAndroid Build Coastguard Worker (instregex "ST2Twov(16b|8h|4s|2d)$")>; 815*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle], 816*9880d681SAndroid Build Coastguard Worker (instregex "ST2Twov(16b|8h|4s|2d)_POST")>; 817*9880d681SAndroid Build Coastguard Worker 818*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle], (instregex "ST2i(8|16|32)$")>; 819*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], (instregex "ST2i(8|16|32)_POST")>; 820*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle], (instrs ST2i64)>; 821*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], (instrs ST2i64_POST)>; 822*9880d681SAndroid Build Coastguard Worker 823*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVSTShuffle], 824*9880d681SAndroid Build Coastguard Worker (instregex "ST3Threev(8b|4h|2s)$")>; 825*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle], 826*9880d681SAndroid Build Coastguard Worker (instregex "ST3Threev(8b|4h|2s)_POST")>; 827*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVSTShuffle, WriteVSTShuffle], 828*9880d681SAndroid Build Coastguard Worker (instregex "ST3Threev(16b|8h|4s|2d)$")>; 829*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle, WriteVSTShuffle], 830*9880d681SAndroid Build Coastguard Worker (instregex "ST3Threev(16b|8h|4s|2d)_POST")>; 831*9880d681SAndroid Build Coastguard Worker 832*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle], (instregex "ST3i(8|16|32)$")>; 833*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle], (instregex "ST3i(8|16|32)_POST")>; 834*9880d681SAndroid Build Coastguard Worker 835*9880d681SAndroid Build Coastguard Workerdef :InstRW<[WriteVSTShuffle, WriteVSTShuffle], (instrs ST3i64)>; 836*9880d681SAndroid Build Coastguard Workerdef :InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle], (instrs ST3i64_POST)>; 837*9880d681SAndroid Build Coastguard Worker 838*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTPairShuffle, WriteVSTPairShuffle], 839*9880d681SAndroid Build Coastguard Worker (instregex "ST4Fourv(8b|4h|2s|1d)$")>; 840*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTPairShuffle, WriteVSTPairShuffle], 841*9880d681SAndroid Build Coastguard Worker (instregex "ST4Fourv(8b|4h|2s|1d)_POST")>; 842*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTPairShuffle, WriteVSTPairShuffle, 843*9880d681SAndroid Build Coastguard Worker WriteVSTPairShuffle, WriteVSTPairShuffle], 844*9880d681SAndroid Build Coastguard Worker (instregex "ST4Fourv(16b|8h|4s|2d)$")>; 845*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTPairShuffle, WriteVSTPairShuffle, 846*9880d681SAndroid Build Coastguard Worker WriteVSTPairShuffle, WriteVSTPairShuffle], 847*9880d681SAndroid Build Coastguard Worker (instregex "ST4Fourv(16b|8h|4s|2d)_POST")>; 848*9880d681SAndroid Build Coastguard Worker 849*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTPairShuffle], (instregex "ST4i(8|16|32)$")>; 850*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTPairShuffle], (instregex "ST4i(8|16|32)_POST")>; 851*9880d681SAndroid Build Coastguard Worker 852*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSTShuffle, WriteVSTShuffle], (instrs ST4i64)>; 853*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteAdr, WriteVSTShuffle, WriteVSTShuffle],(instrs ST4i64_POST)>; 854*9880d681SAndroid Build Coastguard Worker 855*9880d681SAndroid Build Coastguard Worker// Atomic operations are not supported. 856*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; } 857*9880d681SAndroid Build Coastguard Worker 858*9880d681SAndroid Build Coastguard Worker//--- 859*9880d681SAndroid Build Coastguard Worker// Unused SchedRead types 860*9880d681SAndroid Build Coastguard Worker//--- 861*9880d681SAndroid Build Coastguard Worker 862*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadI, 0>; 863*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadISReg, 0>; 864*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIEReg, 0>; 865*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIM, 0>; 866*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIMA, 0>; 867*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadID, 0>; 868*9880d681SAndroid Build Coastguard Worker 869*9880d681SAndroid Build Coastguard Worker} // SchedModel = CycloneModel 870