diff options
Diffstat (limited to 'llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp index 8181e9c17f3..7597a316adc 100644 --- a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp +++ b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -445,7 +445,8 @@ public: SDNode *Select(SDOperand Op); virtual void InstructionSelectBasicBlock(SelectionDAG &DAG); bool SelectAddrRegImm(SDOperand N, SDOperand &Offset, SDOperand &Base); - bool SelectAddrMode1(SDOperand N, SDOperand &Arg); + bool SelectAddrMode1(SDOperand N, SDOperand &Arg, SDOperand &Shift, + SDOperand &ShiftType); // Include the pieces autogenerated from the target description. #include "ARMGenDAGISel.inc" @@ -480,17 +481,38 @@ static bool isInt12Immediate(SDOperand Op, short &Imm) { } bool ARMDAGToDAGISel::SelectAddrMode1(SDOperand N, - SDOperand &Arg) { + SDOperand &Arg, + SDOperand &Shift, + SDOperand &ShiftType) { switch(N.getOpcode()) { case ISD::Constant: { //TODO:check that we have a valid constant int32_t t = cast<ConstantSDNode>(N)->getValue(); - Arg = CurDAG->getTargetConstant(t, MVT::i32); + Arg = CurDAG->getTargetConstant(t, MVT::i32); + Shift = CurDAG->getTargetConstant(0, MVT::i32); + ShiftType = CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32); return true; } + case ISD::SRA: + Arg = N.getOperand(0); + Shift = N.getOperand(1); + ShiftType = CurDAG->getTargetConstant(ARMShift::ASR, MVT::i32); + return true; + case ISD::SRL: + Arg = N.getOperand(0); + Shift = N.getOperand(1); + ShiftType = CurDAG->getTargetConstant(ARMShift::LSR, MVT::i32); + return true; + case ISD::SHL: + Arg = N.getOperand(0); + Shift = N.getOperand(1); + ShiftType = CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32); + return true; } - Arg = N; + Arg = N; + Shift = CurDAG->getTargetConstant(0, MVT::i32); + ShiftType = CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32); return true; } |