select code like

ldr rx, [ry, #offset]


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29664 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2006-08-14 19:01:24 +00:00
parent ca7592a1ba
commit 61369da0e5
2 changed files with 57 additions and 1 deletions

View File

@ -258,7 +258,8 @@ static SDOperand LowerConstantPool(SDOperand Op, SelectionDAG &DAG) {
static SDOperand LowerGlobalAddress(SDOperand Op,
SelectionDAG &DAG) {
GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
SDOperand CPAddr = DAG.getConstantPool(GV, MVT::i32, 2);
int alignment = 2;
SDOperand CPAddr = DAG.getConstantPool(GV, MVT::i32, alignment);
return DAG.getLoad(MVT::i32, DAG.getEntryNode(), CPAddr,
DAG.getSrcValue(NULL));
}
@ -336,9 +337,41 @@ void ARMDAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) {
ScheduleAndEmitDAG(DAG);
}
static bool isInt12Immediate(SDNode *N, short &Imm) {
if (N->getOpcode() != ISD::Constant)
return false;
int32_t t = cast<ConstantSDNode>(N)->getValue();
int max = 2<<12 - 1;
int min = -max;
if (t > min && t < max) {
Imm = t;
return true;
}
else
return false;
}
static bool isInt12Immediate(SDOperand Op, short &Imm) {
return isInt12Immediate(Op.Val, Imm);
}
//register plus/minus 12 bit offset
bool ARMDAGToDAGISel::SelectAddrRegImm(SDOperand N, SDOperand &Offset,
SDOperand &Base) {
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());

23
test/CodeGen/ARM/ldr.ll Normal file
View File

@ -0,0 +1,23 @@
; RUN: llvm-as < %s | llc -march=arm &&
; RUN: llvm-as < %s | llc -march=arm | grep "ldr r0.*#0" | wc -l | grep 2 &&
; RUN: llvm-as < %s | llc -march=arm | grep "ldr r0.*#4092" | wc -l | grep 1
int %f1(int* %v) {
entry:
%tmp = load int* %v ; <int> [#uses=1]
ret int %tmp
}
int %f2(int* %v) {
entry:
%tmp2 = getelementptr int* %v, int 1023 ; <int*> [#uses=1]
%tmp = load int* %tmp2 ; <int> [#uses=1]
ret int %tmp
}
int %f3(int* %v) {
entry:
%tmp2 = getelementptr int* %v, int 1024 ; <int*> [#uses=1]
%tmp = load int* %tmp2 ; <int> [#uses=1]
ret int %tmp
}