diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2008-05-13 08:35:03 +0000 |
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2008-05-13 08:35:03 +0000 |
| commit | 1120279ae6f2a502093a0c20c1b8d5d4dfd44e4c (patch) | |
| tree | b9c9615435314d840be21c498984860c0600af65 /llvm/lib/Target/X86/X86ISelLowering.cpp | |
| parent | 525aa89356515867b52d584991b9e2a0db294c97 (diff) | |
| download | bcm5719-llvm-1120279ae6f2a502093a0c20c1b8d5d4dfd44e4c.tar.gz bcm5719-llvm-1120279ae6f2a502093a0c20c1b8d5d4dfd44e4c.zip | |
Instead of a vector load, shuffle and then extract an element. Load the element from address with an offset.
pshufd $1, (%rdi), %xmm0
movd %xmm0, %eax
=>
movl 4(%rdi), %eax
llvm-svn: 51026
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 22 |
1 files changed, 1 insertions, 21 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 806b626456a..4cc3f270222 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -6182,26 +6182,6 @@ void X86TargetLowering::computeMaskedBitsForTargetNode(const SDOperand Op, } } -/// getShuffleScalarElt - Returns the scalar element that will make up the ith -/// element of the result of the vector shuffle. -static SDOperand getShuffleScalarElt(SDNode *N, unsigned i, SelectionDAG &DAG) { - MVT::ValueType VT = N->getValueType(0); - SDOperand PermMask = N->getOperand(2); - unsigned NumElems = PermMask.getNumOperands(); - SDOperand V = (i < NumElems) ? N->getOperand(0) : N->getOperand(1); - i %= NumElems; - if (V.getOpcode() == ISD::SCALAR_TO_VECTOR) { - return (i == 0) - ? V.getOperand(0) : DAG.getNode(ISD::UNDEF, MVT::getVectorElementType(VT)); - } else if (V.getOpcode() == ISD::VECTOR_SHUFFLE) { - SDOperand Idx = PermMask.getOperand(i); - if (Idx.getOpcode() == ISD::UNDEF) - return DAG.getNode(ISD::UNDEF, MVT::getVectorElementType(VT)); - return getShuffleScalarElt(V.Val,cast<ConstantSDNode>(Idx)->getValue(),DAG); - } - return SDOperand(); -} - /// isGAPlusOffset - Returns true (and the GlobalValue and the offset) if the /// node is a GlobalAddress + offset. bool X86TargetLowering::isGAPlusOffset(SDNode *N, @@ -6240,7 +6220,7 @@ static bool EltsFromConsecutiveLoads(SDNode *N, SDOperand PermMask, } unsigned Index = cast<ConstantSDNode>(Idx)->getValue(); - SDOperand Elt = getShuffleScalarElt(N, Index, DAG); + SDOperand Elt = DAG.getShuffleScalarElt(N, Index); if (!Elt.Val || (Elt.getOpcode() != ISD::UNDEF && !ISD::isNON_EXTLoad(Elt.Val))) return false; |

