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