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)