summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Nios2/InstPrinter/Nios2InstPrinter.cpp
diff options
context:
space:
mode:
authorNikolai Bozhenov <nikolai.bozhenov@intel.com>2017-12-07 12:35:02 +0000
committerNikolai Bozhenov <nikolai.bozhenov@intel.com>2017-12-07 12:35:02 +0000
commit1cf9c54e5c74e6e8a5d4cb152b105ab6c5964739 (patch)
tree560e4d68271ed7bcccfdf34759374956df39d78b /llvm/lib/Target/Nios2/InstPrinter/Nios2InstPrinter.cpp
parent44cfc51415e6acc6ea53029d7499923864a4cd5d (diff)
downloadbcm5719-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.cpp66
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 << ")";
+}
OpenPOWER on IntegriCloud