PPCInstPrinter.cpp revision 1c7d69bbe2de22f386ffd9ef4480f8a77be28130
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" 1694b9550a32d189704a8eae55505edf62662c0534Evan Cheng#include "MCTargetDesc/PPCBaseInfo.h" 1794b9550a32d189704a8eae55505edf62662c0534Evan Cheng#include "MCTargetDesc/PPCPredicates.h" 180d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner#include "llvm/MC/MCExpr.h" 1960d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "llvm/MC/MCInst.h" 207c0b3c1fb6395475e262d66ee403645f0c67dee2Craig Topper#include "llvm/MC/MCInstrInfo.h" 2160d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "llvm/Support/raw_ostream.h" 2260d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattnerusing namespace llvm; 2360d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 2460d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner#include "PPCGenAsmWriter.inc" 2560d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 26cde4ce411b1ace4a80ea1dd38df97e8508aed0c9Rafael Espindolavoid PPCInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const { 27cde4ce411b1ace4a80ea1dd38df97e8508aed0c9Rafael Espindola OS << getRegisterName(RegNo); 286e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola} 2960d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 3098c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Andersonvoid PPCInstPrinter::printInst(const MCInst *MI, raw_ostream &O, 3198c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson StringRef Annot) { 322e35248f14ac449774de9727b460469fc3c93249Chris Lattner // Check for slwi/srwi mnemonics. 332e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (MI->getOpcode() == PPC::RLWINM) { 342e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char SH = MI->getOperand(2).getImm(); 352e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char MB = MI->getOperand(3).getImm(); 362e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char ME = MI->getOperand(4).getImm(); 372e35248f14ac449774de9727b460469fc3c93249Chris Lattner bool useSubstituteMnemonic = false; 382e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (SH <= 31 && MB == 0 && ME == (31-SH)) { 392e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tslwi "; useSubstituteMnemonic = true; 402e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 412e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (SH <= 31 && MB == (32-SH) && ME == 31) { 422e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tsrwi "; useSubstituteMnemonic = true; 432e35248f14ac449774de9727b460469fc3c93249Chris Lattner SH = 32-SH; 442e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 452e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (useSubstituteMnemonic) { 462e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 0, O); 472e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", "; 482e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 1, O); 492e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", " << (unsigned int)SH; 5098c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson 51519020adf1cf57e2e93cc4fd49c385c47f7ff0f7Owen Anderson printAnnotation(O, Annot); 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); 62519020adf1cf57e2e93cc4fd49c385c47f7ff0f7Owen Anderson printAnnotation(O, Annot); 632e35248f14ac449774de9727b460469fc3c93249Chris Lattner return; 642e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 652e35248f14ac449774de9727b460469fc3c93249Chris Lattner 662e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (MI->getOpcode() == PPC::RLDICR) { 672e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char SH = MI->getOperand(2).getImm(); 682e35248f14ac449774de9727b460469fc3c93249Chris Lattner unsigned char ME = MI->getOperand(3).getImm(); 692e35248f14ac449774de9727b460469fc3c93249Chris Lattner // rldicr RA, RS, SH, 63-SH == sldi RA, RS, SH 702e35248f14ac449774de9727b460469fc3c93249Chris Lattner if (63-SH == ME) { 712e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << "\tsldi "; 722e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 0, O); 732e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", "; 742e35248f14ac449774de9727b460469fc3c93249Chris Lattner printOperand(MI, 1, O); 752e35248f14ac449774de9727b460469fc3c93249Chris Lattner O << ", " << (unsigned int)SH; 76519020adf1cf57e2e93cc4fd49c385c47f7ff0f7Owen Anderson printAnnotation(O, Annot); 772e35248f14ac449774de9727b460469fc3c93249Chris Lattner return; 782e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 792e35248f14ac449774de9727b460469fc3c93249Chris Lattner } 802e35248f14ac449774de9727b460469fc3c93249Chris Lattner 8160d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner printInstruction(MI, O); 82519020adf1cf57e2e93cc4fd49c385c47f7ff0f7Owen Anderson printAnnotation(O, Annot); 8360d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner} 8460d5b5fdeec64b69c92db60242d3d90b3f978e69Chris Lattner 85b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner 86b2e477f5463795de8265939300fb5c0abfdded77Chris Lattnervoid PPCInstPrinter::printPredicateOperand(const MCInst *MI, unsigned OpNo, 87b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner raw_ostream &O, 88b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner const char *Modifier) { 89b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner unsigned Code = MI->getOperand(OpNo).getImm(); 90009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel if (!Modifier) { 91009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel unsigned CCReg = MI->getOperand(OpNo+1).getReg(); 92009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel unsigned RegNo; 93009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel switch (CCReg) { 94009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel default: llvm_unreachable("Unknown CR register"); 95009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel case PPC::CR0: RegNo = 0; break; 96009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel case PPC::CR1: RegNo = 1; break; 97009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel case PPC::CR2: RegNo = 2; break; 98009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel case PPC::CR3: RegNo = 3; break; 99009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel case PPC::CR4: RegNo = 4; break; 100009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel case PPC::CR5: RegNo = 5; break; 101009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel case PPC::CR6: RegNo = 6; break; 102009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel case PPC::CR7: RegNo = 7; break; 103009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel } 104009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel 105009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel // Print the CR bit number. The Code is ((BI << 5) | BO) for a 106009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel // BCC, but we must have the positive form here (BO == 12) 107009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel unsigned BI = Code >> 5; 1080a2f793d6e24acd00d9209b46436b4899feb1cdbCraig Topper assert((Code & 0xF) == 12 && 1090a2f793d6e24acd00d9209b46436b4899feb1cdbCraig Topper "BO in predicate bit must have the positive form"); 110009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel 111009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel unsigned Value = 4*RegNo + BI; 112009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel O << Value; 113009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel return; 114009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel } 115009f7afbeb77d1cc8e962bac7057b73b6d39d62fHal Finkel 116b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner if (StringRef(Modifier) == "cc") { 117b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner switch ((PPC::Predicate)Code) { 118b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_ALWAYS: return; // Don't print anything for always. 119b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_LT: O << "lt"; return; 120b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_LE: O << "le"; return; 121b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_EQ: O << "eq"; return; 122b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_GE: O << "ge"; return; 123b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_GT: O << "gt"; return; 124b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_NE: O << "ne"; return; 125b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_UN: O << "un"; return; 126b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner case PPC::PRED_NU: O << "nu"; return; 127b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner } 128b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner } 129b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner 130b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner assert(StringRef(Modifier) == "reg" && 131b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner "Need to specify 'cc' or 'reg' as predicate op modifier!"); 132b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner // Don't print the register for 'always'. 133b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner if (Code == PPC::PRED_ALWAYS) return; 134b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner printOperand(MI, OpNo+1, O); 135b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner} 136b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner 13799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS5ImmOperand(const MCInst *MI, unsigned OpNo, 13899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 1391c7d69bbe2de22f386ffd9ef4480f8a77be28130Adhemerval Zanella int Value = MI->getOperand(OpNo).getImm(); 1401144af3c9b4da48cd581156e05b24261c8de366aRichard Smith Value = SignExtend32<5>(Value); 14199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (int)Value; 14299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 14399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 14499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU5ImmOperand(const MCInst *MI, unsigned OpNo, 14599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 1461c7d69bbe2de22f386ffd9ef4480f8a77be28130Adhemerval Zanella unsigned int Value = MI->getOperand(OpNo).getImm(); 14799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner assert(Value <= 31 && "Invalid u5imm argument!"); 14899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned int)Value; 14999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 15099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 15199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU6ImmOperand(const MCInst *MI, unsigned OpNo, 15299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 1531c7d69bbe2de22f386ffd9ef4480f8a77be28130Adhemerval Zanella unsigned int Value = MI->getOperand(OpNo).getImm(); 15499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner assert(Value <= 63 && "Invalid u6imm argument!"); 15599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned int)Value; 15699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 15799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 15899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS16ImmOperand(const MCInst *MI, unsigned OpNo, 15999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 16099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (short)MI->getOperand(OpNo).getImm(); 16199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 16299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 16399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo, 16499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 16599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned short)MI->getOperand(OpNo).getImm(); 16699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 16799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 16899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS16X4ImmOperand(const MCInst *MI, unsigned OpNo, 16999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 170b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner if (MI->getOperand(OpNo).isImm()) 17199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (short)(MI->getOperand(OpNo).getImm()*4); 17299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner else 173b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner printOperand(MI, OpNo, O); 17499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 17599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 1761520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattnervoid PPCInstPrinter::printBranchOperand(const MCInst *MI, unsigned OpNo, 1771520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner raw_ostream &O) { 1781520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner if (!MI->getOperand(OpNo).isImm()) 1791520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner return printOperand(MI, OpNo, O); 1801520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 1811520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner // Branches can take an immediate operand. This is used by the branch 1821520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner // selection pass to print $+8, an eight byte displacement from the PC. 183b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner O << "$+"; 184b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner printAbsAddrOperand(MI, OpNo, O); 1851520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner} 1861520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 187b2e477f5463795de8265939300fb5c0abfdded77Chris Lattnervoid PPCInstPrinter::printAbsAddrOperand(const MCInst *MI, unsigned OpNo, 188b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner raw_ostream &O) { 189b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner O << (int)MI->getOperand(OpNo).getImm()*4; 190b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner} 1911520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 1921520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 193fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printcrbitm(const MCInst *MI, unsigned OpNo, 194fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 195fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner unsigned CCReg = MI->getOperand(OpNo).getReg(); 196fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner unsigned RegNo; 197fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner switch (CCReg) { 198bc2198133a1836598b54b943420748e75d5dea94Craig Topper default: llvm_unreachable("Unknown CR register"); 199fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR0: RegNo = 0; break; 200fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR1: RegNo = 1; break; 201fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR2: RegNo = 2; break; 202fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR3: RegNo = 3; break; 203fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR4: RegNo = 4; break; 204fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR5: RegNo = 5; break; 205fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR6: RegNo = 6; break; 206fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR7: RegNo = 7; break; 207fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner } 208fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << (0x80 >> RegNo); 209fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 210fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 211fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegImm(const MCInst *MI, unsigned OpNo, 212fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 213fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printSymbolLo(MI, OpNo, O); 214fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << '('; 2150fe7184ba156c87deee090001ba1d7af05e84fc1Chris Lattner if (MI->getOperand(OpNo+1).getReg() == PPC::R0) 216fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 217fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 218fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 219fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ')'; 220fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 221fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 222fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegImmShifted(const MCInst *MI, unsigned OpNo, 223fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 224fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner if (MI->getOperand(OpNo).isImm()) 225fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printS16X4ImmOperand(MI, OpNo, O); 226fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 227fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printSymbolLo(MI, OpNo, O); 228fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << '('; 229fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 2300fe7184ba156c87deee090001ba1d7af05e84fc1Chris Lattner if (MI->getOperand(OpNo+1).getReg() == PPC::R0) 231fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 232fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 233fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 234fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ')'; 235fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 236fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 237fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 238fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegReg(const MCInst *MI, unsigned OpNo, 239fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 240fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // When used as the base register, r0 reads constant zero rather than 241fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // the value contained in the register. For this reason, the darwin 242fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // assembler requires that we print r0 as 0 (no r) when used as the base. 243fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner if (MI->getOperand(OpNo).getReg() == PPC::R0) 244fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 245fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 246fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo, O); 247fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ", "; 248fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 249fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 250fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 251fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 25299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 2530d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner/// stripRegisterPrefix - This method strips the character prefix from a 2540d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner/// register name so that only the number is left. Used by for linux asm. 255c62feda741f9d5811b625967c40f1847fb2040e7Benjamin Kramerstatic const char *stripRegisterPrefix(const char *RegName) { 2560d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner switch (RegName[0]) { 2570d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'r': 2580d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'f': 2590d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'v': return RegName + 1; 2600d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'c': if (RegName[1] == 'r') return RegName + 2; 2610d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 2620d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2630d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return RegName; 2640d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner} 2650d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2660d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattnervoid PPCInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, 2670d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner raw_ostream &O) { 2680d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner const MCOperand &Op = MI->getOperand(OpNo); 2690d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (Op.isReg()) { 2700d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner const char *RegName = getRegisterName(Op.getReg()); 2710d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner // The linux and AIX assembler does not take register prefixes. 2720d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (!isDarwinSyntax()) 2730d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner RegName = stripRegisterPrefix(RegName); 2740d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2750d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << RegName; 2760d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return; 2770d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 2780d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2790d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (Op.isImm()) { 2800d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << Op.getImm(); 2810d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return; 2820d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 2830d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2840d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner assert(Op.isExpr() && "unknown operand kind in printOperand"); 2850d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << *Op.getExpr(); 2860d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner} 2870d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 28858d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattnervoid PPCInstPrinter::printSymbolLo(const MCInst *MI, unsigned OpNo, 28958d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner raw_ostream &O) { 29058d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner if (MI->getOperand(OpNo).isImm()) 2911e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner return printS16ImmOperand(MI, OpNo, O); 2921e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner 2931e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner // FIXME: This is a terrible hack because we can't encode lo16() as an operand 2941e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner // flag of a subtraction. See the FIXME in GetSymbolRef in PPCMCInstLower. 2951e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner if (MI->getOperand(OpNo).isExpr() && 2961e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner isa<MCBinaryExpr>(MI->getOperand(OpNo).getExpr())) { 2971e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner O << "lo16("; 29858d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner printOperand(MI, OpNo, O); 2991e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner O << ')'; 3001e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner } else { 3011e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner printOperand(MI, OpNo, O); 3021e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner } 30358d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner} 30458d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner 30558d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattnervoid PPCInstPrinter::printSymbolHi(const MCInst *MI, unsigned OpNo, 30658d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner raw_ostream &O) { 30758d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner if (MI->getOperand(OpNo).isImm()) 3081e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner return printS16ImmOperand(MI, OpNo, O); 3091e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner 3101e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner // FIXME: This is a terrible hack because we can't encode lo16() as an operand 3111e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner // flag of a subtraction. See the FIXME in GetSymbolRef in PPCMCInstLower. 3121e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner if (MI->getOperand(OpNo).isExpr() && 3131e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner isa<MCBinaryExpr>(MI->getOperand(OpNo).getExpr())) { 3141e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner O << "ha16("; 31558d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner printOperand(MI, OpNo, O); 3161e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner O << ')'; 3171e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner } else { 3181e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner printOperand(MI, OpNo, O); 3191e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner } 32058d014f6031ab95b0057a54dc377e7b0d23d674fChris Lattner} 321959fb3dd5cfaf2aae44321b58ff87dce4632438dChris Lattner 322959fb3dd5cfaf2aae44321b58ff87dce4632438dChris Lattner 323