Author: Armin Rigo <[email protected]>
Branch: stmgc-c7
Changeset: r70254:15c9c0baed53
Date: 2014-03-24 15:41 +0100
http://bitbucket.org/pypy/pypy/changeset/15c9c0baed53/
Log: Also implement stm_should_break_transaction not immediately followed
by a guard
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
@@ -2479,17 +2479,23 @@
# so if it is followed with a JB, it will follow the jump if
# we should break the transaction now.
#
+ 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))
+ 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.MOVZX8_rr(result_loc.value, rl.value)
+
def genop_guard_stm_should_break_transaction(self, op, guard_op,
guard_token, arglocs,
result_loc):
- if not IS_X86_64:
- todo() # "needed for X86_64_SCRATCH_REG"
self._generate_cmp_break_transaction()
if guard_op.getopnum() == rop.GUARD_FALSE:
self.implement_guard(guard_token, 'B') # JB goes to "yes, break"
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1236,9 +1236,12 @@
def consider_stm_should_break_transaction(self, op, guard_op):
- if guard_op is None:
- self.not_implemented_op(op)
- self.perform_with_guard(op, guard_op, [], None)
+ if guard_op is not None:
+ self.perform_with_guard(op, guard_op, [], None)
+ else:
+ resloc = self.rm.force_allocate_reg(op.result,
+ need_lower_byte=True)
+ self.perform(op, [], resloc)
def consider_stm_transaction_break(self, op, guard_op):
self.perform_with_guard(op, guard_op, [], None)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit