Index: src/arm/codegen-arm.cc |
=================================================================== |
--- src/arm/codegen-arm.cc (revision 5007) |
+++ src/arm/codegen-arm.cc (working copy) |
@@ -8043,7 +8043,11 @@ |
// The code below for writing into heap numbers isn't capable of writing |
// the register as an unsigned int so we go to slow case if we hit this |
// case. |
- __ b(mi, &slow); |
+ if (CpuFeatures::IsSupported(VFP3)) { |
+ __ b(mi, &result_not_a_smi); |
+ } else { |
+ __ b(mi, &slow); |
+ } |
break; |
case Token::SHL: |
// Use only the 5 least significant bits of the shift count. |
@@ -8087,10 +8091,24 @@ |
// result. |
__ mov(r0, Operand(r5)); |
- // Tail call that writes the int32 in r2 to the heap number in r0, using |
- // r3 as scratch. r0 is preserved and returned. |
- WriteInt32ToHeapNumberStub stub(r2, r0, r3); |
- __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); |
+ if (CpuFeatures::IsSupported(VFP3)) { |
+ // Convert the int32 in r2 to the heap number in r0. r3 is corrupted. |
+ CpuFeatures::Scope scope(VFP3); |
+ __ vmov(s0, r2); |
+ if (op_ == Token::SHR) { |
+ __ vcvt_f64_u32(d0, s0); |
+ } else { |
+ __ vcvt_f64_s32(d0, s0); |
+ } |
+ __ sub(r3, r0, Operand(kHeapObjectTag)); |
+ __ vstr(d0, r3, HeapNumber::kValueOffset); |
+ __ Ret(); |
+ } else { |
+ // Tail call that writes the int32 in r2 to the heap number in r0, using |
+ // r3 as scratch. r0 is preserved and returned. |
+ WriteInt32ToHeapNumberStub stub(r2, r0, r3); |
+ __ TailCallStub(&stub); |
+ } |
if (mode_ != NO_OVERWRITE) { |
__ bind(&have_to_allocate); |
@@ -8939,12 +8957,21 @@ |
__ mov(r0, Operand(r2)); |
} |
- // WriteInt32ToHeapNumberStub does not trigger GC, so we do not |
- // have to set up a frame. |
- WriteInt32ToHeapNumberStub stub(r1, r0, r2); |
- __ push(lr); |
- __ Call(stub.GetCode(), RelocInfo::CODE_TARGET); |
- __ pop(lr); |
+ if (CpuFeatures::IsSupported(VFP3)) { |
+ // Convert the int32 in r1 to the heap number in r0. r2 is corrupted. |
+ CpuFeatures::Scope scope(VFP3); |
+ __ vmov(s0, r1); |
+ __ vcvt_f64_s32(d0, s0); |
+ __ sub(r2, r0, Operand(kHeapObjectTag)); |
+ __ vstr(d0, r2, HeapNumber::kValueOffset); |
+ } else { |
+ // WriteInt32ToHeapNumberStub does not trigger GC, so we do not |
+ // have to set up a frame. |
+ WriteInt32ToHeapNumberStub stub(r1, r0, r2); |
+ __ push(lr); |
+ __ Call(stub.GetCode(), RelocInfo::CODE_TARGET); |
+ __ pop(lr); |
+ } |
} else { |
UNIMPLEMENTED(); |
} |