26#define DEBUG_TYPE "asm-printer"
28#define PRINT_ALIAS_INSTR
29#include "MipsGenAsmWriter.inc"
33 assert(
MI.getOperand(OpNo).isReg() &&
"Register operand expected.");
34 return MI.getOperand(OpNo).getReg() == R;
83 switch (
MI->getOpcode()) {
88 O <<
"\t.set\tpush\n";
89 O <<
"\t.set\tmips32r2\n";
93 printSaveRestore(
MI, STI, O);
94 O <<
" # 16 bit inst\n";
98 printSaveRestore(
MI, STI, O);
101 case Mips::Restore16:
103 printSaveRestore(
MI, STI, O);
104 O <<
" # 16 bit inst\n";
106 case Mips::RestoreX16:
108 printSaveRestore(
MI, STI, O);
119 switch (
MI->getOpcode()) {
124 O <<
"\n\t.set\tpop";
128void MipsInstPrinter::printOperand(
const MCInst *
MI,
unsigned OpNo,
141 assert(
Op.isExpr() &&
"unknown operand kind in printOperand");
142 MAI.printExpr(O, *
Op.getExpr());
145template <
unsigned FromEnd>
146void MipsInstPrinter::printOperandFromEnd(
const MCInst *
MI,
int OpNo,
149 printOperand(
MI,
MI->getNumOperands() - FromEnd, STI, O);
152void MipsInstPrinter::printJumpOperand(
const MCInst *
MI,
unsigned OpNo,
155 const MCOperand &
Op =
MI->getOperand(OpNo);
157 return printOperand(
MI, OpNo, STI, O);
169 const MCOperand &
Op =
MI->getOperand(OpNo);
171 return printOperand(
MI, OpNo, STI, O);
185template <
unsigned Bits,
unsigned Offset>
186void MipsInstPrinter::printUImm(
const MCInst *
MI,
int opNum,
188 const MCOperand &MO =
MI->getOperand(opNum);
198 printOperand(
MI, opNum, STI, O);
201void MipsInstPrinter::printMemOperand(
const MCInst *
MI,
int opNum,
209 printOperand(
MI, opNum + 1, STI, O);
211 printOperand(
MI, opNum, STI, O);
215void MipsInstPrinter::printFCCOperand(
const MCInst *
MI,
int opNum,
218 const MCOperand &MO =
MI->getOperand(opNum);
222void MipsInstPrinter::
227bool MipsInstPrinter::printAlias(
const char *Str,
const MCInst &
MI,
231 OS <<
"\t" << Str <<
"\t";
233 printBranchOperand(&
MI,
Address, OpNo, STI, OS);
235 printOperand(&
MI, OpNo, STI, OS);
239bool MipsInstPrinter::printAlias(
const char *Str,
const MCInst &
MI,
243 printAlias(Str,
MI,
Address, OpNo0, STI, OS, IsBranch);
246 printBranchOperand(&
MI,
Address, OpNo1, STI, OS);
248 printOperand(&
MI, OpNo1, STI, OS);
254 switch (
MI.getOpcode()) {
260 printAlias(
"b",
MI,
Address, 2, STI, OS,
true)) ||
262 printAlias(
"beqz",
MI,
Address, 0, 2, STI, OS,
true));
266 printAlias(
"beqz",
MI,
Address, 0, 2, STI, OS,
true);
271 printAlias(
"bnez",
MI,
Address, 0, 2, STI, OS,
true);
275 printAlias(
"bnez",
MI,
Address, 0, 2, STI, OS,
true);
279 printAlias(
"bal",
MI,
Address, 1, STI, OS,
true);
283 printAlias(
"bc1t",
MI,
Address, 1, STI, OS,
true);
287 printAlias(
"bc1f",
MI,
Address, 1, STI, OS,
true);
292 printAlias(
"jr",
MI,
Address, 1, STI, OS)) ||
294 printAlias(
"jalr",
MI,
Address, 1, STI, OS));
299 printAlias(
"jr",
MI,
Address, 1, STI, OS)) ||
301 printAlias(
"jalr",
MI,
Address, 1, STI, OS));
307 printAlias(
"not",
MI,
Address, 0, 1, STI, OS);
311 printAlias(
"not",
MI,
Address, 0, 1, STI, OS);
317 printAlias(
"move",
MI,
Address, 0, 1, STI, OS);
323void MipsInstPrinter::printSaveRestore(
const MCInst *
MI,
326 for (
unsigned i = 0, e =
MI->getNumOperands(); i != e; ++i) {
327 if (i != 0)
O <<
", ";
328 if (
MI->getOperand(i).isReg())
331 printUImm<16>(
MI, i, STI, O);
335void MipsInstPrinter::printRegisterList(
const MCInst *
MI,
int opNum,
340 for (
int i = opNum, e =
MI->getNumOperands() - 2; i != e; ++i) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isReg(const MCInst &MI, unsigned OpNo)
WithMarkup markup(raw_ostream &OS, Markup M)
format_object< int64_t > formatHex(int64_t Value) const
void printAnnotation(raw_ostream &OS, StringRef Annot)
Utility function for printing annotations.
format_object< int64_t > formatImm(int64_t Value) const
Utility function to print immediates in decimal or hex.
bool PrintBranchImmAsAddress
If true, a branch immediate (e.g.
Instances of this class represent a single low-level machine instruction.
Instances of this class represent operands of the MCInst class.
Wrapper class representing physical registers. Should be passed by value.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
static const char * getRegisterName(MCRegister Reg, unsigned AltIdx=Mips::NoRegAltName)
void printRegName(raw_ostream &OS, MCRegister Reg) override
Print the assembler register name.
void printInstruction(const MCInst *MI, uint64_t Address, const MCSubtargetInfo &STI, raw_ostream &O)
void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &O) override
Print the specified MCInst to the specified raw_ostream.
bool printAliasInstr(const MCInst *MI, uint64_t Address, const MCSubtargetInfo &STI, raw_ostream &OS)
Represent a constant reference to a string, i.e.
LLVM_ABI std::string lower() const
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
const char * MipsFCCToString(Mips::CondCode CC)
This is an optimization pass for GlobalISel generic memory operations.
DWARFExpression::Operation Op