MipsInstPrinter.cpp revision 37ef65b9c1b93c386d13089d9ace6a1cc00e82dc
1d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner//===-- MipsInstPrinter.cpp - Convert Mips MCInst to assembly syntax ------===// 2d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner// 3d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner// The LLVM Compiler Infrastructure 4d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner// 5d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner// This file is distributed under the University of Illinois Open Source 6d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner// License. See LICENSE.TXT for details. 7d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner// 8d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner//===----------------------------------------------------------------------===// 9d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner// 10d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner// This class prints an Mips MCInst to a .s file. 11d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner// 12d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner//===----------------------------------------------------------------------===// 13d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 14d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner#define DEBUG_TYPE "asm-printer" 15d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner#include "MipsInstPrinter.h" 16c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara#include "MipsInstrInfo.h" 177094dee95f8c915d27097ac18b47d1ef31fd72edJoerg Sonnenberger#include "llvm/ADT/StringExtras.h" 181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include "llvm/MC/MCExpr.h" 19d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner#include "llvm/MC/MCInst.h" 20d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner#include "llvm/MC/MCInstrInfo.h" 212fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper#include "llvm/MC/MCSymbol.h" 222fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper#include "llvm/Support/ErrorHandling.h" 2380ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith#include "llvm/Support/raw_ostream.h" 242fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topperusing namespace llvm; 252fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper 2680ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith#define PRINT_ALIAS_INSTR 272fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper#include "MipsGenAsmWriter.inc" 282fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper 292fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topperconst char* Mips::MipsFCCToString(Mips::CondCode CC) { 302fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper switch (CC) { 312fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_F: 3280ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith case FCOND_T: return "f"; 3380ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith case FCOND_UN: 342fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_OR: return "un"; 352fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_OEQ: 362fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_UNE: return "eq"; 372fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_UEQ: 382fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_ONE: return "ueq"; 392fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_OLT: 402fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_UGE: return "olt"; 412fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_ULT: 422fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_OGE: return "ult"; 432fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_OLE: 442fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_UGT: return "ole"; 452fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_ULE: 465cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case FCOND_OGT: return "ule"; 472fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_SF: 485cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case FCOND_ST: return "sf"; 494e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie case FCOND_NGLE: 50d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case FCOND_GLE: return "ngle"; 51d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case FCOND_SEQ: 522fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_SNE: return "seq"; 53d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case FCOND_NGL: 54d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case FCOND_GL: return "ngl"; 555cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case FCOND_LT: 562fa4e86b4fdada3b9ecbbbd99965b83ed879f69bCraig Topper case FCOND_NLT: return "lt"; 5780ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith case FCOND_NGE: 58d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case FCOND_GE: return "nge"; 591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case FCOND_LE: 60d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case FCOND_NLE: return "le"; 61d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case FCOND_NGT: 62d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case FCOND_GT: return "ngt"; 635cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor } 6480ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith llvm_unreachable("Impossible condition code!"); 65d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner} 661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6780ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smithvoid MipsInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const { 68d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner OS << '$' << StringRef(getRegisterName(RegNo)).lower(); 69d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner} 70d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 71d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattnervoid MipsInstPrinter::printInst(const MCInst *MI, raw_ostream &O, 721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StringRef Annot) { 73d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner switch (MI->getOpcode()) { 74d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner default: 75d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner break; 76d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case Mips::RDHWR: 77d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case Mips::RDHWR64: 78d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner O << "\t.set\tpush\n"; 79d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner O << "\t.set\tmips32r2\n"; 80d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner } 81d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 82d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner // Try to print any aliases first. 83d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner if (!printAliasInstr(MI, O)) 84d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner printInstruction(MI, O); 85d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner printAnnotation(O, Annot); 86d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 87d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner switch (MI->getOpcode()) { 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump default: 8999831e4677a7e2e051af636221694d60ba31fcdbRichard Smith break; 9080ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith case Mips::RDHWR: 9199831e4677a7e2e051af636221694d60ba31fcdbRichard Smith case Mips::RDHWR64: 9299831e4677a7e2e051af636221694d60ba31fcdbRichard Smith O << "\n\t.set\tpop"; 9399831e4677a7e2e051af636221694d60ba31fcdbRichard Smith } 9499831e4677a7e2e051af636221694d60ba31fcdbRichard Smith} 9599831e4677a7e2e051af636221694d60ba31fcdbRichard Smith 9699831e4677a7e2e051af636221694d60ba31fcdbRichard Smithstatic void printExpr(const MCExpr *Expr, raw_ostream &OS) { 9799831e4677a7e2e051af636221694d60ba31fcdbRichard Smith int Offset = 0; 9899831e4677a7e2e051af636221694d60ba31fcdbRichard Smith const MCSymbolRefExpr *SRE; 9999831e4677a7e2e051af636221694d60ba31fcdbRichard Smith 10099831e4677a7e2e051af636221694d60ba31fcdbRichard Smith if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr)) { 10199831e4677a7e2e051af636221694d60ba31fcdbRichard Smith SRE = dyn_cast<MCSymbolRefExpr>(BE->getLHS()); 102d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(BE->getRHS()); 103d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner assert(SRE && CE && "Binary expression must be sym+const."); 104d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner Offset = CE->getValue(); 105d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner } 106d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner else if (!(SRE = dyn_cast<MCSymbolRefExpr>(Expr))) 107d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner assert(false && "Unexpected MCExpr type."); 108d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 109d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner MCSymbolRefExpr::VariantKind Kind = SRE->getKind(); 110d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 111d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner switch (Kind) { 112d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner default: llvm_unreachable("Invalid kind!"); 113d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case MCSymbolRefExpr::VK_None: break; 11486851109b8f70eee7a743bc914219e4f0d8bf9f4Chris Lattner case MCSymbolRefExpr::VK_Mips_GPREL: OS << "%gp_rel("; break; 115d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case MCSymbolRefExpr::VK_Mips_GOT_CALL: OS << "%call16("; break; 116d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case MCSymbolRefExpr::VK_Mips_GOT16: OS << "%got("; break; 117d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case MCSymbolRefExpr::VK_Mips_GOT: OS << "%got("; break; 118d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner case MCSymbolRefExpr::VK_Mips_ABS_HI: OS << "%hi("; break; 11999c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_ABS_LO: OS << "%lo("; break; 12099c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_TLSGD: OS << "%tlsgd("; break; 12199c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_TLSLDM: OS << "%tlsldm("; break; 12299c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_DTPREL_HI: OS << "%dtprel_hi("; break; 12399c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_DTPREL_LO: OS << "%dtprel_lo("; break; 124e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar case MCSymbolRefExpr::VK_Mips_GOTTPREL: OS << "%gottprel("; break; 12599c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_TPREL_HI: OS << "%tprel_hi("; break; 12699c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_TPREL_LO: OS << "%tprel_lo("; break; 12799c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_GPOFF_HI: OS << "%hi(%neg(%gp_rel("; break; 12899c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_GPOFF_LO: OS << "%lo(%neg(%gp_rel("; break; 12999c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_GOT_DISP: OS << "%got_disp("; break; 13099c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_GOT_PAGE: OS << "%got_page("; break; 13199c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_GOT_OFST: OS << "%got_ofst("; break; 13299c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_HIGHER: OS << "%higher("; break; 13399c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_HIGHEST: OS << "%highest("; break; 13499c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_GOT_HI16: OS << "%got_hi("; break; 13599c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_GOT_LO16: OS << "%got_lo("; break; 13699c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_CALL_HI16: OS << "%call_hi("; break; 13799c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar case MCSymbolRefExpr::VK_Mips_CALL_LO16: OS << "%call_lo("; break; 13899c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar } 13999c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar 14099c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar OS << SRE->getSymbol(); 14199c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar 142d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner if (Offset) { 143d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner if (Offset > 0) 144d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner OS << '+'; 145d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner OS << Offset; 146d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner } 147d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 148d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner if ((Kind == MCSymbolRefExpr::VK_Mips_GPOFF_HI) || 149d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner (Kind == MCSymbolRefExpr::VK_Mips_GPOFF_LO)) 150d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner OS << ")))"; 151d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner else if (Kind != MCSymbolRefExpr::VK_None) 152d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner OS << ')'; 1538877321ca66b2887c2f377a7f724a62f34fdf1cdChris Lattner} 1548877321ca66b2887c2f377a7f724a62f34fdf1cdChris Lattner 155d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattnervoid MipsInstPrinter::printCPURegs(const MCInst *MI, unsigned OpNo, 156e1614bb01cc429658b414a9e00603c66ae96d8f5Chris Lattner raw_ostream &O) { 157e1614bb01cc429658b414a9e00603c66ae96d8f5Chris Lattner printRegName(O, MI->getOperand(OpNo).getReg()); 158e1614bb01cc429658b414a9e00603c66ae96d8f5Chris Lattner} 159fcf896078e58aeb7adecb1a0ae5c8e0052b17f9fArgyrios Kyrtzidis 160fcf896078e58aeb7adecb1a0ae5c8e0052b17f9fArgyrios Kyrtzidisvoid MipsInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, 161fcf896078e58aeb7adecb1a0ae5c8e0052b17f9fArgyrios Kyrtzidis raw_ostream &O) { 162fcf896078e58aeb7adecb1a0ae5c8e0052b17f9fArgyrios Kyrtzidis const MCOperand &Op = MI->getOperand(OpNo); 163e1614bb01cc429658b414a9e00603c66ae96d8f5Chris Lattner if (Op.isReg()) { 1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printRegName(O, Op.getReg()); 165d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner return; 166d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner } 167d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Op.isImm()) { 169d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner O << Op.getImm(); 170d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner return; 1711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 172d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 173d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner assert(Op.isExpr() && "unknown operand kind in printOperand"); 1741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printExpr(Op.getExpr(), O); 175d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner} 176d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 177d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattnervoid MipsInstPrinter::printUnsignedImm(const MCInst *MI, int opNum, 178d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner raw_ostream &O) { 179d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner const MCOperand &MO = MI->getOperand(opNum); 180d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner if (MO.isImm()) 1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump O << (unsigned short int)MO.getImm(); 182d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner else 1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printOperand(MI, opNum, O); 184d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner} 185d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner 186d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattnervoid MipsInstPrinter:: 187d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris LattnerprintMemOperand(const MCInst *MI, int opNum, raw_ostream &O) { 188d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner // Load/Store memory operands -- imm($reg) 189d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner // If PIC target the target is loaded as the 190d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner // pattern lw $25,%call16($28) 19199c7622d1f673e8929196cc6eec7825a42622d5fDaniel Dunbar printOperand(MI, opNum+1, O); 192d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner O << "("; 1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printOperand(MI, opNum, O); 194d7038e18ef540a78fe6ce2a43125ce9b08fdbbc5Chris Lattner O << ")"; 195c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara} 196c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara 197c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnaravoid MipsInstPrinter:: 198c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo BagnaraprintMemOperandEA(const MCInst *MI, int opNum, raw_ostream &O) { 199c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara // when using stack locations for not load/store instructions 200c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara // print the same way as all normal 3 operand instructions. 20199831e4677a7e2e051af636221694d60ba31fcdbRichard Smith printOperand(MI, opNum, O); 20299831e4677a7e2e051af636221694d60ba31fcdbRichard Smith O << ", "; 20399831e4677a7e2e051af636221694d60ba31fcdbRichard Smith printOperand(MI, opNum+1, O); 20499831e4677a7e2e051af636221694d60ba31fcdbRichard Smith return; 20599831e4677a7e2e051af636221694d60ba31fcdbRichard Smith} 20699831e4677a7e2e051af636221694d60ba31fcdbRichard Smith 20799831e4677a7e2e051af636221694d60ba31fcdbRichard Smithvoid MipsInstPrinter:: 20899831e4677a7e2e051af636221694d60ba31fcdbRichard SmithprintFCCOperand(const MCInst *MI, int opNum, raw_ostream &O) { 20999831e4677a7e2e051af636221694d60ba31fcdbRichard Smith const MCOperand& MO = MI->getOperand(opNum); 21080ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith O << MipsFCCToString((Mips::CondCode)MO.getImm()); 21199831e4677a7e2e051af636221694d60ba31fcdbRichard Smith} 21299831e4677a7e2e051af636221694d60ba31fcdbRichard Smith