1*9880d681SAndroid Build Coastguard Worker//=- ARMScheduleSwift.td - Swift 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 itinerary class data for the Swift processor.. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker// ===---------------------------------------------------------------------===// 15*9880d681SAndroid Build Coastguard Worker// This section contains legacy support for itineraries. This is 16*9880d681SAndroid Build Coastguard Worker// required until SD and PostRA schedulers are replaced by MachineScheduler. 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdef SW_DIS0 : FuncUnit; 19*9880d681SAndroid Build Coastguard Workerdef SW_DIS1 : FuncUnit; 20*9880d681SAndroid Build Coastguard Workerdef SW_DIS2 : FuncUnit; 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdef SW_ALU0 : FuncUnit; 23*9880d681SAndroid Build Coastguard Workerdef SW_ALU1 : FuncUnit; 24*9880d681SAndroid Build Coastguard Workerdef SW_LS : FuncUnit; 25*9880d681SAndroid Build Coastguard Workerdef SW_IDIV : FuncUnit; 26*9880d681SAndroid Build Coastguard Workerdef SW_FDIV : FuncUnit; 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker// FIXME: Need bypasses. 29*9880d681SAndroid Build Coastguard Worker// FIXME: Model the multiple stages of IIC_iMOVix2, IIC_iMOVix2addpc, and 30*9880d681SAndroid Build Coastguard Worker// IIC_iMOVix2ld better. 31*9880d681SAndroid Build Coastguard Worker// FIXME: Model the special immediate shifts that are not microcoded. 32*9880d681SAndroid Build Coastguard Worker// FIXME: Do we need to model the fact that uses of r15 in a micro-op force it 33*9880d681SAndroid Build Coastguard Worker// to issue on pipe 1? 34*9880d681SAndroid Build Coastguard Worker// FIXME: Model the pipelined behavior of CMP / TST instructions. 35*9880d681SAndroid Build Coastguard Worker// FIXME: Better model the microcode stages of multiply instructions, especially 36*9880d681SAndroid Build Coastguard Worker// conditional variants. 37*9880d681SAndroid Build Coastguard Worker// FIXME: Add preload instruction when it is documented. 38*9880d681SAndroid Build Coastguard Worker// FIXME: Model non-pipelined nature of FP div / sqrt unit. 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker// Swift machine model for scheduling and other instruction cost heuristics. 41*9880d681SAndroid Build Coastguard Workerdef SwiftModel : SchedMachineModel { 42*9880d681SAndroid Build Coastguard Worker let IssueWidth = 3; // 3 micro-ops are dispatched per cycle. 43*9880d681SAndroid Build Coastguard Worker let MicroOpBufferSize = 45; // Based on NEON renamed registers. 44*9880d681SAndroid Build Coastguard Worker let LoadLatency = 3; 45*9880d681SAndroid Build Coastguard Worker let MispredictPenalty = 14; // A branch direction mispredict. 46*9880d681SAndroid Build Coastguard Worker let CompleteModel = 0; // FIXME: Remove if all instructions are covered. 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker// Swift predicates. 50*9880d681SAndroid Build Coastguard Workerdef IsFastImmShiftSwiftPred : SchedPredicate<[{TII->isSwiftFastImmShift(MI)}]>; 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker// Swift resource mapping. 53*9880d681SAndroid Build Coastguard Workerlet SchedModel = SwiftModel in { 54*9880d681SAndroid Build Coastguard Worker // Processor resources. 55*9880d681SAndroid Build Coastguard Worker def SwiftUnitP01 : ProcResource<2>; // ALU unit. 56*9880d681SAndroid Build Coastguard Worker def SwiftUnitP0 : ProcResource<1> { let Super = SwiftUnitP01; } // Mul unit. 57*9880d681SAndroid Build Coastguard Worker def SwiftUnitP1 : ProcResource<1> { let Super = SwiftUnitP01; } // Br unit. 58*9880d681SAndroid Build Coastguard Worker def SwiftUnitP2 : ProcResource<1>; // LS unit. 59*9880d681SAndroid Build Coastguard Worker def SwiftUnitDiv : ProcResource<1>; 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker // Generic resource requirements. 62*9880d681SAndroid Build Coastguard Worker def SwiftWriteP0OneCycle : SchedWriteRes<[SwiftUnitP0]>; 63*9880d681SAndroid Build Coastguard Worker def SwiftWriteP0TwoCycle : SchedWriteRes<[SwiftUnitP0]> { let Latency = 2; } 64*9880d681SAndroid Build Coastguard Worker def SwiftWriteP0FourCycle : SchedWriteRes<[SwiftUnitP0]> { let Latency = 4; } 65*9880d681SAndroid Build Coastguard Worker def SwiftWriteP0SixCycle : SchedWriteRes<[SwiftUnitP0]> { let Latency = 6; } 66*9880d681SAndroid Build Coastguard Worker def SwiftWriteP0P1FourCycle : SchedWriteRes<[SwiftUnitP0, SwiftUnitP1]> { 67*9880d681SAndroid Build Coastguard Worker let Latency = 4; 68*9880d681SAndroid Build Coastguard Worker } 69*9880d681SAndroid Build Coastguard Worker def SwiftWriteP0P1SixCycle : SchedWriteRes<[SwiftUnitP0, SwiftUnitP1]> { 70*9880d681SAndroid Build Coastguard Worker let Latency = 6; 71*9880d681SAndroid Build Coastguard Worker } 72*9880d681SAndroid Build Coastguard Worker def SwiftWriteP01OneCycle : SchedWriteRes<[SwiftUnitP01]>; 73*9880d681SAndroid Build Coastguard Worker def SwiftWriteP1TwoCycle : SchedWriteRes<[SwiftUnitP1]> { let Latency = 2; } 74*9880d681SAndroid Build Coastguard Worker def SwiftWriteP1FourCycle : SchedWriteRes<[SwiftUnitP1]> { let Latency = 4; } 75*9880d681SAndroid Build Coastguard Worker def SwiftWriteP1SixCycle : SchedWriteRes<[SwiftUnitP1]> { let Latency = 6; } 76*9880d681SAndroid Build Coastguard Worker def SwiftWriteP1EightCycle : SchedWriteRes<[SwiftUnitP1]> { let Latency = 8; } 77*9880d681SAndroid Build Coastguard Worker def SwiftWriteP1TwelveCyc : SchedWriteRes<[SwiftUnitP1]> { let Latency = 12; } 78*9880d681SAndroid Build Coastguard Worker def SwiftWriteP01OneCycle2x : WriteSequence<[SwiftWriteP01OneCycle], 2>; 79*9880d681SAndroid Build Coastguard Worker def SwiftWriteP01OneCycle3x : WriteSequence<[SwiftWriteP01OneCycle], 3>; 80*9880d681SAndroid Build Coastguard Worker def SwiftWriteP01TwoCycle : SchedWriteRes<[SwiftUnitP01]> { let Latency = 2; } 81*9880d681SAndroid Build Coastguard Worker def SwiftWriteP01ThreeCycleTwoUops : SchedWriteRes<[SwiftUnitP01, 82*9880d681SAndroid Build Coastguard Worker SwiftUnitP01]> { 83*9880d681SAndroid Build Coastguard Worker let Latency = 3; 84*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 85*9880d681SAndroid Build Coastguard Worker } 86*9880d681SAndroid Build Coastguard Worker def SwiftWriteP0ThreeCycleThreeUops : SchedWriteRes<[SwiftUnitP0]> { 87*9880d681SAndroid Build Coastguard Worker let Latency = 3; 88*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 89*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3]; 90*9880d681SAndroid Build Coastguard Worker } 91*9880d681SAndroid Build Coastguard Worker // Plain load without writeback. 92*9880d681SAndroid Build Coastguard Worker def SwiftWriteP2ThreeCycle : SchedWriteRes<[SwiftUnitP2]> { 93*9880d681SAndroid Build Coastguard Worker let Latency = 3; 94*9880d681SAndroid Build Coastguard Worker } 95*9880d681SAndroid Build Coastguard Worker def SwiftWriteP2FourCycle : SchedWriteRes<[SwiftUnitP2]> { 96*9880d681SAndroid Build Coastguard Worker let Latency = 4; 97*9880d681SAndroid Build Coastguard Worker } 98*9880d681SAndroid Build Coastguard Worker // A store does not write to a register. 99*9880d681SAndroid Build Coastguard Worker def SwiftWriteP2 : SchedWriteRes<[SwiftUnitP2]> { 100*9880d681SAndroid Build Coastguard Worker let Latency = 0; 101*9880d681SAndroid Build Coastguard Worker } 102*9880d681SAndroid Build Coastguard Worker foreach Num = 1-4 in { 103*9880d681SAndroid Build Coastguard Worker def SwiftWrite#Num#xP2 : WriteSequence<[SwiftWriteP2], Num>; 104*9880d681SAndroid Build Coastguard Worker } 105*9880d681SAndroid Build Coastguard Worker def SwiftWriteP01OneCycle2x_load : WriteSequence<[SwiftWriteP01OneCycle, 106*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle, 107*9880d681SAndroid Build Coastguard Worker SwiftWriteP2ThreeCycle]>; 108*9880d681SAndroid Build Coastguard Worker // 4.2.4 Arithmetic and Logical. 109*9880d681SAndroid Build Coastguard Worker // ALU operation register shifted by immediate variant. 110*9880d681SAndroid Build Coastguard Worker def SwiftWriteALUsi : SchedWriteVariant<[ 111*9880d681SAndroid Build Coastguard Worker // lsl #2, lsl #1, or lsr #1. 112*9880d681SAndroid Build Coastguard Worker SchedVar<IsFastImmShiftSwiftPred, [SwiftWriteP01TwoCycle]>, 113*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [WriteALU]> 114*9880d681SAndroid Build Coastguard Worker ]>; 115*9880d681SAndroid Build Coastguard Worker def SwiftWriteALUsr : SchedWriteVariant<[ 116*9880d681SAndroid Build Coastguard Worker SchedVar<IsPredicatedPred, [SwiftWriteP01ThreeCycleTwoUops]>, 117*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [SwiftWriteP01TwoCycle]> 118*9880d681SAndroid Build Coastguard Worker ]>; 119*9880d681SAndroid Build Coastguard Worker def SwiftWriteALUSsr : SchedWriteVariant<[ 120*9880d681SAndroid Build Coastguard Worker SchedVar<IsPredicatedPred, [SwiftWriteP0ThreeCycleThreeUops]>, 121*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [SwiftWriteP01TwoCycle]> 122*9880d681SAndroid Build Coastguard Worker ]>; 123*9880d681SAndroid Build Coastguard Worker def SwiftReadAdvanceALUsr : SchedReadVariant<[ 124*9880d681SAndroid Build Coastguard Worker SchedVar<IsPredicatedPred, [SchedReadAdvance<2>]>, 125*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [NoReadAdvance]> 126*9880d681SAndroid Build Coastguard Worker ]>; 127*9880d681SAndroid Build Coastguard Worker // ADC,ADD,NEG,RSB,RSC,SBC,SUB,ADR 128*9880d681SAndroid Build Coastguard Worker // AND,BIC,EOR,ORN,ORR 129*9880d681SAndroid Build Coastguard Worker // CLZ,RBIT,REV,REV16,REVSH,PKH 130*9880d681SAndroid Build Coastguard Worker def : WriteRes<WriteALU, [SwiftUnitP01]>; 131*9880d681SAndroid Build Coastguard Worker def : SchedAlias<WriteALUsi, SwiftWriteALUsi>; 132*9880d681SAndroid Build Coastguard Worker def : SchedAlias<WriteALUsr, SwiftWriteALUsr>; 133*9880d681SAndroid Build Coastguard Worker def : SchedAlias<WriteALUSsr, SwiftWriteALUSsr>; 134*9880d681SAndroid Build Coastguard Worker def : ReadAdvance<ReadALU, 0>; 135*9880d681SAndroid Build Coastguard Worker def : SchedAlias<ReadALUsr, SwiftReadAdvanceALUsr>; 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker def SwiftChooseShiftKindP01OneOrTwoCycle : SchedWriteVariant<[ 139*9880d681SAndroid Build Coastguard Worker SchedVar<IsFastImmShiftSwiftPred, [SwiftWriteP01OneCycle]>, 140*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [SwiftWriteP01TwoCycle]> 141*9880d681SAndroid Build Coastguard Worker ]>; 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker // 4.2.5 Integer comparison 144*9880d681SAndroid Build Coastguard Worker def : WriteRes<WriteCMP, [SwiftUnitP01]>; 145*9880d681SAndroid Build Coastguard Worker def : SchedAlias<WriteCMPsi, SwiftChooseShiftKindP01OneOrTwoCycle>; 146*9880d681SAndroid Build Coastguard Worker def : SchedAlias<WriteCMPsr, SwiftWriteP01TwoCycle>; 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker // 4.2.6 Shift, Move 149*9880d681SAndroid Build Coastguard Worker // Shift 150*9880d681SAndroid Build Coastguard Worker // ASR,LSL,ROR,RRX 151*9880d681SAndroid Build Coastguard Worker // MOV(register-shiftedregister) MVN(register-shiftedregister) 152*9880d681SAndroid Build Coastguard Worker // Move 153*9880d681SAndroid Build Coastguard Worker // MOV,MVN 154*9880d681SAndroid Build Coastguard Worker // MOVT 155*9880d681SAndroid Build Coastguard Worker // Sign/Zero extension 156*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle], 157*9880d681SAndroid Build Coastguard Worker (instregex "SXTB", "SXTH", "SXTB16", "UXTB", "UXTH", "UXTB16", 158*9880d681SAndroid Build Coastguard Worker "t2SXTB", "t2SXTH", "t2SXTB16", "t2UXTB", "t2UXTH", 159*9880d681SAndroid Build Coastguard Worker "t2UXTB16")>; 160*9880d681SAndroid Build Coastguard Worker // Pseudo instructions. 161*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle2x], 162*9880d681SAndroid Build Coastguard Worker (instregex "MOVCCi32imm", "MOVi32imm", "MOV_ga_dyn", "t2MOVCCi32imm", 163*9880d681SAndroid Build Coastguard Worker "t2MOVi32imm", "t2MOV_ga_dyn")>; 164*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle3x], 165*9880d681SAndroid Build Coastguard Worker (instregex "MOV_ga_pcrel", "t2MOV_ga_pcrel", "t2MOVi16_ga_pcrel")>; 166*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle2x_load], 167*9880d681SAndroid Build Coastguard Worker (instregex "MOV_ga_pcrel_ldr", "t2MOV_ga_pcrel_ldr")>; 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker def SwiftWriteP0TwoCyleTwoUops : WriteSequence<[SwiftWriteP0OneCycle], 2>; 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker def SwiftPredP0OneOrTwoCycle : SchedWriteVariant<[ 172*9880d681SAndroid Build Coastguard Worker SchedVar<IsPredicatedPred, [ SwiftWriteP0TwoCyleTwoUops ]>, 173*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [ SwiftWriteP0OneCycle ]> 174*9880d681SAndroid Build Coastguard Worker ]>; 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker // 4.2.7 Select 177*9880d681SAndroid Build Coastguard Worker // SEL 178*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftPredP0OneOrTwoCycle], (instregex "SEL", "t2SEL")>; 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker // 4.2.8 Bitfield 181*9880d681SAndroid Build Coastguard Worker // BFI,BFC, SBFX,UBFX 182*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftWriteP01TwoCycle], 183*9880d681SAndroid Build Coastguard Worker (instregex "BFC", "BFI", "UBFX", "SBFX", "(t|t2)BFC", "(t|t2)BFI", 184*9880d681SAndroid Build Coastguard Worker "(t|t2)UBFX", "(t|t2)SBFX")>; 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker // 4.2.9 Saturating arithmetic 187*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftWriteP01TwoCycle], 188*9880d681SAndroid Build Coastguard Worker (instregex "QADD", "QSUB", "QDADD", "QDSUB", "SSAT", "SSAT16", "USAT", 189*9880d681SAndroid Build Coastguard Worker "USAT16", "QADD8", "QADD16", "QSUB8", "QSUB16", "QASX", "QSAX", 190*9880d681SAndroid Build Coastguard Worker "UQADD8", "UQADD16","UQSUB8","UQSUB16","UQASX","UQSAX", "t2QADD", 191*9880d681SAndroid Build Coastguard Worker "t2QSUB", "t2QDADD", "t2QDSUB", "t2SSAT", "t2SSAT16", "t2USAT", 192*9880d681SAndroid Build Coastguard Worker "t2QADD8", "t2QADD16", "t2QSUB8", "t2QSUB16", "t2QASX", "t2QSAX", 193*9880d681SAndroid Build Coastguard Worker "t2UQADD8", "t2UQADD16","t2UQSUB8","t2UQSUB16","t2UQASX","t2UQSAX")>; 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker // 4.2.10 Parallel Arithmetic 196*9880d681SAndroid Build Coastguard Worker // Not flag setting. 197*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftWriteALUsr], 198*9880d681SAndroid Build Coastguard Worker (instregex "SADD8", "SADD16", "SSUB8", "SSUB16", "SASX", "SSAX", 199*9880d681SAndroid Build Coastguard Worker "UADD8", "UADD16", "USUB8", "USUB16", "UASX", "USAX", "t2SADD8", 200*9880d681SAndroid Build Coastguard Worker "t2SADD16", "t2SSUB8", "t2SSUB16", "t2SASX", "t2SSAX", "t2UADD8", 201*9880d681SAndroid Build Coastguard Worker "t2UADD16", "t2USUB8", "t2USUB16", "t2UASX", "t2USAX")>; 202*9880d681SAndroid Build Coastguard Worker // Flag setting. 203*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftWriteP01TwoCycle], 204*9880d681SAndroid Build Coastguard Worker (instregex "SHADD8", "SHADD16", "SHSUB8", "SHSUB16", "SHASX", "SHSAX", 205*9880d681SAndroid Build Coastguard Worker "SXTAB", "SXTAB16", "SXTAH", "UHADD8", "UHADD16", "UHSUB8", "UHSUB16", 206*9880d681SAndroid Build Coastguard Worker "UHASX", "UHSAX", "UXTAB", "UXTAB16", "UXTAH", "t2SHADD8", "t2SHADD16", 207*9880d681SAndroid Build Coastguard Worker "t2SHSUB8", "t2SHSUB16", "t2SHASX", "t2SHSAX", "t2SXTAB", "t2SXTAB16", 208*9880d681SAndroid Build Coastguard Worker "t2SXTAH", "t2UHADD8", "t2UHADD16", "t2UHSUB8", "t2UHSUB16", "t2UHASX", 209*9880d681SAndroid Build Coastguard Worker "t2UHSAX", "t2UXTAB", "t2UXTAB16", "t2UXTAH")>; 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker // 4.2.11 Sum of Absolute Difference 212*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftWriteP0P1FourCycle], (instregex "USAD8") >; 213*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0P1FourCycle, ReadALU, ReadALU, SchedReadAdvance<2>], 214*9880d681SAndroid Build Coastguard Worker (instregex "USADA8")>; 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker // 4.2.12 Integer Multiply (32-bit result) 217*9880d681SAndroid Build Coastguard Worker // Two sources. 218*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftWriteP0FourCycle], 219*9880d681SAndroid Build Coastguard Worker (instregex "MULS", "MUL", "SMMUL", "SMMULR", "SMULBB", "SMULBT", 220*9880d681SAndroid Build Coastguard Worker "SMULTB", "SMULTT", "SMULWB", "SMULWT", "SMUSD", "SMUSDXi", "t2MUL", 221*9880d681SAndroid Build Coastguard Worker "t2SMMUL", "t2SMMULR", "t2SMULBB", "t2SMULBT", "t2SMULTB", "t2SMULTT", 222*9880d681SAndroid Build Coastguard Worker "t2SMULWB", "t2SMULWT", "t2SMUSD")>; 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker def SwiftWriteP0P01FiveCycleTwoUops : 225*9880d681SAndroid Build Coastguard Worker SchedWriteRes<[SwiftUnitP0, SwiftUnitP01]> { 226*9880d681SAndroid Build Coastguard Worker let Latency = 5; 227*9880d681SAndroid Build Coastguard Worker } 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker def SwiftPredP0P01FourFiveCycle : SchedWriteVariant<[ 230*9880d681SAndroid Build Coastguard Worker SchedVar<IsPredicatedPred, [ SwiftWriteP0P01FiveCycleTwoUops ]>, 231*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [ SwiftWriteP0FourCycle ]> 232*9880d681SAndroid Build Coastguard Worker ]>; 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker def SwiftReadAdvanceFourCyclesPred : SchedReadVariant<[ 235*9880d681SAndroid Build Coastguard Worker SchedVar<IsPredicatedPred, [SchedReadAdvance<4>]>, 236*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [ReadALU]> 237*9880d681SAndroid Build Coastguard Worker ]>; 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker // Multiply accumulate, three sources 240*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftPredP0P01FourFiveCycle, ReadALU, ReadALU, 241*9880d681SAndroid Build Coastguard Worker SwiftReadAdvanceFourCyclesPred], 242*9880d681SAndroid Build Coastguard Worker (instregex "MLAS", "MLA", "MLS", "SMMLA", "SMMLAR", "SMMLS", "SMMLSR", 243*9880d681SAndroid Build Coastguard Worker "t2MLA", "t2MLS", "t2MLAS", "t2SMMLA", "t2SMMLAR", "t2SMMLS", 244*9880d681SAndroid Build Coastguard Worker "t2SMMLSR")>; 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker // 4.2.13 Integer Multiply (32-bit result, Q flag) 247*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftWriteP0FourCycle], 248*9880d681SAndroid Build Coastguard Worker (instregex "SMUAD", "SMUADX", "t2SMUAD", "t2SMUADX")>; 249*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftPredP0P01FourFiveCycle, ReadALU, ReadALU, 250*9880d681SAndroid Build Coastguard Worker SwiftReadAdvanceFourCyclesPred], 251*9880d681SAndroid Build Coastguard Worker (instregex "SMLABB", "SMLABT", "SMLATB", "SMLATT", "SMLSD", "SMLSDX", 252*9880d681SAndroid Build Coastguard Worker "SMLAWB", "SMLAWT", "t2SMLABB", "t2SMLABT", "t2SMLATB", "t2SMLATT", 253*9880d681SAndroid Build Coastguard Worker "t2SMLSD", "t2SMLSDX", "t2SMLAWB", "t2SMLAWT")>; 254*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftPredP0P01FourFiveCycle], 255*9880d681SAndroid Build Coastguard Worker (instregex "SMLAD", "SMLADX", "t2SMLAD", "t2SMLADX")>; 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Worker def SwiftP0P0P01FiveCycle : SchedWriteRes<[SwiftUnitP0, SwiftUnitP01]> { 258*9880d681SAndroid Build Coastguard Worker let Latency = 5; 259*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 260*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 261*9880d681SAndroid Build Coastguard Worker } 262*9880d681SAndroid Build Coastguard Worker def SwiftWrite1Cycle : SchedWriteRes<[]> { 263*9880d681SAndroid Build Coastguard Worker let Latency = 1; 264*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 0; 265*9880d681SAndroid Build Coastguard Worker } 266*9880d681SAndroid Build Coastguard Worker def SwiftWrite5Cycle : SchedWriteRes<[]> { 267*9880d681SAndroid Build Coastguard Worker let Latency = 5; 268*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 0; 269*9880d681SAndroid Build Coastguard Worker } 270*9880d681SAndroid Build Coastguard Worker def SwiftWrite6Cycle : SchedWriteRes<[]> { 271*9880d681SAndroid Build Coastguard Worker let Latency = 6; 272*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 0; 273*9880d681SAndroid Build Coastguard Worker } 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker // 4.2.14 Integer Multiply, Long 276*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftP0P0P01FiveCycle, SwiftWrite5Cycle], 277*9880d681SAndroid Build Coastguard Worker (instregex "SMULL$", "UMULL$", "t2SMULL$", "t2UMULL$")>; 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Worker def Swift2P03P01FiveCycle : SchedWriteRes<[SwiftUnitP0, SwiftUnitP01]> { 280*9880d681SAndroid Build Coastguard Worker let Latency = 7; 281*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 5; 282*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 3]; 283*9880d681SAndroid Build Coastguard Worker } 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Worker // 4.2.15 Integer Multiply Accumulate, Long 286*9880d681SAndroid Build Coastguard Worker // 4.2.16 Integer Multiply Accumulate, Dual 287*9880d681SAndroid Build Coastguard Worker // 4.2.17 Integer Multiply Accumulate Accumulate, Long 288*9880d681SAndroid Build Coastguard Worker // We are being a bit inaccurate here. 289*9880d681SAndroid Build Coastguard Worker def : InstRW< [SwiftWrite5Cycle, Swift2P03P01FiveCycle, ReadALU, ReadALU, 290*9880d681SAndroid Build Coastguard Worker SchedReadAdvance<4>, SchedReadAdvance<3>], 291*9880d681SAndroid Build Coastguard Worker (instregex "SMLALS", "UMLALS", "SMLAL", "UMLAL", "MLALBB", "SMLALBT", 292*9880d681SAndroid Build Coastguard Worker "SMLALTB", "SMLALTT", "SMLALD", "SMLALDX", "SMLSLD", "SMLSLDX", 293*9880d681SAndroid Build Coastguard Worker "UMAAL", "t2SMLALS", "t2UMLALS", "t2SMLAL", "t2UMLAL", "t2MLALBB", "t2SMLALBT", 294*9880d681SAndroid Build Coastguard Worker "t2SMLALTB", "t2SMLALTT", "t2SMLALD", "t2SMLALDX", "t2SMLSLD", "t2SMLSLDX", 295*9880d681SAndroid Build Coastguard Worker "t2UMAAL")>; 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker def SwiftDiv : SchedWriteRes<[SwiftUnitP0, SwiftUnitDiv]> { 298*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 1; 299*9880d681SAndroid Build Coastguard Worker let Latency = 14; 300*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 14]; 301*9880d681SAndroid Build Coastguard Worker } 302*9880d681SAndroid Build Coastguard Worker // 4.2.18 Integer Divide 303*9880d681SAndroid Build Coastguard Worker def : WriteRes<WriteDiv, [SwiftUnitDiv]>; // Workaround. 304*9880d681SAndroid Build Coastguard Worker def : InstRW <[SwiftDiv], 305*9880d681SAndroid Build Coastguard Worker (instregex "SDIV", "UDIV", "t2SDIV", "t2UDIV")>; 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker // 4.2.19 Integer Load Single Element 308*9880d681SAndroid Build Coastguard Worker // 4.2.20 Integer Load Signextended 309*9880d681SAndroid Build Coastguard Worker def SwiftWriteP2P01ThreeCycle : SchedWriteRes<[SwiftUnitP2, SwiftUnitP01]> { 310*9880d681SAndroid Build Coastguard Worker let Latency = 3; 311*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 312*9880d681SAndroid Build Coastguard Worker } 313*9880d681SAndroid Build Coastguard Worker def SwiftWriteP2P01FourCyle : SchedWriteRes<[SwiftUnitP2, SwiftUnitP01]> { 314*9880d681SAndroid Build Coastguard Worker let Latency = 4; 315*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 316*9880d681SAndroid Build Coastguard Worker } 317*9880d681SAndroid Build Coastguard Worker def SwiftWriteP2P01P01FourCycle : SchedWriteRes<[SwiftUnitP2, SwiftUnitP01, 318*9880d681SAndroid Build Coastguard Worker SwiftUnitP01]> { 319*9880d681SAndroid Build Coastguard Worker let Latency = 4; 320*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 321*9880d681SAndroid Build Coastguard Worker } 322*9880d681SAndroid Build Coastguard Worker def SwiftWriteP2P2ThreeCycle : SchedWriteRes<[SwiftUnitP2, SwiftUnitP2]> { 323*9880d681SAndroid Build Coastguard Worker let Latency = 3; 324*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 325*9880d681SAndroid Build Coastguard Worker } 326*9880d681SAndroid Build Coastguard Worker def SwiftWriteP2P2P01ThreeCycle : SchedWriteRes<[SwiftUnitP2, SwiftUnitP2, 327*9880d681SAndroid Build Coastguard Worker SwiftUnitP01]> { 328*9880d681SAndroid Build Coastguard Worker let Latency = 3; 329*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 330*9880d681SAndroid Build Coastguard Worker } 331*9880d681SAndroid Build Coastguard Worker def SwiftWrBackOne : SchedWriteRes<[]> { 332*9880d681SAndroid Build Coastguard Worker let Latency = 1; 333*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 0; 334*9880d681SAndroid Build Coastguard Worker } 335*9880d681SAndroid Build Coastguard Worker def SwiftWriteLdFour : SchedWriteRes<[]> { 336*9880d681SAndroid Build Coastguard Worker let Latency = 4; 337*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 0; 338*9880d681SAndroid Build Coastguard Worker } 339*9880d681SAndroid Build Coastguard Worker // Not accurate. 340*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2ThreeCycle], 341*9880d681SAndroid Build Coastguard Worker (instregex "LDR(i12|rs)$", "LDRB(i12|rs)$", "t2LDR(i8|i12|s|pci)", 342*9880d681SAndroid Build Coastguard Worker "t2LDR(H|B)(i8|i12|s|pci)", "LDREX", "tLDR[BH](r|i|spi|pci|pciASM)", 343*9880d681SAndroid Build Coastguard Worker "tLDR(r|i|spi|pci|pciASM)")>; 344*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2ThreeCycle], 345*9880d681SAndroid Build Coastguard Worker (instregex "LDRH$", "PICLDR$", "PICLDR(H|B)$", "LDRcp$")>; 346*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2P01FourCyle], 347*9880d681SAndroid Build Coastguard Worker (instregex "PICLDRS(H|B)$", "t2LDRS(H|B)(i|r|p|s)", "LDRS(H|B)$", 348*9880d681SAndroid Build Coastguard Worker "t2LDRpci_pic", "tLDRS(B|H)")>; 349*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2P01ThreeCycle, SwiftWrBackOne], 350*9880d681SAndroid Build Coastguard Worker (instregex "LD(RB|R)(_|T_)(POST|PRE)_(IMM|REG)", "LDRH(_PRE|_POST)", 351*9880d681SAndroid Build Coastguard Worker "LDR(T|BT)_POST_(REG|IMM)", "LDRHT(i|r)", 352*9880d681SAndroid Build Coastguard Worker "t2LD(R|RB|RH)_(PRE|POST)", "t2LD(R|RB|RH)T")>; 353*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2P01P01FourCycle, SwiftWrBackOne], 354*9880d681SAndroid Build Coastguard Worker (instregex "LDR(SH|SB)(_POST|_PRE)", "t2LDR(SH|SB)(_POST|_PRE)", 355*9880d681SAndroid Build Coastguard Worker "LDRS(B|H)T(i|r)", "t2LDRS(B|H)T(i|r)", "t2LDRS(B|H)T")>; 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker // 4.2.21 Integer Dual Load 358*9880d681SAndroid Build Coastguard Worker // Not accurate. 359*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2P2ThreeCycle, SwiftWriteLdFour], 360*9880d681SAndroid Build Coastguard Worker (instregex "t2LDRDi8", "LDRD$")>; 361*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2P2P01ThreeCycle, SwiftWriteLdFour, SwiftWrBackOne], 362*9880d681SAndroid Build Coastguard Worker (instregex "LDRD_(POST|PRE)", "t2LDRD_(POST|PRE)")>; 363*9880d681SAndroid Build Coastguard Worker 364*9880d681SAndroid Build Coastguard Worker // 4.2.22 Integer Load, Multiple 365*9880d681SAndroid Build Coastguard Worker // NumReg = 1 .. 16 366*9880d681SAndroid Build Coastguard Worker foreach Lat = 3-25 in { 367*9880d681SAndroid Build Coastguard Worker def SwiftWriteLM#Lat#Cy : SchedWriteRes<[SwiftUnitP2]> { 368*9880d681SAndroid Build Coastguard Worker let Latency = Lat; 369*9880d681SAndroid Build Coastguard Worker } 370*9880d681SAndroid Build Coastguard Worker def SwiftWriteLM#Lat#CyNo : SchedWriteRes<[]> { 371*9880d681SAndroid Build Coastguard Worker let Latency = Lat; 372*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 0; 373*9880d681SAndroid Build Coastguard Worker } 374*9880d681SAndroid Build Coastguard Worker } 375*9880d681SAndroid Build Coastguard Worker // Predicate. 376*9880d681SAndroid Build Coastguard Worker foreach NumAddr = 1-16 in { 377*9880d681SAndroid Build Coastguard Worker def SwiftLMAddr#NumAddr#Pred : SchedPredicate<"TII->getNumLDMAddresses(*MI) == "#NumAddr>; 378*9880d681SAndroid Build Coastguard Worker } 379*9880d681SAndroid Build Coastguard Worker def SwiftWriteLDMAddrNoWB : SchedWriteRes<[SwiftUnitP01]> { let Latency = 0; } 380*9880d681SAndroid Build Coastguard Worker def SwiftWriteLDMAddrWB : SchedWriteRes<[SwiftUnitP01, SwiftUnitP01]>; 381*9880d681SAndroid Build Coastguard Worker def SwiftWriteLM : SchedWriteVariant<[ 382*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr2Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy]>, 383*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr3Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy, 384*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy]>, 385*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr4Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy, 386*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy]>, 387*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr5Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy, 388*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 389*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy]>, 390*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr6Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy, 391*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 392*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy]>, 393*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr7Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy, 394*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 395*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy, 396*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9Cy]>, 397*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr8Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy, 398*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 399*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy, 400*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9Cy, SwiftWriteLM10Cy]>, 401*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr9Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy, 402*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 403*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy, 404*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9Cy, SwiftWriteLM10Cy, 405*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy]>, 406*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr10Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy, 407*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 408*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy, 409*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9Cy, SwiftWriteLM10Cy, 410*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftWriteLM12Cy]>, 411*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr11Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy, 412*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 413*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy, 414*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9Cy, SwiftWriteLM10Cy, 415*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftWriteLM12Cy, 416*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy]>, 417*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr12Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy, 418*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 419*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy, 420*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9Cy, SwiftWriteLM10Cy, 421*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftWriteLM12Cy, 422*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM14Cy]>, 423*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr13Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy, 424*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 425*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy, 426*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9Cy, SwiftWriteLM10Cy, 427*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftWriteLM12Cy, 428*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM14Cy, 429*9880d681SAndroid Build Coastguard Worker SwiftWriteLM15Cy]>, 430*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr14Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy, 431*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 432*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy, 433*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9Cy, SwiftWriteLM10Cy, 434*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftWriteLM12Cy, 435*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM14Cy, 436*9880d681SAndroid Build Coastguard Worker SwiftWriteLM15Cy, SwiftWriteLM16Cy]>, 437*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr15Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy, 438*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 439*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy, 440*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9Cy, SwiftWriteLM10Cy, 441*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftWriteLM12Cy, 442*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM14Cy, 443*9880d681SAndroid Build Coastguard Worker SwiftWriteLM15Cy, SwiftWriteLM16Cy, 444*9880d681SAndroid Build Coastguard Worker SwiftWriteLM17Cy]>, 445*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr16Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy, 446*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5Cy, SwiftWriteLM6Cy, 447*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7Cy, SwiftWriteLM8Cy, 448*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9Cy, SwiftWriteLM10Cy, 449*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftWriteLM12Cy, 450*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM14Cy, 451*9880d681SAndroid Build Coastguard Worker SwiftWriteLM15Cy, SwiftWriteLM16Cy, 452*9880d681SAndroid Build Coastguard Worker SwiftWriteLM17Cy, SwiftWriteLM18Cy]>, 453*9880d681SAndroid Build Coastguard Worker // Unknow number of registers, just use resources for two registers. 454*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy, 455*9880d681SAndroid Build Coastguard Worker SwiftWriteLM5CyNo, SwiftWriteLM6CyNo, 456*9880d681SAndroid Build Coastguard Worker SwiftWriteLM7CyNo, SwiftWriteLM8CyNo, 457*9880d681SAndroid Build Coastguard Worker SwiftWriteLM9CyNo, SwiftWriteLM10CyNo, 458*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11CyNo, SwiftWriteLM12CyNo, 459*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM14CyNo, 460*9880d681SAndroid Build Coastguard Worker SwiftWriteLM15CyNo, SwiftWriteLM16CyNo, 461*9880d681SAndroid Build Coastguard Worker SwiftWriteLM17CyNo, SwiftWriteLM18CyNo]> 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard Worker ]> { let Variadic=1; } 464*9880d681SAndroid Build Coastguard Worker 465*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM, SwiftWriteLDMAddrNoWB], 466*9880d681SAndroid Build Coastguard Worker (instregex "LDM(IA|DA|DB|IB)$", "t2LDM(IA|DA|DB|IB)$", 467*9880d681SAndroid Build Coastguard Worker "(t|sys)LDM(IA|DA|DB|IB)$")>; 468*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLDMAddrWB, SwiftWriteLM], 469*9880d681SAndroid Build Coastguard Worker (instregex /*"t2LDMIA_RET", "tLDMIA_RET", "LDMIA_RET",*/ 470*9880d681SAndroid Build Coastguard Worker "LDM(IA|DA|DB|IB)_UPD", "(t2|sys|t)LDM(IA|DA|DB|IB)_UPD")>; 471*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLDMAddrWB, SwiftWriteLM, SwiftWriteP1TwoCycle], 472*9880d681SAndroid Build Coastguard Worker (instregex "LDMIA_RET", "(t|t2)LDMIA_RET", "POP", "tPOP")>; 473*9880d681SAndroid Build Coastguard Worker // 4.2.23 Integer Store, Single Element 474*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2], 475*9880d681SAndroid Build Coastguard Worker (instregex "PICSTR", "STR(i12|rs)", "STRB(i12|rs)", "STRH$", "STREX", 476*9880d681SAndroid Build Coastguard Worker "t2STR(i12|i8|s)$", "t2STR[BH](i12|i8|s)$", "tSTR[BH](i|r)", "tSTR(i|r)", "tSTRspi")>; 477*9880d681SAndroid Build Coastguard Worker 478*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWriteP2], 479*9880d681SAndroid Build Coastguard Worker (instregex "STR(B_|_|BT_|T_)(PRE_IMM|PRE_REG|POST_REG|POST_IMM)", 480*9880d681SAndroid Build Coastguard Worker "STR(i|r)_preidx", "STRB(i|r)_preidx", "STRH_preidx", "STR(H_|HT_)(PRE|POST)", 481*9880d681SAndroid Build Coastguard Worker "STR(BT|HT|T)", "t2STR_(PRE|POST)", "t2STR[BH]_(PRE|POST)", 482*9880d681SAndroid Build Coastguard Worker "t2STR_preidx", "t2STR[BH]_preidx", "t2ST(RB|RH|R)T")>; 483*9880d681SAndroid Build Coastguard Worker 484*9880d681SAndroid Build Coastguard Worker // 4.2.24 Integer Store, Dual 485*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2, SwiftWriteP2, SwiftWriteP01OneCycle], 486*9880d681SAndroid Build Coastguard Worker (instregex "STRD$", "t2STRDi8")>; 487*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWriteP2, SwiftWriteP2, 488*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle], 489*9880d681SAndroid Build Coastguard Worker (instregex "(t2|t)STRD_(POST|PRE)", "STRD_(POST|PRE)")>; 490*9880d681SAndroid Build Coastguard Worker 491*9880d681SAndroid Build Coastguard Worker // 4.2.25 Integer Store, Multiple 492*9880d681SAndroid Build Coastguard Worker def SwiftWriteStIncAddr : SchedWriteRes<[SwiftUnitP2, SwiftUnitP01]> { 493*9880d681SAndroid Build Coastguard Worker let Latency = 0; 494*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 495*9880d681SAndroid Build Coastguard Worker } 496*9880d681SAndroid Build Coastguard Worker foreach NumAddr = 1-16 in { 497*9880d681SAndroid Build Coastguard Worker def SwiftWriteSTM#NumAddr : WriteSequence<[SwiftWriteStIncAddr], NumAddr>; 498*9880d681SAndroid Build Coastguard Worker } 499*9880d681SAndroid Build Coastguard Worker def SwiftWriteSTM : SchedWriteVariant<[ 500*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr2Pred, [SwiftWriteSTM2]>, 501*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr3Pred, [SwiftWriteSTM3]>, 502*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr4Pred, [SwiftWriteSTM4]>, 503*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr5Pred, [SwiftWriteSTM5]>, 504*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr6Pred, [SwiftWriteSTM6]>, 505*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr7Pred, [SwiftWriteSTM7]>, 506*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr8Pred, [SwiftWriteSTM8]>, 507*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr9Pred, [SwiftWriteSTM9]>, 508*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr10Pred,[SwiftWriteSTM10]>, 509*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr11Pred,[SwiftWriteSTM11]>, 510*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr12Pred,[SwiftWriteSTM12]>, 511*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr13Pred,[SwiftWriteSTM13]>, 512*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr14Pred,[SwiftWriteSTM14]>, 513*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr15Pred,[SwiftWriteSTM15]>, 514*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr16Pred,[SwiftWriteSTM16]>, 515*9880d681SAndroid Build Coastguard Worker // Unknow number of registers, just use resources for two registers. 516*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [SwiftWriteSTM2]> 517*9880d681SAndroid Build Coastguard Worker ]>; 518*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteSTM], 519*9880d681SAndroid Build Coastguard Worker (instregex "STM(IB|IA|DB|DA)$", "(t2|sys|t)STM(IB|IA|DB|DA)$")>; 520*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWriteSTM], 521*9880d681SAndroid Build Coastguard Worker (instregex "STM(IB|IA|DB|DA)_UPD", "(t2|sys|t)STM(IB|IA|DB|DA)_UPD", 522*9880d681SAndroid Build Coastguard Worker "PUSH", "tPUSH")>; 523*9880d681SAndroid Build Coastguard Worker 524*9880d681SAndroid Build Coastguard Worker // LDRLIT pseudo instructions, they expand to LDR + PICADD 525*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2ThreeCycle, WriteALU], 526*9880d681SAndroid Build Coastguard Worker (instregex "t?LDRLIT_ga_abs", "t?LDRLIT_ga_pcrel")>; 527*9880d681SAndroid Build Coastguard Worker // LDRLIT_ga_pcrel_ldr expands to LDR + PICLDR 528*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2ThreeCycle, SwiftWriteP2ThreeCycle], 529*9880d681SAndroid Build Coastguard Worker (instregex "LDRLIT_ga_pcrel_ldr")>; 530*9880d681SAndroid Build Coastguard Worker 531*9880d681SAndroid Build Coastguard Worker // 4.2.26 Branch 532*9880d681SAndroid Build Coastguard Worker def : WriteRes<WriteBr, [SwiftUnitP1]> { let Latency = 0; } 533*9880d681SAndroid Build Coastguard Worker def : WriteRes<WriteBrL, [SwiftUnitP1]> { let Latency = 2; } 534*9880d681SAndroid Build Coastguard Worker def : WriteRes<WriteBrTbl, [SwiftUnitP1, SwiftUnitP2]> { let Latency = 0; } 535*9880d681SAndroid Build Coastguard Worker 536*9880d681SAndroid Build Coastguard Worker // 4.2.27 Not issued 537*9880d681SAndroid Build Coastguard Worker def : WriteRes<WriteNoop, []> { let Latency = 0; let NumMicroOps = 0; } 538*9880d681SAndroid Build Coastguard Worker def : InstRW<[WriteNoop], (instregex "t2IT", "IT", "NOP")>; 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Worker // 4.2.28 Advanced SIMD, Integer, 2 cycle 541*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0TwoCycle], 542*9880d681SAndroid Build Coastguard Worker (instregex "VADDv", "VSUBv", "VNEG(s|f|v)", "VADDL", "VSUBL", 543*9880d681SAndroid Build Coastguard Worker "VADDW", "VSUBW", "VHADD", "VHSUB", "VRHADD", "VPADDi", 544*9880d681SAndroid Build Coastguard Worker "VPADDL", "VAND", "VBIC", "VEOR", "VORN", "VORR", "VTST", 545*9880d681SAndroid Build Coastguard Worker "VSHL", "VSHR(s|u)", "VSHLL", "VQSHL", "VQSHLU", "VBIF", 546*9880d681SAndroid Build Coastguard Worker "VBIT", "VBSL", "VSLI", "VSRI", "VCLS", "VCLZ", "VCNT")>; 547*9880d681SAndroid Build Coastguard Worker 548*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1TwoCycle], 549*9880d681SAndroid Build Coastguard Worker (instregex "VEXT", "VREV16", "VREV32", "VREV64")>; 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Worker // 4.2.29 Advanced SIMD, Integer, 4 cycle 552*9880d681SAndroid Build Coastguard Worker // 4.2.30 Advanced SIMD, Integer with Accumulate 553*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0FourCycle], 554*9880d681SAndroid Build Coastguard Worker (instregex "VABA", "VABAL", "VPADAL", "VRSRA", "VSRA", "VACGE", "VACGT", 555*9880d681SAndroid Build Coastguard Worker "VACLE", "VACLT", "VCEQ", "VCGE", "VCGT", "VCLE", "VCLT", "VRSHL", 556*9880d681SAndroid Build Coastguard Worker "VQRSHL", "VRSHR(u|s)", "VABS(f|v)", "VQABS", "VQNEG", "VQADD", 557*9880d681SAndroid Build Coastguard Worker "VQSUB")>; 558*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1FourCycle], 559*9880d681SAndroid Build Coastguard Worker (instregex "VRECPE", "VRSQRTE")>; 560*9880d681SAndroid Build Coastguard Worker 561*9880d681SAndroid Build Coastguard Worker // 4.2.31 Advanced SIMD, Add and Shift with Narrow 562*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0P1FourCycle], 563*9880d681SAndroid Build Coastguard Worker (instregex "VADDHN", "VSUBHN", "VSHRN")>; 564*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0P1SixCycle], 565*9880d681SAndroid Build Coastguard Worker (instregex "VRADDHN", "VRSUBHN", "VRSHRN", "VQSHRN", "VQSHRUN", 566*9880d681SAndroid Build Coastguard Worker "VQRSHRN", "VQRSHRUN")>; 567*9880d681SAndroid Build Coastguard Worker 568*9880d681SAndroid Build Coastguard Worker // 4.2.32 Advanced SIMD, Vector Table Lookup 569*9880d681SAndroid Build Coastguard Worker foreach Num = 1-4 in { 570*9880d681SAndroid Build Coastguard Worker def SwiftWrite#Num#xP1TwoCycle : WriteSequence<[SwiftWriteP1TwoCycle], Num>; 571*9880d681SAndroid Build Coastguard Worker } 572*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite1xP1TwoCycle], 573*9880d681SAndroid Build Coastguard Worker (instregex "VTB(L|X)1")>; 574*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite2xP1TwoCycle], 575*9880d681SAndroid Build Coastguard Worker (instregex "VTB(L|X)2")>; 576*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite3xP1TwoCycle], 577*9880d681SAndroid Build Coastguard Worker (instregex "VTB(L|X)3")>; 578*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite4xP1TwoCycle], 579*9880d681SAndroid Build Coastguard Worker (instregex "VTB(L|X)4")>; 580*9880d681SAndroid Build Coastguard Worker 581*9880d681SAndroid Build Coastguard Worker // 4.2.33 Advanced SIMD, Transpose 582*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1FourCycle, SwiftWriteP1FourCycle, 583*9880d681SAndroid Build Coastguard Worker SwiftWriteP1TwoCycle/*RsrcOnly*/, SchedReadAdvance<2>], 584*9880d681SAndroid Build Coastguard Worker (instregex "VSWP", "VTRN", "VUZP", "VZIP")>; 585*9880d681SAndroid Build Coastguard Worker 586*9880d681SAndroid Build Coastguard Worker // 4.2.34 Advanced SIMD and VFP, Floating Point 587*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0TwoCycle], (instregex "VABS(S|D)$", "VNEG(S|D)$")>; 588*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0FourCycle], 589*9880d681SAndroid Build Coastguard Worker (instregex "VCMP(D|S|ZD|ZS)$", "VCMPE(D|S|ZD|ZS)")>; 590*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0FourCycle], 591*9880d681SAndroid Build Coastguard Worker (instregex "VADD(S|f)", "VSUB(S|f)", "VABD", "VPADDf", "VMAX", "VMIN", "VPMAX", 592*9880d681SAndroid Build Coastguard Worker "VPMIN")>; 593*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0SixCycle], (instregex "VADDD$", "VSUBD$")>; 594*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1EightCycle], (instregex "VRECPS", "VRSQRTS")>; 595*9880d681SAndroid Build Coastguard Worker 596*9880d681SAndroid Build Coastguard Worker // 4.2.35 Advanced SIMD and VFP, Multiply 597*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1FourCycle], 598*9880d681SAndroid Build Coastguard Worker (instregex "VMUL(S|v|p|f|s)", "VNMULS", "VQDMULH", "VQRDMULH", 599*9880d681SAndroid Build Coastguard Worker "VMULL", "VQDMULL")>; 600*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1SixCycle], 601*9880d681SAndroid Build Coastguard Worker (instregex "VMULD", "VNMULD")>; 602*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1FourCycle], 603*9880d681SAndroid Build Coastguard Worker (instregex "VMLA", "VMLS", "VNMLA", "VNMLS", "VFMA(S|D)", "VFMS(S|D)", 604*9880d681SAndroid Build Coastguard Worker "VFNMA", "VFNMS", "VMLAL", "VMLSL","VQDMLAL", "VQDMLSL")>; 605*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1EightCycle], (instregex "VFMAfd", "VFMSfd")>; 606*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1TwelveCyc], (instregex "VFMAfq", "VFMSfq")>; 607*9880d681SAndroid Build Coastguard Worker 608*9880d681SAndroid Build Coastguard Worker // 4.2.36 Advanced SIMD and VFP, Convert 609*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1FourCycle], (instregex "VCVT", "V(S|U)IT", "VTO(S|U)")>; 610*9880d681SAndroid Build Coastguard Worker // Fixpoint conversions. 611*9880d681SAndroid Build Coastguard Worker def : WriteRes<WriteCvtFP, [SwiftUnitP1]> { let Latency = 4; } 612*9880d681SAndroid Build Coastguard Worker 613*9880d681SAndroid Build Coastguard Worker // 4.2.37 Advanced SIMD and VFP, Move 614*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0TwoCycle], 615*9880d681SAndroid Build Coastguard Worker (instregex "VMOVv", "VMOV(S|D)$", "VMOV(S|D)cc", 616*9880d681SAndroid Build Coastguard Worker "VMVNv", "VMVN(d|q)", "VMVN(S|D)cc", 617*9880d681SAndroid Build Coastguard Worker "FCONST(D|S)")>; 618*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1TwoCycle], (instregex "VMOVN", "VMOVL")>; 619*9880d681SAndroid Build Coastguard Worker def : InstRW<[WriteSequence<[SwiftWriteP0FourCycle, SwiftWriteP1TwoCycle]>], 620*9880d681SAndroid Build Coastguard Worker (instregex "VQMOVN")>; 621*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP1TwoCycle], (instregex "VDUPLN", "VDUPf")>; 622*9880d681SAndroid Build Coastguard Worker def : InstRW<[WriteSequence<[SwiftWriteP2FourCycle, SwiftWriteP1TwoCycle]>], 623*9880d681SAndroid Build Coastguard Worker (instregex "VDUP(8|16|32)")>; 624*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2ThreeCycle], (instregex "VMOVRS$")>; 625*9880d681SAndroid Build Coastguard Worker def : InstRW<[WriteSequence<[SwiftWriteP2FourCycle, SwiftWriteP0TwoCycle]>], 626*9880d681SAndroid Build Coastguard Worker (instregex "VMOVSR$", "VSETLN")>; 627*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2ThreeCycle, SwiftWriteP2FourCycle], 628*9880d681SAndroid Build Coastguard Worker (instregex "VMOVRR(D|S)$")>; 629*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP2FourCycle], (instregex "VMOVDRR$")>; 630*9880d681SAndroid Build Coastguard Worker def : InstRW<[WriteSequence<[SwiftWriteP2FourCycle, SwiftWriteP1TwoCycle]>, 631*9880d681SAndroid Build Coastguard Worker WriteSequence<[SwiftWrite1Cycle, SwiftWriteP2FourCycle, 632*9880d681SAndroid Build Coastguard Worker SwiftWriteP1TwoCycle]>], 633*9880d681SAndroid Build Coastguard Worker (instregex "VMOVSRR$")>; 634*9880d681SAndroid Build Coastguard Worker def : InstRW<[WriteSequence<[SwiftWriteP1TwoCycle, SwiftWriteP2ThreeCycle]>], 635*9880d681SAndroid Build Coastguard Worker (instregex "VGETLN(u|i)")>; 636*9880d681SAndroid Build Coastguard Worker def : InstRW<[WriteSequence<[SwiftWriteP1TwoCycle, SwiftWriteP2ThreeCycle, 637*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle]>], 638*9880d681SAndroid Build Coastguard Worker (instregex "VGETLNs")>; 639*9880d681SAndroid Build Coastguard Worker 640*9880d681SAndroid Build Coastguard Worker // 4.2.38 Advanced SIMD and VFP, Move FPSCR 641*9880d681SAndroid Build Coastguard Worker // Serializing instructions. 642*9880d681SAndroid Build Coastguard Worker def SwiftWaitP0For15Cy : SchedWriteRes<[SwiftUnitP0]> { 643*9880d681SAndroid Build Coastguard Worker let Latency = 15; 644*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [15]; 645*9880d681SAndroid Build Coastguard Worker } 646*9880d681SAndroid Build Coastguard Worker def SwiftWaitP1For15Cy : SchedWriteRes<[SwiftUnitP1]> { 647*9880d681SAndroid Build Coastguard Worker let Latency = 15; 648*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [15]; 649*9880d681SAndroid Build Coastguard Worker } 650*9880d681SAndroid Build Coastguard Worker def SwiftWaitP2For15Cy : SchedWriteRes<[SwiftUnitP2]> { 651*9880d681SAndroid Build Coastguard Worker let Latency = 15; 652*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [15]; 653*9880d681SAndroid Build Coastguard Worker } 654*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWaitP0For15Cy, SwiftWaitP1For15Cy, SwiftWaitP2For15Cy], 655*9880d681SAndroid Build Coastguard Worker (instregex "VMRS")>; 656*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWaitP0For15Cy, SwiftWaitP1For15Cy, SwiftWaitP2For15Cy], 657*9880d681SAndroid Build Coastguard Worker (instregex "VMSR")>; 658*9880d681SAndroid Build Coastguard Worker // Not serializing. 659*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP0TwoCycle], (instregex "FMSTAT")>; 660*9880d681SAndroid Build Coastguard Worker 661*9880d681SAndroid Build Coastguard Worker // 4.2.39 Advanced SIMD and VFP, Load Single Element 662*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM4Cy], (instregex "VLDRD$", "VLDRS$")>; 663*9880d681SAndroid Build Coastguard Worker 664*9880d681SAndroid Build Coastguard Worker // 4.2.40 Advanced SIMD and VFP, Store Single Element 665*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM4Cy], (instregex "VSTRD$", "VSTRS$")>; 666*9880d681SAndroid Build Coastguard Worker 667*9880d681SAndroid Build Coastguard Worker // 4.2.41 Advanced SIMD and VFP, Load Multiple 668*9880d681SAndroid Build Coastguard Worker // 4.2.42 Advanced SIMD and VFP, Store Multiple 669*9880d681SAndroid Build Coastguard Worker 670*9880d681SAndroid Build Coastguard Worker // Resource requirement for permuting, just reserves the resources. 671*9880d681SAndroid Build Coastguard Worker foreach Num = 1-28 in { 672*9880d681SAndroid Build Coastguard Worker def SwiftVLDMPerm#Num : SchedWriteRes<[SwiftUnitP1]> { 673*9880d681SAndroid Build Coastguard Worker let Latency = 0; 674*9880d681SAndroid Build Coastguard Worker let NumMicroOps = Num; 675*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [Num]; 676*9880d681SAndroid Build Coastguard Worker } 677*9880d681SAndroid Build Coastguard Worker } 678*9880d681SAndroid Build Coastguard Worker 679*9880d681SAndroid Build Coastguard Worker // Pre RA pseudos - load/store to a Q register as a D register pair. 680*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM4Cy], (instregex "VLDMQIA$", "VSTMQIA$")>; 681*9880d681SAndroid Build Coastguard Worker 682*9880d681SAndroid Build Coastguard Worker // Post RA not modelled accurately. We assume that register use of width 64 683*9880d681SAndroid Build Coastguard Worker // bit maps to a D register, 128 maps to a Q register. Not all different kinds 684*9880d681SAndroid Build Coastguard Worker // are accurately represented. 685*9880d681SAndroid Build Coastguard Worker def SwiftWriteVLDM : SchedWriteVariant<[ 686*9880d681SAndroid Build Coastguard Worker // Load of one S register. 687*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr1Pred, [SwiftWriteLM4Cy]>, 688*9880d681SAndroid Build Coastguard Worker // Load of one D register. 689*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr2Pred, [SwiftWriteLM4Cy, SwiftWriteLM4CyNo]>, 690*9880d681SAndroid Build Coastguard Worker // Load of 3 S register. 691*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr3Pred, [SwiftWriteLM9Cy, SwiftWriteLM10Cy, 692*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteP01OneCycle, 693*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm3]>, 694*9880d681SAndroid Build Coastguard Worker // Load of a Q register (not necessarily true). We should not be mapping to 695*9880d681SAndroid Build Coastguard Worker // 4 S registers, either. 696*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr4Pred, [SwiftWriteLM4Cy, SwiftWriteLM4CyNo, 697*9880d681SAndroid Build Coastguard Worker SwiftWriteLM4CyNo, SwiftWriteLM4CyNo]>, 698*9880d681SAndroid Build Coastguard Worker // Load of 5 S registers. 699*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr5Pred, [SwiftWriteLM9Cy, SwiftWriteLM10Cy, 700*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM14CyNo, 701*9880d681SAndroid Build Coastguard Worker SwiftWriteLM17CyNo, SwiftWriteP01OneCycle, 702*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm5]>, 703*9880d681SAndroid Build Coastguard Worker // Load of 3 D registers. (Must also be able to handle s register list - 704*9880d681SAndroid Build Coastguard Worker // though, not accurate) 705*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr6Pred, [SwiftWriteLM7Cy, SwiftWriteLM8Cy, 706*9880d681SAndroid Build Coastguard Worker SwiftWriteLM10Cy, SwiftWriteLM14CyNo, 707*9880d681SAndroid Build Coastguard Worker SwiftWriteLM14CyNo, SwiftWriteLM14CyNo, 708*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle, SwiftVLDMPerm5]>, 709*9880d681SAndroid Build Coastguard Worker // Load of 7 S registers. 710*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr7Pred, [SwiftWriteLM9Cy, SwiftWriteLM10Cy, 711*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM14CyNo, 712*9880d681SAndroid Build Coastguard Worker SwiftWriteLM17CyNo, SwiftWriteLM18CyNo, 713*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteP01OneCycle, 714*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm7]>, 715*9880d681SAndroid Build Coastguard Worker // Load of two Q registers. 716*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr8Pred, [SwiftWriteLM7Cy, SwiftWriteLM8Cy, 717*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM13CyNo, 718*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 719*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 720*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle, SwiftVLDMPerm2]>, 721*9880d681SAndroid Build Coastguard Worker // Load of 9 S registers. 722*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr9Pred, [SwiftWriteLM9Cy, SwiftWriteLM10Cy, 723*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM14CyNo, 724*9880d681SAndroid Build Coastguard Worker SwiftWriteLM17CyNo, SwiftWriteLM18CyNo, 725*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteLM22CyNo, 726*9880d681SAndroid Build Coastguard Worker SwiftWriteLM25CyNo, SwiftWriteP01OneCycle, 727*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm9]>, 728*9880d681SAndroid Build Coastguard Worker // Load of 5 D registers. 729*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr10Pred,[SwiftWriteLM7Cy, SwiftWriteLM8Cy, 730*9880d681SAndroid Build Coastguard Worker SwiftWriteLM10Cy, SwiftWriteLM14Cy, 731*9880d681SAndroid Build Coastguard Worker SwiftWriteLM14CyNo, SwiftWriteLM14CyNo, 732*9880d681SAndroid Build Coastguard Worker SwiftWriteLM14CyNo, SwiftWriteLM14CyNo, 733*9880d681SAndroid Build Coastguard Worker SwiftWriteLM14CyNo, SwiftWriteLM14CyNo, 734*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle, SwiftVLDMPerm5]>, 735*9880d681SAndroid Build Coastguard Worker // Inaccurate: reuse describtion from 9 S registers. 736*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr11Pred,[SwiftWriteLM9Cy, SwiftWriteLM10Cy, 737*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM14CyNo, 738*9880d681SAndroid Build Coastguard Worker SwiftWriteLM17CyNo, SwiftWriteLM18CyNo, 739*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteLM22CyNo, 740*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteLM22CyNo, 741*9880d681SAndroid Build Coastguard Worker SwiftWriteLM25CyNo, SwiftWriteP01OneCycle, 742*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm9]>, 743*9880d681SAndroid Build Coastguard Worker // Load of three Q registers. 744*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr12Pred,[SwiftWriteLM7Cy, SwiftWriteLM8Cy, 745*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftWriteLM11Cy, 746*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11CyNo, SwiftWriteLM11CyNo, 747*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11CyNo, SwiftWriteLM11CyNo, 748*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11CyNo, SwiftWriteLM11CyNo, 749*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11CyNo, SwiftWriteLM11CyNo, 750*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle, SwiftVLDMPerm3]>, 751*9880d681SAndroid Build Coastguard Worker // Inaccurate: reuse describtion from 9 S registers. 752*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr13Pred, [SwiftWriteLM9Cy, SwiftWriteLM10Cy, 753*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM14CyNo, 754*9880d681SAndroid Build Coastguard Worker SwiftWriteLM17CyNo, SwiftWriteLM18CyNo, 755*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteLM22CyNo, 756*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteLM22CyNo, 757*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteLM22CyNo, 758*9880d681SAndroid Build Coastguard Worker SwiftWriteLM25CyNo, SwiftWriteP01OneCycle, 759*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm9]>, 760*9880d681SAndroid Build Coastguard Worker // Load of 7 D registers inaccurate. 761*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr14Pred,[SwiftWriteLM7Cy, SwiftWriteLM8Cy, 762*9880d681SAndroid Build Coastguard Worker SwiftWriteLM10Cy, SwiftWriteLM14Cy, 763*9880d681SAndroid Build Coastguard Worker SwiftWriteLM14Cy, SwiftWriteLM14CyNo, 764*9880d681SAndroid Build Coastguard Worker SwiftWriteLM14CyNo, SwiftWriteLM14CyNo, 765*9880d681SAndroid Build Coastguard Worker SwiftWriteLM14CyNo, SwiftWriteLM14CyNo, 766*9880d681SAndroid Build Coastguard Worker SwiftWriteLM14CyNo, SwiftWriteLM14CyNo, 767*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle, SwiftVLDMPerm7]>, 768*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr15Pred,[SwiftWriteLM9Cy, SwiftWriteLM10Cy, 769*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM14Cy, 770*9880d681SAndroid Build Coastguard Worker SwiftWriteLM17Cy, SwiftWriteLM18CyNo, 771*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteLM22CyNo, 772*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteLM22CyNo, 773*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteLM22CyNo, 774*9880d681SAndroid Build Coastguard Worker SwiftWriteLM21CyNo, SwiftWriteLM22CyNo, 775*9880d681SAndroid Build Coastguard Worker SwiftWriteLM25CyNo, SwiftWriteP01OneCycle, 776*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm9]>, 777*9880d681SAndroid Build Coastguard Worker // Load of 4 Q registers. 778*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr16Pred,[SwiftWriteLM7Cy, SwiftWriteLM10Cy, 779*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftWriteLM14Cy, 780*9880d681SAndroid Build Coastguard Worker SwiftWriteLM15Cy, SwiftWriteLM18CyNo, 781*9880d681SAndroid Build Coastguard Worker SwiftWriteLM19CyNo, SwiftWriteLM22CyNo, 782*9880d681SAndroid Build Coastguard Worker SwiftWriteLM19CyNo, SwiftWriteLM22CyNo, 783*9880d681SAndroid Build Coastguard Worker SwiftWriteLM19CyNo, SwiftWriteLM22CyNo, 784*9880d681SAndroid Build Coastguard Worker SwiftWriteLM19CyNo, SwiftWriteLM22CyNo, 785*9880d681SAndroid Build Coastguard Worker SwiftWriteLM19CyNo, SwiftWriteLM22CyNo, 786*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle, SwiftVLDMPerm4]>, 787*9880d681SAndroid Build Coastguard Worker // Unknow number of registers, just use resources for two registers. 788*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [SwiftWriteLM7Cy, SwiftWriteLM8Cy, 789*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13Cy, SwiftWriteLM13CyNo, 790*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 791*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 792*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 793*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 794*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 795*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 796*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 797*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 798*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 799*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 800*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 801*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 802*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 803*9880d681SAndroid Build Coastguard Worker SwiftWriteLM13CyNo, SwiftWriteLM13CyNo, 804*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle, SwiftVLDMPerm2]> 805*9880d681SAndroid Build Coastguard Worker ]> { let Variadic = 1; } 806*9880d681SAndroid Build Coastguard Worker 807*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteVLDM], (instregex "VLDM[SD](IA|DB)$")>; 808*9880d681SAndroid Build Coastguard Worker 809*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle2x, SwiftWriteVLDM], 810*9880d681SAndroid Build Coastguard Worker (instregex "VLDM[SD](IA|DB)_UPD$")>; 811*9880d681SAndroid Build Coastguard Worker 812*9880d681SAndroid Build Coastguard Worker def SwiftWriteVSTM : SchedWriteVariant<[ 813*9880d681SAndroid Build Coastguard Worker // One S register. 814*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr1Pred, [SwiftWriteSTM1]>, 815*9880d681SAndroid Build Coastguard Worker // One D register. 816*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr2Pred, [SwiftWriteSTM1]>, 817*9880d681SAndroid Build Coastguard Worker // Three S registers. 818*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr3Pred, [SwiftWriteSTM4]>, 819*9880d681SAndroid Build Coastguard Worker // Assume one Q register. 820*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr4Pred, [SwiftWriteSTM1]>, 821*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr5Pred, [SwiftWriteSTM6]>, 822*9880d681SAndroid Build Coastguard Worker // Assume three D registers. 823*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr6Pred, [SwiftWriteSTM4]>, 824*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr7Pred, [SwiftWriteSTM8]>, 825*9880d681SAndroid Build Coastguard Worker // Assume two Q registers. 826*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr8Pred, [SwiftWriteSTM3]>, 827*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr9Pred, [SwiftWriteSTM10]>, 828*9880d681SAndroid Build Coastguard Worker // Assume 5 D registers. 829*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr10Pred, [SwiftWriteSTM6]>, 830*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr11Pred, [SwiftWriteSTM12]>, 831*9880d681SAndroid Build Coastguard Worker // Assume three Q registers. 832*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr12Pred, [SwiftWriteSTM4]>, 833*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr13Pred, [SwiftWriteSTM14]>, 834*9880d681SAndroid Build Coastguard Worker // Assume 7 D registers. 835*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr14Pred, [SwiftWriteSTM8]>, 836*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr15Pred, [SwiftWriteSTM16]>, 837*9880d681SAndroid Build Coastguard Worker // Assume four Q registers. 838*9880d681SAndroid Build Coastguard Worker SchedVar<SwiftLMAddr16Pred, [SwiftWriteSTM5]>, 839*9880d681SAndroid Build Coastguard Worker // Asumme two Q registers. 840*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [SwiftWriteSTM3]> 841*9880d681SAndroid Build Coastguard Worker ]> { let Variadic = 1; } 842*9880d681SAndroid Build Coastguard Worker 843*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteVSTM], (instregex "VSTM[SD](IA|DB)$")>; 844*9880d681SAndroid Build Coastguard Worker 845*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle2x, SwiftWriteVSTM], 846*9880d681SAndroid Build Coastguard Worker (instregex "VSTM[SD](IA|DB)_UPD")>; 847*9880d681SAndroid Build Coastguard Worker 848*9880d681SAndroid Build Coastguard Worker // 4.2.43 Advanced SIMD, Element or Structure Load and Store 849*9880d681SAndroid Build Coastguard Worker def SwiftWrite2xP2FourCy : SchedWriteRes<[SwiftUnitP2]> { 850*9880d681SAndroid Build Coastguard Worker let Latency = 4; 851*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 852*9880d681SAndroid Build Coastguard Worker } 853*9880d681SAndroid Build Coastguard Worker def SwiftWrite3xP2FourCy : SchedWriteRes<[SwiftUnitP2]> { 854*9880d681SAndroid Build Coastguard Worker let Latency = 4; 855*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3]; 856*9880d681SAndroid Build Coastguard Worker } 857*9880d681SAndroid Build Coastguard Worker foreach Num = 1-2 in { 858*9880d681SAndroid Build Coastguard Worker def SwiftExt#Num#xP0 : SchedWriteRes<[SwiftUnitP0]> { 859*9880d681SAndroid Build Coastguard Worker let Latency = 0; 860*9880d681SAndroid Build Coastguard Worker let NumMicroOps = Num; 861*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [Num]; 862*9880d681SAndroid Build Coastguard Worker } 863*9880d681SAndroid Build Coastguard Worker } 864*9880d681SAndroid Build Coastguard Worker // VLDx 865*9880d681SAndroid Build Coastguard Worker // Multiple structures. 866*9880d681SAndroid Build Coastguard Worker // Single element structure loads. 867*9880d681SAndroid Build Coastguard Worker // We assume aligned. 868*9880d681SAndroid Build Coastguard Worker // Single/two register. 869*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM4Cy], (instregex "VLD1(d|q)(8|16|32|64)$")>; 870*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM4Cy, SwiftWriteP01OneCycle], 871*9880d681SAndroid Build Coastguard Worker (instregex "VLD1(d|q)(8|16|32|64)wb")>; 872*9880d681SAndroid Build Coastguard Worker // Three register. 873*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite3xP2FourCy], 874*9880d681SAndroid Build Coastguard Worker (instregex "VLD1(d|q)(8|16|32|64)T$", "VLD1d64TPseudo")>; 875*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite3xP2FourCy, SwiftWriteP01OneCycle], 876*9880d681SAndroid Build Coastguard Worker (instregex "VLD1(d|q)(8|16|32|64)Twb")>; 877*9880d681SAndroid Build Coastguard Worker /// Four Register. 878*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite2xP2FourCy], 879*9880d681SAndroid Build Coastguard Worker (instregex "VLD1(d|q)(8|16|32|64)Q$", "VLD1d64QPseudo")>; 880*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite2xP2FourCy, SwiftWriteP01OneCycle], 881*9880d681SAndroid Build Coastguard Worker (instregex "VLD1(d|q)(8|16|32|64)Qwb")>; 882*9880d681SAndroid Build Coastguard Worker // Two element structure loads. 883*9880d681SAndroid Build Coastguard Worker // Two/four register. 884*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM9Cy, SwiftExt2xP0, SwiftVLDMPerm2], 885*9880d681SAndroid Build Coastguard Worker (instregex "VLD2(d|q|b)(8|16|32)$", "VLD2q(8|16|32)Pseudo$")>; 886*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM9Cy, SwiftWriteP01OneCycle, SwiftExt2xP0, 887*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm2], 888*9880d681SAndroid Build Coastguard Worker (instregex "VLD2(d|q|b)(8|16|32)wb", "VLD2q(8|16|32)PseudoWB")>; 889*9880d681SAndroid Build Coastguard Worker // Three element structure. 890*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM9Cy, SwiftWriteLM9CyNo, SwiftWriteLM9CyNo, 891*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm3, SwiftWrite3xP2FourCy], 892*9880d681SAndroid Build Coastguard Worker (instregex "VLD3(d|q)(8|16|32)$")>; 893*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM9Cy, SwiftVLDMPerm3, SwiftWrite3xP2FourCy], 894*9880d681SAndroid Build Coastguard Worker (instregex "VLD3(d|q)(8|16|32)(oddP|P)seudo$")>; 895*9880d681SAndroid Build Coastguard Worker 896*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM9Cy, SwiftWriteLM9CyNo, SwiftWriteLM9CyNo, 897*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle, SwiftVLDMPerm3, SwiftWrite3xP2FourCy], 898*9880d681SAndroid Build Coastguard Worker (instregex "VLD3(d|q)(8|16|32)_UPD$")>; 899*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM9Cy, SwiftWriteP01OneCycle, SwiftVLDMPerm3, 900*9880d681SAndroid Build Coastguard Worker SwiftWrite3xP2FourCy], 901*9880d681SAndroid Build Coastguard Worker (instregex "VLD3(d|q)(8|16|32)(oddP|P)seudo_UPD")>; 902*9880d681SAndroid Build Coastguard Worker // Four element structure loads. 903*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM11Cy, SwiftWriteLM11Cy, SwiftWriteLM11Cy, 904*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftExt2xP0, SwiftVLDMPerm4, 905*9880d681SAndroid Build Coastguard Worker SwiftWrite3xP2FourCy], 906*9880d681SAndroid Build Coastguard Worker (instregex "VLD4(d|q)(8|16|32)$")>; 907*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM11Cy, SwiftExt2xP0, SwiftVLDMPerm4, 908*9880d681SAndroid Build Coastguard Worker SwiftWrite3xP2FourCy], 909*9880d681SAndroid Build Coastguard Worker (instregex "VLD4(d|q)(8|16|32)(oddP|P)seudo$")>; 910*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM11Cy, SwiftWriteLM11Cy, SwiftWriteLM11Cy, 911*9880d681SAndroid Build Coastguard Worker SwiftWriteLM11Cy, SwiftWriteP01OneCycle, SwiftExt2xP0, 912*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm4, SwiftWrite3xP2FourCy], 913*9880d681SAndroid Build Coastguard Worker (instregex "VLD4(d|q)(8|16|32)_UPD")>; 914*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM11Cy, SwiftWriteP01OneCycle, SwiftExt2xP0, 915*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm4, SwiftWrite3xP2FourCy], 916*9880d681SAndroid Build Coastguard Worker (instregex "VLD4(d|q)(8|16|32)(oddP|P)seudo_UPD")>; 917*9880d681SAndroid Build Coastguard Worker 918*9880d681SAndroid Build Coastguard Worker // Single all/lane loads. 919*9880d681SAndroid Build Coastguard Worker // One element structure. 920*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM6Cy, SwiftVLDMPerm2], 921*9880d681SAndroid Build Coastguard Worker (instregex "VLD1(LN|DUP)(d|q)(8|16|32)$", "VLD1(LN|DUP)(d|q)(8|16|32)Pseudo$")>; 922*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM6Cy, SwiftWriteP01OneCycle, SwiftVLDMPerm2], 923*9880d681SAndroid Build Coastguard Worker (instregex "VLD1(LN|DUP)(d|q)(8|16|32)(wb|_UPD)", 924*9880d681SAndroid Build Coastguard Worker "VLD1LNq(8|16|32)Pseudo_UPD")>; 925*9880d681SAndroid Build Coastguard Worker // Two element structure. 926*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM6Cy, SwiftWriteLM6Cy, SwiftExt1xP0, SwiftVLDMPerm2], 927*9880d681SAndroid Build Coastguard Worker (instregex "VLD2(DUP|LN)(d|q)(8|16|32|8x2|16x2|32x2)$", 928*9880d681SAndroid Build Coastguard Worker "VLD2LN(d|q)(8|16|32)Pseudo$")>; 929*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM6Cy, SwiftWriteLM6Cy, SwiftWriteP01OneCycle, 930*9880d681SAndroid Build Coastguard Worker SwiftExt1xP0, SwiftVLDMPerm2], 931*9880d681SAndroid Build Coastguard Worker (instregex "VLD2LN(d|q)(8|16|32)_UPD$")>; 932*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM6Cy, SwiftWriteP01OneCycle, SwiftWriteLM6Cy, 933*9880d681SAndroid Build Coastguard Worker SwiftExt1xP0, SwiftVLDMPerm2], 934*9880d681SAndroid Build Coastguard Worker (instregex "VLD2DUPd(8|16|32|8x2|16x2|32x2)wb")>; 935*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM6Cy, SwiftWriteP01OneCycle, SwiftWriteLM6Cy, 936*9880d681SAndroid Build Coastguard Worker SwiftExt1xP0, SwiftVLDMPerm2], 937*9880d681SAndroid Build Coastguard Worker (instregex "VLD2LN(d|q)(8|16|32)Pseudo_UPD")>; 938*9880d681SAndroid Build Coastguard Worker // Three element structure. 939*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM7Cy, SwiftWriteLM8Cy, SwiftWriteLM8Cy, SwiftExt1xP0, 940*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm3], 941*9880d681SAndroid Build Coastguard Worker (instregex "VLD3(DUP|LN)(d|q)(8|16|32)$", 942*9880d681SAndroid Build Coastguard Worker "VLD3(LN|DUP)(d|q)(8|16|32)Pseudo$")>; 943*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM7Cy, SwiftWriteLM8Cy, SwiftWriteLM8Cy, 944*9880d681SAndroid Build Coastguard Worker SwiftWriteP01OneCycle, SwiftExt1xP0, SwiftVLDMPerm3], 945*9880d681SAndroid Build Coastguard Worker (instregex "VLD3(LN|DUP)(d|q)(8|16|32)_UPD")>; 946*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM7Cy, SwiftWriteP01OneCycle, SwiftWriteLM8Cy, 947*9880d681SAndroid Build Coastguard Worker SwiftWriteLM8Cy, SwiftExt1xP0, SwiftVLDMPerm3], 948*9880d681SAndroid Build Coastguard Worker (instregex "VLD3(LN|DUP)(d|q)(8|16|32)Pseudo_UPD")>; 949*9880d681SAndroid Build Coastguard Worker // Four element struture. 950*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM8Cy, SwiftWriteLM9Cy, SwiftWriteLM10CyNo, 951*9880d681SAndroid Build Coastguard Worker SwiftWriteLM10CyNo, SwiftExt1xP0, SwiftVLDMPerm5], 952*9880d681SAndroid Build Coastguard Worker (instregex "VLD4(LN|DUP)(d|q)(8|16|32)$", 953*9880d681SAndroid Build Coastguard Worker "VLD4(LN|DUP)(d|q)(8|16|32)Pseudo$")>; 954*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM8Cy, SwiftWriteLM9Cy, SwiftWriteLM10CyNo, 955*9880d681SAndroid Build Coastguard Worker SwiftWriteLM10CyNo, SwiftWriteP01OneCycle, SwiftExt1xP0, 956*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm5], 957*9880d681SAndroid Build Coastguard Worker (instregex "VLD4(DUP|LN)(d|q)(8|16|32)_UPD")>; 958*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteLM8Cy, SwiftWriteP01OneCycle, SwiftWriteLM9Cy, 959*9880d681SAndroid Build Coastguard Worker SwiftWriteLM10CyNo, SwiftWriteLM10CyNo, SwiftExt1xP0, 960*9880d681SAndroid Build Coastguard Worker SwiftVLDMPerm5], 961*9880d681SAndroid Build Coastguard Worker (instregex "VLD4(DUP|LN)(d|q)(8|16|32)Pseudo_UPD")>; 962*9880d681SAndroid Build Coastguard Worker // VSTx 963*9880d681SAndroid Build Coastguard Worker // Multiple structures. 964*9880d681SAndroid Build Coastguard Worker // Single element structure store. 965*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite1xP2], (instregex "VST1d(8|16|32|64)$")>; 966*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite2xP2], (instregex "VST1q(8|16|32|64)$")>; 967*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite1xP2], 968*9880d681SAndroid Build Coastguard Worker (instregex "VST1d(8|16|32|64)wb")>; 969*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite2xP2], 970*9880d681SAndroid Build Coastguard Worker (instregex "VST1q(8|16|32|64)wb")>; 971*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite3xP2], 972*9880d681SAndroid Build Coastguard Worker (instregex "VST1d(8|16|32|64)T$", "VST1d64TPseudo$")>; 973*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite3xP2], 974*9880d681SAndroid Build Coastguard Worker (instregex "VST1d(8|16|32|64)Twb", "VST1d64TPseudoWB")>; 975*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite4xP2], 976*9880d681SAndroid Build Coastguard Worker (instregex "VST1d(8|16|32|64)(Q|QPseudo)$")>; 977*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite4xP2], 978*9880d681SAndroid Build Coastguard Worker (instregex "VST1d(8|16|32|64)(Qwb|QPseudoWB)")>; 979*9880d681SAndroid Build Coastguard Worker // Two element structure store. 980*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite1xP2, SwiftVLDMPerm1], 981*9880d681SAndroid Build Coastguard Worker (instregex "VST2(d|b)(8|16|32)$")>; 982*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite1xP2, SwiftVLDMPerm1], 983*9880d681SAndroid Build Coastguard Worker (instregex "VST2(b|d)(8|16|32)wb")>; 984*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite2xP2, SwiftVLDMPerm2], 985*9880d681SAndroid Build Coastguard Worker (instregex "VST2q(8|16|32)$", "VST2q(8|16|32)Pseudo$")>; 986*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite2xP2, SwiftVLDMPerm2], 987*9880d681SAndroid Build Coastguard Worker (instregex "VST2q(8|16|32)wb", "VST2q(8|16|32)PseudoWB")>; 988*9880d681SAndroid Build Coastguard Worker // Three element structure store. 989*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite4xP2, SwiftVLDMPerm2], 990*9880d681SAndroid Build Coastguard Worker (instregex "VST3(d|q)(8|16|32)$", "VST3(d|q)(8|16|32)(oddP|P)seudo$")>; 991*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite4xP2, SwiftVLDMPerm2], 992*9880d681SAndroid Build Coastguard Worker (instregex "VST3(d|q)(8|16|32)_UPD", 993*9880d681SAndroid Build Coastguard Worker "VST3(d|q)(8|16|32)(oddP|P)seudo_UPD$")>; 994*9880d681SAndroid Build Coastguard Worker // Four element structure store. 995*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite4xP2, SwiftVLDMPerm2], 996*9880d681SAndroid Build Coastguard Worker (instregex "VST4(d|q)(8|16|32)$", "VST4(d|q)(8|16|32)(oddP|P)seudo$")>; 997*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite4xP2, SwiftVLDMPerm4], 998*9880d681SAndroid Build Coastguard Worker (instregex "VST4(d|q)(8|16|32)_UPD", 999*9880d681SAndroid Build Coastguard Worker "VST4(d|q)(8|16|32)(oddP|P)seudo_UPD$")>; 1000*9880d681SAndroid Build Coastguard Worker // Single/all lane store. 1001*9880d681SAndroid Build Coastguard Worker // One element structure. 1002*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite1xP2, SwiftVLDMPerm1], 1003*9880d681SAndroid Build Coastguard Worker (instregex "VST1LNd(8|16|32)$", "VST1LNq(8|16|32)Pseudo$")>; 1004*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite1xP2, SwiftVLDMPerm1], 1005*9880d681SAndroid Build Coastguard Worker (instregex "VST1LNd(8|16|32)_UPD", "VST1LNq(8|16|32)Pseudo_UPD")>; 1006*9880d681SAndroid Build Coastguard Worker // Two element structure. 1007*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite1xP2, SwiftVLDMPerm2], 1008*9880d681SAndroid Build Coastguard Worker (instregex "VST2LN(d|q)(8|16|32)$", "VST2LN(d|q)(8|16|32)Pseudo$")>; 1009*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite1xP2, SwiftVLDMPerm2], 1010*9880d681SAndroid Build Coastguard Worker (instregex "VST2LN(d|q)(8|16|32)_UPD", 1011*9880d681SAndroid Build Coastguard Worker "VST2LN(d|q)(8|16|32)Pseudo_UPD")>; 1012*9880d681SAndroid Build Coastguard Worker // Three element structure. 1013*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite4xP2, SwiftVLDMPerm2], 1014*9880d681SAndroid Build Coastguard Worker (instregex "VST3LN(d|q)(8|16|32)$", "VST3LN(d|q)(8|16|32)Pseudo$")>; 1015*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite4xP2, SwiftVLDMPerm2], 1016*9880d681SAndroid Build Coastguard Worker (instregex "VST3LN(d|q)(8|16|32)_UPD", 1017*9880d681SAndroid Build Coastguard Worker "VST3LN(d|q)(8|16|32)Pseudo_UPD")>; 1018*9880d681SAndroid Build Coastguard Worker // Four element structure. 1019*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWrite2xP2, SwiftVLDMPerm2], 1020*9880d681SAndroid Build Coastguard Worker (instregex "VST4LN(d|q)(8|16|32)$", "VST4LN(d|q)(8|16|32)Pseudo$")>; 1021*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite2xP2, SwiftVLDMPerm2], 1022*9880d681SAndroid Build Coastguard Worker (instregex "VST4LN(d|q)(8|16|32)_UPD", 1023*9880d681SAndroid Build Coastguard Worker "VST4LN(d|q)(8|16|32)Pseudo_UPD")>; 1024*9880d681SAndroid Build Coastguard Worker 1025*9880d681SAndroid Build Coastguard Worker // 4.2.44 VFP, Divide and Square Root 1026*9880d681SAndroid Build Coastguard Worker def SwiftDiv17 : SchedWriteRes<[SwiftUnitP0, SwiftUnitDiv]> { 1027*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 1; 1028*9880d681SAndroid Build Coastguard Worker let Latency = 17; 1029*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 15]; 1030*9880d681SAndroid Build Coastguard Worker } 1031*9880d681SAndroid Build Coastguard Worker def SwiftDiv32 : SchedWriteRes<[SwiftUnitP0, SwiftUnitDiv]> { 1032*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 1; 1033*9880d681SAndroid Build Coastguard Worker let Latency = 32; 1034*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 30]; 1035*9880d681SAndroid Build Coastguard Worker } 1036*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftDiv17], (instregex "VDIVS", "VSQRTS")>; 1037*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftDiv32], (instregex "VDIVD", "VSQRTD")>; 1038*9880d681SAndroid Build Coastguard Worker 1039*9880d681SAndroid Build Coastguard Worker // Not specified. 1040*9880d681SAndroid Build Coastguard Worker def : InstRW<[SwiftWriteP01OneCycle2x], (instregex "ABS")>; 1041*9880d681SAndroid Build Coastguard Worker // Preload. 1042*9880d681SAndroid Build Coastguard Worker def : WriteRes<WritePreLd, [SwiftUnitP2]> { let Latency = 0; 1043*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [0]; 1044*9880d681SAndroid Build Coastguard Worker } 1045*9880d681SAndroid Build Coastguard Worker 1046*9880d681SAndroid Build Coastguard Worker} 1047