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