• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- Nios2InstPrinter.cpp - Convert Nios2 MCInst to assembly syntax-----===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This class prints an Nios2 MCInst to a .s file.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "Nios2InstPrinter.h"
15 
16 #include "Nios2InstrInfo.h"
17 #include "llvm/MC/MCExpr.h"
18 #include "llvm/MC/MCInst.h"
19 #include "llvm/MC/MCInstrInfo.h"
20 #include "llvm/Support/raw_ostream.h"
21 using namespace llvm;
22 
23 #define DEBUG_TYPE "asm-printer"
24 
25 #define PRINT_ALIAS_INSTR
26 #include "Nios2GenAsmWriter.inc"
27 
printRegName(raw_ostream & OS,unsigned RegNo) const28 void Nios2InstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
29   OS << getRegisterName(RegNo);
30 }
31 
printInst(const MCInst * MI,raw_ostream & O,StringRef Annot,const MCSubtargetInfo & STI)32 void Nios2InstPrinter::printInst(const MCInst *MI, raw_ostream &O,
33                                  StringRef Annot, const MCSubtargetInfo &STI) {
34   // Try to print any aliases first.
35   if (!printAliasInstr(MI, STI, O))
36     printInstruction(MI, STI, O);
37   printAnnotation(O, Annot);
38 }
39 
printOperand(const MCInst * MI,int OpNo,const MCSubtargetInfo & STI,raw_ostream & O)40 void Nios2InstPrinter::printOperand(const MCInst *MI, int OpNo,
41                                     const MCSubtargetInfo &STI,
42                                     raw_ostream &O) {
43   const MCOperand &Op = MI->getOperand(OpNo);
44   if (Op.isReg()) {
45     printRegName(O, Op.getReg());
46     return;
47   }
48 
49   if (Op.isImm()) {
50     O << Op.getImm();
51     return;
52   }
53 
54   assert(Op.isExpr() && "unknown operand kind in printOperand");
55   Op.getExpr()->print(O, &MAI, true);
56 }
57 
printMemOperand(const MCInst * MI,int opNum,const MCSubtargetInfo & STI,raw_ostream & O,const char * Modifier)58 void Nios2InstPrinter::printMemOperand(const MCInst *MI, int opNum,
59                                        const MCSubtargetInfo &STI,
60                                        raw_ostream &O, const char *Modifier) {
61   // Load/Store memory operands -- imm($reg)
62   printOperand(MI, opNum + 1, STI, O);
63   O << "(";
64   printOperand(MI, opNum, STI, O);
65   O << ")";
66 }
67