summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2006-11-09 13:58:55 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2006-11-09 13:58:55 +0000
commit5f7ab1b964a465f4f9e19d6c80a186515cdcb2e5 (patch)
treeef4dc501f4d21895de330be1f55a3c10783557da /llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
parent48b21d50243714295645db43a9e15d6947cede73 (diff)
downloadbcm5719-llvm-5f7ab1b964a465f4f9e19d6c80a186515cdcb2e5.tar.gz
bcm5719-llvm-5f7ab1b964a465f4f9e19d6c80a186515cdcb2e5.zip
implement load effective address similar to the alpha backend
remove lea_addri and the now unused memri addressing mode llvm-svn: 31592
Diffstat (limited to 'llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp')
-rw-r--r--llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp45
1 files changed, 11 insertions, 34 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
index d49427dfa76..a7e4703a665 100644
--- a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -751,8 +751,6 @@ public:
SDNode *Select(SDOperand Op);
virtual void InstructionSelectBasicBlock(SelectionDAG &DAG);
- bool SelectAddrRegImm(SDOperand Op, SDOperand N, SDOperand &Offset,
- SDOperand &Base);
bool SelectAddrMode1(SDOperand Op, SDOperand N, SDOperand &Arg,
SDOperand &Shift, SDOperand &ShiftType);
bool SelectAddrMode2(SDOperand Op, SDOperand N, SDOperand &Arg,
@@ -895,37 +893,6 @@ bool ARMDAGToDAGISel::SelectAddrMode5(SDOperand Op,
return true;
}
-//register plus/minus 12 bit offset
-bool ARMDAGToDAGISel::SelectAddrRegImm(SDOperand Op,
- SDOperand N, SDOperand &Offset,
- SDOperand &Base) {
- if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(N)) {
- Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32);
- Offset = CurDAG->getTargetConstant(0, MVT::i32);
- return true;
- }
- if (N.getOpcode() == ISD::ADD) {
- short imm = 0;
- if (isInt12Immediate(N.getOperand(1), imm)) {
- Offset = CurDAG->getTargetConstant(imm, MVT::i32);
- if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N.getOperand(0))) {
- Base = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType());
- } else {
- Base = N.getOperand(0);
- }
- return true; // [r+i]
- }
- }
-
- Offset = CurDAG->getTargetConstant(0, MVT::i32);
- if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N)) {
- Base = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType());
- }
- else
- Base = N;
- return true; //any address fits in a register
-}
-
SDNode *ARMDAGToDAGISel::Select(SDOperand Op) {
SDNode *N = Op.Val;
@@ -933,8 +900,18 @@ SDNode *ARMDAGToDAGISel::Select(SDOperand Op) {
default:
return SelectCode(Op);
break;
+ case ISD::FrameIndex: {
+ int FI = cast<FrameIndexSDNode>(N)->getIndex();
+ SDOperand Ops[] = {CurDAG->getTargetFrameIndex(FI, MVT::i32),
+ CurDAG->getTargetConstant(0, MVT::i32),
+ CurDAG->getTargetConstant(0, MVT::i32),
+ CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32)};
+
+ return CurDAG->SelectNodeTo(N, ARM::ADD, MVT::i32, Ops,
+ sizeof(Ops)/sizeof(SDOperand));
+ break;
+ }
}
- return NULL;
}
} // end anonymous namespace
OpenPOWER on IntegriCloud