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 580b57cec5SDimitry Andricdef Feature64Bit : SubtargetFeature<"64bit","Has64BitSupport", "true", 590b57cec5SDimitry Andric "Enable 64-bit instructions">; 60e8d8bef9SDimitry Andricdef AIXOS: SubtargetFeature<"aix", "IsAIX", "true", "AIX OS">; 61e8d8bef9SDimitry Andricdef FeatureModernAIXAs 62e8d8bef9SDimitry Andric : SubtargetFeature<"modern-aix-as", "HasModernAIXAs", "true", 63e8d8bef9SDimitry Andric "AIX system assembler is modern enough to support new mnes">; 640b57cec5SDimitry Andricdef FeatureHardFloat : SubtargetFeature<"hard-float", "HasHardFloat", "true", 650b57cec5SDimitry Andric "Enable floating-point instructions">; 660b57cec5SDimitry Andricdef Feature64BitRegs : SubtargetFeature<"64bitregs","Use64BitRegs", "true", 670b57cec5SDimitry Andric "Enable 64-bit registers usage for ppc32 [beta]">; 680b57cec5SDimitry Andricdef FeatureCRBits : SubtargetFeature<"crbits", "UseCRBits", "true", 690b57cec5SDimitry Andric "Use condition-register bits individually">; 700b57cec5SDimitry Andricdef FeatureFPU : SubtargetFeature<"fpu","HasFPU","true", 710b57cec5SDimitry Andric "Enable classic FPU instructions", 720b57cec5SDimitry Andric [FeatureHardFloat]>; 730b57cec5SDimitry Andricdef FeatureAltivec : SubtargetFeature<"altivec","HasAltivec", "true", 740b57cec5SDimitry Andric "Enable Altivec instructions", 750b57cec5SDimitry Andric [FeatureFPU]>; 760b57cec5SDimitry Andricdef FeatureSPE : SubtargetFeature<"spe","HasSPE", "true", 770b57cec5SDimitry Andric "Enable SPE instructions", 780b57cec5SDimitry Andric [FeatureHardFloat]>; 79e8d8bef9SDimitry Andricdef FeatureEFPU2 : SubtargetFeature<"efpu2", "HasEFPU2", "true", 80e8d8bef9SDimitry Andric "Enable Embedded Floating-Point APU 2 instructions", 81e8d8bef9SDimitry Andric [FeatureSPE]>; 820b57cec5SDimitry Andricdef FeatureMFOCRF : SubtargetFeature<"mfocrf","HasMFOCRF", "true", 830b57cec5SDimitry Andric "Enable the MFOCRF instruction">; 840b57cec5SDimitry Andricdef FeatureFSqrt : SubtargetFeature<"fsqrt","HasFSQRT", "true", 850b57cec5SDimitry Andric "Enable the fsqrt instruction", 860b57cec5SDimitry Andric [FeatureFPU]>; 870b57cec5SDimitry Andricdef FeatureFCPSGN : SubtargetFeature<"fcpsgn", "HasFCPSGN", "true", 880b57cec5SDimitry Andric "Enable the fcpsgn instruction", 890b57cec5SDimitry Andric [FeatureFPU]>; 900b57cec5SDimitry Andricdef FeatureFRE : SubtargetFeature<"fre", "HasFRE", "true", 910b57cec5SDimitry Andric "Enable the fre instruction", 920b57cec5SDimitry Andric [FeatureFPU]>; 930b57cec5SDimitry Andricdef FeatureFRES : SubtargetFeature<"fres", "HasFRES", "true", 940b57cec5SDimitry Andric "Enable the fres instruction", 950b57cec5SDimitry Andric [FeatureFPU]>; 960b57cec5SDimitry Andricdef FeatureFRSQRTE : SubtargetFeature<"frsqrte", "HasFRSQRTE", "true", 970b57cec5SDimitry Andric "Enable the frsqrte instruction", 980b57cec5SDimitry Andric [FeatureFPU]>; 990b57cec5SDimitry Andricdef FeatureFRSQRTES : SubtargetFeature<"frsqrtes", "HasFRSQRTES", "true", 1000b57cec5SDimitry Andric "Enable the frsqrtes instruction", 1010b57cec5SDimitry Andric [FeatureFPU]>; 1020b57cec5SDimitry Andricdef FeatureRecipPrec : SubtargetFeature<"recipprec", "HasRecipPrec", "true", 1030b57cec5SDimitry Andric "Assume higher precision reciprocal estimates">; 1040b57cec5SDimitry Andricdef FeatureSTFIWX : SubtargetFeature<"stfiwx","HasSTFIWX", "true", 1050b57cec5SDimitry Andric "Enable the stfiwx instruction", 1060b57cec5SDimitry Andric [FeatureFPU]>; 1070b57cec5SDimitry Andricdef FeatureLFIWAX : SubtargetFeature<"lfiwax","HasLFIWAX", "true", 1080b57cec5SDimitry Andric "Enable the lfiwax instruction", 1090b57cec5SDimitry Andric [FeatureFPU]>; 1100b57cec5SDimitry Andricdef FeatureFPRND : SubtargetFeature<"fprnd", "HasFPRND", "true", 1110b57cec5SDimitry Andric "Enable the fri[mnpz] instructions", 1120b57cec5SDimitry Andric [FeatureFPU]>; 1130b57cec5SDimitry Andricdef FeatureFPCVT : SubtargetFeature<"fpcvt", "HasFPCVT", "true", 1140b57cec5SDimitry Andric "Enable fc[ft]* (unsigned and single-precision) and lfiwzx instructions", 1150b57cec5SDimitry Andric [FeatureFPU]>; 1160b57cec5SDimitry Andricdef FeatureISEL : SubtargetFeature<"isel","HasISEL", "true", 1170b57cec5SDimitry Andric "Enable the isel instruction">; 1180b57cec5SDimitry Andricdef FeatureBPERMD : SubtargetFeature<"bpermd", "HasBPERMD", "true", 1190b57cec5SDimitry Andric "Enable the bpermd instruction">; 1200b57cec5SDimitry Andricdef FeatureExtDiv : SubtargetFeature<"extdiv", "HasExtDiv", "true", 1210b57cec5SDimitry Andric "Enable extended divide instructions">; 1220b57cec5SDimitry Andricdef FeatureLDBRX : SubtargetFeature<"ldbrx","HasLDBRX", "true", 1230b57cec5SDimitry Andric "Enable the ldbrx instruction">; 1240b57cec5SDimitry Andricdef FeatureCMPB : SubtargetFeature<"cmpb", "HasCMPB", "true", 1250b57cec5SDimitry Andric "Enable the cmpb instruction">; 1260b57cec5SDimitry Andricdef FeatureICBT : SubtargetFeature<"icbt","HasICBT", "true", 1270b57cec5SDimitry Andric "Enable icbt instruction">; 1280b57cec5SDimitry Andricdef FeatureBookE : SubtargetFeature<"booke", "IsBookE", "true", 1290b57cec5SDimitry Andric "Enable Book E instructions", 1300b57cec5SDimitry Andric [FeatureICBT]>; 1310b57cec5SDimitry Andricdef FeatureMSYNC : SubtargetFeature<"msync", "HasOnlyMSYNC", "true", 1320b57cec5SDimitry Andric "Has only the msync instruction instead of sync", 1330b57cec5SDimitry Andric [FeatureBookE]>; 1340b57cec5SDimitry Andricdef FeatureE500 : SubtargetFeature<"e500", "IsE500", "true", 1350b57cec5SDimitry Andric "Enable E500/E500mc instructions">; 1360b57cec5SDimitry Andricdef FeatureSecurePlt : SubtargetFeature<"secure-plt","SecurePlt", "true", 1370b57cec5SDimitry Andric "Enable secure plt mode">; 1380b57cec5SDimitry Andricdef FeaturePPC4xx : SubtargetFeature<"ppc4xx", "IsPPC4xx", "true", 1390b57cec5SDimitry Andric "Enable PPC 4xx instructions">; 1400b57cec5SDimitry Andricdef FeaturePPC6xx : SubtargetFeature<"ppc6xx", "IsPPC6xx", "true", 1410b57cec5SDimitry Andric "Enable PPC 6xx instructions">; 1420b57cec5SDimitry Andricdef FeatureVSX : SubtargetFeature<"vsx","HasVSX", "true", 1430b57cec5SDimitry Andric "Enable VSX instructions", 1440b57cec5SDimitry Andric [FeatureAltivec]>; 1450b57cec5SDimitry Andricdef FeatureTwoConstNR : 1460b57cec5SDimitry Andric SubtargetFeature<"two-const-nr", "NeedsTwoConstNR", "true", 1470b57cec5SDimitry Andric "Requires two constant Newton-Raphson computation">; 1480b57cec5SDimitry Andricdef FeatureP8Altivec : SubtargetFeature<"power8-altivec", "HasP8Altivec", "true", 1490b57cec5SDimitry Andric "Enable POWER8 Altivec instructions", 1500b57cec5SDimitry Andric [FeatureAltivec]>; 1510b57cec5SDimitry Andricdef FeatureP8Crypto : SubtargetFeature<"crypto", "HasP8Crypto", "true", 1520b57cec5SDimitry Andric "Enable POWER8 Crypto instructions", 1530b57cec5SDimitry Andric [FeatureP8Altivec]>; 1540b57cec5SDimitry Andricdef FeatureP8Vector : SubtargetFeature<"power8-vector", "HasP8Vector", "true", 1550b57cec5SDimitry Andric "Enable POWER8 vector instructions", 1560b57cec5SDimitry Andric [FeatureVSX, FeatureP8Altivec]>; 1570b57cec5SDimitry Andricdef FeatureDirectMove : 1580b57cec5SDimitry Andric SubtargetFeature<"direct-move", "HasDirectMove", "true", 1590b57cec5SDimitry Andric "Enable Power8 direct move instructions", 1600b57cec5SDimitry Andric [FeatureVSX]>; 1610b57cec5SDimitry Andricdef FeaturePartwordAtomic : SubtargetFeature<"partword-atomics", 1620b57cec5SDimitry Andric "HasPartwordAtomics", "true", 1630b57cec5SDimitry Andric "Enable l[bh]arx and st[bh]cx.">; 164fe6060f1SDimitry Andricdef FeatureQuadwordAtomic : SubtargetFeature<"quadword-atomics", 165fe6060f1SDimitry Andric "HasQuadwordAtomics", "true", 166fe6060f1SDimitry Andric "Enable lqarx and stqcx.">; 1670b57cec5SDimitry Andricdef FeatureInvariantFunctionDescriptors : 1680b57cec5SDimitry Andric SubtargetFeature<"invariant-function-descriptors", 1690b57cec5SDimitry Andric "HasInvariantFunctionDescriptors", "true", 1700b57cec5SDimitry Andric "Assume function descriptors are invariant">; 1710b57cec5SDimitry Andricdef FeatureLongCall : SubtargetFeature<"longcall", "UseLongCalls", "true", 1720b57cec5SDimitry Andric "Always use indirect calls">; 1730b57cec5SDimitry Andricdef FeatureHTM : SubtargetFeature<"htm", "HasHTM", "true", 1740b57cec5SDimitry Andric "Enable Hardware Transactional Memory instructions">; 1750b57cec5SDimitry Andricdef FeatureMFTB : SubtargetFeature<"", "FeatureMFTB", "true", 1760b57cec5SDimitry Andric "Implement mftb using the mfspr instruction">; 1775ffd83dbSDimitry Andricdef FeatureFusion : SubtargetFeature<"fusion", "HasFusion", "true", 1785ffd83dbSDimitry Andric "Target supports instruction fusion">; 1795ffd83dbSDimitry Andricdef FeatureAddiLoadFusion : SubtargetFeature<"fuse-addi-load", 1805ffd83dbSDimitry Andric "HasAddiLoadFusion", "true", 1815ffd83dbSDimitry Andric "Power8 Addi-Load fusion", 1825ffd83dbSDimitry Andric [FeatureFusion]>; 1835ffd83dbSDimitry Andricdef FeatureAddisLoadFusion : SubtargetFeature<"fuse-addis-load", 1845ffd83dbSDimitry Andric "HasAddisLoadFusion", "true", 1855ffd83dbSDimitry Andric "Power8 Addis-Load fusion", 1865ffd83dbSDimitry Andric [FeatureFusion]>; 187e8d8bef9SDimitry Andricdef FeatureStoreFusion : SubtargetFeature<"fuse-store", "HasStoreFusion", "true", 188e8d8bef9SDimitry Andric "Target supports store clustering", 189e8d8bef9SDimitry Andric [FeatureFusion]>; 190349cc55cSDimitry Andricdef FeatureArithAddFusion : 191349cc55cSDimitry Andric SubtargetFeature<"fuse-arith-add", "HasArithAddFusion", "true", 192349cc55cSDimitry Andric "Target supports Arithmetic Operations with Add fusion", 193349cc55cSDimitry Andric [FeatureFusion]>; 194349cc55cSDimitry Andricdef FeatureAddLogicalFusion : 195349cc55cSDimitry Andric SubtargetFeature<"fuse-add-logical", "HasAddLogicalFusion", "true", 196349cc55cSDimitry Andric "Target supports Add with Logical Operations fusion", 197349cc55cSDimitry Andric [FeatureFusion]>; 198349cc55cSDimitry Andricdef FeatureLogicalAddFusion : 199349cc55cSDimitry Andric SubtargetFeature<"fuse-logical-add", "HasLogicalAddFusion", "true", 200349cc55cSDimitry Andric "Target supports Logical with Add Operations fusion", 201349cc55cSDimitry Andric [FeatureFusion]>; 202349cc55cSDimitry Andricdef FeatureLogicalFusion : 203349cc55cSDimitry Andric SubtargetFeature<"fuse-logical", "HasLogicalFusion", "true", 204349cc55cSDimitry Andric "Target supports Logical Operations fusion", 205349cc55cSDimitry Andric [FeatureFusion]>; 2064824e7fdSDimitry Andricdef FeatureSha3Fusion : 2074824e7fdSDimitry Andric SubtargetFeature<"fuse-sha3", "HasSha3Fusion", "true", 2084824e7fdSDimitry Andric "Target supports SHA3 assist fusion", 2094824e7fdSDimitry Andric [FeatureFusion]>; 2104824e7fdSDimitry Andricdef FeatureCompareFusion: 2114824e7fdSDimitry Andric SubtargetFeature<"fuse-cmp", "HasCompareFusion", "true", 2124824e7fdSDimitry Andric "Target supports Comparison Operations fusion", 2134824e7fdSDimitry Andric [FeatureFusion]>; 2144824e7fdSDimitry Andricdef FeatureWideImmFusion: 2154824e7fdSDimitry Andric SubtargetFeature<"fuse-wideimm", "HasWideImmFusion", "true", 2164824e7fdSDimitry Andric "Target supports Wide-Immediate fusion", 2174824e7fdSDimitry Andric [FeatureFusion]>; 2184824e7fdSDimitry Andricdef FeatureZeroMoveFusion: 2194824e7fdSDimitry Andric SubtargetFeature<"fuse-zeromove", "HasZeroMoveFusion", "true", 2204824e7fdSDimitry Andric "Target supports move to SPR with branch fusion", 2214824e7fdSDimitry Andric [FeatureFusion]>; 2220eae32dcSDimitry Andricdef FeatureBack2BackFusion: 2230eae32dcSDimitry Andric SubtargetFeature<"fuse-back2back", "HasBack2BackFusion", "true", 2240eae32dcSDimitry Andric "Target supports general back to back fusion", 2250eae32dcSDimitry Andric [FeatureFusion]>; 2260946e70aSDimitry Andricdef FeatureUnalignedFloats : 2270946e70aSDimitry Andric SubtargetFeature<"allow-unaligned-fp-access", "AllowsUnalignedFPAccess", 2280946e70aSDimitry Andric "true", "CPU does not trap on unaligned FP access">; 2290b57cec5SDimitry Andricdef FeaturePPCPreRASched: 2300b57cec5SDimitry Andric SubtargetFeature<"ppc-prera-sched", "UsePPCPreRASchedStrategy", "true", 2310b57cec5SDimitry Andric "Use PowerPC pre-RA scheduling strategy">; 2320b57cec5SDimitry Andricdef FeaturePPCPostRASched: 2330b57cec5SDimitry Andric SubtargetFeature<"ppc-postra-sched", "UsePPCPostRASchedStrategy", "true", 2340b57cec5SDimitry Andric "Use PowerPC post-RA scheduling strategy">; 2350b57cec5SDimitry Andricdef FeatureFloat128 : 2360b57cec5SDimitry Andric SubtargetFeature<"float128", "HasFloat128", "true", 2370b57cec5SDimitry Andric "Enable the __float128 data type for IEEE-754R Binary128.", 2380b57cec5SDimitry Andric [FeatureVSX]>; 2390b57cec5SDimitry Andricdef FeaturePOPCNTD : SubtargetFeature<"popcntd","HasPOPCNTD", 2400b57cec5SDimitry Andric "POPCNTD_Fast", 2410b57cec5SDimitry Andric "Enable the popcnt[dw] instructions">; 242e8d8bef9SDimitry Andric// Note that for the a2 processor models we should not use popcnt[dw] by 2430b57cec5SDimitry Andric// default. These processors do support the instructions, but they're 2440b57cec5SDimitry Andric// microcoded, and the software emulation is about twice as fast. 2450b57cec5SDimitry Andricdef FeatureSlowPOPCNTD : SubtargetFeature<"slow-popcntd","HasPOPCNTD", 2460b57cec5SDimitry Andric "POPCNTD_Slow", 2470b57cec5SDimitry Andric "Has slow popcnt[dw] instructions">; 2480b57cec5SDimitry Andric 2490b57cec5SDimitry Andricdef DeprecatedDST : SubtargetFeature<"", "DeprecatedDST", "true", 2500b57cec5SDimitry Andric "Treat vector data stream cache control instructions as deprecated">; 2510b57cec5SDimitry Andric 252349cc55cSDimitry Andricdef FeatureISA2_06 : SubtargetFeature<"isa-v206-instructions", "IsISA2_06", 253349cc55cSDimitry Andric "true", 254349cc55cSDimitry Andric "Enable instructions in ISA 2.06.">; 255fe6060f1SDimitry Andricdef FeatureISA2_07 : SubtargetFeature<"isa-v207-instructions", "IsISA2_07", 256fe6060f1SDimitry Andric "true", 257fe6060f1SDimitry Andric "Enable instructions in ISA 2.07.">; 2580b57cec5SDimitry Andricdef FeatureISA3_0 : SubtargetFeature<"isa-v30-instructions", "IsISA3_0", 2590b57cec5SDimitry Andric "true", 260fe6060f1SDimitry Andric "Enable instructions in ISA 3.0.", 261fe6060f1SDimitry Andric [FeatureISA2_07]>; 2625ffd83dbSDimitry Andricdef FeatureISA3_1 : SubtargetFeature<"isa-v31-instructions", "IsISA3_1", 2635ffd83dbSDimitry Andric "true", 2645ffd83dbSDimitry Andric "Enable instructions in ISA 3.1.", 2655ffd83dbSDimitry Andric [FeatureISA3_0]>; 266*81ad6265SDimitry Andricdef FeatureISAFuture : SubtargetFeature<"isa-future-instructions", 267*81ad6265SDimitry Andric "IsISAFuture", "true", 268*81ad6265SDimitry Andric "Enable instructions for Future ISA.", 269*81ad6265SDimitry Andric [FeatureISA3_1]>; 2700b57cec5SDimitry Andricdef FeatureP9Altivec : SubtargetFeature<"power9-altivec", "HasP9Altivec", "true", 2710b57cec5SDimitry Andric "Enable POWER9 Altivec instructions", 2720b57cec5SDimitry Andric [FeatureISA3_0, FeatureP8Altivec]>; 2730b57cec5SDimitry Andricdef FeatureP9Vector : SubtargetFeature<"power9-vector", "HasP9Vector", "true", 2740b57cec5SDimitry Andric "Enable POWER9 vector instructions", 2750b57cec5SDimitry Andric [FeatureISA3_0, FeatureP8Vector, 2760b57cec5SDimitry Andric FeatureP9Altivec]>; 2775ffd83dbSDimitry Andricdef FeatureP10Vector : SubtargetFeature<"power10-vector", "HasP10Vector", 2785ffd83dbSDimitry Andric "true", 2795ffd83dbSDimitry Andric "Enable POWER10 vector instructions", 2805ffd83dbSDimitry Andric [FeatureISA3_1, FeatureP9Vector]>; 2810b57cec5SDimitry Andric// A separate feature for this even though it is equivalent to P9Vector 2820b57cec5SDimitry Andric// because this is a feature of the implementation rather than the architecture 2830b57cec5SDimitry Andric// and may go away with future CPU's. 2840b57cec5SDimitry Andricdef FeatureVectorsUseTwoUnits : SubtargetFeature<"vectors-use-two-units", 2850b57cec5SDimitry Andric "VectorsUseTwoUnits", 2860b57cec5SDimitry Andric "true", 2870b57cec5SDimitry Andric "Vectors use two units">; 2885ffd83dbSDimitry Andricdef FeaturePrefixInstrs : SubtargetFeature<"prefix-instrs", "HasPrefixInstrs", 2895ffd83dbSDimitry Andric "true", 2905ffd83dbSDimitry Andric "Enable prefixed instructions", 2915ffd83dbSDimitry Andric [FeatureISA3_0, FeatureP8Vector, 2925ffd83dbSDimitry Andric FeatureP9Altivec]>; 2935ffd83dbSDimitry Andricdef FeaturePCRelativeMemops : 2945ffd83dbSDimitry Andric SubtargetFeature<"pcrelative-memops", "HasPCRelativeMemops", "true", 2955ffd83dbSDimitry Andric "Enable PC relative Memory Ops", 296e8d8bef9SDimitry Andric [FeatureISA3_0, FeaturePrefixInstrs]>; 297e8d8bef9SDimitry Andricdef FeaturePairedVectorMemops: 298e8d8bef9SDimitry Andric SubtargetFeature<"paired-vector-memops", "PairedVectorMemops", "true", 299e8d8bef9SDimitry Andric "32Byte load and store instructions", 3005ffd83dbSDimitry Andric [FeatureISA3_0]>; 301e8d8bef9SDimitry Andricdef FeatureMMA : SubtargetFeature<"mma", "HasMMA", "true", 302e8d8bef9SDimitry Andric "Enable MMA instructions", 303e8d8bef9SDimitry Andric [FeatureP8Vector, FeatureP9Altivec, 304e8d8bef9SDimitry Andric FeaturePairedVectorMemops]>; 305fe6060f1SDimitry Andricdef FeatureROPProtect : 306fe6060f1SDimitry Andric SubtargetFeature<"rop-protect", "HasROPProtect", "true", 307fe6060f1SDimitry Andric "Add ROP protect">; 308fe6060f1SDimitry Andric 309fe6060f1SDimitry Andricdef FeaturePrivileged : 310fe6060f1SDimitry Andric SubtargetFeature<"privileged", "HasPrivileged", "true", 311fe6060f1SDimitry Andric "Add privileged instructions">; 3125ffd83dbSDimitry Andric 3135ffd83dbSDimitry Andricdef FeaturePredictableSelectIsExpensive : 3145ffd83dbSDimitry Andric SubtargetFeature<"predictable-select-expensive", 3155ffd83dbSDimitry Andric "PredictableSelectIsExpensive", 3165ffd83dbSDimitry Andric "true", 3175ffd83dbSDimitry Andric "Prefer likely predicted branches over selects">; 3180b57cec5SDimitry Andric 3190b57cec5SDimitry Andric// Since new processors generally contain a superset of features of those that 3200b57cec5SDimitry Andric// came before them, the idea is to make implementations of new processors 3210b57cec5SDimitry Andric// less error prone and easier to read. 3220b57cec5SDimitry Andric// Namely: 323480093f4SDimitry Andric// list<SubtargetFeature> P8InheritableFeatures = ... 324480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorAddtionalFeatures = 325480093f4SDimitry Andric// [ features that Power8 does not support but inheritable ] 326480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorSpecificFeatures = 327480093f4SDimitry Andric// [ features that Power8 does not support and not inheritable ] 328480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorInheritableFeatures = 329480093f4SDimitry Andric// !listconcat(P8InheritableFeatures, FutureProcessorAddtionalFeatures) 330480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorFeatures = 331480093f4SDimitry Andric// !listconcat(FutureProcessorInheritableFeatures, 332480093f4SDimitry Andric// FutureProcessorSpecificFeatures) 3330b57cec5SDimitry Andric 3345ffd83dbSDimitry Andric// Makes it explicit and obvious what is new in FutureProcessor vs. Power8 as 3350b57cec5SDimitry Andric// well as providing a single point of definition if the feature set will be 3360b57cec5SDimitry Andric// used elsewhere. 3370b57cec5SDimitry Andricdef ProcessorFeatures { 338480093f4SDimitry Andric // Power7 339480093f4SDimitry Andric list<SubtargetFeature> P7InheritableFeatures = [DirectivePwr7, 340480093f4SDimitry Andric FeatureAltivec, 341480093f4SDimitry Andric FeatureVSX, 342480093f4SDimitry Andric FeatureMFOCRF, 343480093f4SDimitry Andric FeatureFCPSGN, 344480093f4SDimitry Andric FeatureFSqrt, 345480093f4SDimitry Andric FeatureFRE, 346480093f4SDimitry Andric FeatureFRES, 347480093f4SDimitry Andric FeatureFRSQRTE, 348480093f4SDimitry Andric FeatureFRSQRTES, 349480093f4SDimitry Andric FeatureRecipPrec, 350480093f4SDimitry Andric FeatureSTFIWX, 351480093f4SDimitry Andric FeatureLFIWAX, 352480093f4SDimitry Andric FeatureFPRND, 353480093f4SDimitry Andric FeatureFPCVT, 354480093f4SDimitry Andric FeatureISEL, 355480093f4SDimitry Andric FeaturePOPCNTD, 356480093f4SDimitry Andric FeatureCMPB, 357480093f4SDimitry Andric FeatureLDBRX, 358480093f4SDimitry Andric Feature64Bit, 359480093f4SDimitry Andric /* Feature64BitRegs, */ 360480093f4SDimitry Andric FeatureBPERMD, 361480093f4SDimitry Andric FeatureExtDiv, 362480093f4SDimitry Andric FeatureMFTB, 363480093f4SDimitry Andric DeprecatedDST, 3640946e70aSDimitry Andric FeatureTwoConstNR, 365349cc55cSDimitry Andric FeatureUnalignedFloats, 366349cc55cSDimitry Andric FeatureISA2_06]; 367480093f4SDimitry Andric list<SubtargetFeature> P7SpecificFeatures = []; 368480093f4SDimitry Andric list<SubtargetFeature> P7Features = 369480093f4SDimitry Andric !listconcat(P7InheritableFeatures, P7SpecificFeatures); 370480093f4SDimitry Andric 371480093f4SDimitry Andric // Power8 3725ffd83dbSDimitry Andric list<SubtargetFeature> P8AdditionalFeatures = 3735ffd83dbSDimitry Andric [DirectivePwr8, 374480093f4SDimitry Andric FeatureP8Altivec, 375480093f4SDimitry Andric FeatureP8Vector, 376480093f4SDimitry Andric FeatureP8Crypto, 377480093f4SDimitry Andric FeatureHTM, 378480093f4SDimitry Andric FeatureDirectMove, 379480093f4SDimitry Andric FeatureICBT, 3805ffd83dbSDimitry Andric FeaturePartwordAtomic, 381fe6060f1SDimitry Andric FeatureQuadwordAtomic, 382fe6060f1SDimitry Andric FeaturePredictableSelectIsExpensive, 383*81ad6265SDimitry Andric FeatureISA2_07, 384*81ad6265SDimitry Andric FeatureCRBits 3855ffd83dbSDimitry Andric ]; 3865ffd83dbSDimitry Andric 3875ffd83dbSDimitry Andric list<SubtargetFeature> P8SpecificFeatures = [FeatureAddiLoadFusion, 3885ffd83dbSDimitry Andric FeatureAddisLoadFusion]; 389480093f4SDimitry Andric list<SubtargetFeature> P8InheritableFeatures = 390480093f4SDimitry Andric !listconcat(P7InheritableFeatures, P8AdditionalFeatures); 391480093f4SDimitry Andric list<SubtargetFeature> P8Features = 392480093f4SDimitry Andric !listconcat(P8InheritableFeatures, P8SpecificFeatures); 393480093f4SDimitry Andric 394480093f4SDimitry Andric // Power9 3955ffd83dbSDimitry Andric list<SubtargetFeature> P9AdditionalFeatures = 3965ffd83dbSDimitry Andric [DirectivePwr9, 397480093f4SDimitry Andric FeatureP9Altivec, 398480093f4SDimitry Andric FeatureP9Vector, 399e8d8bef9SDimitry Andric FeaturePPCPreRASched, 400e8d8bef9SDimitry Andric FeaturePPCPostRASched, 4015ffd83dbSDimitry Andric FeatureISA3_0, 4025ffd83dbSDimitry Andric FeaturePredictableSelectIsExpensive 4035ffd83dbSDimitry Andric ]; 4045ffd83dbSDimitry Andric 405480093f4SDimitry Andric // Some features are unique to Power9 and there is no reason to assume 406480093f4SDimitry Andric // they will be part of any future CPUs. One example is the narrower 407480093f4SDimitry Andric // dispatch for vector operations than scalar ones. For the time being, 408480093f4SDimitry Andric // this list also includes scheduling-related features since we do not have 409480093f4SDimitry Andric // enough info to create custom scheduling strategies for future CPUs. 410e8d8bef9SDimitry Andric list<SubtargetFeature> P9SpecificFeatures = [FeatureVectorsUseTwoUnits]; 411480093f4SDimitry Andric list<SubtargetFeature> P9InheritableFeatures = 412480093f4SDimitry Andric !listconcat(P8InheritableFeatures, P9AdditionalFeatures); 413480093f4SDimitry Andric list<SubtargetFeature> P9Features = 414480093f4SDimitry Andric !listconcat(P9InheritableFeatures, P9SpecificFeatures); 415480093f4SDimitry Andric 4165ffd83dbSDimitry Andric // Power10 4175ffd83dbSDimitry Andric // For P10 CPU we assume that all of the existing features from Power9 418480093f4SDimitry Andric // still exist with the exception of those we know are Power9 specific. 419349cc55cSDimitry Andric list<SubtargetFeature> FusionFeatures = [ 420349cc55cSDimitry Andric FeatureStoreFusion, FeatureAddLogicalFusion, FeatureLogicalAddFusion, 4214824e7fdSDimitry Andric FeatureLogicalFusion, FeatureArithAddFusion, FeatureSha3Fusion, 422349cc55cSDimitry Andric ]; 4235ffd83dbSDimitry Andric list<SubtargetFeature> P10AdditionalFeatures = 424e8d8bef9SDimitry Andric !listconcat(FusionFeatures, [ 425e8d8bef9SDimitry Andric DirectivePwr10, FeatureISA3_1, FeaturePrefixInstrs, 426e8d8bef9SDimitry Andric FeaturePCRelativeMemops, FeatureP10Vector, FeatureMMA, 427e8d8bef9SDimitry Andric FeaturePairedVectorMemops]); 4285ffd83dbSDimitry Andric list<SubtargetFeature> P10SpecificFeatures = []; 4295ffd83dbSDimitry Andric list<SubtargetFeature> P10InheritableFeatures = 4305ffd83dbSDimitry Andric !listconcat(P9InheritableFeatures, P10AdditionalFeatures); 4315ffd83dbSDimitry Andric list<SubtargetFeature> P10Features = 4325ffd83dbSDimitry Andric !listconcat(P10InheritableFeatures, P10SpecificFeatures); 4335ffd83dbSDimitry Andric 4345ffd83dbSDimitry Andric // Future 4355ffd83dbSDimitry Andric // For future CPU we assume that all of the existing features from Power10 4365ffd83dbSDimitry Andric // still exist with the exception of those we know are Power10 specific. 437*81ad6265SDimitry Andric list<SubtargetFeature> FutureAdditionalFeatures = [FeatureISAFuture]; 438480093f4SDimitry Andric list<SubtargetFeature> FutureSpecificFeatures = []; 439480093f4SDimitry Andric list<SubtargetFeature> FutureInheritableFeatures = 4405ffd83dbSDimitry Andric !listconcat(P10InheritableFeatures, FutureAdditionalFeatures); 441480093f4SDimitry Andric list<SubtargetFeature> FutureFeatures = 442480093f4SDimitry Andric !listconcat(FutureInheritableFeatures, FutureSpecificFeatures); 4430b57cec5SDimitry Andric} 4440b57cec5SDimitry Andric 4450b57cec5SDimitry Andric// Note: Future features to add when support is extended to more 4460b57cec5SDimitry Andric// recent ISA levels: 4470b57cec5SDimitry Andric// 4480b57cec5SDimitry Andric// DFP p6, p6x, p7 decimal floating-point instructions 4490b57cec5SDimitry Andric// POPCNTB p5 through p7 popcntb and related instructions 4500b57cec5SDimitry Andric 4510b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4520b57cec5SDimitry Andric// Classes used for relation maps. 4530b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4540b57cec5SDimitry Andric// RecFormRel - Filter class used to relate non-record-form instructions with 4550b57cec5SDimitry Andric// their record-form variants. 4560b57cec5SDimitry Andricclass RecFormRel; 4570b57cec5SDimitry Andric 4580b57cec5SDimitry Andric// AltVSXFMARel - Filter class used to relate the primary addend-killing VSX 4590b57cec5SDimitry Andric// FMA instruction forms with their corresponding factor-killing forms. 4600b57cec5SDimitry Andricclass AltVSXFMARel { 4610b57cec5SDimitry Andric bit IsVSXFMAAlt = 0; 4620b57cec5SDimitry Andric} 4630b57cec5SDimitry Andric 4640b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4650b57cec5SDimitry Andric// Relation Map Definitions. 4660b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4670b57cec5SDimitry Andric 4680b57cec5SDimitry Andricdef getRecordFormOpcode : InstrMapping { 4690b57cec5SDimitry Andric let FilterClass = "RecFormRel"; 4700b57cec5SDimitry Andric // Instructions with the same BaseName and Interpretation64Bit values 4710b57cec5SDimitry Andric // form a row. 4720b57cec5SDimitry Andric let RowFields = ["BaseName", "Interpretation64Bit"]; 4730b57cec5SDimitry Andric // Instructions with the same RC value form a column. 4740b57cec5SDimitry Andric let ColFields = ["RC"]; 4750b57cec5SDimitry Andric // The key column are the non-record-form instructions. 4760b57cec5SDimitry Andric let KeyCol = ["0"]; 4770b57cec5SDimitry Andric // Value columns RC=1 4780b57cec5SDimitry Andric let ValueCols = [["1"]]; 4790b57cec5SDimitry Andric} 4800b57cec5SDimitry Andric 4810b57cec5SDimitry Andricdef getNonRecordFormOpcode : InstrMapping { 4820b57cec5SDimitry Andric let FilterClass = "RecFormRel"; 4830b57cec5SDimitry Andric // Instructions with the same BaseName and Interpretation64Bit values 4840b57cec5SDimitry Andric // form a row. 4850b57cec5SDimitry Andric let RowFields = ["BaseName", "Interpretation64Bit"]; 4860b57cec5SDimitry Andric // Instructions with the same RC value form a column. 4870b57cec5SDimitry Andric let ColFields = ["RC"]; 4880b57cec5SDimitry Andric // The key column are the record-form instructions. 4890b57cec5SDimitry Andric let KeyCol = ["1"]; 4900b57cec5SDimitry Andric // Value columns are RC=0 4910b57cec5SDimitry Andric let ValueCols = [["0"]]; 4920b57cec5SDimitry Andric} 4930b57cec5SDimitry Andric 4940b57cec5SDimitry Andricdef getAltVSXFMAOpcode : InstrMapping { 4950b57cec5SDimitry Andric let FilterClass = "AltVSXFMARel"; 4960b57cec5SDimitry Andric // Instructions with the same BaseName value form a row. 4970b57cec5SDimitry Andric let RowFields = ["BaseName"]; 4980b57cec5SDimitry Andric // Instructions with the same IsVSXFMAAlt value form a column. 4990b57cec5SDimitry Andric let ColFields = ["IsVSXFMAAlt"]; 5000b57cec5SDimitry Andric // The key column are the (default) addend-killing instructions. 5010b57cec5SDimitry Andric let KeyCol = ["0"]; 5020b57cec5SDimitry Andric // Value columns IsVSXFMAAlt=1 5030b57cec5SDimitry Andric let ValueCols = [["1"]]; 5040b57cec5SDimitry Andric} 5050b57cec5SDimitry Andric 5060b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5070b57cec5SDimitry Andric// Register File Description 5080b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5090b57cec5SDimitry Andric 5100b57cec5SDimitry Andricinclude "PPCRegisterInfo.td" 5110b57cec5SDimitry Andricinclude "PPCSchedule.td" 512e8d8bef9SDimitry Andricinclude "GISel/PPCRegisterBanks.td" 5130b57cec5SDimitry Andric 5140b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5150b57cec5SDimitry Andric// PowerPC processors supported. 5160b57cec5SDimitry Andric// 5170b57cec5SDimitry Andric 5180b57cec5SDimitry Andricdef : Processor<"generic", G3Itineraries, [Directive32, FeatureHardFloat, 5190b57cec5SDimitry Andric FeatureMFTB]>; 5200b57cec5SDimitry Andricdef : ProcessorModel<"440", PPC440Model, [Directive440, FeatureISEL, 5210b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5220b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 5230b57cec5SDimitry Andric FeatureMSYNC, FeatureMFTB]>; 5240b57cec5SDimitry Andricdef : ProcessorModel<"450", PPC440Model, [Directive440, FeatureISEL, 5250b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5260b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 5270b57cec5SDimitry Andric FeatureMSYNC, FeatureMFTB]>; 5280b57cec5SDimitry Andricdef : Processor<"601", G3Itineraries, [Directive601, FeatureFPU]>; 5290b57cec5SDimitry Andricdef : Processor<"602", G3Itineraries, [Directive602, FeatureFPU, 5300b57cec5SDimitry Andric FeatureMFTB]>; 5310b57cec5SDimitry Andricdef : Processor<"603", G3Itineraries, [Directive603, 5320b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5330b57cec5SDimitry Andric FeatureMFTB]>; 5340b57cec5SDimitry Andricdef : Processor<"603e", G3Itineraries, [Directive603, 5350b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5360b57cec5SDimitry Andric FeatureMFTB]>; 5370b57cec5SDimitry Andricdef : Processor<"603ev", G3Itineraries, [Directive603, 5380b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5390b57cec5SDimitry Andric FeatureMFTB]>; 5400b57cec5SDimitry Andricdef : Processor<"604", G3Itineraries, [Directive604, 5410b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5420b57cec5SDimitry Andric FeatureMFTB]>; 5430b57cec5SDimitry Andricdef : Processor<"604e", G3Itineraries, [Directive604, 5440b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5450b57cec5SDimitry Andric FeatureMFTB]>; 5460b57cec5SDimitry Andricdef : Processor<"620", G3Itineraries, [Directive620, 5470b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5480b57cec5SDimitry Andric FeatureMFTB]>; 5490b57cec5SDimitry Andricdef : Processor<"750", G4Itineraries, [Directive750, 5500b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5510b57cec5SDimitry Andric FeatureMFTB]>; 5520b57cec5SDimitry Andricdef : Processor<"g3", G3Itineraries, [Directive750, 5530b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5540b57cec5SDimitry Andric FeatureMFTB]>; 5550b57cec5SDimitry Andricdef : Processor<"7400", G4Itineraries, [Directive7400, FeatureAltivec, 5560b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5570b57cec5SDimitry Andric FeatureMFTB]>; 5580b57cec5SDimitry Andricdef : Processor<"g4", G4Itineraries, [Directive7400, FeatureAltivec, 5590b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5600b57cec5SDimitry Andric FeatureMFTB]>; 5610b57cec5SDimitry Andricdef : Processor<"7450", G4PlusItineraries, [Directive7400, FeatureAltivec, 5620b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5630b57cec5SDimitry Andric FeatureMFTB]>; 5640b57cec5SDimitry Andricdef : Processor<"g4+", G4PlusItineraries, [Directive7400, FeatureAltivec, 5650b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5660b57cec5SDimitry Andric FeatureMFTB]>; 5670b57cec5SDimitry Andric 5680b57cec5SDimitry Andricdef : ProcessorModel<"970", G5Model, 5690b57cec5SDimitry Andric [Directive970, FeatureAltivec, 5700b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, 5710b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureSTFIWX, 5720b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 5730b57cec5SDimitry Andric FeatureMFTB]>; 5740b57cec5SDimitry Andricdef : ProcessorModel<"g5", G5Model, 5750b57cec5SDimitry Andric [Directive970, FeatureAltivec, 5760b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, FeatureSTFIWX, 5770b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 5780b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 5790b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 5800b57cec5SDimitry Andricdef : ProcessorModel<"e500", PPCE500Model, 5810b57cec5SDimitry Andric [DirectiveE500, 5820b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 5835b5f869eSDimitry Andric FeatureISEL, FeatureMFTB, FeatureMSYNC, FeatureSPE]>; 5840b57cec5SDimitry Andricdef : ProcessorModel<"e500mc", PPCE500mcModel, 5850b57cec5SDimitry Andric [DirectiveE500mc, 5860b57cec5SDimitry Andric FeatureSTFIWX, FeatureICBT, FeatureBookE, 5870b57cec5SDimitry Andric FeatureISEL, FeatureMFTB]>; 5880b57cec5SDimitry Andricdef : ProcessorModel<"e5500", PPCE5500Model, 5890b57cec5SDimitry Andric [DirectiveE5500, FeatureMFOCRF, Feature64Bit, 5900b57cec5SDimitry Andric FeatureSTFIWX, FeatureICBT, FeatureBookE, 5910b57cec5SDimitry Andric FeatureISEL, FeatureMFTB]>; 5920b57cec5SDimitry Andricdef : ProcessorModel<"a2", PPCA2Model, 5930b57cec5SDimitry Andric [DirectiveA2, FeatureICBT, FeatureBookE, FeatureMFOCRF, 5940b57cec5SDimitry Andric FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES, 5950b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec, 5960b57cec5SDimitry Andric FeatureSTFIWX, FeatureLFIWAX, 5970b57cec5SDimitry Andric FeatureFPRND, FeatureFPCVT, FeatureISEL, 5980b57cec5SDimitry Andric FeatureSlowPOPCNTD, FeatureCMPB, FeatureLDBRX, 599*81ad6265SDimitry Andric Feature64Bit /*, Feature64BitRegs */, FeatureMFTB, 600*81ad6265SDimitry Andric FeatureISA2_06]>; 6010b57cec5SDimitry Andricdef : ProcessorModel<"pwr3", G5Model, 6020b57cec5SDimitry Andric [DirectivePwr3, FeatureAltivec, 6030b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureMFOCRF, 6040b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit]>; 6050b57cec5SDimitry Andricdef : ProcessorModel<"pwr4", G5Model, 6060b57cec5SDimitry Andric [DirectivePwr4, FeatureAltivec, FeatureMFOCRF, 6070b57cec5SDimitry Andric FeatureFSqrt, FeatureFRES, FeatureFRSQRTE, 6080b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit, FeatureMFTB]>; 6090b57cec5SDimitry Andricdef : ProcessorModel<"pwr5", G5Model, 6100b57cec5SDimitry Andric [DirectivePwr5, FeatureAltivec, FeatureMFOCRF, 6110b57cec5SDimitry Andric FeatureFSqrt, FeatureFRE, FeatureFRES, 6120b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, 6130b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit, 6140b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 6150b57cec5SDimitry Andricdef : ProcessorModel<"pwr5x", G5Model, 6160b57cec5SDimitry Andric [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF, 6170b57cec5SDimitry Andric FeatureFSqrt, FeatureFRE, FeatureFRES, 6180b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, 6190b57cec5SDimitry Andric FeatureSTFIWX, FeatureFPRND, Feature64Bit, 6200b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 6210b57cec5SDimitry Andricdef : ProcessorModel<"pwr6", G5Model, 6220b57cec5SDimitry Andric [DirectivePwr6, FeatureAltivec, 6230b57cec5SDimitry Andric FeatureMFOCRF, FeatureFCPSGN, FeatureFSqrt, FeatureFRE, 6240b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureFRSQRTES, 6250b57cec5SDimitry Andric FeatureRecipPrec, FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB, 6260b57cec5SDimitry Andric FeatureFPRND, Feature64Bit /*, Feature64BitRegs */, 6270b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 6280b57cec5SDimitry Andricdef : ProcessorModel<"pwr6x", G5Model, 6290b57cec5SDimitry Andric [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF, 6300b57cec5SDimitry Andric FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES, 6310b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec, 6320b57cec5SDimitry Andric FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB, 6330b57cec5SDimitry Andric FeatureFPRND, Feature64Bit, 6340b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 635480093f4SDimitry Andricdef : ProcessorModel<"pwr7", P7Model, ProcessorFeatures.P7Features>; 636480093f4SDimitry Andricdef : ProcessorModel<"pwr8", P8Model, ProcessorFeatures.P8Features>; 637480093f4SDimitry Andricdef : ProcessorModel<"pwr9", P9Model, ProcessorFeatures.P9Features>; 638349cc55cSDimitry Andricdef : ProcessorModel<"pwr10", P10Model, ProcessorFeatures.P10Features>; 639480093f4SDimitry Andric// No scheduler model for future CPU. 640480093f4SDimitry Andricdef : ProcessorModel<"future", NoSchedModel, 641480093f4SDimitry Andric ProcessorFeatures.FutureFeatures>; 6420b57cec5SDimitry Andricdef : Processor<"ppc", G3Itineraries, [Directive32, FeatureHardFloat, 6430b57cec5SDimitry Andric FeatureMFTB]>; 6440b57cec5SDimitry Andricdef : Processor<"ppc32", G3Itineraries, [Directive32, FeatureHardFloat, 6450b57cec5SDimitry Andric FeatureMFTB]>; 6460b57cec5SDimitry Andricdef : ProcessorModel<"ppc64", G5Model, 6470b57cec5SDimitry Andric [Directive64, FeatureAltivec, 6480b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, FeatureFRES, 6490b57cec5SDimitry Andric FeatureFRSQRTE, FeatureSTFIWX, 6500b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 6510b57cec5SDimitry Andric FeatureMFTB]>; 652480093f4SDimitry Andricdef : ProcessorModel<"ppc64le", P8Model, ProcessorFeatures.P8Features>; 6530b57cec5SDimitry Andric 6540b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6550b57cec5SDimitry Andric// Calling Conventions 6560b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6570b57cec5SDimitry Andric 6580b57cec5SDimitry Andricinclude "PPCCallingConv.td" 6590b57cec5SDimitry Andric 6600b57cec5SDimitry Andricdef PPCInstrInfo : InstrInfo { 6610b57cec5SDimitry Andric let isLittleEndianEncoding = 1; 6620b57cec5SDimitry Andric 6630b57cec5SDimitry Andric // FIXME: Unset this when no longer needed! 6640b57cec5SDimitry Andric let decodePositionallyEncodedOperands = 1; 6650b57cec5SDimitry Andric 6660b57cec5SDimitry Andric let noNamedPositionallyEncodedOperands = 1; 6670b57cec5SDimitry Andric} 6680b57cec5SDimitry Andric 669e8d8bef9SDimitry Andricdef PPCAsmWriter : AsmWriter { 670e8d8bef9SDimitry Andric string AsmWriterClassName = "InstPrinter"; 671e8d8bef9SDimitry Andric int PassSubtarget = 1; 672e8d8bef9SDimitry Andric int Variant = 0; 673e8d8bef9SDimitry Andric bit isMCAsmWriter = 1; 674e8d8bef9SDimitry Andric} 675e8d8bef9SDimitry Andric 6760b57cec5SDimitry Andricdef PPCAsmParser : AsmParser { 6770b57cec5SDimitry Andric let ShouldEmitMatchRegisterName = 0; 6780b57cec5SDimitry Andric} 6790b57cec5SDimitry Andric 6800b57cec5SDimitry Andricdef PPCAsmParserVariant : AsmParserVariant { 6810b57cec5SDimitry Andric int Variant = 0; 6820b57cec5SDimitry Andric 6830b57cec5SDimitry Andric // We do not use hard coded registers in asm strings. However, some 6840b57cec5SDimitry Andric // InstAlias definitions use immediate literals. Set RegisterPrefix 6850b57cec5SDimitry Andric // so that those are not misinterpreted as registers. 6860b57cec5SDimitry Andric string RegisterPrefix = "%"; 6870b57cec5SDimitry Andric string BreakCharacters = "."; 6880b57cec5SDimitry Andric} 6890b57cec5SDimitry Andric 6900b57cec5SDimitry Andricdef PPC : Target { 6910b57cec5SDimitry Andric // Information about the instructions. 6920b57cec5SDimitry Andric let InstructionSet = PPCInstrInfo; 6930b57cec5SDimitry Andric 694e8d8bef9SDimitry Andric let AssemblyWriters = [PPCAsmWriter]; 6950b57cec5SDimitry Andric let AssemblyParsers = [PPCAsmParser]; 6960b57cec5SDimitry Andric let AssemblyParserVariants = [PPCAsmParserVariant]; 6970b57cec5SDimitry Andric let AllowRegisterRenaming = 1; 6980b57cec5SDimitry Andric} 6990b57cec5SDimitry Andric 7000b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7010b57cec5SDimitry Andric// Pfm Counters 7020b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7030b57cec5SDimitry Andric 7040b57cec5SDimitry Andricinclude "PPCPfmCounters.td" 705