| 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
|
|
|