Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.h
35294 views
1
//===- MipsMCCodeEmitter.h - Convert Mips Code to Machine Code --*- 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 defines the MipsMCCodeEmitter class.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCCODEEMITTER_H
14
#define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCCODEEMITTER_H
15
16
#include "llvm/MC/MCCodeEmitter.h"
17
#include <cstdint>
18
19
namespace llvm {
20
21
class MCContext;
22
class MCExpr;
23
class MCFixup;
24
class MCInst;
25
class MCInstrInfo;
26
class MCOperand;
27
class MCSubtargetInfo;
28
class raw_ostream;
29
30
class MipsMCCodeEmitter : public MCCodeEmitter {
31
const MCInstrInfo &MCII;
32
MCContext &Ctx;
33
bool IsLittleEndian;
34
35
bool isMicroMips(const MCSubtargetInfo &STI) const;
36
bool isMips32r6(const MCSubtargetInfo &STI) const;
37
38
public:
39
MipsMCCodeEmitter(const MCInstrInfo &mcii, MCContext &Ctx_, bool IsLittle)
40
: MCII(mcii), Ctx(Ctx_), IsLittleEndian(IsLittle) {}
41
MipsMCCodeEmitter(const MipsMCCodeEmitter &) = delete;
42
MipsMCCodeEmitter &operator=(const MipsMCCodeEmitter &) = delete;
43
~MipsMCCodeEmitter() override = default;
44
45
void EmitByte(unsigned char C, raw_ostream &OS) const;
46
47
void encodeInstruction(const MCInst &MI, SmallVectorImpl<char> &CB,
48
SmallVectorImpl<MCFixup> &Fixups,
49
const MCSubtargetInfo &STI) const override;
50
51
// getBinaryCodeForInstr - TableGen'erated function for getting the
52
// binary encoding for an instruction.
53
uint64_t getBinaryCodeForInstr(const MCInst &MI,
54
SmallVectorImpl<MCFixup> &Fixups,
55
const MCSubtargetInfo &STI) const;
56
57
// getJumpTargetOpValue - Return binary encoding of the jump
58
// target operand. If the machine operand requires relocation,
59
// record the relocation and return zero.
60
unsigned getJumpTargetOpValue(const MCInst &MI, unsigned OpNo,
61
SmallVectorImpl<MCFixup> &Fixups,
62
const MCSubtargetInfo &STI) const;
63
64
// getBranchJumpOpValueMM - Return binary encoding of the microMIPS jump
65
// target operand. If the machine operand requires relocation,
66
// record the relocation and return zero.
67
unsigned getJumpTargetOpValueMM(const MCInst &MI, unsigned OpNo,
68
SmallVectorImpl<MCFixup> &Fixups,
69
const MCSubtargetInfo &STI) const;
70
71
// getUImm5Lsl2Encoding - Return binary encoding of the microMIPS jump
72
// target operand.
73
unsigned getUImm5Lsl2Encoding(const MCInst &MI, unsigned OpNo,
74
SmallVectorImpl<MCFixup> &Fixups,
75
const MCSubtargetInfo &STI) const;
76
77
unsigned getSImm3Lsa2Value(const MCInst &MI, unsigned OpNo,
78
SmallVectorImpl<MCFixup> &Fixups,
79
const MCSubtargetInfo &STI) const;
80
81
unsigned getUImm6Lsl2Encoding(const MCInst &MI, unsigned OpNo,
82
SmallVectorImpl<MCFixup> &Fixups,
83
const MCSubtargetInfo &STI) const;
84
85
// getSImm9AddiuspValue - Return binary encoding of the microMIPS addiusp
86
// instruction immediate operand.
87
unsigned getSImm9AddiuspValue(const MCInst &MI, unsigned OpNo,
88
SmallVectorImpl<MCFixup> &Fixups,
89
const MCSubtargetInfo &STI) const;
90
91
// getBranchTargetOpValue - Return binary encoding of the branch
92
// target operand. If the machine operand requires relocation,
93
// record the relocation and return zero.
94
unsigned getBranchTargetOpValue(const MCInst &MI, unsigned OpNo,
95
SmallVectorImpl<MCFixup> &Fixups,
96
const MCSubtargetInfo &STI) const;
97
98
// getBranchTargetOpValue1SImm16 - Return binary encoding of the branch
99
// target operand. If the machine operand requires relocation,
100
// record the relocation and return zero.
101
unsigned getBranchTargetOpValue1SImm16(const MCInst &MI, unsigned OpNo,
102
SmallVectorImpl<MCFixup> &Fixups,
103
const MCSubtargetInfo &STI) const;
104
105
// getBranchTargetOpValueMMR6 - Return binary encoding of the branch
106
// target operand. If the machine operand requires relocation,
107
// record the relocation and return zero.
108
unsigned getBranchTargetOpValueMMR6(const MCInst &MI, unsigned OpNo,
109
SmallVectorImpl<MCFixup> &Fixups,
110
const MCSubtargetInfo &STI) const;
111
112
// getBranchTargetOpValueLsl2MMR6 - Return binary encoding of the branch
113
// target operand. If the machine operand requires relocation,
114
// record the relocation and return zero.
115
unsigned getBranchTargetOpValueLsl2MMR6(const MCInst &MI, unsigned OpNo,
116
SmallVectorImpl<MCFixup> &Fixups,
117
const MCSubtargetInfo &STI) const;
118
119
// getBranchTarget7OpValue - Return binary encoding of the microMIPS branch
120
// target operand. If the machine operand requires relocation,
121
// record the relocation and return zero.
122
unsigned getBranchTarget7OpValueMM(const MCInst &MI, unsigned OpNo,
123
SmallVectorImpl<MCFixup> &Fixups,
124
const MCSubtargetInfo &STI) const;
125
126
// getBranchTargetOpValueMMPC10 - Return binary encoding of the microMIPS
127
// 10-bit branch target operand. If the machine operand requires relocation,
128
// record the relocation and return zero.
129
unsigned getBranchTargetOpValueMMPC10(const MCInst &MI, unsigned OpNo,
130
SmallVectorImpl<MCFixup> &Fixups,
131
const MCSubtargetInfo &STI) const;
132
133
// getBranchTargetOpValue - Return binary encoding of the microMIPS branch
134
// target operand. If the machine operand requires relocation,
135
// record the relocation and return zero.
136
unsigned getBranchTargetOpValueMM(const MCInst &MI, unsigned OpNo,
137
SmallVectorImpl<MCFixup> &Fixups,
138
const MCSubtargetInfo &STI) const;
139
140
// getBranchTarget21OpValue - Return binary encoding of the branch
141
// offset operand. If the machine operand requires relocation,
142
// record the relocation and return zero.
143
unsigned getBranchTarget21OpValue(const MCInst &MI, unsigned OpNo,
144
SmallVectorImpl<MCFixup> &Fixups,
145
const MCSubtargetInfo &STI) const;
146
147
// getBranchTarget21OpValueMM - Return binary encoding of the branch
148
// offset operand for microMIPS. If the machine operand requires
149
// relocation,record the relocation and return zero.
150
unsigned getBranchTarget21OpValueMM(const MCInst &MI, unsigned OpNo,
151
SmallVectorImpl<MCFixup> &Fixups,
152
const MCSubtargetInfo &STI) const;
153
154
// getBranchTarget26OpValue - Return binary encoding of the branch
155
// offset operand. If the machine operand requires relocation,
156
// record the relocation and return zero.
157
unsigned getBranchTarget26OpValue(const MCInst &MI, unsigned OpNo,
158
SmallVectorImpl<MCFixup> &Fixups,
159
const MCSubtargetInfo &STI) const;
160
161
// getBranchTarget26OpValueMM - Return binary encoding of the branch
162
// offset operand. If the machine operand requires relocation,
163
// record the relocation and return zero.
164
unsigned getBranchTarget26OpValueMM(const MCInst &MI, unsigned OpNo,
165
SmallVectorImpl<MCFixup> &Fixups,
166
const MCSubtargetInfo &STI) const;
167
168
// getJumpOffset16OpValue - Return binary encoding of the jump
169
// offset operand. If the machine operand requires relocation,
170
// record the relocation and return zero.
171
unsigned getJumpOffset16OpValue(const MCInst &MI, unsigned OpNo,
172
SmallVectorImpl<MCFixup> &Fixups,
173
const MCSubtargetInfo &STI) const;
174
175
// getMachineOpValue - Return binary encoding of operand. If the machin
176
// operand requires relocation, record the relocation and return zero.
177
unsigned getMachineOpValue(const MCInst &MI, const MCOperand &MO,
178
SmallVectorImpl<MCFixup> &Fixups,
179
const MCSubtargetInfo &STI) const;
180
181
unsigned getMSAMemEncoding(const MCInst &MI, unsigned OpNo,
182
SmallVectorImpl<MCFixup> &Fixups,
183
const MCSubtargetInfo &STI) const;
184
185
template <unsigned ShiftAmount = 0>
186
unsigned getMemEncoding(const MCInst &MI, unsigned OpNo,
187
SmallVectorImpl<MCFixup> &Fixups,
188
const MCSubtargetInfo &STI) const;
189
unsigned getMemEncodingMMImm4(const MCInst &MI, unsigned OpNo,
190
SmallVectorImpl<MCFixup> &Fixups,
191
const MCSubtargetInfo &STI) const;
192
unsigned getMemEncodingMMImm4Lsl1(const MCInst &MI, unsigned OpNo,
193
SmallVectorImpl<MCFixup> &Fixups,
194
const MCSubtargetInfo &STI) const;
195
unsigned getMemEncodingMMImm4Lsl2(const MCInst &MI, unsigned OpNo,
196
SmallVectorImpl<MCFixup> &Fixups,
197
const MCSubtargetInfo &STI) const;
198
unsigned getMemEncodingMMSPImm5Lsl2(const MCInst &MI, unsigned OpNo,
199
SmallVectorImpl<MCFixup> &Fixups,
200
const MCSubtargetInfo &STI) const;
201
unsigned getMemEncodingMMGPImm7Lsl2(const MCInst &MI, unsigned OpNo,
202
SmallVectorImpl<MCFixup> &Fixups,
203
const MCSubtargetInfo &STI) const;
204
unsigned getMemEncodingMMImm9(const MCInst &MI, unsigned OpNo,
205
SmallVectorImpl<MCFixup> &Fixups,
206
const MCSubtargetInfo &STI) const;
207
unsigned getMemEncodingMMImm11(const MCInst &MI, unsigned OpNo,
208
SmallVectorImpl<MCFixup> &Fixups,
209
const MCSubtargetInfo &STI) const;
210
unsigned getMemEncodingMMImm12(const MCInst &MI, unsigned OpNo,
211
SmallVectorImpl<MCFixup> &Fixups,
212
const MCSubtargetInfo &STI) const;
213
unsigned getMemEncodingMMImm16(const MCInst &MI, unsigned OpNo,
214
SmallVectorImpl<MCFixup> &Fixups,
215
const MCSubtargetInfo &STI) const;
216
unsigned getMemEncodingMMImm4sp(const MCInst &MI, unsigned OpNo,
217
SmallVectorImpl<MCFixup> &Fixups,
218
const MCSubtargetInfo &STI) const;
219
unsigned getSizeInsEncoding(const MCInst &MI, unsigned OpNo,
220
SmallVectorImpl<MCFixup> &Fixups,
221
const MCSubtargetInfo &STI) const;
222
223
/// Subtract Offset then encode as a N-bit unsigned integer.
224
template <unsigned Bits, int Offset>
225
unsigned getUImmWithOffsetEncoding(const MCInst &MI, unsigned OpNo,
226
SmallVectorImpl<MCFixup> &Fixups,
227
const MCSubtargetInfo &STI) const;
228
229
unsigned getSimm19Lsl2Encoding(const MCInst &MI, unsigned OpNo,
230
SmallVectorImpl<MCFixup> &Fixups,
231
const MCSubtargetInfo &STI) const;
232
233
unsigned getSimm18Lsl3Encoding(const MCInst &MI, unsigned OpNo,
234
SmallVectorImpl<MCFixup> &Fixups,
235
const MCSubtargetInfo &STI) const;
236
237
unsigned getUImm3Mod8Encoding(const MCInst &MI, unsigned OpNo,
238
SmallVectorImpl<MCFixup> &Fixups,
239
const MCSubtargetInfo &STI) const;
240
unsigned getUImm4AndValue(const MCInst &MI, unsigned OpNo,
241
SmallVectorImpl<MCFixup> &Fixups,
242
const MCSubtargetInfo &STI) const;
243
244
unsigned getMovePRegPairOpValue(const MCInst &MI, unsigned OpNo,
245
SmallVectorImpl<MCFixup> &Fixups,
246
const MCSubtargetInfo &STI) const;
247
unsigned getMovePRegSingleOpValue(const MCInst &MI, unsigned OpNo,
248
SmallVectorImpl<MCFixup> &Fixups,
249
const MCSubtargetInfo &STI) const;
250
251
unsigned getSimm23Lsl2Encoding(const MCInst &MI, unsigned OpNo,
252
SmallVectorImpl<MCFixup> &Fixups,
253
const MCSubtargetInfo &STI) const;
254
255
unsigned getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups,
256
const MCSubtargetInfo &STI) const;
257
258
unsigned getRegisterListOpValue(const MCInst &MI, unsigned OpNo,
259
SmallVectorImpl<MCFixup> &Fixups,
260
const MCSubtargetInfo &STI) const;
261
262
unsigned getRegisterListOpValue16(const MCInst &MI, unsigned OpNo,
263
SmallVectorImpl<MCFixup> &Fixups,
264
const MCSubtargetInfo &STI) const;
265
266
private:
267
void LowerCompactBranch(MCInst& Inst) const;
268
};
269
270
} // end namespace llvm
271
272
#endif // LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCCODEEMITTER_H
273
274