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 93dda9d8fe7738095c8fcdec6327a161fbf3391d..00c36c6ad985961bd19ca3d1918d97a7d8c9584b 100644 |
| --- a/src/arm/code-stubs-arm.cc |
| +++ b/src/arm/code-stubs-arm.cc |
| @@ -745,34 +745,21 @@ void FloatingPointHelper::ConvertNumberToInt32(MacroAssembler* masm, |
| Register scratch1, |
| Register scratch2, |
| Register scratch3, |
| - DwVfpRegister double_scratch, |
| + DwVfpRegister double_scratch1, |
| + DwVfpRegister double_scratch2, |
| Label* not_number) { |
| + Label done; |
| __ AssertRootValue(heap_number_map, |
| Heap::kHeapNumberMapRootIndex, |
| "HeapNumberMap register clobbered."); |
| - Label done; |
| - Label not_in_int32_range; |
| __ UntagAndJumpIfSmi(dst, object, &done); |
| __ ldr(scratch1, FieldMemOperand(object, HeapNumber::kMapOffset)); |
| __ cmp(scratch1, heap_number_map); |
| __ b(ne, not_number); |
| - __ ConvertToInt32(object, |
| - dst, |
| - scratch1, |
| - scratch2, |
| - double_scratch, |
| - ¬_in_int32_range); |
| - __ jmp(&done); |
| - |
| - __ bind(¬_in_int32_range); |
| - __ ldr(scratch1, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
| - __ ldr(scratch2, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
| - |
| - __ EmitOutOfInt32RangeTruncate(dst, |
| - scratch1, |
| - scratch2, |
| - scratch3); |
| + __ ECMAConvertNumberToInt32(object, dst, |
| + scratch1, scratch2, scratch3, |
| + double_scratch1, double_scratch2); |
| __ bind(&done); |
| } |
| @@ -2290,18 +2277,16 @@ void UnaryOpStub::GenerateHeapNumberCodeSub(MacroAssembler* masm, |
| } |
| -void UnaryOpStub::GenerateHeapNumberCodeBitNot( |
| - MacroAssembler* masm, Label* slow) { |
| - Label impossible; |
| - |
| +void UnaryOpStub::GenerateHeapNumberCodeBitNot(MacroAssembler* masm, |
| + Label* slow) { |
| EmitCheckForHeapNumber(masm, r0, r1, r6, slow); |
| - // Convert the heap number is r0 to an untagged integer in r1. |
| - __ ConvertToInt32(r0, r1, r2, r3, d0, slow); |
| + // Convert the heap number in r0 to an untagged integer in r1. |
| + __ ECMAConvertNumberToInt32(r0, r1, r2, r3, r4, d0, d1); |
| // Do the bitwise operation and check if the result fits in a smi. |
| Label try_float; |
| __ mvn(r1, Operand(r1)); |
| - __ add(r2, r1, Operand(0x40000000), SetCC); |
| + __ cmn(r1, Operand(0x40000000)); |
| __ b(mi, &try_float); |
| // Tag the result as a smi and we're done. |
| @@ -2313,27 +2298,22 @@ void UnaryOpStub::GenerateHeapNumberCodeBitNot( |
| if (mode_ == UNARY_NO_OVERWRITE) { |
| Label slow_allocate_heapnumber, heapnumber_allocated; |
| // Allocate a new heap number without zapping r0, which we need if it fails. |
|
ulan
2013/03/11 15:11:03
This comment is no longer valid.
Rodolph Perfetta
2013/03/12 11:24:45
Done.
|
| - __ AllocateHeapNumber(r2, r3, r4, r6, &slow_allocate_heapnumber); |
| + __ AllocateHeapNumber(r0, r3, r4, r6, &slow_allocate_heapnumber); |
| __ jmp(&heapnumber_allocated); |
| __ bind(&slow_allocate_heapnumber); |
| { |
| FrameScope scope(masm, StackFrame::INTERNAL); |
| - __ push(r0); // Push the heap number, not the untagged int32. |
| + // Push the lower bit of the result (left shifted to look like a smi). |
| + __ mov(r2, Operand(r1, LSL, 31)); |
| + // Push the 31 high bits (bit 0 cleared to look like a smi). |
| + __ bic(r1, r1, Operand(1)); |
| + __ Push(r2, r1); |
| __ CallRuntime(Runtime::kNumberAlloc, 0); |
| - __ mov(r2, r0); // Move the new heap number into r2. |
| - // Get the heap number into r0, now that the new heap number is in r2. |
| - __ pop(r0); |
| + __ Pop(r2, r1); // Restore the result. |
| + __ orr(r1, r1, Operand(r2, LSR, 31)); |
| } |
| - |
| - // Convert the heap number in r0 to an untagged integer in r1. |
| - // This can't go slow-case because it's the same number we already |
| - // converted once again. |
| - __ ConvertToInt32(r0, r1, r3, r4, d0, &impossible); |
| - __ mvn(r1, Operand(r1)); |
| - |
| __ bind(&heapnumber_allocated); |
| - __ mov(r0, r2); // Move newly allocated heap number to r0. |
| } |
| if (CpuFeatures::IsSupported(VFP2)) { |
| @@ -2341,8 +2321,7 @@ void UnaryOpStub::GenerateHeapNumberCodeBitNot( |
| CpuFeatureScope scope(masm, VFP2); |
| __ vmov(s0, r1); |
| __ vcvt_f64_s32(d0, s0); |
| - __ sub(r2, r0, Operand(kHeapObjectTag)); |
| - __ vstr(d0, r2, HeapNumber::kValueOffset); |
| + __ vstr(d0, FieldMemOperand(r0, HeapNumber::kValueOffset)); |
| __ Ret(); |
| } else { |
| // WriteInt32ToHeapNumberStub does not trigger GC, so we do not |
| @@ -2350,11 +2329,6 @@ void UnaryOpStub::GenerateHeapNumberCodeBitNot( |
| WriteInt32ToHeapNumberStub stub(r1, r0, r2); |
| __ Jump(stub.GetCode(masm->isolate()), RelocInfo::CODE_TARGET); |
| } |
| - |
| - __ bind(&impossible); |
| - if (FLAG_debug_code) { |
| - __ stop("Incorrect assumption in bit-not stub"); |
| - } |
| } |
| @@ -2786,6 +2760,7 @@ void BinaryOpStub_GenerateFPOperation(MacroAssembler* masm, |
| scratch2, |
| scratch3, |
| d0, |
| + d1, |
| not_numbers); |
| FloatingPointHelper::ConvertNumberToInt32(masm, |
| right, |
| @@ -2795,6 +2770,7 @@ void BinaryOpStub_GenerateFPOperation(MacroAssembler* masm, |
| scratch2, |
| scratch3, |
| d0, |
| + d1, |
| not_numbers); |
| } |