LLVM  8.0.1
MipsMCCodeEmitter.h
Go to the documentation of this file.
1 //===- MipsMCCodeEmitter.h - Convert Mips Code to Machine Code --*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the MipsMCCodeEmitter class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCCODEEMITTER_H
15 #define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCCODEEMITTER_H
16 
17 #include "llvm/MC/MCCodeEmitter.h"
18 #include <cstdint>
19 
20 namespace llvm {
21 
22 class MCContext;
23 class MCExpr;
24 class MCFixup;
25 class MCInst;
26 class MCInstrInfo;
27 class MCOperand;
28 class MCSubtargetInfo;
29 class raw_ostream;
30 
32  const MCInstrInfo &MCII;
33  MCContext &Ctx;
34  bool IsLittleEndian;
35 
36  bool isMicroMips(const MCSubtargetInfo &STI) const;
37  bool isMips32r6(const MCSubtargetInfo &STI) const;
38 
39 public:
40  MipsMCCodeEmitter(const MCInstrInfo &mcii, MCContext &Ctx_, bool IsLittle)
41  : MCII(mcii), Ctx(Ctx_), IsLittleEndian(IsLittle) {}
42  MipsMCCodeEmitter(const MipsMCCodeEmitter &) = delete;
44  ~MipsMCCodeEmitter() override = default;
45 
46  void EmitByte(unsigned char C, raw_ostream &OS) const;
47 
48  void EmitInstruction(uint64_t Val, unsigned Size, const MCSubtargetInfo &STI,
49  raw_ostream &OS) const;
50 
51  void encodeInstruction(const MCInst &MI, raw_ostream &OS,
53  const MCSubtargetInfo &STI) const override;
54 
55  // getBinaryCodeForInstr - TableGen'erated function for getting the
56  // binary encoding for an instruction.
57  uint64_t getBinaryCodeForInstr(const MCInst &MI,
59  const MCSubtargetInfo &STI) const;
60 
61  // getJumpTargetOpValue - Return binary encoding of the jump
62  // target operand. If the machine operand requires relocation,
63  // record the relocation and return zero.
64  unsigned getJumpTargetOpValue(const MCInst &MI, unsigned OpNo,
66  const MCSubtargetInfo &STI) const;
67 
68  // getBranchJumpOpValueMM - Return binary encoding of the microMIPS jump
69  // target operand. If the machine operand requires relocation,
70  // record the relocation and return zero.
71  unsigned getJumpTargetOpValueMM(const MCInst &MI, unsigned OpNo,
73  const MCSubtargetInfo &STI) const;
74 
75  // getUImm5Lsl2Encoding - Return binary encoding of the microMIPS jump
76  // target operand.
77  unsigned getUImm5Lsl2Encoding(const MCInst &MI, unsigned OpNo,
79  const MCSubtargetInfo &STI) const;
80 
81  unsigned getSImm3Lsa2Value(const MCInst &MI, unsigned OpNo,
83  const MCSubtargetInfo &STI) const;
84 
85  unsigned getUImm6Lsl2Encoding(const MCInst &MI, unsigned OpNo,
87  const MCSubtargetInfo &STI) const;
88 
89  // getSImm9AddiuspValue - Return binary encoding of the microMIPS addiusp
90  // instruction immediate operand.
91  unsigned getSImm9AddiuspValue(const MCInst &MI, unsigned OpNo,
93  const MCSubtargetInfo &STI) const;
94 
95  // getBranchTargetOpValue - Return binary encoding of the branch
96  // target operand. If the machine operand requires relocation,
97  // record the relocation and return zero.
98  unsigned getBranchTargetOpValue(const MCInst &MI, unsigned OpNo,
100  const MCSubtargetInfo &STI) const;
101 
102  // getBranchTargetOpValue1SImm16 - Return binary encoding of the branch
103  // target operand. If the machine operand requires relocation,
104  // record the relocation and return zero.
105  unsigned getBranchTargetOpValue1SImm16(const MCInst &MI, unsigned OpNo,
106  SmallVectorImpl<MCFixup> &Fixups,
107  const MCSubtargetInfo &STI) const;
108 
109  // getBranchTargetOpValueMMR6 - Return binary encoding of the branch
110  // target operand. If the machine operand requires relocation,
111  // record the relocation and return zero.
112  unsigned getBranchTargetOpValueMMR6(const MCInst &MI, unsigned OpNo,
113  SmallVectorImpl<MCFixup> &Fixups,
114  const MCSubtargetInfo &STI) const;
115 
116  // getBranchTargetOpValueLsl2MMR6 - Return binary encoding of the branch
117  // target operand. If the machine operand requires relocation,
118  // record the relocation and return zero.
119  unsigned getBranchTargetOpValueLsl2MMR6(const MCInst &MI, unsigned OpNo,
120  SmallVectorImpl<MCFixup> &Fixups,
121  const MCSubtargetInfo &STI) const;
122 
123  // getBranchTarget7OpValue - Return binary encoding of the microMIPS branch
124  // target operand. If the machine operand requires relocation,
125  // record the relocation and return zero.
126  unsigned getBranchTarget7OpValueMM(const MCInst &MI, unsigned OpNo,
127  SmallVectorImpl<MCFixup> &Fixups,
128  const MCSubtargetInfo &STI) const;
129 
130  // getBranchTargetOpValueMMPC10 - Return binary encoding of the microMIPS
131  // 10-bit branch target operand. If the machine operand requires relocation,
132  // record the relocation and return zero.
133  unsigned getBranchTargetOpValueMMPC10(const MCInst &MI, unsigned OpNo,
134  SmallVectorImpl<MCFixup> &Fixups,
135  const MCSubtargetInfo &STI) const;
136 
137  // getBranchTargetOpValue - Return binary encoding of the microMIPS branch
138  // target operand. If the machine operand requires relocation,
139  // record the relocation and return zero.
140  unsigned getBranchTargetOpValueMM(const MCInst &MI, unsigned OpNo,
141  SmallVectorImpl<MCFixup> &Fixups,
142  const MCSubtargetInfo &STI) const;
143 
144  // getBranchTarget21OpValue - Return binary encoding of the branch
145  // offset operand. If the machine operand requires relocation,
146  // record the relocation and return zero.
147  unsigned getBranchTarget21OpValue(const MCInst &MI, unsigned OpNo,
148  SmallVectorImpl<MCFixup> &Fixups,
149  const MCSubtargetInfo &STI) const;
150 
151  // getBranchTarget21OpValueMM - Return binary encoding of the branch
152  // offset operand for microMIPS. If the machine operand requires
153  // relocation,record the relocation and return zero.
154  unsigned getBranchTarget21OpValueMM(const MCInst &MI, unsigned OpNo,
155  SmallVectorImpl<MCFixup> &Fixups,
156  const MCSubtargetInfo &STI) const;
157 
158  // getBranchTarget26OpValue - Return binary encoding of the branch
159  // offset operand. If the machine operand requires relocation,
160  // record the relocation and return zero.
161  unsigned getBranchTarget26OpValue(const MCInst &MI, unsigned OpNo,
162  SmallVectorImpl<MCFixup> &Fixups,
163  const MCSubtargetInfo &STI) const;
164 
165  // getBranchTarget26OpValueMM - Return binary encoding of the branch
166  // offset operand. If the machine operand requires relocation,
167  // record the relocation and return zero.
168  unsigned getBranchTarget26OpValueMM(const MCInst &MI, unsigned OpNo,
169  SmallVectorImpl<MCFixup> &Fixups,
170  const MCSubtargetInfo &STI) const;
171 
172  // getJumpOffset16OpValue - Return binary encoding of the jump
173  // offset operand. If the machine operand requires relocation,
174  // record the relocation and return zero.
175  unsigned getJumpOffset16OpValue(const MCInst &MI, unsigned OpNo,
176  SmallVectorImpl<MCFixup> &Fixups,
177  const MCSubtargetInfo &STI) const;
178 
179  // getMachineOpValue - Return binary encoding of operand. If the machin
180  // operand requires relocation, record the relocation and return zero.
181  unsigned getMachineOpValue(const MCInst &MI, const MCOperand &MO,
182  SmallVectorImpl<MCFixup> &Fixups,
183  const MCSubtargetInfo &STI) const;
184 
185  unsigned getMSAMemEncoding(const MCInst &MI, unsigned OpNo,
186  SmallVectorImpl<MCFixup> &Fixups,
187  const MCSubtargetInfo &STI) const;
188 
189  template <unsigned ShiftAmount = 0>
190  unsigned getMemEncoding(const MCInst &MI, unsigned OpNo,
191  SmallVectorImpl<MCFixup> &Fixups,
192  const MCSubtargetInfo &STI) const;
193  unsigned getMemEncodingMMImm4(const MCInst &MI, unsigned OpNo,
194  SmallVectorImpl<MCFixup> &Fixups,
195  const MCSubtargetInfo &STI) const;
196  unsigned getMemEncodingMMImm4Lsl1(const MCInst &MI, unsigned OpNo,
197  SmallVectorImpl<MCFixup> &Fixups,
198  const MCSubtargetInfo &STI) const;
199  unsigned getMemEncodingMMImm4Lsl2(const MCInst &MI, unsigned OpNo,
200  SmallVectorImpl<MCFixup> &Fixups,
201  const MCSubtargetInfo &STI) const;
202  unsigned getMemEncodingMMSPImm5Lsl2(const MCInst &MI, unsigned OpNo,
203  SmallVectorImpl<MCFixup> &Fixups,
204  const MCSubtargetInfo &STI) const;
205  unsigned getMemEncodingMMGPImm7Lsl2(const MCInst &MI, unsigned OpNo,
206  SmallVectorImpl<MCFixup> &Fixups,
207  const MCSubtargetInfo &STI) const;
208  unsigned getMemEncodingMMImm9(const MCInst &MI, unsigned OpNo,
209  SmallVectorImpl<MCFixup> &Fixups,
210  const MCSubtargetInfo &STI) const;
211  unsigned getMemEncodingMMImm11(const MCInst &MI, unsigned OpNo,
212  SmallVectorImpl<MCFixup> &Fixups,
213  const MCSubtargetInfo &STI) const;
214  unsigned getMemEncodingMMImm12(const MCInst &MI, unsigned OpNo,
215  SmallVectorImpl<MCFixup> &Fixups,
216  const MCSubtargetInfo &STI) const;
217  unsigned getMemEncodingMMImm16(const MCInst &MI, unsigned OpNo,
218  SmallVectorImpl<MCFixup> &Fixups,
219  const MCSubtargetInfo &STI) const;
220  unsigned getMemEncodingMMImm4sp(const MCInst &MI, unsigned OpNo,
221  SmallVectorImpl<MCFixup> &Fixups,
222  const MCSubtargetInfo &STI) const;
223  unsigned getSizeInsEncoding(const MCInst &MI, unsigned OpNo,
224  SmallVectorImpl<MCFixup> &Fixups,
225  const MCSubtargetInfo &STI) const;
226 
227  /// Subtract Offset then encode as a N-bit unsigned integer.
228  template <unsigned Bits, int Offset>
229  unsigned getUImmWithOffsetEncoding(const MCInst &MI, unsigned OpNo,
230  SmallVectorImpl<MCFixup> &Fixups,
231  const MCSubtargetInfo &STI) const;
232 
233  unsigned getSimm19Lsl2Encoding(const MCInst &MI, unsigned OpNo,
234  SmallVectorImpl<MCFixup> &Fixups,
235  const MCSubtargetInfo &STI) const;
236 
237  unsigned getSimm18Lsl3Encoding(const MCInst &MI, unsigned OpNo,
238  SmallVectorImpl<MCFixup> &Fixups,
239  const MCSubtargetInfo &STI) const;
240 
241  unsigned getUImm3Mod8Encoding(const MCInst &MI, unsigned OpNo,
242  SmallVectorImpl<MCFixup> &Fixups,
243  const MCSubtargetInfo &STI) const;
244  unsigned getUImm4AndValue(const MCInst &MI, unsigned OpNo,
245  SmallVectorImpl<MCFixup> &Fixups,
246  const MCSubtargetInfo &STI) const;
247 
248  unsigned getMovePRegPairOpValue(const MCInst &MI, unsigned OpNo,
249  SmallVectorImpl<MCFixup> &Fixups,
250  const MCSubtargetInfo &STI) const;
251  unsigned getMovePRegSingleOpValue(const MCInst &MI, unsigned OpNo,
252  SmallVectorImpl<MCFixup> &Fixups,
253  const MCSubtargetInfo &STI) const;
254 
255  unsigned getSimm23Lsl2Encoding(const MCInst &MI, unsigned OpNo,
256  SmallVectorImpl<MCFixup> &Fixups,
257  const MCSubtargetInfo &STI) const;
258 
259  unsigned getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups,
260  const MCSubtargetInfo &STI) const;
261 
262  unsigned getRegisterListOpValue(const MCInst &MI, unsigned OpNo,
263  SmallVectorImpl<MCFixup> &Fixups,
264  const MCSubtargetInfo &STI) const;
265 
266  unsigned getRegisterListOpValue16(const MCInst &MI, unsigned OpNo,
267  SmallVectorImpl<MCFixup> &Fixups,
268  const MCSubtargetInfo &STI) const;
269 
270 private:
271  void LowerCompactBranch(MCInst& Inst) const;
272 };
273 
274 } // end namespace llvm
275 
276 #endif // LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCCODEEMITTER_H
uint64_t CallInst * C
unsigned getBranchTarget26OpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTarget26OpValue - Return binary encoding of the branch target operand.
unsigned getMemEncodingMMImm16(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
void encodeInstruction(const MCInst &MI, raw_ostream &OS, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const override
encodeInstruction - Emit the instruction.
This class represents lattice values for constants.
Definition: AllocatorList.h:24
unsigned getBranchTargetOpValueLsl2MMR6(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValueLsl2MMR6 - Return binary encoding of the branch target operand.
unsigned getUImm6Lsl2Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getRegisterListOpValue16(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getMemEncodingMMImm4Lsl2(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getSimm19Lsl2Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getSimm18Lsl3Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getMachineOpValue(const MCInst &MI, const MCOperand &MO, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getMachineOpValue - Return binary encoding of operand.
unsigned getRegisterListOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTargetOpValue1SImm16(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValue1SImm16 - Return binary encoding of the branch target operand.
unsigned getUImm4AndValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getMemEncodingMMImm11(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: APFloat.h:42
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:36
unsigned getBranchTarget26OpValueMM(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTarget26OpValueMM - Return binary encoding of the branch target operand. ...
Context object for machine code objects.
Definition: MCContext.h:63
void EmitByte(unsigned char C, raw_ostream &OS) const
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:161
unsigned getMovePRegSingleOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getMemEncodingMMImm9(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getJumpTargetOpValueMM(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTarget21OpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTarget21OpValue - Return binary encoding of the branch target operand.
unsigned getUImm5Lsl2Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTarget7OpValueMM(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTarget7OpValueMM - Return binary encoding of the microMIPS branch target operand...
unsigned getJumpOffset16OpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getJumpOffset16OpValue - Return binary encoding of the jump target operand.
unsigned getBranchTargetOpValueMMPC10(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValueMMPC10 - Return binary encoding of the microMIPS 10-bit branch target operand...
unsigned getMemEncodingMMImm4(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
MCCodeEmitter - Generic instruction encoding interface.
Definition: MCCodeEmitter.h:22
Interface to description of machine instruction set.
Definition: MCInstrInfo.h:24
unsigned getSimm23Lsl2Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
void EmitInstruction(uint64_t Val, unsigned Size, const MCSubtargetInfo &STI, raw_ostream &OS) const
unsigned getBranchTargetOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValue - Return binary encoding of the branch target operand.
unsigned getUImmWithOffsetEncoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
Subtract Offset then encode as a N-bit unsigned integer.
unsigned getBranchTargetOpValueMM(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValue - Return binary encoding of the microMIPS branch target operand.
unsigned getMemEncodingMMImm4sp(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getExprOpValue(const MCExpr *Expr, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTarget21OpValueMM(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTarget21OpValueMM - Return binary encoding of the branch target operand for microMIPS...
unsigned getUImm3Mod8Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getMemEncodingMMImm4Lsl1(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getMemEncodingMMGPImm7Lsl2(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
uint64_t getBinaryCodeForInstr(const MCInst &MI, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getSizeInsEncoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getJumpTargetOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getJumpTargetOpValue - Return binary encoding of the jump target operand.
MipsMCCodeEmitter(const MCInstrInfo &mcii, MCContext &Ctx_, bool IsLittle)
~MipsMCCodeEmitter() override=default
Generic base class for all target subtargets.
MipsMCCodeEmitter & operator=(const MipsMCCodeEmitter &)=delete
uint32_t Size
Definition: Profile.cpp:47
unsigned getMemEncodingMMSPImm5Lsl2(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getMSAMemEncoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getMovePRegPairOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:46
IRTranslator LLVM IR MI
unsigned getMemEncodingMMImm12(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTargetOpValueMMR6(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValueMMR6 - Return binary encoding of the branch target operand. ...
Instances of this class represent operands of the MCInst class.
Definition: MCInst.h:35
unsigned getMemEncoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
Return binary encoding of memory related operand.
unsigned getSImm9AddiuspValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getSImm3Lsa2Value(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const