diff options
| author | Bob Wilson <bob.wilson@apple.com> | 2009-07-30 00:31:25 +0000 |
|---|---|---|
| committer | Bob Wilson <bob.wilson@apple.com> | 2009-07-30 00:31:25 +0000 |
| commit | 0dbdec80420107ecf0cdec86bf68ef80f803937b (patch) | |
| tree | c2919bfe913528cd468c567ccc079721021ce017 /llvm/lib/Target/ARM | |
| parent | 3dc7eb94403c9de3c5ec2cc0ffd9c4b7f57ba5fb (diff) | |
| download | bcm5719-llvm-0dbdec80420107ecf0cdec86bf68ef80f803937b.tar.gz bcm5719-llvm-0dbdec80420107ecf0cdec86bf68ef80f803937b.zip | |
Lower a 128-bit BUILD_VECTOR with 2 elements to a pair of INSERT_VECTOR_ELTs.
llvm-svn: 77557
Diffstat (limited to 'llvm/lib/Target/ARM')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 36de793c53b..41ad069252b 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -2260,6 +2260,7 @@ static SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) { BuildVectorSDNode *BVN = dyn_cast<BuildVectorSDNode>(Op.getNode()); assert(BVN != 0 && "Expected a BuildVectorSDNode in LowerBUILD_VECTOR"); DebugLoc dl = Op.getDebugLoc(); + MVT VT = Op.getValueType(); APInt SplatBits, SplatUndef; unsigned SplatBitSize; @@ -2268,7 +2269,24 @@ static SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) { SDValue Val = isVMOVSplat(SplatBits.getZExtValue(), SplatUndef.getZExtValue(), SplatBitSize, DAG); if (Val.getNode()) - return BuildSplat(Val, Op.getValueType(), DAG, dl); + return BuildSplat(Val, VT, DAG, dl); + } + + // If there are only 2 elements in a 128-bit vector, insert them into an + // undef vector. This handles the common case for 128-bit vector argument + // passing, where the insertions should be translated to subreg accesses + // with no real instructions. + if (VT.is128BitVector() && Op.getNumOperands() == 2) { + SDValue Val = DAG.getUNDEF(VT); + SDValue Op0 = Op.getOperand(0); + SDValue Op1 = Op.getOperand(1); + if (Op0.getOpcode() != ISD::UNDEF) + Val = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, VT, Val, Op0, + DAG.getIntPtrConstant(0)); + if (Op1.getOpcode() != ISD::UNDEF) + Val = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, VT, Val, Op1, + DAG.getIntPtrConstant(1)); + return Val; } return SDValue(); |

