summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp')
-rw-r--r--llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
index 767cf2bacb6..d4f30fc1aee 100644
--- a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -754,6 +754,7 @@ public:
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 @@ bool ARMDAGToDAGISel::SelectAddrMode1(SDOperand N,
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 @@ bool ARMDAGToDAGISel::SelectAddrMode1(SDOperand N,
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
OpenPOWER on IntegriCloud