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