mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-16 23:19:37 +00:00
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
This commit is contained in:
parent
293ef9ae0f
commit
0d1b7d9e3d
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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) {}
|
||||
|
||||
|
@ -939,9 +939,7 @@ static AsmPrinter *createPPCAsmPrinterPass(TargetMachine &tm,
|
||||
static MCInstPrinter *createPPCMCInstPrinter(const Target &T,
|
||||
unsigned SyntaxVariant,
|
||||
const MCAsmInfo &MAI) {
|
||||
if (SyntaxVariant == 0)
|
||||
return new PPCInstPrinter(MAI);
|
||||
return 0;
|
||||
return new PPCInstPrinter(MAI, SyntaxVariant);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user