| Index: src/ia32/builtins-ia32.cc
|
| ===================================================================
|
| --- src/ia32/builtins-ia32.cc (revision 4699)
|
| +++ src/ia32/builtins-ia32.cc (working copy)
|
| @@ -27,6 +27,8 @@
|
|
|
| #include "v8.h"
|
|
|
| +#if defined(V8_TARGET_ARCH_IA32)
|
| +
|
| #include "codegen-inl.h"
|
|
|
| namespace v8 {
|
| @@ -806,6 +808,7 @@
|
| Label* gc_required) {
|
| ASSERT(scratch.is(edi)); // rep stos destination
|
| ASSERT(!fill_with_hole || array_size.is(ecx)); // rep stos count
|
| + ASSERT(!fill_with_hole || !result.is(eax)); // result is never eax
|
|
|
| // Load the initial map from the array function.
|
| __ mov(elements_array,
|
| @@ -863,15 +866,22 @@
|
| if (fill_with_hole) {
|
| __ lea(edi, Operand(elements_array,
|
| FixedArray::kHeaderSize - kHeapObjectTag));
|
| -
|
| - __ push(eax);
|
| __ mov(eax, Factory::the_hole_value());
|
| -
|
| __ cld();
|
| + // Do not use rep stos when filling less than kRepStosThreshold
|
| + // words.
|
| + const int kRepStosThreshold = 16;
|
| + Label loop, entry, done;
|
| + __ cmp(ecx, kRepStosThreshold);
|
| + __ j(below, &loop); // Note: ecx > 0.
|
| __ rep_stos();
|
| -
|
| - // Restore saved registers.
|
| - __ pop(eax);
|
| + __ jmp(&done);
|
| + __ bind(&loop);
|
| + __ stos();
|
| + __ bind(&entry);
|
| + __ cmp(edi, Operand(elements_array_end));
|
| + __ j(below, &loop);
|
| + __ bind(&done);
|
| }
|
| }
|
|
|
| @@ -970,13 +980,14 @@
|
| AllocateJSArray(masm,
|
| edi,
|
| ecx,
|
| + ebx,
|
| eax,
|
| - ebx,
|
| edx,
|
| edi,
|
| true,
|
| &prepare_generic_code_call);
|
| __ IncrementCounter(&Counters::array_function_native, 1);
|
| + __ mov(eax, ebx);
|
| __ pop(ebx);
|
| if (construct_call) {
|
| __ pop(edi);
|
| @@ -1247,3 +1258,5 @@
|
| #undef __
|
|
|
| } } // namespace v8::internal
|
| +
|
| +#endif // V8_TARGET_ARCH_IA32
|
|
|