diff options
author | Chris Lattner <sabre@nondot.org> | 2010-11-14 20:02:39 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-11-14 20:02:39 +0000 |
commit | 0d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51 (patch) | |
tree | d8c5b46f9497a3469b213e0e536f8823334f1651 /lib/Target/PowerPC/InstPrinter | |
parent | 293ef9ae0fd533429dc54d94c895c39a564466f7 (diff) | |
download | external_llvm-0d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51.zip external_llvm-0d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51.tar.gz external_llvm-0d1b7d9e3dd8512b47655af7d8ea738ea1d4ac51.tar.bz2 |
Implement support for printing register and immediate operands,
add support for darwin vs aix syntax. We now can print instructions
like this:
add r3, r3, r4
blr
and (in aix mode):
add 3, 3, 4
blr
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119062 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/InstPrinter')
-rw-r--r-- | lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp | 37 | ||||
-rw-r--r-- | lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h | 11 |
2 files changed, 45 insertions, 3 deletions
diff --git a/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp b/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp index adb93f2..767dc52 100644 --- a/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp +++ b/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp @@ -13,9 +13,9 @@ #define DEBUG_TYPE "asm-printer" #include "PPCInstPrinter.h" +#include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" //#include "llvm/MC/MCAsmInfo.h" -//#include "llvm/MC/MCExpr.h" //#include "llvm/ADT/StringExtras.h" #include "llvm/Support/raw_ostream.h" @@ -39,3 +39,38 @@ void PPCInstPrinter::printInst(const MCInst *MI, raw_ostream &O) { printInstruction(MI, O); } +/// stripRegisterPrefix - This method strips the character prefix from a +/// register name so that only the number is left. Used by for linux asm. +const char *stripRegisterPrefix(const char *RegName) { + switch (RegName[0]) { + case 'r': + case 'f': + case 'v': return RegName + 1; + case 'c': if (RegName[1] == 'r') return RegName + 2; + } + + return RegName; +} + +void PPCInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, + raw_ostream &O) { + const MCOperand &Op = MI->getOperand(OpNo); + if (Op.isReg()) { + const char *RegName = getRegisterName(Op.getReg()); + // The linux and AIX assembler does not take register prefixes. + if (!isDarwinSyntax()) + RegName = stripRegisterPrefix(RegName); + + O << RegName; + return; + } + + if (Op.isImm()) { + O << Op.getImm(); + return; + } + + assert(Op.isExpr() && "unknown operand kind in printOperand"); + O << *Op.getExpr(); +} + diff --git a/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h b/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h index 1c59e5f..8176a1b 100644 --- a/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h +++ b/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h @@ -20,8 +20,15 @@ namespace llvm { class MCOperand; class PPCInstPrinter : public MCInstPrinter { + // 0 -> AIX, 1 -> Darwin. + unsigned SyntaxVariant; public: - PPCInstPrinter(const MCAsmInfo &MAI) : MCInstPrinter(MAI) {} + PPCInstPrinter(const MCAsmInfo &MAI, unsigned syntaxVariant) + : MCInstPrinter(MAI), SyntaxVariant(syntaxVariant) {} + + bool isDarwinSyntax() const { + return SyntaxVariant == 1; + } virtual void printInst(const MCInst *MI, raw_ostream &O); virtual StringRef getOpcodeName(unsigned Opcode) const; @@ -33,7 +40,7 @@ public: static const char *getRegisterName(unsigned RegNo); - void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); void printPredicateOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O, const char *Modifier) {} |