PPCInstPrinter.cpp revision a17a7e1868076a4430cfa16694bcb42884130928
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" 16aa6047d23d8ed55abd8545f5cbe82cd13cbd756aHal Finkel#include "MCTargetDesc/PPCMCTargetDesc.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 91b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner if (StringRef(Modifier) == "cc") { 92b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner switch ((PPC::Predicate)Code) { 932e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LT_MINUS: 942e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LT_PLUS: 952e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LT: 962e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand O << "lt"; 972e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 982e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LE_MINUS: 992e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LE_PLUS: 1002e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LE: 1012e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand O << "le"; 1022e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 1032e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_EQ_MINUS: 1042e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_EQ_PLUS: 1052e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_EQ: 1062e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand O << "eq"; 1072e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 1082e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GE_MINUS: 1092e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GE_PLUS: 1102e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GE: 1112e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand O << "ge"; 1122e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 1132e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GT_MINUS: 1142e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GT_PLUS: 1152e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GT: 1162e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand O << "gt"; 1172e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 1182e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NE_MINUS: 1192e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NE_PLUS: 1202e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NE: 1212e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand O << "ne"; 1222e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 1232e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_UN_MINUS: 1242e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_UN_PLUS: 1252e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_UN: 1262e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand O << "un"; 1272e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 1282e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NU_MINUS: 1292e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NU_PLUS: 1302e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NU: 1312e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand O << "nu"; 1322e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 1332e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand } 134cf1a3b16c00cef30207e6b83d046ad38752dfefbBenjamin Kramer llvm_unreachable("Invalid predicate code"); 1352e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand } 1362e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand 1372e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand if (StringRef(Modifier) == "pm") { 1382e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand switch ((PPC::Predicate)Code) { 1392e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LT: 1402e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LE: 1412e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_EQ: 1422e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GE: 1432e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GT: 1442e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NE: 1452e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_UN: 1462e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NU: 1472e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 1482e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LT_MINUS: 1492e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LE_MINUS: 1502e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_EQ_MINUS: 1512e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GE_MINUS: 1522e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GT_MINUS: 1532e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NE_MINUS: 1542e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_UN_MINUS: 1552e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NU_MINUS: 1562e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand O << "-"; 1572e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 1582e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LT_PLUS: 1592e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_LE_PLUS: 1602e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_EQ_PLUS: 1612e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GE_PLUS: 1622e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_GT_PLUS: 1632e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NE_PLUS: 1642e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_UN_PLUS: 1652e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand case PPC::PRED_NU_PLUS: 1662e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand O << "+"; 1672e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand return; 168b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner } 169cf1a3b16c00cef30207e6b83d046ad38752dfefbBenjamin Kramer llvm_unreachable("Invalid predicate code"); 170b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner } 171b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner 172b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner assert(StringRef(Modifier) == "reg" && 1732e8bd8950345b0857130dd0f4068222a79c103f2Ulrich Weigand "Need to specify 'cc', 'pm' or 'reg' as predicate op modifier!"); 174b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner printOperand(MI, OpNo+1, O); 175b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner} 176b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner 17799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS5ImmOperand(const MCInst *MI, unsigned OpNo, 17899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 1791c7d69bbe2de22f386ffd9ef4480f8a77be28130Adhemerval Zanella int Value = MI->getOperand(OpNo).getImm(); 1801144af3c9b4da48cd581156e05b24261c8de366aRichard Smith Value = SignExtend32<5>(Value); 18199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (int)Value; 18299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 18399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 18499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU5ImmOperand(const MCInst *MI, unsigned OpNo, 18599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 1861c7d69bbe2de22f386ffd9ef4480f8a77be28130Adhemerval Zanella unsigned int Value = MI->getOperand(OpNo).getImm(); 18799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner assert(Value <= 31 && "Invalid u5imm argument!"); 18899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned int)Value; 18999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 19099889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 19199889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU6ImmOperand(const MCInst *MI, unsigned OpNo, 19299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 1931c7d69bbe2de22f386ffd9ef4480f8a77be28130Adhemerval Zanella unsigned int Value = MI->getOperand(OpNo).getImm(); 19499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner assert(Value <= 63 && "Invalid u6imm argument!"); 19599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner O << (unsigned int)Value; 19699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 19799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 19899889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printS16ImmOperand(const MCInst *MI, unsigned OpNo, 19999889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 200edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand if (MI->getOperand(OpNo).isImm()) 201edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand O << (short)MI->getOperand(OpNo).getImm(); 202edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand else 203edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand printOperand(MI, OpNo, O); 20499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 20599889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 20699889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattnervoid PPCInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo, 20799889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner raw_ostream &O) { 2080b8594268feb1c804370541c7853e658caee0ae5Ulrich Weigand if (MI->getOperand(OpNo).isImm()) 2090b8594268feb1c804370541c7853e658caee0ae5Ulrich Weigand O << (unsigned short)MI->getOperand(OpNo).getImm(); 2100b8594268feb1c804370541c7853e658caee0ae5Ulrich Weigand else 2110b8594268feb1c804370541c7853e658caee0ae5Ulrich Weigand printOperand(MI, OpNo, O); 21299889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner} 21399889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 2141520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattnervoid PPCInstPrinter::printBranchOperand(const MCInst *MI, unsigned OpNo, 2151520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner raw_ostream &O) { 2161520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner if (!MI->getOperand(OpNo).isImm()) 2171520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner return printOperand(MI, OpNo, O); 2181520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 2191520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner // Branches can take an immediate operand. This is used by the branch 220fcdfd5a7ffa2557753038fcbf421dd518e3fda98Ulrich Weigand // selection pass to print .+8, an eight byte displacement from the PC. 221fcdfd5a7ffa2557753038fcbf421dd518e3fda98Ulrich Weigand O << ".+"; 2229679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand printAbsBranchOperand(MI, OpNo, O); 2231520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner} 2241520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 2259679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigandvoid PPCInstPrinter::printAbsBranchOperand(const MCInst *MI, unsigned OpNo, 2269679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand raw_ostream &O) { 2279679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand if (!MI->getOperand(OpNo).isImm()) 2289679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand return printOperand(MI, OpNo, O); 2299679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand 230b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner O << (int)MI->getOperand(OpNo).getImm()*4; 231b2e477f5463795de8265939300fb5c0abfdded77Chris Lattner} 2321520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 2331520fd60950c1c347457b225dbbd72224d4fcd19Chris Lattner 234fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printcrbitm(const MCInst *MI, unsigned OpNo, 235fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 236fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner unsigned CCReg = MI->getOperand(OpNo).getReg(); 237fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner unsigned RegNo; 238fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner switch (CCReg) { 239bc2198133a1836598b54b943420748e75d5dea94Craig Topper default: llvm_unreachable("Unknown CR register"); 240fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR0: RegNo = 0; break; 241fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR1: RegNo = 1; break; 242fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR2: RegNo = 2; break; 243fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR3: RegNo = 3; break; 244fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR4: RegNo = 4; break; 245fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR5: RegNo = 5; break; 246fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR6: RegNo = 6; break; 247fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner case PPC::CR7: RegNo = 7; break; 248fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner } 249fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << (0x80 >> RegNo); 250fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 251fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 252fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegImm(const MCInst *MI, unsigned OpNo, 253fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 254edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand printS16ImmOperand(MI, OpNo, O); 255fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << '('; 2560fe7184ba156c87deee090001ba1d7af05e84fc1Chris Lattner if (MI->getOperand(OpNo+1).getReg() == PPC::R0) 257fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 258fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 259fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 260fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ')'; 261fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 262fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 263fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattnervoid PPCInstPrinter::printMemRegReg(const MCInst *MI, unsigned OpNo, 264fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner raw_ostream &O) { 265fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // When used as the base register, r0 reads constant zero rather than 266fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // the value contained in the register. For this reason, the darwin 267fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner // assembler requires that we print r0 as 0 (no r) when used as the base. 268fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner if (MI->getOperand(OpNo).getReg() == PPC::R0) 269fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << "0"; 270fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner else 271fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo, O); 272fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner O << ", "; 273fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner printOperand(MI, OpNo+1, O); 274fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner} 275fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 276a17a7e1868076a4430cfa16694bcb42884130928Ulrich Weigandvoid PPCInstPrinter::printTLSCall(const MCInst *MI, unsigned OpNo, 277a17a7e1868076a4430cfa16694bcb42884130928Ulrich Weigand raw_ostream &O) { 278a17a7e1868076a4430cfa16694bcb42884130928Ulrich Weigand printBranchOperand(MI, OpNo, O); 279a17a7e1868076a4430cfa16694bcb42884130928Ulrich Weigand O << '('; 280a17a7e1868076a4430cfa16694bcb42884130928Ulrich Weigand printOperand(MI, OpNo+1, O); 281a17a7e1868076a4430cfa16694bcb42884130928Ulrich Weigand O << ')'; 282a17a7e1868076a4430cfa16694bcb42884130928Ulrich Weigand} 283fdb2ded765316ee2ee2f796b0e2befa2c23acd1dChris Lattner 28499889132f3d6b3f5eab80934b3a0f1687904e5a2Chris Lattner 2850d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner/// stripRegisterPrefix - This method strips the character prefix from a 2860d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner/// register name so that only the number is left. Used by for linux asm. 287c62feda741f9d5811b625967c40f1847fb2040e7Benjamin Kramerstatic const char *stripRegisterPrefix(const char *RegName) { 2880d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner switch (RegName[0]) { 2890d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'r': 2900d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'f': 2910d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'v': return RegName + 1; 2920d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner case 'c': if (RegName[1] == 'r') return RegName + 2; 2930d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 2940d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2950d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return RegName; 2960d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner} 2970d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 2980d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattnervoid PPCInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, 2990d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner raw_ostream &O) { 3000d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner const MCOperand &Op = MI->getOperand(OpNo); 3010d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (Op.isReg()) { 3020d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner const char *RegName = getRegisterName(Op.getReg()); 3030d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner // The linux and AIX assembler does not take register prefixes. 3040d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (!isDarwinSyntax()) 3050d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner RegName = stripRegisterPrefix(RegName); 3060d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 3070d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << RegName; 3080d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return; 3090d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 3100d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 3110d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner if (Op.isImm()) { 3120d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << Op.getImm(); 3130d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner return; 3140d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner } 3150d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner 3160d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner assert(Op.isExpr() && "unknown operand kind in printOperand"); 3170d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner O << *Op.getExpr(); 3180d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51Chris Lattner} 319959fb3dd5cfaf2aae44321b58ff87dce4632438dChris Lattner 320