Reviewers: Erik Corry,

Message:
Seems faster in some cases, slower in others. Is it worth it? Could it
be better?

Description:
Irregexp-ia32 internal call strategy changed.

Please review this at http://codereview.chromium.org/164053

Affected files:
   M src/ia32/regexp-macro-assembler-ia32.h
   M src/ia32/regexp-macro-assembler-ia32.cc


Index: src/ia32/regexp-macro-assembler-ia32.cc
diff --git a/src/ia32/regexp-macro-assembler-ia32.cc  
b/src/ia32/regexp-macro-assembler-ia32.cc
index  
2129fd16b6ef11bc8cd4c910d705922958255fb4..66b03ff5246db028845fede0071b2a56713ec1c1
  
100644
--- a/src/ia32/regexp-macro-assembler-ia32.cc
+++ b/src/ia32/regexp-macro-assembler-ia32.cc
@@ -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()));
  }


Index: src/ia32/regexp-macro-assembler-ia32.h
diff --git a/src/ia32/regexp-macro-assembler-ia32.h  
b/src/ia32/regexp-macro-assembler-ia32.h
index  
a06700a547b9f0b4d8f6a508f3908dea5b2d05c8..c3d9155700d44c7acfa6f090c3d8b64b1e69431f
  
100644
--- a/src/ia32/regexp-macro-assembler-ia32.h
+++ b/src/ia32/regexp-macro-assembler-ia32.h
@@ -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.



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to