mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-17 15:33:45 +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"
|
#define DEBUG_TYPE "asm-printer"
|
||||||
#include "PPCInstPrinter.h"
|
#include "PPCInstPrinter.h"
|
||||||
|
#include "llvm/MC/MCExpr.h"
|
||||||
#include "llvm/MC/MCInst.h"
|
#include "llvm/MC/MCInst.h"
|
||||||
//#include "llvm/MC/MCAsmInfo.h"
|
//#include "llvm/MC/MCAsmInfo.h"
|
||||||
//#include "llvm/MC/MCExpr.h"
|
|
||||||
//#include "llvm/ADT/StringExtras.h"
|
//#include "llvm/ADT/StringExtras.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
|
|
||||||
@ -39,3 +39,38 @@ void PPCInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
printInstruction(MI, 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 MCOperand;
|
||||||
|
|
||||||
class PPCInstPrinter : public MCInstPrinter {
|
class PPCInstPrinter : public MCInstPrinter {
|
||||||
|
// 0 -> AIX, 1 -> Darwin.
|
||||||
|
unsigned SyntaxVariant;
|
||||||
public:
|
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 void printInst(const MCInst *MI, raw_ostream &O);
|
||||||
virtual StringRef getOpcodeName(unsigned Opcode) const;
|
virtual StringRef getOpcodeName(unsigned Opcode) const;
|
||||||
@ -33,7 +40,7 @@ public:
|
|||||||
static const char *getRegisterName(unsigned RegNo);
|
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,
|
void printPredicateOperand(const MCInst *MI, unsigned OpNo,
|
||||||
raw_ostream &O, const char *Modifier) {}
|
raw_ostream &O, const char *Modifier) {}
|
||||||
|
|
||||||
|
@ -939,9 +939,7 @@ static AsmPrinter *createPPCAsmPrinterPass(TargetMachine &tm,
|
|||||||
static MCInstPrinter *createPPCMCInstPrinter(const Target &T,
|
static MCInstPrinter *createPPCMCInstPrinter(const Target &T,
|
||||||
unsigned SyntaxVariant,
|
unsigned SyntaxVariant,
|
||||||
const MCAsmInfo &MAI) {
|
const MCAsmInfo &MAI) {
|
||||||
if (SyntaxVariant == 0)
|
return new PPCInstPrinter(MAI, SyntaxVariant);
|
||||||
return new PPCInstPrinter(MAI);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user