10b57cec5SDimitry Andric//===-- PPC.td - Describe the PowerPC Target Machine -------*- tablegen -*-===// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// 90b57cec5SDimitry Andric// This is the top level entry point for the PowerPC target. 100b57cec5SDimitry Andric// 110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric// Get the target-independent interfaces which we are implementing. 140b57cec5SDimitry Andric// 150b57cec5SDimitry Andricinclude "llvm/Target/Target.td" 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 180b57cec5SDimitry Andric// PowerPC Subtarget features. 190b57cec5SDimitry Andric// 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 220b57cec5SDimitry Andric// CPU Directives // 230b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 240b57cec5SDimitry Andric 25480093f4SDimitry Andricdef Directive440 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_440", "">; 26480093f4SDimitry Andricdef Directive601 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_601", "">; 27480093f4SDimitry Andricdef Directive602 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_602", "">; 28480093f4SDimitry Andricdef Directive603 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_603", "">; 29480093f4SDimitry Andricdef Directive604 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_603", "">; 30480093f4SDimitry Andricdef Directive620 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_603", "">; 31480093f4SDimitry Andricdef Directive7400: SubtargetFeature<"", "CPUDirective", "PPC::DIR_7400", "">; 32480093f4SDimitry Andricdef Directive750 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_750", "">; 33480093f4SDimitry Andricdef Directive970 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_970", "">; 34480093f4SDimitry Andricdef Directive32 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_32", "">; 35480093f4SDimitry Andricdef Directive64 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_64", "">; 36480093f4SDimitry Andricdef DirectiveA2 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_A2", "">; 37480093f4SDimitry Andricdef DirectiveE500 : SubtargetFeature<"", "CPUDirective", 380b57cec5SDimitry Andric "PPC::DIR_E500", "">; 39480093f4SDimitry Andricdef DirectiveE500mc : SubtargetFeature<"", "CPUDirective", 400b57cec5SDimitry Andric "PPC::DIR_E500mc", "">; 41480093f4SDimitry Andricdef DirectiveE5500 : SubtargetFeature<"", "CPUDirective", 420b57cec5SDimitry Andric "PPC::DIR_E5500", "">; 43480093f4SDimitry Andricdef DirectivePwr3: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR3", "">; 44480093f4SDimitry Andricdef DirectivePwr4: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR4", "">; 45480093f4SDimitry Andricdef DirectivePwr5: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR5", "">; 460b57cec5SDimitry Andricdef DirectivePwr5x 47480093f4SDimitry Andric : SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR5X", "">; 48480093f4SDimitry Andricdef DirectivePwr6: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR6", "">; 490b57cec5SDimitry Andricdef DirectivePwr6x 50480093f4SDimitry Andric : SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR6X", "">; 51480093f4SDimitry Andricdef DirectivePwr7: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR7", "">; 52480093f4SDimitry Andricdef DirectivePwr8: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR8", "">; 53480093f4SDimitry Andricdef DirectivePwr9: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR9", "">; 545ffd83dbSDimitry Andricdef DirectivePwr10: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR10", "">; 55480093f4SDimitry Andricdef DirectivePwrFuture 56480093f4SDimitry Andric : SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR_FUTURE", "">; 570b57cec5SDimitry Andric 58bdd1243dSDimitry Andric// Specifies that the selected CPU supports 64-bit instructions, regardless of 59bdd1243dSDimitry Andric// whether we are in 32-bit or 64-bit mode. 600b57cec5SDimitry Andricdef Feature64Bit : SubtargetFeature<"64bit","Has64BitSupport", "true", 610b57cec5SDimitry Andric "Enable 64-bit instructions">; 62e8d8bef9SDimitry Andricdef AIXOS: SubtargetFeature<"aix", "IsAIX", "true", "AIX OS">; 63e8d8bef9SDimitry Andricdef FeatureModernAIXAs 64e8d8bef9SDimitry Andric : SubtargetFeature<"modern-aix-as", "HasModernAIXAs", "true", 65e8d8bef9SDimitry Andric "AIX system assembler is modern enough to support new mnes">; 660b57cec5SDimitry Andricdef FeatureHardFloat : SubtargetFeature<"hard-float", "HasHardFloat", "true", 670b57cec5SDimitry Andric "Enable floating-point instructions">; 68bdd1243dSDimitry Andric 69bdd1243dSDimitry Andric// Specifies that we are in 64-bit mode or that we should use 64-bit registers 70bdd1243dSDimitry Andric// in 32-bit mode when possible. Requires Feature64Bit to be enabled. 710b57cec5SDimitry Andricdef Feature64BitRegs : SubtargetFeature<"64bitregs","Use64BitRegs", "true", 720b57cec5SDimitry Andric "Enable 64-bit registers usage for ppc32 [beta]">; 73bdd1243dSDimitry Andric 74bdd1243dSDimitry Andric// Specify if we should store and manipulate i1 values in the individual 75bdd1243dSDimitry Andric// condition register bits. 760b57cec5SDimitry Andricdef FeatureCRBits : SubtargetFeature<"crbits", "UseCRBits", "true", 770b57cec5SDimitry Andric "Use condition-register bits individually">; 780b57cec5SDimitry Andricdef FeatureFPU : SubtargetFeature<"fpu","HasFPU","true", 790b57cec5SDimitry Andric "Enable classic FPU instructions", 800b57cec5SDimitry Andric [FeatureHardFloat]>; 810b57cec5SDimitry Andricdef FeatureAltivec : SubtargetFeature<"altivec","HasAltivec", "true", 820b57cec5SDimitry Andric "Enable Altivec instructions", 830b57cec5SDimitry Andric [FeatureFPU]>; 840b57cec5SDimitry Andricdef FeatureSPE : SubtargetFeature<"spe","HasSPE", "true", 850b57cec5SDimitry Andric "Enable SPE instructions", 860b57cec5SDimitry Andric [FeatureHardFloat]>; 87e8d8bef9SDimitry Andricdef FeatureEFPU2 : SubtargetFeature<"efpu2", "HasEFPU2", "true", 88e8d8bef9SDimitry Andric "Enable Embedded Floating-Point APU 2 instructions", 89e8d8bef9SDimitry Andric [FeatureSPE]>; 900b57cec5SDimitry Andricdef FeatureMFOCRF : SubtargetFeature<"mfocrf","HasMFOCRF", "true", 910b57cec5SDimitry Andric "Enable the MFOCRF instruction">; 920b57cec5SDimitry Andricdef FeatureFSqrt : SubtargetFeature<"fsqrt","HasFSQRT", "true", 930b57cec5SDimitry Andric "Enable the fsqrt instruction", 940b57cec5SDimitry Andric [FeatureFPU]>; 950b57cec5SDimitry Andricdef FeatureFCPSGN : SubtargetFeature<"fcpsgn", "HasFCPSGN", "true", 960b57cec5SDimitry Andric "Enable the fcpsgn instruction", 970b57cec5SDimitry Andric [FeatureFPU]>; 980b57cec5SDimitry Andricdef FeatureFRE : SubtargetFeature<"fre", "HasFRE", "true", 990b57cec5SDimitry Andric "Enable the fre instruction", 1000b57cec5SDimitry Andric [FeatureFPU]>; 1010b57cec5SDimitry Andricdef FeatureFRES : SubtargetFeature<"fres", "HasFRES", "true", 1020b57cec5SDimitry Andric "Enable the fres instruction", 1030b57cec5SDimitry Andric [FeatureFPU]>; 1040b57cec5SDimitry Andricdef FeatureFRSQRTE : SubtargetFeature<"frsqrte", "HasFRSQRTE", "true", 1050b57cec5SDimitry Andric "Enable the frsqrte instruction", 1060b57cec5SDimitry Andric [FeatureFPU]>; 1070b57cec5SDimitry Andricdef FeatureFRSQRTES : SubtargetFeature<"frsqrtes", "HasFRSQRTES", "true", 1080b57cec5SDimitry Andric "Enable the frsqrtes instruction", 1090b57cec5SDimitry Andric [FeatureFPU]>; 1100b57cec5SDimitry Andricdef FeatureRecipPrec : SubtargetFeature<"recipprec", "HasRecipPrec", "true", 1110b57cec5SDimitry Andric "Assume higher precision reciprocal estimates">; 1120b57cec5SDimitry Andricdef FeatureSTFIWX : SubtargetFeature<"stfiwx","HasSTFIWX", "true", 1130b57cec5SDimitry Andric "Enable the stfiwx instruction", 1140b57cec5SDimitry Andric [FeatureFPU]>; 1150b57cec5SDimitry Andricdef FeatureLFIWAX : SubtargetFeature<"lfiwax","HasLFIWAX", "true", 1160b57cec5SDimitry Andric "Enable the lfiwax instruction", 1170b57cec5SDimitry Andric [FeatureFPU]>; 1180b57cec5SDimitry Andricdef FeatureFPRND : SubtargetFeature<"fprnd", "HasFPRND", "true", 1190b57cec5SDimitry Andric "Enable the fri[mnpz] instructions", 1200b57cec5SDimitry Andric [FeatureFPU]>; 1210b57cec5SDimitry Andricdef FeatureFPCVT : SubtargetFeature<"fpcvt", "HasFPCVT", "true", 1220b57cec5SDimitry Andric "Enable fc[ft]* (unsigned and single-precision) and lfiwzx instructions", 1230b57cec5SDimitry Andric [FeatureFPU]>; 1240b57cec5SDimitry Andricdef FeatureISEL : SubtargetFeature<"isel","HasISEL", "true", 1250b57cec5SDimitry Andric "Enable the isel instruction">; 1260b57cec5SDimitry Andricdef FeatureBPERMD : SubtargetFeature<"bpermd", "HasBPERMD", "true", 1270b57cec5SDimitry Andric "Enable the bpermd instruction">; 1280b57cec5SDimitry Andricdef FeatureExtDiv : SubtargetFeature<"extdiv", "HasExtDiv", "true", 1290b57cec5SDimitry Andric "Enable extended divide instructions">; 1300b57cec5SDimitry Andricdef FeatureLDBRX : SubtargetFeature<"ldbrx","HasLDBRX", "true", 1310b57cec5SDimitry Andric "Enable the ldbrx instruction">; 1320b57cec5SDimitry Andricdef FeatureCMPB : SubtargetFeature<"cmpb", "HasCMPB", "true", 1330b57cec5SDimitry Andric "Enable the cmpb instruction">; 1340b57cec5SDimitry Andricdef FeatureICBT : SubtargetFeature<"icbt","HasICBT", "true", 1350b57cec5SDimitry Andric "Enable icbt instruction">; 1360b57cec5SDimitry Andricdef FeatureBookE : SubtargetFeature<"booke", "IsBookE", "true", 1370b57cec5SDimitry Andric "Enable Book E instructions", 1380b57cec5SDimitry Andric [FeatureICBT]>; 1390b57cec5SDimitry Andricdef FeatureMSYNC : SubtargetFeature<"msync", "HasOnlyMSYNC", "true", 1400b57cec5SDimitry Andric "Has only the msync instruction instead of sync", 1410b57cec5SDimitry Andric [FeatureBookE]>; 1420b57cec5SDimitry Andricdef FeatureE500 : SubtargetFeature<"e500", "IsE500", "true", 1430b57cec5SDimitry Andric "Enable E500/E500mc instructions">; 144bdd1243dSDimitry Andricdef FeatureSecurePlt : SubtargetFeature<"secure-plt","IsSecurePlt", "true", 1450b57cec5SDimitry Andric "Enable secure plt mode">; 1460b57cec5SDimitry Andricdef FeaturePPC4xx : SubtargetFeature<"ppc4xx", "IsPPC4xx", "true", 1470b57cec5SDimitry Andric "Enable PPC 4xx instructions">; 1480b57cec5SDimitry Andricdef FeaturePPC6xx : SubtargetFeature<"ppc6xx", "IsPPC6xx", "true", 1490b57cec5SDimitry Andric "Enable PPC 6xx instructions">; 1500b57cec5SDimitry Andricdef FeatureVSX : SubtargetFeature<"vsx","HasVSX", "true", 1510b57cec5SDimitry Andric "Enable VSX instructions", 1520b57cec5SDimitry Andric [FeatureAltivec]>; 1530b57cec5SDimitry Andricdef FeatureTwoConstNR : 1540b57cec5SDimitry Andric SubtargetFeature<"two-const-nr", "NeedsTwoConstNR", "true", 1550b57cec5SDimitry Andric "Requires two constant Newton-Raphson computation">; 1560b57cec5SDimitry Andricdef FeatureP8Altivec : SubtargetFeature<"power8-altivec", "HasP8Altivec", "true", 1570b57cec5SDimitry Andric "Enable POWER8 Altivec instructions", 1580b57cec5SDimitry Andric [FeatureAltivec]>; 1590b57cec5SDimitry Andricdef FeatureP8Crypto : SubtargetFeature<"crypto", "HasP8Crypto", "true", 1600b57cec5SDimitry Andric "Enable POWER8 Crypto instructions", 1610b57cec5SDimitry Andric [FeatureP8Altivec]>; 1620b57cec5SDimitry Andricdef FeatureP8Vector : SubtargetFeature<"power8-vector", "HasP8Vector", "true", 1630b57cec5SDimitry Andric "Enable POWER8 vector instructions", 1640b57cec5SDimitry Andric [FeatureVSX, FeatureP8Altivec]>; 1650b57cec5SDimitry Andricdef FeatureDirectMove : 1660b57cec5SDimitry Andric SubtargetFeature<"direct-move", "HasDirectMove", "true", 1670b57cec5SDimitry Andric "Enable Power8 direct move instructions", 1680b57cec5SDimitry Andric [FeatureVSX]>; 1690b57cec5SDimitry Andricdef FeaturePartwordAtomic : SubtargetFeature<"partword-atomics", 1700b57cec5SDimitry Andric "HasPartwordAtomics", "true", 1710b57cec5SDimitry Andric "Enable l[bh]arx and st[bh]cx.">; 172fe6060f1SDimitry Andricdef FeatureQuadwordAtomic : SubtargetFeature<"quadword-atomics", 173fe6060f1SDimitry Andric "HasQuadwordAtomics", "true", 174fe6060f1SDimitry Andric "Enable lqarx and stqcx.">; 1750b57cec5SDimitry Andricdef FeatureInvariantFunctionDescriptors : 1760b57cec5SDimitry Andric SubtargetFeature<"invariant-function-descriptors", 1770b57cec5SDimitry Andric "HasInvariantFunctionDescriptors", "true", 1780b57cec5SDimitry Andric "Assume function descriptors are invariant">; 1790b57cec5SDimitry Andricdef FeatureLongCall : SubtargetFeature<"longcall", "UseLongCalls", "true", 1800b57cec5SDimitry Andric "Always use indirect calls">; 1810b57cec5SDimitry Andricdef FeatureHTM : SubtargetFeature<"htm", "HasHTM", "true", 1820b57cec5SDimitry Andric "Enable Hardware Transactional Memory instructions">; 183bdd1243dSDimitry Andricdef FeatureMFTB : SubtargetFeature<"", "IsFeatureMFTB", "true", 1840b57cec5SDimitry Andric "Implement mftb using the mfspr instruction">; 1855ffd83dbSDimitry Andricdef FeatureFusion : SubtargetFeature<"fusion", "HasFusion", "true", 1865ffd83dbSDimitry Andric "Target supports instruction fusion">; 1875ffd83dbSDimitry Andricdef FeatureAddiLoadFusion : SubtargetFeature<"fuse-addi-load", 1885ffd83dbSDimitry Andric "HasAddiLoadFusion", "true", 1895ffd83dbSDimitry Andric "Power8 Addi-Load fusion", 1905ffd83dbSDimitry Andric [FeatureFusion]>; 1915ffd83dbSDimitry Andricdef FeatureAddisLoadFusion : SubtargetFeature<"fuse-addis-load", 1925ffd83dbSDimitry Andric "HasAddisLoadFusion", "true", 1935ffd83dbSDimitry Andric "Power8 Addis-Load fusion", 1945ffd83dbSDimitry Andric [FeatureFusion]>; 195e8d8bef9SDimitry Andricdef FeatureStoreFusion : SubtargetFeature<"fuse-store", "HasStoreFusion", "true", 196e8d8bef9SDimitry Andric "Target supports store clustering", 197e8d8bef9SDimitry Andric [FeatureFusion]>; 198349cc55cSDimitry Andricdef FeatureArithAddFusion : 199349cc55cSDimitry Andric SubtargetFeature<"fuse-arith-add", "HasArithAddFusion", "true", 200349cc55cSDimitry Andric "Target supports Arithmetic Operations with Add fusion", 201349cc55cSDimitry Andric [FeatureFusion]>; 202349cc55cSDimitry Andricdef FeatureAddLogicalFusion : 203349cc55cSDimitry Andric SubtargetFeature<"fuse-add-logical", "HasAddLogicalFusion", "true", 204349cc55cSDimitry Andric "Target supports Add with Logical Operations fusion", 205349cc55cSDimitry Andric [FeatureFusion]>; 206349cc55cSDimitry Andricdef FeatureLogicalAddFusion : 207349cc55cSDimitry Andric SubtargetFeature<"fuse-logical-add", "HasLogicalAddFusion", "true", 208349cc55cSDimitry Andric "Target supports Logical with Add Operations fusion", 209349cc55cSDimitry Andric [FeatureFusion]>; 210349cc55cSDimitry Andricdef FeatureLogicalFusion : 211349cc55cSDimitry Andric SubtargetFeature<"fuse-logical", "HasLogicalFusion", "true", 212349cc55cSDimitry Andric "Target supports Logical Operations fusion", 213349cc55cSDimitry Andric [FeatureFusion]>; 2144824e7fdSDimitry Andricdef FeatureSha3Fusion : 2154824e7fdSDimitry Andric SubtargetFeature<"fuse-sha3", "HasSha3Fusion", "true", 2164824e7fdSDimitry Andric "Target supports SHA3 assist fusion", 2174824e7fdSDimitry Andric [FeatureFusion]>; 2184824e7fdSDimitry Andricdef FeatureCompareFusion: 2194824e7fdSDimitry Andric SubtargetFeature<"fuse-cmp", "HasCompareFusion", "true", 2204824e7fdSDimitry Andric "Target supports Comparison Operations fusion", 2214824e7fdSDimitry Andric [FeatureFusion]>; 2224824e7fdSDimitry Andricdef FeatureWideImmFusion: 2234824e7fdSDimitry Andric SubtargetFeature<"fuse-wideimm", "HasWideImmFusion", "true", 2244824e7fdSDimitry Andric "Target supports Wide-Immediate fusion", 2254824e7fdSDimitry Andric [FeatureFusion]>; 2264824e7fdSDimitry Andricdef FeatureZeroMoveFusion: 2274824e7fdSDimitry Andric SubtargetFeature<"fuse-zeromove", "HasZeroMoveFusion", "true", 2284824e7fdSDimitry Andric "Target supports move to SPR with branch fusion", 2294824e7fdSDimitry Andric [FeatureFusion]>; 2300eae32dcSDimitry Andricdef FeatureBack2BackFusion: 2310eae32dcSDimitry Andric SubtargetFeature<"fuse-back2back", "HasBack2BackFusion", "true", 2320eae32dcSDimitry Andric "Target supports general back to back fusion", 2330eae32dcSDimitry Andric [FeatureFusion]>; 2340946e70aSDimitry Andricdef FeatureUnalignedFloats : 2350946e70aSDimitry Andric SubtargetFeature<"allow-unaligned-fp-access", "AllowsUnalignedFPAccess", 2360946e70aSDimitry Andric "true", "CPU does not trap on unaligned FP access">; 2370b57cec5SDimitry Andricdef FeaturePPCPreRASched: 2380b57cec5SDimitry Andric SubtargetFeature<"ppc-prera-sched", "UsePPCPreRASchedStrategy", "true", 2390b57cec5SDimitry Andric "Use PowerPC pre-RA scheduling strategy">; 2400b57cec5SDimitry Andricdef FeaturePPCPostRASched: 2410b57cec5SDimitry Andric SubtargetFeature<"ppc-postra-sched", "UsePPCPostRASchedStrategy", "true", 2420b57cec5SDimitry Andric "Use PowerPC post-RA scheduling strategy">; 2430b57cec5SDimitry Andricdef FeatureFloat128 : 2440b57cec5SDimitry Andric SubtargetFeature<"float128", "HasFloat128", "true", 2450b57cec5SDimitry Andric "Enable the __float128 data type for IEEE-754R Binary128.", 2460b57cec5SDimitry Andric [FeatureVSX]>; 2470b57cec5SDimitry Andricdef FeaturePOPCNTD : SubtargetFeature<"popcntd","HasPOPCNTD", 2480b57cec5SDimitry Andric "POPCNTD_Fast", 2490b57cec5SDimitry Andric "Enable the popcnt[dw] instructions">; 250e8d8bef9SDimitry Andric// Note that for the a2 processor models we should not use popcnt[dw] by 2510b57cec5SDimitry Andric// default. These processors do support the instructions, but they're 2520b57cec5SDimitry Andric// microcoded, and the software emulation is about twice as fast. 2530b57cec5SDimitry Andricdef FeatureSlowPOPCNTD : SubtargetFeature<"slow-popcntd","HasPOPCNTD", 2540b57cec5SDimitry Andric "POPCNTD_Slow", 2550b57cec5SDimitry Andric "Has slow popcnt[dw] instructions">; 2560b57cec5SDimitry Andric 257bdd1243dSDimitry Andricdef DeprecatedDST : SubtargetFeature<"", "IsDeprecatedDST", "true", 2580b57cec5SDimitry Andric "Treat vector data stream cache control instructions as deprecated">; 2590b57cec5SDimitry Andric 260349cc55cSDimitry Andricdef FeatureISA2_06 : SubtargetFeature<"isa-v206-instructions", "IsISA2_06", 261349cc55cSDimitry Andric "true", 262349cc55cSDimitry Andric "Enable instructions in ISA 2.06.">; 263fe6060f1SDimitry Andricdef FeatureISA2_07 : SubtargetFeature<"isa-v207-instructions", "IsISA2_07", 264fe6060f1SDimitry Andric "true", 265fe6060f1SDimitry Andric "Enable instructions in ISA 2.07.">; 2660b57cec5SDimitry Andricdef FeatureISA3_0 : SubtargetFeature<"isa-v30-instructions", "IsISA3_0", 2670b57cec5SDimitry Andric "true", 268fe6060f1SDimitry Andric "Enable instructions in ISA 3.0.", 269fe6060f1SDimitry Andric [FeatureISA2_07]>; 2705ffd83dbSDimitry Andricdef FeatureISA3_1 : SubtargetFeature<"isa-v31-instructions", "IsISA3_1", 2715ffd83dbSDimitry Andric "true", 2725ffd83dbSDimitry Andric "Enable instructions in ISA 3.1.", 2735ffd83dbSDimitry Andric [FeatureISA3_0]>; 27481ad6265SDimitry Andricdef FeatureISAFuture : SubtargetFeature<"isa-future-instructions", 27581ad6265SDimitry Andric "IsISAFuture", "true", 27681ad6265SDimitry Andric "Enable instructions for Future ISA.", 27781ad6265SDimitry Andric [FeatureISA3_1]>; 2780b57cec5SDimitry Andricdef FeatureP9Altivec : SubtargetFeature<"power9-altivec", "HasP9Altivec", "true", 2790b57cec5SDimitry Andric "Enable POWER9 Altivec instructions", 2800b57cec5SDimitry Andric [FeatureISA3_0, FeatureP8Altivec]>; 2810b57cec5SDimitry Andricdef FeatureP9Vector : SubtargetFeature<"power9-vector", "HasP9Vector", "true", 2820b57cec5SDimitry Andric "Enable POWER9 vector instructions", 2830b57cec5SDimitry Andric [FeatureISA3_0, FeatureP8Vector, 2840b57cec5SDimitry Andric FeatureP9Altivec]>; 2855ffd83dbSDimitry Andricdef FeatureP10Vector : SubtargetFeature<"power10-vector", "HasP10Vector", 2865ffd83dbSDimitry Andric "true", 2875ffd83dbSDimitry Andric "Enable POWER10 vector instructions", 2885ffd83dbSDimitry Andric [FeatureISA3_1, FeatureP9Vector]>; 2890b57cec5SDimitry Andric// A separate feature for this even though it is equivalent to P9Vector 2900b57cec5SDimitry Andric// because this is a feature of the implementation rather than the architecture 2910b57cec5SDimitry Andric// and may go away with future CPU's. 2920b57cec5SDimitry Andricdef FeatureVectorsUseTwoUnits : SubtargetFeature<"vectors-use-two-units", 2930b57cec5SDimitry Andric "VectorsUseTwoUnits", 2940b57cec5SDimitry Andric "true", 2950b57cec5SDimitry Andric "Vectors use two units">; 2965ffd83dbSDimitry Andricdef FeaturePrefixInstrs : SubtargetFeature<"prefix-instrs", "HasPrefixInstrs", 2975ffd83dbSDimitry Andric "true", 2985ffd83dbSDimitry Andric "Enable prefixed instructions", 2995ffd83dbSDimitry Andric [FeatureISA3_0, FeatureP8Vector, 3005ffd83dbSDimitry Andric FeatureP9Altivec]>; 3015ffd83dbSDimitry Andricdef FeaturePCRelativeMemops : 3025ffd83dbSDimitry Andric SubtargetFeature<"pcrelative-memops", "HasPCRelativeMemops", "true", 3035ffd83dbSDimitry Andric "Enable PC relative Memory Ops", 304e8d8bef9SDimitry Andric [FeatureISA3_0, FeaturePrefixInstrs]>; 305e8d8bef9SDimitry Andricdef FeaturePairedVectorMemops: 306e8d8bef9SDimitry Andric SubtargetFeature<"paired-vector-memops", "PairedVectorMemops", "true", 307e8d8bef9SDimitry Andric "32Byte load and store instructions", 3085ffd83dbSDimitry Andric [FeatureISA3_0]>; 309e8d8bef9SDimitry Andricdef FeatureMMA : SubtargetFeature<"mma", "HasMMA", "true", 310e8d8bef9SDimitry Andric "Enable MMA instructions", 311e8d8bef9SDimitry Andric [FeatureP8Vector, FeatureP9Altivec, 312e8d8bef9SDimitry Andric FeaturePairedVectorMemops]>; 313fe6060f1SDimitry Andricdef FeatureROPProtect : 314fe6060f1SDimitry Andric SubtargetFeature<"rop-protect", "HasROPProtect", "true", 315fe6060f1SDimitry Andric "Add ROP protect">; 316fe6060f1SDimitry Andric 317fe6060f1SDimitry Andricdef FeaturePrivileged : 318fe6060f1SDimitry Andric SubtargetFeature<"privileged", "HasPrivileged", "true", 319fe6060f1SDimitry Andric "Add privileged instructions">; 3205ffd83dbSDimitry Andric 321*5f757f3fSDimitry Andric// Specifies that local-exec TLS accesses in any function with this target 322*5f757f3fSDimitry Andric// attribute should use the optimized TOC-free sequence (where the offset is an 323*5f757f3fSDimitry Andric// immediate off of R13 for which the linker might add fix-up code if the 324*5f757f3fSDimitry Andric// immediate is too large). 325*5f757f3fSDimitry Andric// Clearly, this isn't really a feature of the subtarget, but is used as a 326*5f757f3fSDimitry Andric// convenient way to affect code generation for individual functions. 327*5f757f3fSDimitry Andricdef FeatureAIXLocalExecTLS : 328*5f757f3fSDimitry Andric SubtargetFeature<"aix-small-local-exec-tls", "HasAIXSmallLocalExecTLS", "true", 329*5f757f3fSDimitry Andric "Produce a TOC-free local-exec TLS sequence for this function " 330*5f757f3fSDimitry Andric "for 64-bit AIX">; 331*5f757f3fSDimitry Andric 3325ffd83dbSDimitry Andricdef FeaturePredictableSelectIsExpensive : 3335ffd83dbSDimitry Andric SubtargetFeature<"predictable-select-expensive", 3345ffd83dbSDimitry Andric "PredictableSelectIsExpensive", 3355ffd83dbSDimitry Andric "true", 3365ffd83dbSDimitry Andric "Prefer likely predicted branches over selects">; 3370b57cec5SDimitry Andric 338bdd1243dSDimitry Andricdef FeatureFastMFLR : SubtargetFeature<"fast-MFLR", "HasFastMFLR", "true", 339bdd1243dSDimitry Andric "MFLR is a fast instruction">; 340bdd1243dSDimitry Andric 3410b57cec5SDimitry Andric// Since new processors generally contain a superset of features of those that 3420b57cec5SDimitry Andric// came before them, the idea is to make implementations of new processors 3430b57cec5SDimitry Andric// less error prone and easier to read. 3440b57cec5SDimitry Andric// Namely: 345480093f4SDimitry Andric// list<SubtargetFeature> P8InheritableFeatures = ... 346480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorAddtionalFeatures = 347480093f4SDimitry Andric// [ features that Power8 does not support but inheritable ] 348480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorSpecificFeatures = 349480093f4SDimitry Andric// [ features that Power8 does not support and not inheritable ] 350480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorInheritableFeatures = 351480093f4SDimitry Andric// !listconcat(P8InheritableFeatures, FutureProcessorAddtionalFeatures) 352480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorFeatures = 353480093f4SDimitry Andric// !listconcat(FutureProcessorInheritableFeatures, 354480093f4SDimitry Andric// FutureProcessorSpecificFeatures) 3550b57cec5SDimitry Andric 3565ffd83dbSDimitry Andric// Makes it explicit and obvious what is new in FutureProcessor vs. Power8 as 3570b57cec5SDimitry Andric// well as providing a single point of definition if the feature set will be 3580b57cec5SDimitry Andric// used elsewhere. 3590b57cec5SDimitry Andricdef ProcessorFeatures { 360480093f4SDimitry Andric // Power7 361480093f4SDimitry Andric list<SubtargetFeature> P7InheritableFeatures = [DirectivePwr7, 362480093f4SDimitry Andric FeatureAltivec, 363480093f4SDimitry Andric FeatureVSX, 364480093f4SDimitry Andric FeatureMFOCRF, 365480093f4SDimitry Andric FeatureFCPSGN, 366480093f4SDimitry Andric FeatureFSqrt, 367480093f4SDimitry Andric FeatureFRE, 368480093f4SDimitry Andric FeatureFRES, 369480093f4SDimitry Andric FeatureFRSQRTE, 370480093f4SDimitry Andric FeatureFRSQRTES, 371480093f4SDimitry Andric FeatureRecipPrec, 372480093f4SDimitry Andric FeatureSTFIWX, 373480093f4SDimitry Andric FeatureLFIWAX, 374480093f4SDimitry Andric FeatureFPRND, 375480093f4SDimitry Andric FeatureFPCVT, 376480093f4SDimitry Andric FeatureISEL, 377480093f4SDimitry Andric FeaturePOPCNTD, 378480093f4SDimitry Andric FeatureCMPB, 379480093f4SDimitry Andric FeatureLDBRX, 380480093f4SDimitry Andric Feature64Bit, 381480093f4SDimitry Andric /* Feature64BitRegs, */ 382480093f4SDimitry Andric FeatureBPERMD, 383480093f4SDimitry Andric FeatureExtDiv, 384480093f4SDimitry Andric FeatureMFTB, 385480093f4SDimitry Andric DeprecatedDST, 3860946e70aSDimitry Andric FeatureTwoConstNR, 387349cc55cSDimitry Andric FeatureUnalignedFloats, 388349cc55cSDimitry Andric FeatureISA2_06]; 389480093f4SDimitry Andric list<SubtargetFeature> P7SpecificFeatures = []; 390480093f4SDimitry Andric list<SubtargetFeature> P7Features = 391480093f4SDimitry Andric !listconcat(P7InheritableFeatures, P7SpecificFeatures); 392480093f4SDimitry Andric 393480093f4SDimitry Andric // Power8 3945ffd83dbSDimitry Andric list<SubtargetFeature> P8AdditionalFeatures = 3955ffd83dbSDimitry Andric [DirectivePwr8, 396480093f4SDimitry Andric FeatureP8Altivec, 397480093f4SDimitry Andric FeatureP8Vector, 398480093f4SDimitry Andric FeatureP8Crypto, 399480093f4SDimitry Andric FeatureHTM, 400480093f4SDimitry Andric FeatureDirectMove, 401480093f4SDimitry Andric FeatureICBT, 4025ffd83dbSDimitry Andric FeaturePartwordAtomic, 403fe6060f1SDimitry Andric FeatureQuadwordAtomic, 404fe6060f1SDimitry Andric FeaturePredictableSelectIsExpensive, 40581ad6265SDimitry Andric FeatureISA2_07, 40681ad6265SDimitry Andric FeatureCRBits 4075ffd83dbSDimitry Andric ]; 4085ffd83dbSDimitry Andric 4095ffd83dbSDimitry Andric list<SubtargetFeature> P8SpecificFeatures = [FeatureAddiLoadFusion, 4105ffd83dbSDimitry Andric FeatureAddisLoadFusion]; 411480093f4SDimitry Andric list<SubtargetFeature> P8InheritableFeatures = 412480093f4SDimitry Andric !listconcat(P7InheritableFeatures, P8AdditionalFeatures); 413480093f4SDimitry Andric list<SubtargetFeature> P8Features = 414480093f4SDimitry Andric !listconcat(P8InheritableFeatures, P8SpecificFeatures); 415480093f4SDimitry Andric 416480093f4SDimitry Andric // Power9 4175ffd83dbSDimitry Andric list<SubtargetFeature> P9AdditionalFeatures = 4185ffd83dbSDimitry Andric [DirectivePwr9, 419480093f4SDimitry Andric FeatureP9Altivec, 420480093f4SDimitry Andric FeatureP9Vector, 421e8d8bef9SDimitry Andric FeaturePPCPreRASched, 422e8d8bef9SDimitry Andric FeaturePPCPostRASched, 4235ffd83dbSDimitry Andric FeatureISA3_0, 4245ffd83dbSDimitry Andric FeaturePredictableSelectIsExpensive 4255ffd83dbSDimitry Andric ]; 4265ffd83dbSDimitry Andric 427480093f4SDimitry Andric // Some features are unique to Power9 and there is no reason to assume 428480093f4SDimitry Andric // they will be part of any future CPUs. One example is the narrower 429480093f4SDimitry Andric // dispatch for vector operations than scalar ones. For the time being, 430480093f4SDimitry Andric // this list also includes scheduling-related features since we do not have 431480093f4SDimitry Andric // enough info to create custom scheduling strategies for future CPUs. 432e8d8bef9SDimitry Andric list<SubtargetFeature> P9SpecificFeatures = [FeatureVectorsUseTwoUnits]; 433480093f4SDimitry Andric list<SubtargetFeature> P9InheritableFeatures = 434480093f4SDimitry Andric !listconcat(P8InheritableFeatures, P9AdditionalFeatures); 435480093f4SDimitry Andric list<SubtargetFeature> P9Features = 436480093f4SDimitry Andric !listconcat(P9InheritableFeatures, P9SpecificFeatures); 437480093f4SDimitry Andric 4385ffd83dbSDimitry Andric // Power10 4395ffd83dbSDimitry Andric // For P10 CPU we assume that all of the existing features from Power9 440480093f4SDimitry Andric // still exist with the exception of those we know are Power9 specific. 441349cc55cSDimitry Andric list<SubtargetFeature> FusionFeatures = [ 442349cc55cSDimitry Andric FeatureStoreFusion, FeatureAddLogicalFusion, FeatureLogicalAddFusion, 4434824e7fdSDimitry Andric FeatureLogicalFusion, FeatureArithAddFusion, FeatureSha3Fusion, 444349cc55cSDimitry Andric ]; 4455ffd83dbSDimitry Andric list<SubtargetFeature> P10AdditionalFeatures = 446e8d8bef9SDimitry Andric !listconcat(FusionFeatures, [ 447e8d8bef9SDimitry Andric DirectivePwr10, FeatureISA3_1, FeaturePrefixInstrs, 448e8d8bef9SDimitry Andric FeaturePCRelativeMemops, FeatureP10Vector, FeatureMMA, 449bdd1243dSDimitry Andric FeaturePairedVectorMemops, FeatureFastMFLR]); 4505ffd83dbSDimitry Andric list<SubtargetFeature> P10SpecificFeatures = []; 4515ffd83dbSDimitry Andric list<SubtargetFeature> P10InheritableFeatures = 4525ffd83dbSDimitry Andric !listconcat(P9InheritableFeatures, P10AdditionalFeatures); 4535ffd83dbSDimitry Andric list<SubtargetFeature> P10Features = 4545ffd83dbSDimitry Andric !listconcat(P10InheritableFeatures, P10SpecificFeatures); 4555ffd83dbSDimitry Andric 4565ffd83dbSDimitry Andric // Future 4575ffd83dbSDimitry Andric // For future CPU we assume that all of the existing features from Power10 4585ffd83dbSDimitry Andric // still exist with the exception of those we know are Power10 specific. 45981ad6265SDimitry Andric list<SubtargetFeature> FutureAdditionalFeatures = [FeatureISAFuture]; 460480093f4SDimitry Andric list<SubtargetFeature> FutureSpecificFeatures = []; 461480093f4SDimitry Andric list<SubtargetFeature> FutureInheritableFeatures = 4625ffd83dbSDimitry Andric !listconcat(P10InheritableFeatures, FutureAdditionalFeatures); 463480093f4SDimitry Andric list<SubtargetFeature> FutureFeatures = 464480093f4SDimitry Andric !listconcat(FutureInheritableFeatures, FutureSpecificFeatures); 4650b57cec5SDimitry Andric} 4660b57cec5SDimitry Andric 4670b57cec5SDimitry Andric// Note: Future features to add when support is extended to more 4680b57cec5SDimitry Andric// recent ISA levels: 4690b57cec5SDimitry Andric// 4700b57cec5SDimitry Andric// DFP p6, p6x, p7 decimal floating-point instructions 4710b57cec5SDimitry Andric// POPCNTB p5 through p7 popcntb and related instructions 4720b57cec5SDimitry Andric 4730b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4740b57cec5SDimitry Andric// Classes used for relation maps. 4750b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4760b57cec5SDimitry Andric// RecFormRel - Filter class used to relate non-record-form instructions with 4770b57cec5SDimitry Andric// their record-form variants. 4780b57cec5SDimitry Andricclass RecFormRel; 4790b57cec5SDimitry Andric 4800b57cec5SDimitry Andric// AltVSXFMARel - Filter class used to relate the primary addend-killing VSX 4810b57cec5SDimitry Andric// FMA instruction forms with their corresponding factor-killing forms. 4820b57cec5SDimitry Andricclass AltVSXFMARel { 4830b57cec5SDimitry Andric bit IsVSXFMAAlt = 0; 4840b57cec5SDimitry Andric} 4850b57cec5SDimitry Andric 4860b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4870b57cec5SDimitry Andric// Relation Map Definitions. 4880b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4890b57cec5SDimitry Andric 4900b57cec5SDimitry Andricdef getRecordFormOpcode : InstrMapping { 4910b57cec5SDimitry Andric let FilterClass = "RecFormRel"; 4920b57cec5SDimitry Andric // Instructions with the same BaseName and Interpretation64Bit values 4930b57cec5SDimitry Andric // form a row. 4940b57cec5SDimitry Andric let RowFields = ["BaseName", "Interpretation64Bit"]; 4950b57cec5SDimitry Andric // Instructions with the same RC value form a column. 4960b57cec5SDimitry Andric let ColFields = ["RC"]; 4970b57cec5SDimitry Andric // The key column are the non-record-form instructions. 4980b57cec5SDimitry Andric let KeyCol = ["0"]; 4990b57cec5SDimitry Andric // Value columns RC=1 5000b57cec5SDimitry Andric let ValueCols = [["1"]]; 5010b57cec5SDimitry Andric} 5020b57cec5SDimitry Andric 5030b57cec5SDimitry Andricdef getNonRecordFormOpcode : InstrMapping { 5040b57cec5SDimitry Andric let FilterClass = "RecFormRel"; 5050b57cec5SDimitry Andric // Instructions with the same BaseName and Interpretation64Bit values 5060b57cec5SDimitry Andric // form a row. 5070b57cec5SDimitry Andric let RowFields = ["BaseName", "Interpretation64Bit"]; 5080b57cec5SDimitry Andric // Instructions with the same RC value form a column. 5090b57cec5SDimitry Andric let ColFields = ["RC"]; 5100b57cec5SDimitry Andric // The key column are the record-form instructions. 5110b57cec5SDimitry Andric let KeyCol = ["1"]; 5120b57cec5SDimitry Andric // Value columns are RC=0 5130b57cec5SDimitry Andric let ValueCols = [["0"]]; 5140b57cec5SDimitry Andric} 5150b57cec5SDimitry Andric 5160b57cec5SDimitry Andricdef getAltVSXFMAOpcode : InstrMapping { 5170b57cec5SDimitry Andric let FilterClass = "AltVSXFMARel"; 5180b57cec5SDimitry Andric // Instructions with the same BaseName value form a row. 5190b57cec5SDimitry Andric let RowFields = ["BaseName"]; 5200b57cec5SDimitry Andric // Instructions with the same IsVSXFMAAlt value form a column. 5210b57cec5SDimitry Andric let ColFields = ["IsVSXFMAAlt"]; 5220b57cec5SDimitry Andric // The key column are the (default) addend-killing instructions. 5230b57cec5SDimitry Andric let KeyCol = ["0"]; 5240b57cec5SDimitry Andric // Value columns IsVSXFMAAlt=1 5250b57cec5SDimitry Andric let ValueCols = [["1"]]; 5260b57cec5SDimitry Andric} 5270b57cec5SDimitry Andric 5280b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5290b57cec5SDimitry Andric// Register File Description 5300b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5310b57cec5SDimitry Andric 5320b57cec5SDimitry Andricinclude "PPCRegisterInfo.td" 5330b57cec5SDimitry Andricinclude "PPCSchedule.td" 534e8d8bef9SDimitry Andricinclude "GISel/PPCRegisterBanks.td" 5350b57cec5SDimitry Andric 5360b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5370b57cec5SDimitry Andric// PowerPC processors supported. 5380b57cec5SDimitry Andric// 5390b57cec5SDimitry Andric 5400b57cec5SDimitry Andricdef : Processor<"generic", G3Itineraries, [Directive32, FeatureHardFloat, 5410b57cec5SDimitry Andric FeatureMFTB]>; 5420b57cec5SDimitry Andricdef : ProcessorModel<"440", PPC440Model, [Directive440, FeatureISEL, 5430b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5440b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 5450b57cec5SDimitry Andric FeatureMSYNC, FeatureMFTB]>; 5460b57cec5SDimitry Andricdef : ProcessorModel<"450", PPC440Model, [Directive440, FeatureISEL, 5470b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5480b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 5490b57cec5SDimitry Andric FeatureMSYNC, FeatureMFTB]>; 5500b57cec5SDimitry Andricdef : Processor<"601", G3Itineraries, [Directive601, FeatureFPU]>; 5510b57cec5SDimitry Andricdef : Processor<"602", G3Itineraries, [Directive602, FeatureFPU, 5520b57cec5SDimitry Andric FeatureMFTB]>; 5530b57cec5SDimitry Andricdef : Processor<"603", G3Itineraries, [Directive603, 5540b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5550b57cec5SDimitry Andric FeatureMFTB]>; 5560b57cec5SDimitry Andricdef : Processor<"603e", G3Itineraries, [Directive603, 5570b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5580b57cec5SDimitry Andric FeatureMFTB]>; 5590b57cec5SDimitry Andricdef : Processor<"603ev", G3Itineraries, [Directive603, 5600b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5610b57cec5SDimitry Andric FeatureMFTB]>; 5620b57cec5SDimitry Andricdef : Processor<"604", G3Itineraries, [Directive604, 5630b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5640b57cec5SDimitry Andric FeatureMFTB]>; 5650b57cec5SDimitry Andricdef : Processor<"604e", G3Itineraries, [Directive604, 5660b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5670b57cec5SDimitry Andric FeatureMFTB]>; 5680b57cec5SDimitry Andricdef : Processor<"620", G3Itineraries, [Directive620, 5690b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5700b57cec5SDimitry Andric FeatureMFTB]>; 5710b57cec5SDimitry Andricdef : Processor<"750", G4Itineraries, [Directive750, 5720b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5730b57cec5SDimitry Andric FeatureMFTB]>; 5740b57cec5SDimitry Andricdef : Processor<"g3", G3Itineraries, [Directive750, 5750b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5760b57cec5SDimitry Andric FeatureMFTB]>; 5770b57cec5SDimitry Andricdef : Processor<"7400", G4Itineraries, [Directive7400, FeatureAltivec, 5780b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5790b57cec5SDimitry Andric FeatureMFTB]>; 5800b57cec5SDimitry Andricdef : Processor<"g4", G4Itineraries, [Directive7400, FeatureAltivec, 5810b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5820b57cec5SDimitry Andric FeatureMFTB]>; 5830b57cec5SDimitry Andricdef : Processor<"7450", G4PlusItineraries, [Directive7400, FeatureAltivec, 5840b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5850b57cec5SDimitry Andric FeatureMFTB]>; 5860b57cec5SDimitry Andricdef : Processor<"g4+", G4PlusItineraries, [Directive7400, FeatureAltivec, 5870b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5880b57cec5SDimitry Andric FeatureMFTB]>; 5890b57cec5SDimitry Andric 5900b57cec5SDimitry Andricdef : ProcessorModel<"970", G5Model, 5910b57cec5SDimitry Andric [Directive970, FeatureAltivec, 5920b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, 5930b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureSTFIWX, 5940b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 5950b57cec5SDimitry Andric FeatureMFTB]>; 5960b57cec5SDimitry Andricdef : ProcessorModel<"g5", G5Model, 5970b57cec5SDimitry Andric [Directive970, FeatureAltivec, 5980b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, FeatureSTFIWX, 5990b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 6000b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 6010b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 6020b57cec5SDimitry Andricdef : ProcessorModel<"e500", PPCE500Model, 6030b57cec5SDimitry Andric [DirectiveE500, 6040b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 6055b5f869eSDimitry Andric FeatureISEL, FeatureMFTB, FeatureMSYNC, FeatureSPE]>; 6060b57cec5SDimitry Andricdef : ProcessorModel<"e500mc", PPCE500mcModel, 6070b57cec5SDimitry Andric [DirectiveE500mc, 6080b57cec5SDimitry Andric FeatureSTFIWX, FeatureICBT, FeatureBookE, 6090b57cec5SDimitry Andric FeatureISEL, FeatureMFTB]>; 6100b57cec5SDimitry Andricdef : ProcessorModel<"e5500", PPCE5500Model, 6110b57cec5SDimitry Andric [DirectiveE5500, FeatureMFOCRF, Feature64Bit, 6120b57cec5SDimitry Andric FeatureSTFIWX, FeatureICBT, FeatureBookE, 6130b57cec5SDimitry Andric FeatureISEL, FeatureMFTB]>; 6140b57cec5SDimitry Andricdef : ProcessorModel<"a2", PPCA2Model, 6150b57cec5SDimitry Andric [DirectiveA2, FeatureICBT, FeatureBookE, FeatureMFOCRF, 6160b57cec5SDimitry Andric FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES, 6170b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec, 6180b57cec5SDimitry Andric FeatureSTFIWX, FeatureLFIWAX, 6190b57cec5SDimitry Andric FeatureFPRND, FeatureFPCVT, FeatureISEL, 6200b57cec5SDimitry Andric FeatureSlowPOPCNTD, FeatureCMPB, FeatureLDBRX, 62181ad6265SDimitry Andric Feature64Bit /*, Feature64BitRegs */, FeatureMFTB, 62281ad6265SDimitry Andric FeatureISA2_06]>; 6230b57cec5SDimitry Andricdef : ProcessorModel<"pwr3", G5Model, 6240b57cec5SDimitry Andric [DirectivePwr3, FeatureAltivec, 6250b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureMFOCRF, 6260b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit]>; 6270b57cec5SDimitry Andricdef : ProcessorModel<"pwr4", G5Model, 6280b57cec5SDimitry Andric [DirectivePwr4, FeatureAltivec, FeatureMFOCRF, 6290b57cec5SDimitry Andric FeatureFSqrt, FeatureFRES, FeatureFRSQRTE, 6300b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit, FeatureMFTB]>; 6310b57cec5SDimitry Andricdef : ProcessorModel<"pwr5", G5Model, 6320b57cec5SDimitry Andric [DirectivePwr5, FeatureAltivec, FeatureMFOCRF, 6330b57cec5SDimitry Andric FeatureFSqrt, FeatureFRE, FeatureFRES, 6340b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, 6350b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit, 6360b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 6370b57cec5SDimitry Andricdef : ProcessorModel<"pwr5x", G5Model, 6380b57cec5SDimitry Andric [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF, 6390b57cec5SDimitry Andric FeatureFSqrt, FeatureFRE, FeatureFRES, 6400b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, 6410b57cec5SDimitry Andric FeatureSTFIWX, FeatureFPRND, Feature64Bit, 6420b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 6430b57cec5SDimitry Andricdef : ProcessorModel<"pwr6", G5Model, 6440b57cec5SDimitry Andric [DirectivePwr6, FeatureAltivec, 6450b57cec5SDimitry Andric FeatureMFOCRF, FeatureFCPSGN, FeatureFSqrt, FeatureFRE, 6460b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureFRSQRTES, 6470b57cec5SDimitry Andric FeatureRecipPrec, FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB, 6480b57cec5SDimitry Andric FeatureFPRND, Feature64Bit /*, Feature64BitRegs */, 6490b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 6500b57cec5SDimitry Andricdef : ProcessorModel<"pwr6x", G5Model, 6510b57cec5SDimitry Andric [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF, 6520b57cec5SDimitry Andric FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES, 6530b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec, 6540b57cec5SDimitry Andric FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB, 6550b57cec5SDimitry Andric FeatureFPRND, Feature64Bit, 6560b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 657480093f4SDimitry Andricdef : ProcessorModel<"pwr7", P7Model, ProcessorFeatures.P7Features>; 658480093f4SDimitry Andricdef : ProcessorModel<"pwr8", P8Model, ProcessorFeatures.P8Features>; 659480093f4SDimitry Andricdef : ProcessorModel<"pwr9", P9Model, ProcessorFeatures.P9Features>; 660349cc55cSDimitry Andricdef : ProcessorModel<"pwr10", P10Model, ProcessorFeatures.P10Features>; 661480093f4SDimitry Andric// No scheduler model for future CPU. 662480093f4SDimitry Andricdef : ProcessorModel<"future", NoSchedModel, 663480093f4SDimitry Andric ProcessorFeatures.FutureFeatures>; 6640b57cec5SDimitry Andricdef : Processor<"ppc", G3Itineraries, [Directive32, FeatureHardFloat, 6650b57cec5SDimitry Andric FeatureMFTB]>; 6660b57cec5SDimitry Andricdef : Processor<"ppc32", G3Itineraries, [Directive32, FeatureHardFloat, 6670b57cec5SDimitry Andric FeatureMFTB]>; 6680b57cec5SDimitry Andricdef : ProcessorModel<"ppc64", G5Model, 6690b57cec5SDimitry Andric [Directive64, FeatureAltivec, 6700b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, FeatureFRES, 6710b57cec5SDimitry Andric FeatureFRSQRTE, FeatureSTFIWX, 6720b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 6730b57cec5SDimitry Andric FeatureMFTB]>; 674480093f4SDimitry Andricdef : ProcessorModel<"ppc64le", P8Model, ProcessorFeatures.P8Features>; 6750b57cec5SDimitry Andric 6760b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6770b57cec5SDimitry Andric// Calling Conventions 6780b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6790b57cec5SDimitry Andric 6800b57cec5SDimitry Andricinclude "PPCCallingConv.td" 6810b57cec5SDimitry Andric 6820b57cec5SDimitry Andricdef PPCInstrInfo : InstrInfo { 6830b57cec5SDimitry Andric let isLittleEndianEncoding = 1; 6840b57cec5SDimitry Andric} 6850b57cec5SDimitry Andric 686e8d8bef9SDimitry Andricdef PPCAsmWriter : AsmWriter { 687e8d8bef9SDimitry Andric string AsmWriterClassName = "InstPrinter"; 688e8d8bef9SDimitry Andric int PassSubtarget = 1; 689e8d8bef9SDimitry Andric int Variant = 0; 690e8d8bef9SDimitry Andric bit isMCAsmWriter = 1; 691e8d8bef9SDimitry Andric} 692e8d8bef9SDimitry Andric 6930b57cec5SDimitry Andricdef PPCAsmParser : AsmParser { 6940b57cec5SDimitry Andric let ShouldEmitMatchRegisterName = 0; 6950b57cec5SDimitry Andric} 6960b57cec5SDimitry Andric 6970b57cec5SDimitry Andricdef PPCAsmParserVariant : AsmParserVariant { 6980b57cec5SDimitry Andric int Variant = 0; 6990b57cec5SDimitry Andric 7000b57cec5SDimitry Andric // We do not use hard coded registers in asm strings. However, some 7010b57cec5SDimitry Andric // InstAlias definitions use immediate literals. Set RegisterPrefix 7020b57cec5SDimitry Andric // so that those are not misinterpreted as registers. 7030b57cec5SDimitry Andric string RegisterPrefix = "%"; 7040b57cec5SDimitry Andric string BreakCharacters = "."; 7050b57cec5SDimitry Andric} 7060b57cec5SDimitry Andric 7070b57cec5SDimitry Andricdef PPC : Target { 7080b57cec5SDimitry Andric // Information about the instructions. 7090b57cec5SDimitry Andric let InstructionSet = PPCInstrInfo; 7100b57cec5SDimitry Andric 711e8d8bef9SDimitry Andric let AssemblyWriters = [PPCAsmWriter]; 7120b57cec5SDimitry Andric let AssemblyParsers = [PPCAsmParser]; 7130b57cec5SDimitry Andric let AssemblyParserVariants = [PPCAsmParserVariant]; 7140b57cec5SDimitry Andric let AllowRegisterRenaming = 1; 7150b57cec5SDimitry Andric} 7160b57cec5SDimitry Andric 7170b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7180b57cec5SDimitry Andric// Pfm Counters 7190b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7200b57cec5SDimitry Andric 7210b57cec5SDimitry Andricinclude "PPCPfmCounters.td" 722