Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r65649:5f5f1a605cb3
Date: 2013-07-25 17:02 +0200
http://bitbucket.org/pypy/pypy/changeset/5f5f1a605cb3/
Log: add first part of a fastpath to stm_read_barrier (makes targettlc
slower)
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
@@ -35,6 +35,8 @@
from rpython.rlib.rarithmetic import intmask, r_uint
from rpython.rlib.objectmodel import compute_unique_id
from rpython.jit.backend.x86 import stmtlocal
+from rpython.rlib import rstm
+from rpython.memory.gc.stmgc import StmGC
class Assembler386(BaseAssembler):
@@ -517,9 +519,9 @@
clt.allgcrefs = []
clt.frame_info.clear() # for now
- if log:
- operations = self._inject_debugging_code(looptoken, operations,
- 'e', looptoken.number)
+ # if log:
+ # operations = self._inject_debugging_code(looptoken, operations,
+ # 'e', looptoken.number)
regalloc = RegAlloc(self, self.cpu.translate_support_code)
#
@@ -578,9 +580,9 @@
self.setup(original_loop_token)
descr_number = compute_unique_id(faildescr)
- if log:
- operations = self._inject_debugging_code(faildescr, operations,
- 'b', descr_number)
+ # if log:
+ # operations = self._inject_debugging_code(faildescr, operations,
+ # 'b', descr_number)
arglocs = self.rebuild_faillocs_from_descr(faildescr, inputargs)
regalloc = RegAlloc(self, self.cpu.translate_support_code)
@@ -2180,27 +2182,49 @@
assert isinstance(result_loc, RegLoc)
mc.POP_r(result_loc.value)
+ def _get_private_rev_num_addr(self):
+ assert self.cpu.gc_ll_descr.stm
+ rn = rstm.get_adr_of_private_rev_num()
+ rn = rn - stmtlocal.threadlocal_base()
+ assert rx86.fits_in_32bits(rn)
+ return rn
def _stm_barrier_fastpath(self, mc, descr, arglocs, is_frame=False,
align_stack=False):
assert self.cpu.gc_ll_descr.stm
- from rpython.jit.backend.llsupport.gc import STMBarrierDescr
+ from rpython.jit.backend.llsupport.gc import (
+ STMBarrierDescr, STMReadBarrierDescr, STMWriteBarrierDescr)
assert isinstance(descr, STMBarrierDescr)
assert descr.returns_modified_object
loc_base = arglocs[0]
assert isinstance(loc_base, RegLoc)
- # Write only a CALL to the helper prepared in advance, passing it as
- # argument the address of the structure we are writing into
- # (the first argument to COND_CALL_GC_WB).
+
helper_num = 0
if is_frame:
helper_num = 4
elif self._regalloc is not None and self._regalloc.xrm.reg_bindings:
helper_num += 2
#
+ # FASTPATH:
+ #
+ rn = self._get_private_rev_num_addr()
+ if isinstance(descr, STMReadBarrierDescr):
+ # (obj->h_revision != stm_private_rev_num)
+ # && (FXCACHE_AT(obj) != obj)))
+ stmtlocal.tl_segment_prefix(mc)
+ #mc.CMP_jr(rn, loc_base.value)
+ mc.MOV_rj(X86_64_SCRATCH_REG.value, rn)
+ mc.CMP(X86_64_SCRATCH_REG, mem(loc_base, StmGC.H_REVISION))
+ mc.J_il8(rx86.Conditions['Z'], 0) # patched below
+ jz_location = mc.get_relative_pos()
+ else:
+ jz_location = 0
+ #
+ # SLOWPATH_START
+ #
if not is_frame:
mc.PUSH(loc_base)
- if is_frame and align_stack:
+ elif is_frame and align_stack:
# ||retadr|
mc.SUB_ri(esp.value, 16 - WORD) # erase the return address
# ||retadr|...||
@@ -2214,10 +2238,15 @@
# result where argument was:
mc.POP_r(loc_base.value)
-
if is_frame and align_stack:
mc.ADD_ri(esp.value, 16 - WORD) # erase the return address
-
+ #
+ # SLOWPATH_END
+ #
+ if isinstance(descr, STMReadBarrierDescr):
+ offset = mc.get_relative_pos() - jz_location
+ assert 0 < offset <= 127
+ mc.overwrite(jz_location - 1, chr(offset))
diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -3,6 +3,9 @@
from rpython.rtyper.lltypesystem.lloperation import llop
from rpython.rtyper.extregistry import ExtRegistryEntry
+def get_adr_of_private_rev_num():
+ addr = llop.stm_get_adr_of_private_rev_num(llmemory.Address)
+ return rffi.cast(lltype.Signed, addr)
def become_inevitable():
llop.stm_become_inevitable(lltype.Void)
diff --git a/rpython/rtyper/lltypesystem/lloperation.py
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -456,6 +456,8 @@
'stm_abort_info_pop': LLOp(),
'stm_inspect_abort_info': LLOp(sideeffects=False),
+ 'stm_get_adr_of_private_rev_num':LLOp(),
+
# __________ address operations __________
'boehm_malloc': LLOp(),
diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py
--- a/rpython/translator/c/funcgen.py
+++ b/rpython/translator/c/funcgen.py
@@ -592,6 +592,7 @@
OP_STM_PUSH_ROOT = _OP_STM
OP_STM_POP_ROOT_INTO = _OP_STM
OP_STM_GET_ROOT_STACK_TOP = _OP_STM
+ OP_STM_GET_ADR_OF_PRIVATE_REV_NUM = _OP_STM
OP_STM_ALLOCATE = _OP_STM
OP_STM_WEAKREF_ALLOCATE = _OP_STM
OP_STM_GET_TID = _OP_STM
diff --git a/rpython/translator/stm/funcgen.py
b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -99,6 +99,12 @@
return '%s = (%s)&stm_shadowstack;' % (
result, cdecl(funcgen.lltypename(op.result), ''))
+def stm_get_adr_of_private_rev_num(funcgen, op):
+ result = funcgen.expr(op.result)
+ return '%s = (%s)&stm_private_rev_num;' % (
+ result, cdecl(funcgen.lltypename(op.result), ''))
+
+
def stm_weakref_allocate(funcgen, op):
arg0 = funcgen.expr(op.args[0])
arg1 = funcgen.expr(op.args[1])
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit