xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPC.td (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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
58*bdd1243dSDimitry Andric// Specifies that the selected CPU supports 64-bit instructions, regardless of
59*bdd1243dSDimitry 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">;
68*bdd1243dSDimitry Andric
69*bdd1243dSDimitry Andric// Specifies that we are in 64-bit mode or that we should use 64-bit registers
70*bdd1243dSDimitry 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]">;
73*bdd1243dSDimitry Andric
74*bdd1243dSDimitry Andric// Specify if we should store and manipulate i1 values in the individual
75*bdd1243dSDimitry 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">;
144*bdd1243dSDimitry 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">;
183*bdd1243dSDimitry 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
257*bdd1243dSDimitry 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
3215ffd83dbSDimitry Andricdef FeaturePredictableSelectIsExpensive :
3225ffd83dbSDimitry Andric  SubtargetFeature<"predictable-select-expensive",
3235ffd83dbSDimitry Andric                   "PredictableSelectIsExpensive",
3245ffd83dbSDimitry Andric                   "true",
3255ffd83dbSDimitry Andric                   "Prefer likely predicted branches over selects">;
3260b57cec5SDimitry Andric
327*bdd1243dSDimitry Andricdef FeatureFastMFLR : SubtargetFeature<"fast-MFLR", "HasFastMFLR", "true",
328*bdd1243dSDimitry Andric                                       "MFLR is a fast instruction">;
329*bdd1243dSDimitry Andric
3300b57cec5SDimitry Andric// Since new processors generally contain a superset of features of those that
3310b57cec5SDimitry Andric// came before them, the idea is to make implementations of new processors
3320b57cec5SDimitry Andric// less error prone and easier to read.
3330b57cec5SDimitry Andric// Namely:
334480093f4SDimitry Andric//     list<SubtargetFeature> P8InheritableFeatures = ...
335480093f4SDimitry Andric//     list<SubtargetFeature> FutureProcessorAddtionalFeatures =
336480093f4SDimitry Andric//         [ features that Power8 does not support but inheritable ]
337480093f4SDimitry Andric//     list<SubtargetFeature> FutureProcessorSpecificFeatures =
338480093f4SDimitry Andric//         [ features that Power8 does not support and not inheritable ]
339480093f4SDimitry Andric//     list<SubtargetFeature> FutureProcessorInheritableFeatures =
340480093f4SDimitry Andric//         !listconcat(P8InheritableFeatures, FutureProcessorAddtionalFeatures)
341480093f4SDimitry Andric//     list<SubtargetFeature> FutureProcessorFeatures =
342480093f4SDimitry Andric//         !listconcat(FutureProcessorInheritableFeatures,
343480093f4SDimitry Andric//                     FutureProcessorSpecificFeatures)
3440b57cec5SDimitry Andric
3455ffd83dbSDimitry Andric// Makes it explicit and obvious what is new in FutureProcessor vs. Power8 as
3460b57cec5SDimitry Andric// well as providing a single point of definition if the feature set will be
3470b57cec5SDimitry Andric// used elsewhere.
3480b57cec5SDimitry Andricdef ProcessorFeatures {
349480093f4SDimitry Andric  // Power7
350480093f4SDimitry Andric  list<SubtargetFeature> P7InheritableFeatures = [DirectivePwr7,
351480093f4SDimitry Andric                                                  FeatureAltivec,
352480093f4SDimitry Andric                                                  FeatureVSX,
353480093f4SDimitry Andric                                                  FeatureMFOCRF,
354480093f4SDimitry Andric                                                  FeatureFCPSGN,
355480093f4SDimitry Andric                                                  FeatureFSqrt,
356480093f4SDimitry Andric                                                  FeatureFRE,
357480093f4SDimitry Andric                                                  FeatureFRES,
358480093f4SDimitry Andric                                                  FeatureFRSQRTE,
359480093f4SDimitry Andric                                                  FeatureFRSQRTES,
360480093f4SDimitry Andric                                                  FeatureRecipPrec,
361480093f4SDimitry Andric                                                  FeatureSTFIWX,
362480093f4SDimitry Andric                                                  FeatureLFIWAX,
363480093f4SDimitry Andric                                                  FeatureFPRND,
364480093f4SDimitry Andric                                                  FeatureFPCVT,
365480093f4SDimitry Andric                                                  FeatureISEL,
366480093f4SDimitry Andric                                                  FeaturePOPCNTD,
367480093f4SDimitry Andric                                                  FeatureCMPB,
368480093f4SDimitry Andric                                                  FeatureLDBRX,
369480093f4SDimitry Andric                                                  Feature64Bit,
370480093f4SDimitry Andric                                                  /* Feature64BitRegs, */
371480093f4SDimitry Andric                                                  FeatureBPERMD,
372480093f4SDimitry Andric                                                  FeatureExtDiv,
373480093f4SDimitry Andric                                                  FeatureMFTB,
374480093f4SDimitry Andric                                                  DeprecatedDST,
3750946e70aSDimitry Andric                                                  FeatureTwoConstNR,
376349cc55cSDimitry Andric                                                  FeatureUnalignedFloats,
377349cc55cSDimitry Andric                                                  FeatureISA2_06];
378480093f4SDimitry Andric  list<SubtargetFeature> P7SpecificFeatures = [];
379480093f4SDimitry Andric  list<SubtargetFeature> P7Features =
380480093f4SDimitry Andric    !listconcat(P7InheritableFeatures, P7SpecificFeatures);
381480093f4SDimitry Andric
382480093f4SDimitry Andric  // Power8
3835ffd83dbSDimitry Andric  list<SubtargetFeature> P8AdditionalFeatures =
3845ffd83dbSDimitry Andric    [DirectivePwr8,
385480093f4SDimitry Andric     FeatureP8Altivec,
386480093f4SDimitry Andric     FeatureP8Vector,
387480093f4SDimitry Andric     FeatureP8Crypto,
388480093f4SDimitry Andric     FeatureHTM,
389480093f4SDimitry Andric     FeatureDirectMove,
390480093f4SDimitry Andric     FeatureICBT,
3915ffd83dbSDimitry Andric     FeaturePartwordAtomic,
392fe6060f1SDimitry Andric     FeatureQuadwordAtomic,
393fe6060f1SDimitry Andric     FeaturePredictableSelectIsExpensive,
39481ad6265SDimitry Andric     FeatureISA2_07,
39581ad6265SDimitry Andric     FeatureCRBits
3965ffd83dbSDimitry Andric    ];
3975ffd83dbSDimitry Andric
3985ffd83dbSDimitry Andric  list<SubtargetFeature> P8SpecificFeatures = [FeatureAddiLoadFusion,
3995ffd83dbSDimitry Andric                                               FeatureAddisLoadFusion];
400480093f4SDimitry Andric  list<SubtargetFeature> P8InheritableFeatures =
401480093f4SDimitry Andric    !listconcat(P7InheritableFeatures, P8AdditionalFeatures);
402480093f4SDimitry Andric  list<SubtargetFeature> P8Features =
403480093f4SDimitry Andric    !listconcat(P8InheritableFeatures, P8SpecificFeatures);
404480093f4SDimitry Andric
405480093f4SDimitry Andric  // Power9
4065ffd83dbSDimitry Andric  list<SubtargetFeature> P9AdditionalFeatures =
4075ffd83dbSDimitry Andric    [DirectivePwr9,
408480093f4SDimitry Andric     FeatureP9Altivec,
409480093f4SDimitry Andric     FeatureP9Vector,
410e8d8bef9SDimitry Andric     FeaturePPCPreRASched,
411e8d8bef9SDimitry Andric     FeaturePPCPostRASched,
4125ffd83dbSDimitry Andric     FeatureISA3_0,
4135ffd83dbSDimitry Andric     FeaturePredictableSelectIsExpensive
4145ffd83dbSDimitry Andric    ];
4155ffd83dbSDimitry Andric
416480093f4SDimitry Andric  // Some features are unique to Power9 and there is no reason to assume
417480093f4SDimitry Andric  // they will be part of any future CPUs. One example is the narrower
418480093f4SDimitry Andric  // dispatch for vector operations than scalar ones. For the time being,
419480093f4SDimitry Andric  // this list also includes scheduling-related features since we do not have
420480093f4SDimitry Andric  // enough info to create custom scheduling strategies for future CPUs.
421e8d8bef9SDimitry Andric  list<SubtargetFeature> P9SpecificFeatures = [FeatureVectorsUseTwoUnits];
422480093f4SDimitry Andric  list<SubtargetFeature> P9InheritableFeatures =
423480093f4SDimitry Andric    !listconcat(P8InheritableFeatures, P9AdditionalFeatures);
424480093f4SDimitry Andric  list<SubtargetFeature> P9Features =
425480093f4SDimitry Andric    !listconcat(P9InheritableFeatures, P9SpecificFeatures);
426480093f4SDimitry Andric
4275ffd83dbSDimitry Andric  // Power10
4285ffd83dbSDimitry Andric  // For P10 CPU we assume that all of the existing features from Power9
429480093f4SDimitry Andric  // still exist with the exception of those we know are Power9 specific.
430349cc55cSDimitry Andric  list<SubtargetFeature> FusionFeatures = [
431349cc55cSDimitry Andric    FeatureStoreFusion, FeatureAddLogicalFusion, FeatureLogicalAddFusion,
4324824e7fdSDimitry Andric    FeatureLogicalFusion, FeatureArithAddFusion, FeatureSha3Fusion,
433349cc55cSDimitry Andric  ];
4345ffd83dbSDimitry Andric  list<SubtargetFeature> P10AdditionalFeatures =
435e8d8bef9SDimitry Andric    !listconcat(FusionFeatures, [
436e8d8bef9SDimitry Andric       DirectivePwr10, FeatureISA3_1, FeaturePrefixInstrs,
437e8d8bef9SDimitry Andric       FeaturePCRelativeMemops, FeatureP10Vector, FeatureMMA,
438*bdd1243dSDimitry Andric       FeaturePairedVectorMemops, FeatureFastMFLR]);
4395ffd83dbSDimitry Andric  list<SubtargetFeature> P10SpecificFeatures = [];
4405ffd83dbSDimitry Andric  list<SubtargetFeature> P10InheritableFeatures =
4415ffd83dbSDimitry Andric    !listconcat(P9InheritableFeatures, P10AdditionalFeatures);
4425ffd83dbSDimitry Andric  list<SubtargetFeature> P10Features =
4435ffd83dbSDimitry Andric    !listconcat(P10InheritableFeatures, P10SpecificFeatures);
4445ffd83dbSDimitry Andric
4455ffd83dbSDimitry Andric  // Future
4465ffd83dbSDimitry Andric  // For future CPU we assume that all of the existing features from Power10
4475ffd83dbSDimitry Andric  // still exist with the exception of those we know are Power10 specific.
44881ad6265SDimitry Andric  list<SubtargetFeature> FutureAdditionalFeatures = [FeatureISAFuture];
449480093f4SDimitry Andric  list<SubtargetFeature> FutureSpecificFeatures = [];
450480093f4SDimitry Andric  list<SubtargetFeature> FutureInheritableFeatures =
4515ffd83dbSDimitry Andric    !listconcat(P10InheritableFeatures, FutureAdditionalFeatures);
452480093f4SDimitry Andric  list<SubtargetFeature> FutureFeatures =
453480093f4SDimitry Andric    !listconcat(FutureInheritableFeatures, FutureSpecificFeatures);
4540b57cec5SDimitry Andric}
4550b57cec5SDimitry Andric
4560b57cec5SDimitry Andric// Note: Future features to add when support is extended to more
4570b57cec5SDimitry Andric// recent ISA levels:
4580b57cec5SDimitry Andric//
4590b57cec5SDimitry Andric// DFP          p6, p6x, p7        decimal floating-point instructions
4600b57cec5SDimitry Andric// POPCNTB      p5 through p7      popcntb and related instructions
4610b57cec5SDimitry Andric
4620b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4630b57cec5SDimitry Andric// Classes used for relation maps.
4640b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4650b57cec5SDimitry Andric// RecFormRel - Filter class used to relate non-record-form instructions with
4660b57cec5SDimitry Andric// their record-form variants.
4670b57cec5SDimitry Andricclass RecFormRel;
4680b57cec5SDimitry Andric
4690b57cec5SDimitry Andric// AltVSXFMARel - Filter class used to relate the primary addend-killing VSX
4700b57cec5SDimitry Andric// FMA instruction forms with their corresponding factor-killing forms.
4710b57cec5SDimitry Andricclass AltVSXFMARel {
4720b57cec5SDimitry Andric  bit IsVSXFMAAlt = 0;
4730b57cec5SDimitry Andric}
4740b57cec5SDimitry Andric
4750b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4760b57cec5SDimitry Andric// Relation Map Definitions.
4770b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4780b57cec5SDimitry Andric
4790b57cec5SDimitry Andricdef getRecordFormOpcode : InstrMapping {
4800b57cec5SDimitry Andric  let FilterClass = "RecFormRel";
4810b57cec5SDimitry Andric  // Instructions with the same BaseName and Interpretation64Bit values
4820b57cec5SDimitry Andric  // form a row.
4830b57cec5SDimitry Andric  let RowFields = ["BaseName", "Interpretation64Bit"];
4840b57cec5SDimitry Andric  // Instructions with the same RC value form a column.
4850b57cec5SDimitry Andric  let ColFields = ["RC"];
4860b57cec5SDimitry Andric  // The key column are the non-record-form instructions.
4870b57cec5SDimitry Andric  let KeyCol = ["0"];
4880b57cec5SDimitry Andric  // Value columns RC=1
4890b57cec5SDimitry Andric  let ValueCols = [["1"]];
4900b57cec5SDimitry Andric}
4910b57cec5SDimitry Andric
4920b57cec5SDimitry Andricdef getNonRecordFormOpcode : InstrMapping {
4930b57cec5SDimitry Andric  let FilterClass = "RecFormRel";
4940b57cec5SDimitry Andric  // Instructions with the same BaseName and Interpretation64Bit values
4950b57cec5SDimitry Andric  // form a row.
4960b57cec5SDimitry Andric  let RowFields = ["BaseName", "Interpretation64Bit"];
4970b57cec5SDimitry Andric  // Instructions with the same RC value form a column.
4980b57cec5SDimitry Andric  let ColFields = ["RC"];
4990b57cec5SDimitry Andric  // The key column are the record-form instructions.
5000b57cec5SDimitry Andric  let KeyCol = ["1"];
5010b57cec5SDimitry Andric  // Value columns are RC=0
5020b57cec5SDimitry Andric  let ValueCols = [["0"]];
5030b57cec5SDimitry Andric}
5040b57cec5SDimitry Andric
5050b57cec5SDimitry Andricdef getAltVSXFMAOpcode : InstrMapping {
5060b57cec5SDimitry Andric  let FilterClass = "AltVSXFMARel";
5070b57cec5SDimitry Andric  // Instructions with the same BaseName value form a row.
5080b57cec5SDimitry Andric  let RowFields = ["BaseName"];
5090b57cec5SDimitry Andric  // Instructions with the same IsVSXFMAAlt value form a column.
5100b57cec5SDimitry Andric  let ColFields = ["IsVSXFMAAlt"];
5110b57cec5SDimitry Andric  // The key column are the (default) addend-killing instructions.
5120b57cec5SDimitry Andric  let KeyCol = ["0"];
5130b57cec5SDimitry Andric  // Value columns IsVSXFMAAlt=1
5140b57cec5SDimitry Andric  let ValueCols = [["1"]];
5150b57cec5SDimitry Andric}
5160b57cec5SDimitry Andric
5170b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
5180b57cec5SDimitry Andric// Register File Description
5190b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
5200b57cec5SDimitry Andric
5210b57cec5SDimitry Andricinclude "PPCRegisterInfo.td"
5220b57cec5SDimitry Andricinclude "PPCSchedule.td"
523e8d8bef9SDimitry Andricinclude "GISel/PPCRegisterBanks.td"
5240b57cec5SDimitry Andric
5250b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
5260b57cec5SDimitry Andric// PowerPC processors supported.
5270b57cec5SDimitry Andric//
5280b57cec5SDimitry Andric
5290b57cec5SDimitry Andricdef : Processor<"generic", G3Itineraries, [Directive32, FeatureHardFloat,
5300b57cec5SDimitry Andric                                           FeatureMFTB]>;
5310b57cec5SDimitry Andricdef : ProcessorModel<"440", PPC440Model, [Directive440, FeatureISEL,
5320b57cec5SDimitry Andric                                          FeatureFRES, FeatureFRSQRTE,
5330b57cec5SDimitry Andric                                          FeatureICBT, FeatureBookE,
5340b57cec5SDimitry Andric                                          FeatureMSYNC, FeatureMFTB]>;
5350b57cec5SDimitry Andricdef : ProcessorModel<"450", PPC440Model, [Directive440, FeatureISEL,
5360b57cec5SDimitry Andric                                          FeatureFRES, FeatureFRSQRTE,
5370b57cec5SDimitry Andric                                          FeatureICBT, FeatureBookE,
5380b57cec5SDimitry Andric                                          FeatureMSYNC, FeatureMFTB]>;
5390b57cec5SDimitry Andricdef : Processor<"601", G3Itineraries, [Directive601, FeatureFPU]>;
5400b57cec5SDimitry Andricdef : Processor<"602", G3Itineraries, [Directive602, FeatureFPU,
5410b57cec5SDimitry Andric                                       FeatureMFTB]>;
5420b57cec5SDimitry Andricdef : Processor<"603", G3Itineraries, [Directive603,
5430b57cec5SDimitry Andric                                       FeatureFRES, FeatureFRSQRTE,
5440b57cec5SDimitry Andric                                       FeatureMFTB]>;
5450b57cec5SDimitry Andricdef : Processor<"603e", G3Itineraries, [Directive603,
5460b57cec5SDimitry Andric                                        FeatureFRES, FeatureFRSQRTE,
5470b57cec5SDimitry Andric                                        FeatureMFTB]>;
5480b57cec5SDimitry Andricdef : Processor<"603ev", G3Itineraries, [Directive603,
5490b57cec5SDimitry Andric                                         FeatureFRES, FeatureFRSQRTE,
5500b57cec5SDimitry Andric                                         FeatureMFTB]>;
5510b57cec5SDimitry Andricdef : Processor<"604", G3Itineraries, [Directive604,
5520b57cec5SDimitry Andric                                       FeatureFRES, FeatureFRSQRTE,
5530b57cec5SDimitry Andric                                       FeatureMFTB]>;
5540b57cec5SDimitry Andricdef : Processor<"604e", G3Itineraries, [Directive604,
5550b57cec5SDimitry Andric                                        FeatureFRES, FeatureFRSQRTE,
5560b57cec5SDimitry Andric                                        FeatureMFTB]>;
5570b57cec5SDimitry Andricdef : Processor<"620", G3Itineraries, [Directive620,
5580b57cec5SDimitry Andric                                       FeatureFRES, FeatureFRSQRTE,
5590b57cec5SDimitry Andric                                       FeatureMFTB]>;
5600b57cec5SDimitry Andricdef : Processor<"750", G4Itineraries, [Directive750,
5610b57cec5SDimitry Andric                                       FeatureFRES, FeatureFRSQRTE,
5620b57cec5SDimitry Andric                                       FeatureMFTB]>;
5630b57cec5SDimitry Andricdef : Processor<"g3", G3Itineraries, [Directive750,
5640b57cec5SDimitry Andric                                      FeatureFRES, FeatureFRSQRTE,
5650b57cec5SDimitry Andric                                      FeatureMFTB]>;
5660b57cec5SDimitry Andricdef : Processor<"7400", G4Itineraries, [Directive7400, FeatureAltivec,
5670b57cec5SDimitry Andric                                        FeatureFRES, FeatureFRSQRTE,
5680b57cec5SDimitry Andric                                        FeatureMFTB]>;
5690b57cec5SDimitry Andricdef : Processor<"g4", G4Itineraries, [Directive7400, FeatureAltivec,
5700b57cec5SDimitry Andric                                      FeatureFRES, FeatureFRSQRTE,
5710b57cec5SDimitry Andric                                      FeatureMFTB]>;
5720b57cec5SDimitry Andricdef : Processor<"7450", G4PlusItineraries, [Directive7400, FeatureAltivec,
5730b57cec5SDimitry Andric                                            FeatureFRES, FeatureFRSQRTE,
5740b57cec5SDimitry Andric                                            FeatureMFTB]>;
5750b57cec5SDimitry Andricdef : Processor<"g4+", G4PlusItineraries, [Directive7400, FeatureAltivec,
5760b57cec5SDimitry Andric                                           FeatureFRES, FeatureFRSQRTE,
5770b57cec5SDimitry Andric                                           FeatureMFTB]>;
5780b57cec5SDimitry Andric
5790b57cec5SDimitry Andricdef : ProcessorModel<"970", G5Model,
5800b57cec5SDimitry Andric                  [Directive970, FeatureAltivec,
5810b57cec5SDimitry Andric                   FeatureMFOCRF, FeatureFSqrt,
5820b57cec5SDimitry Andric                   FeatureFRES, FeatureFRSQRTE, FeatureSTFIWX,
5830b57cec5SDimitry Andric                   Feature64Bit /*, Feature64BitRegs */,
5840b57cec5SDimitry Andric                   FeatureMFTB]>;
5850b57cec5SDimitry Andricdef : ProcessorModel<"g5", G5Model,
5860b57cec5SDimitry Andric                  [Directive970, FeatureAltivec,
5870b57cec5SDimitry Andric                   FeatureMFOCRF, FeatureFSqrt, FeatureSTFIWX,
5880b57cec5SDimitry Andric                   FeatureFRES, FeatureFRSQRTE,
5890b57cec5SDimitry Andric                   Feature64Bit /*, Feature64BitRegs */,
5900b57cec5SDimitry Andric                   FeatureMFTB, DeprecatedDST]>;
5910b57cec5SDimitry Andricdef : ProcessorModel<"e500", PPCE500Model,
5920b57cec5SDimitry Andric                  [DirectiveE500,
5930b57cec5SDimitry Andric                   FeatureICBT, FeatureBookE,
5945b5f869eSDimitry Andric                   FeatureISEL, FeatureMFTB, FeatureMSYNC, FeatureSPE]>;
5950b57cec5SDimitry Andricdef : ProcessorModel<"e500mc", PPCE500mcModel,
5960b57cec5SDimitry Andric                  [DirectiveE500mc,
5970b57cec5SDimitry Andric                   FeatureSTFIWX, FeatureICBT, FeatureBookE,
5980b57cec5SDimitry Andric                   FeatureISEL, FeatureMFTB]>;
5990b57cec5SDimitry Andricdef : ProcessorModel<"e5500", PPCE5500Model,
6000b57cec5SDimitry Andric                  [DirectiveE5500, FeatureMFOCRF, Feature64Bit,
6010b57cec5SDimitry Andric                   FeatureSTFIWX, FeatureICBT, FeatureBookE,
6020b57cec5SDimitry Andric                   FeatureISEL, FeatureMFTB]>;
6030b57cec5SDimitry Andricdef : ProcessorModel<"a2", PPCA2Model,
6040b57cec5SDimitry Andric                  [DirectiveA2, FeatureICBT, FeatureBookE, FeatureMFOCRF,
6050b57cec5SDimitry Andric                   FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES,
6060b57cec5SDimitry Andric                   FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec,
6070b57cec5SDimitry Andric                   FeatureSTFIWX, FeatureLFIWAX,
6080b57cec5SDimitry Andric                   FeatureFPRND, FeatureFPCVT, FeatureISEL,
6090b57cec5SDimitry Andric                   FeatureSlowPOPCNTD, FeatureCMPB, FeatureLDBRX,
61081ad6265SDimitry Andric                   Feature64Bit /*, Feature64BitRegs */, FeatureMFTB,
61181ad6265SDimitry Andric                   FeatureISA2_06]>;
6120b57cec5SDimitry Andricdef : ProcessorModel<"pwr3", G5Model,
6130b57cec5SDimitry Andric                  [DirectivePwr3, FeatureAltivec,
6140b57cec5SDimitry Andric                   FeatureFRES, FeatureFRSQRTE, FeatureMFOCRF,
6150b57cec5SDimitry Andric                   FeatureSTFIWX, Feature64Bit]>;
6160b57cec5SDimitry Andricdef : ProcessorModel<"pwr4", G5Model,
6170b57cec5SDimitry Andric                  [DirectivePwr4, FeatureAltivec, FeatureMFOCRF,
6180b57cec5SDimitry Andric                   FeatureFSqrt, FeatureFRES, FeatureFRSQRTE,
6190b57cec5SDimitry Andric                   FeatureSTFIWX, Feature64Bit, FeatureMFTB]>;
6200b57cec5SDimitry Andricdef : ProcessorModel<"pwr5", G5Model,
6210b57cec5SDimitry Andric                  [DirectivePwr5, FeatureAltivec, FeatureMFOCRF,
6220b57cec5SDimitry Andric                   FeatureFSqrt, FeatureFRE, FeatureFRES,
6230b57cec5SDimitry Andric                   FeatureFRSQRTE, FeatureFRSQRTES,
6240b57cec5SDimitry Andric                   FeatureSTFIWX, Feature64Bit,
6250b57cec5SDimitry Andric                   FeatureMFTB, DeprecatedDST]>;
6260b57cec5SDimitry Andricdef : ProcessorModel<"pwr5x", G5Model,
6270b57cec5SDimitry Andric                  [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF,
6280b57cec5SDimitry Andric                   FeatureFSqrt, FeatureFRE, FeatureFRES,
6290b57cec5SDimitry Andric                   FeatureFRSQRTE, FeatureFRSQRTES,
6300b57cec5SDimitry Andric                   FeatureSTFIWX, FeatureFPRND, Feature64Bit,
6310b57cec5SDimitry Andric                   FeatureMFTB, DeprecatedDST]>;
6320b57cec5SDimitry Andricdef : ProcessorModel<"pwr6", G5Model,
6330b57cec5SDimitry Andric                  [DirectivePwr6, FeatureAltivec,
6340b57cec5SDimitry Andric                   FeatureMFOCRF, FeatureFCPSGN, FeatureFSqrt, FeatureFRE,
6350b57cec5SDimitry Andric                   FeatureFRES, FeatureFRSQRTE, FeatureFRSQRTES,
6360b57cec5SDimitry Andric                   FeatureRecipPrec, FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB,
6370b57cec5SDimitry Andric                   FeatureFPRND, Feature64Bit /*, Feature64BitRegs */,
6380b57cec5SDimitry Andric                   FeatureMFTB, DeprecatedDST]>;
6390b57cec5SDimitry Andricdef : ProcessorModel<"pwr6x", G5Model,
6400b57cec5SDimitry Andric                  [DirectivePwr5x, FeatureAltivec, FeatureMFOCRF,
6410b57cec5SDimitry Andric                   FeatureFCPSGN, FeatureFSqrt, FeatureFRE, FeatureFRES,
6420b57cec5SDimitry Andric                   FeatureFRSQRTE, FeatureFRSQRTES, FeatureRecipPrec,
6430b57cec5SDimitry Andric                   FeatureSTFIWX, FeatureLFIWAX, FeatureCMPB,
6440b57cec5SDimitry Andric                   FeatureFPRND, Feature64Bit,
6450b57cec5SDimitry Andric                   FeatureMFTB, DeprecatedDST]>;
646480093f4SDimitry Andricdef : ProcessorModel<"pwr7", P7Model, ProcessorFeatures.P7Features>;
647480093f4SDimitry Andricdef : ProcessorModel<"pwr8", P8Model, ProcessorFeatures.P8Features>;
648480093f4SDimitry Andricdef : ProcessorModel<"pwr9", P9Model, ProcessorFeatures.P9Features>;
649349cc55cSDimitry Andricdef : ProcessorModel<"pwr10", P10Model, ProcessorFeatures.P10Features>;
650480093f4SDimitry Andric// No scheduler model for future CPU.
651480093f4SDimitry Andricdef : ProcessorModel<"future", NoSchedModel,
652480093f4SDimitry Andric                  ProcessorFeatures.FutureFeatures>;
6530b57cec5SDimitry Andricdef : Processor<"ppc", G3Itineraries, [Directive32, FeatureHardFloat,
6540b57cec5SDimitry Andric                                       FeatureMFTB]>;
6550b57cec5SDimitry Andricdef : Processor<"ppc32", G3Itineraries, [Directive32, FeatureHardFloat,
6560b57cec5SDimitry Andric                                         FeatureMFTB]>;
6570b57cec5SDimitry Andricdef : ProcessorModel<"ppc64", G5Model,
6580b57cec5SDimitry Andric                  [Directive64, FeatureAltivec,
6590b57cec5SDimitry Andric                   FeatureMFOCRF, FeatureFSqrt, FeatureFRES,
6600b57cec5SDimitry Andric                   FeatureFRSQRTE, FeatureSTFIWX,
6610b57cec5SDimitry Andric                   Feature64Bit /*, Feature64BitRegs */,
6620b57cec5SDimitry Andric                   FeatureMFTB]>;
663480093f4SDimitry Andricdef : ProcessorModel<"ppc64le", P8Model, ProcessorFeatures.P8Features>;
6640b57cec5SDimitry Andric
6650b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
6660b57cec5SDimitry Andric// Calling Conventions
6670b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
6680b57cec5SDimitry Andric
6690b57cec5SDimitry Andricinclude "PPCCallingConv.td"
6700b57cec5SDimitry Andric
6710b57cec5SDimitry Andricdef PPCInstrInfo : InstrInfo {
6720b57cec5SDimitry Andric  let isLittleEndianEncoding = 1;
6730b57cec5SDimitry Andric
6740b57cec5SDimitry Andric  // FIXME: Unset this when no longer needed!
6750b57cec5SDimitry Andric  let decodePositionallyEncodedOperands = 1;
6760b57cec5SDimitry Andric
6770b57cec5SDimitry Andric  let noNamedPositionallyEncodedOperands = 1;
678*bdd1243dSDimitry Andric  let useDeprecatedPositionallyEncodedOperands = 1;
6790b57cec5SDimitry Andric}
6800b57cec5SDimitry Andric
681e8d8bef9SDimitry Andricdef PPCAsmWriter : AsmWriter {
682e8d8bef9SDimitry Andric  string AsmWriterClassName  = "InstPrinter";
683e8d8bef9SDimitry Andric  int PassSubtarget = 1;
684e8d8bef9SDimitry Andric  int Variant = 0;
685e8d8bef9SDimitry Andric  bit isMCAsmWriter = 1;
686e8d8bef9SDimitry Andric}
687e8d8bef9SDimitry Andric
6880b57cec5SDimitry Andricdef PPCAsmParser : AsmParser {
6890b57cec5SDimitry Andric  let ShouldEmitMatchRegisterName = 0;
6900b57cec5SDimitry Andric}
6910b57cec5SDimitry Andric
6920b57cec5SDimitry Andricdef PPCAsmParserVariant : AsmParserVariant {
6930b57cec5SDimitry Andric  int Variant = 0;
6940b57cec5SDimitry Andric
6950b57cec5SDimitry Andric  // We do not use hard coded registers in asm strings.  However, some
6960b57cec5SDimitry Andric  // InstAlias definitions use immediate literals.  Set RegisterPrefix
6970b57cec5SDimitry Andric  // so that those are not misinterpreted as registers.
6980b57cec5SDimitry Andric  string RegisterPrefix = "%";
6990b57cec5SDimitry Andric  string BreakCharacters = ".";
7000b57cec5SDimitry Andric}
7010b57cec5SDimitry Andric
7020b57cec5SDimitry Andricdef PPC : Target {
7030b57cec5SDimitry Andric  // Information about the instructions.
7040b57cec5SDimitry Andric  let InstructionSet = PPCInstrInfo;
7050b57cec5SDimitry Andric
706e8d8bef9SDimitry Andric  let AssemblyWriters = [PPCAsmWriter];
7070b57cec5SDimitry Andric  let AssemblyParsers = [PPCAsmParser];
7080b57cec5SDimitry Andric  let AssemblyParserVariants = [PPCAsmParserVariant];
7090b57cec5SDimitry Andric  let AllowRegisterRenaming = 1;
7100b57cec5SDimitry Andric}
7110b57cec5SDimitry Andric
7120b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7130b57cec5SDimitry Andric// Pfm Counters
7140b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7150b57cec5SDimitry Andric
7160b57cec5SDimitry Andricinclude "PPCPfmCounters.td"
717