add expand support for extractelement
authorChris Lattner <sabre@nondot.org>
Tue, 21 Mar 2006 21:02:03 +0000 (21:02 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 21 Mar 2006 21:02:03 +0000 (21:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26931 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index 041340ee53f14943985f169e8f73dd905c35d5c1..6c2b188b38f18f093a5cd4d24e7e8d8b776c7463 100644 (file)
@@ -826,7 +826,37 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
     Tmp1 = LegalizeOp(Node->getOperand(0));
     Tmp2 = LegalizeOp(Node->getOperand(1));
     Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2);
-    // FIXME: LOWER.
+    
+    switch (TLI.getOperationAction(ISD::EXTRACT_VECTOR_ELT,
+                                   Tmp1.getValueType())) {
+    default: assert(0 && "This action is not supported yet!");
+    case TargetLowering::Legal:
+      break;
+    case TargetLowering::Custom:
+      Tmp3 = TLI.LowerOperation(Result, DAG);
+      if (Tmp3.Val) {
+        Result = Tmp3;
+        break;
+      }
+      // FALLTHROUGH
+    case TargetLowering::Expand: {
+      // If the target doesn't support this, store the value to a temporary
+      // stack slot, then LOAD the scalar element back out.
+      SDOperand StackPtr = CreateStackTemporary(Tmp1.getValueType());
+      SDOperand Ch = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(),
+                                 Tmp1, StackPtr, DAG.getSrcValue(NULL));
+      
+      // Add the offset to the index.
+      unsigned EltSize = MVT::getSizeInBits(Result.getValueType())/8;
+      Tmp2 = DAG.getNode(ISD::MUL, Tmp2.getValueType(), Tmp2,
+                         DAG.getConstant(EltSize, Tmp2.getValueType()));
+      StackPtr = DAG.getNode(ISD::ADD, Tmp2.getValueType(), Tmp2, StackPtr);
+      
+      Result = DAG.getLoad(Result.getValueType(), Ch, StackPtr,
+                              DAG.getSrcValue(NULL));
+      break;
+    }
+    }
     break;
 
   case ISD::VEXTRACT_VECTOR_ELT: