diff options
author | Mon P Wang <wangmp@apple.com> | 2008-12-13 08:15:14 +0000 |
---|---|---|
committer | Mon P Wang <wangmp@apple.com> | 2008-12-13 08:15:14 +0000 |
commit | f95bd2078d34ef6f81607945569fc8cc4ba2e5cb (patch) | |
tree | 6a26d6e9c3d44474679b6e4ea1fb0447d79ae95d | |
parent | 1e29f7c97df987125b17670d903317a1515aa127 (diff) | |
download | bcm5719-llvm-f95bd2078d34ef6f81607945569fc8cc4ba2e5cb.tar.gz bcm5719-llvm-f95bd2078d34ef6f81607945569fc8cc4ba2e5cb.zip |
Added basic support for expanding VSETCC
llvm-svn: 60974
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index d02e68d30c5..6f4158b58c1 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3126,6 +3126,25 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) { Tmp1 = TLI.LowerOperation(Result, DAG); if (Tmp1.getNode()) Result = Tmp1; break; + case TargetLowering::Expand: { + // Unroll into a nasty set of scalar code for now. + MVT VT = Node->getValueType(0); + unsigned NumElems = VT.getVectorNumElements(); + MVT EltVT = VT.getVectorElementType(); + MVT TmpEltVT = Tmp1.getValueType().getVectorElementType(); + SmallVector<SDValue, 8> Ops(NumElems); + for (unsigned i = 0; i < NumElems; ++i) { + SDValue In1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, TmpEltVT, + Tmp1, DAG.getIntPtrConstant(i)); + Ops[i] = DAG.getNode(ISD::SETCC, TLI.getSetCCResultType(In1), In1, + DAG.getNode(ISD::EXTRACT_VECTOR_ELT, TmpEltVT, + Tmp2, DAG.getIntPtrConstant(i)), + CC); + Ops[i] = DAG.getNode(ISD::SIGN_EXTEND, EltVT, Ops[i]); + } + Result = DAG.getNode(ISD::BUILD_VECTOR, VT, &Ops[0], NumElems); + break; + } } break; } @@ -3204,7 +3223,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) { Node->getOpcode() == ISD::SRA) && !Node->getValueType(0).isVector()) { Tmp2 = LegalizeShiftAmount(Tmp2); - } + } Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); @@ -8002,7 +8021,7 @@ SDValue SelectionDAGLegalize::WidenVectorOp(SDValue Op, MVT WidenVT) { NewOps.push_back(PermOp.getOperand(i)); } else { unsigned Idx = - cast<ConstantSDNode>(PermOp.getOperand(i))->getZExtValue(); + cast<ConstantSDNode>(PermOp.getOperand(i))->getZExtValue(); if (Idx < NumElts) { NewOps.push_back(PermOp.getOperand(i)); } |