Author: lattner
Date: Sat Dec  8 17:24:26 2007
New Revision: 44725

URL: http://llvm.org/viewvc/llvm-project?rev=44725&view=rev
Log:
Implement splitting support for store, allowing us to compile:

        %f8 = type <8 x float>

define void @test_f8(%f8* %P, %f8* %Q, %f8* %S) {
        %p = load %f8* %P               ; <%f8> [#uses=1]
        %q = load %f8* %Q               ; <%f8> [#uses=1]
        %R = add %f8 %p, %q             ; <%f8> [#uses=1]
        store %f8 %R, %f8* %S
        ret void
}

into:

_test_f8:
        movaps  16(%rdi), %xmm0
        addps   16(%rsi), %xmm0
        movaps  (%rdi), %xmm1
        addps   (%rsi), %xmm1
        movaps  %xmm0, 16(%rdx)
        movaps  %xmm1, (%rdx)
        ret


Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h?rev=44725&r1=44724&r2=44725&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h Sat Dec  8 17:24:26 2007
@@ -281,6 +281,7 @@
   // Operand Vector Scalarization: <128 x ty> -> 2 x <64 x ty>.
   bool SplitOperand(SDNode *N, unsigned OpNo);
   
+  SDOperand SplitOperand_STORE(StoreSDNode *N, unsigned OpNo);
 };
 
 } // end namespace llvm.

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp?rev=44725&r1=44724&r2=44725&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp Sat Dec  8 
17:24:26 2007
@@ -172,11 +172,9 @@
 #endif
       assert(0 && "Do not know how to split this operator's operand!");
       abort();
-#if 0
     case ISD::STORE:
-      Res = ExpandOperand_STORE(cast<StoreSDNode>(N), OpNo);
+      Res = SplitOperand_STORE(cast<StoreSDNode>(N), OpNo);
       break;
-#endif
     }
   }
   
@@ -200,3 +198,28 @@
   ReplaceValueWith(SDOperand(N, 0), Res);
   return false;
 }
+
+SDOperand DAGTypeLegalizer::SplitOperand_STORE(StoreSDNode *N, unsigned OpNo) {
+  assert(OpNo == 1 && "Can only split the stored value");
+  
+  SDOperand Ch  = N->getChain();
+  SDOperand Ptr = N->getBasePtr();
+  int SVOffset = N->getSrcValueOffset();
+  unsigned Alignment = N->getAlignment();
+  bool isVol = N->isVolatile();
+  SDOperand Lo, Hi;
+  GetSplitOp(N->getOperand(1), Lo, Hi);
+
+  unsigned IncrementSize = MVT::getSizeInBits(Lo.getValueType())/8;
+
+  Lo = DAG.getStore(Ch, Lo, Ptr, N->getSrcValue(), SVOffset, isVol, Alignment);
+  
+  // Increment the pointer to the other half.
+  Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr,
+                    getIntPtrConstant(IncrementSize));
+  
+  Hi = DAG.getStore(Ch, Hi, Ptr, N->getSrcValue(), SVOffset+IncrementSize,
+                    isVol, MinAlign(Alignment, IncrementSize));
+  return DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi);
+}
+


_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to