Index: src/arm/codegen-arm.cc |
=================================================================== |
--- src/arm/codegen-arm.cc (revision 4988) |
+++ src/arm/codegen-arm.cc (working copy) |
@@ -7957,10 +7957,20 @@ |
// 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); |
+ __ 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); |
@@ -8809,12 +8819,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(); |
} |