| Index: src/mips/macro-assembler-mips.cc
 | 
| diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc
 | 
| index 56930699e5d8628db22b23cf1f9ff41bb7998865..22557357f4a28ae14045913b94690b9725196b6f 100644
 | 
| --- a/src/mips/macro-assembler-mips.cc
 | 
| +++ b/src/mips/macro-assembler-mips.cc
 | 
| @@ -3430,10 +3430,12 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
 | 
|                                      Handle<Code> code_constant,
 | 
|                                      Register code_reg,
 | 
|                                      Label* done,
 | 
| +                                    bool* definitely_mismatches,
 | 
|                                      InvokeFlag flag,
 | 
|                                      const CallWrapper& call_wrapper,
 | 
|                                      CallKind call_kind) {
 | 
|    bool definitely_matches = false;
 | 
| +  *definitely_mismatches = false;
 | 
|    Label regular_invoke;
 | 
|  
 | 
|    // Check whether the expected and actual arguments count match. If not,
 | 
| @@ -3464,6 +3466,7 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
 | 
|          // arguments.
 | 
|          definitely_matches = true;
 | 
|        } else {
 | 
| +        *definitely_mismatches = true;
 | 
|          li(a2, Operand(expected.immediate()));
 | 
|        }
 | 
|      }
 | 
| @@ -3487,7 +3490,9 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
 | 
|        SetCallKind(t1, call_kind);
 | 
|        Call(adaptor);
 | 
|        call_wrapper.AfterCall();
 | 
| -      jmp(done);
 | 
| +      if (!*definitely_mismatches) {
 | 
| +        Branch(done);
 | 
| +      }
 | 
|      } else {
 | 
|        SetCallKind(t1, call_kind);
 | 
|        Jump(adaptor, RelocInfo::CODE_TARGET);
 | 
| @@ -3508,21 +3513,25 @@ void MacroAssembler::InvokeCode(Register code,
 | 
|  
 | 
|    Label done;
 | 
|  
 | 
| -  InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag,
 | 
| +  bool definitely_mismatches = false;
 | 
| +  InvokePrologue(expected, actual, Handle<Code>::null(), code,
 | 
| +                 &done, &definitely_mismatches, flag,
 | 
|                   call_wrapper, call_kind);
 | 
| -  if (flag == CALL_FUNCTION) {
 | 
| -    call_wrapper.BeforeCall(CallSize(code));
 | 
| -    SetCallKind(t1, call_kind);
 | 
| -    Call(code);
 | 
| -    call_wrapper.AfterCall();
 | 
| -  } else {
 | 
| -    ASSERT(flag == JUMP_FUNCTION);
 | 
| -    SetCallKind(t1, call_kind);
 | 
| -    Jump(code);
 | 
| +  if (!definitely_mismatches) {
 | 
| +    if (flag == CALL_FUNCTION) {
 | 
| +      call_wrapper.BeforeCall(CallSize(code));
 | 
| +      SetCallKind(t1, call_kind);
 | 
| +      Call(code);
 | 
| +      call_wrapper.AfterCall();
 | 
| +    } else {
 | 
| +      ASSERT(flag == JUMP_FUNCTION);
 | 
| +      SetCallKind(t1, call_kind);
 | 
| +      Jump(code);
 | 
| +    }
 | 
| +    // Continue here if InvokePrologue does handle the invocation due to
 | 
| +    // mismatched parameter counts.
 | 
| +    bind(&done);
 | 
|    }
 | 
| -  // Continue here if InvokePrologue does handle the invocation due to
 | 
| -  // mismatched parameter counts.
 | 
| -  bind(&done);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -3537,18 +3546,22 @@ void MacroAssembler::InvokeCode(Handle<Code> code,
 | 
|  
 | 
|    Label done;
 | 
|  
 | 
| -  InvokePrologue(expected, actual, code, no_reg, &done, flag,
 | 
| +  bool definitely_mismatches = false;
 | 
| +  InvokePrologue(expected, actual, code, no_reg,
 | 
| +                 &done, &definitely_mismatches, flag,
 | 
|                   NullCallWrapper(), call_kind);
 | 
| -  if (flag == CALL_FUNCTION) {
 | 
| -    SetCallKind(t1, call_kind);
 | 
| -    Call(code, rmode);
 | 
| -  } else {
 | 
| -    SetCallKind(t1, call_kind);
 | 
| -    Jump(code, rmode);
 | 
| +  if (!definitely_mismatches) {
 | 
| +    if (flag == CALL_FUNCTION) {
 | 
| +      SetCallKind(t1, call_kind);
 | 
| +      Call(code, rmode);
 | 
| +    } else {
 | 
| +      SetCallKind(t1, call_kind);
 | 
| +      Jump(code, rmode);
 | 
| +    }
 | 
| +    // Continue here if InvokePrologue does handle the invocation due to
 | 
| +    // mismatched parameter counts.
 | 
| +    bind(&done);
 | 
|    }
 | 
| -  // Continue here if InvokePrologue does handle the invocation due to
 | 
| -  // mismatched parameter counts.
 | 
| -  bind(&done);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -3581,6 +3594,7 @@ void MacroAssembler::InvokeFunction(Register function,
 | 
|  void MacroAssembler::InvokeFunction(Handle<JSFunction> function,
 | 
|                                      const ParameterCount& actual,
 | 
|                                      InvokeFlag flag,
 | 
| +                                    const CallWrapper& call_wrapper,
 | 
|                                      CallKind call_kind) {
 | 
|    // You can't call a function without a valid frame.
 | 
|    ASSERT(flag == JUMP_FUNCTION || has_frame());
 | 
| @@ -3594,7 +3608,7 @@ void MacroAssembler::InvokeFunction(Handle<JSFunction> function,
 | 
|    // allow recompilation to take effect without changing any of the
 | 
|    // call sites.
 | 
|    lw(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset));
 | 
| -  InvokeCode(a3, expected, actual, flag, NullCallWrapper(), call_kind);
 | 
| +  InvokeCode(a3, expected, actual, flag, call_wrapper, call_kind);
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |