Irregexp-ia32 internal call strategy changed.

Review URL: http://codereview.chromium.org/164053


git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2635 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
lrn@chromium.org 2009-08-06 12:51:04 +00:00
parent 7bd88e829f
commit 5ae761cc15
2 changed files with 12 additions and 9 deletions

View File

@ -752,7 +752,7 @@ Handle<Object> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) {
// Preempt-code
if (check_preempt_label_.is_linked()) {
__ bind(&check_preempt_label_);
SafeCallTarget(&check_preempt_label_);
__ push(backtrack_stackpointer());
__ push(edi);
@ -772,7 +772,7 @@ Handle<Object> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) {
// Backtrack stack overflow code.
if (stack_overflow_label_.is_linked()) {
__ bind(&stack_overflow_label_);
SafeCallTarget(&stack_overflow_label_);
// Reached if the backtrack-stack limit has been hit.
Label grow_failed;
@ -1249,17 +1249,19 @@ void RegExpMacroAssemblerIA32::BranchOrBacktrack(Condition condition,
void RegExpMacroAssemblerIA32::SafeCall(Label* to) {
Label return_to;
__ push(Immediate::CodeRelativeOffset(&return_to));
__ jmp(to);
__ bind(&return_to);
__ call(to);
}
void RegExpMacroAssemblerIA32::SafeReturn() {
__ pop(ebx);
__ add(Operand(ebx), Immediate(masm_->CodeObject()));
__ jmp(Operand(ebx));
__ add(Operand(esp,0), Immediate(masm_->CodeObject()));
__ ret(0);
}
void RegExpMacroAssemblerIA32::SafeCallTarget(Label* name) {
__ bind(name);
__ sub(Operand(esp, 0), Immediate(masm_->CodeObject()));
}

View File

@ -227,6 +227,7 @@ class RegExpMacroAssemblerIA32: public RegExpMacroAssembler {
// is GC-safe (i.e., doesn't leave absolute code addresses on the stack)
inline void SafeCall(Label* to);
inline void SafeReturn();
inline void SafeCallTarget(Label* name);
// Pushes the value of a register on the backtrack stack. Decrements the
// stack pointer (ecx) by a word size and stores the register's value there.