mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
add register list and hacked up addrmode #4 support, we now get this:
_main: stmsp! sp!, {r7, lr} mov r7, sp sub sp, sp, #4 mov r0, #0 str r0, [sp] ldr r0, LCPI1_0 bl _printf ldr r0, [sp] mov sp, r7 ldmsp! sp!, {r7, pc} Note the unhappy ldm/stm because of modifiers being ignored. llvm-svn: 84546
This commit is contained in:
parent
8124977463
commit
d7d7fee3fe
@ -19,6 +19,7 @@
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "ARMGenInstrNames.inc"
|
||||
#include "ARMGenRegisterNames.inc"
|
||||
using namespace llvm;
|
||||
|
||||
// Include the auto-generated portion of the assembly writer.
|
||||
@ -111,3 +112,48 @@ void ARMInstPrinter::printAddrMode2Operand(const MCInst *MI, unsigned Op) {
|
||||
<< " #" << ShImm;
|
||||
O << "]";
|
||||
}
|
||||
|
||||
|
||||
void ARMInstPrinter::printAddrMode4Operand(const MCInst *MI, unsigned OpNum,
|
||||
const char *Modifier) {
|
||||
// FIXME: ENABLE assert.
|
||||
//assert((Modifier == 0 || Modifier[0] == 0) && "Cannot print modifiers");
|
||||
|
||||
const MCOperand &MO1 = MI->getOperand(OpNum);
|
||||
const MCOperand &MO2 = MI->getOperand(OpNum+1);
|
||||
ARM_AM::AMSubMode Mode = ARM_AM::getAM4SubMode(MO2.getImm());
|
||||
if (0 && Modifier && strcmp(Modifier, "submode") == 0) {
|
||||
if (MO1.getReg() == ARM::SP) {
|
||||
// FIXME
|
||||
bool isLDM = (MI->getOpcode() == ARM::LDM ||
|
||||
MI->getOpcode() == ARM::LDM_RET ||
|
||||
MI->getOpcode() == ARM::t2LDM ||
|
||||
MI->getOpcode() == ARM::t2LDM_RET);
|
||||
O << ARM_AM::getAMSubModeAltStr(Mode, isLDM);
|
||||
} else
|
||||
O << ARM_AM::getAMSubModeStr(Mode);
|
||||
} else if (0 && Modifier && strcmp(Modifier, "wide") == 0) {
|
||||
ARM_AM::AMSubMode Mode = ARM_AM::getAM4SubMode(MO2.getImm());
|
||||
if (Mode == ARM_AM::ia)
|
||||
O << ".w";
|
||||
} else {
|
||||
printOperand(MI, OpNum);
|
||||
if (ARM_AM::getAM4WBFlag(MO2.getImm()))
|
||||
O << "!";
|
||||
}
|
||||
}
|
||||
|
||||
void ARMInstPrinter::printRegisterList(const MCInst *MI, unsigned OpNum) {
|
||||
O << "{";
|
||||
// Always skip the first operand, it's the optional (and implicit writeback).
|
||||
for (unsigned i = OpNum+1, e = MI->getNumOperands(); i != e; ++i) {
|
||||
#if 0 // FIXME: HANDLE WHEN LOWERING??
|
||||
if (MI->getOperand(i).isImplicit())
|
||||
continue;
|
||||
#endif
|
||||
if (i != OpNum+1) O << ", ";
|
||||
|
||||
O << getRegisterName(MI->getOperand(i).getReg());
|
||||
}
|
||||
O << "}";
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ public:
|
||||
void printAddrMode3Operand(const MCInst *MI, unsigned OpNum) {}
|
||||
void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum) {}
|
||||
void printAddrMode4Operand(const MCInst *MI, unsigned OpNum,
|
||||
const char *Modifier = 0) {}
|
||||
const char *Modifier = 0);
|
||||
void printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
|
||||
const char *Modifier = 0) {}
|
||||
void printAddrMode6Operand(const MCInst *MI, unsigned OpNum) {}
|
||||
@ -72,7 +72,7 @@ public:
|
||||
void printPredicateOperand(const MCInst *MI, unsigned OpNum) {}
|
||||
void printSBitModifierOperand(const MCInst *MI, unsigned OpNum) {}
|
||||
void printPCLabel(const MCInst *MI, unsigned OpNum) {}
|
||||
void printRegisterList(const MCInst *MI, unsigned OpNum) {}
|
||||
void printRegisterList(const MCInst *MI, unsigned OpNum);
|
||||
void printCPInstOperand(const MCInst *MI, unsigned OpNum,
|
||||
const char *Modifier) {}
|
||||
void printJTBlockOperand(const MCInst *MI, unsigned OpNum) {}
|
||||
|
Loading…
Reference in New Issue
Block a user