| Index: src/mips/regexp-macro-assembler-mips.cc
 | 
| diff --git a/src/mips/regexp-macro-assembler-mips.cc b/src/mips/regexp-macro-assembler-mips.cc
 | 
| index 1a04fd10292b2532256bcecc315ff4ecadf263b5..49dec3c0246272dcf52d4ed00d31eac502de1a8b 100644
 | 
| --- a/src/mips/regexp-macro-assembler-mips.cc
 | 
| +++ b/src/mips/regexp-macro-assembler-mips.cc
 | 
| @@ -1063,15 +1063,56 @@ bool RegExpMacroAssemblerMIPS::CanReadUnaligned() {
 | 
|  // Private methods:
 | 
|  
 | 
|  void RegExpMacroAssemblerMIPS::CallCheckStackGuardState(Register scratch) {
 | 
| -  static const int num_arguments = 3;
 | 
| -  __ PrepareCallCFunction(num_arguments, scratch);
 | 
| +  int stack_alignment = OS::ActivationFrameAlignment();
 | 
| +
 | 
| +  // Align the stack pointer and save the original sp value on the stack.
 | 
| +  __ mov(scratch, sp);
 | 
| +  __ Subu(sp, sp, Operand(kPointerSize));
 | 
| +  ASSERT(IsPowerOf2(stack_alignment));
 | 
| +  __ And(sp, sp, Operand(-stack_alignment));
 | 
| +  __ sw(scratch, MemOperand(sp));
 | 
| +
 | 
|    __ mov(a2, frame_pointer());
 | 
|    // Code* of self.
 | 
|    __ li(a1, Operand(masm_->CodeObject()), CONSTANT_SIZE);
 | 
| -  // a0 becomes return address pointer.
 | 
| +
 | 
| +  // We need to make room for the return address on the stack.
 | 
| +  ASSERT(IsAligned(stack_alignment, kPointerSize));
 | 
| +  __ Subu(sp, sp, Operand(stack_alignment));
 | 
| +
 | 
| +  // Stack pointer now points to cell where return address is to be written.
 | 
| +  // Arguments are in registers, meaning we teat the return address as
 | 
| +  // argument 5. Since DirectCEntryStub will handleallocating space for the C
 | 
| +  // argument slots, we don't need to care about that here. This is how the
 | 
| +  // stack will look (sp meaning the value of sp at this moment):
 | 
| +  // [sp + 3] - empty slot if needed for alignment.
 | 
| +  // [sp + 2] - saved sp.
 | 
| +  // [sp + 1] - second word reserved for return value.
 | 
| +  // [sp + 0] - first word reserved for return value.
 | 
| +
 | 
| +  // a0 will point to the return address, placed by DirectCEntry.
 | 
| +  __ mov(a0, sp);
 | 
| +
 | 
|    ExternalReference stack_guard_check =
 | 
|        ExternalReference::re_check_stack_guard_state(masm_->isolate());
 | 
| -  CallCFunctionUsingStub(stack_guard_check, num_arguments);
 | 
| +  __ li(t9, Operand(stack_guard_check));
 | 
| +  DirectCEntryStub stub;
 | 
| +  stub.GenerateCall(masm_, t9);
 | 
| +
 | 
| +  // DirectCEntryStub allocated space for the C argument slots so we have to
 | 
| +  // drop them with the return address from the stack with loading saved sp.
 | 
| +  // At this point stack must look:
 | 
| +  // [sp + 7] - empty slot if needed for alignment.
 | 
| +  // [sp + 6] - saved sp.
 | 
| +  // [sp + 5] - second word reserved for return value.
 | 
| +  // [sp + 4] - first word reserved for return value.
 | 
| +  // [sp + 3] - C argument slot.
 | 
| +  // [sp + 2] - C argument slot.
 | 
| +  // [sp + 1] - C argument slot.
 | 
| +  // [sp + 0] - C argument slot.
 | 
| +  __ lw(sp, MemOperand(sp, stack_alignment + kCArgsSlotsSize));
 | 
| +
 | 
| +  __ li(code_pointer(), Operand(masm_->CodeObject()));
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -1276,21 +1317,6 @@ void RegExpMacroAssemblerMIPS::CheckStackLimit() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void RegExpMacroAssemblerMIPS::CallCFunctionUsingStub(
 | 
| -    ExternalReference function,
 | 
| -    int num_arguments) {
 | 
| -  // Must pass all arguments in registers. The stub pushes on the stack.
 | 
| -  ASSERT(num_arguments <= 4);
 | 
| -  __ li(code_pointer(), Operand(function));
 | 
| -  RegExpCEntryStub stub;
 | 
| -  __ CallStub(&stub);
 | 
| -  if (OS::ActivationFrameAlignment() != 0) {
 | 
| -    __ lw(sp, MemOperand(sp, 16));
 | 
| -  }
 | 
| -  __ li(code_pointer(), Operand(masm_->CodeObject()), CONSTANT_SIZE);
 | 
| -}
 | 
| -
 | 
| -
 | 
|  void RegExpMacroAssemblerMIPS::LoadCurrentCharacterUnchecked(int cp_offset,
 | 
|                                                               int characters) {
 | 
|    Register offset = current_input_offset();
 | 
| @@ -1312,23 +1338,6 @@ void RegExpMacroAssemblerMIPS::LoadCurrentCharacterUnchecked(int cp_offset,
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void RegExpCEntryStub::Generate(MacroAssembler* masm_) {
 | 
| -  int stack_alignment = OS::ActivationFrameAlignment();
 | 
| -  if (stack_alignment < kPointerSize) stack_alignment = kPointerSize;
 | 
| -  // Stack is already aligned for call, so decrement by alignment
 | 
| -  // to make room for storing the return address.
 | 
| -  __ Subu(sp, sp, Operand(stack_alignment + kCArgsSlotsSize));
 | 
| -  const int return_address_offset = kCArgsSlotsSize;
 | 
| -  __ Addu(a0, sp, return_address_offset);
 | 
| -  __ sw(ra, MemOperand(a0, 0));
 | 
| -  __ mov(t9, t1);
 | 
| -  __ Call(t9);
 | 
| -  __ lw(ra, MemOperand(sp, return_address_offset));
 | 
| -  __ Addu(sp, sp, Operand(stack_alignment + kCArgsSlotsSize));
 | 
| -  __ Jump(ra);
 | 
| -}
 | 
| -
 | 
| -
 | 
|  #undef __
 | 
|  
 | 
|  #endif  // V8_INTERPRETED_REGEXP
 | 
| 
 |