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", "">; 54480093f4SDimitry Andricdef DirectivePwrFuture 55480093f4SDimitry Andric : SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR_FUTURE", "">; 560b57cec5SDimitry Andric 570b57cec5SDimitry Andricdef Feature64Bit : SubtargetFeature<"64bit","Has64BitSupport", "true", 580b57cec5SDimitry Andric "Enable 64-bit instructions">; 590b57cec5SDimitry Andricdef FeatureHardFloat : SubtargetFeature<"hard-float", "HasHardFloat", "true", 600b57cec5SDimitry Andric "Enable floating-point instructions">; 610b57cec5SDimitry Andricdef Feature64BitRegs : SubtargetFeature<"64bitregs","Use64BitRegs", "true", 620b57cec5SDimitry Andric "Enable 64-bit registers usage for ppc32 [beta]">; 630b57cec5SDimitry Andricdef FeatureCRBits : SubtargetFeature<"crbits", "UseCRBits", "true", 640b57cec5SDimitry Andric "Use condition-register bits individually">; 650b57cec5SDimitry Andricdef FeatureFPU : SubtargetFeature<"fpu","HasFPU","true", 660b57cec5SDimitry Andric "Enable classic FPU instructions", 670b57cec5SDimitry Andric [FeatureHardFloat]>; 680b57cec5SDimitry Andricdef FeatureAltivec : SubtargetFeature<"altivec","HasAltivec", "true", 690b57cec5SDimitry Andric "Enable Altivec instructions", 700b57cec5SDimitry Andric [FeatureFPU]>; 710b57cec5SDimitry Andricdef FeatureSPE : SubtargetFeature<"spe","HasSPE", "true", 720b57cec5SDimitry Andric "Enable SPE instructions", 730b57cec5SDimitry Andric [FeatureHardFloat]>; 740b57cec5SDimitry Andricdef FeatureMFOCRF : SubtargetFeature<"mfocrf","HasMFOCRF", "true", 750b57cec5SDimitry Andric "Enable the MFOCRF instruction">; 760b57cec5SDimitry Andricdef FeatureFSqrt : SubtargetFeature<"fsqrt","HasFSQRT", "true", 770b57cec5SDimitry Andric "Enable the fsqrt instruction", 780b57cec5SDimitry Andric [FeatureFPU]>; 790b57cec5SDimitry Andricdef FeatureFCPSGN : SubtargetFeature<"fcpsgn", "HasFCPSGN", "true", 800b57cec5SDimitry Andric "Enable the fcpsgn instruction", 810b57cec5SDimitry Andric [FeatureFPU]>; 820b57cec5SDimitry Andricdef FeatureFRE : SubtargetFeature<"fre", "HasFRE", "true", 830b57cec5SDimitry Andric "Enable the fre instruction", 840b57cec5SDimitry Andric [FeatureFPU]>; 850b57cec5SDimitry Andricdef FeatureFRES : SubtargetFeature<"fres", "HasFRES", "true", 860b57cec5SDimitry Andric "Enable the fres instruction", 870b57cec5SDimitry Andric [FeatureFPU]>; 880b57cec5SDimitry Andricdef FeatureFRSQRTE : SubtargetFeature<"frsqrte", "HasFRSQRTE", "true", 890b57cec5SDimitry Andric "Enable the frsqrte instruction", 900b57cec5SDimitry Andric [FeatureFPU]>; 910b57cec5SDimitry Andricdef FeatureFRSQRTES : SubtargetFeature<"frsqrtes", "HasFRSQRTES", "true", 920b57cec5SDimitry Andric "Enable the frsqrtes instruction", 930b57cec5SDimitry Andric [FeatureFPU]>; 940b57cec5SDimitry Andricdef FeatureRecipPrec : SubtargetFeature<"recipprec", "HasRecipPrec", "true", 950b57cec5SDimitry Andric "Assume higher precision reciprocal estimates">; 960b57cec5SDimitry Andricdef FeatureSTFIWX : SubtargetFeature<"stfiwx","HasSTFIWX", "true", 970b57cec5SDimitry Andric "Enable the stfiwx instruction", 980b57cec5SDimitry Andric [FeatureFPU]>; 990b57cec5SDimitry Andricdef FeatureLFIWAX : SubtargetFeature<"lfiwax","HasLFIWAX", "true", 1000b57cec5SDimitry Andric "Enable the lfiwax instruction", 1010b57cec5SDimitry Andric [FeatureFPU]>; 1020b57cec5SDimitry Andricdef FeatureFPRND : SubtargetFeature<"fprnd", "HasFPRND", "true", 1030b57cec5SDimitry Andric "Enable the fri[mnpz] instructions", 1040b57cec5SDimitry Andric [FeatureFPU]>; 1050b57cec5SDimitry Andricdef FeatureFPCVT : SubtargetFeature<"fpcvt", "HasFPCVT", "true", 1060b57cec5SDimitry Andric "Enable fc[ft]* (unsigned and single-precision) and lfiwzx instructions", 1070b57cec5SDimitry Andric [FeatureFPU]>; 1080b57cec5SDimitry Andricdef FeatureISEL : SubtargetFeature<"isel","HasISEL", "true", 1090b57cec5SDimitry Andric "Enable the isel instruction">; 1100b57cec5SDimitry Andricdef FeatureBPERMD : SubtargetFeature<"bpermd", "HasBPERMD", "true", 1110b57cec5SDimitry Andric "Enable the bpermd instruction">; 1120b57cec5SDimitry Andricdef FeatureExtDiv : SubtargetFeature<"extdiv", "HasExtDiv", "true", 1130b57cec5SDimitry Andric "Enable extended divide instructions">; 1140b57cec5SDimitry Andricdef FeatureLDBRX : SubtargetFeature<"ldbrx","HasLDBRX", "true", 1150b57cec5SDimitry Andric "Enable the ldbrx instruction">; 1160b57cec5SDimitry Andricdef FeatureCMPB : SubtargetFeature<"cmpb", "HasCMPB", "true", 1170b57cec5SDimitry Andric "Enable the cmpb instruction">; 1180b57cec5SDimitry Andricdef FeatureICBT : SubtargetFeature<"icbt","HasICBT", "true", 1190b57cec5SDimitry Andric "Enable icbt instruction">; 1200b57cec5SDimitry Andricdef FeatureBookE : SubtargetFeature<"booke", "IsBookE", "true", 1210b57cec5SDimitry Andric "Enable Book E instructions", 1220b57cec5SDimitry Andric [FeatureICBT]>; 1230b57cec5SDimitry Andricdef FeatureMSYNC : SubtargetFeature<"msync", "HasOnlyMSYNC", "true", 1240b57cec5SDimitry Andric "Has only the msync instruction instead of sync", 1250b57cec5SDimitry Andric [FeatureBookE]>; 1260b57cec5SDimitry Andricdef FeatureE500 : SubtargetFeature<"e500", "IsE500", "true", 1270b57cec5SDimitry Andric "Enable E500/E500mc instructions">; 1280b57cec5SDimitry Andricdef FeatureSecurePlt : SubtargetFeature<"secure-plt","SecurePlt", "true", 1290b57cec5SDimitry Andric "Enable secure plt mode">; 1300b57cec5SDimitry Andricdef FeaturePPC4xx : SubtargetFeature<"ppc4xx", "IsPPC4xx", "true", 1310b57cec5SDimitry Andric "Enable PPC 4xx instructions">; 1320b57cec5SDimitry Andricdef FeaturePPC6xx : SubtargetFeature<"ppc6xx", "IsPPC6xx", "true", 1330b57cec5SDimitry Andric "Enable PPC 6xx instructions">; 1340b57cec5SDimitry Andricdef FeatureQPX : SubtargetFeature<"qpx","HasQPX", "true", 1350b57cec5SDimitry Andric "Enable QPX instructions", 1360b57cec5SDimitry Andric [FeatureFPU]>; 1370b57cec5SDimitry Andricdef FeatureVSX : SubtargetFeature<"vsx","HasVSX", "true", 1380b57cec5SDimitry Andric "Enable VSX instructions", 1390b57cec5SDimitry Andric [FeatureAltivec]>; 1400b57cec5SDimitry Andricdef FeatureTwoConstNR : 1410b57cec5SDimitry Andric SubtargetFeature<"two-const-nr", "NeedsTwoConstNR", "true", 1420b57cec5SDimitry Andric "Requires two constant Newton-Raphson computation">; 1430b57cec5SDimitry Andricdef FeatureP8Altivec : SubtargetFeature<"power8-altivec", "HasP8Altivec", "true", 1440b57cec5SDimitry Andric "Enable POWER8 Altivec instructions", 1450b57cec5SDimitry Andric [FeatureAltivec]>; 1460b57cec5SDimitry Andricdef FeatureP8Crypto : SubtargetFeature<"crypto", "HasP8Crypto", "true", 1470b57cec5SDimitry Andric "Enable POWER8 Crypto instructions", 1480b57cec5SDimitry Andric [FeatureP8Altivec]>; 1490b57cec5SDimitry Andricdef FeatureP8Vector : SubtargetFeature<"power8-vector", "HasP8Vector", "true", 1500b57cec5SDimitry Andric "Enable POWER8 vector instructions", 1510b57cec5SDimitry Andric [FeatureVSX, FeatureP8Altivec]>; 1520b57cec5SDimitry Andricdef FeatureDirectMove : 1530b57cec5SDimitry Andric SubtargetFeature<"direct-move", "HasDirectMove", "true", 1540b57cec5SDimitry Andric "Enable Power8 direct move instructions", 1550b57cec5SDimitry Andric [FeatureVSX]>; 1560b57cec5SDimitry Andricdef FeaturePartwordAtomic : SubtargetFeature<"partword-atomics", 1570b57cec5SDimitry Andric "HasPartwordAtomics", "true", 1580b57cec5SDimitry Andric "Enable l[bh]arx and st[bh]cx.">; 1590b57cec5SDimitry Andricdef FeatureInvariantFunctionDescriptors : 1600b57cec5SDimitry Andric SubtargetFeature<"invariant-function-descriptors", 1610b57cec5SDimitry Andric "HasInvariantFunctionDescriptors", "true", 1620b57cec5SDimitry Andric "Assume function descriptors are invariant">; 1630b57cec5SDimitry Andricdef FeatureLongCall : SubtargetFeature<"longcall", "UseLongCalls", "true", 1640b57cec5SDimitry Andric "Always use indirect calls">; 1650b57cec5SDimitry Andricdef FeatureHTM : SubtargetFeature<"htm", "HasHTM", "true", 1660b57cec5SDimitry Andric "Enable Hardware Transactional Memory instructions">; 1670b57cec5SDimitry Andricdef FeatureMFTB : SubtargetFeature<"", "FeatureMFTB", "true", 1680b57cec5SDimitry Andric "Implement mftb using the mfspr instruction">; 169480093f4SDimitry Andricdef FeatureUnalignedFloats : 170480093f4SDimitry Andric SubtargetFeature<"allow-unaligned-fp-access", "AllowsUnalignedFPAccess", 171480093f4SDimitry Andric "true", "CPU does not trap on unaligned FP access">; 1720b57cec5SDimitry Andricdef FeaturePPCPreRASched: 1730b57cec5SDimitry Andric SubtargetFeature<"ppc-prera-sched", "UsePPCPreRASchedStrategy", "true", 1740b57cec5SDimitry Andric "Use PowerPC pre-RA scheduling strategy">; 1750b57cec5SDimitry Andricdef FeaturePPCPostRASched: 1760b57cec5SDimitry Andric SubtargetFeature<"ppc-postra-sched", "UsePPCPostRASchedStrategy", "true", 1770b57cec5SDimitry Andric "Use PowerPC post-RA scheduling strategy">; 1780b57cec5SDimitry Andricdef FeatureFloat128 : 1790b57cec5SDimitry Andric SubtargetFeature<"float128", "HasFloat128", "true", 1800b57cec5SDimitry Andric "Enable the __float128 data type for IEEE-754R Binary128.", 1810b57cec5SDimitry Andric [FeatureVSX]>; 1820b57cec5SDimitry Andricdef FeaturePOPCNTD : SubtargetFeature<"popcntd","HasPOPCNTD", 1830b57cec5SDimitry Andric "POPCNTD_Fast", 1840b57cec5SDimitry Andric "Enable the popcnt[dw] instructions">; 1850b57cec5SDimitry Andric// Note that for the a2/a2q processor models we should not use popcnt[dw] by 1860b57cec5SDimitry Andric// default. These processors do support the instructions, but they're 1870b57cec5SDimitry Andric// microcoded, and the software emulation is about twice as fast. 1880b57cec5SDimitry Andricdef FeatureSlowPOPCNTD : SubtargetFeature<"slow-popcntd","HasPOPCNTD", 1890b57cec5SDimitry Andric "POPCNTD_Slow", 1900b57cec5SDimitry Andric "Has slow popcnt[dw] instructions">; 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andricdef DeprecatedDST : SubtargetFeature<"", "DeprecatedDST", "true", 1930b57cec5SDimitry Andric "Treat vector data stream cache control instructions as deprecated">; 1940b57cec5SDimitry Andric 1950b57cec5SDimitry Andricdef FeatureISA3_0 : SubtargetFeature<"isa-v30-instructions", "IsISA3_0", 1960b57cec5SDimitry Andric "true", 1970b57cec5SDimitry Andric "Enable instructions added in ISA 3.0.">; 1980b57cec5SDimitry Andricdef FeatureP9Altivec : SubtargetFeature<"power9-altivec", "HasP9Altivec", "true", 1990b57cec5SDimitry Andric "Enable POWER9 Altivec instructions", 2000b57cec5SDimitry Andric [FeatureISA3_0, FeatureP8Altivec]>; 2010b57cec5SDimitry Andricdef FeatureP9Vector : SubtargetFeature<"power9-vector", "HasP9Vector", "true", 2020b57cec5SDimitry Andric "Enable POWER9 vector instructions", 2030b57cec5SDimitry Andric [FeatureISA3_0, FeatureP8Vector, 2040b57cec5SDimitry Andric FeatureP9Altivec]>; 2050b57cec5SDimitry Andric// A separate feature for this even though it is equivalent to P9Vector 2060b57cec5SDimitry Andric// because this is a feature of the implementation rather than the architecture 2070b57cec5SDimitry Andric// and may go away with future CPU's. 2080b57cec5SDimitry Andricdef FeatureVectorsUseTwoUnits : SubtargetFeature<"vectors-use-two-units", 2090b57cec5SDimitry Andric "VectorsUseTwoUnits", 2100b57cec5SDimitry Andric "true", 2110b57cec5SDimitry Andric "Vectors use two units">; 2120b57cec5SDimitry Andric 2130b57cec5SDimitry Andric// Since new processors generally contain a superset of features of those that 2140b57cec5SDimitry Andric// came before them, the idea is to make implementations of new processors 2150b57cec5SDimitry Andric// less error prone and easier to read. 2160b57cec5SDimitry Andric// Namely: 217480093f4SDimitry Andric// list<SubtargetFeature> P8InheritableFeatures = ... 218480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorAddtionalFeatures = 219480093f4SDimitry Andric// [ features that Power8 does not support but inheritable ] 220480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorSpecificFeatures = 221480093f4SDimitry Andric// [ features that Power8 does not support and not inheritable ] 222480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorInheritableFeatures = 223480093f4SDimitry Andric// !listconcat(P8InheritableFeatures, FutureProcessorAddtionalFeatures) 224480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorFeatures = 225480093f4SDimitry Andric// !listconcat(FutureProcessorInheritableFeatures, 226480093f4SDimitry Andric// FutureProcessorSpecificFeatures) 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric// Makes it explicit and obvious what is new in FutureProcesor vs. Power8 as 2290b57cec5SDimitry Andric// well as providing a single point of definition if the feature set will be 2300b57cec5SDimitry Andric// used elsewhere. 2310b57cec5SDimitry Andricdef ProcessorFeatures { 232480093f4SDimitry Andric // Power7 233480093f4SDimitry Andric list<SubtargetFeature> P7InheritableFeatures = [DirectivePwr7, 234480093f4SDimitry Andric FeatureAltivec, 235480093f4SDimitry Andric FeatureVSX, 236480093f4SDimitry Andric FeatureMFOCRF, 237480093f4SDimitry Andric FeatureFCPSGN, 238480093f4SDimitry Andric FeatureFSqrt, 239480093f4SDimitry Andric FeatureFRE, 240480093f4SDimitry Andric FeatureFRES, 241480093f4SDimitry Andric FeatureFRSQRTE, 242480093f4SDimitry Andric FeatureFRSQRTES, 243480093f4SDimitry Andric FeatureRecipPrec, 244480093f4SDimitry Andric FeatureSTFIWX, 245480093f4SDimitry Andric FeatureLFIWAX, 246480093f4SDimitry Andric FeatureFPRND, 247480093f4SDimitry Andric FeatureFPCVT, 248480093f4SDimitry Andric FeatureISEL, 249480093f4SDimitry Andric FeaturePOPCNTD, 250480093f4SDimitry Andric FeatureCMPB, 251480093f4SDimitry Andric FeatureLDBRX, 252480093f4SDimitry Andric Feature64Bit, 253480093f4SDimitry Andric /* Feature64BitRegs, */ 254480093f4SDimitry Andric FeatureBPERMD, 255480093f4SDimitry Andric FeatureExtDiv, 256480093f4SDimitry Andric FeatureMFTB, 257480093f4SDimitry Andric DeprecatedDST, 258480093f4SDimitry Andric FeatureTwoConstNR, 259480093f4SDimitry Andric FeatureUnalignedFloats]; 260480093f4SDimitry Andric list<SubtargetFeature> P7SpecificFeatures = []; 261480093f4SDimitry Andric list<SubtargetFeature> P7Features = 262480093f4SDimitry Andric !listconcat(P7InheritableFeatures, P7SpecificFeatures); 263480093f4SDimitry Andric 264480093f4SDimitry Andric // Power8 265480093f4SDimitry Andric list<SubtargetFeature> P8AdditionalFeatures = [DirectivePwr8, 266480093f4SDimitry Andric FeatureP8Altivec, 267480093f4SDimitry Andric FeatureP8Vector, 268480093f4SDimitry Andric FeatureP8Crypto, 269480093f4SDimitry Andric FeatureHTM, 270480093f4SDimitry Andric FeatureDirectMove, 271480093f4SDimitry Andric FeatureICBT, 272480093f4SDimitry Andric FeaturePartwordAtomic]; 273480093f4SDimitry Andric list<SubtargetFeature> P8SpecificFeatures = []; 274480093f4SDimitry Andric list<SubtargetFeature> P8InheritableFeatures = 275480093f4SDimitry Andric !listconcat(P7InheritableFeatures, P8AdditionalFeatures); 276480093f4SDimitry Andric list<SubtargetFeature> P8Features = 277480093f4SDimitry Andric !listconcat(P8InheritableFeatures, P8SpecificFeatures); 278480093f4SDimitry Andric 279480093f4SDimitry Andric // Power9 280480093f4SDimitry Andric list<SubtargetFeature> P9AdditionalFeatures = [DirectivePwr9, 281480093f4SDimitry Andric FeatureP9Altivec, 282480093f4SDimitry Andric FeatureP9Vector, 283480093f4SDimitry Andric FeatureISA3_0]; 284480093f4SDimitry Andric // Some features are unique to Power9 and there is no reason to assume 285480093f4SDimitry Andric // they will be part of any future CPUs. One example is the narrower 286480093f4SDimitry Andric // dispatch for vector operations than scalar ones. For the time being, 287480093f4SDimitry Andric // this list also includes scheduling-related features since we do not have 288480093f4SDimitry Andric // enough info to create custom scheduling strategies for future CPUs. 289480093f4SDimitry Andric list<SubtargetFeature> P9SpecificFeatures = [FeatureVectorsUseTwoUnits, 290480093f4SDimitry Andric FeaturePPCPreRASched, 291480093f4SDimitry Andric FeaturePPCPostRASched]; 292480093f4SDimitry Andric list<SubtargetFeature> P9InheritableFeatures = 293480093f4SDimitry Andric !listconcat(P8InheritableFeatures, P9AdditionalFeatures); 294480093f4SDimitry Andric list<SubtargetFeature> P9Features = 295480093f4SDimitry Andric !listconcat(P9InheritableFeatures, P9SpecificFeatures); 296480093f4SDimitry Andric 297480093f4SDimitry Andric // Future 298480093f4SDimitry Andric // For future CPU we assume that all of the existing features from Power 9 299480093f4SDimitry Andric // still exist with the exception of those we know are Power 9 specific. 300480093f4SDimitry Andric list<SubtargetFeature> FutureAdditionalFeatures = []; 301480093f4SDimitry Andric list<SubtargetFeature> FutureSpecificFeatures = []; 302480093f4SDimitry Andric list<SubtargetFeature> FutureInheritableFeatures = 303480093f4SDimitry Andric !listconcat(P9InheritableFeatures, FutureAdditionalFeatures); 304480093f4SDimitry Andric list<SubtargetFeature> FutureFeatures = 305480093f4SDimitry Andric !listconcat(FutureInheritableFeatures, FutureSpecificFeatures); 3060b57cec5SDimitry Andric} 3070b57cec5SDimitry Andric 3080b57cec5SDimitry Andric// Note: Future features to add when support is extended to more 3090b57cec5SDimitry Andric// recent ISA levels: 3100b57cec5SDimitry Andric// 3110b57cec5SDimitry Andric// DFP p6, p6x, p7 decimal floating-point instructions 3120b57cec5SDimitry Andric// POPCNTB p5 through p7 popcntb and related instructions 3130b57cec5SDimitry Andric 3140b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3150b57cec5SDimitry Andric// Classes used for relation maps. 3160b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3170b57cec5SDimitry Andric// RecFormRel - Filter class used to relate non-record-form instructions with 3180b57cec5SDimitry Andric// their record-form variants. 3190b57cec5SDimitry Andricclass RecFormRel; 3200b57cec5SDimitry Andric 3210b57cec5SDimitry Andric// AltVSXFMARel - Filter class used to relate the primary addend-killing VSX 3220b57cec5SDimitry Andric// FMA instruction forms with their corresponding factor-killing forms. 3230b57cec5SDimitry Andricclass AltVSXFMARel { 3240b57cec5SDimitry Andric bit IsVSXFMAAlt = 0; 3250b57cec5SDimitry Andric} 3260b57cec5SDimitry Andric 3270b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3280b57cec5SDimitry Andric// Relation Map Definitions. 3290b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3300b57cec5SDimitry Andric 3310b57cec5SDimitry Andricdef getRecordFormOpcode : InstrMapping { 3320b57cec5SDimitry Andric let FilterClass = "RecFormRel"; 3330b57cec5SDimitry Andric // Instructions with the same BaseName and Interpretation64Bit values 3340b57cec5SDimitry Andric // form a row. 3350b57cec5SDimitry Andric let RowFields = ["BaseName", "Interpretation64Bit"]; 3360b57cec5SDimitry Andric // Instructions with the same RC value form a column. 3370b57cec5SDimitry Andric let ColFields = ["RC"]; 3380b57cec5SDimitry Andric // The key column are the non-record-form instructions. 3390b57cec5SDimitry Andric let KeyCol = ["0"]; 3400b57cec5SDimitry Andric // Value columns RC=1 3410b57cec5SDimitry Andric let ValueCols = [["1"]]; 3420b57cec5SDimitry Andric} 3430b57cec5SDimitry Andric 3440b57cec5SDimitry Andricdef getNonRecordFormOpcode : InstrMapping { 3450b57cec5SDimitry Andric let FilterClass = "RecFormRel"; 3460b57cec5SDimitry Andric // Instructions with the same BaseName and Interpretation64Bit values 3470b57cec5SDimitry Andric // form a row. 3480b57cec5SDimitry Andric let RowFields = ["BaseName", "Interpretation64Bit"]; 3490b57cec5SDimitry Andric // Instructions with the same RC value form a column. 3500b57cec5SDimitry Andric let ColFields = ["RC"]; 3510b57cec5SDimitry Andric // The key column are the record-form instructions. 3520b57cec5SDimitry Andric let KeyCol = ["1"]; 3530b57cec5SDimitry Andric // Value columns are RC=0 3540b57cec5SDimitry Andric let ValueCols = [["0"]]; 3550b57cec5SDimitry Andric} 3560b57cec5SDimitry Andric 3570b57cec5SDimitry Andricdef getAltVSXFMAOpcode : InstrMapping { 3580b57cec5SDimitry Andric let FilterClass = "AltVSXFMARel"; 3590b57cec5SDimitry Andric // Instructions with the same BaseName value form a row. 3600b57cec5SDimitry Andric let RowFields = ["BaseName"]; 3610b57cec5SDimitry Andric // Instructions with the same IsVSXFMAAlt value form a column. 3620b57cec5SDimitry Andric let ColFields = ["IsVSXFMAAlt"]; 3630b57cec5SDimitry Andric // The key column are the (default) addend-killing instructions. 3640b57cec5SDimitry Andric let KeyCol = ["0"]; 3650b57cec5SDimitry Andric // Value columns IsVSXFMAAlt=1 3660b57cec5SDimitry Andric let ValueCols = [["1"]]; 3670b57cec5SDimitry Andric} 3680b57cec5SDimitry Andric 3690b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3700b57cec5SDimitry Andric// Register File Description 3710b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3720b57cec5SDimitry Andric 3730b57cec5SDimitry Andricinclude "PPCRegisterInfo.td" 3740b57cec5SDimitry Andricinclude "PPCSchedule.td" 3750b57cec5SDimitry Andric 3760b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3770b57cec5SDimitry Andric// PowerPC processors supported. 3780b57cec5SDimitry Andric// 3790b57cec5SDimitry Andric 3800b57cec5SDimitry Andricdef : Processor<"generic", G3Itineraries, [Directive32, FeatureHardFloat, 3810b57cec5SDimitry Andric FeatureMFTB]>; 3820b57cec5SDimitry Andricdef : ProcessorModel<"440", PPC440Model, [Directive440, FeatureISEL, 3830b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 3840b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 3850b57cec5SDimitry Andric FeatureMSYNC, FeatureMFTB]>; 3860b57cec5SDimitry Andricdef : ProcessorModel<"450", PPC440Model, [Directive440, FeatureISEL, 3870b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 3880b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 3890b57cec5SDimitry Andric FeatureMSYNC, FeatureMFTB]>; 3900b57cec5SDimitry Andricdef : Processor<"601", G3Itineraries, [Directive601, FeatureFPU]>; 3910b57cec5SDimitry Andricdef : Processor<"602", G3Itineraries, [Directive602, FeatureFPU, 3920b57cec5SDimitry Andric FeatureMFTB]>; 3930b57cec5SDimitry Andricdef : Processor<"603", G3Itineraries, [Directive603, 3940b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 3950b57cec5SDimitry Andric FeatureMFTB]>; 3960b57cec5SDimitry Andricdef : Processor<"603e", G3Itineraries, [Directive603, 3970b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 3980b57cec5SDimitry Andric FeatureMFTB]>; 3990b57cec5SDimitry Andricdef : Processor<"603ev", G3Itineraries, [Directive603, 4000b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4010b57cec5SDimitry Andric FeatureMFTB]>; 4020b57cec5SDimitry Andricdef : Processor<"604", G3Itineraries, [Directive604, 4030b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4040b57cec5SDimitry Andric FeatureMFTB]>; 4050b57cec5SDimitry Andricdef : Processor<"604e", G3Itineraries, [Directive604, 4060b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4070b57cec5SDimitry Andric FeatureMFTB]>; 4080b57cec5SDimitry Andricdef : Processor<"620", G3Itineraries, [Directive620, 4090b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4100b57cec5SDimitry Andric FeatureMFTB]>; 4110b57cec5SDimitry Andricdef : Processor<"750", G4Itineraries, [Directive750, 4120b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4130b57cec5SDimitry Andric FeatureMFTB]>; 4140b57cec5SDimitry Andricdef : Processor<"g3", G3Itineraries, [Directive750, 4150b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4160b57cec5SDimitry Andric FeatureMFTB]>; 4170b57cec5SDimitry Andricdef : Processor<"7400", G4Itineraries, [Directive7400, FeatureAltivec, 4180b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4190b57cec5SDimitry Andric FeatureMFTB]>; 4200b57cec5SDimitry Andricdef : Processor<"g4", G4Itineraries, [Directive7400, FeatureAltivec, 4210b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4220b57cec5SDimitry Andric FeatureMFTB]>; 4230b57cec5SDimitry Andricdef : Processor<"7450", G4PlusItineraries, [Directive7400, FeatureAltivec, 4240b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4250b57cec5SDimitry Andric FeatureMFTB]>; 4260b57cec5SDimitry Andricdef : Processor<"g4+", G4PlusItineraries, [Directive7400, FeatureAltivec, 4270b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4280b57cec5SDimitry Andric FeatureMFTB]>; 4290b57cec5SDimitry Andric 4300b57cec5SDimitry Andricdef : ProcessorModel<"970", G5Model, 4310b57cec5SDimitry Andric [Directive970, FeatureAltivec, 4320b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, 4330b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureSTFIWX, 4340b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 4350b57cec5SDimitry Andric FeatureMFTB]>; 4360b57cec5SDimitry Andricdef : ProcessorModel<"g5", G5Model, 4370b57cec5SDimitry Andric [Directive970, FeatureAltivec, 4380b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, FeatureSTFIWX, 4390b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, 4400b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 4410b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 4420b57cec5SDimitry Andricdef : ProcessorModel<"e500", PPCE500Model, 4430b57cec5SDimitry Andric [DirectiveE500, 4440b57cec5SDimitry Andric FeatureICBT, FeatureBookE, 445*5b5f869eSDimitry Andric FeatureISEL, FeatureMFTB, FeatureMSYNC, FeatureSPE]>; 4460b57cec5SDimitry Andricdef : ProcessorModel<"e500mc", PPCE500mcModel, 4470b57cec5SDimitry Andric [DirectiveE500mc, 4480b57cec5SDimitry Andric FeatureSTFIWX, FeatureICBT, FeatureBookE, 4490b57cec5SDimitry Andric FeatureISEL, FeatureMFTB]>; 4500b57cec5SDimitry Andricdef : ProcessorModel<"e5500", PPCE5500Model, 4510b57cec5SDimitry Andric [DirectiveE5500, FeatureMFOCRF, Feature64Bit, 4520b57cec5SDimitry Andric FeatureSTFIWX, FeatureICBT, FeatureBookE, 4530b57cec5SDimitry Andric FeatureISEL, FeatureMFTB]>; 4540b57cec5SDimitry Andricdef : ProcessorModel<"a2", PPCA2Model, 4550b57cec5SDimitry Andric [DirectiveA2, FeatureICBT, FeatureBookE, FeatureMFOCRF, 4560b57cec5SDimitry Andric FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES, 4570b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec, 4580b57cec5SDimitry Andric FeatureSTFIWX, FeatureLFIWAX, 4590b57cec5SDimitry Andric FeatureFPRND, FeatureFPCVT, FeatureISEL, 4600b57cec5SDimitry Andric FeatureSlowPOPCNTD, FeatureCMPB, FeatureLDBRX, 4610b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, FeatureMFTB]>; 4620b57cec5SDimitry Andricdef : ProcessorModel<"a2q", PPCA2Model, 4630b57cec5SDimitry Andric [DirectiveA2, FeatureICBT, FeatureBookE, FeatureMFOCRF, 4640b57cec5SDimitry Andric FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES, 4650b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec, 4660b57cec5SDimitry Andric FeatureSTFIWX, FeatureLFIWAX, 4670b57cec5SDimitry Andric FeatureFPRND, FeatureFPCVT, FeatureISEL, 4680b57cec5SDimitry Andric FeatureSlowPOPCNTD, FeatureCMPB, FeatureLDBRX, 4690b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, FeatureQPX, 4700b57cec5SDimitry Andric FeatureMFTB]>; 4710b57cec5SDimitry Andricdef : ProcessorModel<"pwr3", G5Model, 4720b57cec5SDimitry Andric [DirectivePwr3, FeatureAltivec, 4730b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureMFOCRF, 4740b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit]>; 4750b57cec5SDimitry Andricdef : ProcessorModel<"pwr4", G5Model, 4760b57cec5SDimitry Andric [DirectivePwr4, FeatureAltivec, FeatureMFOCRF, 4770b57cec5SDimitry Andric FeatureFSqrt, FeatureFRES, FeatureFRSQRTE, 4780b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit, FeatureMFTB]>; 4790b57cec5SDimitry Andricdef : ProcessorModel<"pwr5", G5Model, 4800b57cec5SDimitry Andric [DirectivePwr5, FeatureAltivec, FeatureMFOCRF, 4810b57cec5SDimitry Andric FeatureFSqrt, FeatureFRE, FeatureFRES, 4820b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, 4830b57cec5SDimitry Andric FeatureSTFIWX, Feature64Bit, 4840b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 4850b57cec5SDimitry Andricdef : ProcessorModel<"pwr5x", G5Model, 4860b57cec5SDimitry Andric [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF, 4870b57cec5SDimitry Andric FeatureFSqrt, FeatureFRE, FeatureFRES, 4880b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, 4890b57cec5SDimitry Andric FeatureSTFIWX, FeatureFPRND, Feature64Bit, 4900b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 4910b57cec5SDimitry Andricdef : ProcessorModel<"pwr6", G5Model, 4920b57cec5SDimitry Andric [DirectivePwr6, FeatureAltivec, 4930b57cec5SDimitry Andric FeatureMFOCRF, FeatureFCPSGN, FeatureFSqrt, FeatureFRE, 4940b57cec5SDimitry Andric FeatureFRES, FeatureFRSQRTE, FeatureFRSQRTES, 4950b57cec5SDimitry Andric FeatureRecipPrec, FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB, 4960b57cec5SDimitry Andric FeatureFPRND, Feature64Bit /*, Feature64BitRegs */, 4970b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 4980b57cec5SDimitry Andricdef : ProcessorModel<"pwr6x", G5Model, 4990b57cec5SDimitry Andric [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF, 5000b57cec5SDimitry Andric FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES, 5010b57cec5SDimitry Andric FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec, 5020b57cec5SDimitry Andric FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB, 5030b57cec5SDimitry Andric FeatureFPRND, Feature64Bit, 5040b57cec5SDimitry Andric FeatureMFTB, DeprecatedDST]>; 505480093f4SDimitry Andricdef : ProcessorModel<"pwr7", P7Model, ProcessorFeatures.P7Features>; 506480093f4SDimitry Andricdef : ProcessorModel<"pwr8", P8Model, ProcessorFeatures.P8Features>; 507480093f4SDimitry Andricdef : ProcessorModel<"pwr9", P9Model, ProcessorFeatures.P9Features>; 508480093f4SDimitry Andric// No scheduler model for future CPU. 509480093f4SDimitry Andricdef : ProcessorModel<"future", NoSchedModel, 510480093f4SDimitry Andric ProcessorFeatures.FutureFeatures>; 5110b57cec5SDimitry Andricdef : Processor<"ppc", G3Itineraries, [Directive32, FeatureHardFloat, 5120b57cec5SDimitry Andric FeatureMFTB]>; 5130b57cec5SDimitry Andricdef : Processor<"ppc32", G3Itineraries, [Directive32, FeatureHardFloat, 5140b57cec5SDimitry Andric FeatureMFTB]>; 5150b57cec5SDimitry Andricdef : ProcessorModel<"ppc64", G5Model, 5160b57cec5SDimitry Andric [Directive64, FeatureAltivec, 5170b57cec5SDimitry Andric FeatureMFOCRF, FeatureFSqrt, FeatureFRES, 5180b57cec5SDimitry Andric FeatureFRSQRTE, FeatureSTFIWX, 5190b57cec5SDimitry Andric Feature64Bit /*, Feature64BitRegs */, 5200b57cec5SDimitry Andric FeatureMFTB]>; 521480093f4SDimitry Andricdef : ProcessorModel<"ppc64le", P8Model, ProcessorFeatures.P8Features>; 5220b57cec5SDimitry Andric 5230b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5240b57cec5SDimitry Andric// Calling Conventions 5250b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5260b57cec5SDimitry Andric 5270b57cec5SDimitry Andricinclude "PPCCallingConv.td" 5280b57cec5SDimitry Andric 5290b57cec5SDimitry Andricdef PPCInstrInfo : InstrInfo { 5300b57cec5SDimitry Andric let isLittleEndianEncoding = 1; 5310b57cec5SDimitry Andric 5320b57cec5SDimitry Andric // FIXME: Unset this when no longer needed! 5330b57cec5SDimitry Andric let decodePositionallyEncodedOperands = 1; 5340b57cec5SDimitry Andric 5350b57cec5SDimitry Andric let noNamedPositionallyEncodedOperands = 1; 5360b57cec5SDimitry Andric} 5370b57cec5SDimitry Andric 5380b57cec5SDimitry Andricdef PPCAsmParser : AsmParser { 5390b57cec5SDimitry Andric let ShouldEmitMatchRegisterName = 0; 5400b57cec5SDimitry Andric} 5410b57cec5SDimitry Andric 5420b57cec5SDimitry Andricdef PPCAsmParserVariant : AsmParserVariant { 5430b57cec5SDimitry Andric int Variant = 0; 5440b57cec5SDimitry Andric 5450b57cec5SDimitry Andric // We do not use hard coded registers in asm strings. However, some 5460b57cec5SDimitry Andric // InstAlias definitions use immediate literals. Set RegisterPrefix 5470b57cec5SDimitry Andric // so that those are not misinterpreted as registers. 5480b57cec5SDimitry Andric string RegisterPrefix = "%"; 5490b57cec5SDimitry Andric string BreakCharacters = "."; 5500b57cec5SDimitry Andric} 5510b57cec5SDimitry Andric 5520b57cec5SDimitry Andricdef PPC : Target { 5530b57cec5SDimitry Andric // Information about the instructions. 5540b57cec5SDimitry Andric let InstructionSet = PPCInstrInfo; 5550b57cec5SDimitry Andric 5560b57cec5SDimitry Andric let AssemblyParsers = [PPCAsmParser]; 5570b57cec5SDimitry Andric let AssemblyParserVariants = [PPCAsmParserVariant]; 5580b57cec5SDimitry Andric let AllowRegisterRenaming = 1; 5590b57cec5SDimitry Andric} 5600b57cec5SDimitry Andric 5610b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5620b57cec5SDimitry Andric// Pfm Counters 5630b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5640b57cec5SDimitry Andric 5650b57cec5SDimitry Andricinclude "PPCPfmCounters.td" 566