Chromium Code Reviews| Index: src/arm/codegen-arm.cc |
| diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc |
| index 3371e8a6b1dddeabf991a81076f545d96c39aba0..102de820d45cb0ce4be7754bb6ecb27ec8dadf4b 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,11 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble( |
| __ bind(&loop); |
| __ ldr(r9, MemOperand(r3, 4, PostIndex)); |
| // r9: current element |
| - __ JumpIfNotSmi(r9, &convert_hole); |
| + STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0); |
|
ulan
2012/01/27 13:19:11
Can we introduce UntagAndJumpIfNotSmi for these tr
|
| + __ mov(r9, Operand(r9, ASR, kSmiShiftSize), SetCC); |
| + __ b(cs, &convert_hole); // Non-smi sets shifter carry. |
| // Normal smi, convert to double and store. |
| - __ SmiUntag(r9); |
| if (vfp3_supported) { |
| CpuFeatures::Scope scope(VFP3); |
| __ vmov(s0, r9); |
| @@ -181,6 +182,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 +212,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 +223,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 +328,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,10 +339,9 @@ void StringCharLoadGenerator::Generate(MacroAssembler* masm, |
| // the string. |
| __ bind(&cons_string); |
| __ ldr(result, FieldMemOperand(string, ConsString::kSecondOffset)); |
| - __ LoadRoot(ip, Heap::kEmptyStringRootIndex); |
| - __ cmp(result, ip); |
| - __ b(ne, call_runtime); |
| + __ CompareRoot(result, Heap::kEmptyStringRootIndex); |
| // Get the first of the two strings and load its instance type. |
| + __ b(ne, call_runtime); // This branch refers to the previous CompareRoot. |
|
ulan
2012/01/27 13:19:11
This branch should be above the comment in line 34
|
| __ ldr(string, FieldMemOperand(string, ConsString::kFirstOffset)); |
| __ bind(&indirect_string_loaded); |