xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPC.td (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
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