diff options
author | Nikolai Bozhenov <nikolai.bozhenov@intel.com> | 2017-12-07 12:35:02 +0000 |
---|---|---|
committer | Nikolai Bozhenov <nikolai.bozhenov@intel.com> | 2017-12-07 12:35:02 +0000 |
commit | 1cf9c54e5c74e6e8a5d4cb152b105ab6c5964739 (patch) | |
tree | 560e4d68271ed7bcccfdf34759374956df39d78b /llvm/lib/Target/Nios2/InstPrinter/Nios2InstPrinter.cpp | |
parent | 44cfc51415e6acc6ea53029d7499923864a4cd5d (diff) | |
download | bcm5719-llvm-1cf9c54e5c74e6e8a5d4cb152b105ab6c5964739.tar.gz bcm5719-llvm-1cf9c54e5c74e6e8a5d4cb152b105ab6c5964739.zip |
[Nios2] final infrastructure to provide compilation of a return from a function
This patch includes all missing functionality needed to provide first
compilation of a simple program that just returns from a function.
I've added a test case that checks for "ret" instruction printed in assembly
output.
Patch by Andrei Grischenko (andrei.l.grischenko@intel.com)
Differential revision: https://reviews.llvm.org/D39688
llvm-svn: 320035
Diffstat (limited to 'llvm/lib/Target/Nios2/InstPrinter/Nios2InstPrinter.cpp')
-rw-r--r-- | llvm/lib/Target/Nios2/InstPrinter/Nios2InstPrinter.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/llvm/lib/Target/Nios2/InstPrinter/Nios2InstPrinter.cpp b/llvm/lib/Target/Nios2/InstPrinter/Nios2InstPrinter.cpp new file mode 100644 index 00000000000..de0a5f9e84e --- /dev/null +++ b/llvm/lib/Target/Nios2/InstPrinter/Nios2InstPrinter.cpp @@ -0,0 +1,66 @@ +//===-- Nios2InstPrinter.cpp - Convert Nios2 MCInst to assembly 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 Nios2 MCInst to a .s file. +// +//===----------------------------------------------------------------------===// + +#include "Nios2InstPrinter.h" + +#include "Nios2InstrInfo.h" +#include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCInst.h" +#include "llvm/MC/MCInstrInfo.h" +#include "llvm/Support/raw_ostream.h" +using namespace llvm; + +#define DEBUG_TYPE "asm-printer" + +#define PRINT_ALIAS_INSTR +#include "Nios2GenAsmWriter.inc" + +void Nios2InstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const { + OS << getRegisterName(RegNo); +} + +void Nios2InstPrinter::printInst(const MCInst *MI, raw_ostream &O, + StringRef Annot, const MCSubtargetInfo &STI) { + // Try to print any aliases first. + if (!printAliasInstr(MI, STI, O)) + printInstruction(MI, STI, O); + printAnnotation(O, Annot); +} + +void Nios2InstPrinter::printOperand(const MCInst *MI, int OpNo, + const MCSubtargetInfo &STI, + raw_ostream &O) { + const MCOperand &Op = MI->getOperand(OpNo); + if (Op.isReg()) { + printRegName(O, Op.getReg()); + return; + } + + if (Op.isImm()) { + O << Op.getImm(); + return; + } + + assert(Op.isExpr() && "unknown operand kind in printOperand"); + Op.getExpr()->print(O, &MAI, true); +} + +void Nios2InstPrinter::printMemOperand(const MCInst *MI, int opNum, + const MCSubtargetInfo &STI, + raw_ostream &O, const char *Modifier) { + // Load/Store memory operands -- imm($reg) + printOperand(MI, opNum + 1, STI, O); + O << "("; + printOperand(MI, opNum, STI, O); + O << ")"; +} |