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 25*480093f4SDimitry Andricdef Directive440 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_440", "">; 26*480093f4SDimitry Andricdef Directive601 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_601", "">; 27*480093f4SDimitry Andricdef Directive602 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_602", "">; 28*480093f4SDimitry Andricdef Directive603 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_603", "">; 29*480093f4SDimitry Andricdef Directive604 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_603", "">; 30*480093f4SDimitry Andricdef Directive620 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_603", "">; 31*480093f4SDimitry Andricdef Directive7400: SubtargetFeature<"", "CPUDirective", "PPC::DIR_7400", "">; 32*480093f4SDimitry Andricdef Directive750 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_750", "">; 33*480093f4SDimitry Andricdef Directive970 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_970", "">; 34*480093f4SDimitry Andricdef Directive32 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_32", "">; 35*480093f4SDimitry Andricdef Directive64 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_64", "">; 36*480093f4SDimitry Andricdef DirectiveA2 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_A2", "">; 37*480093f4SDimitry Andricdef DirectiveE500 : SubtargetFeature<"", "CPUDirective", 380b57cec5SDimitry Andric "PPC::DIR_E500", "">; 39*480093f4SDimitry Andricdef DirectiveE500mc : SubtargetFeature<"", "CPUDirective", 400b57cec5SDimitry Andric "PPC::DIR_E500mc", "">; 41*480093f4SDimitry Andricdef DirectiveE5500 : SubtargetFeature<"", "CPUDirective", 420b57cec5SDimitry Andric "PPC::DIR_E5500", "">; 43*480093f4SDimitry Andricdef DirectivePwr3: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR3", "">; 44*480093f4SDimitry Andricdef DirectivePwr4: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR4", "">; 45*480093f4SDimitry Andricdef DirectivePwr5: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR5", "">; 460b57cec5SDimitry Andricdef DirectivePwr5x 47*480093f4SDimitry Andric : SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR5X", "">; 48*480093f4SDimitry Andricdef DirectivePwr6: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR6", "">; 490b57cec5SDimitry Andricdef DirectivePwr6x 50*480093f4SDimitry Andric : SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR6X", "">; 51*480093f4SDimitry Andricdef DirectivePwr7: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR7", "">; 52*480093f4SDimitry Andricdef DirectivePwr8: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR8", "">; 53*480093f4SDimitry Andricdef DirectivePwr9: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR9", "">; 54*480093f4SDimitry Andricdef DirectivePwrFuture 55*480093f4SDimitry 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">; 169*480093f4SDimitry Andricdef FeatureUnalignedFloats : 170*480093f4SDimitry Andric SubtargetFeature<"allow-unaligned-fp-access", "AllowsUnalignedFPAccess", 171*480093f4SDimitry 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: 217*480093f4SDimitry Andric// list<SubtargetFeature> P8InheritableFeatures = ... 218*480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorAddtionalFeatures = 219*480093f4SDimitry Andric// [ features that Power8 does not support but inheritable ] 220*480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorSpecificFeatures = 221*480093f4SDimitry Andric// [ features that Power8 does not support and not inheritable ] 222*480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorInheritableFeatures = 223*480093f4SDimitry Andric// !listconcat(P8InheritableFeatures, FutureProcessorAddtionalFeatures) 224*480093f4SDimitry Andric// list<SubtargetFeature> FutureProcessorFeatures = 225*480093f4SDimitry Andric// !listconcat(FutureProcessorInheritableFeatures, 226*480093f4SDimitry 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 { 232*480093f4SDimitry Andric // Power7 233*480093f4SDimitry Andric list<SubtargetFeature> P7InheritableFeatures = [DirectivePwr7, 234*480093f4SDimitry Andric FeatureAltivec, 235*480093f4SDimitry Andric FeatureVSX, 236*480093f4SDimitry Andric FeatureMFOCRF, 237*480093f4SDimitry Andric FeatureFCPSGN, 238*480093f4SDimitry Andric FeatureFSqrt, 239*480093f4SDimitry Andric FeatureFRE, 240*480093f4SDimitry Andric FeatureFRES, 241*480093f4SDimitry Andric FeatureFRSQRTE, 242*480093f4SDimitry Andric FeatureFRSQRTES, 243*480093f4SDimitry Andric FeatureRecipPrec, 244*480093f4SDimitry Andric FeatureSTFIWX, 245*480093f4SDimitry Andric FeatureLFIWAX, 246*480093f4SDimitry Andric FeatureFPRND, 247*480093f4SDimitry Andric FeatureFPCVT, 248*480093f4SDimitry Andric FeatureISEL, 249*480093f4SDimitry Andric FeaturePOPCNTD, 250*480093f4SDimitry Andric FeatureCMPB, 251*480093f4SDimitry Andric FeatureLDBRX, 252*480093f4SDimitry Andric Feature64Bit, 253*480093f4SDimitry Andric /* Feature64BitRegs, */ 254*480093f4SDimitry Andric FeatureBPERMD, 255*480093f4SDimitry Andric FeatureExtDiv, 256*480093f4SDimitry Andric FeatureMFTB, 257*480093f4SDimitry Andric DeprecatedDST, 258*480093f4SDimitry Andric FeatureTwoConstNR, 259*480093f4SDimitry Andric FeatureUnalignedFloats]; 260*480093f4SDimitry Andric list<SubtargetFeature> P7SpecificFeatures = []; 261*480093f4SDimitry Andric list<SubtargetFeature> P7Features = 262*480093f4SDimitry Andric !listconcat(P7InheritableFeatures, P7SpecificFeatures); 263*480093f4SDimitry Andric 264*480093f4SDimitry Andric // Power8 265*480093f4SDimitry Andric list<SubtargetFeature> P8AdditionalFeatures = [DirectivePwr8, 266*480093f4SDimitry Andric FeatureP8Altivec, 267*480093f4SDimitry Andric FeatureP8Vector, 268*480093f4SDimitry Andric FeatureP8Crypto, 269*480093f4SDimitry Andric FeatureHTM, 270*480093f4SDimitry Andric FeatureDirectMove, 271*480093f4SDimitry Andric FeatureICBT, 272*480093f4SDimitry Andric FeaturePartwordAtomic]; 273*480093f4SDimitry Andric list<SubtargetFeature> P8SpecificFeatures = []; 274*480093f4SDimitry Andric list<SubtargetFeature> P8InheritableFeatures = 275*480093f4SDimitry Andric !listconcat(P7InheritableFeatures, P8AdditionalFeatures); 276*480093f4SDimitry Andric list<SubtargetFeature> P8Features = 277*480093f4SDimitry Andric !listconcat(P8InheritableFeatures, P8SpecificFeatures); 278*480093f4SDimitry Andric 279*480093f4SDimitry Andric // Power9 280*480093f4SDimitry Andric list<SubtargetFeature> P9AdditionalFeatures = [DirectivePwr9, 281*480093f4SDimitry Andric FeatureP9Altivec, 282*480093f4SDimitry Andric FeatureP9Vector, 283*480093f4SDimitry Andric FeatureISA3_0]; 284*480093f4SDimitry Andric // Some features are unique to Power9 and there is no reason to assume 285*480093f4SDimitry Andric // they will be part of any future CPUs. One example is the narrower 286*480093f4SDimitry Andric // dispatch for vector operations than scalar ones. For the time being, 287*480093f4SDimitry Andric // this list also includes scheduling-related features since we do not have 288*480093f4SDimitry Andric // enough info to create custom scheduling strategies for future CPUs. 289*480093f4SDimitry Andric list<SubtargetFeature> P9SpecificFeatures = [FeatureVectorsUseTwoUnits, 290*480093f4SDimitry Andric FeaturePPCPreRASched, 291*480093f4SDimitry Andric FeaturePPCPostRASched]; 292*480093f4SDimitry Andric list<SubtargetFeature> P9InheritableFeatures = 293*480093f4SDimitry Andric !listconcat(P8InheritableFeatures, P9AdditionalFeatures); 294*480093f4SDimitry Andric list<SubtargetFeature> P9Features = 295*480093f4SDimitry Andric !listconcat(P9InheritableFeatures, P9SpecificFeatures); 296*480093f4SDimitry Andric 297*480093f4SDimitry Andric // Future 298*480093f4SDimitry Andric // For future CPU we assume that all of the existing features from Power 9 299*480093f4SDimitry Andric // still exist with the exception of those we know are Power 9 specific. 300*480093f4SDimitry Andric list<SubtargetFeature> FutureAdditionalFeatures = []; 301*480093f4SDimitry Andric list<SubtargetFeature> FutureSpecificFeatures = []; 302*480093f4SDimitry Andric list<SubtargetFeature> FutureInheritableFeatures = 303*480093f4SDimitry Andric !listconcat(P9InheritableFeatures, FutureAdditionalFeatures); 304*480093f4SDimitry Andric list<SubtargetFeature> FutureFeatures = 305*480093f4SDimitry 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, 445f8e1cfadSDimitry Andric FeatureISEL, FeatureMFTB, 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]>; 505*480093f4SDimitry Andricdef : ProcessorModel<"pwr7", P7Model, ProcessorFeatures.P7Features>; 506*480093f4SDimitry Andricdef : ProcessorModel<"pwr8", P8Model, ProcessorFeatures.P8Features>; 507*480093f4SDimitry Andricdef : ProcessorModel<"pwr9", P9Model, ProcessorFeatures.P9Features>; 508*480093f4SDimitry Andric// No scheduler model for future CPU. 509*480093f4SDimitry Andricdef : ProcessorModel<"future", NoSchedModel, 510*480093f4SDimitry 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]>; 521*480093f4SDimitry 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