Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (158716 => 158717)
--- trunk/Source/_javascript_Core/ChangeLog 2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ChangeLog 2013-11-06 04:40:02 UTC (rev 158717)
@@ -1,5 +1,23 @@
2013-11-05 Filip Pizlo <[email protected]>
+ FTL should support NewObject
+ https://bugs.webkit.org/show_bug.cgi?id=123849
+
+ Reviewed by Oliver Hunt.
+
+ * ftl/FTLAbstractHeapRepository.cpp:
+ (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
+ * ftl/FTLAbstractHeapRepository.h:
+ * ftl/FTLCapabilities.cpp:
+ (JSC::FTL::canCompile):
+ * ftl/FTLIntrinsicRepository.h:
+ * ftl/FTLLowerDFGToLLVM.cpp:
+ (JSC::FTL::LowerDFGToLLVM::compileNode):
+ (JSC::FTL::LowerDFGToLLVM::compileNewObject):
+ (JSC::FTL::LowerDFGToLLVM::allocate):
+
+2013-11-05 Filip Pizlo <[email protected]>
+
FTL should support StringCharAt
https://bugs.webkit.org/show_bug.cgi?id=123855
Modified: trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.cpp (158716 => 158717)
--- trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.cpp 2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.cpp 2013-11-06 04:40:02 UTC (rev 158717)
@@ -45,6 +45,8 @@
FOR_EACH_ABSTRACT_FIELD(ABSTRACT_FIELD_INITIALIZATION)
#undef ABSTRACT_FIELD_INITIALIZATION
+ , JSCell_freeListNext(JSCell_structure)
+
#define INDEXED_ABSTRACT_HEAP_INITIALIZATION(name, size) , name(context, &root, #name, size)
FOR_EACH_INDEXED_ABSTRACT_HEAP(INDEXED_ABSTRACT_HEAP_INITIALIZATION)
#undef INDEXED_ABSTRACT_HEAP_INITIALIZATION
@@ -61,6 +63,8 @@
RELEASE_ASSERT(m_tbaaKind);
RELEASE_ASSERT(root.m_tbaaMetadata);
+
+ RELEASE_ASSERT(!JSCell_freeListNext.offset());
}
AbstractHeapRepository::~AbstractHeapRepository()
Modified: trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.h (158716 => 158717)
--- trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.h 2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.h 2013-11-06 04:40:02 UTC (rev 158717)
@@ -51,6 +51,7 @@
macro(JSString_length, JSString::offsetOfLength()) \
macro(JSString_value, JSString::offsetOfValue()) \
macro(JSVariableObject_registers, JSVariableObject::offsetOfRegisters()) \
+ macro(MarkedAllocator_freeListHead, MarkedAllocator::offsetOfFreeListHead()) \
macro(StringImpl_data, StringImpl::dataOffset()) \
macro(StringImpl_hashAndFlags, StringImpl::flagsOffset()) \
macro(Structure_classInfo, Structure::classInfoOffset()) \
@@ -90,6 +91,8 @@
FOR_EACH_ABSTRACT_FIELD(ABSTRACT_FIELD_DECLARATION)
#undef ABSTRACT_FIELD_DECLARATION
+ AbstractField& JSCell_freeListNext;
+
#define INDEXED_ABSTRACT_HEAP_DECLARATION(name, size) IndexedAbstractHeap name;
FOR_EACH_INDEXED_ABSTRACT_HEAP(INDEXED_ABSTRACT_HEAP_DECLARATION)
#undef INDEXED_ABSTRACT_HEAP_DECLARATION
Modified: trunk/Source/_javascript_Core/ftl/FTLCapabilities.cpp (158716 => 158717)
--- trunk/Source/_javascript_Core/ftl/FTLCapabilities.cpp 2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ftl/FTLCapabilities.cpp 2013-11-06 04:40:02 UTC (rev 158717)
@@ -62,6 +62,7 @@
case PutStructure:
case PhantomPutStructure:
case GetButterfly:
+ case NewObject:
case GetByOffset:
case PutByOffset:
case GetGlobalVar:
Modified: trunk/Source/_javascript_Core/ftl/FTLIntrinsicRepository.h (158716 => 158717)
--- trunk/Source/_javascript_Core/ftl/FTLIntrinsicRepository.h 2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ftl/FTLIntrinsicRepository.h 2013-11-06 04:40:02 UTC (rev 158717)
@@ -50,6 +50,7 @@
macro(trap, "llvm.trap", functionType(voidType))
#define FOR_EACH_FUNCTION_TYPE(macro) \
+ macro(C_JITOperation_ESt, functionType(intPtr, intPtr, intPtr)) \
macro(I_JITOperation_EJss, functionType(intPtr, intPtr, intPtr)) \
macro(J_JITOperation_E, functionType(int64, intPtr)) \
macro(J_JITOperation_EJssZ, functionType(int64, intPtr, intPtr, int32)) \
Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp (158716 => 158717)
--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp 2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp 2013-11-06 04:40:02 UTC (rev 158717)
@@ -365,6 +365,9 @@
case PutByValAlias:
compilePutByVal();
break;
+ case NewObject:
+ compileNewObject();
+ break;
case StringCharAt:
compileStringCharAt();
break;
@@ -1722,6 +1725,32 @@
}
}
+ void compileNewObject()
+ {
+ Structure* structure = m_node->structure();
+ size_t allocationSize = JSFinalObject::allocationSize(structure->inlineCapacity());
+ MarkedAllocator* allocator = &vm().heap.allocatorForObjectWithoutDestructor(allocationSize);
+
+ LBasicBlock slowPath = FTL_NEW_BLOCK(m_out, ("NewObject slow path"));
+ LBasicBlock continuation = FTL_NEW_BLOCK(m_out, ("NewObject continuation"));
+
+ LBasicBlock lastNext = m_out.insertNewBlocksBefore(slowPath);
+
+ ValueFromBlock fastResult = m_out.anchor(allocate(
+ m_out.constIntPtr(allocator), m_out.constIntPtr(structure), m_out.intPtrZero, slowPath));
+
+ m_out.jump(continuation);
+
+ m_out.appendTo(slowPath, continuation);
+
+ ValueFromBlock slowResult = m_out.anchor(vmCall(
+ m_out.operation(operationNewObject), m_callFrame, m_out.constIntPtr(structure)));
+ m_out.jump(continuation);
+
+ m_out.appendTo(continuation, lastNext);
+ setJSValue(m_out.phi(m_out.intPtr, fastResult, slowResult));
+ }
+
void compileStringCharAt()
{
LValue base = lowCell(m_node->child1());
@@ -2298,6 +2327,28 @@
info.m_isInvalidationPoint = true;
}
+ LValue allocate(
+ LValue allocator, LValue structure, LValue butterfly, LBasicBlock slowPath)
+ {
+ LBasicBlock success = FTL_NEW_BLOCK(m_out, ("allocation success"));
+
+ LValue result = m_out.loadPtr(
+ allocator, m_heaps.MarkedAllocator_freeListHead);
+
+ m_out.branch(m_out.notNull(result), success, slowPath);
+
+ m_out.appendTo(success);
+
+ m_out.storePtr(
+ m_out.loadPtr(result, m_heaps.JSCell_freeListNext),
+ allocator, m_heaps.MarkedAllocator_freeListHead);
+
+ m_out.storePtr(structure, result, m_heaps.JSCell_structure);
+ m_out.storePtr(butterfly, result, m_heaps.JSObject_butterfly);
+
+ return result;
+ }
+
LValue boolify(Edge edge)
{
switch (edge.useKind()) {