[pypy-commit] pypy stmgc-c8-gil-like: Fix _generate_cmp_break_transaction
arigo
noreply at buildbot.pypy.org
Sat Jun 13 18:27:55 CEST 2015
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c8-gil-like
Changeset: r78086:1d9bc828649e
Date: 2015-06-13 18:17 +0200
http://bitbucket.org/pypy/pypy/changeset/1d9bc828649e/
Log: Fix _generate_cmp_break_transaction
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
@@ -1154,8 +1154,7 @@
def convert_addresses_to_linear(self, reg1, reg2=None):
if not self.cpu.gc_ll_descr.stm: # stm-only
return
- if not IS_X86_64:
- todo() # "needed for X86_64_SCRATCH_REG"
+ assert IS_X86_64
sb_adr = rstm.adr_segment_base
assert rx86.fits_in_32bits(sb_adr) # because it is in the 2nd page
self.mc.MOV_rj(X86_64_SCRATCH_REG.value, (self.SEGMENT_GC, sb_adr))
@@ -2833,24 +2832,24 @@
self.mc.MOV_rr(reg.value, ebp.value)
def _generate_cmp_break_transaction(self):
- # emits the check with a CMP instruction:
- # pypy_stm_nursery_low_fill_mark < STM_SEGMENT->nursery_current
- # so if it is followed with a JB, it will follow the jump if
+ # emits the check with a CMP instruction (as signed integers):
+ # STM_SEGMENT->nursery_current >= STM_SEGMENT->nursery_mark
+ # so if it is followed by a JGE, it will follow the jump if
# we should break the transaction now.
#
assert self.cpu.gc_ll_descr.stm
- if not IS_X86_64:
- todo() # "needed for X86_64_SCRATCH_REG"
- psnlfm_adr = rstm.adr_pypy_stm_nursery_low_fill_mark
- self.mc.MOV(X86_64_SCRATCH_REG, self.heap_tl(psnlfm_adr))
- nf_adr = rstm.adr_nursery_free
- assert rx86.fits_in_32bits(nf_adr) # because it is in the 2nd page
- self.mc.CMP_rj(X86_64_SCRATCH_REG.value, (self.SEGMENT_GC, nf_adr))
+ assert IS_X86_64
+ nc_adr = rstm.adr_nursery_free
+ nm_adr = rstm.adr_nursery_mark
+ assert rx86.fits_in_32bits(nc_adr) # because it is in the 2nd page
+ assert rx86.fits_in_32bits(nm_adr) # because it is in the 2nd page
+ self.mc.MOV_rj(X86_64_SCRATCH_REG.value, (self.SEGMENT_GC, nc_adr))
+ self.mc.CMP_rj(X86_64_SCRATCH_REG.value, (self.SEGMENT_GC, nm_adr))
def genop_stm_should_break_transaction(self, op, arglocs, result_loc):
self._generate_cmp_break_transaction()
rl = result_loc.lowest8bits()
- self.mc.SET_ir(rx86.Conditions['B'], rl.value)
+ self.mc.SET_ir(rx86.Conditions['GE'], rl.value)
self.mc.MOVZX8_rr(result_loc.value, rl.value)
def genop_guard_stm_should_break_transaction(self, op, guard_op,
@@ -2858,14 +2857,13 @@
result_loc):
self._generate_cmp_break_transaction()
if guard_op.getopnum() == rop.GUARD_FALSE:
- self.implement_guard(guard_token, 'B') # JB goes to "yes, break"
+ self.implement_guard(guard_token, 'GE') # JGE goes to "yes, break"
else:
- self.implement_guard(guard_token, 'AE') # JAE goes to "no, don't"
+ self.implement_guard(guard_token, 'L') # JL goes to "no, don't"
def genop_discard_stm_read(self, op, arglocs):
assert self.cpu.gc_ll_descr.stm
- if not IS_X86_64:
- todo() # "needed for X86_64_SCRATCH_REG"
+ assert IS_X86_64
mc = self.mc
rmreg = X86_64_SCRATCH_REG.value
mc.MOVZX8_rj(rmreg, (self.SEGMENT_GC,
@@ -3008,9 +3006,6 @@
cond_call_register_arguments = [edi, esi, edx, ecx]
-def todo():
- CRASH # not done yet
-
class BridgeAlreadyCompiled(Exception):
pass
diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -19,6 +19,7 @@
stm_nb_segments = CFlexSymbolic('STM_NB_SEGMENTS')
adr_nursery_free = CFlexSymbolic('((long)&STM_SEGMENT->nursery_current)')
adr_nursery_top = CFlexSymbolic('((long)&STM_SEGMENT->nursery_end)')
+adr_nursery_mark = CFlexSymbolic('((long)&STM_SEGMENT->nursery_mark)')
adr_pypy_stm_nursery_low_fill_mark = (
CFlexSymbolic('((long)&pypy_stm_nursery_low_fill_mark)'))
adr_rjthread_head = (
@@ -44,7 +45,7 @@
adr_pypy__rewind_jmp_copy_stack_slice = (
CFlexSymbolic('((long)&pypy__rewind_jmp_copy_stack_slice)'))
adr_stm_detached_inevitable_from_thread = (
- CFlexSymbolic('((long)&_stm_detach_inevitable_transaction)'))
+ CFlexSymbolic('((long)&_stm_detached_inevitable_from_thread)'))
adr_stm_thread_local_self = (
CFlexSymbolic('((long)&stm_thread_local.self)'))
adr_stm_leave_noninevitable_transactional_zone = (
More information about the pypy-commit
mailing list