aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/ARM/ARMISelDAGToDAG.cpp
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2009-06-08 22:53:56 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2009-06-08 22:53:56 +0000
commit0eebf653a7b2978e7761f8d068b6fbec22aea0f6 (patch)
treedf0088f83e5e2ae021b18f475d954fd39c6b2cab /lib/Target/ARM/ARMISelDAGToDAG.cpp
parentccbfb8d3d8aaa201e7adebc8a0088cf7b2698d42 (diff)
downloadexternal_llvm-0eebf653a7b2978e7761f8d068b6fbec22aea0f6.zip
external_llvm-0eebf653a7b2978e7761f8d068b6fbec22aea0f6.tar.gz
external_llvm-0eebf653a7b2978e7761f8d068b6fbec22aea0f6.tar.bz2
The attached patches implement most of the ARM AAPCS-VFP hard float
ABI. The missing piece is support for putting "homogeneous aggregates" into registers. Patch by Sandeep Patel! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73095 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMISelDAGToDAG.cpp')
-rw-r--r--lib/Target/ARM/ARMISelDAGToDAG.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp
index ca3a9cb..a413ee6 100644
--- a/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -549,6 +549,10 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) {
switch (N->getOpcode()) {
default: break;
case ISD::Constant: {
+ // ARMv6T2 and later should materialize imms via MOV / MOVT pair.
+ if (Subtarget->hasV6T2Ops())
+ break;
+
unsigned Val = cast<ConstantSDNode>(N)->getZExtValue();
bool UseCP = true;
if (Subtarget->isThumb())
@@ -559,6 +563,7 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) {
UseCP = (ARM_AM::getSOImmVal(Val) == -1 && // MOV
ARM_AM::getSOImmVal(~Val) == -1 && // MVN
!ARM_AM::isSOImmTwoPartVal(Val)); // two instrs.
+
if (UseCP) {
SDValue CPIdx =
CurDAG->getTargetConstantPool(ConstantInt::get(Type::Int32Ty, Val),
@@ -570,7 +575,7 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) {
CPIdx, CurDAG->getEntryNode());
else {
SDValue Ops[] = {
- CPIdx,
+ CPIdx,
CurDAG->getRegister(0, MVT::i32),
CurDAG->getTargetConstant(0, MVT::i32),
getAL(CurDAG),
@@ -583,7 +588,7 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) {
ReplaceUses(Op, SDValue(ResNode, 0));
return NULL;
}
-
+
// Other cases are autogenerated.
break;
}