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

Reply via email to