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#include "XCoreInstPrinter.h" 159578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/ADT/StringExtras.h" 169578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/MC/MCExpr.h" 179578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/MC/MCInst.h" 189578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/MC/MCInstrInfo.h" 199578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/MC/MCSymbol.h" 209578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/Support/ErrorHandling.h" 219578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "llvm/Support/raw_ostream.h" 229578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborneusing namespace llvm; 239578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "asm-printer" 25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 269578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "XCoreGenAsmWriter.inc" 279578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 289578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const { 299578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne OS << StringRef(getRegisterName(RegNo)).lower(); 309578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne} 319578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 329578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter::printInst(const MCInst *MI, raw_ostream &O, 330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar StringRef Annot, const MCSubtargetInfo &STI) { 349578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne printInstruction(MI, O); 359578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne printAnnotation(O, Annot); 369578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne} 379578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 389578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter:: 399578d793c9450b315721d5cb15001c2e69bff3d0Richard OsborneprintInlineJT(const MCInst *MI, int opNum, raw_ostream &O) { 409578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne report_fatal_error("can't handle InlineJT"); 419578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne} 429578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 439578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter:: 449578d793c9450b315721d5cb15001c2e69bff3d0Richard OsborneprintInlineJT32(const MCInst *MI, int opNum, raw_ostream &O) { 459578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne report_fatal_error("can't handle InlineJT32"); 469578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne} 479578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic void printExpr(const MCExpr *Expr, const MCAsmInfo *MAI, 496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar raw_ostream &OS) { 509578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne int Offset = 0; 519578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne const MCSymbolRefExpr *SRE; 529578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 539578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr)) { 549578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne SRE = dyn_cast<MCSymbolRefExpr>(BE->getLHS()); 559578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(BE->getRHS()); 569578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne assert(SRE && CE && "Binary expression must be sym+const."); 579578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne Offset = CE->getValue(); 5826949489662d1f349a11809baace6b97eca0d3a2Richard Osborne } else { 5926949489662d1f349a11809baace6b97eca0d3a2Richard Osborne SRE = dyn_cast<MCSymbolRefExpr>(Expr); 6026949489662d1f349a11809baace6b97eca0d3a2Richard Osborne assert(SRE && "Unexpected MCExpr type."); 619578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne } 629578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne assert(SRE->getKind() == MCSymbolRefExpr::VK_None); 639578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar SRE->getSymbol().print(OS, MAI); 659578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 669578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne if (Offset) { 679578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne if (Offset > 0) 689578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne OS << '+'; 699578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne OS << Offset; 709578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne } 719578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne} 729578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 739578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornevoid XCoreInstPrinter:: 749578d793c9450b315721d5cb15001c2e69bff3d0Richard OsborneprintOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) { 759578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne const MCOperand &Op = MI->getOperand(OpNo); 769578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne if (Op.isReg()) { 779578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne printRegName(O, Op.getReg()); 789578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne return; 799578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne } 809578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 819578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne if (Op.isImm()) { 829578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne O << Op.getImm(); 839578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne return; 849578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne } 859578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne 869578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne assert(Op.isExpr() && "unknown operand kind in printOperand"); 876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar printExpr(Op.getExpr(), &MAI, O); 889578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne} 89