Index: src/arm/codegen-arm.cc |
=================================================================== |
--- src/arm/codegen-arm.cc (revision 4889) |
+++ src/arm/codegen-arm.cc (working copy) |
@@ -4706,7 +4706,8 @@ |
Label slow_allocate_heapnumber; |
Label heapnumber_allocated; |
- __ AllocateHeapNumber(r4, r1, r2, &slow_allocate_heapnumber); |
+ __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex); |
+ __ AllocateHeapNumber(r4, r1, r2, r6, &slow_allocate_heapnumber); |
__ jmp(&heapnumber_allocated); |
__ bind(&slow_allocate_heapnumber); |
@@ -7363,12 +7364,16 @@ |
bool use_fp_registers = CpuFeatures::IsSupported(VFP3) && Token::MOD != op_; |
ASSERT((lhs.is(r0) && rhs.is(r1)) || (lhs.is(r1) && rhs.is(r0))); |
+ Register heap_number_map = r6; |
if (ShouldGenerateSmiCode()) { |
+ __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
+ |
// Smi-smi case (overflow). |
// Since both are Smis there is no heap number to overwrite, so allocate. |
- // The new heap number is in r5. r6 and r7 are scratch. |
- __ AllocateHeapNumber(r5, r6, r7, lhs.is(r0) ? &slow_reverse : &slow); |
+ // The new heap number is in r5. r3 and r7 are scratch. |
+ __ AllocateHeapNumber( |
+ r5, r3, r7, heap_number_map, lhs.is(r0) ? &slow_reverse : &slow); |
// If we have floating point hardware, inline ADD, SUB, MUL, and DIV, |
// using registers d7 and d6 for the double values. |
@@ -7381,14 +7386,14 @@ |
__ vmov(s13, r7); |
__ vcvt_f64_s32(d6, s13); |
} else { |
- // Write Smi from rhs to r3 and r2 in double format. r6 is scratch. |
+ // Write Smi from rhs to r3 and r2 in double format. r3 is scratch. |
__ mov(r7, Operand(rhs)); |
- ConvertToDoubleStub stub1(r3, r2, r7, r6); |
+ ConvertToDoubleStub stub1(r3, r2, r7, r9); |
__ push(lr); |
__ Call(stub1.GetCode(), RelocInfo::CODE_TARGET); |
- // Write Smi from lhs to r1 and r0 in double format. r6 is scratch. |
+ // Write Smi from lhs to r1 and r0 in double format. r9 is scratch. |
__ mov(r7, Operand(lhs)); |
- ConvertToDoubleStub stub2(r1, r0, r7, r6); |
+ ConvertToDoubleStub stub2(r1, r0, r7, r9); |
__ Call(stub2.GetCode(), RelocInfo::CODE_TARGET); |
__ pop(lr); |
} |
@@ -7397,6 +7402,7 @@ |
// We branch here if at least one of r0 and r1 is not a Smi. |
__ bind(not_smi); |
+ __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
// After this point we have the left hand side in r1 and the right hand side |
// in r0. |
@@ -7419,18 +7425,22 @@ |
default: |
break; |
} |
+ // Restore heap number map register. |
+ __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
} |
if (mode_ == NO_OVERWRITE) { |
// In the case where there is no chance of an overwritable float we may as |
// well do the allocation immediately while r0 and r1 are untouched. |
- __ AllocateHeapNumber(r5, r6, r7, &slow); |
+ __ AllocateHeapNumber(r5, r3, r7, heap_number_map, &slow); |
} |
// Move r0 to a double in r2-r3. |
__ tst(r0, Operand(kSmiTagMask)); |
__ b(eq, &r0_is_smi); // It's a Smi so don't check it's a heap number. |
- __ CompareObjectType(r0, r4, r4, HEAP_NUMBER_TYPE); |
+ __ ldr(r4, FieldMemOperand(r0, HeapObject::kMapOffset)); |
+ __ AssertRegisterIsRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
+ __ cmp(r4, heap_number_map); |
__ b(ne, &slow); |
if (mode_ == OVERWRITE_RIGHT) { |
__ mov(r5, Operand(r0)); // Overwrite this heap number. |
@@ -7448,7 +7458,7 @@ |
__ bind(&r0_is_smi); |
if (mode_ == OVERWRITE_RIGHT) { |
// We can't overwrite a Smi so get address of new heap number into r5. |
- __ AllocateHeapNumber(r5, r6, r7, &slow); |
+ __ AllocateHeapNumber(r5, r4, r7, heap_number_map, &slow); |
} |
if (use_fp_registers) { |
@@ -7460,7 +7470,7 @@ |
} else { |
// Write Smi from r0 to r3 and r2 in double format. |
__ mov(r7, Operand(r0)); |
- ConvertToDoubleStub stub3(r3, r2, r7, r6); |
+ ConvertToDoubleStub stub3(r3, r2, r7, r4); |
__ push(lr); |
__ Call(stub3.GetCode(), RelocInfo::CODE_TARGET); |
__ pop(lr); |
@@ -7473,6 +7483,8 @@ |
__ tst(r1, Operand(kSmiTagMask)); |
__ b(ne, &r1_is_not_smi); |
GenerateTypeTransition(masm); |
+ // Restore heap number map register. |
+ __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
__ jmp(&r1_is_smi); |
} |
@@ -7482,7 +7494,9 @@ |
__ tst(r1, Operand(kSmiTagMask)); |
__ b(eq, &r1_is_smi); // It's a Smi so don't check it's a heap number. |
__ bind(&r1_is_not_smi); |
- __ CompareObjectType(r1, r4, r4, HEAP_NUMBER_TYPE); |
+ __ ldr(r4, FieldMemOperand(r1, HeapNumber::kMapOffset)); |
+ __ AssertRegisterIsRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
+ __ cmp(r4, heap_number_map); |
__ b(ne, &slow); |
if (mode_ == OVERWRITE_LEFT) { |
__ mov(r5, Operand(r1)); // Overwrite this heap number. |
@@ -7500,7 +7514,7 @@ |
__ bind(&r1_is_smi); |
if (mode_ == OVERWRITE_LEFT) { |
// We can't overwrite a Smi so get address of new heap number into r5. |
- __ AllocateHeapNumber(r5, r6, r7, &slow); |
+ __ AllocateHeapNumber(r5, r4, r7, heap_number_map, &slow); |
} |
if (use_fp_registers) { |
@@ -7512,7 +7526,7 @@ |
} else { |
// Write Smi from r1 to r1 and r0 in double format. |
__ mov(r7, Operand(r1)); |
- ConvertToDoubleStub stub4(r1, r0, r7, r6); |
+ ConvertToDoubleStub stub4(r1, r0, r7, r9); |
__ push(lr); |
__ Call(stub4.GetCode(), RelocInfo::CODE_TARGET); |
__ pop(lr); |
@@ -7573,13 +7587,14 @@ |
} |
} |
- |
if (lhs.is(r0)) { |
__ b(&slow); |
__ bind(&slow_reverse); |
__ Swap(r0, r1, ip); |
} |
+ heap_number_map = no_reg; // Don't use this any more from here on. |
+ |
// We jump to here if something goes wrong (one param is not a number of any |
// sort or new-space allocation fails). |
__ bind(&slow); |
@@ -7745,9 +7760,13 @@ |
Label rhs_is_smi, lhs_is_smi; |
Label done_checking_rhs, done_checking_lhs; |
+ Register heap_number_map = r6; |
+ __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
+ |
__ tst(lhs, Operand(kSmiTagMask)); |
__ b(eq, &lhs_is_smi); // It's a Smi so don't check it's a heap number. |
- __ CompareObjectType(lhs, r4, r4, HEAP_NUMBER_TYPE); |
+ __ ldr(r4, FieldMemOperand(lhs, HeapNumber::kMapOffset)); |
+ __ cmp(r4, heap_number_map); |
__ b(ne, &slow); |
GetInt32(masm, lhs, r3, r5, r4, &slow); |
__ jmp(&done_checking_lhs); |
@@ -7757,7 +7776,8 @@ |
__ tst(rhs, Operand(kSmiTagMask)); |
__ b(eq, &rhs_is_smi); // It's a Smi so don't check it's a heap number. |
- __ CompareObjectType(rhs, r4, r4, HEAP_NUMBER_TYPE); |
+ __ ldr(r4, FieldMemOperand(rhs, HeapNumber::kMapOffset)); |
+ __ cmp(r4, heap_number_map); |
__ b(ne, &slow); |
GetInt32(masm, rhs, r2, r5, r4, &slow); |
__ jmp(&done_checking_rhs); |
@@ -7817,8 +7837,8 @@ |
break; |
} |
case NO_OVERWRITE: { |
- // Get a new heap number in r5. r6 and r7 are scratch. |
- __ AllocateHeapNumber(r5, r6, r7, &slow); |
+ // Get a new heap number in r5. r4 and r7 are scratch. |
+ __ AllocateHeapNumber(r5, r4, r7, heap_number_map, &slow); |
} |
default: break; |
} |
@@ -7837,8 +7857,8 @@ |
if (mode_ != NO_OVERWRITE) { |
__ bind(&have_to_allocate); |
- // Get a new heap number in r5. r6 and r7 are scratch. |
- __ AllocateHeapNumber(r5, r6, r7, &slow); |
+ // Get a new heap number in r5. r4 and r7 are scratch. |
+ __ AllocateHeapNumber(r5, r4, r7, heap_number_map, &slow); |
__ jmp(&got_a_heap_number); |
} |
@@ -8409,6 +8429,9 @@ |
void GenericUnaryOpStub::Generate(MacroAssembler* masm) { |
Label slow, done; |
+ Register heap_number_map = r6; |
+ __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
+ |
if (op_ == Token::SUB) { |
// Check whether the value is a smi. |
Label try_float; |
@@ -8429,7 +8452,9 @@ |
__ b(&done); |
__ bind(&try_float); |
- __ CompareObjectType(r0, r1, r1, HEAP_NUMBER_TYPE); |
+ __ ldr(r1, FieldMemOperand(r0, HeapObject::kMapOffset)); |
+ __ AssertRegisterIsRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
+ __ cmp(r1, heap_number_map); |
__ b(ne, &slow); |
// r0 is a heap number. Get a new heap number in r1. |
if (overwrite_) { |
@@ -8437,7 +8462,7 @@ |
__ eor(r2, r2, Operand(HeapNumber::kSignMask)); // Flip sign. |
__ str(r2, FieldMemOperand(r0, HeapNumber::kExponentOffset)); |
} else { |
- __ AllocateHeapNumber(r1, r2, r3, &slow); |
+ __ AllocateHeapNumber(r1, r2, r3, r6, &slow); |
__ ldr(r3, FieldMemOperand(r0, HeapNumber::kMantissaOffset)); |
__ ldr(r2, FieldMemOperand(r0, HeapNumber::kExponentOffset)); |
__ str(r3, FieldMemOperand(r1, HeapNumber::kMantissaOffset)); |
@@ -8447,7 +8472,9 @@ |
} |
} else if (op_ == Token::BIT_NOT) { |
// Check if the operand is a heap number. |
- __ CompareObjectType(r0, r1, r1, HEAP_NUMBER_TYPE); |
+ __ ldr(r1, FieldMemOperand(r0, HeapObject::kMapOffset)); |
+ __ AssertRegisterIsRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
+ __ cmp(r1, heap_number_map); |
__ b(ne, &slow); |
// Convert the heap number is r0 to an untagged integer in r1. |
@@ -8467,7 +8494,7 @@ |
// Allocate a fresh heap number, but don't overwrite r0 until |
// we're sure we can do it without going through the slow case |
// that needs the value in r0. |
- __ AllocateHeapNumber(r2, r3, r4, &slow); |
+ __ AllocateHeapNumber(r2, r3, r4, r6, &slow); |
__ mov(r0, Operand(r2)); |
} |