mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Correct asmprinting of memory operands
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70732 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0eb6af40e3
commit
1deea5f3a7
@ -162,17 +162,23 @@ void MSP430AsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
|
||||
void MSP430AsmPrinter::printSrcMemOperand(const MachineInstr *MI, int OpNum,
|
||||
const char* Modifier) {
|
||||
const MachineOperand &Disp = MI->getOperand(OpNum);
|
||||
assert(Disp.isImm() && "Displacement can be only immediate!");
|
||||
const MachineOperand &Base = MI->getOperand(OpNum+1);
|
||||
|
||||
// Special case: 0(Reg) -> @Reg
|
||||
if (Disp.getImm() == 0) {
|
||||
O << "@";
|
||||
printOperand(MI, OpNum + 1);
|
||||
} else {
|
||||
if (Disp.isGlobal())
|
||||
printOperand(MI, OpNum, "mem");
|
||||
else if (Disp.isImm() && !Base.getReg())
|
||||
printOperand(MI, OpNum);
|
||||
else if (Base.getReg()) {
|
||||
if (Disp.getImm()) {
|
||||
printOperand(MI, OpNum, "nohash");
|
||||
O << '(';
|
||||
printOperand(MI, OpNum + 1);
|
||||
O << ')';
|
||||
} else {
|
||||
O << '@';
|
||||
printOperand(MI, OpNum + 1);
|
||||
}
|
||||
} else
|
||||
assert(0 && "Unsupported memory operand");
|
||||
}
|
||||
|
||||
|
@ -72,6 +72,7 @@ FunctionPass *llvm::createMSP430ISelDag(MSP430TargetMachine &TM) {
|
||||
return new MSP430DAGToDAGISel(TM);
|
||||
}
|
||||
|
||||
// FIXME: This is pretty dummy routine and needs to be rewritten in the future.
|
||||
bool MSP430DAGToDAGISel::SelectAddr(SDValue Op, SDValue Addr,
|
||||
SDValue &Disp, SDValue &Base) {
|
||||
// We don't support frame index stuff yet.
|
||||
@ -99,20 +100,17 @@ bool MSP430DAGToDAGISel::SelectAddr(SDValue Op, SDValue Addr,
|
||||
case MSP430ISD::Wrapper:
|
||||
SDValue N0 = Addr.getOperand(0);
|
||||
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(N0)) {
|
||||
// We can match addresses of globals without any offsets
|
||||
if (!G->getOffset()) {
|
||||
Base = CurDAG->getTargetGlobalAddress(G->getGlobal(),
|
||||
MVT::i16, 0);
|
||||
Disp = CurDAG->getTargetConstant(0, MVT::i16);
|
||||
Base = CurDAG->getRegister(0, MVT::i16);
|
||||
Disp = CurDAG->getTargetGlobalAddress(G->getGlobal(),
|
||||
MVT::i16, G->getOffset());
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
};
|
||||
|
||||
Base = Addr;
|
||||
Disp = CurDAG->getTargetConstant(0, MVT::i16);
|
||||
Base = CurDAG->getRegister(0, MVT::i16);
|
||||
Disp = Addr;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user