XCoreInstPrinter.cpp revision 26949489662d1f349a11809baace6b97eca0d3a2
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