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