initial implementation of addressing mode 2
TODO: fix lea_addri
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31552 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp
index 767cf2b..d4f30fc 100644
--- a/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -754,6 +754,7 @@
bool SelectAddrRegImm(SDOperand N, SDOperand &Offset, SDOperand &Base);
bool SelectAddrMode1(SDOperand N, SDOperand &Arg, SDOperand &Shift,
SDOperand &ShiftType);
+ bool SelectAddrMode2(SDOperand N, SDOperand &Arg, SDOperand &Offset);
bool SelectAddrMode5(SDOperand N, SDOperand &Arg, SDOperand &Offset);
// Include the pieces autogenerated from the target description.
@@ -820,7 +821,7 @@
int alignment = 2;
SDOperand Addr = CurDAG->getTargetConstantPool(C, MVT::i32, alignment);
SDOperand Z = CurDAG->getTargetConstant(0, MVT::i32);
- SDNode *n = CurDAG->getTargetNode(ARM::ldr, MVT::i32, Z, Addr);
+ SDNode *n = CurDAG->getTargetNode(ARM::LDR, MVT::i32, Addr, Z);
Arg = SDOperand(n, 0);
} else
Arg = CurDAG->getTargetConstant(val, MVT::i32);
@@ -852,6 +853,35 @@
return true;
}
+bool ARMDAGToDAGISel::SelectAddrMode2(SDOperand N, SDOperand &Arg,
+ SDOperand &Offset) {
+ //TODO: complete and cleanup!
+ SDOperand Zero = CurDAG->getTargetConstant(0, MVT::i32);
+ if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(N)) {
+ Arg = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32);
+ Offset = Zero;
+ 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))) {
+ Arg = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType());
+ } else {
+ Arg = N.getOperand(0);
+ }
+ return true; // [r+i]
+ }
+ }
+ Offset = Zero;
+ if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N))
+ Arg = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType());
+ else
+ Arg = N;
+ return true;
+}
+
bool ARMDAGToDAGISel::SelectAddrMode5(SDOperand N, SDOperand &Arg,
SDOperand &Offset) {
//TODO: detect offset