PPCInstPrinter.cpp revision cde4ce411b1ace4a80ea1dd38df97e8508aed0c9
160d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner//===-- PPCInstPrinter.cpp - Convert PPC MCInst to assembly syntax --------===// 260d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner// 360d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner// The LLVM Compiler Infrastructure 460d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner// 560d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner// This file is distributed under the University of Illinois Open Source 660d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner// License. See LICENSE.TXT for details. 760d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner// 860d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner//===----------------------------------------------------------------------===// 960d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner// 1060d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner// This class prints an PPC MCInst to a .s file. 1160d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner// 1260d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner//===----------------------------------------------------------------------===// 1360d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 1460d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#define DEBUG_TYPE "asm-printer" 1560d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "PPCInstPrinter.h" 16b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner#include "PPCPredicates.h" 170d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner#include "llvm/MC/MCExpr.h" 1860d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "llvm/MC/MCInst.h" 1960d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "llvm/Support/raw_ostream.h" 2060d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattnerusing namespace llvm; 2160d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 2260d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#define GET_INSTRUCTION_NAME 2360d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "PPCGenAsmWriter.inc" 2460d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 2560d5b5fdeec64b69c92db60242d3d90b3f978e69Chris LattnerStringRef PPCInstPrinter::getOpcodeName(unsigned Opcode) const { 2660d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner return getInstructionName(Opcode); 2760d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner} 2860d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 29cde4ce411b1ace4a80ea1dd38df97e8508aed0c9Rafael Espindolavoid PPCInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const { 30cde4ce411b1ace4a80ea1dd38df97e8508aed0c9Rafael Espindola OS << getRegisterName(RegNo); 316e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola} 3260d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 3360d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattnervoid PPCInstPrinter::printInst(const MCInst *MI, raw_ostream &O) { 342e35248f14ac449774de9727b460469fc3c93249Chris Lattner // Check for slwi/srwi mnemonics. 352e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (MI->getOpcode() == PPC::RLWINM) { 362e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char SH = MI->getOperand(2).getImm(); 372e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char MB = MI->getOperand(3).getImm(); 382e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char ME = MI->getOperand(4).getImm(); 392e35248f14ac449774de9727b460469fc3c93249Chris Lattner bool useSubstituteMnemonic = false; 402e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (SH <= 31 && MB == 0 && ME == (31-SH)) { 412e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tslwi "; useSubstituteMnemonic = true; 422e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 432e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (SH <= 31 && MB == (32-SH) && ME == 31) { 442e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tsrwi "; useSubstituteMnemonic = true; 452e35248f14ac449774de9727b460469fc3c93249Chris Lattner SH = 32-SH; 462e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 472e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (useSubstituteMnemonic) { 482e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 0, O); 492e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", "; 502e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 1, O); 512e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", " << (unsigned int)SH; 522e35248f14ac449774de9727b460469fc3c93249Chris Lattner return; 532e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 542e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 552e35248f14ac449774de9727b460469fc3c93249Chris Lattner 562e35248f14ac449774de9727b460469fc3c93249Chris Lattner if ((MI->getOpcode() == PPC::OR || MI->getOpcode() == PPC::OR8) && 572e35248f14ac449774de9727b460469fc3c93249Chris Lattner MI->getOperand(1).getReg() == MI->getOperand(2).getReg()) { 582e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tmr "; 592e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 0, O); 602e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", "; 612e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 1, O); 622e35248f14ac449774de9727b460469fc3c93249Chris Lattner return; 632e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 642e35248f14ac449774de9727b460469fc3c93249Chris Lattner 652e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (MI->getOpcode() == PPC::RLDICR) { 662e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char SH = MI->getOperand(2).getImm(); 672e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char ME = MI->getOperand(3).getImm(); 682e35248f14ac449774de9727b460469fc3c93249Chris Lattner // rldicr RA, RS, SH, 63-SH == sldi RA, RS, SH 692e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (63-SH == ME) { 702e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tsldi "; 712e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 0, O); 722e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", "; 732e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 1, O); 742e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", " << (unsigned int)SH; 752e35248f14ac449774de9727b460469fc3c93249Chris Lattner return; 762e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 772e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 782e35248f14ac449774de9727b460469fc3c93249Chris Lattner 7960d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner printInstruction(MI, O); 8060d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner} 8160d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 82b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner 83b2e477f5463795de8265939300fb5c0abfdded77Chris Lattnervoid PPCInstPrinter::printPredicateOperand(const MCInst *MI, unsigned OpNo, 84b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner raw_ostream &O, 85b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner const char *Modifier) { 86b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner assert(Modifier && "Must specify 'cc' or 'reg' as predicate op modifier!"); 87b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner unsigned Code = MI->getOperand(OpNo).getImm(); 88b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner if (StringRef(Modifier) == "cc") { 89b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner switch ((PPC::Predicate)Code) { 90b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner default: assert(0 && "Invalid predicate"); 91b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_ALWAYS: return; // Don't print anything for always. 92b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_LT: O << "lt"; return; 93b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_LE: O << "le"; return; 94b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_EQ: O << "eq"; return; 95b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_GE: O << "ge"; return; 96b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_GT: O << "gt"; return; 97b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_NE: O << "ne"; return; 98b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_UN: O << "un"; return; 99b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_NU: O << "nu"; return; 100b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner } 101b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner } 102b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner 103b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner assert(StringRef(Modifier) == "reg" && 104b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner "Need to specify 'cc' or 'reg' as predicate op modifier!"); 105b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner // Don't print the register for 'always'. 106b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner if (Code == PPC::PRED_ALWAYS) return; 107b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner printOperand(MI, OpNo+1, O); 108b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner} 109b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner 11099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS5ImmOperand(const MCInst *MI, unsigned OpNo, 11199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 11299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner char Value = MI->getOperand(OpNo).getImm(); 11399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner Value = (Value << (32-5)) >> (32-5); 11499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (int)Value; 11599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 11699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 11799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU5ImmOperand(const MCInst *MI, unsigned OpNo, 11899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 11999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner unsigned char Value = MI->getOperand(OpNo).getImm(); 12099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner assert(Value <= 31 && "Invalid u5imm argument!"); 12199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned int)Value; 12299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 12399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 12499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU6ImmOperand(const MCInst *MI, unsigned OpNo, 12599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 12699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner unsigned char Value = MI->getOperand(OpNo).getImm(); 12799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner assert(Value <= 63 && "Invalid u6imm argument!"); 12899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned int)Value; 12999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 13099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 13199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS16ImmOperand(const MCInst *MI, unsigned OpNo, 13299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 13399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (short)MI->getOperand(OpNo).getImm(); 13499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 13599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 13699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo, 13799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 13899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned short)MI->getOperand(OpNo).getImm(); 13999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 14099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 14199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS16X4ImmOperand(const MCInst *MI, unsigned OpNo, 14299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 143b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner if (MI->getOperand(OpNo).isImm()) 14499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (short)(MI->getOperand(OpNo).getImm()*4); 14599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner else 146b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner printOperand(MI, OpNo, O); 14799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 14899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 1491520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattnervoid PPCInstPrinter::printBranchOperand(const MCInst *MI, unsigned OpNo, 1501520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner raw_ostream &O) { 1511520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner if (!MI->getOperand(OpNo).isImm()) 1521520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner return printOperand(MI, OpNo, O); 1531520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 1541520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner // Branches can take an immediate operand. This is used by the branch 1551520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner // selection pass to print $+8, an eight byte displacement from the PC. 156b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner O << "$+"; 157b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner printAbsAddrOperand(MI, OpNo, O); 1581520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner} 1591520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 160b2e477f5463795de8265939300fb5c0abfdded77Chris Lattnervoid PPCInstPrinter::printAbsAddrOperand(const MCInst *MI, unsigned OpNo, 161b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner raw_ostream &O) { 162b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner O << (int)MI->getOperand(OpNo).getImm()*4; 163b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner} 1641520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 1651520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 166fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printcrbitm(const MCInst *MI, unsigned OpNo, 167fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 168fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner unsigned CCReg = MI->getOperand(OpNo).getReg(); 169fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner unsigned RegNo; 170fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner switch (CCReg) { 171fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner default: assert(0 && "Unknown CR register"); 172fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR0: RegNo = 0; break; 173fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR1: RegNo = 1; break; 174fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR2: RegNo = 2; break; 175fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR3: RegNo = 3; break; 176fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR4: RegNo = 4; break; 177fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR5: RegNo = 5; break; 178fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR6: RegNo = 6; break; 179fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR7: RegNo = 7; break; 180fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner } 181fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << (0x80 >> RegNo); 182fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 183fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 184fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegImm(const MCInst *MI, unsigned OpNo, 185fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 186fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printSymbolLo(MI, OpNo, O); 187fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << '('; 1880fe7184ba156c87deee090001ba1d7af05e84fc1Chris Lattner if (MI->getOperand(OpNo+1).getReg() == PPC::R0) 189fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 190fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 191fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 192fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ')'; 193fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 194fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 195fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegImmShifted(const MCInst *MI, unsigned OpNo, 196fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 197fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner if (MI->getOperand(OpNo).isImm()) 198fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printS16X4ImmOperand(MI, OpNo, O); 199fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 200fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printSymbolLo(MI, OpNo, O); 201fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << '('; 202fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 2030fe7184ba156c87deee090001ba1d7af05e84fc1Chris Lattner if (MI->getOperand(OpNo+1).getReg() == PPC::R0) 204fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 205fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 206fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 207fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ')'; 208fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 209fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 210fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 211fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegReg(const MCInst *MI, unsigned OpNo, 212fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 213fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // When used as the base register, r0 reads constant zero rather than 214fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // the value contained in the register. For this reason, the darwin 215fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // assembler requires that we print r0 as 0 (no r) when used as the base. 216fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner if (MI->getOperand(OpNo).getReg() == PPC::R0) 217fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 218fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 219fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo, O); 220fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ", "; 221fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 222fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 223fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 224fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 22599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 2260d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner/// stripRegisterPrefix - This method strips the character prefix from a 2270d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner/// register name so that only the number is left. Used by for linux asm. 228c62feda741f9d5811b625967c40f1847fb2040e7Benjamin Kramerstatic const char *stripRegisterPrefix(const char *RegName) { 2290d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner switch (RegName[0]) { 2300d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'r': 2310d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'f': 2320d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'v': return RegName + 1; 2330d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'c': if (RegName[1] == 'r') return RegName + 2; 2340d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 2350d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2360d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return RegName; 2370d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner} 2380d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2390d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattnervoid PPCInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, 2400d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner raw_ostream &O) { 2410d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner const MCOperand &Op = MI->getOperand(OpNo); 2420d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (Op.isReg()) { 2430d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner const char *RegName = getRegisterName(Op.getReg()); 2440d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner // The linux and AIX assembler does not take register prefixes. 2450d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (!isDarwinSyntax()) 2460d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner RegName = stripRegisterPrefix(RegName); 2470d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2480d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << RegName; 2490d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return; 2500d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 2510d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2520d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (Op.isImm()) { 2530d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << Op.getImm(); 2540d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return; 2550d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 2560d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2570d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner assert(Op.isExpr() && "unknown operand kind in printOperand"); 2580d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << *Op.getExpr(); 2590d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner} 2600d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 26158d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattnervoid PPCInstPrinter::printSymbolLo(const MCInst *MI, unsigned OpNo, 26258d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner raw_ostream &O) { 26358d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner if (MI->getOperand(OpNo).isImm()) 2641e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner return printS16ImmOperand(MI, OpNo, O); 2651e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner 2661e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner // FIXME: This is a terrible hack because we can't encode lo16() as an operand 2671e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner // flag of a subtraction. See the FIXME in GetSymbolRef in PPCMCInstLower. 2681e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner if (MI->getOperand(OpNo).isExpr() && 2691e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner isa<MCBinaryExpr>(MI->getOperand(OpNo).getExpr())) { 2701e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner O << "lo16("; 27158d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner printOperand(MI, OpNo, O); 2721e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner O << ')'; 2731e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner } else { 2741e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner printOperand(MI, OpNo, O); 2751e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner } 27658d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner} 27758d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner 27858d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattnervoid PPCInstPrinter::printSymbolHi(const MCInst *MI, unsigned OpNo, 27958d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner raw_ostream &O) { 28058d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner if (MI->getOperand(OpNo).isImm()) 2811e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner return printS16ImmOperand(MI, OpNo, O); 2821e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner 2831e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner // FIXME: This is a terrible hack because we can't encode lo16() as an operand 2841e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner // flag of a subtraction. See the FIXME in GetSymbolRef in PPCMCInstLower. 2851e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner if (MI->getOperand(OpNo).isExpr() && 2861e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner isa<MCBinaryExpr>(MI->getOperand(OpNo).getExpr())) { 2871e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner O << "ha16("; 28858d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner printOperand(MI, OpNo, O); 2891e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner O << ')'; 2901e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner } else { 2911e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner printOperand(MI, OpNo, O); 2921e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner } 29358d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner} 294959fb3dd5cfaf2aae44321b58ff87dce4632438dChris Lattner 295959fb3dd5cfaf2aae44321b58ff87dce4632438dChris Lattner 296