MipsMCCodeEmitter.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1//===-- MipsMCCodeEmitter.h - Convert Mips Code to Machine Code -----------===//
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
15#ifndef MIPS_MC_CODE_EMITTER_H
16#define MIPS_MC_CODE_EMITTER_H
17
18#include "llvm/MC/MCCodeEmitter.h"
19#include "llvm/Support/DataTypes.h"
20
21using namespace llvm;
22
23namespace llvm {
24class MCContext;
25class MCExpr;
26class MCInst;
27class MCInstrInfo;
28class MCFixup;
29class MCOperand;
30class MCSubtargetInfo;
31class raw_ostream;
32
33class MipsMCCodeEmitter : public MCCodeEmitter {
34  MipsMCCodeEmitter(const MipsMCCodeEmitter &) LLVM_DELETED_FUNCTION;
35  void operator=(const MipsMCCodeEmitter &) LLVM_DELETED_FUNCTION;
36  const MCInstrInfo &MCII;
37  MCContext &Ctx;
38  bool IsLittleEndian;
39
40  bool isMicroMips(const MCSubtargetInfo &STI) const;
41
42public:
43  MipsMCCodeEmitter(const MCInstrInfo &mcii, MCContext &Ctx_, bool IsLittle)
44      : MCII(mcii), Ctx(Ctx_), IsLittleEndian(IsLittle) {}
45
46  ~MipsMCCodeEmitter() {}
47
48  void EmitByte(unsigned char C, raw_ostream &OS) const;
49
50  void EmitInstruction(uint64_t Val, unsigned Size, const MCSubtargetInfo &STI,
51                       raw_ostream &OS) const;
52
53  void EncodeInstruction(const MCInst &MI, raw_ostream &OS,
54                         SmallVectorImpl<MCFixup> &Fixups,
55                         const MCSubtargetInfo &STI) const;
56
57  // getBinaryCodeForInstr - TableGen'erated function for getting the
58  // binary encoding for an instruction.
59  uint64_t getBinaryCodeForInstr(const MCInst &MI,
60                                 SmallVectorImpl<MCFixup> &Fixups,
61                                 const MCSubtargetInfo &STI) const;
62
63  // getBranchJumpOpValue - Return binary encoding of the jump
64  // target operand. If the machine operand requires relocation,
65  // record the relocation and return zero.
66  unsigned getJumpTargetOpValue(const MCInst &MI, unsigned OpNo,
67                                SmallVectorImpl<MCFixup> &Fixups,
68                                const MCSubtargetInfo &STI) const;
69
70  // getBranchJumpOpValueMM - Return binary encoding of the microMIPS jump
71  // target operand. If the machine operand requires relocation,
72  // record the relocation and return zero.
73  unsigned getJumpTargetOpValueMM(const MCInst &MI, unsigned OpNo,
74                                  SmallVectorImpl<MCFixup> &Fixups,
75                                  const MCSubtargetInfo &STI) const;
76
77  // getBranchTargetOpValue - Return binary encoding of the branch
78  // target operand. If the machine operand requires relocation,
79  // record the relocation and return zero.
80  unsigned getBranchTargetOpValue(const MCInst &MI, unsigned OpNo,
81                                  SmallVectorImpl<MCFixup> &Fixups,
82                                  const MCSubtargetInfo &STI) const;
83
84  // getBranchTargetOpValue - Return binary encoding of the microMIPS branch
85  // target operand. If the machine operand requires relocation,
86  // record the relocation and return zero.
87  unsigned getBranchTargetOpValueMM(const MCInst &MI, unsigned OpNo,
88                                    SmallVectorImpl<MCFixup> &Fixups,
89                                    const MCSubtargetInfo &STI) const;
90
91  // getMachineOpValue - Return binary encoding of operand. If the machin
92  // operand requires relocation, record the relocation and return zero.
93  unsigned getMachineOpValue(const MCInst &MI, const MCOperand &MO,
94                             SmallVectorImpl<MCFixup> &Fixups,
95                             const MCSubtargetInfo &STI) const;
96
97  unsigned getMSAMemEncoding(const MCInst &MI, unsigned OpNo,
98                             SmallVectorImpl<MCFixup> &Fixups,
99                             const MCSubtargetInfo &STI) const;
100
101  unsigned getMemEncoding(const MCInst &MI, unsigned OpNo,
102                          SmallVectorImpl<MCFixup> &Fixups,
103                          const MCSubtargetInfo &STI) const;
104  unsigned getMemEncodingMMImm12(const MCInst &MI, unsigned OpNo,
105                                 SmallVectorImpl<MCFixup> &Fixups,
106                                 const MCSubtargetInfo &STI) const;
107  unsigned getSizeExtEncoding(const MCInst &MI, unsigned OpNo,
108                              SmallVectorImpl<MCFixup> &Fixups,
109                              const MCSubtargetInfo &STI) const;
110  unsigned getSizeInsEncoding(const MCInst &MI, unsigned OpNo,
111                              SmallVectorImpl<MCFixup> &Fixups,
112                              const MCSubtargetInfo &STI) const;
113
114  // getLSAImmEncoding - Return binary encoding of LSA immediate.
115  unsigned getLSAImmEncoding(const MCInst &MI, unsigned OpNo,
116                             SmallVectorImpl<MCFixup> &Fixups,
117                             const MCSubtargetInfo &STI) const;
118
119  unsigned getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups,
120                          const MCSubtargetInfo &STI) const;
121
122}; // class MipsMCCodeEmitter
123} // namespace llvm.
124
125#endif
126