30#define DEBUG_TYPE "mccodeemitter"
32STATISTIC(MCNumEmitted,
"Number of MC instructions emitted");
38class LanaiMCCodeEmitter :
public MCCodeEmitter {
40 LanaiMCCodeEmitter(
const MCInstrInfo &MCII, MCContext &
C) {}
41 LanaiMCCodeEmitter(
const LanaiMCCodeEmitter &) =
delete;
42 void operator=(
const LanaiMCCodeEmitter &) =
delete;
43 ~LanaiMCCodeEmitter()
override =
default;
50 uint64_t getBinaryCodeForInstr(
const MCInst &Inst,
51 SmallVectorImpl<MCFixup> &Fixups,
52 const MCSubtargetInfo &SubtargetInfo)
const;
56 unsigned getMachineOpValue(
const MCInst &Inst,
const MCOperand &MCOp,
57 SmallVectorImpl<MCFixup> &Fixups,
58 const MCSubtargetInfo &SubtargetInfo)
const;
60 unsigned getRiMemoryOpValue(
const MCInst &Inst,
unsigned OpNo,
61 SmallVectorImpl<MCFixup> &Fixups,
62 const MCSubtargetInfo &SubtargetInfo)
const;
64 unsigned getRrMemoryOpValue(
const MCInst &Inst,
unsigned OpNo,
65 SmallVectorImpl<MCFixup> &Fixups,
66 const MCSubtargetInfo &SubtargetInfo)
const;
68 unsigned getSplsOpValue(
const MCInst &Inst,
unsigned OpNo,
69 SmallVectorImpl<MCFixup> &Fixups,
70 const MCSubtargetInfo &SubtargetInfo)
const;
73 SmallVectorImpl<MCFixup> &Fixups,
74 const MCSubtargetInfo &SubtargetInfo)
const;
76 void encodeInstruction(
const MCInst &Inst, SmallVectorImpl<char> &CB,
77 SmallVectorImpl<MCFixup> &Fixups,
78 const MCSubtargetInfo &SubtargetInfo)
const override;
80 unsigned adjustPqBitsRmAndRrm(
const MCInst &Inst,
unsigned Value,
81 const MCSubtargetInfo &STI)
const;
83 unsigned adjustPqBitsSpls(
const MCInst &Inst,
unsigned Value,
84 const MCSubtargetInfo &STI)
const;
90 if (isa<MCSymbolRefExpr>(Expr))
92 if (
const LanaiMCExpr *McExpr = dyn_cast<LanaiMCExpr>(Expr)) {
108unsigned LanaiMCCodeEmitter::getMachineOpValue(
109 const MCInst &Inst,
const MCOperand &MCOp, SmallVectorImpl<MCFixup> &Fixups,
110 const MCSubtargetInfo &SubtargetInfo)
const {
114 return static_cast<unsigned>(MCOp.getImm());
118 const MCExpr *Expr = MCOp.getExpr();
122 const MCBinaryExpr *
BinaryExpr =
static_cast<const MCBinaryExpr *
>(Expr);
135 unsigned PBitShift,
unsigned QBitShift) {
137 unsigned AluCode = AluOp.
getImm();
142 Value &= ~(1 << PBitShift);
146 Value |= (1 << PBitShift);
150 "Expected register operand.");
151 Value &= ~(1 << QBitShift);
154 Value |= (1 << QBitShift);
160LanaiMCCodeEmitter::adjustPqBitsRmAndRrm(
const MCInst &Inst,
unsigned Value,
161 const MCSubtargetInfo &STI)
const {
166LanaiMCCodeEmitter::adjustPqBitsSpls(
const MCInst &Inst,
unsigned Value,
167 const MCSubtargetInfo &STI)
const {
171void LanaiMCCodeEmitter::encodeInstruction(
172 const MCInst &Inst, SmallVectorImpl<char> &CB,
173 SmallVectorImpl<MCFixup> &Fixups,
174 const MCSubtargetInfo &SubtargetInfo)
const {
176 unsigned Value = getBinaryCodeForInstr(Inst, Fixups, SubtargetInfo);
183unsigned LanaiMCCodeEmitter::getRiMemoryOpValue(
184 const MCInst &Inst,
unsigned OpNo, SmallVectorImpl<MCFixup> &Fixups,
185 const MCSubtargetInfo &SubtargetInfo)
const {
187 const MCOperand Op1 = Inst.getOperand(OpNo + 0);
188 const MCOperand Op2 = Inst.getOperand(OpNo + 1);
189 const MCOperand AluOp = Inst.getOperand(OpNo + 2);
191 assert(Op1.isReg() &&
"First operand is not register.");
192 assert((Op2.isImm() || Op2.isExpr()) &&
193 "Second operand is neither an immediate nor an expression.");
195 "Register immediate only supports addition operator");
199 assert(isInt<16>(Op2.getImm()) &&
200 "Constant value truncated (limited to 16-bit)");
202 Encoding |= (Op2.getImm() & 0xffff);
203 if (Op2.getImm() != 0) {
205 Encoding |= (0x3 << 16);
207 Encoding |= (0x1 << 16);
210 getMachineOpValue(Inst, Op2, Fixups, SubtargetInfo);
215unsigned LanaiMCCodeEmitter::getRrMemoryOpValue(
216 const MCInst &Inst,
unsigned OpNo, SmallVectorImpl<MCFixup> &Fixups,
217 const MCSubtargetInfo &SubtargetInfo)
const {
219 const MCOperand Op1 = Inst.getOperand(OpNo + 0);
220 const MCOperand Op2 = Inst.getOperand(OpNo + 1);
221 const MCOperand AluMCOp = Inst.getOperand(OpNo + 2);
223 assert(Op1.isReg() &&
"First operand is not register.");
225 assert(Op2.isReg() &&
"Second operand is not register.");
228 assert(AluMCOp.isImm() &&
"Third operator is not immediate.");
230 unsigned AluOp = AluMCOp.getImm();
234 Encoding |= (0x3 << 8);
236 Encoding |= (0x1 << 8);
254LanaiMCCodeEmitter::getSplsOpValue(
const MCInst &Inst,
unsigned OpNo,
255 SmallVectorImpl<MCFixup> &Fixups,
256 const MCSubtargetInfo &SubtargetInfo)
const {
258 const MCOperand Op1 = Inst.getOperand(OpNo + 0);
259 const MCOperand Op2 = Inst.getOperand(OpNo + 1);
260 const MCOperand AluOp = Inst.getOperand(OpNo + 2);
262 assert(Op1.isReg() &&
"First operand is not register.");
263 assert((Op2.isImm() || Op2.isExpr()) &&
264 "Second operand is neither an immediate nor an expression.");
266 "Register immediate only supports addition operator");
270 assert(isInt<10>(Op2.getImm()) &&
271 "Constant value truncated (limited to 10-bit)");
273 Encoding |= (Op2.getImm() & 0x3ff);
274 if (Op2.getImm() != 0) {
276 Encoding |= (0x3 << 10);
278 Encoding |= (0x1 << 10);
281 getMachineOpValue(Inst, Op2, Fixups, SubtargetInfo);
286unsigned LanaiMCCodeEmitter::getBranchTargetOpValue(
287 const MCInst &Inst,
unsigned OpNo, SmallVectorImpl<MCFixup> &Fixups,
288 const MCSubtargetInfo &SubtargetInfo)
const {
289 const MCOperand &MCOp = Inst.getOperand(OpNo);
290 if (MCOp.isReg() || MCOp.isImm())
291 return getMachineOpValue(Inst, MCOp, Fixups, SubtargetInfo);
299#include "LanaiGenMCCodeEmitter.inc"
306 return new LanaiMCCodeEmitter(InstrInfo, context);
static uint32_t getBranchTargetOpValue(const MCInst &MI, unsigned OpIdx, unsigned FixupKind, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI)
getBranchTargetOpValue - Helper function to get the branch target operand, which is either an immedia...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
MCCodeEmitter - Generic instruction encoding interface.
Context object for machine code objects.
Base class for the full range of assembler expressions which are needed for parsing.
@ SymbolRef
References to labels and assigned expressions.
@ Binary
Binary expressions.
static MCFixup create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, SMLoc Loc=SMLoc())
Instances of this class represent a single low-level machine instruction.
const MCOperand & getOperand(unsigned i) const
Interface to description of machine instruction set.
Instances of this class represent operands of the MCInst class.
MCRegister getReg() const
Returns the register number.
LLVM Value Representation.
@ C
The default llvm calling convention, compatible with C.
static bool isPreOp(unsigned AluOp)
static unsigned getAluOp(unsigned AluOp)
static unsigned encodeLanaiAluCode(unsigned AluOp)
static bool isPostOp(unsigned AluOp)
static bool modifiesOp(unsigned AluOp)
This is an optimization pass for GlobalISel generic memory operations.
MCCodeEmitter * createLanaiMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
MCFixupKind
Extensible enumeration to represent the type of a fixup.
static unsigned adjustPqBits(const MCInst &Inst, unsigned Value, unsigned PBitShift, unsigned QBitShift)
static unsigned getLanaiRegisterNumbering(MCRegister Reg)