14 #define DEBUG_TYPE "mccodeemitter"
29 STATISTIC(MCNumEmitted,
"Number of MC instructions emitted");
34 void operator=(const PPCMCCodeEmitter &) LLVM_DELETED_FUNCTION;
43 : STI(sti), CTX(ctx), TT(STI.getTargetTriple()) {
46 ~PPCMCCodeEmitter() {}
48 unsigned getDirectBrEncoding(
const MCInst &
MI,
unsigned OpNo,
50 unsigned getCondBrEncoding(
const MCInst &
MI,
unsigned OpNo,
52 unsigned getAbsDirectBrEncoding(
const MCInst &
MI,
unsigned OpNo,
54 unsigned getAbsCondBrEncoding(
const MCInst &
MI,
unsigned OpNo,
56 unsigned getImm16Encoding(
const MCInst &
MI,
unsigned OpNo,
58 unsigned getMemRIEncoding(
const MCInst &
MI,
unsigned OpNo,
60 unsigned getMemRIXEncoding(
const MCInst &
MI,
unsigned OpNo,
62 unsigned getTLSRegEncoding(
const MCInst &
MI,
unsigned OpNo,
64 unsigned getTLSCallEncoding(
const MCInst &
MI,
unsigned OpNo,
66 unsigned get_crbitm_encoding(
const MCInst &
MI,
unsigned OpNo,
76 uint64_t getBinaryCodeForInstr(
const MCInst &
MI,
87 uint64_t
Bits = getBinaryCodeForInstr(MI, Fixups);
91 if (Opcode == PPC::BL8_NOP || Opcode == PPC::BLA8_NOP ||
92 Opcode == PPC::BL8_NOP_TLS)
96 int ShiftValue = (Size * 8) - 8;
97 for (
unsigned i = 0; i != Size; ++i) {
98 OS << (char)(Bits >> ShiftValue);
113 return new PPCMCCodeEmitter(MCII, STI, Ctx);
116 unsigned PPCMCCodeEmitter::
117 getDirectBrEncoding(
const MCInst &MI,
unsigned OpNo,
120 if (MO.
isReg() || MO.
isImm())
return getMachineOpValue(MI, MO, Fixups);
128 unsigned PPCMCCodeEmitter::getCondBrEncoding(
const MCInst &MI,
unsigned OpNo,
131 if (MO.
isReg() || MO.
isImm())
return getMachineOpValue(MI, MO, Fixups);
139 unsigned PPCMCCodeEmitter::
140 getAbsDirectBrEncoding(
const MCInst &MI,
unsigned OpNo,
143 if (MO.
isReg() || MO.
isImm())
return getMachineOpValue(MI, MO, Fixups);
151 unsigned PPCMCCodeEmitter::
152 getAbsCondBrEncoding(
const MCInst &MI,
unsigned OpNo,
155 if (MO.
isReg() || MO.
isImm())
return getMachineOpValue(MI, MO, Fixups);
163 unsigned PPCMCCodeEmitter::getImm16Encoding(
const MCInst &MI,
unsigned OpNo,
166 if (MO.
isReg() || MO.
isImm())
return getMachineOpValue(MI, MO, Fixups);
174 unsigned PPCMCCodeEmitter::getMemRIEncoding(
const MCInst &MI,
unsigned OpNo,
179 unsigned RegBits = getMachineOpValue(MI, MI.
getOperand(OpNo+1),
Fixups) << 16;
183 return (getMachineOpValue(MI, MO, Fixups) & 0xFFFF) | RegBits;
192 unsigned PPCMCCodeEmitter::getMemRIXEncoding(
const MCInst &MI,
unsigned OpNo,
197 unsigned RegBits = getMachineOpValue(MI, MI.
getOperand(OpNo+1),
Fixups) << 14;
201 return ((getMachineOpValue(MI, MO, Fixups) >> 2) & 0x3FFF) | RegBits;
210 unsigned PPCMCCodeEmitter::getTLSRegEncoding(
const MCInst &MI,
unsigned OpNo,
213 if (MO.
isReg())
return getMachineOpValue(MI, MO, Fixups);
220 return CTX.getRegisterInfo()->getEncodingValue(PPC::X13);
223 unsigned PPCMCCodeEmitter::getTLSCallEncoding(
const MCInst &MI,
unsigned OpNo,
231 return getDirectBrEncoding(MI, OpNo, Fixups);
234 unsigned PPCMCCodeEmitter::
235 get_crbitm_encoding(
const MCInst &MI,
unsigned OpNo,
241 return 0x80 >> CTX.getRegisterInfo()->getEncodingValue(MO.
getReg());
245 unsigned PPCMCCodeEmitter::
254 return CTX.getRegisterInfo()->getEncodingValue(MO.
getReg());
258 "Relocation required in an instruction that we cannot encode!");
263 #include "PPCGenMCCodeEmitter.inc"
void push_back(const T &Elt)
STATISTIC(MCNumEmitted,"Number of MC instructions emitted")
MCCodeEmitter * createPPCMCCodeEmitter(const MCInstrInfo &MCII, const MCRegisterInfo &MRI, const MCSubtargetInfo &STI, MCContext &Ctx)
unsigned getReg() const
getReg - Returns the register number.
const MCExpr * getExpr() const
MCCodeEmitter - Generic instruction encoding interface.
MCFixupKind
MCFixupKind - Extensible enumeration to represent the type of a fixup.
#define LLVM_DELETED_FUNCTION
unsigned getOpcode() const
static MCFixup Create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, SMLoc Loc=SMLoc())
const MCRegisterInfo & MRI
const MCOperand & getOperand(unsigned i) const