| Index: src/arm/codegen-arm.cc
|
| diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc
|
| index 5b80d6facc5ea8e4a0b2fb6fcf985a83bdbc1cba..fbd9f6388024d7562b9727c9e1650963e3de3d64 100644
|
| --- a/src/arm/codegen-arm.cc
|
| +++ b/src/arm/codegen-arm.cc
|
| @@ -444,15 +444,16 @@ void ElementsTransitionGenerator::GenerateSmiToDouble(
|
|
|
| __ push(lr);
|
| __ ldr(r5, FieldMemOperand(r4, FixedArray::kLengthOffset));
|
| - // r4: source FixedArray
|
| // r5: number of elements (smi-tagged)
|
|
|
| // Allocate new FixedDoubleArray.
|
| // Use lr as a temporary register.
|
| __ mov(lr, Operand(r5, LSL, 2));
|
| __ add(lr, lr, Operand(FixedDoubleArray::kHeaderSize));
|
| - __ Allocate(lr, r6, r7, r9, &gc_required, DOUBLE_ALIGNMENT);
|
| + __ Allocate(lr, r6, r4, r9, &gc_required, DOUBLE_ALIGNMENT);
|
| // r6: destination FixedDoubleArray, not tagged as heap object.
|
| + __ ldr(r4, FieldMemOperand(r2, JSObject::kElementsOffset));
|
| + // r4: source FixedArray.
|
|
|
| // Set destination FixedDoubleArray's length and map.
|
| __ LoadRoot(r9, Heap::kFixedDoubleArrayMapRootIndex);
|
| @@ -483,15 +484,15 @@ void ElementsTransitionGenerator::GenerateSmiToDouble(
|
|
|
| // Prepare for conversion loop.
|
| __ add(r3, r4, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
|
| - __ add(r7, r6, Operand(FixedDoubleArray::kHeaderSize));
|
| - __ add(r6, r7, Operand(r5, LSL, 2));
|
| + __ add(r9, r6, Operand(FixedDoubleArray::kHeaderSize));
|
| + __ add(r6, r9, Operand(r5, LSL, 2));
|
| __ mov(r4, Operand(kHoleNanLower32));
|
| __ mov(r5, Operand(kHoleNanUpper32));
|
| // r3: begin of source FixedArray element fields, not tagged
|
| // r4: kHoleNanLower32
|
| // r5: kHoleNanUpper32
|
| // r6: end of destination FixedDoubleArray, not tagged
|
| - // r7: begin of FixedDoubleArray element fields, not tagged
|
| + // r9: begin of FixedDoubleArray element fields, not tagged
|
|
|
| __ b(&entry);
|
|
|
| @@ -514,30 +515,30 @@ void ElementsTransitionGenerator::GenerateSmiToDouble(
|
|
|
| // Convert and copy elements.
|
| __ bind(&loop);
|
| - __ ldr(r9, MemOperand(r3, 4, PostIndex));
|
| - // r9: current element
|
| - __ UntagAndJumpIfNotSmi(r9, r9, &convert_hole);
|
| + __ ldr(lr, MemOperand(r3, 4, PostIndex));
|
| + // lr: current element
|
| + __ UntagAndJumpIfNotSmi(lr, lr, &convert_hole);
|
|
|
| // Normal smi, convert to double and store.
|
| - __ vmov(s0, r9);
|
| + __ vmov(s0, lr);
|
| __ vcvt_f64_s32(d0, s0);
|
| - __ vstr(d0, r7, 0);
|
| - __ add(r7, r7, Operand(8));
|
| + __ vstr(d0, r9, 0);
|
| + __ add(r9, r9, Operand(8));
|
| __ b(&entry);
|
|
|
| // Hole found, store the-hole NaN.
|
| __ bind(&convert_hole);
|
| if (FLAG_debug_code) {
|
| // Restore a "smi-untagged" heap object.
|
| - __ SmiTag(r9);
|
| - __ orr(r9, r9, Operand(1));
|
| - __ CompareRoot(r9, Heap::kTheHoleValueRootIndex);
|
| + __ SmiTag(lr);
|
| + __ orr(lr, lr, Operand(1));
|
| + __ CompareRoot(lr, Heap::kTheHoleValueRootIndex);
|
| __ Assert(eq, kObjectFoundInSmiOnlyArray);
|
| }
|
| - __ Strd(r4, r5, MemOperand(r7, 8, PostIndex));
|
| + __ Strd(r4, r5, MemOperand(r9, 8, PostIndex));
|
|
|
| __ bind(&entry);
|
| - __ cmp(r7, r6);
|
| + __ cmp(r9, r6);
|
| __ b(lt, &loop);
|
|
|
| __ pop(lr);
|
| @@ -577,7 +578,7 @@ void ElementsTransitionGenerator::GenerateDoubleToObject(
|
| // Allocate new FixedArray.
|
| __ mov(r0, Operand(FixedDoubleArray::kHeaderSize));
|
| __ add(r0, r0, Operand(r5, LSL, 1));
|
| - __ Allocate(r0, r6, r7, r9, &gc_required, NO_ALLOCATION_FLAGS);
|
| + __ Allocate(r0, r6, r3, r9, &gc_required, NO_ALLOCATION_FLAGS);
|
| // r6: destination FixedArray, not tagged as heap object
|
| // Set destination FixedDoubleArray's length and map.
|
| __ LoadRoot(r9, Heap::kFixedArrayMapRootIndex);
|
| @@ -589,14 +590,12 @@ void ElementsTransitionGenerator::GenerateDoubleToObject(
|
| __ add(r3, r6, Operand(FixedArray::kHeaderSize));
|
| __ add(r6, r6, Operand(kHeapObjectTag));
|
| __ add(r5, r3, Operand(r5, LSL, 1));
|
| - __ LoadRoot(r7, Heap::kTheHoleValueRootIndex);
|
| __ LoadRoot(r9, Heap::kHeapNumberMapRootIndex);
|
| // Using offsetted addresses in r4 to fully take advantage of post-indexing.
|
| // r3: begin of destination FixedArray element fields, not tagged
|
| // r4: begin of source FixedDoubleArray element fields, not tagged, +4
|
| // r5: end of destination FixedArray, not tagged
|
| // r6: destination FixedArray
|
| - // r7: the-hole pointer
|
| // r9: heap number map
|
| __ b(&entry);
|
|
|
| @@ -608,7 +607,7 @@ void ElementsTransitionGenerator::GenerateDoubleToObject(
|
|
|
| __ bind(&loop);
|
| __ ldr(r1, MemOperand(r4, 8, PostIndex));
|
| - // lr: current element's upper 32 bit
|
| + // r1: current element's upper 32 bit
|
| // r4: address of next element's upper 32 bit
|
| __ cmp(r1, Operand(kHoleNanUpper32));
|
| __ b(eq, &convert_hole);
|
| @@ -631,7 +630,8 @@ void ElementsTransitionGenerator::GenerateDoubleToObject(
|
|
|
| // Replace the-hole NaN with the-hole pointer.
|
| __ bind(&convert_hole);
|
| - __ str(r7, MemOperand(r3, 4, PostIndex));
|
| + __ LoadRoot(r0, Heap::kTheHoleValueRootIndex);
|
| + __ str(r0, MemOperand(r3, 4, PostIndex));
|
|
|
| __ bind(&entry);
|
| __ cmp(r3, r5);
|
|
|