| 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();
|
| }
|
|
|