Author: Remi Meier <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit