PPCInstPrinter.cpp revision 2e35248f14ac449774de9727b460469fc3c93249
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" 160d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner#include "llvm/MC/MCExpr.h" 1760d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "llvm/MC/MCInst.h" 1860d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner//#include "llvm/MC/MCAsmInfo.h" 1960d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner//#include "llvm/ADT/StringExtras.h" 2060d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "llvm/Support/raw_ostream.h" 2160d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 2260d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "PPCGenRegisterNames.inc" 2360d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "PPCGenInstrNames.inc" 2460d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattnerusing namespace llvm; 2560d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 2660d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#define GET_INSTRUCTION_NAME 2760d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#define PPCAsmPrinter PPCInstPrinter 2860d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#define MachineInstr MCInst 2960d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "PPCGenAsmWriter.inc" 3060d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 3160d5b5fdeec64b69c92db60242d3d90b3f978e69Chris LattnerStringRef PPCInstPrinter::getOpcodeName(unsigned Opcode) const { 3260d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner return getInstructionName(Opcode); 3360d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner} 3460d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 3560d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 3660d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattnervoid PPCInstPrinter::printInst(const MCInst *MI, raw_ostream &O) { 3760d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner // TODO: pseudo ops. 3860d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 392e35248f14ac449774de9727b460469fc3c93249Chris Lattner // Check for slwi/srwi mnemonics. 402e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (MI->getOpcode() == PPC::RLWINM) { 412e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char SH = MI->getOperand(2).getImm(); 422e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char MB = MI->getOperand(3).getImm(); 432e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char ME = MI->getOperand(4).getImm(); 442e35248f14ac449774de9727b460469fc3c93249Chris Lattner bool useSubstituteMnemonic = false; 452e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (SH <= 31 && MB == 0 && ME == (31-SH)) { 462e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tslwi "; useSubstituteMnemonic = true; 472e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 482e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (SH <= 31 && MB == (32-SH) && ME == 31) { 492e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tsrwi "; useSubstituteMnemonic = true; 502e35248f14ac449774de9727b460469fc3c93249Chris Lattner SH = 32-SH; 512e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 522e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (useSubstituteMnemonic) { 532e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 0, O); 542e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", "; 552e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 1, O); 562e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", " << (unsigned int)SH; 572e35248f14ac449774de9727b460469fc3c93249Chris Lattner return; 582e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 592e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 602e35248f14ac449774de9727b460469fc3c93249Chris Lattner 612e35248f14ac449774de9727b460469fc3c93249Chris Lattner if ((MI->getOpcode() == PPC::OR || MI->getOpcode() == PPC::OR8) && 622e35248f14ac449774de9727b460469fc3c93249Chris Lattner MI->getOperand(1).getReg() == MI->getOperand(2).getReg()) { 632e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tmr "; 642e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 0, O); 652e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", "; 662e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 1, O); 672e35248f14ac449774de9727b460469fc3c93249Chris Lattner return; 682e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 692e35248f14ac449774de9727b460469fc3c93249Chris Lattner 702e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (MI->getOpcode() == PPC::RLDICR) { 712e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char SH = MI->getOperand(2).getImm(); 722e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char ME = MI->getOperand(3).getImm(); 732e35248f14ac449774de9727b460469fc3c93249Chris Lattner // rldicr RA, RS, SH, 63-SH == sldi RA, RS, SH 742e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (63-SH == ME) { 752e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tsldi "; 762e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 0, O); 772e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", "; 782e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 1, O); 792e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", " << (unsigned int)SH; 802e35248f14ac449774de9727b460469fc3c93249Chris Lattner return; 812e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 822e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 832e35248f14ac449774de9727b460469fc3c93249Chris Lattner 8460d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner printInstruction(MI, O); 8560d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner} 8660d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 8799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS5ImmOperand(const MCInst *MI, unsigned OpNo, 8899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 8999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner char Value = MI->getOperand(OpNo).getImm(); 9099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner Value = (Value << (32-5)) >> (32-5); 9199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (int)Value; 9299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 9399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 9499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU5ImmOperand(const MCInst *MI, unsigned OpNo, 9599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 9699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner unsigned char Value = MI->getOperand(OpNo).getImm(); 9799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner assert(Value <= 31 && "Invalid u5imm argument!"); 9899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned int)Value; 9999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 10099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 10199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU6ImmOperand(const MCInst *MI, unsigned OpNo, 10299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 10399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner unsigned char Value = MI->getOperand(OpNo).getImm(); 10499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner assert(Value <= 63 && "Invalid u6imm argument!"); 10599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned int)Value; 10699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 10799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 10899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS16ImmOperand(const MCInst *MI, unsigned OpNo, 10999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 11099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (short)MI->getOperand(OpNo).getImm(); 11199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 11299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 11399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo, 11499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 11599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned short)MI->getOperand(OpNo).getImm(); 11699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 11799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 11899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS16X4ImmOperand(const MCInst *MI, unsigned OpNo, 11999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 12099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner if (MI->getOperand(OpNo).isImm()) { 12199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (short)(MI->getOperand(OpNo).getImm()*4); 12299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner return; 12399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner } 12499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 12599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner assert(0 && "Unhandled operand"); 12699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner#if 0 12799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << "lo16("; 12899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner printOp(MI->getOperand(OpNo), O); 12999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner if (TM.getRelocationModel() == Reloc::PIC_) 13099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << "-\"L" << getFunctionNumber() << "$pb\")"; 13199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner else 13299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << ')'; 13399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner#endif 13499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 13599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 1361520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattnervoid PPCInstPrinter::printBranchOperand(const MCInst *MI, unsigned OpNo, 1371520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner raw_ostream &O) { 1381520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner if (!MI->getOperand(OpNo).isImm()) 1391520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner return printOperand(MI, OpNo, O); 1401520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 1411520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner // Branches can take an immediate operand. This is used by the branch 1421520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner // selection pass to print $+8, an eight byte displacement from the PC. 1431520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner O << "$+" << MI->getOperand(OpNo).getImm()*4; 1441520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner} 1451520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 1461520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 1471520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 1481520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 149fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printcrbitm(const MCInst *MI, unsigned OpNo, 150fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 151fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner unsigned CCReg = MI->getOperand(OpNo).getReg(); 152fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner unsigned RegNo; 153fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner switch (CCReg) { 154fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner default: assert(0 && "Unknown CR register"); 155fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR0: RegNo = 0; break; 156fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR1: RegNo = 1; break; 157fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR2: RegNo = 2; break; 158fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR3: RegNo = 3; break; 159fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR4: RegNo = 4; break; 160fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR5: RegNo = 5; break; 161fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR6: RegNo = 6; break; 162fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR7: RegNo = 7; break; 163fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner } 164fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << (0x80 >> RegNo); 165fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 166fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 167fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegImm(const MCInst *MI, unsigned OpNo, 168fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 169fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printSymbolLo(MI, OpNo, O); 170fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << '('; 171fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner assert(MI->getOperand(OpNo+1).isReg() && "Bad operand"); 172fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // FIXME: Simplify. 173fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner if (MI->getOperand(OpNo+1).isReg() && 174fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner MI->getOperand(OpNo+1).getReg() == PPC::R0) 175fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 176fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 177fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 178fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ')'; 179fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 180fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 181fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegImmShifted(const MCInst *MI, unsigned OpNo, 182fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 183fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner if (MI->getOperand(OpNo).isImm()) 184fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printS16X4ImmOperand(MI, OpNo, O); 185fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 186fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printSymbolLo(MI, OpNo, O); 187fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << '('; 188fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 189fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner assert(MI->getOperand(OpNo+1).isReg() && "Bad operand"); 190fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // FIXME: Simplify. 191fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner if (MI->getOperand(OpNo+1).isReg() && 192fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner MI->getOperand(OpNo+1).getReg() == PPC::R0) 193fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 194fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 195fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 196fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ')'; 197fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 198fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 199fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 200fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegReg(const MCInst *MI, unsigned OpNo, 201fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 202fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // When used as the base register, r0 reads constant zero rather than 203fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // the value contained in the register. For this reason, the darwin 204fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // assembler requires that we print r0 as 0 (no r) when used as the base. 205fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner if (MI->getOperand(OpNo).getReg() == PPC::R0) 206fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 207fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 208fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo, O); 209fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ", "; 210fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 211fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 212fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 213fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 21499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 2150d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner/// stripRegisterPrefix - This method strips the character prefix from a 2160d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner/// register name so that only the number is left. Used by for linux asm. 2170d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattnerconst char *stripRegisterPrefix(const char *RegName) { 2180d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner switch (RegName[0]) { 2190d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'r': 2200d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'f': 2210d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'v': return RegName + 1; 2220d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'c': if (RegName[1] == 'r') return RegName + 2; 2230d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 2240d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2250d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return RegName; 2260d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner} 2270d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2280d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattnervoid PPCInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, 2290d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner raw_ostream &O) { 2300d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner const MCOperand &Op = MI->getOperand(OpNo); 2310d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (Op.isReg()) { 2320d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner const char *RegName = getRegisterName(Op.getReg()); 2330d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner // The linux and AIX assembler does not take register prefixes. 2340d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (!isDarwinSyntax()) 2350d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner RegName = stripRegisterPrefix(RegName); 2360d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2370d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << RegName; 2380d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return; 2390d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 2400d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2410d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (Op.isImm()) { 2420d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << Op.getImm(); 2430d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return; 2440d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 2450d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2460d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner assert(Op.isExpr() && "unknown operand kind in printOperand"); 2470d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << *Op.getExpr(); 2480d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner} 2490d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 25058d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattnervoid PPCInstPrinter::printSymbolLo(const MCInst *MI, unsigned OpNo, 25158d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner raw_ostream &O) { 25258d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner if (MI->getOperand(OpNo).isImm()) 25358d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner printS16ImmOperand(MI, OpNo, O); 25458d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner else 25558d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner printOperand(MI, OpNo, O); 25658d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner} 25758d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner 25858d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattnervoid PPCInstPrinter::printSymbolHi(const MCInst *MI, unsigned OpNo, 25958d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner raw_ostream &O) { 26058d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner if (MI->getOperand(OpNo).isImm()) 26158d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner printS16ImmOperand(MI, OpNo, O); 26258d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner else 26358d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner printOperand(MI, OpNo, O); 26458d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner} 265