Expand INSERT_VECTOR_ELT to store vec, sp; store elt, sp+k; vec = load sp;
authorEvan Cheng <evan.cheng@apple.com>
Fri, 31 Mar 2006 01:27:51 +0000 (01:27 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 31 Mar 2006 01:27:51 +0000 (01:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27274 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index d6c3fe0920f27bdde5dbb0f347653c5ac289f6c3..29d7a5ebf6a920a006dcebcbc98bcb19906012cc 100644 (file)
@@ -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;
     }
     }