[pypy-commit] pypy stmgc-c7: Increment nursery_current when requested
arigo
noreply at buildbot.pypy.org
Tue May 6 23:06:55 CEST 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r71344:26bb66aa78ab
Date: 2014-05-06 21:13 +0200
http://bitbucket.org/pypy/pypy/changeset/26bb66aa78ab/
Log: Increment nursery_current when requested
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
@@ -2547,7 +2547,7 @@
assert isinstance(reg, RegLoc)
self.mc.MOV_rr(reg.value, ebp.value)
- def _generate_cmp_break_transaction(self):
+ def _generate_cmp_break_transaction(self, increase_nursery=False):
# 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
@@ -2556,25 +2556,30 @@
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))
+ nf_adr = rstm.adr_nursery_free # STM_SEGMENT->nursery_current
+ assert rx86.fits_in_32bits(nf_adr) # nf_adr is in page 1
+ self.mc.MOV_rj(X86_64_SCRATCH_REG.value, (self.SEGMENT_GC, nf_adr))
+ if increase_nursery:
+ self.mc.ADD_ri(X86_64_SCRATCH_REG.value, WORD)
+ self.mc.MOV_jr((self.SEGMENT_GC, nf_adr), X86_64_SCRATCH_REG.value)
+ self.mc.CMP(X86_64_SCRATCH_REG, self.heap_tl(psnlfm_adr))
def genop_stm_should_break_transaction(self, op, arglocs, result_loc):
- self._generate_cmp_break_transaction()
+ increase_nursery = op.args[0].getint()
+ self._generate_cmp_break_transaction(increase_nursery=increase_nursery)
rl = result_loc.lowest8bits()
- self.mc.SET_ir(rx86.Conditions['B'], rl.value)
+ self.mc.SET_ir(rx86.Conditions['A'], 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):
- self._generate_cmp_break_transaction()
+ increase_nursery = op.args[0].getint()
+ self._generate_cmp_break_transaction(increase_nursery=increase_nursery)
if guard_op.getopnum() == rop.GUARD_FALSE:
- self.implement_guard(guard_token, 'B') # JB goes to "yes, break"
+ self.implement_guard(guard_token, 'A') # JA goes to "yes, break"
else:
- self.implement_guard(guard_token, 'AE') # JAE goes to "no, don't"
+ self.implement_guard(guard_token, 'BE') # JBE goes to "no, don't"
def genop_guard_stm_transaction_break(self, op, guard_op, guard_token,
arglocs, result_loc):
@@ -2587,9 +2592,9 @@
mc = self.mc
self._generate_cmp_break_transaction()
- # use JAE to jump over the following piece of code if we don't need
+ # use JBE to jump over the following piece of code if we don't need
# to break the transaction now
- mc.J_il(rx86.Conditions['AE'], 0xfffff) # patched later
+ mc.J_il(rx86.Conditions['BE'], 0xfffff) # patched later
jae_location = mc.get_relative_pos()
# This is the case in which we have to do the same as the logic
More information about the pypy-commit
mailing list