| Index: src/arm/codegen-arm.cc
|
| diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc
|
| index 3371e8a6b1dddeabf991a81076f545d96c39aba0..27a823e773822252303480f6ab42196ef00ef1d5 100644
|
| --- a/src/arm/codegen-arm.cc
|
| +++ b/src/arm/codegen-arm.cc
|
| @@ -104,10 +104,10 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble(
|
| __ add(lr, lr, Operand(r5, LSL, 2));
|
| __ AllocateInNewSpace(lr, r6, r7, r9, &gc_required, NO_ALLOCATION_FLAGS);
|
| // r6: destination FixedDoubleArray, not tagged as heap object
|
| + // Set destination FixedDoubleArray's length and map.
|
| __ LoadRoot(r9, Heap::kFixedDoubleArrayMapRootIndex);
|
| - __ str(r9, MemOperand(r6, HeapObject::kMapOffset));
|
| - // Set destination FixedDoubleArray's length.
|
| __ str(r5, MemOperand(r6, FixedDoubleArray::kLengthOffset));
|
| + __ str(r9, MemOperand(r6, HeapObject::kMapOffset));
|
| // Update receiver's map.
|
|
|
| __ str(r3, FieldMemOperand(r2, HeapObject::kMapOffset));
|
| @@ -155,10 +155,9 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble(
|
| __ bind(&loop);
|
| __ ldr(r9, MemOperand(r3, 4, PostIndex));
|
| // r9: current element
|
| - __ JumpIfNotSmi(r9, &convert_hole);
|
| + __ UntagAndJumpIfNotSmi(r9, r9, &convert_hole);
|
|
|
| // Normal smi, convert to double and store.
|
| - __ SmiUntag(r9);
|
| if (vfp3_supported) {
|
| CpuFeatures::Scope scope(VFP3);
|
| __ vmov(s0, r9);
|
| @@ -181,6 +180,9 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble(
|
| // 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);
|
| __ Assert(eq, "object found in smi-only array");
|
| }
|
| @@ -208,9 +210,8 @@ void ElementsTransitionGenerator::GenerateDoubleToObject(
|
| Label entry, loop, convert_hole, gc_required;
|
|
|
| __ push(lr);
|
| - __ Push(r3, r2, r1, r0);
|
| -
|
| __ ldr(r4, FieldMemOperand(r2, JSObject::kElementsOffset));
|
| + __ Push(r3, r2, r1, r0);
|
| __ ldr(r5, FieldMemOperand(r4, FixedArray::kLengthOffset));
|
| // r4: source FixedDoubleArray
|
| // r5: number of elements (smi-tagged)
|
| @@ -220,10 +221,10 @@ void ElementsTransitionGenerator::GenerateDoubleToObject(
|
| __ add(r0, r0, Operand(r5, LSL, 1));
|
| __ AllocateInNewSpace(r0, r6, r7, 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);
|
| - __ str(r9, MemOperand(r6, HeapObject::kMapOffset));
|
| - // Set destination FixedDoubleArray's length.
|
| __ str(r5, MemOperand(r6, FixedDoubleArray::kLengthOffset));
|
| + __ str(r9, MemOperand(r6, HeapObject::kMapOffset));
|
|
|
| // Prepare for conversion loop.
|
| __ add(r4, r4, Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag + 4));
|
| @@ -325,8 +326,8 @@ void StringCharLoadGenerator::Generate(MacroAssembler* masm,
|
| // Handle slices.
|
| Label indirect_string_loaded;
|
| __ ldr(result, FieldMemOperand(string, SlicedString::kOffsetOffset));
|
| - __ add(index, index, Operand(result, ASR, kSmiTagSize));
|
| __ ldr(string, FieldMemOperand(string, SlicedString::kParentOffset));
|
| + __ add(index, index, Operand(result, ASR, kSmiTagSize));
|
| __ jmp(&indirect_string_loaded);
|
|
|
| // Handle cons strings.
|
| @@ -336,8 +337,7 @@ void StringCharLoadGenerator::Generate(MacroAssembler* masm,
|
| // the string.
|
| __ bind(&cons_string);
|
| __ ldr(result, FieldMemOperand(string, ConsString::kSecondOffset));
|
| - __ LoadRoot(ip, Heap::kEmptyStringRootIndex);
|
| - __ cmp(result, ip);
|
| + __ CompareRoot(result, Heap::kEmptyStringRootIndex);
|
| __ b(ne, call_runtime);
|
| // Get the first of the two strings and load its instance type.
|
| __ ldr(string, FieldMemOperand(string, ConsString::kFirstOffset));
|
|
|