Title: [153252] trunk/Source/_javascript_Core
Revision
153252
Author
[email protected]
Date
2013-07-24 21:03:57 -0700 (Wed, 24 Jul 2013)

Log Message

fourthTier: FTL should support ArrayifyToStructure
https://bugs.webkit.org/show_bug.cgi?id=118095

Reviewed by Mark Hahnenberg.

* ftl/FTLCapabilities.cpp:
(JSC::FTL::canCompile):
* ftl/FTLIntrinsicRepository.h:
(FTL):
* ftl/FTLLowerDFGToLLVM.cpp:
(JSC::FTL::LowerDFGToLLVM::compileNode):
(JSC::FTL::LowerDFGToLLVM::compileArrayifyToStructure):
(LowerDFGToLLVM):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (153251 => 153252)


--- trunk/Source/_javascript_Core/ChangeLog	2013-07-25 04:03:56 UTC (rev 153251)
+++ trunk/Source/_javascript_Core/ChangeLog	2013-07-25 04:03:57 UTC (rev 153252)
@@ -1,5 +1,21 @@
 2013-06-26  Filip Pizlo  <[email protected]>
 
+        fourthTier: FTL should support ArrayifyToStructure
+        https://bugs.webkit.org/show_bug.cgi?id=118095
+
+        Reviewed by Mark Hahnenberg.
+
+        * ftl/FTLCapabilities.cpp:
+        (JSC::FTL::canCompile):
+        * ftl/FTLIntrinsicRepository.h:
+        (FTL):
+        * ftl/FTLLowerDFGToLLVM.cpp:
+        (JSC::FTL::LowerDFGToLLVM::compileNode):
+        (JSC::FTL::LowerDFGToLLVM::compileArrayifyToStructure):
+        (LowerDFGToLLVM):
+
+2013-06-26  Filip Pizlo  <[email protected]>
+
         fourthTier: FTL should support ForwardCheckStructure/ForwardStructureTransitionWatchpoint and doing so shouldn't break V8/crypto
         https://bugs.webkit.org/show_bug.cgi?id=118091
 

Modified: trunk/Source/_javascript_Core/ftl/FTLCapabilities.cpp (153251 => 153252)


--- trunk/Source/_javascript_Core/ftl/FTLCapabilities.cpp	2013-07-25 04:03:56 UTC (rev 153251)
+++ trunk/Source/_javascript_Core/ftl/FTLCapabilities.cpp	2013-07-25 04:03:57 UTC (rev 153252)
@@ -57,6 +57,7 @@
     case ForwardCheckStructure:
     case StructureTransitionWatchpoint:
     case ForwardStructureTransitionWatchpoint:
+    case ArrayifyToStructure:
     case PutStructure:
     case PhantomPutStructure:
     case GetButterfly:

Modified: trunk/Source/_javascript_Core/ftl/FTLIntrinsicRepository.h (153251 => 153252)


--- trunk/Source/_javascript_Core/ftl/FTLIntrinsicRepository.h	2013-07-25 04:03:56 UTC (rev 153251)
+++ trunk/Source/_javascript_Core/ftl/FTLIntrinsicRepository.h	2013-07-25 04:03:57 UTC (rev 153252)
@@ -43,7 +43,8 @@
     macro(doubleAbs, "llvm.fabs.f64", functionType(doubleType, doubleType))
 
 #define FOR_EACH_FUNCTION_TYPE(macro) \
-    macro(I_DFGOperation_EJss, functionType(intPtr, intPtr, intPtr))
+    macro(I_DFGOperation_EJss, functionType(intPtr, intPtr, intPtr)) \
+    macro(P_DFGOperation_EC, functionType(intPtr, intPtr, intPtr))
 
 class IntrinsicRepository : public CommonValues {
 public:

Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp (153251 => 153252)


--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp	2013-07-25 04:03:56 UTC (rev 153251)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp	2013-07-25 04:03:57 UTC (rev 153252)
@@ -360,6 +360,9 @@
         case ForwardStructureTransitionWatchpoint:
             compileStructureTransitionWatchpoint();
             break;
+        case ArrayifyToStructure:
+            compileArrayifyToStructure();
+            break;
         case PutStructure:
             compilePutStructure();
             break;
@@ -1135,6 +1138,67 @@
         speculateCell(m_node->child1());
     }
     
+    void compileArrayifyToStructure()
+    {
+        LValue cell = lowCell(m_node->child1());
+        LValue property = !!m_node->child2() ? lowInt32(m_node->child2()) : 0;
+        
+        LBasicBlock unexpectedStructure = FTL_NEW_BLOCK(m_out, ("ArrayifyToStructure unexpected structure"));
+        LBasicBlock continuation = FTL_NEW_BLOCK(m_out, ("ArrayifyToStructure continuation"));
+        
+        LValue structure = m_out.loadPtr(cell, m_heaps.JSCell_structure);
+        
+        m_out.branch(
+            m_out.notEqual(structure, weakPointer(m_node->structure())),
+            unexpectedStructure, continuation);
+        
+        LBasicBlock lastNext = m_out.appendTo(unexpectedStructure, continuation);
+        
+        if (property) {
+            switch (m_node->arrayMode().type()) {
+            case Array::Int32:
+            case Array::Double:
+            case Array::Contiguous:
+                speculate(
+                    Uncountable, noValue(), 0,
+                    m_out.aboveOrEqual(property, m_out.constInt32(MIN_SPARSE_ARRAY_INDEX)));
+                break;
+            default:
+                break;
+            }
+        }
+        
+        switch (m_node->arrayMode().type()) {
+        case Array::Int32:
+            vmCall(m_out.operation(operationEnsureInt32), m_callFrame, cell);
+            break;
+        case Array::Double:
+            vmCall(m_out.operation(operationEnsureDouble), m_callFrame, cell);
+            break;
+        case Array::Contiguous:
+            if (m_node->arrayMode().conversion() == Array::RageConvert)
+                vmCall(m_out.operation(operationRageEnsureContiguous), m_callFrame, cell);
+            else
+                vmCall(m_out.operation(operationEnsureContiguous), m_callFrame, cell);
+            break;
+        case Array::ArrayStorage:
+        case Array::SlowPutArrayStorage:
+            vmCall(m_out.operation(operationEnsureArrayStorage), m_callFrame, cell);
+            break;
+        default:
+            RELEASE_ASSERT_NOT_REACHED();
+            break;
+        }
+        
+        structure = m_out.loadPtr(cell, m_heaps.JSCell_structure);
+        speculate(
+            BadIndexingType, jsValueValue(cell), 0,
+            m_out.notEqual(structure, weakPointer(m_node->structure())));
+        m_out.jump(continuation);
+        
+        m_out.appendTo(continuation, lastNext);
+    }
+    
     void compilePutStructure()
     {
         m_ftlState.jitCode->common.notifyCompilingStructureTransition(codeBlock(), m_node);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to