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", "">; 54*5ffd83dbSDimitry 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">; 600b57cec5SDimitry Andricdef FeatureHardFloat : SubtargetFeature<"hard-float", "HasHardFloat", "true", 610b57cec5SDimitry Andric "Enable floating-point instructions">; 620b57cec5SDimitry Andricdef Feature64BitRegs : SubtargetFeature<"64bitregs","Use64BitRegs", "true", 630b57cec5SDimitry Andric "Enable 64-bit registers usage for ppc32 [beta]">; 640b57cec5SDimitry Andricdef FeatureCRBits : SubtargetFeature<"crbits", "UseCRBits", "true", 650b57cec5SDimitry Andric "Use condition-register bits individually">; 660b57cec5SDimitry Andricdef FeatureFPU : SubtargetFeature<"fpu","HasFPU","true", 670b57cec5SDimitry Andric "Enable classic FPU instructions", 680b57cec5SDimitry Andric [FeatureHardFloat]>; 690b57cec5SDimitry Andricdef FeatureAltivec : SubtargetFeature<"altivec","HasAltivec", "true", 700b57cec5SDimitry Andric "Enable Altivec instructions", 710b57cec5SDimitry Andric [FeatureFPU]>; 720b57cec5SDimitry Andricdef FeatureSPE : SubtargetFeature<"spe","HasSPE", "true", 730b57cec5SDimitry Andric "Enable SPE instructions", 740b57cec5SDimitry Andric [FeatureHardFloat]>; 750b57cec5SDimitry Andricdef FeatureMFOCRF : SubtargetFeature<"mfocrf","HasMFOCRF", "true", 760b57cec5SDimitry Andric "Enable the MFOCRF instruction">; 770b57cec5SDimitry Andricdef FeatureFSqrt : SubtargetFeature<"fsqrt","HasFSQRT", "true", 780b57cec5SDimitry Andric "Enable the fsqrt instruction", 790b57cec5SDimitry Andric [FeatureFPU]>; 800b57cec5SDimitry Andricdef FeatureFCPSGN : SubtargetFeature<"fcpsgn", "HasFCPSGN", "true", 810b57cec5SDimitry Andric "Enable the fcpsgn instruction", 820b57cec5SDimitry Andric [FeatureFPU]>; 830b57cec5SDimitry Andricdef FeatureFRE : SubtargetFeature<"fre", "HasFRE", "true", 840b57cec5SDimitry Andric "Enable the fre instruction", 850b57cec5SDimitry Andric [FeatureFPU]>; 860b57cec5SDimitry Andricdef FeatureFRES : SubtargetFeature<"fres", "HasFRES", "true", 870b57cec5SDimitry Andric "Enable the fres instruction", 880b57cec5SDimitry Andric [FeatureFPU]>; 890b57cec5SDimitry Andricdef FeatureFRSQRTE : SubtargetFeature<"frsqrte", "HasFRSQRTE", "true", 900b57cec5SDimitry Andric "Enable the frsqrte instruction", 910b57cec5SDimitry Andric [FeatureFPU]>; 920b57cec5SDimitry Andricdef FeatureFRSQRTES : SubtargetFeature<"frsqrtes", "HasFRSQRTES", "true", 930b57cec5SDimitry Andric "Enable the frsqrtes instruction", 940b57cec5SDimitry Andric [FeatureFPU]>; 950b57cec5SDimitry Andricdef FeatureRecipPrec : SubtargetFeature<"recipprec", "HasRecipPrec", "true", 960b57cec5SDimitry Andric "Assume higher precision reciprocal estimates">; 970b57cec5SDimitry Andricdef FeatureSTFIWX : SubtargetFeature<"stfiwx","HasSTFIWX", "true", 980b57cec5SDimitry Andric "Enable the stfiwx instruction", 990b57cec5SDimitry Andric [FeatureFPU]>; 1000b57cec5SDimitry Andricdef FeatureLFIWAX : SubtargetFeature<"lfiwax","HasLFIWAX", "true", 1010b57cec5SDimitry Andric "Enable the lfiwax instruction", 1020b57cec5SDimitry Andric [FeatureFPU]>; 1030b57cec5SDimitry Andricdef FeatureFPRND : SubtargetFeature<"fprnd", "HasFPRND", "true", 1040b57cec5SDimitry Andric "Enable the fri[mnpz] instructions", 1050b57cec5SDimitry Andric [FeatureFPU]>; 1060b57cec5SDimitry Andricdef FeatureFPCVT : SubtargetFeature<"fpcvt", "HasFPCVT", "true", 1070b57cec5SDimitry Andric "Enable fc[ft]* (unsigned and single-precision) and lfiwzx instructions", 1080b57cec5SDimitry Andric [FeatureFPU]>; 1090b57cec5SDimitry Andricdef FeatureISEL : SubtargetFeature<"isel","HasISEL", "true", 1100b57cec5SDimitry Andric "Enable the isel instruction">; 1110b57cec5SDimitry Andricdef FeatureBPERMD : SubtargetFeature<"bpermd", "HasBPERMD", "true", 1120b57cec5SDimitry Andric "Enable the bpermd instruction">; 1130b57cec5SDimitry Andricdef FeatureExtDiv : SubtargetFeature<"extdiv", "HasExtDiv", "true", 1140b57cec5SDimitry Andric "Enable extended divide instructions">; 1150b57cec5SDimitry Andricdef FeatureLDBRX : SubtargetFeature<"ldbrx","HasLDBRX", "true", 1160b57cec5SDimitry Andric "Enable the ldbrx instruction">; 1170b57cec5SDimitry Andricdef FeatureCMPB : SubtargetFeature<"cmpb", "HasCMPB", "true", 1180b57cec5SDimitry Andric "Enable the cmpb instruction">; 1190b57cec5SDimitry Andricdef FeatureICBT : SubtargetFeature<"icbt","HasICBT", "true", 1200b57cec5SDimitry Andric "Enable icbt instruction">; 1210b57cec5SDimitry Andricdef FeatureBookE : SubtargetFeature<"booke", "IsBookE", "true", 1220b57cec5SDimitry Andric "Enable Book E instructions", 1230b57cec5SDimitry Andric [FeatureICBT]>; 1240b57cec5SDimitry Andricdef FeatureMSYNC : SubtargetFeature<"msync", "HasOnlyMSYNC", "true", 1250b57cec5SDimitry Andric "Has only the msync instruction instead of sync", 1260b57cec5SDimitry Andric [FeatureBookE]>; 1270b57cec5SDimitry Andricdef FeatureE500 : SubtargetFeature<"e500", "IsE500", "true", 1280b57cec5SDimitry Andric "Enable E500/E500mc instructions">; 1290b57cec5SDimitry Andricdef FeatureSecurePlt : SubtargetFeature<"secure-plt","SecurePlt", "true", 1300b57cec5SDimitry Andric "Enable secure plt mode">; 1310b57cec5SDimitry Andricdef FeaturePPC4xx : SubtargetFeature<"ppc4xx", "IsPPC4xx", "true", 1320b57cec5SDimitry Andric "Enable PPC 4xx instructions">; 1330b57cec5SDimitry Andricdef FeaturePPC6xx : SubtargetFeature<"ppc6xx", "IsPPC6xx", "true", 1340b57cec5SDimitry Andric "Enable PPC 6xx instructions">; 1350b57cec5SDimitry Andricdef FeatureQPX : SubtargetFeature<"qpx","HasQPX", "true", 1360b57cec5SDimitry Andric "Enable QPX instructions", 1370b57cec5SDimitry Andric [FeatureFPU]>; 1380b57cec5SDimitry Andricdef FeatureVSX : SubtargetFeature<"vsx","HasVSX", "true", 1390b57cec5SDimitry Andric "Enable VSX instructions", 1400b57cec5SDimitry Andric [FeatureAltivec]>; 1410b57cec5SDimitry Andricdef FeatureTwoConstNR : 1420b57cec5SDimitry Andric SubtargetFeature<"two-const-nr", "NeedsTwoConstNR", "true", 1430b57cec5SDimitry Andric "Requires two constant Newton-Raphson computation">; 1440b57cec5SDimitry Andricdef FeatureP8Altivec : SubtargetFeature<"power8-altivec", "HasP8Altivec", "true", 1450b57cec5SDimitry Andric "Enable POWER8 Altivec instructions", 1460b57cec5SDimitry Andric [FeatureAltivec]>; 1470b57cec5SDimitry Andricdef FeatureP8Crypto : SubtargetFeature<"crypto", "HasP8Crypto", "true", 1480b57cec5SDimitry Andric "Enable POWER8 Crypto instructions", 1490b57cec5SDimitry Andric [FeatureP8Altivec]>; 1500b57cec5SDimitry Andricdef FeatureP8Vector : SubtargetFeature<"power8-vector", "HasP8Vector", "true", 1510b57cec5SDimitry Andric "Enable POWER8 vector instructions", 1520b57cec5SDimitry Andric [FeatureVSX, FeatureP8Altivec]>; 1530b57cec5SDimitry Andricdef FeatureDirectMove : 1540b57cec5SDimitry Andric SubtargetFeature<"direct-move", "HasDirectMove", "true", 1550b57cec5SDimitry Andric "Enable Power8 direct move instructions", 1560b57cec5SDimitry Andric [FeatureVSX]>; 1570b57cec5SDimitry Andricdef FeaturePartwordAtomic : SubtargetFeature<"partword-atomics", 1580b57cec5SDimitry Andric "HasPartwordAtomics", "true", 1590b57cec5SDimitry Andric "Enable l[bh]arx and st[bh]cx.">; 1600b57cec5SDimitry Andricdef FeatureInvariantFunctionDescriptors : 1610b57cec5SDimitry Andric SubtargetFeature<"invariant-function-descriptors", 1620b57cec5SDimitry Andric "HasInvariantFunctionDescriptors", "true", 1630b57cec5SDimitry Andric "Assume function descriptors are invariant">; 1640b57cec5SDimitry Andricdef FeatureLongCall : SubtargetFeature<"longcall", "UseLongCalls", "true", 1650b57cec5SDimitry Andric "Always use indirect calls">; 1660b57cec5SDimitry Andricdef FeatureHTM : SubtargetFeature<"htm", "HasHTM", "true", 1670b57cec5SDimitry Andric "Enable Hardware Transactional Memory instructions">; 1680b57cec5SDimitry Andricdef FeatureMFTB : SubtargetFeature<"", "FeatureMFTB", "true", 1690b57cec5SDimitry Andric "Implement mftb using the mfspr instruction">; 170*5ffd83dbSDimitry Andricdef FeatureFusion : SubtargetFeature<"fusion", "HasFusion", "true", 171*5ffd83dbSDimitry Andric "Target supports instruction fusion">; 172*5ffd83dbSDimitry Andricdef FeatureAddiLoadFusion : SubtargetFeature<"fuse-addi-load", 173*5ffd83dbSDimitry Andric "HasAddiLoadFusion", "true", 174*5ffd83dbSDimitry Andric "Power8 Addi-Load fusion", 175*5ffd83dbSDimitry Andric [FeatureFusion]>; 176*5ffd83dbSDimitry Andricdef FeatureAddisLoadFusion : SubtargetFeature<"fuse-addis-load", 177*5ffd83dbSDimitry Andric "HasAddisLoadFusion", "true", 178*5ffd83dbSDimitry Andric "Power8 Addis-Load fusion", 179*5ffd83dbSDimitry Andric [FeatureFusion]>; 1800946e70aSDimitry Andricdef FeatureUnalignedFloats : 1810946e70aSDimitry Andric SubtargetFeature<"allow-unaligned-fp-access", "AllowsUnalignedFPAccess", 1820946e70aSDimitry Andric "true", "CPU does not trap on unaligned FP access">; 1830b57cec5SDimitry Andricdef FeaturePPCPreRASched: 1840b57cec5SDimitry Andric SubtargetFeature<"ppc-prera-sched", "UsePPCPreRASchedStrategy", "true", 1850b57cec5SDimitry Andric "Use PowerPC pre-RA scheduling strategy">; 1860b57cec5SDimitry Andricdef FeaturePPCPostRASched: 1870b57cec5SDimitry Andric SubtargetFeature<"ppc-postra-sched", "UsePPCPostRASchedStrategy", "true", 1880b57cec5SDimitry Andric "Use PowerPC post-RA scheduling strategy">; 1890b57cec5SDimitry Andricdef FeatureFloat128 : 1900b57cec5SDimitry Andric SubtargetFeature<"float128", "HasFloat128", "true", 1910b57cec5SDimitry Andric "Enable the __float128 data type for IEEE-754R Binary128.", 1920b57cec5SDimitry Andric [FeatureVSX]>; 1930b57cec5SDimitry Andricdef FeaturePOPCNTD : SubtargetFeature<"popcntd","HasPOPCNTD", 1940b57cec5SDimitry Andric "POPCNTD_Fast", 1950b57cec5SDimitry Andric "Enable the popcnt[dw] instructions">; 1960b57cec5SDimitry Andric// Note that for the a2/a2q processor models we should not use popcnt[dw] by 1970b57cec5SDimitry Andric// default. These processors do support the instructions, but they're 1980b57cec5SDimitry Andric// microcoded, and the software emulation is about twice as fast. 1990b57cec5SDimitry Andricdef FeatureSlowPOPCNTD : SubtargetFeature<"slow-popcntd","HasPOPCNTD", 2000b57cec5SDimitry Andric "POPCNTD_Slow", 2010b57cec5SDimitry Andric "Has slow popcnt[dw] instructions">; 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andricdef DeprecatedDST : SubtargetFeature<"", "DeprecatedDST", "true", 2040b57cec5SDimitry Andric "Treat vector data stream cache control instructions as deprecated">; 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andricdef FeatureISA3_0 : SubtargetFeature<"isa-v30-instructions", "IsISA3_0", 2070b57cec5SDimitry Andric "true", 208*5ffd83dbSDimitry Andric "Enable instructions in ISA 3.0.">; 209*5ffd83dbSDimitry Andricdef FeatureISA3_1 : SubtargetFeature<"isa-v31-instructions", "IsISA3_1", 210*5ffd83dbSDimitry Andric "true", 211*5ffd83dbSDimitry Andric "Enable instructions in ISA 3.1.", 212*5ffd83dbSDimitry Andric [FeatureISA3_0]>; 2130b57cec5SDimitry Andricdef FeatureP9Altivec : SubtargetFeature<"power9-altivec", "HasP9Altivec", "true", 2140b57cec5SDimitry Andric "Enable POWER9 Altivec instructions", 2150b57cec5SDimitry Andric [FeatureISA3_0, FeatureP8Altivec]>; 2160b57cec5SDimitry Andricdef FeatureP9Vector : SubtargetFeature<"power9-vector", "HasP9Vector", "true", 2170b57cec5SDimitry Andric "Enable POWER9 vector instructions", 2180b57cec5SDimitry Andric [FeatureISA3_0, FeatureP8Vector, 2190b57cec5SDimitry Andric FeatureP9Altivec]>; 220*5ffd83dbSDimitry Andricdef FeatureP10Vector : SubtargetFeature<"power10-vector", "HasP10Vector", 221*5ffd83dbSDimitry Andric "true", 222*5ffd83dbSDimitry Andric "Enable POWER10 vector instructions", 223*5ffd83dbSDimitry Andric [FeatureISA3_1, FeatureP9Vector]>; 2240b57cec5SDimitry Andric// A separate feature for this even though it is equivalent to P9Vector 2250b57cec5SDimitry Andric// because this is a feature of the implementation rather than the architecture 2260b57cec5SDimitry Andric// and may go away with future CPU's. 2270b57cec5SDimitry Andricdef FeatureVectorsUseTwoUnits : SubtargetFeature<"vectors-use-two-units", 2280b57cec5SDimitry Andric "VectorsUseTwoUnits", 2290b57cec5SDimitry Andric "true", 2300b57cec5SDimitry Andric "Vectors use two units">; 231*5ffd83dbSDimitry Andricdef FeaturePrefixInstrs : SubtargetFeature<"prefix-instrs", "HasPrefixInstrs", 232*5ffd83dbSDimitry Andric "true", 233*5ffd83dbSDimitry Andric "Enable prefixed instructions", 234*5ffd83dbSDimitry Andric [FeatureISA3_0, FeatureP8Vector, 235*5ffd83dbSDimitry Andric FeatureP9Altivec]>; 236*5ffd83dbSDimitry Andricdef FeaturePCRelativeMemops : 237*5ffd83dbSDimitry Andric SubtargetFeature<"pcrelative-memops", "HasPCRelativeMemops", "true", 238*5ffd83dbSDimitry Andric "Enable PC relative Memory Ops", 239*5ffd83dbSDimitry Andric [FeatureISA3_0]>; 240*5ffd83dbSDimitry Andric 241*5ffd83dbSDimitry Andricdef FeaturePredictableSelectIsExpensive : 242*5ffd83dbSDimitry Andric SubtargetFeature<"predictable-select-expensive", 243*5ffd83dbSDimitry Andric "PredictableSelectIsExpensive", 244*5ffd83dbSDimitry Andric "true", 245*5ffd83dbSDimitry Andric "Prefer likely predicted branches over selects">; 2460b57cec5SDimitry Andric 2470b57cec5SDimitry Andric// Since new processors generally contain a superset of features of those that 2480b57cec5SDimitry Andric// came before them, the idea is to make implementations of new processors 2490b57cec5SDimitry Andric// less error prone and easier to read. 2500b57cec5SDimitry Andric// Namely: 251480093f4SDimitry Andric// list<SubtargetFeature> P8InheritableFeatures = ... 252480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorAddtionalFeatures = 253480093f4SDimitry Andric// [ features that Power8 does not support but inheritable ] 254480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorSpecificFeatures = 255480093f4SDimitry Andric// [ features that Power8 does not support and not inheritable ] 256480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorInheritableFeatures = 257480093f4SDimitry Andric// !listconcat(P8InheritableFeatures, FutureProcessorAddtionalFeatures) 258480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorFeatures = 259480093f4SDimitry Andric// !listconcat(FutureProcessorInheritableFeatures, 260480093f4SDimitry Andric// FutureProcessorSpecificFeatures) 2610b57cec5SDimitry Andric 262*5ffd83dbSDimitry Andric// Makes it explicit and obvious what is new in FutureProcessor vs. Power8 as 2630b57cec5SDimitry Andric// well as providing a single point of definition if the feature set will be 2640b57cec5SDimitry Andric// used elsewhere. 2650b57cec5SDimitry Andricdef ProcessorFeatures { 266480093f4SDimitry Andric // Power7 267480093f4SDimitry Andric list<SubtargetFeature> P7InheritableFeatures = [DirectivePwr7, 268480093f4SDimitry Andric FeatureAltivec, 269480093f4SDimitry Andric FeatureVSX, 270480093f4SDimitry Andric FeatureMFOCRF, 271480093f4SDimitry Andric FeatureFCPSGN, 272480093f4SDimitry Andric FeatureFSqrt, 273480093f4SDimitry Andric FeatureFRE, 274480093f4SDimitry Andric FeatureFRES, 275480093f4SDimitry Andric FeatureFRSQRTE, 276480093f4SDimitry Andric FeatureFRSQRTES, 277480093f4SDimitry Andric FeatureRecipPrec, 278480093f4SDimitry Andric FeatureSTFIWX, 279480093f4SDimitry Andric FeatureLFIWAX, 280480093f4SDimitry Andric FeatureFPRND, 281480093f4SDimitry Andric FeatureFPCVT, 282480093f4SDimitry Andric FeatureISEL, 283480093f4SDimitry Andric FeaturePOPCNTD, 284480093f4SDimitry Andric FeatureCMPB, 285480093f4SDimitry Andric FeatureLDBRX, 286480093f4SDimitry Andric Feature64Bit, 287480093f4SDimitry Andric /* Feature64BitRegs, */ 288480093f4SDimitry Andric FeatureBPERMD, 289480093f4SDimitry Andric FeatureExtDiv, 290480093f4SDimitry Andric FeatureMFTB, 291480093f4SDimitry Andric DeprecatedDST, 2920946e70aSDimitry Andric FeatureTwoConstNR, 2930946e70aSDimitry Andric FeatureUnalignedFloats]; 294480093f4SDimitry Andric list<SubtargetFeature> P7SpecificFeatures = []; 295480093f4SDimitry Andric list<SubtargetFeature> P7Features = 296480093f4SDimitry Andric !listconcat(P7InheritableFeatures, P7SpecificFeatures); 297480093f4SDimitry Andric 298480093f4SDimitry Andric // Power8 299*5ffd83dbSDimitry Andric list<SubtargetFeature> P8AdditionalFeatures = 300*5ffd83dbSDimitry Andric [DirectivePwr8, 301480093f4SDimitry Andric FeatureP8Altivec, 302480093f4SDimitry Andric FeatureP8Vector, 303480093f4SDimitry Andric FeatureP8Crypto, 304480093f4SDimitry Andric FeatureHTM, 305480093f4SDimitry Andric FeatureDirectMove, 306480093f4SDimitry Andric FeatureICBT, 307*5ffd83dbSDimitry Andric FeaturePartwordAtomic, 308*5ffd83dbSDimitry Andric FeaturePredictableSelectIsExpensive 309*5ffd83dbSDimitry Andric ]; 310*5ffd83dbSDimitry Andric 311*5ffd83dbSDimitry Andric list<SubtargetFeature> P8SpecificFeatures = [FeatureAddiLoadFusion, 312*5ffd83dbSDimitry Andric FeatureAddisLoadFusion]; 313480093f4SDimitry Andric list<SubtargetFeature> P8InheritableFeatures = 314480093f4SDimitry Andric !listconcat(P7InheritableFeatures, P8AdditionalFeatures); 315480093f4SDimitry Andric list<SubtargetFeature> P8Features = 316480093f4SDimitry Andric !listconcat(P8InheritableFeatures, P8SpecificFeatures); 317480093f4SDimitry Andric 318480093f4SDimitry Andric // Power9 319*5ffd83dbSDimitry Andric list<SubtargetFeature> P9AdditionalFeatures = 320*5ffd83dbSDimitry Andric [DirectivePwr9, 321480093f4SDimitry Andric FeatureP9Altivec, 322480093f4SDimitry Andric FeatureP9Vector, 323*5ffd83dbSDimitry Andric FeatureISA3_0, 324*5ffd83dbSDimitry Andric FeaturePredictableSelectIsExpensive 325*5ffd83dbSDimitry Andric ]; 326*5ffd83dbSDimitry Andric 327480093f4SDimitry Andric // Some features are unique to Power9 and there is no reason to assume 328480093f4SDimitry Andric // they will be part of any future CPUs. One example is the narrower 329480093f4SDimitry Andric // dispatch for vector operations than scalar ones. For the time being, 330480093f4SDimitry Andric // this list also includes scheduling-related features since we do not have 331480093f4SDimitry Andric // enough info to create custom scheduling strategies for future CPUs. 332480093f4SDimitry Andric list<SubtargetFeature> P9SpecificFeatures = [FeatureVectorsUseTwoUnits, 333480093f4SDimitry Andric FeaturePPCPreRASched, 334480093f4SDimitry Andric FeaturePPCPostRASched]; 335480093f4SDimitry Andric list<SubtargetFeature> P9InheritableFeatures = 336480093f4SDimitry Andric !listconcat(P8InheritableFeatures, P9AdditionalFeatures); 337480093f4SDimitry Andric list<SubtargetFeature> P9Features = 338480093f4SDimitry Andric !listconcat(P9InheritableFeatures, P9SpecificFeatures); 339480093f4SDimitry Andric 340*5ffd83dbSDimitry Andric // Power10 341*5ffd83dbSDimitry Andric // For P10 CPU we assume that all of the existing features from Power9 342480093f4SDimitry Andric // still exist with the exception of those we know are Power9 specific. 343*5ffd83dbSDimitry Andric list<SubtargetFeature> P10AdditionalFeatures = 344*5ffd83dbSDimitry Andric [DirectivePwr10, FeatureISA3_1, FeaturePrefixInstrs, 345*5ffd83dbSDimitry Andric FeaturePCRelativeMemops, FeatureP10Vector]; 346*5ffd83dbSDimitry Andric list<SubtargetFeature> P10SpecificFeatures = []; 347*5ffd83dbSDimitry Andric list<SubtargetFeature> P10InheritableFeatures = 348*5ffd83dbSDimitry Andric !listconcat(P9InheritableFeatures, P10AdditionalFeatures); 349*5ffd83dbSDimitry Andric list<SubtargetFeature> P10Features = 350*5ffd83dbSDimitry Andric !listconcat(P10InheritableFeatures, P10SpecificFeatures); 351*5ffd83dbSDimitry Andric 352*5ffd83dbSDimitry Andric // Future 353*5ffd83dbSDimitry Andric // For future CPU we assume that all of the existing features from Power10 354*5ffd83dbSDimitry Andric // still exist with the exception of those we know are Power10 specific. 355480093f4SDimitry Andric list<SubtargetFeature> FutureAdditionalFeatures = []; 356480093f4SDimitry Andric list<SubtargetFeature> FutureSpecificFeatures = []; 357480093f4SDimitry Andric list<SubtargetFeature> FutureInheritableFeatures = 358*5ffd83dbSDimitry Andric !listconcat(P10InheritableFeatures, FutureAdditionalFeatures); 359480093f4SDimitry Andric list<SubtargetFeature> FutureFeatures = 360480093f4SDimitry Andric !listconcat(FutureInheritableFeatures, FutureSpecificFeatures); 3610b57cec5SDimitry Andric} 3620b57cec5SDimitry Andric 3630b57cec5SDimitry Andric// Note: Future features to add when support is extended to more 3640b57cec5SDimitry Andric// recent ISA levels: 3650b57cec5SDimitry Andric// 3660b57cec5SDimitry Andric// DFP p6, p6x, p7 decimal floating-point instructions 3670b57cec5SDimitry Andric// POPCNTB p5 through p7 popcntb and related instructions 3680b57cec5SDimitry Andric 3690b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3700b57cec5SDimitry Andric// Classes used for relation maps. 3710b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3720b57cec5SDimitry Andric// RecFormRel - Filter class used to relate non-record-form instructions with 3730b57cec5SDimitry Andric// their record-form variants. 3740b57cec5SDimitry Andricclass RecFormRel; 3750b57cec5SDimitry Andric 3760b57cec5SDimitry Andric// AltVSXFMARel - Filter class used to relate the primary addend-killing VSX 3770b57cec5SDimitry Andric// FMA instruction forms with their corresponding factor-killing forms. 3780b57cec5SDimitry Andricclass AltVSXFMARel { 3790b57cec5SDimitry Andric bit IsVSXFMAAlt = 0; 3800b57cec5SDimitry Andric} 3810b57cec5SDimitry Andric 3820b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3830b57cec5SDimitry Andric// Relation Map Definitions. 3840b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3850b57cec5SDimitry Andric 3860b57cec5SDimitry Andricdef getRecordFormOpcode : InstrMapping { 3870b57cec5SDimitry Andric let FilterClass = "RecFormRel"; 3880b57cec5SDimitry Andric // Instructions with the same BaseName and Interpretation64Bit values 3890b57cec5SDimitry Andric // form a row. 3900b57cec5SDimitry Andric let RowFields = ["BaseName", "Interpretation64Bit"]; 3910b57cec5SDimitry Andric // Instructions with the same RC value form a column. 3920b57cec5SDimitry Andric let ColFields = ["RC"]; 3930b57cec5SDimitry Andric // The key column are the non-record-form instructions. 3940b57cec5SDimitry Andric let KeyCol = ["0"]; 3950b57cec5SDimitry Andric // Value columns RC=1 3960b57cec5SDimitry Andric let ValueCols = [["1"]]; 3970b57cec5SDimitry Andric} 3980b57cec5SDimitry Andric 3990b57cec5SDimitry Andricdef getNonRecordFormOpcode : InstrMapping { 4000b57cec5SDimitry Andric let FilterClass = "RecFormRel"; 4010b57cec5SDimitry Andric // Instructions with the same BaseName and Interpretation64Bit values 4020b57cec5SDimitry Andric // form a row. 4030b57cec5SDimitry Andric let RowFields = ["BaseName", "Interpretation64Bit"]; 4040b57cec5SDimitry Andric // Instructions with the same RC value form a column. 4050b57cec5SDimitry Andric let ColFields = ["RC"]; 4060b57cec5SDimitry Andric // The key column are the record-form instructions. 4070b57cec5SDimitry Andric let KeyCol = ["1"]; 4080b57cec5SDimitry Andric // Value columns are RC=0 4090b57cec5SDimitry Andric let ValueCols = [["0"]]; 4100b57cec5SDimitry Andric} 4110b57cec5SDimitry Andric 4120b57cec5SDimitry Andricdef getAltVSXFMAOpcode : InstrMapping { 4130b57cec5SDimitry Andric let FilterClass = "AltVSXFMARel"; 4140b57cec5SDimitry Andric // Instructions with the same BaseName value form a row. 4150b57cec5SDimitry Andric let RowFields = ["BaseName"]; 4160b57cec5SDimitry Andric // Instructions with the same IsVSXFMAAlt value form a column. 4170b57cec5SDimitry Andric let ColFields = ["IsVSXFMAAlt"]; 4180b57cec5SDimitry Andric // The key column are the (default) addend-killing instructions. 4190b57cec5SDimitry Andric let KeyCol = ["0"]; 4200b57cec5SDimitry Andric // Value columns IsVSXFMAAlt=1 4210b57cec5SDimitry Andric let ValueCols = [["1"]]; 4220b57cec5SDimitry Andric} 4230b57cec5SDimitry Andric 4240b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4250b57cec5SDimitry Andric// Register File Description 4260b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4270b57cec5SDimitry Andric 4280b57cec5SDimitry Andricinclude "PPCRegisterInfo.td" 4290b57cec5SDimitry Andricinclude "PPCSchedule.td" 4300b57cec5SDimitry Andric 4310b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4320b57cec5SDimitry Andric// PowerPC processors supported. 4330b57cec5SDimitry Andric// 4340b57cec5SDimitry Andric 4350b57cec5SDimitry Andricdef : Processor<"generic", G3Itineraries, [Directive32, FeatureHardFloat, 4360b57cec5SDimitry Andric FeatureMFTB]>; 4370b57cec5SDimitry Andricdef : ProcessorModel<"440", PPC440Model, [Directive440, FeatureISEL, 4380b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4390b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 4400b57cec5SDimitry Andric FeatureMSYNC, FeatureMFTB]>; 4410b57cec5SDimitry Andricdef : ProcessorModel<"450", PPC440Model, [Directive440, FeatureISEL, 4420b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4430b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 4440b57cec5SDimitry Andric FeatureMSYNC, FeatureMFTB]>; 4450b57cec5SDimitry Andricdef : Processor<"601", G3Itineraries, [Directive601, FeatureFPU]>; 4460b57cec5SDimitry Andricdef : Processor<"602", G3Itineraries, [Directive602, FeatureFPU, 4470b57cec5SDimitry Andric FeatureMFTB]>; 4480b57cec5SDimitry Andricdef : Processor<"603", G3Itineraries, [Directive603, 4490b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4500b57cec5SDimitry Andric FeatureMFTB]>; 4510b57cec5SDimitry Andricdef : Processor<"603e", G3Itineraries, [Directive603, 4520b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4530b57cec5SDimitry Andric FeatureMFTB]>; 4540b57cec5SDimitry Andricdef : Processor<"603ev", G3Itineraries, [Directive603, 4550b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4560b57cec5SDimitry Andric FeatureMFTB]>; 4570b57cec5SDimitry Andricdef : Processor<"604", G3Itineraries, [Directive604, 4580b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4590b57cec5SDimitry Andric FeatureMFTB]>; 4600b57cec5SDimitry Andricdef : Processor<"604e", G3Itineraries, [Directive604, 4610b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4620b57cec5SDimitry Andric FeatureMFTB]>; 4630b57cec5SDimitry Andricdef : Processor<"620", G3Itineraries, [Directive620, 4640b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4650b57cec5SDimitry Andric FeatureMFTB]>; 4660b57cec5SDimitry Andricdef : Processor<"750", G4Itineraries, [Directive750, 4670b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4680b57cec5SDimitry Andric FeatureMFTB]>; 4690b57cec5SDimitry Andricdef : Processor<"g3", G3Itineraries, [Directive750, 4700b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4710b57cec5SDimitry Andric FeatureMFTB]>; 4720b57cec5SDimitry Andricdef : Processor<"7400", G4Itineraries, [Directive7400, FeatureAltivec, 4730b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4740b57cec5SDimitry Andric FeatureMFTB]>; 4750b57cec5SDimitry Andricdef : Processor<"g4", G4Itineraries, [Directive7400, FeatureAltivec, 4760b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4770b57cec5SDimitry Andric FeatureMFTB]>; 4780b57cec5SDimitry Andricdef : Processor<"7450", G4PlusItineraries, [Directive7400, FeatureAltivec, 4790b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4800b57cec5SDimitry Andric FeatureMFTB]>; 4810b57cec5SDimitry Andricdef : Processor<"g4+", G4PlusItineraries, [Directive7400, FeatureAltivec, 4820b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4830b57cec5SDimitry Andric FeatureMFTB]>; 4840b57cec5SDimitry Andric 4850b57cec5SDimitry Andricdef : ProcessorModel<"970", G5Model, 4860b57cec5SDimitry Andric [Directive970, FeatureAltivec, 4870b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, 4880b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureSTFIWX, 4890b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 4900b57cec5SDimitry Andric FeatureMFTB]>; 4910b57cec5SDimitry Andricdef : ProcessorModel<"g5", G5Model, 4920b57cec5SDimitry Andric [Directive970, FeatureAltivec, 4930b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, FeatureSTFIWX, 4940b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4950b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 4960b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 4970b57cec5SDimitry Andricdef : ProcessorModel<"e500", PPCE500Model, 4980b57cec5SDimitry Andric [DirectiveE500, 4990b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 5005b5f869eSDimitry Andric FeatureISEL, FeatureMFTB, FeatureMSYNC, FeatureSPE]>; 5010b57cec5SDimitry Andricdef : ProcessorModel<"e500mc", PPCE500mcModel, 5020b57cec5SDimitry Andric [DirectiveE500mc, 5030b57cec5SDimitry Andric FeatureSTFIWX, FeatureICBT, FeatureBookE, 5040b57cec5SDimitry Andric FeatureISEL, FeatureMFTB]>; 5050b57cec5SDimitry Andricdef : ProcessorModel<"e5500", PPCE5500Model, 5060b57cec5SDimitry Andric [DirectiveE5500, FeatureMFOCRF, Feature64Bit, 5070b57cec5SDimitry Andric FeatureSTFIWX, FeatureICBT, FeatureBookE, 5080b57cec5SDimitry Andric FeatureISEL, FeatureMFTB]>; 5090b57cec5SDimitry Andricdef : ProcessorModel<"a2", PPCA2Model, 5100b57cec5SDimitry Andric [DirectiveA2, FeatureICBT, FeatureBookE, FeatureMFOCRF, 5110b57cec5SDimitry Andric FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES, 5120b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec, 5130b57cec5SDimitry Andric FeatureSTFIWX, FeatureLFIWAX, 5140b57cec5SDimitry Andric FeatureFPRND, FeatureFPCVT, FeatureISEL, 5150b57cec5SDimitry Andric FeatureSlowPOPCNTD, FeatureCMPB, FeatureLDBRX, 5160b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, FeatureMFTB]>; 5170b57cec5SDimitry Andricdef : ProcessorModel<"a2q", PPCA2Model, 5180b57cec5SDimitry Andric [DirectiveA2, FeatureICBT, FeatureBookE, FeatureMFOCRF, 5190b57cec5SDimitry Andric FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES, 5200b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec, 5210b57cec5SDimitry Andric FeatureSTFIWX, FeatureLFIWAX, 5220b57cec5SDimitry Andric FeatureFPRND, FeatureFPCVT, FeatureISEL, 5230b57cec5SDimitry Andric FeatureSlowPOPCNTD, FeatureCMPB, FeatureLDBRX, 5240b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, FeatureQPX, 5250b57cec5SDimitry Andric FeatureMFTB]>; 5260b57cec5SDimitry Andricdef : ProcessorModel<"pwr3", G5Model, 5270b57cec5SDimitry Andric [DirectivePwr3, FeatureAltivec, 5280b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureMFOCRF, 5290b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit]>; 5300b57cec5SDimitry Andricdef : ProcessorModel<"pwr4", G5Model, 5310b57cec5SDimitry Andric [DirectivePwr4, FeatureAltivec, FeatureMFOCRF, 5320b57cec5SDimitry Andric FeatureFSqrt, FeatureFRES, FeatureFRSQRTE, 5330b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit, FeatureMFTB]>; 5340b57cec5SDimitry Andricdef : ProcessorModel<"pwr5", G5Model, 5350b57cec5SDimitry Andric [DirectivePwr5, FeatureAltivec, FeatureMFOCRF, 5360b57cec5SDimitry Andric FeatureFSqrt, FeatureFRE, FeatureFRES, 5370b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, 5380b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit, 5390b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 5400b57cec5SDimitry Andricdef : ProcessorModel<"pwr5x", G5Model, 5410b57cec5SDimitry Andric [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF, 5420b57cec5SDimitry Andric FeatureFSqrt, FeatureFRE, FeatureFRES, 5430b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, 5440b57cec5SDimitry Andric FeatureSTFIWX, FeatureFPRND, Feature64Bit, 5450b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 5460b57cec5SDimitry Andricdef : ProcessorModel<"pwr6", G5Model, 5470b57cec5SDimitry Andric [DirectivePwr6, FeatureAltivec, 5480b57cec5SDimitry Andric FeatureMFOCRF, FeatureFCPSGN, FeatureFSqrt, FeatureFRE, 5490b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureFRSQRTES, 5500b57cec5SDimitry Andric FeatureRecipPrec, FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB, 5510b57cec5SDimitry Andric FeatureFPRND, Feature64Bit /*, Feature64BitRegs */, 5520b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 5530b57cec5SDimitry Andricdef : ProcessorModel<"pwr6x", G5Model, 5540b57cec5SDimitry Andric [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF, 5550b57cec5SDimitry Andric FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES, 5560b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec, 5570b57cec5SDimitry Andric FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB, 5580b57cec5SDimitry Andric FeatureFPRND, Feature64Bit, 5590b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 560480093f4SDimitry Andricdef : ProcessorModel<"pwr7", P7Model, ProcessorFeatures.P7Features>; 561480093f4SDimitry Andricdef : ProcessorModel<"pwr8", P8Model, ProcessorFeatures.P8Features>; 562480093f4SDimitry Andricdef : ProcessorModel<"pwr9", P9Model, ProcessorFeatures.P9Features>; 563*5ffd83dbSDimitry Andric// No scheduler model yet. 564*5ffd83dbSDimitry Andricdef : ProcessorModel<"pwr10", NoSchedModel, ProcessorFeatures.P10Features>; 565480093f4SDimitry Andric// No scheduler model for future CPU. 566480093f4SDimitry Andricdef : ProcessorModel<"future", NoSchedModel, 567480093f4SDimitry Andric ProcessorFeatures.FutureFeatures>; 5680b57cec5SDimitry Andricdef : Processor<"ppc", G3Itineraries, [Directive32, FeatureHardFloat, 5690b57cec5SDimitry Andric FeatureMFTB]>; 5700b57cec5SDimitry Andricdef : Processor<"ppc32", G3Itineraries, [Directive32, FeatureHardFloat, 5710b57cec5SDimitry Andric FeatureMFTB]>; 5720b57cec5SDimitry Andricdef : ProcessorModel<"ppc64", G5Model, 5730b57cec5SDimitry Andric [Directive64, FeatureAltivec, 5740b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, FeatureFRES, 5750b57cec5SDimitry Andric FeatureFRSQRTE, FeatureSTFIWX, 5760b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 5770b57cec5SDimitry Andric FeatureMFTB]>; 578480093f4SDimitry Andricdef : ProcessorModel<"ppc64le", P8Model, ProcessorFeatures.P8Features>; 5790b57cec5SDimitry Andric 5800b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5810b57cec5SDimitry Andric// Calling Conventions 5820b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5830b57cec5SDimitry Andric 5840b57cec5SDimitry Andricinclude "PPCCallingConv.td" 5850b57cec5SDimitry Andric 5860b57cec5SDimitry Andricdef PPCInstrInfo : InstrInfo { 5870b57cec5SDimitry Andric let isLittleEndianEncoding = 1; 5880b57cec5SDimitry Andric 5890b57cec5SDimitry Andric // FIXME: Unset this when no longer needed! 5900b57cec5SDimitry Andric let decodePositionallyEncodedOperands = 1; 5910b57cec5SDimitry Andric 5920b57cec5SDimitry Andric let noNamedPositionallyEncodedOperands = 1; 5930b57cec5SDimitry Andric} 5940b57cec5SDimitry Andric 5950b57cec5SDimitry Andricdef PPCAsmParser : AsmParser { 5960b57cec5SDimitry Andric let ShouldEmitMatchRegisterName = 0; 5970b57cec5SDimitry Andric} 5980b57cec5SDimitry Andric 5990b57cec5SDimitry Andricdef PPCAsmParserVariant : AsmParserVariant { 6000b57cec5SDimitry Andric int Variant = 0; 6010b57cec5SDimitry Andric 6020b57cec5SDimitry Andric // We do not use hard coded registers in asm strings. However, some 6030b57cec5SDimitry Andric // InstAlias definitions use immediate literals. Set RegisterPrefix 6040b57cec5SDimitry Andric // so that those are not misinterpreted as registers. 6050b57cec5SDimitry Andric string RegisterPrefix = "%"; 6060b57cec5SDimitry Andric string BreakCharacters = "."; 6070b57cec5SDimitry Andric} 6080b57cec5SDimitry Andric 6090b57cec5SDimitry Andricdef PPC : Target { 6100b57cec5SDimitry Andric // Information about the instructions. 6110b57cec5SDimitry Andric let InstructionSet = PPCInstrInfo; 6120b57cec5SDimitry Andric 6130b57cec5SDimitry Andric let AssemblyParsers = [PPCAsmParser]; 6140b57cec5SDimitry Andric let AssemblyParserVariants = [PPCAsmParserVariant]; 6150b57cec5SDimitry Andric let AllowRegisterRenaming = 1; 6160b57cec5SDimitry Andric} 6170b57cec5SDimitry Andric 6180b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6190b57cec5SDimitry Andric// Pfm Counters 6200b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6210b57cec5SDimitry Andric 6220b57cec5SDimitry Andricinclude "PPCPfmCounters.td" 623