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