mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
The most interesting part of this patch is probably the handling of rounding mode arguments. Sadly, the RISC-V assembler handles floating point rounding modes as a special "argument" when it would be more consistent to handle them like the atomics, opcode suffixes. This patch supports parsing this optional parameter, using InstAlias to allow parsing these floating point instructions when no rounding mode is specified. Differential Revision: https://reviews.llvm.org/D39893 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@320020 91177308-0d34-0410-b5e6-96231b3b80d8
80 lines
2.4 KiB
C++
80 lines
2.4 KiB
C++
//===-- RISCVInstPrinter.cpp - Convert RISCV MCInst to asm syntax ---------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This class prints an RISCV MCInst to a .s file.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "RISCVInstPrinter.h"
|
|
#include "MCTargetDesc/RISCVBaseInfo.h"
|
|
#include "llvm/MC/MCAsmInfo.h"
|
|
#include "llvm/MC/MCExpr.h"
|
|
#include "llvm/MC/MCInst.h"
|
|
#include "llvm/MC/MCRegisterInfo.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/FormattedStream.h"
|
|
using namespace llvm;
|
|
|
|
#define DEBUG_TYPE "asm-printer"
|
|
|
|
// Include the auto-generated portion of the assembly writer.
|
|
#define PRINT_ALIAS_INSTR
|
|
#include "RISCVGenAsmWriter.inc"
|
|
|
|
void RISCVInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
|
|
StringRef Annot, const MCSubtargetInfo &STI) {
|
|
if (!printAliasInstr(MI, O))
|
|
printInstruction(MI, O);
|
|
printAnnotation(O, Annot);
|
|
}
|
|
|
|
void RISCVInstPrinter::printRegName(raw_ostream &O, unsigned RegNo) const {
|
|
O << getRegisterName(RegNo);
|
|
}
|
|
|
|
void RISCVInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
|
|
raw_ostream &O, const char *Modifier) {
|
|
assert((Modifier == 0 || Modifier[0] == 0) && "No modifiers supported");
|
|
const MCOperand &MO = MI->getOperand(OpNo);
|
|
|
|
if (MO.isReg()) {
|
|
printRegName(O, MO.getReg());
|
|
return;
|
|
}
|
|
|
|
if (MO.isImm()) {
|
|
O << MO.getImm();
|
|
return;
|
|
}
|
|
|
|
assert(MO.isExpr() && "Unknown operand kind in printOperand");
|
|
MO.getExpr()->print(O, &MAI);
|
|
}
|
|
|
|
void RISCVInstPrinter::printFenceArg(const MCInst *MI, unsigned OpNo,
|
|
raw_ostream &O) {
|
|
unsigned FenceArg = MI->getOperand(OpNo).getImm();
|
|
if ((FenceArg & RISCVFenceField::I) != 0)
|
|
O << 'i';
|
|
if ((FenceArg & RISCVFenceField::O) != 0)
|
|
O << 'o';
|
|
if ((FenceArg & RISCVFenceField::R) != 0)
|
|
O << 'r';
|
|
if ((FenceArg & RISCVFenceField::W) != 0)
|
|
O << 'w';
|
|
}
|
|
|
|
void RISCVInstPrinter::printFRMArg(const MCInst *MI, unsigned OpNo,
|
|
raw_ostream &O) {
|
|
auto FRMArg =
|
|
static_cast<RISCVFPRndMode::RoundingMode>(MI->getOperand(OpNo).getImm());
|
|
O << RISCVFPRndMode::roundingModeToString(FRMArg);
|
|
}
|