Index: src/mips/lithium-codegen-mips.cc |
diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc |
index 796e61d6717e35825682ca705a8ad138742e61e9..f7a27e4b523dc56f9ae8b0243dab00bf1b5264e7 100644 |
--- a/src/mips/lithium-codegen-mips.cc |
+++ b/src/mips/lithium-codegen-mips.cc |
@@ -2715,7 +2715,7 @@ void LCodeGen::DoApplyArguments(LApplyArguments* instr) { |
this, pointers, Safepoint::kLazyDeopt); |
// The number of arguments is stored in receiver which is a0, as expected |
// by InvokeFunction. |
- v8::internal::ParameterCount actual(receiver); |
+ ParameterCount actual(receiver); |
__ InvokeFunction(function, actual, CALL_FUNCTION, |
safepoint_generator, CALL_AS_METHOD); |
__ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
@@ -2771,31 +2771,41 @@ void LCodeGen::CallKnownFunction(Handle<JSFunction> function, |
int arity, |
LInstruction* instr, |
CallKind call_kind) { |
- // Change context if needed. |
- bool change_context = |
- (info()->closure()->context() != function->context()) || |
- scope()->contains_with() || |
- (scope()->num_heap_slots() > 0); |
- if (change_context) { |
- __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
- } |
- |
- // Set a0 to arguments count if adaption is not needed. Assumes that a0 |
- // is available to write to at this point. |
- if (!function->NeedsArgumentsAdaption()) { |
- __ li(a0, Operand(arity)); |
- } |
+ bool can_invoke_directly = !function->NeedsArgumentsAdaption() || |
+ function->shared()->formal_parameter_count() == arity; |
LPointerMap* pointers = instr->pointer_map(); |
RecordPosition(pointers->position()); |
- // Invoke function. |
- __ SetCallKind(t1, call_kind); |
- __ lw(at, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); |
- __ Call(at); |
+ if (can_invoke_directly) { |
+ __ LoadHeapObject(a1, function); |
+ // Change context if needed. |
+ bool change_context = |
+ (info()->closure()->context() != function->context()) || |
+ scope()->contains_with() || |
+ (scope()->num_heap_slots() > 0); |
+ if (change_context) { |
+ __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
+ } |
- // Set up deoptimization. |
- RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); |
+ // Set r0 to arguments count if adaption is not needed. Assumes that r0 |
+ // is available to write to at this point. |
+ if (!function->NeedsArgumentsAdaption()) { |
+ __ li(a0, Operand(arity)); |
+ } |
+ |
+ // Invoke function. |
+ __ SetCallKind(t1, call_kind); |
+ __ lw(at, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); |
+ __ Call(at); |
+ |
+ // Set up deoptimization. |
+ RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); |
+ } else { |
+ SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); |
+ ParameterCount count(arity); |
+ __ InvokeFunction(function, count, CALL_FUNCTION, generator, call_kind); |
+ } |
// Restore context. |
__ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
@@ -2805,7 +2815,6 @@ void LCodeGen::CallKnownFunction(Handle<JSFunction> function, |
void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) { |
ASSERT(ToRegister(instr->result()).is(v0)); |
__ mov(a0, v0); |
- __ LoadHeapObject(a1, instr->function()); |
CallKnownFunction(instr->function(), instr->arity(), instr, CALL_AS_METHOD); |
} |
@@ -3248,7 +3257,6 @@ void LCodeGen::DoCallGlobal(LCallGlobal* instr) { |
void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) { |
ASSERT(ToRegister(instr->result()).is(v0)); |
- __ LoadHeapObject(a1, instr->target()); |
CallKnownFunction(instr->target(), instr->arity(), instr, CALL_AS_FUNCTION); |
} |