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