19578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne//===-- XCoreInstPrinter.cpp - Convert XCore MCInst to assembly syntax ----===//
29578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne//
39578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne//                     The LLVM Compiler Infrastructure
49578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne//
59578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne// This file is distributed under the University of Illinois Open Source
69578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne// License. See LICENSE.TXT for details.
79578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne//
89578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne//===----------------------------------------------------------------------===//
99578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne//
109578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne// This class prints an XCore MCInst to a .s file.
119578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne//
129578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne//===----------------------------------------------------------------------===//
139578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
149578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#define DEBUG_TYPE "asm-printer"
159578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "XCoreInstPrinter.h"
169578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/ADT/StringExtras.h"
179578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/MC/MCExpr.h"
189578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/MC/MCInst.h"
199578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/MC/MCInstrInfo.h"
209578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/MC/MCSymbol.h"
219578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/Support/ErrorHandling.h"
229578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/Support/raw_ostream.h"
239578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborneusing namespace llvm;
249578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
259578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "XCoreGenAsmWriter.inc"
269578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
279578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
289578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  OS << StringRef(getRegisterName(RegNo)).lower();
299578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne}
309578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
319578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
329578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne                                 StringRef Annot) {
339578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  printInstruction(MI, O);
349578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  printAnnotation(O, Annot);
359578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne}
369578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
379578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter::
389578d793c9450b315721d5cb15001c2e69bff3d0Richard OsborneprintInlineJT(const MCInst *MI, int opNum, raw_ostream &O) {
399578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  report_fatal_error("can't handle InlineJT");
409578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne}
419578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
429578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter::
439578d793c9450b315721d5cb15001c2e69bff3d0Richard OsborneprintInlineJT32(const MCInst *MI, int opNum, raw_ostream &O) {
449578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  report_fatal_error("can't handle InlineJT32");
459578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne}
469578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
479578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornestatic void printExpr(const MCExpr *Expr, raw_ostream &OS) {
489578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  int Offset = 0;
499578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  const MCSymbolRefExpr *SRE;
509578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
519578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr)) {
529578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    SRE = dyn_cast<MCSymbolRefExpr>(BE->getLHS());
539578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(BE->getRHS());
549578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    assert(SRE && CE && "Binary expression must be sym+const.");
559578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    Offset = CE->getValue();
5626949489662d1f349a11809baace6b97eca0d3a2Richard Osborne  } else {
5726949489662d1f349a11809baace6b97eca0d3a2Richard Osborne    SRE = dyn_cast<MCSymbolRefExpr>(Expr);
5826949489662d1f349a11809baace6b97eca0d3a2Richard Osborne    assert(SRE && "Unexpected MCExpr type.");
599578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  }
609578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  assert(SRE->getKind() == MCSymbolRefExpr::VK_None);
619578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
629578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  OS << SRE->getSymbol();
639578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
649578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  if (Offset) {
659578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    if (Offset > 0)
669578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne      OS << '+';
679578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    OS << Offset;
689578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  }
699578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne}
709578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
719578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter::
729578d793c9450b315721d5cb15001c2e69bff3d0Richard OsborneprintOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
739578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  const MCOperand &Op = MI->getOperand(OpNo);
749578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  if (Op.isReg()) {
759578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    printRegName(O, Op.getReg());
769578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    return;
779578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  }
789578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
799578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  if (Op.isImm()) {
809578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    O << Op.getImm();
819578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    return;
829578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  }
839578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
849578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  assert(Op.isExpr() && "unknown operand kind in printOperand");
859578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  printExpr(Op.getExpr(), O);
869578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne}
879578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
889578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter::
899578d793c9450b315721d5cb15001c2e69bff3d0Richard OsborneprintMemOperand(const MCInst *MI, int opNum, raw_ostream &O) {
909578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  printOperand(MI, opNum, O);
919578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
929578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  if (MI->getOperand(opNum+1).isImm() && MI->getOperand(opNum+1).getImm() == 0)
939578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    return;
949578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
959578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  O << "+";
969578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  printOperand(MI, opNum+1, O);
979578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne}
98