1//===-- PPC.h - Top-level interface for PowerPC Target ----------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the entry points for global functions defined in the LLVM
10// PowerPC back-end.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_POWERPC_PPC_H
15#define LLVM_LIB_TARGET_POWERPC_PPC_H
16
17#include "llvm/Support/CodeGen.h"
18
19// GCC #defines PPC on Linux but we use it as our namespace name
20#undef PPC
21
22namespace llvm {
23class PPCRegisterBankInfo;
24class PPCSubtarget;
25class PPCTargetMachine;
26class PassRegistry;
27class FunctionPass;
28class InstructionSelector;
29class MachineInstr;
30class MachineOperand;
31class AsmPrinter;
32class MCInst;
33class MCOperand;
34class ModulePass;
35
36#ifndef NDEBUG
37  FunctionPass *createPPCCTRLoopsVerify();
38#endif
39  FunctionPass *createPPCLoopInstrFormPrepPass(PPCTargetMachine &TM);
40  FunctionPass *createPPCTOCRegDepsPass();
41  FunctionPass *createPPCEarlyReturnPass();
42  FunctionPass *createPPCVSXCopyPass();
43  FunctionPass *createPPCVSXFMAMutatePass();
44  FunctionPass *createPPCVSXSwapRemovalPass();
45  FunctionPass *createPPCReduceCRLogicalsPass();
46  FunctionPass *createPPCMIPeepholePass();
47  FunctionPass *createPPCBranchSelectionPass();
48  FunctionPass *createPPCBranchCoalescingPass();
49  FunctionPass *createPPCISelDag(PPCTargetMachine &TM, CodeGenOptLevel OL);
50  FunctionPass *createPPCTLSDynamicCallPass();
51  FunctionPass *createPPCBoolRetToIntPass();
52  FunctionPass *createPPCExpandISELPass();
53  FunctionPass *createPPCPreEmitPeepholePass();
54  FunctionPass *createPPCExpandAtomicPseudoPass();
55  FunctionPass *createPPCCTRLoopsPass();
56  ModulePass *createPPCMergeStringPoolPass();
57  void LowerPPCMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
58                                    AsmPrinter &AP);
59  bool LowerPPCMachineOperandToMCOperand(const MachineOperand &MO,
60                                         MCOperand &OutMO, AsmPrinter &AP);
61
62#ifndef NDEBUG
63  void initializePPCCTRLoopsVerifyPass(PassRegistry&);
64#endif
65  void initializePPCLoopInstrFormPrepPass(PassRegistry&);
66  void initializePPCTOCRegDepsPass(PassRegistry&);
67  void initializePPCEarlyReturnPass(PassRegistry&);
68  void initializePPCVSXCopyPass(PassRegistry&);
69  void initializePPCVSXFMAMutatePass(PassRegistry&);
70  void initializePPCVSXSwapRemovalPass(PassRegistry&);
71  void initializePPCReduceCRLogicalsPass(PassRegistry&);
72  void initializePPCBSelPass(PassRegistry&);
73  void initializePPCBranchCoalescingPass(PassRegistry&);
74  void initializePPCBoolRetToIntPass(PassRegistry&);
75  void initializePPCExpandISELPass(PassRegistry &);
76  void initializePPCPreEmitPeepholePass(PassRegistry &);
77  void initializePPCTLSDynamicCallPass(PassRegistry &);
78  void initializePPCMIPeepholePass(PassRegistry&);
79  void initializePPCExpandAtomicPseudoPass(PassRegistry &);
80  void initializePPCCTRLoopsPass(PassRegistry &);
81  void initializePPCDAGToDAGISelPass(PassRegistry &);
82  void initializePPCMergeStringPoolPass(PassRegistry &);
83
84  extern char &PPCVSXFMAMutateID;
85
86  ModulePass *createPPCLowerMASSVEntriesPass();
87  void initializePPCLowerMASSVEntriesPass(PassRegistry &);
88  extern char &PPCLowerMASSVEntriesID;
89
90  ModulePass *createPPCGenScalarMASSEntriesPass();
91  void initializePPCGenScalarMASSEntriesPass(PassRegistry &);
92  extern char &PPCGenScalarMASSEntriesID;
93
94  InstructionSelector *
95  createPPCInstructionSelector(const PPCTargetMachine &, const PPCSubtarget &,
96                               const PPCRegisterBankInfo &);
97  namespace PPCII {
98
99  /// Target Operand Flag enum.
100  enum TOF {
101    //===------------------------------------------------------------------===//
102    // PPC Specific MachineOperand flags.
103    MO_NO_FLAG,
104
105    /// On PPC, the 12 bits are not enough for all target operand flags.
106    /// Treat all PPC target flags as direct flags. To define new flag that is
107    /// combination of other flags, add new enum entry instead of combining
108    /// existing flags. See example MO_GOT_TPREL_PCREL_FLAG.
109
110    /// On a symbol operand "FOO", this indicates that the reference is actually
111    /// to "FOO@plt".  This is used for calls and jumps to external functions
112    /// and for PIC calls on 32-bit ELF systems.
113    MO_PLT,
114
115    /// MO_PIC_FLAG - If this bit is set, the symbol reference is relative to
116    /// the function's picbase, e.g. lo16(symbol-picbase).
117    MO_PIC_FLAG,
118
119    /// MO_PCREL_FLAG - If this bit is set, the symbol reference is relative to
120    /// the current instruction address(pc), e.g., var@pcrel. Fixup is VK_PCREL.
121    MO_PCREL_FLAG,
122
123    /// MO_GOT_FLAG - If this bit is set the symbol reference is to be computed
124    /// via the GOT. For example when combined with the MO_PCREL_FLAG it should
125    /// produce the relocation @got@pcrel. Fixup is VK_PPC_GOT_PCREL.
126    MO_GOT_FLAG,
127
128    /// MO_PCREL_OPT_FLAG - If this bit is set the operand is part of a
129    /// PC Relative linker optimization.
130    MO_PCREL_OPT_FLAG,
131
132    /// MO_TLSGD_FLAG - If this bit is set the symbol reference is relative to
133    /// TLS General Dynamic model for Linux and the variable offset of TLS
134    /// General Dynamic model for AIX.
135    MO_TLSGD_FLAG,
136
137    /// MO_TPREL_FLAG - If this bit is set, the symbol reference is relative to
138    /// the thread pointer and the symbol can be used for the TLS Initial Exec
139    /// and Local Exec models.
140    MO_TPREL_FLAG,
141
142    /// MO_TLSLD_FLAG - If this bit is set the symbol reference is relative to
143    /// TLS Local Dynamic model.
144    MO_TLSLD_FLAG,
145
146    /// MO_TLSGDM_FLAG - If this bit is set the symbol reference is relative
147    /// to the region handle of TLS General Dynamic model for AIX.
148    MO_TLSGDM_FLAG,
149
150    /// MO_GOT_TLSGD_PCREL_FLAG - A combintaion of flags, if these bits are set
151    /// they should produce the relocation @got@tlsgd@pcrel.
152    /// Fix up is VK_PPC_GOT_TLSGD_PCREL
153    /// MO_GOT_TLSGD_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG | MO_TLSGD_FLAG,
154    MO_GOT_TLSGD_PCREL_FLAG,
155
156    /// MO_GOT_TLSLD_PCREL_FLAG - A combintaion of flags, if these bits are set
157    /// they should produce the relocation @got@tlsld@pcrel.
158    /// Fix up is VK_PPC_GOT_TLSLD_PCREL
159    /// MO_GOT_TLSLD_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG | MO_TLSLD_FLAG,
160    MO_GOT_TLSLD_PCREL_FLAG,
161
162    /// MO_GOT_TPREL_PCREL_FLAG - A combintaion of flags, if these bits are set
163    /// they should produce the relocation @got@tprel@pcrel.
164    /// Fix up is VK_PPC_GOT_TPREL_PCREL
165    /// MO_GOT_TPREL_PCREL_FLAG = MO_GOT_FLAG | MO_TPREL_FLAG | MO_PCREL_FLAG,
166    MO_GOT_TPREL_PCREL_FLAG,
167
168    /// MO_LO, MO_HA - lo16(symbol) and ha16(symbol)
169    MO_LO,
170    MO_HA,
171
172    MO_TPREL_LO,
173    MO_TPREL_HA,
174
175    /// These values identify relocations on immediates folded
176    /// into memory operations.
177    MO_DTPREL_LO,
178    MO_TLSLD_LO,
179    MO_TOC_LO,
180
181    /// Symbol for VK_PPC_TLS fixup attached to an ADD instruction
182    MO_TLS,
183
184    /// MO_PIC_HA_FLAG = MO_PIC_FLAG | MO_HA
185    MO_PIC_HA_FLAG,
186
187    /// MO_PIC_LO_FLAG = MO_PIC_FLAG | MO_LO
188    MO_PIC_LO_FLAG,
189
190    /// MO_TPREL_PCREL_FLAG = MO_PCREL_FLAG | MO_TPREL_FLAG
191    MO_TPREL_PCREL_FLAG,
192
193    /// MO_TPREL_PCREL_FLAG = MO_PCREL_FLAG | MO_TLS
194    MO_TLS_PCREL_FLAG,
195
196    /// MO_GOT_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG
197    MO_GOT_PCREL_FLAG,
198  };
199  } // end namespace PPCII
200
201} // end namespace llvm;
202
203#endif
204