| Index: src/arm/ic-arm.cc
|
| ===================================================================
|
| --- src/arm/ic-arm.cc (revision 5198)
|
| +++ src/arm/ic-arm.cc (working copy)
|
| @@ -1779,19 +1779,22 @@
|
| }
|
|
|
|
|
| -// Convert int passed in register ival to IEE 754 single precision
|
| -// floating point value and store it into register fval.
|
| +// Convert and store int passed in register ival to IEEE 754 single precision
|
| +// floating point value at memory location (dst + 4 * wordoffset)
|
| // If VFP3 is available use it for conversion.
|
| -static void ConvertIntToFloat(MacroAssembler* masm,
|
| - Register ival,
|
| - Register fval,
|
| - Register scratch1,
|
| - Register scratch2) {
|
| +static void StoreIntAsFloat(MacroAssembler* masm,
|
| + Register dst,
|
| + Register wordoffset,
|
| + Register ival,
|
| + Register fval,
|
| + Register scratch1,
|
| + Register scratch2) {
|
| if (CpuFeatures::IsSupported(VFP3)) {
|
| CpuFeatures::Scope scope(VFP3);
|
| __ vmov(s0, ival);
|
| + __ add(scratch1, dst, Operand(wordoffset, LSL, 2));
|
| __ vcvt_f32_s32(s0, s0);
|
| - __ vmov(fval, s0);
|
| + __ vstr(s0, scratch1, 0);
|
| } else {
|
| Label not_special, done;
|
| // Move sign bit from source to destination. This works because the sign
|
| @@ -1841,6 +1844,7 @@
|
| Operand(ival, LSR, kBitsPerInt - kBinary32MantissaBits));
|
|
|
| __ bind(&done);
|
| + __ str(fval, MemOperand(dst, wordoffset, LSL, 2));
|
| }
|
| }
|
|
|
| @@ -1935,9 +1939,8 @@
|
| __ str(r5, MemOperand(r3, r4, LSL, 2));
|
| break;
|
| case kExternalFloatArray:
|
| - // Need to perform int-to-float conversion.
|
| - ConvertIntToFloat(masm, r5, r6, r7, r9);
|
| - __ str(r6, MemOperand(r3, r4, LSL, 2));
|
| + // Perform int-to-float conversion and store to memory.
|
| + StoreIntAsFloat(masm, r3, r4, r5, r6, r7, r9);
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -1971,9 +1974,9 @@
|
| // include -kHeapObjectTag into it.
|
| __ sub(r5, r0, Operand(kHeapObjectTag));
|
| __ vldr(d0, r5, HeapNumber::kValueOffset);
|
| + __ add(r5, r3, Operand(r4, LSL, 2));
|
| __ vcvt_f32_f64(s0, d0);
|
| - __ vmov(r5, s0);
|
| - __ str(r5, MemOperand(r3, r4, LSL, 2));
|
| + __ vstr(s0, r5, 0);
|
| } else {
|
| // Need to perform float-to-int conversion.
|
| // Test for NaN or infinity (both give zero).
|
|
|