Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.h
Line
Count
Source (jump to first uncovered line)
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
0
      : 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