26#define DEBUG_TYPE "asm-printer"
29#define PRINT_ALIAS_INSTR
30#include "RISCVGenAsmWriter.inc"
45 if (Opt ==
"no-aliases") {
49 if (Opt ==
"numeric") {
53 if (Opt ==
"emit-x8-as-fp") {
71 NewMI = &UncompressedMI;
97 assert(MO.
isExpr() &&
"Unknown operand kind in printOperand");
126 unsigned Imm =
MI->getOperand(OpNo).getImm();
127 auto Range = RISCVSysReg::lookupSysRegByEncoding(
Imm);
129 return !Reg.IsAltName && !Reg.IsDeprecatedName &&
130 Reg.FeaturesRequired.any() &&
133 for (
auto &Reg :
Range) {
134 if (Reg.IsAltName || Reg.IsDeprecatedName)
137 (!PreferFeatureSpecific || Reg.FeaturesRequired.any())) {
148 unsigned FenceArg =
MI->getOperand(OpNo).getImm();
149 assert (((FenceArg >> 4) == 0) &&
"Invalid immediate in printFenceArg");
169 "SpacemiT's Integer Matrix only supports [i4|i8] mode");
199 unsigned Imm =
MI->getOperand(OpNo).getImm();
202 }
else if (
Imm == 30) {
204 }
else if (
Imm == 31) {
212 if (FPVal == (
int)(FPVal))
224 assert(MO.
isReg() &&
"printZeroOffsetMemOp can only print register operands");
232 unsigned Imm =
MI->getOperand(OpNo).getImm();
246 unsigned Imm =
MI->getOperand(OpNo).getImm();
262 unsigned Imm =
MI->getOperand(OpNo).getImm();
304 const MCOperand &OffsetMO =
MI->getOperand(OpNo + 1);
306 assert(OffsetMO.
isReg() &&
"printRegReg can only print register operands");
311 assert(BaseMO.
isReg() &&
"printRegReg can only print register operands");
319 int64_t
Imm =
MI->getOperand(OpNo).getImm();
320 bool IsRV64 = STI.
hasFeature(RISCV::Feature64Bit);
321 int64_t StackAdj = 0;
322 auto RlistVal =
MI->getOperand(0).getImm();
326 "Incorrect stack adjust");
328 StackAdj = -StackAdj;
340 assert(MO.
isReg() &&
"printVMaskReg can only print register operands");
341 if (MO.
getReg() == RISCV::NoRegister)
353 assert(MO.
isReg() &&
"printVScaleReg can only print register operands");
364 assert(MO.
isImm() &&
"printTileLambda can only print immediate operands");
365 unsigned Lambda = MO.
getImm();
369 assert(Lambda <= 7 &&
"Unexpected tile lambda encoding");
370 O <<
", L" << (1U << (Lambda - 1));
376 const unsigned Opcode =
MI->getOpcode();
377 uint64_t
Imm =
Op.getImm();
379 (Opcode == RISCV::ANDI || Opcode == RISCV::ORI || Opcode == RISCV::XORI ||
380 Opcode == RISCV::C_ANDI || Opcode == RISCV::AUIPC ||
381 Opcode == RISCV::LUI)) {
399 : RISCV::ABIRegAltName);
static SDValue Widen(SelectionDAG *CurDAG, SDValue N)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static cl::opt< bool > ArchRegNames("csky-arch-reg-names", cl::desc("Print architectural register names rather than the " "ABI names (such as r14 instead of sp)"), cl::init(false), cl::Hidden)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
WithMarkup markup(raw_ostream &OS, Markup M)
format_object< int64_t > formatHex(int64_t Value) const
bool SymbolizeOperands
If true, symbolize branch target and memory reference operands.
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.
bool PrintAliases
True if we prefer aliases (e.g. nop) to raw mnemonics.
Instances of this class represent a single low-level machine instruction.
Instances of this class represent operands of the MCInst class.
MCRegister getReg() const
Returns the register number.
const MCExpr * getExpr() const
Wrapper class representing physical registers. Should be passed by value.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
const Triple & getTargetTriple() const
const FeatureBitset & getFeatureBits() const
void printSMTVType(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printRegList(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printTileLambda(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
static const char * getRegisterName(MCRegister Reg)
void printCSRSystemRegister(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printXSfmmVType(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printImm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printFenceArg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printVMaskReg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
bool applyTargetSpecificCLOption(StringRef Opt) override
Customize the printer according to a command line option.
void printFRMArgLegacy(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
bool printAliasInstr(const MCInst *MI, uint64_t Address, const MCSubtargetInfo &STI, raw_ostream &O)
void printRegReg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printFRMArg(const MCInst *MI, unsigned OpNo, 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.
void printFPImmOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printInstruction(const MCInst *MI, uint64_t Address, const MCSubtargetInfo &STI, raw_ostream &O)
void printZeroOffsetMemOp(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printRegName(raw_ostream &O, MCRegister Reg) override
Print the assembler register name.
void printVTypeI(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printVScaleReg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printStackAdj(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O, bool Negate=false)
void printBranchOperand(const MCInst *MI, uint64_t Address, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
Represent a constant reference to a string, i.e.
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
This class implements an extremely fast bulk output stream that can only output to a stream.
static StringRef roundingModeToString(RoundingMode RndMode)
float getFPImm(unsigned Imm)
bool uncompress(MCInst &OutInst, const MCInst &MI, const MCSubtargetInfo &STI)
static unsigned getXSfmmWiden(unsigned VType)
static bool isValidVType(unsigned VType)
LLVM_ABI void printVType(unsigned VType, raw_ostream &OS)
static bool isValidXSfmmVType(unsigned VTypeI)
static bool isAltFmt(unsigned VType)
static unsigned getSEW(unsigned VType)
static unsigned getStackAdjBase(unsigned RlistVal, bool IsRV64)
static StringRef SMTVTypeModeToString(SMTVTypeMode TypeMode)
static bool isValidSMTVTypeMode(unsigned Mode)
This is an optimization pass for GlobalISel generic memory operations.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
DWARFExpression::Operation Op