diff options
author | Bob Wilson <bob.wilson@apple.com> | 2009-08-12 22:31:50 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@apple.com> | 2009-08-12 22:31:50 +0000 |
commit | d8e1757eacbcbae6657558f40fdada4279a9d1ed (patch) | |
tree | 61eeca466903d17dd94e1a7a9423aae70c7ee7a0 /lib/Target/ARM/ARMISelLowering.cpp | |
parent | 36e3e668be0c4914660575d7cea800b0d51a4116 (diff) |
Recognize Neon VREV shuffles during legalization instead of selection.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78850 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMISelLowering.cpp')
-rw-r--r-- | lib/Target/ARM/ARMISelLowering.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index 0d2d7d2ad4..f348fe2021 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -484,6 +484,9 @@ const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const { case ARMISD::VST2D: return "ARMISD::VST2D"; case ARMISD::VST3D: return "ARMISD::VST3D"; case ARMISD::VST4D: return "ARMISD::VST4D"; + case ARMISD::VREV64: return "ARMISD::VREV64"; + case ARMISD::VREV32: return "ARMISD::VREV32"; + case ARMISD::VREV16: return "ARMISD::VREV16"; } } @@ -2336,7 +2339,7 @@ SDValue ARM::getVMOVImm(SDNode *N, unsigned ByteSize, SelectionDAG &DAG) { /// isVREVMask - Check if a vector shuffle corresponds to a VREV /// instruction with the specified blocksize. (The order of the elements /// within each block of the vector is reversed.) -bool ARM::isVREVMask(ShuffleVectorSDNode *N, unsigned BlockSize) { +static bool isVREVMask(ShuffleVectorSDNode *N, unsigned BlockSize) { assert((BlockSize==16 || BlockSize==32 || BlockSize==64) && "Only possible block sizes for VREV are: 16, 32, 64"); @@ -2432,6 +2435,18 @@ static SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) { } static SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) { + ShuffleVectorSDNode *SVN = dyn_cast<ShuffleVectorSDNode>(Op.getNode()); + assert(SVN != 0 && "Expected a ShuffleVectorSDNode in LowerVECTOR_SHUFFLE"); + DebugLoc dl = Op.getDebugLoc(); + EVT VT = Op.getValueType(); + + if (isVREVMask(SVN, 64)) + return DAG.getNode(ARMISD::VREV64, dl, VT, SVN->getOperand(0)); + if (isVREVMask(SVN, 32)) + return DAG.getNode(ARMISD::VREV32, dl, VT, SVN->getOperand(0)); + if (isVREVMask(SVN, 16)) + return DAG.getNode(ARMISD::VREV16, dl, VT, SVN->getOperand(0)); + return Op; } |