diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2009-06-08 22:53:56 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2009-06-08 22:53:56 +0000 |
commit | 0eebf653a7b2978e7761f8d068b6fbec22aea0f6 (patch) | |
tree | df0088f83e5e2ae021b18f475d954fd39c6b2cab /lib/Target/ARM/ARMISelDAGToDAG.cpp | |
parent | ccbfb8d3d8aaa201e7adebc8a0088cf7b2698d42 (diff) | |
download | external_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.cpp | 9 |
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; } |