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