Chromium Code Reviews| Index: src/arm/code-stubs-arm.cc |
| =================================================================== |
| --- src/arm/code-stubs-arm.cc (revision 12502) |
| +++ src/arm/code-stubs-arm.cc (working copy) |
| @@ -330,6 +330,11 @@ |
| } |
| +int FastCloneShallowArrayStub::MaximumClonedLength() { |
| + return CpuFeatures::IsSupported(VFP2) ? 128 : 8; |
|
danno
2012/10/29 15:29:24
By increasing this to 128, V8 will generate 128 ve
|
| +} |
| + |
| + |
| static void GenerateFastCloneShallowArrayCommon( |
| MacroAssembler* masm, |
| int length, |
| @@ -347,7 +352,8 @@ |
| ? FixedDoubleArray::SizeFor(length) |
| : FixedArray::SizeFor(length); |
| } |
| - int size = JSArray::kSize + elements_size; |
| + int elements_offset = JSArray::kSize; |
| + int size = elements_offset + elements_size; |
| // Allocate both the JS array and the elements array in one big |
| // allocation. This avoids multiple limit checks. |
| @@ -356,27 +362,44 @@ |
| r1, |
| r2, |
| fail, |
| - TAG_OBJECT); |
| + NO_ALLOCATION_FLAGS); |
| // Copy the JS array part. |
| - for (int i = 0; i < JSArray::kSize; i += kPointerSize) { |
| - if ((i != JSArray::kElementsOffset) || (length == 0)) { |
| - __ ldr(r1, FieldMemOperand(r3, i)); |
| - __ str(r1, FieldMemOperand(r0, i)); |
| - } |
| + __ sub(r3, r3, Operand(kHeapObjectTag)); |
| + STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize); |
| + RegList temps = r4.bit() | r5.bit() | r6.bit() | r7.bit(); |
| + __ ldm(ia_w, r3, temps); |
| + if (length > 0) { |
| + // Set the pointer to the elements array if it is non-empty. r0 is untagged, |
| + // so we need to include the tag here. |
| + STATIC_ASSERT(JSArray::kElementsOffset == 2 * kPointerSize); |
| + __ add(r6, r0, Operand(elements_offset + kHeapObjectTag)); |
| } |
| + __ stm(ia_w, r0, temps); |
| + // Copy the elements from the boilerplate array, if needed. At this point, |
| + // r0 points to the beginning of elements. |
| + int restore_size = JSArray::kSize - kHeapObjectTag; |
| if (length > 0) { |
| - // Get hold of the elements array of the boilerplate and setup the |
| - // elements pointer in the resulting object. |
| - __ ldr(r3, FieldMemOperand(r3, JSArray::kElementsOffset)); |
| - __ add(r2, r0, Operand(JSArray::kSize)); |
| - __ str(r2, FieldMemOperand(r0, JSArray::kElementsOffset)); |
| - |
| - // Copy the elements array. |
| + // Load the elements array from the boilerplate. |
| + __ ldr(r3, MemOperand(r3, JSArray::kElementsOffset - JSArray::kSize)); |
| ASSERT((elements_size % kPointerSize) == 0); |
| - __ CopyFields(r2, r3, r1.bit(), elements_size / kPointerSize); |
| + if (CpuFeatures::IsSupported(VFP2)) { |
| + CpuFeatures::Scope scope(VFP2); |
| + SwVfpRegister first_reg = s0; |
| + SwVfpRegister last_reg = s15; |
| + __ sub(r3, r3, Operand(kHeapObjectTag)); |
| + __ VFPCopyFields(r0, r3, elements_size / kPointerSize, |
| + first_reg, last_reg); |
| + restore_size += elements_size; |
| + } else { |
| + __ CopyFields(r6, r3, r1.bit(), elements_size / kPointerSize); |
| + } |
| } |
| + |
| + // At this point, r0 points to the end of the copied region. Bring it back to |
| + // the beginning and tag it. |
| + __ sub(r0, r0, Operand(restore_size)); |
| } |
| void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { |
| @@ -456,6 +479,11 @@ |
| } |
| +int FastCloneShallowObjectStub::MaximumClonedProperties() { |
| + return CpuFeatures::IsSupported(VFP2) ? 96 : 6; |
|
danno
2012/10/29 15:29:24
Similarly here, please keep at constant 6, unless
|
| +} |
| + |
| + |
| void FastCloneShallowObjectStub::Generate(MacroAssembler* masm) { |
| // Stack layout on entry: |
| // |
| @@ -484,10 +512,20 @@ |
| // Allocate the JS object and copy header together with all in-object |
| // properties from the boilerplate. |
| - __ AllocateInNewSpace(size, r0, r1, r2, &slow_case, TAG_OBJECT); |
| - for (int i = 0; i < size; i += kPointerSize) { |
| - __ ldr(r1, FieldMemOperand(r3, i)); |
| - __ str(r1, FieldMemOperand(r0, i)); |
| + if (CpuFeatures::IsSupported(VFP2)) { |
| + CpuFeatures::Scope scope(VFP2); |
| + __ AllocateInNewSpace(size, r0, r1, r2, &slow_case, NO_ALLOCATION_FLAGS); |
| + SwVfpRegister first_reg = s0; |
| + SwVfpRegister last_reg = s15; |
| + __ sub(r3, r3, Operand(kHeapObjectTag)); |
| + __ VFPCopyFields(r0, r3, size / kPointerSize, first_reg, last_reg); |
| + __ sub(r0, r0, Operand(size - kHeapObjectTag)); |
| + } else { |
| + __ AllocateInNewSpace(size, r0, r1, r2, &slow_case, TAG_OBJECT); |
| + for (int i = 0; i < size; i += kPointerSize) { |
| + __ ldr(r1, FieldMemOperand(r3, i)); |
| + __ str(r1, FieldMemOperand(r0, i)); |
| + } |
| } |
| // Return and remove the on-stack parameters. |