aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2010-11-13 02:25:14 +0000
committerEvan Cheng <evan.cheng@apple.com>2010-11-13 02:25:14 +0000
commit2bcb8daa44d09221981a3e24e68239ab83e12e9d (patch)
tree31c6a660e7c99653be20491c3bb8b6a42044b361 /llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
parent988ffb7a117b11fd39e77d7974382db5acf9a43b (diff)
downloadllvm-2bcb8daa44d09221981a3e24e68239ab83e12e9d.zip
llvm-2bcb8daa44d09221981a3e24e68239ab83e12e9d.tar.gz
llvm-2bcb8daa44d09221981a3e24e68239ab83e12e9d.tar.bz2
Add conditional move of large immediate.
llvm-svn: 118968
Diffstat (limited to 'llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp')
-rw-r--r--llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp40
1 files changed, 26 insertions, 14 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
index f30fd94..b5ef7b1 100644
--- a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -1782,20 +1782,26 @@ SelectT2CMOVImmOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
if (!T)
return 0;
+ unsigned Opc = 0;
unsigned TrueImm = T->getZExtValue();
bool isSoImm = is_t2_so_imm(TrueImm);
if (isSoImm || TrueImm <= 0xffff) {
- SDValue True = CurDAG->getTargetConstant(TrueImm, MVT::i32);
- SDValue CC = CurDAG->getTargetConstant(CCVal, MVT::i32);
- SDValue Ops[] = { FalseVal, True, CC, CCR, InFlag };
- return CurDAG->SelectNodeTo(N, (isSoImm ? ARM::t2MOVCCi : ARM::t2MOVCCi16),
- MVT::i32, Ops, 5);
+ Opc = isSoImm ? ARM::t2MOVCCi : ARM::t2MOVCCi16;
} else if (is_t2_so_imm_not(TrueImm)) {
- SDValue True = CurDAG->getTargetConstant(~TrueImm, MVT::i32);
+ TrueImm = ~TrueImm;
+ Opc = ARM::t2MVNCCi;
+ } else if (Subtarget->hasV6T2Ops()) {
+ // Large immediate.
+ Opc = ARM::t2MOVCCi32imm;
+ }
+
+ if (Opc) {
+ SDValue True = CurDAG->getTargetConstant(TrueImm, MVT::i32);
SDValue CC = CurDAG->getTargetConstant(CCVal, MVT::i32);
SDValue Ops[] = { FalseVal, True, CC, CCR, InFlag };
- return CurDAG->SelectNodeTo(N, ARM::t2MVNCCi, MVT::i32, Ops, 5);
+ return CurDAG->SelectNodeTo(N, Opc, MVT::i32, Ops, 5);
}
+
return 0;
}
@@ -1806,20 +1812,26 @@ SelectARMCMOVImmOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
if (!T)
return 0;
+ unsigned Opc = 0;
unsigned TrueImm = T->getZExtValue();
bool isSoImm = is_so_imm(TrueImm);
if (isSoImm || (Subtarget->hasV6T2Ops() && TrueImm <= 0xffff)) {
- SDValue True = CurDAG->getTargetConstant(TrueImm, MVT::i32);
- SDValue CC = CurDAG->getTargetConstant(CCVal, MVT::i32);
- SDValue Ops[] = { FalseVal, True, CC, CCR, InFlag };
- return CurDAG->SelectNodeTo(N, (isSoImm ? ARM::MOVCCi : ARM::MOVCCi16),
- MVT::i32, Ops, 5);
+ Opc = isSoImm ? ARM::MOVCCi : ARM::MOVCCi16;
} else if (is_so_imm_not(TrueImm)) {
- SDValue True = CurDAG->getTargetConstant(~TrueImm, MVT::i32);
+ TrueImm = ~TrueImm;
+ Opc = ARM::MVNCCi;
+ } else if (Subtarget->hasV6T2Ops() || ARM_AM::isSOImmTwoPartVal(TrueImm)) {
+ // Large immediate.
+ Opc = ARM::MOVCCi32imm;
+ }
+
+ if (Opc) {
+ SDValue True = CurDAG->getTargetConstant(TrueImm, MVT::i32);
SDValue CC = CurDAG->getTargetConstant(CCVal, MVT::i32);
SDValue Ops[] = { FalseVal, True, CC, CCR, InFlag };
- return CurDAG->SelectNodeTo(N, ARM::MVNCCi, MVT::i32, Ops, 5);
+ return CurDAG->SelectNodeTo(N, Opc, MVT::i32, Ops, 5);
}
+
return 0;
}