xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPC.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric//===-- PPC.td - Describe the PowerPC Target Machine -------*- tablegen -*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric//
90b57cec5SDimitry Andric// This is the top level entry point for the PowerPC target.
100b57cec5SDimitry Andric//
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric// Get the target-independent interfaces which we are implementing.
140b57cec5SDimitry Andric//
150b57cec5SDimitry Andricinclude "llvm/Target/Target.td"
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
180b57cec5SDimitry Andric// PowerPC Subtarget features.
190b57cec5SDimitry Andric//
200b57cec5SDimitry Andric
210b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
220b57cec5SDimitry Andric// CPU Directives                                                             //
230b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
240b57cec5SDimitry Andric
25480093f4SDimitry Andricdef Directive440 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_440", "">;
26480093f4SDimitry Andricdef Directive601 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_601", "">;
27480093f4SDimitry Andricdef Directive602 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_602", "">;
28480093f4SDimitry Andricdef Directive603 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_603", "">;
29480093f4SDimitry Andricdef Directive604 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_603", "">;
30480093f4SDimitry Andricdef Directive620 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_603", "">;
31480093f4SDimitry Andricdef Directive7400: SubtargetFeature<"", "CPUDirective", "PPC::DIR_7400", "">;
32480093f4SDimitry Andricdef Directive750 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_750", "">;
33480093f4SDimitry Andricdef Directive970 : SubtargetFeature<"", "CPUDirective", "PPC::DIR_970", "">;
34480093f4SDimitry Andricdef Directive32  : SubtargetFeature<"", "CPUDirective", "PPC::DIR_32", "">;
35480093f4SDimitry Andricdef Directive64  : SubtargetFeature<"", "CPUDirective", "PPC::DIR_64", "">;
36480093f4SDimitry Andricdef DirectiveA2  : SubtargetFeature<"", "CPUDirective", "PPC::DIR_A2", "">;
37480093f4SDimitry Andricdef DirectiveE500   : SubtargetFeature<"", "CPUDirective",
380b57cec5SDimitry Andric                                       "PPC::DIR_E500", "">;
39480093f4SDimitry Andricdef DirectiveE500mc : SubtargetFeature<"", "CPUDirective",
400b57cec5SDimitry Andric                                       "PPC::DIR_E500mc", "">;
41480093f4SDimitry Andricdef DirectiveE5500  : SubtargetFeature<"", "CPUDirective",
420b57cec5SDimitry Andric                                       "PPC::DIR_E5500", "">;
43480093f4SDimitry Andricdef DirectivePwr3: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR3", "">;
44480093f4SDimitry Andricdef DirectivePwr4: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR4", "">;
45480093f4SDimitry Andricdef DirectivePwr5: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR5", "">;
460b57cec5SDimitry Andricdef DirectivePwr5x
47480093f4SDimitry Andric    : SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR5X", "">;
48480093f4SDimitry Andricdef DirectivePwr6: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR6", "">;
490b57cec5SDimitry Andricdef DirectivePwr6x
50480093f4SDimitry Andric    : SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR6X", "">;
51480093f4SDimitry Andricdef DirectivePwr7: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR7", "">;
52480093f4SDimitry Andricdef DirectivePwr8: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR8", "">;
53480093f4SDimitry Andricdef DirectivePwr9: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR9", "">;
545ffd83dbSDimitry Andricdef DirectivePwr10: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR10", "">;
55480093f4SDimitry Andricdef DirectivePwrFuture
56480093f4SDimitry Andric    : SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR_FUTURE", "">;
570b57cec5SDimitry Andric
58bdd1243dSDimitry Andric// Specifies that the selected CPU supports 64-bit instructions, regardless of
59bdd1243dSDimitry Andric// whether we are in 32-bit or 64-bit mode.
600b57cec5SDimitry Andricdef Feature64Bit     : SubtargetFeature<"64bit","Has64BitSupport", "true",
610b57cec5SDimitry Andric                                        "Enable 64-bit instructions">;
62e8d8bef9SDimitry Andricdef AIXOS: SubtargetFeature<"aix", "IsAIX", "true", "AIX OS">;
63e8d8bef9SDimitry Andricdef FeatureModernAIXAs
64e8d8bef9SDimitry Andric    : SubtargetFeature<"modern-aix-as", "HasModernAIXAs", "true",
65e8d8bef9SDimitry Andric                       "AIX system assembler is modern enough to support new mnes">;
660b57cec5SDimitry Andricdef FeatureHardFloat : SubtargetFeature<"hard-float", "HasHardFloat", "true",
670b57cec5SDimitry Andric                              "Enable floating-point instructions">;
68bdd1243dSDimitry Andric
69bdd1243dSDimitry Andric// Specifies that we are in 64-bit mode or that we should use 64-bit registers
70bdd1243dSDimitry Andric// in 32-bit mode when possible. Requires Feature64Bit to be enabled.
710b57cec5SDimitry Andricdef Feature64BitRegs : SubtargetFeature<"64bitregs","Use64BitRegs", "true",
720b57cec5SDimitry Andric                              "Enable 64-bit registers usage for ppc32 [beta]">;
73bdd1243dSDimitry Andric
74bdd1243dSDimitry Andric// Specify if we should store and manipulate i1 values in the individual
75bdd1243dSDimitry Andric// condition register bits.
760b57cec5SDimitry Andricdef FeatureCRBits    : SubtargetFeature<"crbits", "UseCRBits", "true",
770b57cec5SDimitry Andric                              "Use condition-register bits individually">;
780b57cec5SDimitry Andricdef FeatureFPU       : SubtargetFeature<"fpu","HasFPU","true",
790b57cec5SDimitry Andric                                        "Enable classic FPU instructions",
800b57cec5SDimitry Andric                                        [FeatureHardFloat]>;
810b57cec5SDimitry Andricdef FeatureAltivec   : SubtargetFeature<"altivec","HasAltivec", "true",
820b57cec5SDimitry Andric                                        "Enable Altivec instructions",
830b57cec5SDimitry Andric                                        [FeatureFPU]>;
840b57cec5SDimitry Andricdef FeatureSPE       : SubtargetFeature<"spe","HasSPE", "true",
850b57cec5SDimitry Andric                                        "Enable SPE instructions",
860b57cec5SDimitry Andric                                        [FeatureHardFloat]>;
87e8d8bef9SDimitry Andricdef FeatureEFPU2 : SubtargetFeature<"efpu2", "HasEFPU2", "true",
88e8d8bef9SDimitry Andric                                        "Enable Embedded Floating-Point APU 2 instructions",
89e8d8bef9SDimitry Andric                                        [FeatureSPE]>;
900b57cec5SDimitry Andricdef FeatureMFOCRF    : SubtargetFeature<"mfocrf","HasMFOCRF", "true",
910b57cec5SDimitry Andric                                        "Enable the MFOCRF instruction">;
920b57cec5SDimitry Andricdef FeatureFSqrt     : SubtargetFeature<"fsqrt","HasFSQRT", "true",
930b57cec5SDimitry Andric                                        "Enable the fsqrt instruction",
940b57cec5SDimitry Andric                                        [FeatureFPU]>;
950b57cec5SDimitry Andricdef FeatureFCPSGN    : SubtargetFeature<"fcpsgn", "HasFCPSGN", "true",
960b57cec5SDimitry Andric                                        "Enable the fcpsgn instruction",
970b57cec5SDimitry Andric                                        [FeatureFPU]>;
980b57cec5SDimitry Andricdef FeatureFRE       : SubtargetFeature<"fre", "HasFRE", "true",
990b57cec5SDimitry Andric                                        "Enable the fre instruction",
1000b57cec5SDimitry Andric                                        [FeatureFPU]>;
1010b57cec5SDimitry Andricdef FeatureFRES      : SubtargetFeature<"fres", "HasFRES", "true",
1020b57cec5SDimitry Andric                                        "Enable the fres instruction",
1030b57cec5SDimitry Andric                                        [FeatureFPU]>;
1040b57cec5SDimitry Andricdef FeatureFRSQRTE   : SubtargetFeature<"frsqrte", "HasFRSQRTE", "true",
1050b57cec5SDimitry Andric                                        "Enable the frsqrte instruction",
1060b57cec5SDimitry Andric                                        [FeatureFPU]>;
1070b57cec5SDimitry Andricdef FeatureFRSQRTES  : SubtargetFeature<"frsqrtes", "HasFRSQRTES", "true",
1080b57cec5SDimitry Andric                                        "Enable the frsqrtes instruction",
1090b57cec5SDimitry Andric                                        [FeatureFPU]>;
1100b57cec5SDimitry Andricdef FeatureRecipPrec : SubtargetFeature<"recipprec", "HasRecipPrec", "true",
1110b57cec5SDimitry Andric                              "Assume higher precision reciprocal estimates">;
1120b57cec5SDimitry Andricdef FeatureSTFIWX    : SubtargetFeature<"stfiwx","HasSTFIWX", "true",
1130b57cec5SDimitry Andric                                        "Enable the stfiwx instruction",
1140b57cec5SDimitry Andric                                        [FeatureFPU]>;
1150b57cec5SDimitry Andricdef FeatureLFIWAX    : SubtargetFeature<"lfiwax","HasLFIWAX", "true",
1160b57cec5SDimitry Andric                                        "Enable the lfiwax instruction",
1170b57cec5SDimitry Andric                                        [FeatureFPU]>;
1180b57cec5SDimitry Andricdef FeatureFPRND     : SubtargetFeature<"fprnd", "HasFPRND", "true",
1190b57cec5SDimitry Andric                                        "Enable the fri[mnpz] instructions",
1200b57cec5SDimitry Andric                                        [FeatureFPU]>;
1210b57cec5SDimitry Andricdef FeatureFPCVT     : SubtargetFeature<"fpcvt", "HasFPCVT", "true",
1220b57cec5SDimitry Andric  "Enable fc[ft]* (unsigned and single-precision) and lfiwzx instructions",
1230b57cec5SDimitry Andric                                        [FeatureFPU]>;
1240b57cec5SDimitry Andricdef FeatureISEL      : SubtargetFeature<"isel","HasISEL", "true",
1250b57cec5SDimitry Andric                                        "Enable the isel instruction">;
1260b57cec5SDimitry Andricdef FeatureBPERMD    : SubtargetFeature<"bpermd", "HasBPERMD", "true",
1270b57cec5SDimitry Andric                                        "Enable the bpermd instruction">;
1280b57cec5SDimitry Andricdef FeatureExtDiv    : SubtargetFeature<"extdiv", "HasExtDiv", "true",
1290b57cec5SDimitry Andric                                        "Enable extended divide instructions">;
1300b57cec5SDimitry Andricdef FeatureLDBRX     : SubtargetFeature<"ldbrx","HasLDBRX", "true",
1310b57cec5SDimitry Andric                                        "Enable the ldbrx instruction">;
1320b57cec5SDimitry Andricdef FeatureCMPB      : SubtargetFeature<"cmpb", "HasCMPB", "true",
1330b57cec5SDimitry Andric                                        "Enable the cmpb instruction">;
1340b57cec5SDimitry Andricdef FeatureICBT      : SubtargetFeature<"icbt","HasICBT", "true",
1350b57cec5SDimitry Andric                                        "Enable icbt instruction">;
1360b57cec5SDimitry Andricdef FeatureBookE     : SubtargetFeature<"booke", "IsBookE", "true",
1370b57cec5SDimitry Andric                                        "Enable Book E instructions",
1380b57cec5SDimitry Andric                                        [FeatureICBT]>;
1390b57cec5SDimitry Andricdef FeatureMSYNC     : SubtargetFeature<"msync", "HasOnlyMSYNC", "true",
1400b57cec5SDimitry Andric                              "Has only the msync instruction instead of sync",
1410b57cec5SDimitry Andric                              [FeatureBookE]>;
1420b57cec5SDimitry Andricdef FeatureE500      : SubtargetFeature<"e500", "IsE500", "true",
1430b57cec5SDimitry Andric                                        "Enable E500/E500mc instructions">;
144bdd1243dSDimitry Andricdef FeatureSecurePlt : SubtargetFeature<"secure-plt","IsSecurePlt", "true",
1450b57cec5SDimitry Andric                                        "Enable secure plt mode">;
1460b57cec5SDimitry Andricdef FeaturePPC4xx    : SubtargetFeature<"ppc4xx", "IsPPC4xx", "true",
1470b57cec5SDimitry Andric                                        "Enable PPC 4xx instructions">;
1480b57cec5SDimitry Andricdef FeaturePPC6xx    : SubtargetFeature<"ppc6xx", "IsPPC6xx", "true",
1490b57cec5SDimitry Andric                                        "Enable PPC 6xx instructions">;
1500b57cec5SDimitry Andricdef FeatureVSX       : SubtargetFeature<"vsx","HasVSX", "true",
1510b57cec5SDimitry Andric                                        "Enable VSX instructions",
1520b57cec5SDimitry Andric                                        [FeatureAltivec]>;
1530b57cec5SDimitry Andricdef FeatureTwoConstNR :
1540b57cec5SDimitry Andric  SubtargetFeature<"two-const-nr", "NeedsTwoConstNR", "true",
1550b57cec5SDimitry Andric                   "Requires two constant Newton-Raphson computation">;
1560b57cec5SDimitry Andricdef FeatureP8Altivec : SubtargetFeature<"power8-altivec", "HasP8Altivec", "true",
1570b57cec5SDimitry Andric                                        "Enable POWER8 Altivec instructions",
1580b57cec5SDimitry Andric                                        [FeatureAltivec]>;
1590b57cec5SDimitry Andricdef FeatureP8Crypto : SubtargetFeature<"crypto", "HasP8Crypto", "true",
1600b57cec5SDimitry Andric                                       "Enable POWER8 Crypto instructions",
1610b57cec5SDimitry Andric                                       [FeatureP8Altivec]>;
1620b57cec5SDimitry Andricdef FeatureP8Vector  : SubtargetFeature<"power8-vector", "HasP8Vector", "true",
1630b57cec5SDimitry Andric                                        "Enable POWER8 vector instructions",
1640b57cec5SDimitry Andric                                        [FeatureVSX, FeatureP8Altivec]>;
1650b57cec5SDimitry Andricdef FeatureDirectMove :
1660b57cec5SDimitry Andric  SubtargetFeature<"direct-move", "HasDirectMove", "true",
1670b57cec5SDimitry Andric                   "Enable Power8 direct move instructions",
1680b57cec5SDimitry Andric                   [FeatureVSX]>;
1690b57cec5SDimitry Andricdef FeaturePartwordAtomic : SubtargetFeature<"partword-atomics",
1700b57cec5SDimitry Andric                                             "HasPartwordAtomics", "true",
1710b57cec5SDimitry Andric                                             "Enable l[bh]arx and st[bh]cx.">;
172fe6060f1SDimitry Andricdef FeatureQuadwordAtomic : SubtargetFeature<"quadword-atomics",
173fe6060f1SDimitry Andric                                             "HasQuadwordAtomics", "true",
174fe6060f1SDimitry Andric                                             "Enable lqarx and stqcx.">;
1750b57cec5SDimitry Andricdef FeatureInvariantFunctionDescriptors :
1760b57cec5SDimitry Andric  SubtargetFeature<"invariant-function-descriptors",
1770b57cec5SDimitry Andric                   "HasInvariantFunctionDescriptors", "true",
1780b57cec5SDimitry Andric                   "Assume function descriptors are invariant">;
1790b57cec5SDimitry Andricdef FeatureLongCall : SubtargetFeature<"longcall", "UseLongCalls", "true",
1800b57cec5SDimitry Andric                                       "Always use indirect calls">;
1810b57cec5SDimitry Andricdef FeatureHTM : SubtargetFeature<"htm", "HasHTM", "true",
1820b57cec5SDimitry Andric                                  "Enable Hardware Transactional Memory instructions">;
183bdd1243dSDimitry Andricdef FeatureMFTB   : SubtargetFeature<"", "IsFeatureMFTB", "true",
1840b57cec5SDimitry Andric                                        "Implement mftb using the mfspr instruction">;
1855ffd83dbSDimitry Andricdef FeatureFusion : SubtargetFeature<"fusion", "HasFusion", "true",
1865ffd83dbSDimitry Andric                                     "Target supports instruction fusion">;
1875ffd83dbSDimitry Andricdef FeatureAddiLoadFusion : SubtargetFeature<"fuse-addi-load",
1885ffd83dbSDimitry Andric                                             "HasAddiLoadFusion", "true",
1895ffd83dbSDimitry Andric                                             "Power8 Addi-Load fusion",
1905ffd83dbSDimitry Andric                                             [FeatureFusion]>;
1915ffd83dbSDimitry Andricdef FeatureAddisLoadFusion : SubtargetFeature<"fuse-addis-load",
1925ffd83dbSDimitry Andric                                              "HasAddisLoadFusion", "true",
1935ffd83dbSDimitry Andric                                              "Power8 Addis-Load fusion",
1945ffd83dbSDimitry Andric                                              [FeatureFusion]>;
195e8d8bef9SDimitry Andricdef FeatureStoreFusion : SubtargetFeature<"fuse-store", "HasStoreFusion", "true",
196e8d8bef9SDimitry Andric                                          "Target supports store clustering",
197e8d8bef9SDimitry Andric                                          [FeatureFusion]>;
198349cc55cSDimitry Andricdef FeatureArithAddFusion :
199349cc55cSDimitry Andric  SubtargetFeature<"fuse-arith-add", "HasArithAddFusion", "true",
200349cc55cSDimitry Andric                   "Target supports Arithmetic Operations with Add fusion",
201349cc55cSDimitry Andric                   [FeatureFusion]>;
202349cc55cSDimitry Andricdef FeatureAddLogicalFusion :
203349cc55cSDimitry Andric  SubtargetFeature<"fuse-add-logical", "HasAddLogicalFusion", "true",
204349cc55cSDimitry Andric                   "Target supports Add with Logical Operations fusion",
205349cc55cSDimitry Andric                   [FeatureFusion]>;
206349cc55cSDimitry Andricdef FeatureLogicalAddFusion :
207349cc55cSDimitry Andric  SubtargetFeature<"fuse-logical-add", "HasLogicalAddFusion", "true",
208349cc55cSDimitry Andric                   "Target supports Logical with Add Operations fusion",
209349cc55cSDimitry Andric                   [FeatureFusion]>;
210349cc55cSDimitry Andricdef FeatureLogicalFusion :
211349cc55cSDimitry Andric  SubtargetFeature<"fuse-logical", "HasLogicalFusion", "true",
212349cc55cSDimitry Andric                   "Target supports Logical Operations fusion",
213349cc55cSDimitry Andric                   [FeatureFusion]>;
2144824e7fdSDimitry Andricdef FeatureSha3Fusion :
2154824e7fdSDimitry Andric  SubtargetFeature<"fuse-sha3", "HasSha3Fusion", "true",
2164824e7fdSDimitry Andric                   "Target supports SHA3 assist fusion",
2174824e7fdSDimitry Andric                   [FeatureFusion]>;
2184824e7fdSDimitry Andricdef FeatureCompareFusion:
2194824e7fdSDimitry Andric  SubtargetFeature<"fuse-cmp", "HasCompareFusion", "true",
2204824e7fdSDimitry Andric                   "Target supports Comparison Operations fusion",
2214824e7fdSDimitry Andric                   [FeatureFusion]>;
2224824e7fdSDimitry Andricdef FeatureWideImmFusion:
2234824e7fdSDimitry Andric  SubtargetFeature<"fuse-wideimm", "HasWideImmFusion", "true",
2244824e7fdSDimitry Andric                   "Target supports Wide-Immediate fusion",
2254824e7fdSDimitry Andric                   [FeatureFusion]>;
2264824e7fdSDimitry Andricdef FeatureZeroMoveFusion:
2274824e7fdSDimitry Andric  SubtargetFeature<"fuse-zeromove", "HasZeroMoveFusion", "true",
2284824e7fdSDimitry Andric                   "Target supports move to SPR with branch fusion",
2294824e7fdSDimitry Andric                   [FeatureFusion]>;
2300eae32dcSDimitry Andricdef FeatureBack2BackFusion:
2310eae32dcSDimitry Andric  SubtargetFeature<"fuse-back2back", "HasBack2BackFusion", "true",
2320eae32dcSDimitry Andric                   "Target supports general back to back fusion",
2330eae32dcSDimitry Andric                   [FeatureFusion]>;
2340946e70aSDimitry Andricdef FeatureUnalignedFloats :
2350946e70aSDimitry Andric  SubtargetFeature<"allow-unaligned-fp-access", "AllowsUnalignedFPAccess",
2360946e70aSDimitry Andric                   "true", "CPU does not trap on unaligned FP access">;
2370b57cec5SDimitry Andricdef FeaturePPCPreRASched:
2380b57cec5SDimitry Andric  SubtargetFeature<"ppc-prera-sched", "UsePPCPreRASchedStrategy", "true",
2390b57cec5SDimitry Andric                   "Use PowerPC pre-RA scheduling strategy">;
2400b57cec5SDimitry Andricdef FeaturePPCPostRASched:
2410b57cec5SDimitry Andric  SubtargetFeature<"ppc-postra-sched", "UsePPCPostRASchedStrategy", "true",
2420b57cec5SDimitry Andric                   "Use PowerPC post-RA scheduling strategy">;
2430b57cec5SDimitry Andricdef FeatureFloat128 :
2440b57cec5SDimitry Andric  SubtargetFeature<"float128", "HasFloat128", "true",
2450b57cec5SDimitry Andric                   "Enable the __float128 data type for IEEE-754R Binary128.",
2460b57cec5SDimitry Andric                   [FeatureVSX]>;
2470b57cec5SDimitry Andricdef FeaturePOPCNTD   : SubtargetFeature<"popcntd","HasPOPCNTD",
2480b57cec5SDimitry Andric                                        "POPCNTD_Fast",
2490b57cec5SDimitry Andric                                        "Enable the popcnt[dw] instructions">;
250e8d8bef9SDimitry Andric// Note that for the a2 processor models we should not use popcnt[dw] by
2510b57cec5SDimitry Andric// default. These processors do support the instructions, but they're
2520b57cec5SDimitry Andric// microcoded, and the software emulation is about twice as fast.
2530b57cec5SDimitry Andricdef FeatureSlowPOPCNTD : SubtargetFeature<"slow-popcntd","HasPOPCNTD",
2540b57cec5SDimitry Andric                                          "POPCNTD_Slow",
2550b57cec5SDimitry Andric                                          "Has slow popcnt[dw] instructions">;
2560b57cec5SDimitry Andric
257bdd1243dSDimitry Andricdef DeprecatedDST    : SubtargetFeature<"", "IsDeprecatedDST", "true",
2580b57cec5SDimitry Andric  "Treat vector data stream cache control instructions as deprecated">;
2590b57cec5SDimitry Andric
260349cc55cSDimitry Andricdef FeatureISA2_06 : SubtargetFeature<"isa-v206-instructions", "IsISA2_06",
261349cc55cSDimitry Andric                                      "true",
262349cc55cSDimitry Andric                                      "Enable instructions in ISA 2.06.">;
263fe6060f1SDimitry Andricdef FeatureISA2_07 : SubtargetFeature<"isa-v207-instructions", "IsISA2_07",
264fe6060f1SDimitry Andric                                      "true",
265fe6060f1SDimitry Andric                                      "Enable instructions in ISA 2.07.">;
2660b57cec5SDimitry Andricdef FeatureISA3_0 : SubtargetFeature<"isa-v30-instructions", "IsISA3_0",
2670b57cec5SDimitry Andric                                     "true",
268fe6060f1SDimitry Andric                                     "Enable instructions in ISA 3.0.",
269fe6060f1SDimitry Andric                                     [FeatureISA2_07]>;
2705ffd83dbSDimitry Andricdef FeatureISA3_1 : SubtargetFeature<"isa-v31-instructions", "IsISA3_1",
2715ffd83dbSDimitry Andric                                     "true",
2725ffd83dbSDimitry Andric                                     "Enable instructions in ISA 3.1.",
2735ffd83dbSDimitry Andric                                     [FeatureISA3_0]>;
27481ad6265SDimitry Andricdef FeatureISAFuture : SubtargetFeature<"isa-future-instructions",
27581ad6265SDimitry Andric                                        "IsISAFuture", "true",
27681ad6265SDimitry Andric                                        "Enable instructions for Future ISA.",
27781ad6265SDimitry Andric                                        [FeatureISA3_1]>;
2780b57cec5SDimitry Andricdef FeatureP9Altivec : SubtargetFeature<"power9-altivec", "HasP9Altivec", "true",
2790b57cec5SDimitry Andric                                        "Enable POWER9 Altivec instructions",
2800b57cec5SDimitry Andric                                        [FeatureISA3_0, FeatureP8Altivec]>;
2810b57cec5SDimitry Andricdef FeatureP9Vector  : SubtargetFeature<"power9-vector", "HasP9Vector", "true",
2820b57cec5SDimitry Andric                                        "Enable POWER9 vector instructions",
2830b57cec5SDimitry Andric                                        [FeatureISA3_0, FeatureP8Vector,
2840b57cec5SDimitry Andric                                         FeatureP9Altivec]>;
2855ffd83dbSDimitry Andricdef FeatureP10Vector  : SubtargetFeature<"power10-vector", "HasP10Vector",
2865ffd83dbSDimitry Andric                                         "true",
2875ffd83dbSDimitry Andric                                         "Enable POWER10 vector instructions",
2885ffd83dbSDimitry Andric                                         [FeatureISA3_1, FeatureP9Vector]>;
2890b57cec5SDimitry Andric// A separate feature for this even though it is equivalent to P9Vector
2900b57cec5SDimitry Andric// because this is a feature of the implementation rather than the architecture
2910b57cec5SDimitry Andric// and may go away with future CPU's.
2920b57cec5SDimitry Andricdef FeatureVectorsUseTwoUnits : SubtargetFeature<"vectors-use-two-units",
2930b57cec5SDimitry Andric                                                 "VectorsUseTwoUnits",
2940b57cec5SDimitry Andric                                                 "true",
2950b57cec5SDimitry Andric                                                 "Vectors use two units">;
2965ffd83dbSDimitry Andricdef FeaturePrefixInstrs : SubtargetFeature<"prefix-instrs", "HasPrefixInstrs",
2975ffd83dbSDimitry Andric                                           "true",
2985ffd83dbSDimitry Andric                                           "Enable prefixed instructions",
2995ffd83dbSDimitry Andric                                           [FeatureISA3_0, FeatureP8Vector,
3005ffd83dbSDimitry Andric                                            FeatureP9Altivec]>;
3015ffd83dbSDimitry Andricdef FeaturePCRelativeMemops :
3025ffd83dbSDimitry Andric  SubtargetFeature<"pcrelative-memops", "HasPCRelativeMemops", "true",
3035ffd83dbSDimitry Andric                   "Enable PC relative Memory Ops",
304e8d8bef9SDimitry Andric                   [FeatureISA3_0, FeaturePrefixInstrs]>;
305e8d8bef9SDimitry Andricdef FeaturePairedVectorMemops:
306e8d8bef9SDimitry Andric  SubtargetFeature<"paired-vector-memops", "PairedVectorMemops", "true",
307e8d8bef9SDimitry Andric                   "32Byte load and store instructions",
3085ffd83dbSDimitry Andric                   [FeatureISA3_0]>;
309e8d8bef9SDimitry Andricdef FeatureMMA : SubtargetFeature<"mma", "HasMMA", "true",
310e8d8bef9SDimitry Andric                                  "Enable MMA instructions",
311e8d8bef9SDimitry Andric                                  [FeatureP8Vector, FeatureP9Altivec,
312e8d8bef9SDimitry Andric                                   FeaturePairedVectorMemops]>;
313fe6060f1SDimitry Andricdef FeatureROPProtect :
314fe6060f1SDimitry Andric  SubtargetFeature<"rop-protect", "HasROPProtect", "true",
315fe6060f1SDimitry Andric                   "Add ROP protect">;
316fe6060f1SDimitry Andric
317fe6060f1SDimitry Andricdef FeaturePrivileged :
318fe6060f1SDimitry Andric  SubtargetFeature<"privileged", "HasPrivileged", "true",
319fe6060f1SDimitry Andric                   "Add privileged instructions">;
3205ffd83dbSDimitry Andric
321*5f757f3fSDimitry Andric// Specifies that local-exec TLS accesses in any function with this target
322*5f757f3fSDimitry Andric// attribute should use the optimized TOC-free sequence (where the offset is an
323*5f757f3fSDimitry Andric// immediate off of R13 for which the linker might add fix-up code if the
324*5f757f3fSDimitry Andric// immediate is too large).
325*5f757f3fSDimitry Andric// Clearly, this isn't really a feature of the subtarget, but is used as a
326*5f757f3fSDimitry Andric// convenient way to affect code generation for individual functions.
327*5f757f3fSDimitry Andricdef FeatureAIXLocalExecTLS :
328*5f757f3fSDimitry Andric  SubtargetFeature<"aix-small-local-exec-tls", "HasAIXSmallLocalExecTLS", "true",
329*5f757f3fSDimitry Andric                   "Produce a TOC-free local-exec TLS sequence for this function "
330*5f757f3fSDimitry Andric                   "for 64-bit AIX">;
331*5f757f3fSDimitry Andric
3325ffd83dbSDimitry Andricdef FeaturePredictableSelectIsExpensive :
3335ffd83dbSDimitry Andric  SubtargetFeature<"predictable-select-expensive",
3345ffd83dbSDimitry Andric                   "PredictableSelectIsExpensive",
3355ffd83dbSDimitry Andric                   "true",
3365ffd83dbSDimitry Andric                   "Prefer likely predicted branches over selects">;
3370b57cec5SDimitry Andric
338bdd1243dSDimitry Andricdef FeatureFastMFLR : SubtargetFeature<"fast-MFLR", "HasFastMFLR", "true",
339bdd1243dSDimitry Andric                                       "MFLR is a fast instruction">;
340bdd1243dSDimitry Andric
3410b57cec5SDimitry Andric// Since new processors generally contain a superset of features of those that
3420b57cec5SDimitry Andric// came before them, the idea is to make implementations of new processors
3430b57cec5SDimitry Andric// less error prone and easier to read.
3440b57cec5SDimitry Andric// Namely:
345480093f4SDimitry Andric//     list<SubtargetFeature> P8InheritableFeatures = ...
346480093f4SDimitry Andric//     list<SubtargetFeature> FutureProcessorAddtionalFeatures =
347480093f4SDimitry Andric//         [ features that Power8 does not support but inheritable ]
348480093f4SDimitry Andric//     list<SubtargetFeature> FutureProcessorSpecificFeatures =
349480093f4SDimitry Andric//         [ features that Power8 does not support and not inheritable ]
350480093f4SDimitry Andric//     list<SubtargetFeature> FutureProcessorInheritableFeatures =
351480093f4SDimitry Andric//         !listconcat(P8InheritableFeatures, FutureProcessorAddtionalFeatures)
352480093f4SDimitry Andric//     list<SubtargetFeature> FutureProcessorFeatures =
353480093f4SDimitry Andric//         !listconcat(FutureProcessorInheritableFeatures,
354480093f4SDimitry Andric//                     FutureProcessorSpecificFeatures)
3550b57cec5SDimitry Andric
3565ffd83dbSDimitry Andric// Makes it explicit and obvious what is new in FutureProcessor vs. Power8 as
3570b57cec5SDimitry Andric// well as providing a single point of definition if the feature set will be
3580b57cec5SDimitry Andric// used elsewhere.
3590b57cec5SDimitry Andricdef ProcessorFeatures {
360480093f4SDimitry Andric  // Power7
361480093f4SDimitry Andric  list<SubtargetFeature> P7InheritableFeatures = [DirectivePwr7,
362480093f4SDimitry Andric                                                  FeatureAltivec,
363480093f4SDimitry Andric                                                  FeatureVSX,
364480093f4SDimitry Andric                                                  FeatureMFOCRF,
365480093f4SDimitry Andric                                                  FeatureFCPSGN,
366480093f4SDimitry Andric                                                  FeatureFSqrt,
367480093f4SDimitry Andric                                                  FeatureFRE,
368480093f4SDimitry Andric                                                  FeatureFRES,
369480093f4SDimitry Andric                                                  FeatureFRSQRTE,
370480093f4SDimitry Andric                                                  FeatureFRSQRTES,
371480093f4SDimitry Andric                                                  FeatureRecipPrec,
372480093f4SDimitry Andric                                                  FeatureSTFIWX,
373480093f4SDimitry Andric                                                  FeatureLFIWAX,
374480093f4SDimitry Andric                                                  FeatureFPRND,
375480093f4SDimitry Andric                                                  FeatureFPCVT,
376480093f4SDimitry Andric                                                  FeatureISEL,
377480093f4SDimitry Andric                                                  FeaturePOPCNTD,
378480093f4SDimitry Andric                                                  FeatureCMPB,
379480093f4SDimitry Andric                                                  FeatureLDBRX,
380480093f4SDimitry Andric                                                  Feature64Bit,
381480093f4SDimitry Andric                                                  /* Feature64BitRegs, */
382480093f4SDimitry Andric                                                  FeatureBPERMD,
383480093f4SDimitry Andric                                                  FeatureExtDiv,
384480093f4SDimitry Andric                                                  FeatureMFTB,
385480093f4SDimitry Andric                                                  DeprecatedDST,
3860946e70aSDimitry Andric                                                  FeatureTwoConstNR,
387349cc55cSDimitry Andric                                                  FeatureUnalignedFloats,
388349cc55cSDimitry Andric                                                  FeatureISA2_06];
389480093f4SDimitry Andric  list<SubtargetFeature> P7SpecificFeatures = [];
390480093f4SDimitry Andric  list<SubtargetFeature> P7Features =
391480093f4SDimitry Andric    !listconcat(P7InheritableFeatures, P7SpecificFeatures);
392480093f4SDimitry Andric
393480093f4SDimitry Andric  // Power8
3945ffd83dbSDimitry Andric  list<SubtargetFeature> P8AdditionalFeatures =
3955ffd83dbSDimitry Andric    [DirectivePwr8,
396480093f4SDimitry Andric     FeatureP8Altivec,
397480093f4SDimitry Andric     FeatureP8Vector,
398480093f4SDimitry Andric     FeatureP8Crypto,
399480093f4SDimitry Andric     FeatureHTM,
400480093f4SDimitry Andric     FeatureDirectMove,
401480093f4SDimitry Andric     FeatureICBT,
4025ffd83dbSDimitry Andric     FeaturePartwordAtomic,
403fe6060f1SDimitry Andric     FeatureQuadwordAtomic,
404fe6060f1SDimitry Andric     FeaturePredictableSelectIsExpensive,
40581ad6265SDimitry Andric     FeatureISA2_07,
40681ad6265SDimitry Andric     FeatureCRBits
4075ffd83dbSDimitry Andric    ];
4085ffd83dbSDimitry Andric
4095ffd83dbSDimitry Andric  list<SubtargetFeature> P8SpecificFeatures = [FeatureAddiLoadFusion,
4105ffd83dbSDimitry Andric                                               FeatureAddisLoadFusion];
411480093f4SDimitry Andric  list<SubtargetFeature> P8InheritableFeatures =
412480093f4SDimitry Andric    !listconcat(P7InheritableFeatures, P8AdditionalFeatures);
413480093f4SDimitry Andric  list<SubtargetFeature> P8Features =
414480093f4SDimitry Andric    !listconcat(P8InheritableFeatures, P8SpecificFeatures);
415480093f4SDimitry Andric
416480093f4SDimitry Andric  // Power9
4175ffd83dbSDimitry Andric  list<SubtargetFeature> P9AdditionalFeatures =
4185ffd83dbSDimitry Andric    [DirectivePwr9,
419480093f4SDimitry Andric     FeatureP9Altivec,
420480093f4SDimitry Andric     FeatureP9Vector,
421e8d8bef9SDimitry Andric     FeaturePPCPreRASched,
422e8d8bef9SDimitry Andric     FeaturePPCPostRASched,
4235ffd83dbSDimitry Andric     FeatureISA3_0,
4245ffd83dbSDimitry Andric     FeaturePredictableSelectIsExpensive
4255ffd83dbSDimitry Andric    ];
4265ffd83dbSDimitry Andric
427480093f4SDimitry Andric  // Some features are unique to Power9 and there is no reason to assume
428480093f4SDimitry Andric  // they will be part of any future CPUs. One example is the narrower
429480093f4SDimitry Andric  // dispatch for vector operations than scalar ones. For the time being,
430480093f4SDimitry Andric  // this list also includes scheduling-related features since we do not have
431480093f4SDimitry Andric  // enough info to create custom scheduling strategies for future CPUs.
432e8d8bef9SDimitry Andric  list<SubtargetFeature> P9SpecificFeatures = [FeatureVectorsUseTwoUnits];
433480093f4SDimitry Andric  list<SubtargetFeature> P9InheritableFeatures =
434480093f4SDimitry Andric    !listconcat(P8InheritableFeatures, P9AdditionalFeatures);
435480093f4SDimitry Andric  list<SubtargetFeature> P9Features =
436480093f4SDimitry Andric    !listconcat(P9InheritableFeatures, P9SpecificFeatures);
437480093f4SDimitry Andric
4385ffd83dbSDimitry Andric  // Power10
4395ffd83dbSDimitry Andric  // For P10 CPU we assume that all of the existing features from Power9
440480093f4SDimitry Andric  // still exist with the exception of those we know are Power9 specific.
441349cc55cSDimitry Andric  list<SubtargetFeature> FusionFeatures = [
442349cc55cSDimitry Andric    FeatureStoreFusion, FeatureAddLogicalFusion, FeatureLogicalAddFusion,
4434824e7fdSDimitry Andric    FeatureLogicalFusion, FeatureArithAddFusion, FeatureSha3Fusion,
444349cc55cSDimitry Andric  ];
4455ffd83dbSDimitry Andric  list<SubtargetFeature> P10AdditionalFeatures =
446e8d8bef9SDimitry Andric    !listconcat(FusionFeatures, [
447e8d8bef9SDimitry Andric       DirectivePwr10, FeatureISA3_1, FeaturePrefixInstrs,
448e8d8bef9SDimitry Andric       FeaturePCRelativeMemops, FeatureP10Vector, FeatureMMA,
449bdd1243dSDimitry Andric       FeaturePairedVectorMemops, FeatureFastMFLR]);
4505ffd83dbSDimitry Andric  list<SubtargetFeature> P10SpecificFeatures = [];
4515ffd83dbSDimitry Andric  list<SubtargetFeature> P10InheritableFeatures =
4525ffd83dbSDimitry Andric    !listconcat(P9InheritableFeatures, P10AdditionalFeatures);
4535ffd83dbSDimitry Andric  list<SubtargetFeature> P10Features =
4545ffd83dbSDimitry Andric    !listconcat(P10InheritableFeatures, P10SpecificFeatures);
4555ffd83dbSDimitry Andric
4565ffd83dbSDimitry Andric  // Future
4575ffd83dbSDimitry Andric  // For future CPU we assume that all of the existing features from Power10
4585ffd83dbSDimitry Andric  // still exist with the exception of those we know are Power10 specific.
45981ad6265SDimitry Andric  list<SubtargetFeature> FutureAdditionalFeatures = [FeatureISAFuture];
460480093f4SDimitry Andric  list<SubtargetFeature> FutureSpecificFeatures = [];
461480093f4SDimitry Andric  list<SubtargetFeature> FutureInheritableFeatures =
4625ffd83dbSDimitry Andric    !listconcat(P10InheritableFeatures, FutureAdditionalFeatures);
463480093f4SDimitry Andric  list<SubtargetFeature> FutureFeatures =
464480093f4SDimitry Andric    !listconcat(FutureInheritableFeatures, FutureSpecificFeatures);
4650b57cec5SDimitry Andric}
4660b57cec5SDimitry Andric
4670b57cec5SDimitry Andric// Note: Future features to add when support is extended to more
4680b57cec5SDimitry Andric// recent ISA levels:
4690b57cec5SDimitry Andric//
4700b57cec5SDimitry Andric// DFP          p6, p6x, p7        decimal floating-point instructions
4710b57cec5SDimitry Andric// POPCNTB      p5 through p7      popcntb and related instructions
4720b57cec5SDimitry Andric
4730b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4740b57cec5SDimitry Andric// Classes used for relation maps.
4750b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4760b57cec5SDimitry Andric// RecFormRel - Filter class used to relate non-record-form instructions with
4770b57cec5SDimitry Andric// their record-form variants.
4780b57cec5SDimitry Andricclass RecFormRel;
4790b57cec5SDimitry Andric
4800b57cec5SDimitry Andric// AltVSXFMARel - Filter class used to relate the primary addend-killing VSX
4810b57cec5SDimitry Andric// FMA instruction forms with their corresponding factor-killing forms.
4820b57cec5SDimitry Andricclass AltVSXFMARel {
4830b57cec5SDimitry Andric  bit IsVSXFMAAlt = 0;
4840b57cec5SDimitry Andric}
4850b57cec5SDimitry Andric
4860b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4870b57cec5SDimitry Andric// Relation Map Definitions.
4880b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4890b57cec5SDimitry Andric
4900b57cec5SDimitry Andricdef getRecordFormOpcode : InstrMapping {
4910b57cec5SDimitry Andric  let FilterClass = "RecFormRel";
4920b57cec5SDimitry Andric  // Instructions with the same BaseName and Interpretation64Bit values
4930b57cec5SDimitry Andric  // form a row.
4940b57cec5SDimitry Andric  let RowFields = ["BaseName", "Interpretation64Bit"];
4950b57cec5SDimitry Andric  // Instructions with the same RC value form a column.
4960b57cec5SDimitry Andric  let ColFields = ["RC"];
4970b57cec5SDimitry Andric  // The key column are the non-record-form instructions.
4980b57cec5SDimitry Andric  let KeyCol = ["0"];
4990b57cec5SDimitry Andric  // Value columns RC=1
5000b57cec5SDimitry Andric  let ValueCols = [["1"]];
5010b57cec5SDimitry Andric}
5020b57cec5SDimitry Andric
5030b57cec5SDimitry Andricdef getNonRecordFormOpcode : InstrMapping {
5040b57cec5SDimitry Andric  let FilterClass = "RecFormRel";
5050b57cec5SDimitry Andric  // Instructions with the same BaseName and Interpretation64Bit values
5060b57cec5SDimitry Andric  // form a row.
5070b57cec5SDimitry Andric  let RowFields = ["BaseName", "Interpretation64Bit"];
5080b57cec5SDimitry Andric  // Instructions with the same RC value form a column.
5090b57cec5SDimitry Andric  let ColFields = ["RC"];
5100b57cec5SDimitry Andric  // The key column are the record-form instructions.
5110b57cec5SDimitry Andric  let KeyCol = ["1"];
5120b57cec5SDimitry Andric  // Value columns are RC=0
5130b57cec5SDimitry Andric  let ValueCols = [["0"]];
5140b57cec5SDimitry Andric}
5150b57cec5SDimitry Andric
5160b57cec5SDimitry Andricdef getAltVSXFMAOpcode : InstrMapping {
5170b57cec5SDimitry Andric  let FilterClass = "AltVSXFMARel";
5180b57cec5SDimitry Andric  // Instructions with the same BaseName value form a row.
5190b57cec5SDimitry Andric  let RowFields = ["BaseName"];
5200b57cec5SDimitry Andric  // Instructions with the same IsVSXFMAAlt value form a column.
5210b57cec5SDimitry Andric  let ColFields = ["IsVSXFMAAlt"];
5220b57cec5SDimitry Andric  // The key column are the (default) addend-killing instructions.
5230b57cec5SDimitry Andric  let KeyCol = ["0"];
5240b57cec5SDimitry Andric  // Value columns IsVSXFMAAlt=1
5250b57cec5SDimitry Andric  let ValueCols = [["1"]];
5260b57cec5SDimitry Andric}
5270b57cec5SDimitry Andric
5280b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
5290b57cec5SDimitry Andric// Register File Description
5300b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
5310b57cec5SDimitry Andric
5320b57cec5SDimitry Andricinclude "PPCRegisterInfo.td"
5330b57cec5SDimitry Andricinclude "PPCSchedule.td"
534e8d8bef9SDimitry Andricinclude "GISel/PPCRegisterBanks.td"
5350b57cec5SDimitry Andric
5360b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
5370b57cec5SDimitry Andric// PowerPC processors supported.
5380b57cec5SDimitry Andric//
5390b57cec5SDimitry Andric
5400b57cec5SDimitry Andricdef : Processor<"generic", G3Itineraries, [Directive32, FeatureHardFloat,
5410b57cec5SDimitry Andric                                           FeatureMFTB]>;
5420b57cec5SDimitry Andricdef : ProcessorModel<"440", PPC440Model, [Directive440, FeatureISEL,
5430b57cec5SDimitry Andric                                          FeatureFRES, FeatureFRSQRTE,
5440b57cec5SDimitry Andric                                          FeatureICBT, FeatureBookE,
5450b57cec5SDimitry Andric                                          FeatureMSYNC, FeatureMFTB]>;
5460b57cec5SDimitry Andricdef : ProcessorModel<"450", PPC440Model, [Directive440, FeatureISEL,
5470b57cec5SDimitry Andric                                          FeatureFRES, FeatureFRSQRTE,
5480b57cec5SDimitry Andric                                          FeatureICBT, FeatureBookE,
5490b57cec5SDimitry Andric                                          FeatureMSYNC, FeatureMFTB]>;
5500b57cec5SDimitry Andricdef : Processor<"601", G3Itineraries, [Directive601, FeatureFPU]>;
5510b57cec5SDimitry Andricdef : Processor<"602", G3Itineraries, [Directive602, FeatureFPU,
5520b57cec5SDimitry Andric                                       FeatureMFTB]>;
5530b57cec5SDimitry Andricdef : Processor<"603", G3Itineraries, [Directive603,
5540b57cec5SDimitry Andric                                       FeatureFRES, FeatureFRSQRTE,
5550b57cec5SDimitry Andric                                       FeatureMFTB]>;
5560b57cec5SDimitry Andricdef : Processor<"603e", G3Itineraries, [Directive603,
5570b57cec5SDimitry Andric                                        FeatureFRES, FeatureFRSQRTE,
5580b57cec5SDimitry Andric                                        FeatureMFTB]>;
5590b57cec5SDimitry Andricdef : Processor<"603ev", G3Itineraries, [Directive603,
5600b57cec5SDimitry Andric                                         FeatureFRES, FeatureFRSQRTE,
5610b57cec5SDimitry Andric                                         FeatureMFTB]>;
5620b57cec5SDimitry Andricdef : Processor<"604", G3Itineraries, [Directive604,
5630b57cec5SDimitry Andric                                       FeatureFRES, FeatureFRSQRTE,
5640b57cec5SDimitry Andric                                       FeatureMFTB]>;
5650b57cec5SDimitry Andricdef : Processor<"604e", G3Itineraries, [Directive604,
5660b57cec5SDimitry Andric                                        FeatureFRES, FeatureFRSQRTE,
5670b57cec5SDimitry Andric                                        FeatureMFTB]>;
5680b57cec5SDimitry Andricdef : Processor<"620", G3Itineraries, [Directive620,
5690b57cec5SDimitry Andric                                       FeatureFRES, FeatureFRSQRTE,
5700b57cec5SDimitry Andric                                       FeatureMFTB]>;
5710b57cec5SDimitry Andricdef : Processor<"750", G4Itineraries, [Directive750,
5720b57cec5SDimitry Andric                                       FeatureFRES, FeatureFRSQRTE,
5730b57cec5SDimitry Andric                                       FeatureMFTB]>;
5740b57cec5SDimitry Andricdef : Processor<"g3", G3Itineraries, [Directive750,
5750b57cec5SDimitry Andric                                      FeatureFRES, FeatureFRSQRTE,
5760b57cec5SDimitry Andric                                      FeatureMFTB]>;
5770b57cec5SDimitry Andricdef : Processor<"7400", G4Itineraries, [Directive7400, FeatureAltivec,
5780b57cec5SDimitry Andric                                        FeatureFRES, FeatureFRSQRTE,
5790b57cec5SDimitry Andric                                        FeatureMFTB]>;
5800b57cec5SDimitry Andricdef : Processor<"g4", G4Itineraries, [Directive7400, FeatureAltivec,
5810b57cec5SDimitry Andric                                      FeatureFRES, FeatureFRSQRTE,
5820b57cec5SDimitry Andric                                      FeatureMFTB]>;
5830b57cec5SDimitry Andricdef : Processor<"7450", G4PlusItineraries, [Directive7400, FeatureAltivec,
5840b57cec5SDimitry Andric                                            FeatureFRES, FeatureFRSQRTE,
5850b57cec5SDimitry Andric                                            FeatureMFTB]>;
5860b57cec5SDimitry Andricdef : Processor<"g4+", G4PlusItineraries, [Directive7400, FeatureAltivec,
5870b57cec5SDimitry Andric                                           FeatureFRES, FeatureFRSQRTE,
5880b57cec5SDimitry Andric                                           FeatureMFTB]>;
5890b57cec5SDimitry Andric
5900b57cec5SDimitry Andricdef : ProcessorModel<"970", G5Model,
5910b57cec5SDimitry Andric                  [Directive970, FeatureAltivec,
5920b57cec5SDimitry Andric                   FeatureMFOCRF, FeatureFSqrt,
5930b57cec5SDimitry Andric                   FeatureFRES, FeatureFRSQRTE, FeatureSTFIWX,
5940b57cec5SDimitry Andric                   Feature64Bit /*, Feature64BitRegs */,
5950b57cec5SDimitry Andric                   FeatureMFTB]>;
5960b57cec5SDimitry Andricdef : ProcessorModel<"g5", G5Model,
5970b57cec5SDimitry Andric                  [Directive970, FeatureAltivec,
5980b57cec5SDimitry Andric                   FeatureMFOCRF, FeatureFSqrt, FeatureSTFIWX,
5990b57cec5SDimitry Andric                   FeatureFRES, FeatureFRSQRTE,
6000b57cec5SDimitry Andric                   Feature64Bit /*, Feature64BitRegs */,
6010b57cec5SDimitry Andric                   FeatureMFTB, DeprecatedDST]>;
6020b57cec5SDimitry Andricdef : ProcessorModel<"e500", PPCE500Model,
6030b57cec5SDimitry Andric                  [DirectiveE500,
6040b57cec5SDimitry Andric                   FeatureICBT, FeatureBookE,
6055b5f869eSDimitry Andric                   FeatureISEL, FeatureMFTB, FeatureMSYNC, FeatureSPE]>;
6060b57cec5SDimitry Andricdef : ProcessorModel<"e500mc", PPCE500mcModel,
6070b57cec5SDimitry Andric                  [DirectiveE500mc,
6080b57cec5SDimitry Andric                   FeatureSTFIWX, FeatureICBT, FeatureBookE,
6090b57cec5SDimitry Andric                   FeatureISEL, FeatureMFTB]>;
6100b57cec5SDimitry Andricdef : ProcessorModel<"e5500", PPCE5500Model,
6110b57cec5SDimitry Andric                  [DirectiveE5500, FeatureMFOCRF, Feature64Bit,
6120b57cec5SDimitry Andric                   FeatureSTFIWX, FeatureICBT, FeatureBookE,
6130b57cec5SDimitry Andric                   FeatureISEL, FeatureMFTB]>;
6140b57cec5SDimitry Andricdef : ProcessorModel<"a2", PPCA2Model,
6150b57cec5SDimitry Andric                  [DirectiveA2, FeatureICBT, FeatureBookE, FeatureMFOCRF,
6160b57cec5SDimitry Andric                   FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES,
6170b57cec5SDimitry Andric                   FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec,
6180b57cec5SDimitry Andric                   FeatureSTFIWX, FeatureLFIWAX,
6190b57cec5SDimitry Andric                   FeatureFPRND, FeatureFPCVT, FeatureISEL,
6200b57cec5SDimitry Andric                   FeatureSlowPOPCNTD, FeatureCMPB, FeatureLDBRX,
62181ad6265SDimitry Andric                   Feature64Bit /*, Feature64BitRegs */, FeatureMFTB,
62281ad6265SDimitry Andric                   FeatureISA2_06]>;
6230b57cec5SDimitry Andricdef : ProcessorModel<"pwr3", G5Model,
6240b57cec5SDimitry Andric                  [DirectivePwr3, FeatureAltivec,
6250b57cec5SDimitry Andric                   FeatureFRES, FeatureFRSQRTE, FeatureMFOCRF,
6260b57cec5SDimitry Andric                   FeatureSTFIWX, Feature64Bit]>;
6270b57cec5SDimitry Andricdef : ProcessorModel<"pwr4", G5Model,
6280b57cec5SDimitry Andric                  [DirectivePwr4, FeatureAltivec, FeatureMFOCRF,
6290b57cec5SDimitry Andric                   FeatureFSqrt, FeatureFRES, FeatureFRSQRTE,
6300b57cec5SDimitry Andric                   FeatureSTFIWX, Feature64Bit, FeatureMFTB]>;
6310b57cec5SDimitry Andricdef : ProcessorModel<"pwr5", G5Model,
6320b57cec5SDimitry Andric                  [DirectivePwr5, FeatureAltivec, FeatureMFOCRF,
6330b57cec5SDimitry Andric                   FeatureFSqrt, FeatureFRE, FeatureFRES,
6340b57cec5SDimitry Andric                   FeatureFRSQRTE, FeatureFRSQRTES,
6350b57cec5SDimitry Andric                   FeatureSTFIWX, Feature64Bit,
6360b57cec5SDimitry Andric                   FeatureMFTB, DeprecatedDST]>;
6370b57cec5SDimitry Andricdef : ProcessorModel<"pwr5x", G5Model,
6380b57cec5SDimitry Andric                  [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF,
6390b57cec5SDimitry Andric                   FeatureFSqrt, FeatureFRE, FeatureFRES,
6400b57cec5SDimitry Andric                   FeatureFRSQRTE, FeatureFRSQRTES,
6410b57cec5SDimitry Andric                   FeatureSTFIWX, FeatureFPRND, Feature64Bit,
6420b57cec5SDimitry Andric                   FeatureMFTB, DeprecatedDST]>;
6430b57cec5SDimitry Andricdef : ProcessorModel<"pwr6", G5Model,
6440b57cec5SDimitry Andric                  [DirectivePwr6, FeatureAltivec,
6450b57cec5SDimitry Andric                   FeatureMFOCRF, FeatureFCPSGN, FeatureFSqrt, FeatureFRE,
6460b57cec5SDimitry Andric                   FeatureFRES, FeatureFRSQRTE, FeatureFRSQRTES,
6470b57cec5SDimitry Andric                   FeatureRecipPrec, FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB,
6480b57cec5SDimitry Andric                   FeatureFPRND, Feature64Bit /*, Feature64BitRegs */,
6490b57cec5SDimitry Andric                   FeatureMFTB, DeprecatedDST]>;
6500b57cec5SDimitry Andricdef : ProcessorModel<"pwr6x", G5Model,
6510b57cec5SDimitry Andric                  [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF,
6520b57cec5SDimitry Andric                   FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES,
6530b57cec5SDimitry Andric                   FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec,
6540b57cec5SDimitry Andric                   FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB,
6550b57cec5SDimitry Andric                   FeatureFPRND, Feature64Bit,
6560b57cec5SDimitry Andric                   FeatureMFTB, DeprecatedDST]>;
657480093f4SDimitry Andricdef : ProcessorModel<"pwr7", P7Model, ProcessorFeatures.P7Features>;
658480093f4SDimitry Andricdef : ProcessorModel<"pwr8", P8Model, ProcessorFeatures.P8Features>;
659480093f4SDimitry Andricdef : ProcessorModel<"pwr9", P9Model, ProcessorFeatures.P9Features>;
660349cc55cSDimitry Andricdef : ProcessorModel<"pwr10", P10Model, ProcessorFeatures.P10Features>;
661480093f4SDimitry Andric// No scheduler model for future CPU.
662480093f4SDimitry Andricdef : ProcessorModel<"future", NoSchedModel,
663480093f4SDimitry Andric                  ProcessorFeatures.FutureFeatures>;
6640b57cec5SDimitry Andricdef : Processor<"ppc", G3Itineraries, [Directive32, FeatureHardFloat,
6650b57cec5SDimitry Andric                                       FeatureMFTB]>;
6660b57cec5SDimitry Andricdef : Processor<"ppc32", G3Itineraries, [Directive32, FeatureHardFloat,
6670b57cec5SDimitry Andric                                         FeatureMFTB]>;
6680b57cec5SDimitry Andricdef : ProcessorModel<"ppc64", G5Model,
6690b57cec5SDimitry Andric                  [Directive64, FeatureAltivec,
6700b57cec5SDimitry Andric                   FeatureMFOCRF, FeatureFSqrt, FeatureFRES,
6710b57cec5SDimitry Andric                   FeatureFRSQRTE, FeatureSTFIWX,
6720b57cec5SDimitry Andric                   Feature64Bit /*, Feature64BitRegs */,
6730b57cec5SDimitry Andric                   FeatureMFTB]>;
674480093f4SDimitry Andricdef : ProcessorModel<"ppc64le", P8Model, ProcessorFeatures.P8Features>;
6750b57cec5SDimitry Andric
6760b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
6770b57cec5SDimitry Andric// Calling Conventions
6780b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
6790b57cec5SDimitry Andric
6800b57cec5SDimitry Andricinclude "PPCCallingConv.td"
6810b57cec5SDimitry Andric
6820b57cec5SDimitry Andricdef PPCInstrInfo : InstrInfo {
6830b57cec5SDimitry Andric  let isLittleEndianEncoding = 1;
6840b57cec5SDimitry Andric}
6850b57cec5SDimitry Andric
686e8d8bef9SDimitry Andricdef PPCAsmWriter : AsmWriter {
687e8d8bef9SDimitry Andric  string AsmWriterClassName  = "InstPrinter";
688e8d8bef9SDimitry Andric  int PassSubtarget = 1;
689e8d8bef9SDimitry Andric  int Variant = 0;
690e8d8bef9SDimitry Andric  bit isMCAsmWriter = 1;
691e8d8bef9SDimitry Andric}
692e8d8bef9SDimitry Andric
6930b57cec5SDimitry Andricdef PPCAsmParser : AsmParser {
6940b57cec5SDimitry Andric  let ShouldEmitMatchRegisterName = 0;
6950b57cec5SDimitry Andric}
6960b57cec5SDimitry Andric
6970b57cec5SDimitry Andricdef PPCAsmParserVariant : AsmParserVariant {
6980b57cec5SDimitry Andric  int Variant = 0;
6990b57cec5SDimitry Andric
7000b57cec5SDimitry Andric  // We do not use hard coded registers in asm strings.  However, some
7010b57cec5SDimitry Andric  // InstAlias definitions use immediate literals.  Set RegisterPrefix
7020b57cec5SDimitry Andric  // so that those are not misinterpreted as registers.
7030b57cec5SDimitry Andric  string RegisterPrefix = "%";
7040b57cec5SDimitry Andric  string BreakCharacters = ".";
7050b57cec5SDimitry Andric}
7060b57cec5SDimitry Andric
7070b57cec5SDimitry Andricdef PPC : Target {
7080b57cec5SDimitry Andric  // Information about the instructions.
7090b57cec5SDimitry Andric  let InstructionSet = PPCInstrInfo;
7100b57cec5SDimitry Andric
711e8d8bef9SDimitry Andric  let AssemblyWriters = [PPCAsmWriter];
7120b57cec5SDimitry Andric  let AssemblyParsers = [PPCAsmParser];
7130b57cec5SDimitry Andric  let AssemblyParserVariants = [PPCAsmParserVariant];
7140b57cec5SDimitry Andric  let AllowRegisterRenaming = 1;
7150b57cec5SDimitry Andric}
7160b57cec5SDimitry Andric
7170b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7180b57cec5SDimitry Andric// Pfm Counters
7190b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7200b57cec5SDimitry Andric
7210b57cec5SDimitry Andricinclude "PPCPfmCounters.td"
722