xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/Target/ARM/ARMScheduleSwift.td (revision 82d56013d7b633d116a93943de88e08335357a7c)
17330f729Sjoerg//=- ARMScheduleSwift.td - Swift Scheduling Definitions -*- tablegen -*----===//
27330f729Sjoerg//
37330f729Sjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg// See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg//
77330f729Sjoerg//===----------------------------------------------------------------------===//
87330f729Sjoerg//
97330f729Sjoerg// This file defines the itinerary class data for the Swift processor..
107330f729Sjoerg//
117330f729Sjoerg//===----------------------------------------------------------------------===//
127330f729Sjoerg
137330f729Sjoerg// ===---------------------------------------------------------------------===//
147330f729Sjoerg// This section contains legacy support for itineraries. This is
157330f729Sjoerg// required until SD and PostRA schedulers are replaced by MachineScheduler.
167330f729Sjoerg
177330f729Sjoergdef SW_DIS0 : FuncUnit;
187330f729Sjoergdef SW_DIS1 : FuncUnit;
197330f729Sjoergdef SW_DIS2 : FuncUnit;
207330f729Sjoerg
217330f729Sjoergdef SW_ALU0 : FuncUnit;
227330f729Sjoergdef SW_ALU1 : FuncUnit;
237330f729Sjoergdef SW_LS   : FuncUnit;
247330f729Sjoergdef SW_IDIV : FuncUnit;
257330f729Sjoergdef SW_FDIV : FuncUnit;
267330f729Sjoerg
277330f729Sjoerg// FIXME: Need bypasses.
287330f729Sjoerg// FIXME: Model the multiple stages of IIC_iMOVix2, IIC_iMOVix2addpc, and
297330f729Sjoerg//        IIC_iMOVix2ld better.
307330f729Sjoerg// FIXME: Model the special immediate shifts that are not microcoded.
317330f729Sjoerg// FIXME: Do we need to model the fact that uses of r15 in a micro-op force it
327330f729Sjoerg//        to issue on pipe 1?
337330f729Sjoerg// FIXME: Model the pipelined behavior of CMP / TST instructions.
347330f729Sjoerg// FIXME: Better model the microcode stages of multiply instructions, especially
357330f729Sjoerg//        conditional variants.
367330f729Sjoerg// FIXME: Add preload instruction when it is documented.
377330f729Sjoerg// FIXME: Model non-pipelined nature of FP div / sqrt unit.
387330f729Sjoerg
397330f729Sjoerg// Swift machine model for scheduling and other instruction cost heuristics.
407330f729Sjoergdef SwiftModel : SchedMachineModel {
417330f729Sjoerg  let IssueWidth = 3; // 3 micro-ops are dispatched per cycle.
427330f729Sjoerg  let MicroOpBufferSize = 45; // Based on NEON renamed registers.
437330f729Sjoerg  let LoadLatency = 3;
447330f729Sjoerg  let MispredictPenalty = 14; // A branch direction mispredict.
457330f729Sjoerg  let CompleteModel = 0;      // FIXME: Remove if all instructions are covered.
467330f729Sjoerg
477330f729Sjoerg  // FIXME: Remove when all errors have been fixed.
487330f729Sjoerg  let FullInstRWOverlapCheck = 0;
497330f729Sjoerg}
507330f729Sjoerg
517330f729Sjoerg// Swift predicates.
527330f729Sjoergdef IsFastImmShiftSwiftPred : SchedPredicate<[{TII->isSwiftFastImmShift(MI)}]>;
537330f729Sjoerg
547330f729Sjoerg// Swift resource mapping.
557330f729Sjoerglet SchedModel = SwiftModel in {
567330f729Sjoerg  // Processor resources.
577330f729Sjoerg  def SwiftUnitP01 : ProcResource<2>; // ALU unit.
587330f729Sjoerg  def SwiftUnitP0 : ProcResource<1> { let Super = SwiftUnitP01; } // Mul unit.
597330f729Sjoerg  def SwiftUnitP1 : ProcResource<1> { let Super = SwiftUnitP01; } // Br unit.
607330f729Sjoerg  def SwiftUnitP2 : ProcResource<1>; // LS unit.
617330f729Sjoerg  def SwiftUnitDiv : ProcResource<1>;
627330f729Sjoerg
637330f729Sjoerg  // Generic resource requirements.
647330f729Sjoerg  def SwiftWriteP0OneCycle : SchedWriteRes<[SwiftUnitP0]>;
657330f729Sjoerg  def SwiftWriteP0TwoCycle : SchedWriteRes<[SwiftUnitP0]> { let Latency = 2; }
667330f729Sjoerg  def SwiftWriteP0FourCycle : SchedWriteRes<[SwiftUnitP0]> { let Latency = 4; }
677330f729Sjoerg  def SwiftWriteP0SixCycle : SchedWriteRes<[SwiftUnitP0]> { let Latency = 6; }
687330f729Sjoerg  def SwiftWriteP0P1FourCycle : SchedWriteRes<[SwiftUnitP0, SwiftUnitP1]> {
697330f729Sjoerg    let Latency = 4;
707330f729Sjoerg  }
717330f729Sjoerg  def SwiftWriteP0P1SixCycle : SchedWriteRes<[SwiftUnitP0, SwiftUnitP1]> {
727330f729Sjoerg    let Latency = 6;
737330f729Sjoerg  }
747330f729Sjoerg  def SwiftWriteP01OneCycle : SchedWriteRes<[SwiftUnitP01]>;
757330f729Sjoerg  def SwiftWriteP1TwoCycle : SchedWriteRes<[SwiftUnitP1]> { let Latency = 2; }
767330f729Sjoerg  def SwiftWriteP1FourCycle : SchedWriteRes<[SwiftUnitP1]> { let Latency = 4; }
777330f729Sjoerg  def SwiftWriteP1SixCycle : SchedWriteRes<[SwiftUnitP1]> { let Latency = 6; }
787330f729Sjoerg  def SwiftWriteP1EightCycle : SchedWriteRes<[SwiftUnitP1]> { let Latency = 8; }
797330f729Sjoerg  def SwiftWriteP1TwelveCyc : SchedWriteRes<[SwiftUnitP1]> { let Latency = 12; }
807330f729Sjoerg  def SwiftWriteP01OneCycle2x : WriteSequence<[SwiftWriteP01OneCycle], 2>;
817330f729Sjoerg  def SwiftWriteP01OneCycle3x : WriteSequence<[SwiftWriteP01OneCycle], 3>;
827330f729Sjoerg  def SwiftWriteP01TwoCycle : SchedWriteRes<[SwiftUnitP01]> { let Latency = 2; }
837330f729Sjoerg  def SwiftWriteP01ThreeCycleTwoUops : SchedWriteRes<[SwiftUnitP01,
847330f729Sjoerg                                                      SwiftUnitP01]> {
857330f729Sjoerg    let Latency = 3;
867330f729Sjoerg    let NumMicroOps = 2;
877330f729Sjoerg  }
887330f729Sjoerg  def SwiftWriteP0ThreeCycleThreeUops : SchedWriteRes<[SwiftUnitP0]> {
897330f729Sjoerg    let Latency = 3;
907330f729Sjoerg    let NumMicroOps = 3;
917330f729Sjoerg    let ResourceCycles = [3];
927330f729Sjoerg  }
937330f729Sjoerg  // Plain load without writeback.
947330f729Sjoerg  def SwiftWriteP2ThreeCycle : SchedWriteRes<[SwiftUnitP2]> {
957330f729Sjoerg    let Latency = 3;
967330f729Sjoerg  }
977330f729Sjoerg  def SwiftWriteP2FourCycle : SchedWriteRes<[SwiftUnitP2]> {
987330f729Sjoerg    let Latency = 4;
997330f729Sjoerg  }
1007330f729Sjoerg  // A store does not write to a register.
1017330f729Sjoerg  def SwiftWriteP2 : SchedWriteRes<[SwiftUnitP2]> {
1027330f729Sjoerg    let Latency = 0;
1037330f729Sjoerg  }
1047330f729Sjoerg  foreach Num = 1-4 in {
1057330f729Sjoerg    def SwiftWrite#Num#xP2 : WriteSequence<[SwiftWriteP2], Num>;
1067330f729Sjoerg  }
1077330f729Sjoerg  def SwiftWriteP01OneCycle2x_load : WriteSequence<[SwiftWriteP01OneCycle,
1087330f729Sjoerg                                                    SwiftWriteP01OneCycle,
1097330f729Sjoerg                                                    SwiftWriteP2ThreeCycle]>;
1107330f729Sjoerg  // 4.2.4 Arithmetic and Logical.
1117330f729Sjoerg  // ALU operation register shifted by immediate variant.
1127330f729Sjoerg  def SwiftWriteALUsi : SchedWriteVariant<[
1137330f729Sjoerg    // lsl #2, lsl #1, or lsr #1.
1147330f729Sjoerg    SchedVar<IsFastImmShiftSwiftPred, [SwiftWriteP01TwoCycle]>,
1157330f729Sjoerg    SchedVar<NoSchedPred,             [WriteALU]>
1167330f729Sjoerg  ]>;
1177330f729Sjoerg  def SwiftWriteALUsr : SchedWriteVariant<[
1187330f729Sjoerg    SchedVar<IsPredicatedPred, [SwiftWriteP01ThreeCycleTwoUops]>,
1197330f729Sjoerg    SchedVar<NoSchedPred,      [SwiftWriteP01TwoCycle]>
1207330f729Sjoerg  ]>;
1217330f729Sjoerg  def SwiftWriteALUSsr : SchedWriteVariant<[
1227330f729Sjoerg    SchedVar<IsPredicatedPred, [SwiftWriteP0ThreeCycleThreeUops]>,
1237330f729Sjoerg    SchedVar<NoSchedPred,      [SwiftWriteP01TwoCycle]>
1247330f729Sjoerg  ]>;
1257330f729Sjoerg  def SwiftReadAdvanceALUsr : SchedReadVariant<[
1267330f729Sjoerg    SchedVar<IsPredicatedPred, [SchedReadAdvance<2>]>,
1277330f729Sjoerg    SchedVar<NoSchedPred,      [NoReadAdvance]>
1287330f729Sjoerg  ]>;
1297330f729Sjoerg  // ADC,ADD,NEG,RSB,RSC,SBC,SUB,ADR
1307330f729Sjoerg  // AND,BIC,EOR,ORN,ORR
1317330f729Sjoerg  // CLZ,RBIT,REV,REV16,REVSH,PKH
1327330f729Sjoerg  def : WriteRes<WriteALU, [SwiftUnitP01]>;
1337330f729Sjoerg  def : SchedAlias<WriteALUsi, SwiftWriteALUsi>;
1347330f729Sjoerg  def : SchedAlias<WriteALUsr, SwiftWriteALUsr>;
1357330f729Sjoerg  def : SchedAlias<WriteALUSsr, SwiftWriteALUSsr>;
1367330f729Sjoerg  def : ReadAdvance<ReadALU, 0>;
1377330f729Sjoerg  def : SchedAlias<ReadALUsr, SwiftReadAdvanceALUsr>;
1387330f729Sjoerg  def : SchedAlias<WriteLd, SwiftWriteP2ThreeCycle>;
1397330f729Sjoerg  def : SchedAlias<WriteST, SwiftWriteP2>;
1407330f729Sjoerg
1417330f729Sjoerg
1427330f729Sjoerg  def SwiftChooseShiftKindP01OneOrTwoCycle : SchedWriteVariant<[
1437330f729Sjoerg    SchedVar<IsFastImmShiftSwiftPred, [SwiftWriteP01OneCycle]>,
1447330f729Sjoerg    SchedVar<NoSchedPred,             [SwiftWriteP01TwoCycle]>
1457330f729Sjoerg  ]>;
1467330f729Sjoerg
1477330f729Sjoerg  // 4.2.5 Integer comparison
1487330f729Sjoerg  def : WriteRes<WriteCMP, [SwiftUnitP01]>;
1497330f729Sjoerg  def : SchedAlias<WriteCMPsi, SwiftChooseShiftKindP01OneOrTwoCycle>;
1507330f729Sjoerg  def : SchedAlias<WriteCMPsr, SwiftWriteP01TwoCycle>;
1517330f729Sjoerg
1527330f729Sjoerg  // 4.2.6 Shift, Move
1537330f729Sjoerg  // Shift
1547330f729Sjoerg  //  ASR,LSL,ROR,RRX
1557330f729Sjoerg  //  MOV(register-shiftedregister)  MVN(register-shiftedregister)
1567330f729Sjoerg  // Move
1577330f729Sjoerg  //  MOV,MVN
1587330f729Sjoerg  //  MOVT
1597330f729Sjoerg  // Sign/Zero extension
1607330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle],
1617330f729Sjoerg               (instregex "SXTB", "SXTH", "SXTB16", "UXTB", "UXTH", "UXTB16",
1627330f729Sjoerg                          "t2SXTB", "t2SXTH", "t2SXTB16", "t2UXTB", "t2UXTH",
1637330f729Sjoerg                          "t2UXTB16")>;
1647330f729Sjoerg  // Pseudo instructions.
1657330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle2x],
1667330f729Sjoerg        (instregex "MOVCCi32imm", "MOVi32imm", "t2MOVCCi32imm",
1677330f729Sjoerg                   "t2MOVi32imm")>;
1687330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle3x],
1697330f729Sjoerg        (instregex "MOV_ga_pcrel", "t2MOV_ga_pcrel", "t2MOVi16_ga_pcrel")>;
1707330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle2x_load],
1717330f729Sjoerg        (instregex "MOV_ga_pcrel_ldr")>;
1727330f729Sjoerg
1737330f729Sjoerg  def SwiftWriteP0TwoCycleTwoUops : WriteSequence<[SwiftWriteP0OneCycle], 2>;
1747330f729Sjoerg
1757330f729Sjoerg  def SwiftPredP0OneOrTwoCycle : SchedWriteVariant<[
1767330f729Sjoerg    SchedVar<IsPredicatedPred, [ SwiftWriteP0TwoCycleTwoUops ]>,
1777330f729Sjoerg    SchedVar<NoSchedPred,     [ SwiftWriteP0OneCycle ]>
1787330f729Sjoerg  ]>;
1797330f729Sjoerg
1807330f729Sjoerg  // 4.2.7 Select
1817330f729Sjoerg  // SEL
1827330f729Sjoerg  def : InstRW<[SwiftPredP0OneOrTwoCycle], (instregex "SEL", "t2SEL")>;
1837330f729Sjoerg
1847330f729Sjoerg  // 4.2.8 Bitfield
1857330f729Sjoerg  // BFI,BFC, SBFX,UBFX
1867330f729Sjoerg  def : InstRW< [SwiftWriteP01TwoCycle],
1877330f729Sjoerg        (instregex "BFC", "BFI", "UBFX", "SBFX", "(t|t2)BFC", "(t|t2)BFI",
1887330f729Sjoerg        "(t|t2)UBFX", "(t|t2)SBFX")>;
1897330f729Sjoerg
1907330f729Sjoerg  // 4.2.9 Saturating arithmetic
1917330f729Sjoerg  def : InstRW< [SwiftWriteP01TwoCycle],
1927330f729Sjoerg        (instregex "QADD", "QSUB", "QDADD", "QDSUB", "SSAT", "SSAT16", "USAT",
1937330f729Sjoerg        "USAT16", "QADD8", "QADD16", "QSUB8", "QSUB16", "QASX", "QSAX",
1947330f729Sjoerg        "UQADD8", "UQADD16","UQSUB8","UQSUB16","UQASX","UQSAX", "t2QADD",
1957330f729Sjoerg        "t2QSUB", "t2QDADD", "t2QDSUB", "t2SSAT", "t2SSAT16", "t2USAT",
1967330f729Sjoerg        "t2QADD8", "t2QADD16", "t2QSUB8", "t2QSUB16", "t2QASX", "t2QSAX",
1977330f729Sjoerg        "t2UQADD8", "t2UQADD16","t2UQSUB8","t2UQSUB16","t2UQASX","t2UQSAX")>;
1987330f729Sjoerg
1997330f729Sjoerg  // 4.2.10 Parallel Arithmetic
2007330f729Sjoerg  // Not flag setting.
2017330f729Sjoerg  def : InstRW< [SwiftWriteALUsr],
2027330f729Sjoerg        (instregex "SADD8", "SADD16", "SSUB8", "SSUB16", "SASX", "SSAX",
2037330f729Sjoerg        "UADD8", "UADD16", "USUB8", "USUB16", "UASX", "USAX", "t2SADD8",
2047330f729Sjoerg        "t2SADD16", "t2SSUB8", "t2SSUB16", "t2SASX", "t2SSAX", "t2UADD8",
2057330f729Sjoerg        "t2UADD16", "t2USUB8", "t2USUB16", "t2UASX", "t2USAX")>;
2067330f729Sjoerg  // Flag setting.
2077330f729Sjoerg  def : InstRW< [SwiftWriteP01TwoCycle],
2087330f729Sjoerg       (instregex "SHADD8", "SHADD16", "SHSUB8", "SHSUB16", "SHASX", "SHSAX",
2097330f729Sjoerg       "SXTAB", "SXTAB16", "SXTAH", "UHADD8", "UHADD16", "UHSUB8", "UHSUB16",
2107330f729Sjoerg       "UHASX", "UHSAX", "UXTAB", "UXTAB16", "UXTAH", "t2SHADD8", "t2SHADD16",
2117330f729Sjoerg       "t2SHSUB8", "t2SHSUB16", "t2SHASX", "t2SHSAX", "t2SXTAB", "t2SXTAB16",
2127330f729Sjoerg       "t2SXTAH", "t2UHADD8", "t2UHADD16", "t2UHSUB8", "t2UHSUB16", "t2UHASX",
2137330f729Sjoerg       "t2UHSAX", "t2UXTAB", "t2UXTAB16", "t2UXTAH")>;
2147330f729Sjoerg
2157330f729Sjoerg  // 4.2.11 Sum of Absolute Difference
2167330f729Sjoerg  def : InstRW< [SwiftWriteP0P1FourCycle], (instregex "USAD8") >;
2177330f729Sjoerg  def : InstRW<[SwiftWriteP0P1FourCycle, ReadALU, ReadALU, SchedReadAdvance<2>],
2187330f729Sjoerg        (instregex "USADA8")>;
2197330f729Sjoerg
2207330f729Sjoerg  // 4.2.12 Integer Multiply (32-bit result)
2217330f729Sjoerg  // Two sources.
2227330f729Sjoerg  def : InstRW< [SwiftWriteP0FourCycle],
2237330f729Sjoerg        (instregex "MUL", "SMMUL", "SMMULR", "SMULBB", "SMULBT",
2247330f729Sjoerg        "SMULTB", "SMULTT", "SMULWB", "SMULWT", "SMUSD", "SMUSDX", "t2MUL",
2257330f729Sjoerg        "t2SMMUL", "t2SMMULR", "t2SMULBB", "t2SMULBT", "t2SMULTB", "t2SMULTT",
2267330f729Sjoerg        "t2SMULWB", "t2SMULWT", "t2SMUSD")>;
2277330f729Sjoerg
2287330f729Sjoerg  def SwiftWriteP0P01FiveCycleTwoUops :
2297330f729Sjoerg      SchedWriteRes<[SwiftUnitP0, SwiftUnitP01]>  {
2307330f729Sjoerg    let Latency = 5;
2317330f729Sjoerg  }
2327330f729Sjoerg
2337330f729Sjoerg  def SwiftPredP0P01FourFiveCycle : SchedWriteVariant<[
2347330f729Sjoerg    SchedVar<IsPredicatedPred, [ SwiftWriteP0P01FiveCycleTwoUops ]>,
2357330f729Sjoerg    SchedVar<NoSchedPred,      [ SwiftWriteP0FourCycle ]>
2367330f729Sjoerg  ]>;
2377330f729Sjoerg
2387330f729Sjoerg  def SwiftReadAdvanceFourCyclesPred : SchedReadVariant<[
2397330f729Sjoerg     SchedVar<IsPredicatedPred, [SchedReadAdvance<4>]>,
2407330f729Sjoerg     SchedVar<NoSchedPred,      [ReadALU]>
2417330f729Sjoerg  ]>;
2427330f729Sjoerg
2437330f729Sjoerg  // Multiply accumulate, three sources
2447330f729Sjoerg  def : InstRW< [SwiftPredP0P01FourFiveCycle, ReadALU, ReadALU,
2457330f729Sjoerg                 SwiftReadAdvanceFourCyclesPred],
2467330f729Sjoerg        (instregex "MLA", "MLS", "SMMLA", "SMMLAR", "SMMLS", "SMMLSR",
2477330f729Sjoerg        "t2MLA", "t2MLS", "t2SMMLA", "t2SMMLAR", "t2SMMLS",
2487330f729Sjoerg        "t2SMMLSR")>;
2497330f729Sjoerg
2507330f729Sjoerg  // 4.2.13 Integer Multiply (32-bit result, Q flag)
2517330f729Sjoerg  def : InstRW< [SwiftWriteP0FourCycle],
2527330f729Sjoerg        (instregex "SMUAD", "SMUADX", "t2SMUAD", "t2SMUADX")>;
2537330f729Sjoerg  def : InstRW< [SwiftPredP0P01FourFiveCycle, ReadALU, ReadALU,
2547330f729Sjoerg                 SwiftReadAdvanceFourCyclesPred],
2557330f729Sjoerg        (instregex "SMLABB", "SMLABT", "SMLATB", "SMLATT", "SMLSD", "SMLSDX",
2567330f729Sjoerg        "SMLAWB", "SMLAWT", "t2SMLABB", "t2SMLABT", "t2SMLATB", "t2SMLATT",
2577330f729Sjoerg        "t2SMLSD", "t2SMLSDX", "t2SMLAWB", "t2SMLAWT")>;
2587330f729Sjoerg  def : InstRW< [SwiftPredP0P01FourFiveCycle],
2597330f729Sjoerg        (instregex "SMLAD", "SMLADX", "t2SMLAD", "t2SMLADX")>;
2607330f729Sjoerg
2617330f729Sjoerg  def SwiftP0P0P01FiveCycle : SchedWriteRes<[SwiftUnitP0, SwiftUnitP01]> {
2627330f729Sjoerg    let Latency = 5;
2637330f729Sjoerg    let NumMicroOps = 3;
2647330f729Sjoerg    let ResourceCycles = [2, 1];
2657330f729Sjoerg  }
2667330f729Sjoerg  def SwiftWrite1Cycle : SchedWriteRes<[]> {
2677330f729Sjoerg    let Latency = 1;
2687330f729Sjoerg    let NumMicroOps = 0;
2697330f729Sjoerg  }
2707330f729Sjoerg  def SwiftWrite5Cycle : SchedWriteRes<[]> {
2717330f729Sjoerg    let Latency = 5;
2727330f729Sjoerg    let NumMicroOps = 0;
2737330f729Sjoerg  }
2747330f729Sjoerg  def SwiftWrite6Cycle : SchedWriteRes<[]> {
2757330f729Sjoerg    let Latency = 6;
2767330f729Sjoerg    let NumMicroOps = 0;
2777330f729Sjoerg  }
2787330f729Sjoerg
2797330f729Sjoerg  // 4.2.14 Integer Multiply, Long
2807330f729Sjoerg  def : InstRW< [SwiftP0P0P01FiveCycle, SwiftWrite5Cycle],
2817330f729Sjoerg        (instregex "SMULL$", "UMULL$", "t2SMULL$", "t2UMULL$")>;
2827330f729Sjoerg
2837330f729Sjoerg  def Swift2P03P01FiveCycle : SchedWriteRes<[SwiftUnitP0, SwiftUnitP01]> {
2847330f729Sjoerg    let Latency = 7;
2857330f729Sjoerg    let NumMicroOps = 5;
2867330f729Sjoerg    let ResourceCycles = [2, 3];
2877330f729Sjoerg  }
2887330f729Sjoerg
2897330f729Sjoerg  // Aliasing sub-target specific WriteRes to generic ones
2907330f729Sjoerg  def : SchedAlias<WriteMUL16, SwiftWriteP0FourCycle>;
2917330f729Sjoerg  def : SchedAlias<WriteMUL32, SwiftWriteP0FourCycle>;
2927330f729Sjoerg  def : SchedAlias<WriteMUL64Lo, SwiftP0P0P01FiveCycle>;
2937330f729Sjoerg  def : SchedAlias<WriteMUL64Hi, SwiftWrite5Cycle>;
2947330f729Sjoerg  def : SchedAlias<WriteMAC16, SwiftPredP0P01FourFiveCycle>;
2957330f729Sjoerg  def : SchedAlias<WriteMAC32, SwiftPredP0P01FourFiveCycle>;
2967330f729Sjoerg  def : SchedAlias<WriteMAC64Lo, SwiftWrite5Cycle>;
2977330f729Sjoerg  def : SchedAlias<WriteMAC64Hi, Swift2P03P01FiveCycle>;
2987330f729Sjoerg  def : ReadAdvance<ReadMUL, 0>;
2997330f729Sjoerg  def : SchedAlias<ReadMAC, SwiftReadAdvanceFourCyclesPred>;
3007330f729Sjoerg
3017330f729Sjoerg  // 4.2.15 Integer Multiply Accumulate, Long
3027330f729Sjoerg  // 4.2.16 Integer Multiply Accumulate, Dual
3037330f729Sjoerg  // 4.2.17 Integer Multiply Accumulate Accumulate, Long
3047330f729Sjoerg  // We are being a bit inaccurate here.
3057330f729Sjoerg  def : InstRW< [SwiftWrite5Cycle, Swift2P03P01FiveCycle, ReadALU, ReadALU,
3067330f729Sjoerg                 SchedReadAdvance<4>, SchedReadAdvance<3>],
3077330f729Sjoerg        (instregex "SMLAL", "UMLAL", "SMLALBT",
3087330f729Sjoerg        "SMLALTB", "SMLALTT", "SMLALD", "SMLALDX", "SMLSLD", "SMLSLDX",
3097330f729Sjoerg        "UMAAL", "t2SMLAL", "t2UMLAL", "t2SMLALBB", "t2SMLALBT",
3107330f729Sjoerg        "t2SMLALTB", "t2SMLALTT", "t2SMLALD", "t2SMLALDX", "t2SMLSLD", "t2SMLSLDX",
3117330f729Sjoerg        "t2UMAAL")>;
3127330f729Sjoerg
3137330f729Sjoerg  def SwiftDiv : SchedWriteRes<[SwiftUnitP0, SwiftUnitDiv]> {
3147330f729Sjoerg    let NumMicroOps = 1;
3157330f729Sjoerg    let Latency = 14;
3167330f729Sjoerg    let ResourceCycles = [1, 14];
3177330f729Sjoerg  }
3187330f729Sjoerg  // 4.2.18 Integer Divide
3197330f729Sjoerg  def : WriteRes<WriteDIV, [SwiftUnitDiv]>; // Workaround.
3207330f729Sjoerg  def : InstRW <[SwiftDiv],
3217330f729Sjoerg        (instregex "SDIV", "UDIV", "t2SDIV", "t2UDIV")>;
3227330f729Sjoerg
3237330f729Sjoerg  // 4.2.19 Integer Load Single Element
3247330f729Sjoerg  // 4.2.20 Integer Load Signextended
3257330f729Sjoerg  def SwiftWriteP2P01ThreeCycle : SchedWriteRes<[SwiftUnitP2, SwiftUnitP01]> {
3267330f729Sjoerg    let Latency = 3;
3277330f729Sjoerg    let NumMicroOps = 2;
3287330f729Sjoerg  }
3297330f729Sjoerg  def SwiftWriteP2P01FourCycle : SchedWriteRes<[SwiftUnitP2, SwiftUnitP01]> {
3307330f729Sjoerg    let Latency = 4;
3317330f729Sjoerg    let NumMicroOps = 2;
3327330f729Sjoerg  }
3337330f729Sjoerg  def SwiftWriteP2P01P01FourCycle : SchedWriteRes<[SwiftUnitP2, SwiftUnitP01,
3347330f729Sjoerg                                                   SwiftUnitP01]> {
3357330f729Sjoerg    let Latency = 4;
3367330f729Sjoerg    let NumMicroOps = 3;
3377330f729Sjoerg  }
3387330f729Sjoerg  def SwiftWriteP2P2ThreeCycle : SchedWriteRes<[SwiftUnitP2, SwiftUnitP2]> {
3397330f729Sjoerg    let Latency = 3;
3407330f729Sjoerg    let NumMicroOps = 2;
3417330f729Sjoerg  }
3427330f729Sjoerg  def SwiftWriteP2P2P01ThreeCycle : SchedWriteRes<[SwiftUnitP2, SwiftUnitP2,
3437330f729Sjoerg                                                   SwiftUnitP01]> {
3447330f729Sjoerg    let Latency = 3;
3457330f729Sjoerg    let NumMicroOps = 3;
3467330f729Sjoerg  }
3477330f729Sjoerg  def SwiftWrBackOne : SchedWriteRes<[]> {
3487330f729Sjoerg    let Latency = 1;
3497330f729Sjoerg    let NumMicroOps = 0;
3507330f729Sjoerg  }
3517330f729Sjoerg  def SwiftWriteLdFour : SchedWriteRes<[]> {
3527330f729Sjoerg    let Latency = 4;
3537330f729Sjoerg    let NumMicroOps = 0;
3547330f729Sjoerg  }
3557330f729Sjoerg   // Not accurate.
3567330f729Sjoerg  def : InstRW<[SwiftWriteP2ThreeCycle],
3577330f729Sjoerg        (instregex "LDR(i12|rs)$", "LDRB(i12|rs)$", "t2LDR(i8|i12|s|pci)",
3587330f729Sjoerg        "t2LDR(H|B)(i8|i12|s|pci)", "LDREX", "tLDR[BH](r|i|spi|pci|pciASM)",
3597330f729Sjoerg        "tLDR(r|i|spi|pci|pciASM)")>;
3607330f729Sjoerg  def : InstRW<[SwiftWriteP2ThreeCycle],
3617330f729Sjoerg        (instregex "LDRH$",  "PICLDR$", "PICLDR(H|B)$", "LDRcp$")>;
3627330f729Sjoerg  def : InstRW<[SwiftWriteP2P01FourCycle],
3637330f729Sjoerg        (instregex "PICLDRS(H|B)$", "t2LDRS(H|B)(i|r|p|s)", "LDRS(H|B)$",
3647330f729Sjoerg        "t2LDRpci_pic", "tLDRS(B|H)")>;
3657330f729Sjoerg  def : InstRW<[SwiftWriteP2P01ThreeCycle,  SwiftWrBackOne],
3667330f729Sjoerg        (instregex "LD(RB|R)(_|T_)(POST|PRE)_(IMM|REG)", "LDRH(_PRE|_POST)",
3677330f729Sjoerg        "LDR(T|BT)_POST_(REG|IMM)", "LDRHT(i|r)",
3687330f729Sjoerg        "t2LD(R|RB|RH)_(PRE|POST)", "t2LD(R|RB|RH)T")>;
3697330f729Sjoerg  def : InstRW<[SwiftWriteP2P01P01FourCycle, SwiftWrBackOne],
3707330f729Sjoerg        (instregex "LDR(SH|SB)(_POST|_PRE)", "t2LDR(SH|SB)(_POST|_PRE)",
3717330f729Sjoerg        "LDRS(B|H)T(i|r)", "t2LDRS(B|H)T(i|r)?")>;
3727330f729Sjoerg
3737330f729Sjoerg  // 4.2.21 Integer Dual Load
3747330f729Sjoerg  // Not accurate.
3757330f729Sjoerg  def : InstRW<[SwiftWriteP2P2ThreeCycle, SwiftWriteLdFour],
3767330f729Sjoerg        (instregex "t2LDRDi8", "LDRD$")>;
3777330f729Sjoerg  def : InstRW<[SwiftWriteP2P2P01ThreeCycle, SwiftWriteLdFour, SwiftWrBackOne],
3787330f729Sjoerg        (instregex "LDRD_(POST|PRE)", "t2LDRD_(POST|PRE)")>;
3797330f729Sjoerg
3807330f729Sjoerg  // 4.2.22 Integer Load, Multiple
3817330f729Sjoerg  // NumReg = 1 .. 16
3827330f729Sjoerg  foreach Lat = 3-25 in {
3837330f729Sjoerg    def SwiftWriteLM#Lat#Cy : SchedWriteRes<[SwiftUnitP2]> {
3847330f729Sjoerg      let Latency = Lat;
3857330f729Sjoerg    }
3867330f729Sjoerg    def SwiftWriteLM#Lat#CyNo : SchedWriteRes<[]> {
3877330f729Sjoerg      let Latency = Lat;
3887330f729Sjoerg      let NumMicroOps = 0;
3897330f729Sjoerg    }
3907330f729Sjoerg  }
3917330f729Sjoerg  // Predicate.
3927330f729Sjoerg  foreach NumAddr = 1-16 in {
3937330f729Sjoerg    def SwiftLMAddr#NumAddr#Pred : SchedPredicate<"TII->getNumLDMAddresses(*MI) == "#NumAddr>;
3947330f729Sjoerg  }
3957330f729Sjoerg  def SwiftWriteLDMAddrNoWB : SchedWriteRes<[SwiftUnitP01]> { let Latency = 0; }
3967330f729Sjoerg  def SwiftWriteLDMAddrWB : SchedWriteRes<[SwiftUnitP01, SwiftUnitP01]>;
3977330f729Sjoerg  def SwiftWriteLM : SchedWriteVariant<[
3987330f729Sjoerg    SchedVar<SwiftLMAddr2Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy]>,
3997330f729Sjoerg    SchedVar<SwiftLMAddr3Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4007330f729Sjoerg                                SwiftWriteLM5Cy]>,
4017330f729Sjoerg    SchedVar<SwiftLMAddr4Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4027330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy]>,
4037330f729Sjoerg    SchedVar<SwiftLMAddr5Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4047330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4057330f729Sjoerg                                SwiftWriteLM7Cy]>,
4067330f729Sjoerg    SchedVar<SwiftLMAddr6Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4077330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4087330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy]>,
4097330f729Sjoerg    SchedVar<SwiftLMAddr7Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4107330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4117330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy,
4127330f729Sjoerg                                SwiftWriteLM9Cy]>,
4137330f729Sjoerg    SchedVar<SwiftLMAddr8Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4147330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4157330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy,
4167330f729Sjoerg                                SwiftWriteLM9Cy, SwiftWriteLM10Cy]>,
4177330f729Sjoerg    SchedVar<SwiftLMAddr9Pred, [SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4187330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4197330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy,
4207330f729Sjoerg                                SwiftWriteLM9Cy, SwiftWriteLM10Cy,
4217330f729Sjoerg                                SwiftWriteLM11Cy]>,
4227330f729Sjoerg    SchedVar<SwiftLMAddr10Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4237330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4247330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy,
4257330f729Sjoerg                                SwiftWriteLM9Cy, SwiftWriteLM10Cy,
4267330f729Sjoerg                                SwiftWriteLM11Cy, SwiftWriteLM12Cy]>,
4277330f729Sjoerg    SchedVar<SwiftLMAddr11Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4287330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4297330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy,
4307330f729Sjoerg                                SwiftWriteLM9Cy, SwiftWriteLM10Cy,
4317330f729Sjoerg                                SwiftWriteLM11Cy, SwiftWriteLM12Cy,
4327330f729Sjoerg                                SwiftWriteLM13Cy]>,
4337330f729Sjoerg    SchedVar<SwiftLMAddr12Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4347330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4357330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy,
4367330f729Sjoerg                                SwiftWriteLM9Cy, SwiftWriteLM10Cy,
4377330f729Sjoerg                                SwiftWriteLM11Cy, SwiftWriteLM12Cy,
4387330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM14Cy]>,
4397330f729Sjoerg    SchedVar<SwiftLMAddr13Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4407330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4417330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy,
4427330f729Sjoerg                                SwiftWriteLM9Cy, SwiftWriteLM10Cy,
4437330f729Sjoerg                                SwiftWriteLM11Cy, SwiftWriteLM12Cy,
4447330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM14Cy,
4457330f729Sjoerg                                SwiftWriteLM15Cy]>,
4467330f729Sjoerg    SchedVar<SwiftLMAddr14Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4477330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4487330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy,
4497330f729Sjoerg                                SwiftWriteLM9Cy, SwiftWriteLM10Cy,
4507330f729Sjoerg                                SwiftWriteLM11Cy, SwiftWriteLM12Cy,
4517330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM14Cy,
4527330f729Sjoerg                                SwiftWriteLM15Cy, SwiftWriteLM16Cy]>,
4537330f729Sjoerg    SchedVar<SwiftLMAddr15Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4547330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4557330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy,
4567330f729Sjoerg                                SwiftWriteLM9Cy, SwiftWriteLM10Cy,
4577330f729Sjoerg                                SwiftWriteLM11Cy, SwiftWriteLM12Cy,
4587330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM14Cy,
4597330f729Sjoerg                                SwiftWriteLM15Cy, SwiftWriteLM16Cy,
4607330f729Sjoerg                                SwiftWriteLM17Cy]>,
4617330f729Sjoerg    SchedVar<SwiftLMAddr16Pred,[SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4627330f729Sjoerg                                SwiftWriteLM5Cy, SwiftWriteLM6Cy,
4637330f729Sjoerg                                SwiftWriteLM7Cy, SwiftWriteLM8Cy,
4647330f729Sjoerg                                SwiftWriteLM9Cy, SwiftWriteLM10Cy,
4657330f729Sjoerg                                SwiftWriteLM11Cy, SwiftWriteLM12Cy,
4667330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM14Cy,
4677330f729Sjoerg                                SwiftWriteLM15Cy, SwiftWriteLM16Cy,
4687330f729Sjoerg                                SwiftWriteLM17Cy, SwiftWriteLM18Cy]>,
4697330f729Sjoerg    // Unknow number of registers, just use resources for two registers.
4707330f729Sjoerg    SchedVar<NoSchedPred,      [SwiftWriteLM3Cy, SwiftWriteLM4Cy,
4717330f729Sjoerg                                SwiftWriteLM5CyNo, SwiftWriteLM6CyNo,
4727330f729Sjoerg                                SwiftWriteLM7CyNo, SwiftWriteLM8CyNo,
4737330f729Sjoerg                                SwiftWriteLM9CyNo, SwiftWriteLM10CyNo,
4747330f729Sjoerg                                SwiftWriteLM11CyNo, SwiftWriteLM12CyNo,
4757330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM14CyNo,
4767330f729Sjoerg                                SwiftWriteLM15CyNo, SwiftWriteLM16CyNo,
4777330f729Sjoerg                                SwiftWriteLM17CyNo, SwiftWriteLM18CyNo]>
4787330f729Sjoerg
4797330f729Sjoerg  ]> { let Variadic=1; }
4807330f729Sjoerg
4817330f729Sjoerg  def : InstRW<[SwiftWriteLM, SwiftWriteLDMAddrNoWB],
4827330f729Sjoerg        (instregex "LDM(IA|DA|DB|IB)$", "t2LDM(IA|DA|DB|IB)$",
4837330f729Sjoerg        "(t|sys)LDM(IA|DA|DB|IB)$")>;
4847330f729Sjoerg  def : InstRW<[SwiftWriteLDMAddrWB, SwiftWriteLM],
4857330f729Sjoerg        (instregex /*"t2LDMIA_RET", "tLDMIA_RET", "LDMIA_RET",*/
4867330f729Sjoerg        "LDM(IA|DA|DB|IB)_UPD", "(t2|sys|t)LDM(IA|DA|DB|IB)_UPD")>;
4877330f729Sjoerg  def : InstRW<[SwiftWriteLDMAddrWB, SwiftWriteLM, SwiftWriteP1TwoCycle],
4887330f729Sjoerg        (instregex "LDMIA_RET", "(t|t2)LDMIA_RET", "tPOP")>;
4897330f729Sjoerg  // 4.2.23 Integer Store, Single Element
4907330f729Sjoerg  def : InstRW<[SwiftWriteP2],
4917330f729Sjoerg        (instregex "PICSTR", "STR(i12|rs)", "STRB(i12|rs)", "STRH$", "STREX",
4927330f729Sjoerg        "t2STR(i12|i8|s)$", "t2STR[BH](i12|i8|s)$", "tSTR[BH](i|r)", "tSTR(i|r)", "tSTRspi")>;
4937330f729Sjoerg
4947330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWriteP2],
4957330f729Sjoerg        (instregex "STR(B_|_|BT_|T_)(PRE_IMM|PRE_REG|POST_REG|POST_IMM)",
4967330f729Sjoerg        "STR(i|r)_preidx", "STRB(i|r)_preidx", "STRH_preidx", "STR(H_|HT_)(PRE|POST)",
4977330f729Sjoerg        "STR(BT|HT|T)", "t2STR_(PRE|POST)", "t2STR[BH]_(PRE|POST)",
4987330f729Sjoerg        "t2STR_preidx", "t2STR[BH]_preidx", "t2ST(RB|RH|R)T")>;
4997330f729Sjoerg
5007330f729Sjoerg  // 4.2.24 Integer Store, Dual
5017330f729Sjoerg  def : InstRW<[SwiftWriteP2, SwiftWriteP2, SwiftWriteP01OneCycle],
5027330f729Sjoerg        (instregex "STRD$", "t2STRDi8")>;
5037330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWriteP2, SwiftWriteP2,
5047330f729Sjoerg                SwiftWriteP01OneCycle],
5057330f729Sjoerg        (instregex "(t2|t)STRD_(POST|PRE)", "STRD_(POST|PRE)")>;
5067330f729Sjoerg
5077330f729Sjoerg  // 4.2.25 Integer Store, Multiple
5087330f729Sjoerg  def SwiftWriteStIncAddr : SchedWriteRes<[SwiftUnitP2, SwiftUnitP01]> {
5097330f729Sjoerg    let Latency = 0;
5107330f729Sjoerg    let NumMicroOps = 2;
5117330f729Sjoerg  }
5127330f729Sjoerg  foreach NumAddr = 1-16 in {
5137330f729Sjoerg     def SwiftWriteSTM#NumAddr : WriteSequence<[SwiftWriteStIncAddr], NumAddr>;
5147330f729Sjoerg  }
5157330f729Sjoerg  def SwiftWriteSTM : SchedWriteVariant<[
5167330f729Sjoerg    SchedVar<SwiftLMAddr2Pred, [SwiftWriteSTM2]>,
5177330f729Sjoerg    SchedVar<SwiftLMAddr3Pred, [SwiftWriteSTM3]>,
5187330f729Sjoerg    SchedVar<SwiftLMAddr4Pred, [SwiftWriteSTM4]>,
5197330f729Sjoerg    SchedVar<SwiftLMAddr5Pred, [SwiftWriteSTM5]>,
5207330f729Sjoerg    SchedVar<SwiftLMAddr6Pred, [SwiftWriteSTM6]>,
5217330f729Sjoerg    SchedVar<SwiftLMAddr7Pred, [SwiftWriteSTM7]>,
5227330f729Sjoerg    SchedVar<SwiftLMAddr8Pred, [SwiftWriteSTM8]>,
5237330f729Sjoerg    SchedVar<SwiftLMAddr9Pred, [SwiftWriteSTM9]>,
5247330f729Sjoerg    SchedVar<SwiftLMAddr10Pred,[SwiftWriteSTM10]>,
5257330f729Sjoerg    SchedVar<SwiftLMAddr11Pred,[SwiftWriteSTM11]>,
5267330f729Sjoerg    SchedVar<SwiftLMAddr12Pred,[SwiftWriteSTM12]>,
5277330f729Sjoerg    SchedVar<SwiftLMAddr13Pred,[SwiftWriteSTM13]>,
5287330f729Sjoerg    SchedVar<SwiftLMAddr14Pred,[SwiftWriteSTM14]>,
5297330f729Sjoerg    SchedVar<SwiftLMAddr15Pred,[SwiftWriteSTM15]>,
5307330f729Sjoerg    SchedVar<SwiftLMAddr16Pred,[SwiftWriteSTM16]>,
5317330f729Sjoerg    // Unknow number of registers, just use resources for two registers.
5327330f729Sjoerg    SchedVar<NoSchedPred,      [SwiftWriteSTM2]>
5337330f729Sjoerg  ]>;
5347330f729Sjoerg  def : InstRW<[SwiftWriteSTM],
5357330f729Sjoerg        (instregex "STM(IB|IA|DB|DA)$", "(t2|sys|t)STM(IB|IA|DB|DA)$")>;
5367330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWriteSTM],
5377330f729Sjoerg        (instregex "STM(IB|IA|DB|DA)_UPD", "(t2|sys|t)STM(IB|IA|DB|DA)_UPD",
5387330f729Sjoerg        "tPUSH")>;
5397330f729Sjoerg
5407330f729Sjoerg  // LDRLIT pseudo instructions, they expand to LDR + PICADD
5417330f729Sjoerg  def : InstRW<[SwiftWriteP2ThreeCycle, WriteALU],
5427330f729Sjoerg        (instregex "t?LDRLIT_ga_abs", "t?LDRLIT_ga_pcrel")>;
5437330f729Sjoerg  // LDRLIT_ga_pcrel_ldr expands to LDR + PICLDR
5447330f729Sjoerg  def : InstRW<[SwiftWriteP2ThreeCycle, SwiftWriteP2ThreeCycle],
5457330f729Sjoerg        (instregex "LDRLIT_ga_pcrel_ldr")>;
5467330f729Sjoerg
5477330f729Sjoerg  // 4.2.26 Branch
5487330f729Sjoerg  def : WriteRes<WriteBr, [SwiftUnitP1]> { let Latency = 0; }
5497330f729Sjoerg  def : WriteRes<WriteBrL, [SwiftUnitP1]> { let Latency = 2; }
5507330f729Sjoerg  def : WriteRes<WriteBrTbl, [SwiftUnitP1, SwiftUnitP2]> { let Latency = 0; }
5517330f729Sjoerg
5527330f729Sjoerg  // 4.2.27 Not issued
5537330f729Sjoerg  def : WriteRes<WriteNoop, []> { let Latency = 0; let NumMicroOps = 0; }
5547330f729Sjoerg  def : InstRW<[WriteNoop], (instregex "t2IT", "IT")>;
5557330f729Sjoerg
5567330f729Sjoerg  // 4.2.28 Advanced SIMD, Integer, 2 cycle
5577330f729Sjoerg  def : InstRW<[SwiftWriteP0TwoCycle],
5587330f729Sjoerg        (instregex "VADDv", "VSUBv", "VNEG(s|f|v)", "VADDL", "VSUBL",
5597330f729Sjoerg                   "VADDW", "VSUBW", "VHADD", "VHSUB", "VRHADD", "VPADDi",
5607330f729Sjoerg                   "VPADDL", "VAND", "VBIC", "VEOR", "VORN", "VORR", "VTST",
561*82d56013Sjoerg                   "VSHL", "VSHR(s|u)", "VSHLL", "VQSHL(s|u)", "VBIF", "VBIT",
562*82d56013Sjoerg                   "VBSL", "VBSP", "VSLI", "VSRI", "VCLS", "VCLZ", "VCNT")>;
5637330f729Sjoerg
5647330f729Sjoerg  def : InstRW<[SwiftWriteP1TwoCycle],
5657330f729Sjoerg        (instregex "VEXT", "VREV16", "VREV32", "VREV64")>;
5667330f729Sjoerg
5677330f729Sjoerg  // 4.2.29 Advanced SIMD, Integer, 4 cycle
5687330f729Sjoerg  // 4.2.30 Advanced SIMD, Integer with Accumulate
5697330f729Sjoerg  def : InstRW<[SwiftWriteP0FourCycle],
5707330f729Sjoerg        (instregex "VABA", "VABAL", "VPADAL", "VRSRA", "VSRA", "VACGE", "VACGT",
5717330f729Sjoerg        "VCEQ", "VCGE", "VCGT", "VCLE", "VCLT", "VRSHL",
5727330f729Sjoerg        "VQRSHL", "VRSHR(u|s)", "VABS(f|v)", "VQABS", "VQNEG", "VQADD",
5737330f729Sjoerg        "VQSUB")>;
5747330f729Sjoerg  def : InstRW<[SwiftWriteP1FourCycle],
5757330f729Sjoerg        (instregex "VRECPE", "VRSQRTE")>;
5767330f729Sjoerg
5777330f729Sjoerg  // 4.2.31 Advanced SIMD, Add and Shift with Narrow
5787330f729Sjoerg  def : InstRW<[SwiftWriteP0P1FourCycle],
5797330f729Sjoerg        (instregex "VADDHN", "VSUBHN", "VSHRN")>;
5807330f729Sjoerg  def : InstRW<[SwiftWriteP0P1SixCycle],
5817330f729Sjoerg        (instregex "VRADDHN", "VRSUBHN", "VRSHRN", "VQSHRN", "VQSHRUN",
5827330f729Sjoerg                   "VQRSHRN", "VQRSHRUN")>;
5837330f729Sjoerg
5847330f729Sjoerg  // 4.2.32 Advanced SIMD, Vector Table Lookup
5857330f729Sjoerg  foreach Num = 1-4 in {
5867330f729Sjoerg    def SwiftWrite#Num#xP1TwoCycle : WriteSequence<[SwiftWriteP1TwoCycle], Num>;
5877330f729Sjoerg  }
5887330f729Sjoerg  def : InstRW<[SwiftWrite1xP1TwoCycle],
5897330f729Sjoerg        (instregex "VTB(L|X)1")>;
5907330f729Sjoerg  def : InstRW<[SwiftWrite2xP1TwoCycle],
5917330f729Sjoerg        (instregex "VTB(L|X)2")>;
5927330f729Sjoerg  def : InstRW<[SwiftWrite3xP1TwoCycle],
5937330f729Sjoerg        (instregex "VTB(L|X)3")>;
5947330f729Sjoerg  def : InstRW<[SwiftWrite4xP1TwoCycle],
5957330f729Sjoerg        (instregex "VTB(L|X)4")>;
5967330f729Sjoerg
5977330f729Sjoerg  // 4.2.33 Advanced SIMD, Transpose
5987330f729Sjoerg  def : InstRW<[SwiftWriteP1FourCycle, SwiftWriteP1FourCycle,
5997330f729Sjoerg                SwiftWriteP1TwoCycle/*RsrcOnly*/, SchedReadAdvance<2>],
6007330f729Sjoerg        (instregex "VSWP", "VTRN", "VUZP", "VZIP")>;
6017330f729Sjoerg
6027330f729Sjoerg  // 4.2.34 Advanced SIMD and VFP, Floating Point
6037330f729Sjoerg  def : InstRW<[SwiftWriteP0TwoCycle], (instregex "VABS(S|D)$", "VNEG(S|D)$")>;
6047330f729Sjoerg  def : InstRW<[SwiftWriteP0FourCycle],
6057330f729Sjoerg        (instregex "VCMP(D|S|ZD|ZS)$", "VCMPE(D|S|ZD|ZS)")>;
6067330f729Sjoerg  def : InstRW<[SwiftWriteP0FourCycle],
6077330f729Sjoerg        (instregex "VADD(S|f)", "VSUB(S|f)", "VABD", "VPADDf", "VMAX", "VMIN", "VPMAX",
6087330f729Sjoerg                   "VPMIN")>;
6097330f729Sjoerg  def : InstRW<[SwiftWriteP0SixCycle], (instregex "VADDD$", "VSUBD$")>;
6107330f729Sjoerg  def : InstRW<[SwiftWriteP1EightCycle], (instregex "VRECPS", "VRSQRTS")>;
6117330f729Sjoerg
6127330f729Sjoerg  // 4.2.35 Advanced SIMD and VFP, Multiply
6137330f729Sjoerg  def : InstRW<[SwiftWriteP1FourCycle],
6147330f729Sjoerg        (instregex "VMUL(S|v|p|f|s)", "VNMULS", "VQDMULH", "VQRDMULH",
6157330f729Sjoerg                   "VMULL", "VQDMULL")>;
6167330f729Sjoerg  def : InstRW<[SwiftWriteP1FourCycle],
6177330f729Sjoerg        (instregex "VMLA", "VMLS", "VNMLA", "VNMLS", "VFMA(S|D)", "VFMS(S|D)",
6187330f729Sjoerg        "VFNMA", "VFNMS", "VMLAL", "VMLSL","VQDMLAL", "VQDMLSL")>;
6197330f729Sjoerg  def : InstRW<[SwiftWriteP1EightCycle], (instregex "VFMAfd", "VFMSfd")>;
6207330f729Sjoerg  def : InstRW<[SwiftWriteP1TwelveCyc], (instregex "VFMAfq", "VFMSfq")>;
6217330f729Sjoerg
6227330f729Sjoerg  // 4.2.36 Advanced SIMD and VFP, Convert
6237330f729Sjoerg  def : InstRW<[SwiftWriteP1FourCycle], (instregex "VCVT", "V(S|U)IT", "VTO(S|U)")>;
6247330f729Sjoerg
6257330f729Sjoerg  // 4.2.37 Advanced SIMD and VFP, Move
6267330f729Sjoerg  def : InstRW<[SwiftWriteP0TwoCycle],
6277330f729Sjoerg        (instregex "VMOVv", "VMOV(S|D)$", "VMOV(S|D)cc",
6287330f729Sjoerg                   "VMVNv", "VMVN(d|q)",
6297330f729Sjoerg                   "FCONST(D|S)")>;
6307330f729Sjoerg  def : InstRW<[SwiftWriteP1TwoCycle], (instregex "VMOVN", "VMOVL")>;
6317330f729Sjoerg  def : InstRW<[WriteSequence<[SwiftWriteP0FourCycle, SwiftWriteP1TwoCycle]>],
6327330f729Sjoerg        (instregex "VQMOVN")>;
6337330f729Sjoerg  def : InstRW<[SwiftWriteP1TwoCycle], (instregex "VDUPLN")>;
6347330f729Sjoerg  def : InstRW<[WriteSequence<[SwiftWriteP2FourCycle, SwiftWriteP1TwoCycle]>],
6357330f729Sjoerg        (instregex "VDUP(8|16|32)")>;
6367330f729Sjoerg  def : InstRW<[SwiftWriteP2ThreeCycle], (instregex "VMOVRS$")>;
6377330f729Sjoerg  def : InstRW<[WriteSequence<[SwiftWriteP2FourCycle, SwiftWriteP0TwoCycle]>],
6387330f729Sjoerg        (instregex "VMOVSR$", "VSETLN")>;
6397330f729Sjoerg  def : InstRW<[SwiftWriteP2ThreeCycle, SwiftWriteP2FourCycle],
6407330f729Sjoerg        (instregex "VMOVRR(D|S)$")>;
6417330f729Sjoerg  def : InstRW<[SwiftWriteP2FourCycle], (instregex "VMOVDRR$")>;
6427330f729Sjoerg  def : InstRW<[WriteSequence<[SwiftWriteP2FourCycle, SwiftWriteP1TwoCycle]>,
6437330f729Sjoerg                WriteSequence<[SwiftWrite1Cycle, SwiftWriteP2FourCycle,
6447330f729Sjoerg                               SwiftWriteP1TwoCycle]>],
6457330f729Sjoerg                (instregex "VMOVSRR$")>;
6467330f729Sjoerg  def : InstRW<[WriteSequence<[SwiftWriteP1TwoCycle, SwiftWriteP2ThreeCycle]>],
6477330f729Sjoerg        (instregex "VGETLN(u|i)")>;
6487330f729Sjoerg  def : InstRW<[WriteSequence<[SwiftWriteP1TwoCycle, SwiftWriteP2ThreeCycle,
6497330f729Sjoerg                               SwiftWriteP01OneCycle]>],
6507330f729Sjoerg        (instregex "VGETLNs")>;
6517330f729Sjoerg
6527330f729Sjoerg  // 4.2.38 Advanced SIMD and VFP, Move FPSCR
6537330f729Sjoerg  // Serializing instructions.
6547330f729Sjoerg  def SwiftWaitP0For15Cy : SchedWriteRes<[SwiftUnitP0]> {
6557330f729Sjoerg    let Latency = 15;
6567330f729Sjoerg    let ResourceCycles = [15];
6577330f729Sjoerg  }
6587330f729Sjoerg  def SwiftWaitP1For15Cy : SchedWriteRes<[SwiftUnitP1]> {
6597330f729Sjoerg    let Latency = 15;
6607330f729Sjoerg    let ResourceCycles = [15];
6617330f729Sjoerg  }
6627330f729Sjoerg  def SwiftWaitP2For15Cy : SchedWriteRes<[SwiftUnitP2]> {
6637330f729Sjoerg    let Latency = 15;
6647330f729Sjoerg    let ResourceCycles = [15];
6657330f729Sjoerg  }
6667330f729Sjoerg  def : InstRW<[SwiftWaitP0For15Cy, SwiftWaitP1For15Cy, SwiftWaitP2For15Cy],
6677330f729Sjoerg        (instregex "VMRS")>;
6687330f729Sjoerg  def : InstRW<[SwiftWaitP0For15Cy, SwiftWaitP1For15Cy, SwiftWaitP2For15Cy],
6697330f729Sjoerg        (instregex "VMSR")>;
6707330f729Sjoerg  // Not serializing.
6717330f729Sjoerg  def : InstRW<[SwiftWriteP0TwoCycle], (instregex "FMSTAT")>;
6727330f729Sjoerg
6737330f729Sjoerg  // 4.2.39 Advanced SIMD and VFP, Load Single Element
6747330f729Sjoerg  def : InstRW<[SwiftWriteLM4Cy], (instregex "VLDRD$", "VLDRS$")>;
6757330f729Sjoerg
6767330f729Sjoerg  // 4.2.40 Advanced SIMD and VFP, Store Single Element
6777330f729Sjoerg  def : InstRW<[SwiftWriteLM4Cy], (instregex "VSTRD$", "VSTRS$")>;
6787330f729Sjoerg
6797330f729Sjoerg  // 4.2.41 Advanced SIMD and VFP, Load Multiple
6807330f729Sjoerg  // 4.2.42 Advanced SIMD and VFP, Store Multiple
6817330f729Sjoerg
6827330f729Sjoerg  // Resource requirement for permuting, just reserves the resources.
6837330f729Sjoerg  foreach Num = 1-28 in {
6847330f729Sjoerg    def SwiftVLDMPerm#Num : SchedWriteRes<[SwiftUnitP1]> {
6857330f729Sjoerg      let Latency = 0;
6867330f729Sjoerg      let NumMicroOps = Num;
6877330f729Sjoerg      let ResourceCycles = [Num];
6887330f729Sjoerg    }
6897330f729Sjoerg  }
6907330f729Sjoerg
6917330f729Sjoerg  // Pre RA pseudos - load/store to a Q register as a D register pair.
6927330f729Sjoerg  def : InstRW<[SwiftWriteLM4Cy], (instregex "VLDMQIA$", "VSTMQIA$")>;
6937330f729Sjoerg
6947330f729Sjoerg  // Post RA not modelled accurately. We assume that register use of width 64
6957330f729Sjoerg  // bit maps to a D register, 128 maps to a Q register. Not all different kinds
6967330f729Sjoerg  // are accurately represented.
6977330f729Sjoerg  def SwiftWriteVLDM : SchedWriteVariant<[
6987330f729Sjoerg    // Load of one S register.
6997330f729Sjoerg    SchedVar<SwiftLMAddr1Pred, [SwiftWriteLM4Cy]>,
7007330f729Sjoerg    // Load of one D register.
7017330f729Sjoerg    SchedVar<SwiftLMAddr2Pred, [SwiftWriteLM4Cy, SwiftWriteLM4CyNo]>,
7027330f729Sjoerg    // Load of 3 S register.
7037330f729Sjoerg    SchedVar<SwiftLMAddr3Pred, [SwiftWriteLM9Cy, SwiftWriteLM10Cy,
7047330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteP01OneCycle,
7057330f729Sjoerg                                SwiftVLDMPerm3]>,
7067330f729Sjoerg    // Load of a Q register (not necessarily true). We should not be mapping to
7077330f729Sjoerg    // 4 S registers, either.
7087330f729Sjoerg    SchedVar<SwiftLMAddr4Pred, [SwiftWriteLM4Cy, SwiftWriteLM4CyNo,
7097330f729Sjoerg                                SwiftWriteLM4CyNo, SwiftWriteLM4CyNo]>,
7107330f729Sjoerg    // Load of 5 S registers.
7117330f729Sjoerg    SchedVar<SwiftLMAddr5Pred, [SwiftWriteLM9Cy, SwiftWriteLM10Cy,
7127330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM14CyNo,
7137330f729Sjoerg                                SwiftWriteLM17CyNo,  SwiftWriteP01OneCycle,
7147330f729Sjoerg                                SwiftVLDMPerm5]>,
7157330f729Sjoerg    // Load of 3 D registers. (Must also be able to handle s register list -
7167330f729Sjoerg    // though, not accurate)
7177330f729Sjoerg    SchedVar<SwiftLMAddr6Pred, [SwiftWriteLM7Cy, SwiftWriteLM8Cy,
7187330f729Sjoerg                                SwiftWriteLM10Cy, SwiftWriteLM14CyNo,
7197330f729Sjoerg                                SwiftWriteLM14CyNo, SwiftWriteLM14CyNo,
7207330f729Sjoerg                                SwiftWriteP01OneCycle, SwiftVLDMPerm5]>,
7217330f729Sjoerg    // Load of 7 S registers.
7227330f729Sjoerg    SchedVar<SwiftLMAddr7Pred, [SwiftWriteLM9Cy, SwiftWriteLM10Cy,
7237330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM14CyNo,
7247330f729Sjoerg                                SwiftWriteLM17CyNo, SwiftWriteLM18CyNo,
7257330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteP01OneCycle,
7267330f729Sjoerg                                SwiftVLDMPerm7]>,
7277330f729Sjoerg    // Load of two Q registers.
7287330f729Sjoerg    SchedVar<SwiftLMAddr8Pred, [SwiftWriteLM7Cy, SwiftWriteLM8Cy,
7297330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM13CyNo,
7307330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
7317330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
7327330f729Sjoerg                                SwiftWriteP01OneCycle,  SwiftVLDMPerm2]>,
7337330f729Sjoerg    // Load of 9 S registers.
7347330f729Sjoerg    SchedVar<SwiftLMAddr9Pred, [SwiftWriteLM9Cy, SwiftWriteLM10Cy,
7357330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM14CyNo,
7367330f729Sjoerg                                SwiftWriteLM17CyNo, SwiftWriteLM18CyNo,
7377330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteLM22CyNo,
7387330f729Sjoerg                                SwiftWriteLM25CyNo, SwiftWriteP01OneCycle,
7397330f729Sjoerg                                SwiftVLDMPerm9]>,
7407330f729Sjoerg    // Load of 5 D registers.
7417330f729Sjoerg    SchedVar<SwiftLMAddr10Pred,[SwiftWriteLM7Cy, SwiftWriteLM8Cy,
7427330f729Sjoerg                                SwiftWriteLM10Cy, SwiftWriteLM14Cy,
7437330f729Sjoerg                                SwiftWriteLM14CyNo, SwiftWriteLM14CyNo,
7447330f729Sjoerg                                SwiftWriteLM14CyNo, SwiftWriteLM14CyNo,
7457330f729Sjoerg                                SwiftWriteLM14CyNo,  SwiftWriteLM14CyNo,
7467330f729Sjoerg                                SwiftWriteP01OneCycle, SwiftVLDMPerm5]>,
747*82d56013Sjoerg    // Inaccurate: reuse description from 9 S registers.
7487330f729Sjoerg    SchedVar<SwiftLMAddr11Pred,[SwiftWriteLM9Cy, SwiftWriteLM10Cy,
7497330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM14CyNo,
7507330f729Sjoerg                                SwiftWriteLM17CyNo, SwiftWriteLM18CyNo,
7517330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteLM22CyNo,
7527330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteLM22CyNo,
7537330f729Sjoerg                                SwiftWriteLM25CyNo, SwiftWriteP01OneCycle,
7547330f729Sjoerg                                SwiftVLDMPerm9]>,
7557330f729Sjoerg    // Load of three Q registers.
7567330f729Sjoerg    SchedVar<SwiftLMAddr12Pred,[SwiftWriteLM7Cy, SwiftWriteLM8Cy,
7577330f729Sjoerg                                SwiftWriteLM11Cy, SwiftWriteLM11Cy,
7587330f729Sjoerg                                SwiftWriteLM11CyNo, SwiftWriteLM11CyNo,
7597330f729Sjoerg                                SwiftWriteLM11CyNo, SwiftWriteLM11CyNo,
7607330f729Sjoerg                                SwiftWriteLM11CyNo, SwiftWriteLM11CyNo,
7617330f729Sjoerg                                SwiftWriteLM11CyNo, SwiftWriteLM11CyNo,
7627330f729Sjoerg                                SwiftWriteP01OneCycle, SwiftVLDMPerm3]>,
763*82d56013Sjoerg    // Inaccurate: reuse description from 9 S registers.
7647330f729Sjoerg    SchedVar<SwiftLMAddr13Pred, [SwiftWriteLM9Cy, SwiftWriteLM10Cy,
7657330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM14CyNo,
7667330f729Sjoerg                                SwiftWriteLM17CyNo, SwiftWriteLM18CyNo,
7677330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteLM22CyNo,
7687330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteLM22CyNo,
7697330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteLM22CyNo,
7707330f729Sjoerg                                SwiftWriteLM25CyNo, SwiftWriteP01OneCycle,
7717330f729Sjoerg                                SwiftVLDMPerm9]>,
7727330f729Sjoerg    // Load of 7 D registers inaccurate.
7737330f729Sjoerg    SchedVar<SwiftLMAddr14Pred,[SwiftWriteLM7Cy, SwiftWriteLM8Cy,
7747330f729Sjoerg                                SwiftWriteLM10Cy, SwiftWriteLM14Cy,
7757330f729Sjoerg                                SwiftWriteLM14Cy, SwiftWriteLM14CyNo,
7767330f729Sjoerg                                SwiftWriteLM14CyNo, SwiftWriteLM14CyNo,
7777330f729Sjoerg                                SwiftWriteLM14CyNo,  SwiftWriteLM14CyNo,
7787330f729Sjoerg                                SwiftWriteLM14CyNo,  SwiftWriteLM14CyNo,
7797330f729Sjoerg                                SwiftWriteP01OneCycle, SwiftVLDMPerm7]>,
7807330f729Sjoerg    SchedVar<SwiftLMAddr15Pred,[SwiftWriteLM9Cy, SwiftWriteLM10Cy,
7817330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM14Cy,
7827330f729Sjoerg                                SwiftWriteLM17Cy, SwiftWriteLM18CyNo,
7837330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteLM22CyNo,
7847330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteLM22CyNo,
7857330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteLM22CyNo,
7867330f729Sjoerg                                SwiftWriteLM21CyNo, SwiftWriteLM22CyNo,
7877330f729Sjoerg                                SwiftWriteLM25CyNo, SwiftWriteP01OneCycle,
7887330f729Sjoerg                                SwiftVLDMPerm9]>,
7897330f729Sjoerg    // Load of 4 Q registers.
7907330f729Sjoerg    SchedVar<SwiftLMAddr16Pred,[SwiftWriteLM7Cy, SwiftWriteLM10Cy,
7917330f729Sjoerg                                SwiftWriteLM11Cy, SwiftWriteLM14Cy,
7927330f729Sjoerg                                SwiftWriteLM15Cy, SwiftWriteLM18CyNo,
7937330f729Sjoerg                                SwiftWriteLM19CyNo, SwiftWriteLM22CyNo,
7947330f729Sjoerg                                SwiftWriteLM19CyNo, SwiftWriteLM22CyNo,
7957330f729Sjoerg                                SwiftWriteLM19CyNo, SwiftWriteLM22CyNo,
7967330f729Sjoerg                                SwiftWriteLM19CyNo, SwiftWriteLM22CyNo,
7977330f729Sjoerg                                SwiftWriteLM19CyNo, SwiftWriteLM22CyNo,
7987330f729Sjoerg                                SwiftWriteP01OneCycle, SwiftVLDMPerm4]>,
7997330f729Sjoerg    // Unknow number of registers, just use resources for two registers.
8007330f729Sjoerg    SchedVar<NoSchedPred,      [SwiftWriteLM7Cy, SwiftWriteLM8Cy,
8017330f729Sjoerg                                SwiftWriteLM13Cy, SwiftWriteLM13CyNo,
8027330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8037330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8047330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8057330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8067330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8077330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8087330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8097330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8107330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8117330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8127330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8137330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8147330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8157330f729Sjoerg                                SwiftWriteLM13CyNo, SwiftWriteLM13CyNo,
8167330f729Sjoerg                                SwiftWriteP01OneCycle,  SwiftVLDMPerm2]>
8177330f729Sjoerg  ]> { let Variadic = 1; }
8187330f729Sjoerg
8197330f729Sjoerg  def : InstRW<[SwiftWriteVLDM], (instregex "VLDM[SD](IA|DB)$")>;
8207330f729Sjoerg
8217330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle2x, SwiftWriteVLDM],
8227330f729Sjoerg        (instregex "VLDM[SD](IA|DB)_UPD$")>;
8237330f729Sjoerg
8247330f729Sjoerg  def SwiftWriteVSTM : SchedWriteVariant<[
8257330f729Sjoerg    // One S register.
8267330f729Sjoerg    SchedVar<SwiftLMAddr1Pred, [SwiftWriteSTM1]>,
8277330f729Sjoerg    // One D register.
8287330f729Sjoerg    SchedVar<SwiftLMAddr2Pred, [SwiftWriteSTM1]>,
8297330f729Sjoerg    // Three S registers.
8307330f729Sjoerg    SchedVar<SwiftLMAddr3Pred, [SwiftWriteSTM4]>,
8317330f729Sjoerg    // Assume one Q register.
8327330f729Sjoerg    SchedVar<SwiftLMAddr4Pred, [SwiftWriteSTM1]>,
8337330f729Sjoerg    SchedVar<SwiftLMAddr5Pred, [SwiftWriteSTM6]>,
8347330f729Sjoerg    // Assume three D registers.
8357330f729Sjoerg    SchedVar<SwiftLMAddr6Pred, [SwiftWriteSTM4]>,
8367330f729Sjoerg    SchedVar<SwiftLMAddr7Pred, [SwiftWriteSTM8]>,
8377330f729Sjoerg    // Assume two Q registers.
8387330f729Sjoerg    SchedVar<SwiftLMAddr8Pred, [SwiftWriteSTM3]>,
8397330f729Sjoerg    SchedVar<SwiftLMAddr9Pred, [SwiftWriteSTM10]>,
8407330f729Sjoerg    // Assume 5 D registers.
8417330f729Sjoerg    SchedVar<SwiftLMAddr10Pred, [SwiftWriteSTM6]>,
8427330f729Sjoerg    SchedVar<SwiftLMAddr11Pred, [SwiftWriteSTM12]>,
8437330f729Sjoerg    // Assume three Q registers.
8447330f729Sjoerg    SchedVar<SwiftLMAddr12Pred, [SwiftWriteSTM4]>,
8457330f729Sjoerg    SchedVar<SwiftLMAddr13Pred, [SwiftWriteSTM14]>,
8467330f729Sjoerg    // Assume 7 D registers.
8477330f729Sjoerg    SchedVar<SwiftLMAddr14Pred, [SwiftWriteSTM8]>,
8487330f729Sjoerg    SchedVar<SwiftLMAddr15Pred, [SwiftWriteSTM16]>,
8497330f729Sjoerg    // Assume four Q registers.
8507330f729Sjoerg    SchedVar<SwiftLMAddr16Pred, [SwiftWriteSTM5]>,
8517330f729Sjoerg    // Asumme two Q registers.
8527330f729Sjoerg    SchedVar<NoSchedPred, [SwiftWriteSTM3]>
8537330f729Sjoerg  ]> { let Variadic = 1; }
8547330f729Sjoerg
8557330f729Sjoerg  def : InstRW<[SwiftWriteVSTM], (instregex "VSTM[SD](IA|DB)$")>;
8567330f729Sjoerg
8577330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle2x, SwiftWriteVSTM],
8587330f729Sjoerg        (instregex "VSTM[SD](IA|DB)_UPD")>;
8597330f729Sjoerg
8607330f729Sjoerg  // 4.2.43 Advanced SIMD, Element or Structure Load and Store
8617330f729Sjoerg  def SwiftWrite2xP2FourCy : SchedWriteRes<[SwiftUnitP2]> {
8627330f729Sjoerg      let Latency = 4;
8637330f729Sjoerg      let ResourceCycles = [2];
8647330f729Sjoerg  }
8657330f729Sjoerg  def SwiftWrite3xP2FourCy : SchedWriteRes<[SwiftUnitP2]> {
8667330f729Sjoerg      let Latency = 4;
8677330f729Sjoerg      let ResourceCycles = [3];
8687330f729Sjoerg  }
8697330f729Sjoerg  foreach Num = 1-2 in {
8707330f729Sjoerg    def SwiftExt#Num#xP0 : SchedWriteRes<[SwiftUnitP0]> {
8717330f729Sjoerg      let Latency = 0;
8727330f729Sjoerg      let NumMicroOps = Num;
8737330f729Sjoerg      let ResourceCycles = [Num];
8747330f729Sjoerg    }
8757330f729Sjoerg  }
8767330f729Sjoerg  // VLDx
8777330f729Sjoerg  // Multiple structures.
8787330f729Sjoerg  // Single element structure loads.
8797330f729Sjoerg  // We assume aligned.
8807330f729Sjoerg  // Single/two register.
8817330f729Sjoerg  def : InstRW<[SwiftWriteLM4Cy], (instregex "VLD1(d|q)(8|16|32|64)$")>;
8827330f729Sjoerg  def : InstRW<[SwiftWriteLM4Cy, SwiftWriteP01OneCycle],
8837330f729Sjoerg        (instregex "VLD1(d|q)(8|16|32|64)wb")>;
8847330f729Sjoerg  // Three register.
8857330f729Sjoerg  def : InstRW<[SwiftWrite3xP2FourCy],
8867330f729Sjoerg        (instregex "VLD1(d|q)(8|16|32|64)T$", "VLD1d64TPseudo")>;
8877330f729Sjoerg  def : InstRW<[SwiftWrite3xP2FourCy, SwiftWriteP01OneCycle],
8887330f729Sjoerg        (instregex "VLD1(d|q)(8|16|32|64)Twb")>;
8897330f729Sjoerg  /// Four Register.
8907330f729Sjoerg  def : InstRW<[SwiftWrite2xP2FourCy],
8917330f729Sjoerg        (instregex "VLD1(d|q)(8|16|32|64)Q$", "VLD1d64QPseudo")>;
8927330f729Sjoerg  def : InstRW<[SwiftWrite2xP2FourCy, SwiftWriteP01OneCycle],
8937330f729Sjoerg        (instregex "VLD1(d|q)(8|16|32|64)Qwb")>;
8947330f729Sjoerg  // Two element structure loads.
8957330f729Sjoerg  // Two/four register.
8967330f729Sjoerg  def : InstRW<[SwiftWriteLM9Cy, SwiftExt2xP0, SwiftVLDMPerm2],
8977330f729Sjoerg        (instregex "VLD2(d|q|b)(8|16|32)$", "VLD2q(8|16|32)Pseudo$")>;
8987330f729Sjoerg  def : InstRW<[SwiftWriteLM9Cy, SwiftWriteP01OneCycle, SwiftExt2xP0,
8997330f729Sjoerg                SwiftVLDMPerm2],
9007330f729Sjoerg        (instregex "VLD2(d|q|b)(8|16|32)wb", "VLD2q(8|16|32)PseudoWB")>;
9017330f729Sjoerg  // Three element structure.
9027330f729Sjoerg  def : InstRW<[SwiftWriteLM9Cy, SwiftWriteLM9CyNo, SwiftWriteLM9CyNo,
9037330f729Sjoerg                SwiftVLDMPerm3, SwiftWrite3xP2FourCy],
9047330f729Sjoerg        (instregex "VLD3(d|q)(8|16|32)$")>;
9057330f729Sjoerg  def : InstRW<[SwiftWriteLM9Cy, SwiftVLDMPerm3, SwiftWrite3xP2FourCy],
9067330f729Sjoerg        (instregex "VLD3(d|q)(8|16|32)(oddP|P)seudo$")>;
9077330f729Sjoerg
9087330f729Sjoerg  def : InstRW<[SwiftWriteLM9Cy, SwiftWriteLM9CyNo, SwiftWriteLM9CyNo,
9097330f729Sjoerg                SwiftWriteP01OneCycle, SwiftVLDMPerm3, SwiftWrite3xP2FourCy],
9107330f729Sjoerg        (instregex "VLD3(d|q)(8|16|32)_UPD$")>;
9117330f729Sjoerg  def : InstRW<[SwiftWriteLM9Cy, SwiftWriteP01OneCycle, SwiftVLDMPerm3,
9127330f729Sjoerg                SwiftWrite3xP2FourCy],
9137330f729Sjoerg        (instregex "VLD3(d|q)(8|16|32)(oddP|P)seudo_UPD")>;
9147330f729Sjoerg  // Four element structure loads.
9157330f729Sjoerg  def : InstRW<[SwiftWriteLM11Cy, SwiftWriteLM11Cy, SwiftWriteLM11Cy,
9167330f729Sjoerg                SwiftWriteLM11Cy, SwiftExt2xP0, SwiftVLDMPerm4,
9177330f729Sjoerg                SwiftWrite3xP2FourCy],
9187330f729Sjoerg        (instregex "VLD4(d|q)(8|16|32)$")>;
9197330f729Sjoerg  def : InstRW<[SwiftWriteLM11Cy,  SwiftExt2xP0, SwiftVLDMPerm4,
9207330f729Sjoerg                SwiftWrite3xP2FourCy],
9217330f729Sjoerg        (instregex "VLD4(d|q)(8|16|32)(oddP|P)seudo$")>;
9227330f729Sjoerg  def : InstRW<[SwiftWriteLM11Cy, SwiftWriteLM11Cy, SwiftWriteLM11Cy,
9237330f729Sjoerg                SwiftWriteLM11Cy, SwiftWriteP01OneCycle, SwiftExt2xP0,
9247330f729Sjoerg                SwiftVLDMPerm4, SwiftWrite3xP2FourCy],
9257330f729Sjoerg        (instregex "VLD4(d|q)(8|16|32)_UPD")>;
9267330f729Sjoerg  def : InstRW<[SwiftWriteLM11Cy, SwiftWriteP01OneCycle, SwiftExt2xP0,
9277330f729Sjoerg                SwiftVLDMPerm4, SwiftWrite3xP2FourCy],
9287330f729Sjoerg        (instregex  "VLD4(d|q)(8|16|32)(oddP|P)seudo_UPD")>;
9297330f729Sjoerg
9307330f729Sjoerg  // Single all/lane loads.
9317330f729Sjoerg  // One element structure.
9327330f729Sjoerg  def : InstRW<[SwiftWriteLM6Cy, SwiftVLDMPerm2],
9337330f729Sjoerg        (instregex "VLD1(LN|DUP)(d|q)(8|16|32)$", "VLD1(LN|DUP)(d|q)(8|16|32)Pseudo$")>;
9347330f729Sjoerg  def : InstRW<[SwiftWriteLM6Cy, SwiftWriteP01OneCycle, SwiftVLDMPerm2],
9357330f729Sjoerg        (instregex "VLD1(LN|DUP)(d|q)(8|16|32)(wb|_UPD)",
9367330f729Sjoerg                  "VLD1LNq(8|16|32)Pseudo_UPD")>;
9377330f729Sjoerg  // Two element structure.
9387330f729Sjoerg  def : InstRW<[SwiftWriteLM6Cy, SwiftWriteLM6Cy, SwiftExt1xP0, SwiftVLDMPerm2],
9397330f729Sjoerg        (instregex "VLD2(DUP|LN)(d|q)(8|16|32|8x2|16x2|32x2)$",
9407330f729Sjoerg                   "VLD2LN(d|q)(8|16|32)Pseudo$")>;
9417330f729Sjoerg  def : InstRW<[SwiftWriteLM6Cy, SwiftWriteLM6Cy, SwiftWriteP01OneCycle,
9427330f729Sjoerg                SwiftExt1xP0, SwiftVLDMPerm2],
9437330f729Sjoerg        (instregex "VLD2LN(d|q)(8|16|32)_UPD$")>;
9447330f729Sjoerg  def : InstRW<[SwiftWriteLM6Cy, SwiftWriteP01OneCycle, SwiftWriteLM6Cy,
9457330f729Sjoerg                SwiftExt1xP0, SwiftVLDMPerm2],
9467330f729Sjoerg        (instregex "VLD2DUPd(8|16|32|8x2|16x2|32x2)wb")>;
9477330f729Sjoerg  def : InstRW<[SwiftWriteLM6Cy, SwiftWriteP01OneCycle, SwiftWriteLM6Cy,
9487330f729Sjoerg                SwiftExt1xP0, SwiftVLDMPerm2],
9497330f729Sjoerg        (instregex "VLD2LN(d|q)(8|16|32)Pseudo_UPD")>;
9507330f729Sjoerg  // Three element structure.
9517330f729Sjoerg  def : InstRW<[SwiftWriteLM7Cy, SwiftWriteLM8Cy, SwiftWriteLM8Cy, SwiftExt1xP0,
9527330f729Sjoerg                SwiftVLDMPerm3],
9537330f729Sjoerg        (instregex "VLD3(DUP|LN)(d|q)(8|16|32)$",
9547330f729Sjoerg                   "VLD3(LN|DUP)(d|q)(8|16|32)Pseudo$")>;
9557330f729Sjoerg  def : InstRW<[SwiftWriteLM7Cy, SwiftWriteLM8Cy, SwiftWriteLM8Cy,
9567330f729Sjoerg                SwiftWriteP01OneCycle, SwiftExt1xP0, SwiftVLDMPerm3],
9577330f729Sjoerg        (instregex "VLD3(LN|DUP)(d|q)(8|16|32)_UPD")>;
9587330f729Sjoerg  def : InstRW<[SwiftWriteLM7Cy, SwiftWriteP01OneCycle, SwiftWriteLM8Cy,
9597330f729Sjoerg                SwiftWriteLM8Cy, SwiftExt1xP0, SwiftVLDMPerm3],
9607330f729Sjoerg        (instregex "VLD3(LN|DUP)(d|q)(8|16|32)Pseudo_UPD")>;
961*82d56013Sjoerg  // Four element structure.
9627330f729Sjoerg  def : InstRW<[SwiftWriteLM8Cy, SwiftWriteLM9Cy, SwiftWriteLM10CyNo,
9637330f729Sjoerg                SwiftWriteLM10CyNo, SwiftExt1xP0, SwiftVLDMPerm5],
9647330f729Sjoerg        (instregex "VLD4(LN|DUP)(d|q)(8|16|32)$",
9657330f729Sjoerg                   "VLD4(LN|DUP)(d|q)(8|16|32)Pseudo$")>;
9667330f729Sjoerg  def : InstRW<[SwiftWriteLM8Cy, SwiftWriteLM9Cy, SwiftWriteLM10CyNo,
9677330f729Sjoerg                SwiftWriteLM10CyNo, SwiftWriteP01OneCycle, SwiftExt1xP0,
9687330f729Sjoerg                SwiftVLDMPerm5],
9697330f729Sjoerg        (instregex "VLD4(DUP|LN)(d|q)(8|16|32)_UPD")>;
9707330f729Sjoerg  def : InstRW<[SwiftWriteLM8Cy, SwiftWriteP01OneCycle, SwiftWriteLM9Cy,
9717330f729Sjoerg                SwiftWriteLM10CyNo, SwiftWriteLM10CyNo, SwiftExt1xP0,
9727330f729Sjoerg                SwiftVLDMPerm5],
9737330f729Sjoerg        (instregex "VLD4(DUP|LN)(d|q)(8|16|32)Pseudo_UPD")>;
9747330f729Sjoerg  // VSTx
9757330f729Sjoerg  // Multiple structures.
9767330f729Sjoerg  // Single element structure store.
9777330f729Sjoerg  def : InstRW<[SwiftWrite1xP2], (instregex "VST1d(8|16|32|64)$")>;
9787330f729Sjoerg  def : InstRW<[SwiftWrite2xP2], (instregex "VST1q(8|16|32|64)$")>;
9797330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite1xP2],
9807330f729Sjoerg        (instregex "VST1d(8|16|32|64)wb")>;
9817330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite2xP2],
9827330f729Sjoerg        (instregex "VST1q(8|16|32|64)wb")>;
9837330f729Sjoerg  def : InstRW<[SwiftWrite3xP2],
9847330f729Sjoerg        (instregex "VST1d(8|16|32|64)T$", "VST1d64TPseudo$")>;
9857330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite3xP2],
9867330f729Sjoerg        (instregex "VST1d(8|16|32|64)Twb", "VST1d64TPseudoWB")>;
9877330f729Sjoerg  def : InstRW<[SwiftWrite4xP2],
9887330f729Sjoerg        (instregex "VST1d(8|16|32|64)(Q|QPseudo)$")>;
9897330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite4xP2],
9907330f729Sjoerg        (instregex "VST1d(8|16|32|64)(Qwb|QPseudoWB)")>;
9917330f729Sjoerg  // Two element structure store.
9927330f729Sjoerg  def : InstRW<[SwiftWrite1xP2, SwiftVLDMPerm1],
9937330f729Sjoerg        (instregex "VST2(d|b)(8|16|32)$")>;
9947330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite1xP2, SwiftVLDMPerm1],
9957330f729Sjoerg        (instregex "VST2(b|d)(8|16|32)wb")>;
9967330f729Sjoerg  def : InstRW<[SwiftWrite2xP2, SwiftVLDMPerm2],
9977330f729Sjoerg        (instregex "VST2q(8|16|32)$", "VST2q(8|16|32)Pseudo$")>;
9987330f729Sjoerg  def : InstRW<[SwiftWrite2xP2, SwiftVLDMPerm2],
9997330f729Sjoerg        (instregex "VST2q(8|16|32)wb", "VST2q(8|16|32)PseudoWB")>;
10007330f729Sjoerg  // Three element structure store.
10017330f729Sjoerg  def : InstRW<[SwiftWrite4xP2, SwiftVLDMPerm2],
10027330f729Sjoerg        (instregex "VST3(d|q)(8|16|32)$", "VST3(d|q)(8|16|32)(oddP|P)seudo$")>;
10037330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite4xP2, SwiftVLDMPerm2],
10047330f729Sjoerg        (instregex "VST3(d|q)(8|16|32)_UPD",
10057330f729Sjoerg                   "VST3(d|q)(8|16|32)(oddP|P)seudo_UPD$")>;
10067330f729Sjoerg  // Four element structure store.
10077330f729Sjoerg  def : InstRW<[SwiftWrite4xP2, SwiftVLDMPerm2],
10087330f729Sjoerg        (instregex "VST4(d|q)(8|16|32)$", "VST4(d|q)(8|16|32)(oddP|P)seudo$")>;
10097330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite4xP2, SwiftVLDMPerm4],
10107330f729Sjoerg        (instregex "VST4(d|q)(8|16|32)_UPD",
10117330f729Sjoerg                   "VST4(d|q)(8|16|32)(oddP|P)seudo_UPD$")>;
10127330f729Sjoerg  // Single/all lane store.
10137330f729Sjoerg  // One element structure.
10147330f729Sjoerg  def : InstRW<[SwiftWrite1xP2, SwiftVLDMPerm1],
10157330f729Sjoerg        (instregex "VST1LNd(8|16|32)$", "VST1LNq(8|16|32)Pseudo$")>;
10167330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite1xP2, SwiftVLDMPerm1],
10177330f729Sjoerg        (instregex "VST1LNd(8|16|32)_UPD", "VST1LNq(8|16|32)Pseudo_UPD")>;
10187330f729Sjoerg  // Two element structure.
10197330f729Sjoerg  def : InstRW<[SwiftWrite1xP2, SwiftVLDMPerm2],
10207330f729Sjoerg        (instregex "VST2LN(d|q)(8|16|32)$", "VST2LN(d|q)(8|16|32)Pseudo$")>;
10217330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite1xP2, SwiftVLDMPerm2],
10227330f729Sjoerg        (instregex "VST2LN(d|q)(8|16|32)_UPD",
10237330f729Sjoerg                   "VST2LN(d|q)(8|16|32)Pseudo_UPD")>;
10247330f729Sjoerg  // Three element structure.
10257330f729Sjoerg  def : InstRW<[SwiftWrite4xP2, SwiftVLDMPerm2],
10267330f729Sjoerg        (instregex "VST3LN(d|q)(8|16|32)$", "VST3LN(d|q)(8|16|32)Pseudo$")>;
10277330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite4xP2, SwiftVLDMPerm2],
10287330f729Sjoerg        (instregex "VST3LN(d|q)(8|16|32)_UPD",
10297330f729Sjoerg                   "VST3LN(d|q)(8|16|32)Pseudo_UPD")>;
10307330f729Sjoerg  // Four element structure.
10317330f729Sjoerg  def : InstRW<[SwiftWrite2xP2, SwiftVLDMPerm2],
10327330f729Sjoerg        (instregex "VST4LN(d|q)(8|16|32)$", "VST4LN(d|q)(8|16|32)Pseudo$")>;
10337330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle, SwiftWrite2xP2, SwiftVLDMPerm2],
10347330f729Sjoerg        (instregex "VST4LN(d|q)(8|16|32)_UPD",
10357330f729Sjoerg                   "VST4LN(d|q)(8|16|32)Pseudo_UPD")>;
10367330f729Sjoerg
10377330f729Sjoerg  // 4.2.44 VFP, Divide and Square Root
10387330f729Sjoerg  def SwiftDiv17 : SchedWriteRes<[SwiftUnitP0, SwiftUnitDiv]> {
10397330f729Sjoerg    let NumMicroOps = 1;
10407330f729Sjoerg    let Latency = 17;
10417330f729Sjoerg    let ResourceCycles = [1, 15];
10427330f729Sjoerg  }
10437330f729Sjoerg  def SwiftDiv32 : SchedWriteRes<[SwiftUnitP0, SwiftUnitDiv]> {
10447330f729Sjoerg    let NumMicroOps = 1;
10457330f729Sjoerg    let Latency = 32;
10467330f729Sjoerg    let ResourceCycles = [1, 30];
10477330f729Sjoerg  }
10487330f729Sjoerg  def : InstRW<[SwiftDiv17], (instregex "VDIVS", "VSQRTS")>;
10497330f729Sjoerg  def : InstRW<[SwiftDiv32], (instregex "VDIVD", "VSQRTD")>;
10507330f729Sjoerg
10517330f729Sjoerg  // ===---------------------------------------------------------------------===//
10527330f729Sjoerg  // Floating-point. Map target defined SchedReadWrite to processor specific ones
10537330f729Sjoerg  //
10547330f729Sjoerg  def : SchedAlias<WriteFPCVT, SwiftWriteP1FourCycle>;
10557330f729Sjoerg  def : SchedAlias<WriteFPMOV, SwiftWriteP2ThreeCycle>;
10567330f729Sjoerg
10577330f729Sjoerg  def : SchedAlias<WriteFPALU32, SwiftWriteP0FourCycle>;
10587330f729Sjoerg  def : SchedAlias<WriteFPALU64, SwiftWriteP0SixCycle>;
10597330f729Sjoerg
10607330f729Sjoerg  def : SchedAlias<WriteFPMUL32, SwiftWriteP1FourCycle>;
10617330f729Sjoerg  def : SchedAlias<WriteFPMUL64, SwiftWriteP1SixCycle>;
10627330f729Sjoerg
10637330f729Sjoerg  def : SchedAlias<WriteFPMAC32, SwiftWriteP1FourCycle>;
10647330f729Sjoerg  def : SchedAlias<WriteFPMAC64, SwiftWriteP1FourCycle>;
10657330f729Sjoerg
10667330f729Sjoerg  def : SchedAlias<WriteFPDIV32, SwiftDiv17>;
10677330f729Sjoerg  def : SchedAlias<WriteFPSQRT32, SwiftDiv17>;
10687330f729Sjoerg
10697330f729Sjoerg  def : SchedAlias<WriteFPDIV64, SwiftDiv32>;
10707330f729Sjoerg  def : SchedAlias<WriteFPSQRT64, SwiftDiv32>;
10717330f729Sjoerg
10727330f729Sjoerg  def : ReadAdvance<ReadFPMUL, 0>;
10737330f729Sjoerg  def : ReadAdvance<ReadFPMAC, 0>;
10747330f729Sjoerg
10757330f729Sjoerg  // Overriden via InstRW for this processor.
10767330f729Sjoerg  def : WriteRes<WriteVLD1, []>;
10777330f729Sjoerg  def : WriteRes<WriteVLD2, []>;
10787330f729Sjoerg  def : WriteRes<WriteVLD3, []>;
10797330f729Sjoerg  def : WriteRes<WriteVLD4, []>;
10807330f729Sjoerg  def : WriteRes<WriteVST1, []>;
10817330f729Sjoerg  def : WriteRes<WriteVST2, []>;
10827330f729Sjoerg  def : WriteRes<WriteVST3, []>;
10837330f729Sjoerg  def : WriteRes<WriteVST4, []>;
10847330f729Sjoerg
10857330f729Sjoerg  // Not specified.
10867330f729Sjoerg  def : InstRW<[SwiftWriteP01OneCycle2x], (instregex "ABS")>;
10877330f729Sjoerg  // Preload.
10887330f729Sjoerg  def : WriteRes<WritePreLd, [SwiftUnitP2]> { let Latency = 0;
10897330f729Sjoerg    let ResourceCycles = [0];
10907330f729Sjoerg  }
10917330f729Sjoerg
10927330f729Sjoerg}
1093