From 5e24ffaa224c3afd86a4a23803f474ff0b853ec2 Mon Sep 17 00:00:00 2001 From: "antonm@chromium.org" Date: Thu, 25 Mar 2010 14:20:56 +0000 Subject: [PATCH] Slightly faster variant of Array.push. Review URL: http://codereview.chromium.org/1265003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4279 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ia32/stub-cache-ia32.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ia32/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc index e554a31c71..858d9ecca6 100644 --- a/src/ia32/stub-cache-ia32.cc +++ b/src/ia32/stub-cache-ia32.cc @@ -1251,8 +1251,7 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object, __ j(not_equal, &miss); if (argc == 1) { // Otherwise fall through to call builtin. - Label call_builtin, exit, with_rset_update, - attempt_to_grow_elements, finish_push; + Label call_builtin, exit, with_rset_update, attempt_to_grow_elements; // Get the array's length into eax and calculate new length. __ mov(eax, FieldOperand(edx, JSArray::kLengthOffset)); @@ -1278,8 +1277,6 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object, __ mov(ecx, Operand(esp, argc * kPointerSize)); __ mov(Operand(edx, 0), ecx); - __ bind(&finish_push); - // Check if value is a smi. __ test(ecx, Immediate(kSmiTagMask)); __ j(not_zero, &with_rset_update); @@ -1318,10 +1315,13 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object, // We fit and could grow elements. __ mov(Operand::StaticVariable(new_space_allocation_top), ecx); __ mov(ecx, Operand(esp, argc * kPointerSize)); + + // Push the argument... __ mov(Operand(edx, 0), ecx); + // ... and fill the rest with holes. for (int i = 1; i < kAllocationDelta; i++) { __ mov(Operand(edx, i * kPointerSize), - Immediate(Factory::undefined_value())); + Immediate(Factory::the_hole_value())); } // Restore receiver to edx as finish sequence assumes it's here. @@ -1332,7 +1332,8 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object, Immediate(kAllocationDelta)); __ mov(FieldOperand(edx, JSArray::kLengthOffset), eax); - __ jmp(&finish_push); + // Elements are in new space, so no remembered set updates are necessary. + __ ret((argc + 1) * kPointerSize); __ bind(&call_builtin); }