2011-06-14 Oliver Hunt <oliver@apple.com>
Reviewed by Gavin Barraclough.
Constant array literals result in unnecessarily large amounts of code
https://bugs.webkit.org/show_bug.cgi?id=62658
Add a new version of op_new_array that simply copies values from a buffer
we hang off of the CodeBlock, rather than generating code to place each
entry into the registerfile, and then copying it from the registerfile into
the array. This is a slight improvement on some sunspider tests, but no
measurable overall change. That's okay though as our goal was to reduce
code size without hurting performance.
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::dump):
* bytecode/CodeBlock.h:
(JSC::CodeBlock::addImmediateBuffer):
(JSC::CodeBlock::immediateBuffer):
* bytecode/Opcode.h:
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::addImmediateBuffer):
(JSC::BytecodeGenerator::emitNewArray):
* bytecompiler/BytecodeGenerator.h:
* bytecompiler/NodesCodegen.cpp:
(JSC::ArrayNode::emitBytecode):
* interpreter/Interpreter.cpp:
(JSC::Interpreter::privateExecute):
* jit/JIT.cpp:
(JSC::JIT::privateCompileMainPass):
* jit/JIT.h:
* jit/JITOpcodes.cpp:
(JSC::JIT::emit_op_new_array):
(JSC::JIT::emit_op_new_array_buffer):
* jit/JITOpcodes32_64.cpp:
* jit/JITStubs.cpp:
(JSC::DEFINE_STUB_FUNCTION):
* jit/JITStubs.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@88873 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/bytecode/CodeBlock.cpp b/Source/JavaScriptCore/bytecode/CodeBlock.cpp
index 71fae6b..d9e2355 100644
--- a/Source/JavaScriptCore/bytecode/CodeBlock.cpp
+++ b/Source/JavaScriptCore/bytecode/CodeBlock.cpp
@@ -530,6 +530,13 @@
printf("[%4d] new_array\t %s, %s, %d\n", location, registerName(exec, dst).data(), registerName(exec, argv).data(), argc);
break;
}
+ case op_new_array_buffer: {
+ int dst = (++it)->u.operand;
+ int argv = (++it)->u.operand;
+ int argc = (++it)->u.operand;
+ printf("[%4d] new_array_buffer %s, %d, %d\n", location, registerName(exec, dst).data(), argv, argc);
+ break;
+ }
case op_new_regexp: {
int r0 = (++it)->u.operand;
int re0 = (++it)->u.operand;