Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r66032:0ca84e25723e
Date: 2013-08-09 10:54 +0200
http://bitbucket.org/pypy/pypy/changeset/0ca84e25723e/
Log: test and fix ptr_eq
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
@@ -351,12 +351,14 @@
# eax has result
if IS_X86_32:
# ||val2|val1|retaddr|x||x|x|val2|val1|
- mc.MOV_sr(7 * WORD, eax.value)
- # ||result|val1|retaddr|x||x|x|val2|val1|
+ mc.ADD_ri(esp.value, 5 * WORD)
+ # ||val2|val1|retaddr|
else:
# ||val2|val1||retaddr|x||
- mc.MOV_sr(3 * WORD, eax.value)
- # ||result|val1||retaddr|x||
+ mc.ADD_ri(esp.value, WORD)
+ # ||val2|val1||retaddr|
+ mc.MOV_sr(2 * WORD, eax.value)
+ # ||result|val1|retaddr|
#
self._pop_all_regs_from_frame(mc, [], withfloats=False,
callee_only=True)
@@ -2218,18 +2220,28 @@
# the explicit MOV before it (CMP(a_base, b_base))
sl = X86_64_SCRATCH_REG.lowest8bits()
mc.MOV(X86_64_SCRATCH_REG, a_base)
- mc.CMP(X86_64_SCRATCH_REG, b_base)
+ if isinstance(b_base, ImmedLoc) \
+ and rx86.fits_in_32bits(b_base.value):
+ mc.CMP_ri(X86_64_SCRATCH_REG.value, b_base.value)
+ elif not isinstance(b_base, ImmedLoc):
+ mc.CMP(X86_64_SCRATCH_REG, b_base)
+ else:
+ # imm64, need another temporary reg :(
+ mc.PUSH_r(eax.value)
+ mc.MOV_ri64(eax.value, b_base.value)
+ mc.CMP_rr(X86_64_SCRATCH_REG.value, eax.value)
+ mc.POP_r(eax.value)
+ # reverse flags: if p1==p2, set NZ
mc.SET_ir(rx86.Conditions['Z'], sl.value)
- mc.MOVZX8_rr(X86_64_SCRATCH_REG.value, sl.value)
- # mc.TEST8_rr() without movzx8
- mc.TEST_rr(X86_64_SCRATCH_REG.value, X86_64_SCRATCH_REG.value)
+ mc.AND8_rr(sl.value, sl.value)
mc.J_il8(rx86.Conditions['NZ'], 0)
j_ok1 = mc.get_relative_pos()
# a == 0 || b == 0 -> SET Z
if isinstance(a_base, ImmedLoc):
if a_base.getint() == 0:
- # Z flag still set from above
+ # set Z flag:
+ mc.XOR(X86_64_SCRATCH_REG, X86_64_SCRATCH_REG)
mc.JMP_l8(0)
j_ok2 = mc.get_relative_pos()
else:
@@ -2264,7 +2276,7 @@
# result still on stack
mc.POP_r(X86_64_SCRATCH_REG.value)
# set flags:
- mc.TEST(X86_64_SCRATCH_REG, X86_64_SCRATCH_REG)
+ mc.TEST_rr(X86_64_SCRATCH_REG.value, X86_64_SCRATCH_REG.value)
#
# END SLOWPATH
#
diff --git a/rpython/jit/backend/x86/test/test_stm_integration.py
b/rpython/jit/backend/x86/test/test_stm_integration.py
--- a/rpython/jit/backend/x86/test/test_stm_integration.py
+++ b/rpython/jit/backend/x86/test/test_stm_integration.py
@@ -3,7 +3,7 @@
from rpython.jit.metainterp.history import ResOperation, TargetToken,\
JitCellToken
from rpython.jit.metainterp.history import (BoxInt, BoxPtr, ConstInt,
- ConstPtr, Box,
+ ConstPtr, Box, Const,
BasicFailDescr, BasicFinalDescr)
from rpython.jit.backend.detect_cpu import getcpuclass
from rpython.jit.backend.x86.arch import WORD
@@ -20,6 +20,7 @@
GCDescrShadowstackDirect, BaseTestRegalloc)
from rpython.jit.backend.llsupport import jitframe
from rpython.memory.gc.stmgc import StmGC
+import itertools
import ctypes
CPU = getcpuclass()
@@ -96,6 +97,7 @@
self.llop1 = None
self.rb_called_on = []
self.wb_called_on = []
+ self.ptr_eq_called_on = []
self.stm = True
def read_barrier(obj):
@@ -125,19 +127,19 @@
self.generate_function('stm_try_inevitable',
inevitable, [],
RESULT=lltype.Void)
- def ptr_eq(x, y): return x == y
- def ptr_ne(x, y): return x != y
+ def ptr_eq(x, y):
+ self.ptr_eq_called_on.append((x, y))
+ return x == y
self.generate_function('stm_ptr_eq', ptr_eq, [llmemory.GCREF] * 2,
RESULT=lltype.Bool)
- self.generate_function('stm_ptr_ne', ptr_ne, [llmemory.GCREF] * 2,
- RESULT=lltype.Bool)
-
+
def get_malloc_slowpath_addr(self):
return None
- def clear_barrier_lists(self):
+ def clear_lists(self):
self.rb_called_on[:] = []
self.wb_called_on[:] = []
+ self.ptr_eq_called_on[:] = []
class TestGcStm(BaseTestRegalloc):
@@ -209,7 +211,7 @@
self.priv_rev_num[0] = PRIV_REV
called_on = cpu.gc_ll_descr.rb_called_on
for rev in [PRIV_REV+4, PRIV_REV]:
- cpu.gc_ll_descr.clear_barrier_lists()
+ cpu.gc_ll_descr.clear_lists()
self.clear_read_cache()
s = self.allocate_prebuilt_s()
@@ -237,7 +239,7 @@
# now add it to the read-cache and check
# that it will never call the read_barrier
- cpu.gc_ll_descr.clear_barrier_lists()
+ cpu.gc_ll_descr.clear_lists()
self.set_cache_item(sgcref)
self.cpu.execute_token(looptoken, sgcref)
@@ -252,8 +254,7 @@
called_on = cpu.gc_ll_descr.wb_called_on
for rev in [PRIV_REV+4, PRIV_REV]:
- cpu.gc_ll_descr.clear_barrier_lists()
- assert not called_on
+ cpu.gc_ll_descr.clear_lists()
s = self.allocate_prebuilt_s()
sgcref = lltype.cast_opaque_ptr(llmemory.GCREF, s)
@@ -279,11 +280,53 @@
self.assert_in(called_on, [sgcref])
# now set WRITE_BARRIER -> always call slowpath
- cpu.gc_ll_descr.clear_barrier_lists()
- assert not called_on
+ cpu.gc_ll_descr.clear_lists()
s.h_tid |= StmGC.GCFLAG_WRITE_BARRIER
self.cpu.execute_token(looptoken, sgcref)
self.assert_in(called_on, [sgcref])
+ def test_ptr_eq_fastpath(self):
+ cpu = self.cpu
+ cpu.setup_once()
+ called_on = cpu.gc_ll_descr.ptr_eq_called_on
+
+ i0 = BoxInt()
+ sa, sb = (rffi.cast(llmemory.GCREF, self.allocate_prebuilt_s()),
+ rffi.cast(llmemory.GCREF, self.allocate_prebuilt_s()))
+ ss = [sa, sa, sb, sb,
+ lltype.nullptr(llmemory.GCREF.TO),
+ lltype.nullptr(llmemory.GCREF.TO),
+ ]
+ for s1, s2 in itertools.combinations(ss, 2):
+ ps = [BoxPtr(), BoxPtr(),
+ ConstPtr(s1),
+ ConstPtr(s2)]
+ for p1, p2 in itertools.combinations(ps, 2):
+ cpu.gc_ll_descr.clear_lists()
+
+ operations = [
+ ResOperation(rop.PTR_EQ, [p1, p2], i0),
+ ResOperation(rop.FINISH, [i0], None,
+ descr=BasicFinalDescr(0)),
+ ]
+ inputargs = [p for p in (p1, p2) if not isinstance(p, Const)]
+ looptoken = JitCellToken()
+ c_loop = cpu.compile_loop(inputargs, operations, looptoken)
+ args = [s for i, s in enumerate((s1, s2))
+ if not isinstance((p1, p2)[i], Const)]
+ self.cpu.execute_token(looptoken, *args)
+
+ a, b = s1, s2
+ if isinstance(p1, Const):
+ s1 = p1.value
+ if isinstance(p2, Const):
+ s2 = p2.value
+
+ if s1 == s2 or \
+ rffi.cast(lltype.Signed, s1) == 0 or \
+ rffi.cast(lltype.Signed, s2) == 0:
+ assert (s1, s2) not in called_on
+ else:
+ assert [(s1, s2)] == called_on
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit