Index: src/arm/code-stubs-arm.cc |
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
index 4cc5ef3475ef892c9ddb05a38f996241c6e668f4..721af0e186e4a9cdb8bb3967836ea29ff3ab9ba2 100644 |
--- a/src/arm/code-stubs-arm.cc |
+++ b/src/arm/code-stubs-arm.cc |
@@ -830,14 +830,26 @@ void FloatingPointHelper::CallCCodeForDoubleOperation( |
// Push the current return address before the C call. Return will be |
// through pop(pc) below. |
__ push(lr); |
- __ PrepareCallCFunction(4, scratch); // Two doubles are 4 arguments. |
+ __ PrepareCallCFunction(0, 2, scratch); |
+ if (FLAG_hardfloat) { |
+ ASSERT(CpuFeatures::IsSupported(VFP3)); |
+ CpuFeatures::Scope scope(VFP3); |
+ __ vmov(d0, r0, r1); |
+ __ vmov(d1, r2, r3); |
+ } |
// Call C routine that may not cause GC or other trouble. |
__ CallCFunction(ExternalReference::double_fp_operation(op, masm->isolate()), |
- 4); |
+ 0, 2); |
// Store answer in the overwritable heap number. Double returned in |
- // registers r0 and r1. |
- __ Strd(r0, r1, FieldMemOperand(heap_number_result, |
- HeapNumber::kValueOffset)); |
+ // registers r0 and r1 or in d0. |
+ if (FLAG_hardfloat) { |
+ CpuFeatures::Scope scope(VFP3); |
+ __ vstr(d0, |
+ FieldMemOperand(heap_number_result, HeapNumber::kValueOffset)); |
+ } else { |
+ __ Strd(r0, r1, FieldMemOperand(heap_number_result, |
+ HeapNumber::kValueOffset)); |
+ } |
// Place heap_number_result in r0 and return to the pushed return address. |
__ mov(r0, Operand(heap_number_result)); |
__ pop(pc); |
@@ -1179,8 +1191,15 @@ static void EmitTwoNonNanDoubleComparison(MacroAssembler* masm, |
// Call a native function to do a comparison between two non-NaNs. |
// Call C routine that may not cause GC or other trouble. |
__ push(lr); |
- __ PrepareCallCFunction(4, r5); // Two doubles count as 4 arguments. |
- __ CallCFunction(ExternalReference::compare_doubles(masm->isolate()), 4); |
+ __ PrepareCallCFunction(0, 2, r5); |
+ if (FLAG_hardfloat) { |
+ ASSERT(CpuFeatures::IsSupported(VFP3)); |
+ CpuFeatures::Scope scope(VFP3); |
+ __ vmov(d0, r0, r1); |
+ __ vmov(d1, r2, r3); |
+ } |
+ __ CallCFunction(ExternalReference::compare_doubles(masm->isolate()), |
+ 0, 2); |
__ pop(pc); // Return. |
} |
} |
@@ -2834,17 +2853,24 @@ void TranscendentalCacheStub::GenerateCallCFunction(MacroAssembler* masm, |
Isolate* isolate = masm->isolate(); |
__ push(lr); |
- __ PrepareCallCFunction(2, scratch); |
- __ vmov(r0, r1, d2); |
+ __ PrepareCallCFunction(0, 1, scratch); |
+ if (FLAG_hardfloat) { |
+ __ vmov(d0, d2); |
+ } else { |
+ __ vmov(r0, r1, d2); |
+ } |
switch (type_) { |
case TranscendentalCache::SIN: |
- __ CallCFunction(ExternalReference::math_sin_double_function(isolate), 2); |
+ __ CallCFunction(ExternalReference::math_sin_double_function(isolate), |
+ 0, 1); |
break; |
case TranscendentalCache::COS: |
- __ CallCFunction(ExternalReference::math_cos_double_function(isolate), 2); |
+ __ CallCFunction(ExternalReference::math_cos_double_function(isolate), |
+ 0, 1); |
break; |
case TranscendentalCache::LOG: |
- __ CallCFunction(ExternalReference::math_log_double_function(isolate), 2); |
+ __ CallCFunction(ExternalReference::math_log_double_function(isolate), |
+ 0, 1); |
break; |
default: |
UNIMPLEMENTED(); |
@@ -3061,11 +3087,11 @@ void MathPowStub::Generate(MacroAssembler* masm) { |
heapnumbermap, |
&call_runtime); |
__ push(lr); |
- __ PrepareCallCFunction(3, scratch); |
- __ mov(r2, exponent); |
- __ vmov(r0, r1, double_base); |
+ __ PrepareCallCFunction(1, 1, scratch); |
+ __ SetCallCDoubleArguments(double_base, exponent); |
__ CallCFunction( |
- ExternalReference::power_double_int_function(masm->isolate()), 3); |
+ ExternalReference::power_double_int_function(masm->isolate()), |
+ 1, 1); |
__ pop(lr); |
__ GetCFunctionDoubleResult(double_result); |
__ vstr(double_result, |
@@ -3091,11 +3117,11 @@ void MathPowStub::Generate(MacroAssembler* masm) { |
heapnumbermap, |
&call_runtime); |
__ push(lr); |
- __ PrepareCallCFunction(4, scratch); |
- __ vmov(r0, r1, double_base); |
- __ vmov(r2, r3, double_exponent); |
+ __ PrepareCallCFunction(0, 2, scratch); |
+ __ SetCallCDoubleArguments(double_base, double_exponent); |
__ CallCFunction( |
- ExternalReference::power_double_double_function(masm->isolate()), 4); |
+ ExternalReference::power_double_double_function(masm->isolate()), |
+ 0, 2); |
__ pop(lr); |
__ GetCFunctionDoubleResult(double_result); |
__ vstr(double_result, |
@@ -3139,8 +3165,9 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, |
if (do_gc) { |
// Passing r0. |
- __ PrepareCallCFunction(1, r1); |
- __ CallCFunction(ExternalReference::perform_gc_function(isolate), 1); |
+ __ PrepareCallCFunction(1, 0, r1); |
+ __ CallCFunction(ExternalReference::perform_gc_function(isolate), |
+ 1, 0); |
} |
ExternalReference scope_depth = |