Changes in directory llvm/lib/Target/ARM:
ARMConstantIslandPass.cpp updated: 1.1 -> 1.2 ARMISelDAGToDAG.cpp updated: 1.102 -> 1.103 ARMInstrThumb.td updated: 1.2 -> 1.3 --- Log message: Use PC relative ldr to load from a constantpool in Thumb mode. --- Diffs of the changes: (+25 -9) ARMConstantIslandPass.cpp | 3 +++ ARMISelDAGToDAG.cpp | 25 +++++++++++++++++-------- ARMInstrThumb.td | 6 +++++- 3 files changed, 25 insertions(+), 9 deletions(-) Index: llvm/lib/Target/ARM/ARMConstantIslandPass.cpp diff -u llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.1 llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.2 --- llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.1 Fri Jan 19 01:51:42 2007 +++ llvm/lib/Target/ARM/ARMConstantIslandPass.cpp Wed Jan 24 02:53:17 2007 @@ -245,6 +245,9 @@ case ARMII::AddrModeT4: MaxOffs = 1 << (5+2); break; + case ARMII::AddrModeTs: + MaxOffs = 1 << (8+2); + break; } // Remember that this is a user of a CP entry. Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.102 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.103 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.102 Tue Jan 23 20:45:25 2007 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Wed Jan 24 02:53:17 2007 @@ -380,6 +380,9 @@ SDOperand TmpBase, TmpOffImm; if (SelectThumbAddrModeSP(Op, N, TmpBase, TmpOffImm)) return false; // We want to select tLDRspi / tSTRspi instead. + if (N.getOpcode() == ARMISD::Wrapper && + N.getOperand(0).getOpcode() == ISD::TargetConstantPool) + return false; // We want to select tLDRpci instead. } if (N.getOpcode() != ISD::ADD) { @@ -505,14 +508,20 @@ SDOperand CPIdx = CurDAG->getTargetConstantPool(ConstantInt::get(Type::Int32Ty, Val), TLI.getPointerTy()); - SDOperand Ops[] = { - CPIdx, - CurDAG->getRegister(0, MVT::i32), - CurDAG->getTargetConstant(0, MVT::i32), - CurDAG->getEntryNode() - }; - SDNode *ResNode = - CurDAG->getTargetNode(ARM::LDR, MVT::i32, MVT::Other, Ops, 4); + + SDNode *ResNode; + if (Subtarget->isThumb()) + ResNode = CurDAG->getTargetNode(ARM::tLDRpci, MVT::i32, MVT::Other, + CPIdx, CurDAG->getEntryNode()); + else { + SDOperand Ops[] = { + CPIdx, + CurDAG->getRegister(0, MVT::i32), + CurDAG->getTargetConstant(0, MVT::i32), + CurDAG->getEntryNode() + }; + ResNode = CurDAG->getTargetNode(ARM::LDR, MVT::i32, MVT::Other, Ops, 4); + } ReplaceUses(Op, SDOperand(ResNode, 0)); return NULL; } Index: llvm/lib/Target/ARM/ARMInstrThumb.td diff -u llvm/lib/Target/ARM/ARMInstrThumb.td:1.2 llvm/lib/Target/ARM/ARMInstrThumb.td:1.3 --- llvm/lib/Target/ARM/ARMInstrThumb.td:1.2 Tue Jan 23 16:59:13 2007 +++ llvm/lib/Target/ARM/ARMInstrThumb.td Wed Jan 24 02:53:17 2007 @@ -220,10 +220,14 @@ "ldrsh $dst, $addr", [(set GPR:$dst, (sextloadi16 t_addrmode_rr:$addr))]>; -// def tLDRpci def tLDRspi : TIs<(ops GPR:$dst, t_addrmode_sp:$addr), "ldr $dst, $addr", [(set GPR:$dst, (load t_addrmode_sp:$addr))]>; + +// Load tconstpool +def tLDRpci : TIs<(ops GPR:$dst, i32imm:$addr), + "ldr $dst, $addr", + [(set GPR:$dst, (load (ARMWrapper tconstpool:$addr)))]>; } // isLoad let isStore = 1 in { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits