XCoreInstPrinter.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- XCoreInstPrinter.cpp - Convert XCore MCInst to assembly syntax ----===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class prints an XCore MCInst to a .s file.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "XCoreInstPrinter.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/StringExtras.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/MC/MCExpr.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/MC/MCInst.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/MC/MCInstrInfo.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/MC/MCSymbol.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/ErrorHandling.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/raw_ostream.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace llvm;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_TYPE "asm-printer"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "XCoreGenAsmWriter.inc"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XCoreInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OS << StringRef(getRegisterName(RegNo)).lower();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XCoreInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 StringRef Annot) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printInstruction(MI, O);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printAnnotation(O, Annot);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XCoreInstPrinter::
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)printInlineJT(const MCInst *MI, int opNum, raw_ostream &O) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  report_fatal_error("can't handle InlineJT");
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XCoreInstPrinter::
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)printInlineJT32(const MCInst *MI, int opNum, raw_ostream &O) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  report_fatal_error("can't handle InlineJT32");
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void printExpr(const MCExpr *Expr, raw_ostream &OS) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int Offset = 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MCSymbolRefExpr *SRE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr)) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SRE = dyn_cast<MCSymbolRefExpr>(BE->getLHS());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(BE->getRHS());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(SRE && CE && "Binary expression must be sym+const.");
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Offset = CE->getValue();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SRE = dyn_cast<MCSymbolRefExpr>(Expr);
59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    assert(SRE && "Unexpected MCExpr type.");
60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  assert(SRE->getKind() == MCSymbolRefExpr::VK_None);
62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OS << SRE->getSymbol();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Offset) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Offset > 0)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OS << '+';
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OS << Offset;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XCoreInstPrinter::
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MCOperand &Op = MI->getOperand(OpNo);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Op.isReg()) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printRegName(O, Op.getReg());
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Op.isImm()) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    O << Op.getImm();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(Op.isExpr() && "unknown operand kind in printOperand");
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printExpr(Op.getExpr(), O);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)