Index: src/arm/code-stubs-arm.cc |
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
index e9b7cf0ca09c5baabec58f3243e2c0cd47e16576..a4cad52b6d7bad3f7294e63defd2ee3521283040 100644 |
--- a/src/arm/code-stubs-arm.cc |
+++ b/src/arm/code-stubs-arm.cc |
@@ -599,8 +599,8 @@ void FloatingPointHelper::LoadSmis(MacroAssembler* masm, |
FloatingPointHelper::Destination destination, |
Register scratch1, |
Register scratch2) { |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
__ mov(scratch1, Operand(r0, ASR, kSmiTagSize)); |
__ vmov(d7.high(), scratch1); |
__ vcvt_f64_s32(d7, d7.high()); |
@@ -669,9 +669,9 @@ void FloatingPointHelper::LoadNumber(MacroAssembler* masm, |
__ JumpIfNotHeapNumber(object, heap_number_map, scratch1, not_number); |
// Handle loading a double from a heap number. |
- if (CpuFeatures::IsSupported(VFP3) && |
+ if (CpuFeatures::IsSupported(VFP2) && |
destination == kVFPRegisters) { |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
// Load the double from tagged HeapNumber to double register. |
__ sub(scratch1, object, Operand(kHeapObjectTag)); |
__ vldr(dst, scratch1, HeapNumber::kValueOffset); |
@@ -684,8 +684,8 @@ void FloatingPointHelper::LoadNumber(MacroAssembler* masm, |
// Handle loading a double from a smi. |
__ bind(&is_smi); |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
// Convert smi to double using VFP instructions. |
__ vmov(dst.high(), scratch1); |
__ vcvt_f64_s32(dst, dst.high()); |
@@ -762,8 +762,8 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm, |
Label done; |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
__ vmov(single_scratch, int_scratch); |
__ vcvt_f64_s32(double_dst, single_scratch); |
if (destination == kCoreRegisters) { |
@@ -856,8 +856,8 @@ void FloatingPointHelper::LoadNumberAsInt32Double(MacroAssembler* masm, |
__ JumpIfNotHeapNumber(object, heap_number_map, scratch1, not_int32); |
// Load the number. |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
// Load the double value. |
__ sub(scratch1, object, Operand(kHeapObjectTag)); |
__ vldr(double_dst, scratch1, HeapNumber::kValueOffset); |
@@ -927,8 +927,8 @@ void FloatingPointHelper::LoadNumberAsInt32(MacroAssembler* masm, |
// Object is a heap number. |
// Convert the floating point value to a 32-bit integer. |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
SwVfpRegister single_scratch = double_scratch.low(); |
// Load the double value. |
__ sub(scratch1, object, Operand(kHeapObjectTag)); |
@@ -1058,7 +1058,7 @@ void FloatingPointHelper::CallCCodeForDoubleOperation( |
__ push(lr); |
__ PrepareCallCFunction(0, 2, scratch); |
if (masm->use_eabi_hardfloat()) { |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
__ vmov(d0, r0, r1); |
__ vmov(d1, r2, r3); |
} |
@@ -1070,7 +1070,7 @@ void FloatingPointHelper::CallCCodeForDoubleOperation( |
// Store answer in the overwritable heap number. Double returned in |
// registers r0 and r1 or in d0. |
if (masm->use_eabi_hardfloat()) { |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
__ vstr(d0, |
FieldMemOperand(heap_number_result, HeapNumber::kValueOffset)); |
} else { |
@@ -1289,9 +1289,9 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm, |
} |
// Lhs is a smi, rhs is a number. |
- if (CpuFeatures::IsSupported(VFP3)) { |
+ if (CpuFeatures::IsSupported(VFP2)) { |
// Convert lhs to a double in d7. |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
__ SmiToDoubleVFPRegister(lhs, d7, r7, s15); |
// Load the double from rhs, tagged HeapNumber r0, to d6. |
__ sub(r7, rhs, Operand(kHeapObjectTag)); |
@@ -1329,8 +1329,8 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm, |
} |
// Rhs is a smi, lhs is a heap number. |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
// Load the double from lhs, tagged HeapNumber r1, to d7. |
__ sub(r7, lhs, Operand(kHeapObjectTag)); |
__ vldr(d7, r7, HeapNumber::kValueOffset); |
@@ -1442,7 +1442,7 @@ static void EmitTwoNonNanDoubleComparison(MacroAssembler* masm, |
__ push(lr); |
__ PrepareCallCFunction(0, 2, r5); |
if (masm->use_eabi_hardfloat()) { |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
__ vmov(d0, r0, r1); |
__ vmov(d1, r2, r3); |
} |
@@ -1517,8 +1517,8 @@ static void EmitCheckForTwoHeapNumbers(MacroAssembler* masm, |
// Both are heap numbers. Load them up then jump to the code we have |
// for that. |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
__ sub(r7, rhs, Operand(kHeapObjectTag)); |
__ vldr(d6, r7, HeapNumber::kValueOffset); |
__ sub(r7, lhs, Operand(kHeapObjectTag)); |
@@ -1607,8 +1607,8 @@ void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm, |
Label load_result_from_cache; |
if (!object_is_smi) { |
__ JumpIfSmi(object, &is_smi); |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
__ CheckMap(object, |
scratch1, |
Heap::kHeapNumberMapRootIndex, |
@@ -1739,9 +1739,9 @@ void CompareStub::Generate(MacroAssembler* masm) { |
// The arguments have been converted to doubles and stored in d6 and d7, if |
// VFP3 is supported, or in r0, r1, r2, and r3. |
Isolate* isolate = masm->isolate(); |
- if (CpuFeatures::IsSupported(VFP3)) { |
+ if (CpuFeatures::IsSupported(VFP2)) { |
__ bind(&lhs_not_nan); |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
Label no_nan; |
// ARMv7 VFP3 instructions to implement double precision comparison. |
__ VFPCompareAndSetFlags(d7, d6); |
@@ -1860,7 +1860,7 @@ void ToBooleanStub::Generate(MacroAssembler* masm) { |
// This stub overrides SometimesSetsUpAFrame() to return false. That means |
// we cannot call anything that could cause a GC from this stub. |
// This stub uses VFP3 instructions. |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
Label patch; |
const Register map = r9.is(tos_) ? r7 : r9; |
@@ -1972,7 +1972,7 @@ void StoreBufferOverflowStub::Generate(MacroAssembler* masm) { |
// restore them. |
__ stm(db_w, sp, kCallerSaved | lr.bit()); |
if (save_doubles_ == kSaveFPRegs) { |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
__ sub(sp, sp, Operand(kDoubleSize * DwVfpRegister::kNumRegisters)); |
for (int i = 0; i < DwVfpRegister::kNumRegisters; i++) { |
DwVfpRegister reg = DwVfpRegister::from_code(i); |
@@ -1990,7 +1990,7 @@ void StoreBufferOverflowStub::Generate(MacroAssembler* masm) { |
ExternalReference::store_buffer_overflow_function(masm->isolate()), |
argument_count); |
if (save_doubles_ == kSaveFPRegs) { |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
for (int i = 0; i < DwVfpRegister::kNumRegisters; i++) { |
DwVfpRegister reg = DwVfpRegister::from_code(i); |
__ vldr(reg, MemOperand(sp, i * kDoubleSize)); |
@@ -2220,9 +2220,9 @@ void UnaryOpStub::GenerateHeapNumberCodeBitNot( |
__ mov(r0, r2); // Move newly allocated heap number to r0. |
} |
- if (CpuFeatures::IsSupported(VFP3)) { |
+ if (CpuFeatures::IsSupported(VFP2)) { |
// Convert the int32 in r1 to the heap number in r0. r2 is corrupted. |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
__ vmov(s0, r1); |
__ vcvt_f64_s32(d0, s0); |
__ sub(r2, r0, Operand(kHeapObjectTag)); |
@@ -2522,7 +2522,7 @@ void BinaryOpStub::GenerateFPOperation(MacroAssembler* masm, |
// Load left and right operands into d6 and d7 or r0/r1 and r2/r3 |
// depending on whether VFP3 is available or not. |
FloatingPointHelper::Destination destination = |
- CpuFeatures::IsSupported(VFP3) && |
+ CpuFeatures::IsSupported(VFP2) && |
op_ != Token::MOD ? |
FloatingPointHelper::kVFPRegisters : |
FloatingPointHelper::kCoreRegisters; |
@@ -2549,7 +2549,7 @@ void BinaryOpStub::GenerateFPOperation(MacroAssembler* masm, |
// Using VFP registers: |
// d6: Left value |
// d7: Right value |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
switch (op_) { |
case Token::ADD: |
__ vadd(d5, d6, d7); |
@@ -2638,7 +2638,7 @@ void BinaryOpStub::GenerateFPOperation(MacroAssembler* masm, |
// 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. |
- if (CpuFeatures::IsSupported(VFP3)) { |
+ if (CpuFeatures::IsSupported(VFP2)) { |
__ b(mi, &result_not_a_smi); |
} else { |
__ b(mi, not_numbers); |
@@ -2677,10 +2677,10 @@ void BinaryOpStub::GenerateFPOperation(MacroAssembler* masm, |
// result. |
__ mov(r0, Operand(r5)); |
- if (CpuFeatures::IsSupported(VFP3)) { |
+ if (CpuFeatures::IsSupported(VFP2)) { |
// Convert the int32 in r2 to the heap number in r0. r3 is corrupted. As |
// mentioned above SHR needs to always produce a positive result. |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
__ vmov(s0, r2); |
if (op_ == Token::SHR) { |
__ vcvt_f64_u32(d0, s0); |
@@ -2839,7 +2839,7 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) { |
// Jump to type transition if they are not. The registers r0 and r1 (right |
// and left) are preserved for the runtime call. |
FloatingPointHelper::Destination destination = |
- (CpuFeatures::IsSupported(VFP3) && op_ != Token::MOD) |
+ (CpuFeatures::IsSupported(VFP2) && op_ != Token::MOD) |
? FloatingPointHelper::kVFPRegisters |
: FloatingPointHelper::kCoreRegisters; |
@@ -2867,7 +2867,7 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) { |
&transition); |
if (destination == FloatingPointHelper::kVFPRegisters) { |
- CpuFeatures::Scope scope(VFP3); |
+ CpuFeatures::Scope scope(VFP2); |
Label return_heap_number; |
switch (op_) { |
case Token::ADD: |
@@ -3034,9 +3034,9 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) { |
// We only get a negative result if the shift value (r2) is 0. |
// This result cannot be respresented as a signed 32-bit integer, try |
// to return a heap number if we can. |
- // The non vfp3 code does not support this special case, so jump to |
+ // The non vfp2 code does not support this special case, so jump to |
// runtime if we don't support it. |
- if (CpuFeatures::IsSupported(VFP3)) { |
+ if (CpuFeatures::IsSupported(VFP2)) { |
__ b(mi, (result_type_ <= BinaryOpIC::INT32) |
? &transition |
: &return_heap_number); |
@@ -3071,8 +3071,8 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) { |
scratch2, |
&call_runtime); |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
if (op_ != Token::SHR) { |
// Convert the result to a floating point value. |
__ vmov(double_scratch.low(), r2); |
@@ -3301,8 +3301,8 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
const Register cache_entry = r0; |
const bool tagged = (argument_type_ == TAGGED); |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
if (tagged) { |
// Argument is a number and is on stack and in r0. |
// Load argument and check if it is a smi. |
@@ -3403,8 +3403,8 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
ExternalReference(RuntimeFunction(), masm->isolate()); |
__ TailCallExternalReference(runtime_function, 1, 1); |
} else { |
- ASSERT(CpuFeatures::IsSupported(VFP3)); |
- CpuFeatures::Scope scope(VFP3); |
+ ASSERT(CpuFeatures::IsSupported(VFP2)); |
+ CpuFeatures::Scope scope(VFP2); |
Label no_update; |
Label skip_cache; |
@@ -3465,6 +3465,7 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
void TranscendentalCacheStub::GenerateCallCFunction(MacroAssembler* masm, |
Register scratch) { |
+ ASSERT(CpuFeatures::IsEnabled(VFP2)); |
Isolate* isolate = masm->isolate(); |
__ push(lr); |
@@ -3525,7 +3526,7 @@ void InterruptStub::Generate(MacroAssembler* masm) { |
void MathPowStub::Generate(MacroAssembler* masm) { |
- CpuFeatures::Scope vfp3_scope(VFP3); |
+ CpuFeatures::Scope vfp2_scope(VFP2); |
const Register base = r1; |
const Register exponent = r2; |
const Register heapnumbermap = r5; |
@@ -3624,7 +3625,7 @@ void MathPowStub::Generate(MacroAssembler* masm) { |
// Add +0 to convert -0 to +0. |
__ vadd(double_scratch, double_base, kDoubleRegZero); |
- __ vmov(double_result, 1); |
+ __ vmov(double_result, 1.0); |
__ vsqrt(double_scratch, double_scratch); |
__ vdiv(double_result, double_result, double_scratch); |
__ jmp(&done); |
@@ -3981,8 +3982,8 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
// Save callee-saved registers (incl. cp and fp), sp, and lr |
__ stm(db_w, sp, kCalleeSaved | lr.bit()); |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
// Save callee-saved vfp registers. |
__ vstm(db_w, sp, kFirstCalleeSavedDoubleReg, kLastCalleeSavedDoubleReg); |
// Set up the reserved register for 0.0. |
@@ -3997,7 +3998,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
// Set up argv in r4. |
int offset_to_argv = (kNumCalleeSaved + 1) * kPointerSize; |
- if (CpuFeatures::IsSupported(VFP3)) { |
+ if (CpuFeatures::IsSupported(VFP2)) { |
offset_to_argv += kNumDoubleCalleeSaved * kDoubleSize; |
} |
__ ldr(r4, MemOperand(sp, offset_to_argv)); |
@@ -4135,8 +4136,8 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
} |
#endif |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
// Restore callee-saved vfp registers. |
__ vldm(ia_w, sp, kFirstCalleeSavedDoubleReg, kLastCalleeSavedDoubleReg); |
} |
@@ -6663,8 +6664,8 @@ void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) { |
// Inlining the double comparison and falling back to the general compare |
// stub if NaN is involved or VFP3 is unsupported. |
- if (CpuFeatures::IsSupported(VFP3)) { |
- CpuFeatures::Scope scope(VFP3); |
+ if (CpuFeatures::IsSupported(VFP2)) { |
+ CpuFeatures::Scope scope(VFP2); |
// Load left and right operand |
__ sub(r2, r1, Operand(kHeapObjectTag)); |