Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/Target/PowerPC/PPC.h
35294 views
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
22
namespace llvm {
23
class PPCRegisterBankInfo;
24
class PPCSubtarget;
25
class PPCTargetMachine;
26
class PassRegistry;
27
class FunctionPass;
28
class InstructionSelector;
29
class MachineInstr;
30
class MachineOperand;
31
class AsmPrinter;
32
class MCInst;
33
class MCOperand;
34
class 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 initializePPCDAGToDAGISelLegacyPass(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_TLSLDM_FLAG - on AIX the ML relocation type is only valid for a
143
/// reference to a TOC symbol from the symbol itself, and right now its only
144
/// user is the symbol "_$TLSML". The symbol name is used to decide that
145
/// the R_TLSML relocation is expected.
146
MO_TLSLDM_FLAG,
147
148
/// MO_TLSLD_FLAG - If this bit is set the symbol reference is relative to
149
/// TLS Local Dynamic model.
150
MO_TLSLD_FLAG,
151
152
/// MO_TLSGDM_FLAG - If this bit is set the symbol reference is relative
153
/// to the region handle of TLS General Dynamic model for AIX.
154
MO_TLSGDM_FLAG,
155
156
/// MO_GOT_TLSGD_PCREL_FLAG - A combintaion of flags, if these bits are set
157
/// they should produce the relocation @got@tlsgd@pcrel.
158
/// Fix up is VK_PPC_GOT_TLSGD_PCREL
159
/// MO_GOT_TLSGD_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG | MO_TLSGD_FLAG,
160
MO_GOT_TLSGD_PCREL_FLAG,
161
162
/// MO_GOT_TLSLD_PCREL_FLAG - A combintaion of flags, if these bits are set
163
/// they should produce the relocation @got@tlsld@pcrel.
164
/// Fix up is VK_PPC_GOT_TLSLD_PCREL
165
/// MO_GOT_TLSLD_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG | MO_TLSLD_FLAG,
166
MO_GOT_TLSLD_PCREL_FLAG,
167
168
/// MO_GOT_TPREL_PCREL_FLAG - A combintaion of flags, if these bits are set
169
/// they should produce the relocation @got@tprel@pcrel.
170
/// Fix up is VK_PPC_GOT_TPREL_PCREL
171
/// MO_GOT_TPREL_PCREL_FLAG = MO_GOT_FLAG | MO_TPREL_FLAG | MO_PCREL_FLAG,
172
MO_GOT_TPREL_PCREL_FLAG,
173
174
/// MO_LO, MO_HA - lo16(symbol) and ha16(symbol)
175
MO_LO,
176
MO_HA,
177
178
MO_TPREL_LO,
179
MO_TPREL_HA,
180
181
/// These values identify relocations on immediates folded
182
/// into memory operations.
183
MO_DTPREL_LO,
184
MO_TLSLD_LO,
185
MO_TOC_LO,
186
187
/// Symbol for VK_PPC_TLS fixup attached to an ADD instruction
188
MO_TLS,
189
190
/// MO_PIC_HA_FLAG = MO_PIC_FLAG | MO_HA
191
MO_PIC_HA_FLAG,
192
193
/// MO_PIC_LO_FLAG = MO_PIC_FLAG | MO_LO
194
MO_PIC_LO_FLAG,
195
196
/// MO_TPREL_PCREL_FLAG = MO_PCREL_FLAG | MO_TPREL_FLAG
197
MO_TPREL_PCREL_FLAG,
198
199
/// MO_TPREL_PCREL_FLAG = MO_PCREL_FLAG | MO_TLS
200
MO_TLS_PCREL_FLAG,
201
202
/// MO_GOT_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG
203
MO_GOT_PCREL_FLAG,
204
};
205
} // end namespace PPCII
206
207
} // end namespace llvm;
208
209
#endif
210
211