Chromium Code Reviews| Index: src/arm/code-stubs-arm.cc |
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
| index 9e6f7596e7fc60131cdaf956d07567854514e74b..f74c124c594bd28444392ffac314bbbbfe8bb51c 100644 |
| --- a/src/arm/code-stubs-arm.cc |
| +++ b/src/arm/code-stubs-arm.cc |
| @@ -343,6 +343,50 @@ void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { |
| } |
| +void FastCloneShallowObjectStub::Generate(MacroAssembler* masm) { |
| + // Stack layout on entry: |
| + // |
| + // [sp]: object literal flags. |
| + // [sp + kPointerSize]: constant properties. |
| + // [sp + (2 * kPointerSize)]: literal index. |
| + // [sp + (3 * kPointerSize)]: literals array. |
| + |
| + // Load boilerplate object into r3 and check if we need to create a |
| + // boilerplate. |
| + Label slow_case; |
| + __ ldr(r3, MemOperand(sp, 3 * kPointerSize)); |
| + __ ldr(r0, MemOperand(sp, 2 * kPointerSize)); |
| + __ add(r3, r3, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
| + __ ldr(r3, MemOperand(r3, r0, LSL, kPointerSizeLog2 - kSmiTagSize)); |
| + __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); |
| + __ cmp(r3, ip); |
|
Erik Corry
2011/11/23 14:14:15
Seems like you could use CompareRoot here.
Michael Starzinger
2011/11/23 15:02:03
Done.
|
| + __ b(eq, &slow_case); |
| + |
| + // Check that the boilerplate contains only fast properties and we can |
| + // statically determine the instance size. |
|
Erik Corry
2011/11/23 14:14:15
As discussed offline this can be omitted for MOAR
|
| + int size = JSObject::kHeaderSize + length_ * kPointerSize; |
| + __ ldr(r0, FieldMemOperand(r3, HeapObject::kMapOffset)); |
| + __ ldrb(r0, FieldMemOperand(r0, Map::kInstanceSizeOffset)); |
| + __ cmp(r0, Operand(size >> kPointerSizeLog2)); |
| + __ b(ne, &slow_case); |
| + |
| + // 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)); |
| + } |
| + |
| + // Return and remove the on-stack parameters. |
| + __ add(sp, sp, Operand(4 * kPointerSize)); |
| + __ Ret(); |
| + |
| + __ bind(&slow_case); |
| + __ TailCallRuntime(Runtime::kCreateObjectLiteralShallow, 4, 1); |
| +} |
| + |
| + |
| // Takes a Smi and converts to an IEEE 64 bit floating point value in two |
| // registers. The format is 1 sign bit, 11 exponent bits (biased 1023) and |
| // 52 fraction bits (20 in the first word, 32 in the second). Zeros is a |