Author: Remi Meier <remi.me...@gmail.com>
Branch: stmgc-c4
Changeset: r65770:6317510aa84e
Date: 2013-07-29 08:38 +0200
http://bitbucket.org/pypy/pypy/changeset/6317510aa84e/

Log:    attempt to implement ptr_eq fastpath

diff --git a/pypy/tool/jitlogparser/parser.py b/pypy/tool/jitlogparser/parser.py
--- a/pypy/tool/jitlogparser/parser.py
+++ b/pypy/tool/jitlogparser/parser.py
@@ -395,7 +395,7 @@
             addr = int(m.group(1), 16)
         addrs.setdefault(addr, []).append(name)
     dumps = {}
-    executables = set()
+    executables = set(["??"])
     symbols = {}
     for entry in extract_category(log, 'jit-backend-dump'):
         entry = purge_thread_numbers(entry)
diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1042,7 +1042,6 @@
         assert self.cpu.gc_ll_descr.stm
         rl = result_loc.lowest8bits()
         self._stm_ptr_eq_fastpath(self.mc, arglocs, result_loc)
-        self.mc.TEST_rr(eax.value, eax.value)
         self.mc.SET_ir(rx86.Conditions['NZ'], rl.value)
         self.mc.MOVZX8_rr(result_loc.value, rl.value)
 
@@ -1052,7 +1051,6 @@
         assert self.cpu.gc_ll_descr.stm
         rl = result_loc.lowest8bits()
         self._stm_ptr_eq_fastpath(self.mc, arglocs, result_loc)
-        self.mc.TEST_rr(eax.value, eax.value)
         self.mc.SET_ir(rx86.Conditions['Z'], rl.value)
         self.mc.MOVZX8_rr(result_loc.value, rl.value)
 
@@ -1064,7 +1062,6 @@
         assert not self.cpu.gc_ll_descr.stm
         guard_opnum = guard_op.getopnum()
         self._stm_ptr_eq_fastpath(self.mc, arglocs, result_loc)
-        self.mc.TEST_rr(eax.value, eax.value)
         if guard_opnum == rop.GUARD_FALSE:
             self.implement_guard(guard_token, "Z")
         else:
@@ -1078,7 +1075,6 @@
         assert not self.cpu.gc_ll_descr.stm
         guard_opnum = guard_op.getopnum()
         self._stm_ptr_eq_fastpath(self.mc, arglocs, result_loc)
-        self.mc.TEST_rr(eax.value, eax.value)
         if guard_opnum == rop.GUARD_FALSE:
             self.implement_guard(guard_token, "NZ")
         else:
@@ -2173,6 +2169,34 @@
         assert self.ptr_eq_slowpath is not None
         a_base = arglocs[0]
         b_base = arglocs[1]
+
+        #
+        # FASTPATH
+        #
+        # a == b -> SET NZ
+        sl = X86_64_SCRATCH_REG.lowest8bits()
+        mc.MOV(X86_64_SCRATCH_REG, a_base)
+        mc.CMP(X86_64_SCRATCH_REG, b_base)
+        mc.SET_ir(rx86.Conditions['Z'], sl.value)
+        mc.MOVZX8_rr(X86_64_SCRATCH_REG.value, sl.value)
+        mc.TEST(X86_64_SCRATCH_REG, X86_64_SCRATCH_REG)
+        mc.J_il8(rx86.Conditions['NZ'], 0)
+        j_ok1 = mc.get_relative_pos()
+
+        # a == 0 || b == 0 -> SET Z
+        mc.CMP(a_base, imm(0))
+        mc.J_il8(rx86.Conditions['Z'], 0)
+        j_ok2 = mc.get_relative_pos()
+        #
+        mc.CMP(a_base, imm(0))
+        mc.J_il8(rx86.Conditions['Z'], 0)
+        j_ok3 = mc.get_relative_pos()
+        
+        # a.type != b.type
+        # XXX: todo, if it ever happens..
+        
+        #
+        # SLOWPATH
         #
         mc.PUSH(b_base)
         mc.PUSH(a_base)
@@ -2180,7 +2204,22 @@
         mc.CALL(imm(func))
         # result still on stack
         assert isinstance(result_loc, RegLoc)
-        mc.POP_r(result_loc.value)
+        mc.POP_r(X86_64_SCRATCH_REG.value)
+        # set flags:
+        mc.TEST(X86_64_SCRATCH_REG, X86_64_SCRATCH_REG)
+        #
+        # END SLOWPATH
+        #
+        
+        # OK: flags already set
+        offset = mc.get_relative_pos() - j_ok1
+        mc.overwrite(j_ok1 - 1, chr(offset))
+        offset = mc.get_relative_pos() - j_ok2
+        mc.overwrite(j_ok2 - 1, chr(offset))
+        offset = mc.get_relative_pos() - j_ok3
+        mc.overwrite(j_ok3 - 1, chr(offset))
+
+        
         
     def _get_stm_private_rev_num_addr(self):
         assert self.cpu.gc_ll_descr.stm
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to