diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-03-31 01:27:51 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-03-31 01:27:51 +0000 |
commit | eb0b461cf4884bf2c98e463663a298e5c4ae9883 (patch) | |
tree | 498651c53139ed95b9f685cd04ce1876426b443a | |
parent | 79227e2906656b2c92965f5dbebcd66a5774c87f (diff) |
Expand INSERT_VECTOR_ELT to store vec, sp; store elt, sp+k; vec = load sp;
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27274 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index d6c3fe0920..29d7a5ebf6 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -798,7 +798,30 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { // with a "move to register" or "extload into register" instruction, then // permute it into place, if the idx is a constant and if the idx is // supported by the target. - assert(0 && "INSERT_VECTOR_ELT expand not supported yet!"); + SDOperand StackPtr = CreateStackTemporary(Tmp1.getValueType()); + // Store the vector. + SDOperand Ch = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(), + Tmp1, StackPtr, DAG.getSrcValue(NULL)); + + // Truncate or zero extend offset to target pointer type. + MVT::ValueType IntPtr = TLI.getPointerTy(); + if (Tmp3.getValueType() > IntPtr) + Tmp3 = DAG.getNode(ISD::TRUNCATE, IntPtr, Tmp3); + else + Tmp3 = DAG.getNode(ISD::ZERO_EXTEND, IntPtr, Tmp3); + + // Add the offset to the index. + unsigned EltSize = MVT::getSizeInBits(Result.getValueType())/8; + Tmp3 = DAG.getNode(ISD::MUL, Tmp3.getValueType(), Tmp3, + DAG.getConstant(EltSize, Tmp3.getValueType())); + SDOperand StackPtr2 = + DAG.getNode(ISD::ADD, Tmp3.getValueType(), Tmp3, StackPtr); + // Store the scalar value. + Ch = DAG.getNode(ISD::STORE, MVT::Other, Ch, + Tmp2, StackPtr2, DAG.getSrcValue(NULL)); + // Load the updated vector. + Result = DAG.getLoad(Result.getValueType(), Ch, StackPtr, + DAG.getSrcValue(NULL)); break; } } |