diff --git a/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp b/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp index a9a27110296c..fb642835c12e 100644 --- a/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp +++ b/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp @@ -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 { - printOperand(MI, OpNum, "nohash"); - O << '('; - printOperand(MI, OpNum + 1); - O << ')'; - } + 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"); } diff --git a/llvm/lib/Target/MSP430/MSP430ISelDAGToDAG.cpp b/llvm/lib/Target/MSP430/MSP430ISelDAGToDAG.cpp index e564e63598a5..c057d69aadcb 100644 --- a/llvm/lib/Target/MSP430/MSP430ISelDAGToDAG.cpp +++ b/llvm/lib/Target/MSP430/MSP430ISelDAGToDAG.cpp @@ -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(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; - } + return true; } break; }; - Base = Addr; - Disp = CurDAG->getTargetConstant(0, MVT::i16); + Base = CurDAG->getRegister(0, MVT::i16); + Disp = Addr; return true; }