Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r66084:a285d16c08c8
Date: 2013-08-12 10:54 +0200
http://bitbucket.org/pypy/pypy/changeset/a285d16c08c8/

Log:    make exception thread-local stm-aware

diff --git a/rpython/jit/backend/llsupport/assembler.py 
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -172,10 +172,8 @@
                 break
         exc = guardtok.exc
         target = self.failure_recovery_code[exc + 2 * withfloats]
-        fail_descr = rgc.cast_instance_to_gcref(guardtok.faildescr)
-        # already done by gc.py record_constptrs, just to be safe:
-        fail_descr = rgc._make_sure_does_not_move(fail_descr)
-        fail_descr = rgc.cast_gcref_to_int(fail_descr)
+        fail_descr = cast_instance_to_gcref(guardtok.faildescr)
+        fail_descr = rffi.cast(lltype.Signed, fail_descr)
         base_ofs = self.cpu.get_baseofs_of_frame_field()
         positions = [0] * len(guardtok.fail_locs)
         for i, loc in enumerate(guardtok.fail_locs):
@@ -228,10 +226,10 @@
             else:
                 raise AssertionError(kind)
 
-        gcref = rgc.cast_instance_to_gcref(value)
+        import pdb;pdb.set_trace()
+        gcref = cast_instance_to_gcref(value)
         gcref = rgc._make_sure_does_not_move(gcref)
-        value = rgc.cast_gcref_to_int(gcref)
-        
+        value = rffi.cast(lltype.Signed, gcref)
         je_location = self._call_assembler_check_descr(value, tmploc)
         #
         # Path A: use assembler_helper_adr
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
@@ -260,6 +260,21 @@
         self.propagate_exception_path = rawstart
         self.mc = None
 
+    def _get_stm_tl(self, adr):
+        """Makes 'adr' relative to threadlocal-base if we run in STM. 
+        Before using such a relative address, call 
+        self._stm_tl_segment_prefix_if_necessary."""
+        if self.cpu.gc_ll_descr.stm and we_are_translated():
+            # also not during tests
+            result = adr - stmtlocal.threadlocal_base()
+            assert rx86.fits_in_32bits(result)
+            return result
+        return adr
+
+    def _stm_tl_segment_prefix_if_necessary(self, mc):
+        if self.cpu.gc_ll_descr.stm and we_are_translated():
+            stmtlocal.tl_segment_prefix(mc)
+        
     def _build_stack_check_slowpath(self):
         _, _, slowpathaddr = self.cpu.insert_stack_check()
         if slowpathaddr == 0 or not self.cpu.propagate_exception_descr:
@@ -294,7 +309,9 @@
         else:
             mc.ADD_ri(esp.value, WORD)
         #
-        mc.MOV(eax, heap(self.cpu.pos_exception()))
+        ea = self._get_stm_tl(self.cpu.pos_exception())
+        self._stm_tl_segment_prefix_if_necessary(mc)
+        mc.MOV(eax, heap(ea))
         mc.TEST_rr(eax.value, eax.value)
         mc.J_il8(rx86.Conditions['NZ'], 0)
         jnz_location = mc.get_relative_pos()
@@ -1740,7 +1757,9 @@
 
     def genop_guard_guard_no_exception(self, ign_1, guard_op, guard_token,
                                        locs, ign_2):
-        self.mc.CMP(heap(self.cpu.pos_exception()), imm0)
+        ea = self._get_stm_tl(self.cpu.pos_exception())
+        self._stm_tl_segment_prefix_if_necessary(self.mc)
+        self.mc.CMP(heap(ea), imm0)
         self.implement_guard(guard_token, 'NZ')
 
     def genop_guard_guard_not_invalidated(self, ign_1, guard_op, guard_token,
@@ -1753,7 +1772,9 @@
                                     locs, resloc):
         loc = locs[0]
         loc1 = locs[1]
-        self.mc.MOV(loc1, heap(self.cpu.pos_exception()))
+        ea = self._get_stm_tl(self.cpu.pos_exception())
+        self._stm_tl_segment_prefix_if_necessary(self.mc)
+        self.mc.MOV(loc1, heap(ea))
         self.mc.CMP(loc1, loc)
         self.implement_guard(guard_token, 'NE')
         self._store_and_reset_exception(self.mc, resloc)
@@ -1763,30 +1784,43 @@
         """ Resest the exception. If excvalloc is None, then store it on the
         frame in jf_guard_exc
         """
+        eva = self._get_stm_tl(self.cpu.pos_exc_value())
+        ea = self._get_stm_tl(self.cpu.pos_exception())
+        #
+        self._stm_tl_segment_prefix_if_necessary(mc)
         if excvalloc is not None:
             assert excvalloc.is_core_reg()
-            mc.MOV(excvalloc, heap(self.cpu.pos_exc_value()))
+            mc.MOV(excvalloc, heap(eva))
         elif tmploc is not None: # if both are None, just ignore
             ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
-            mc.MOV(tmploc, heap(self.cpu.pos_exc_value()))
+            mc.MOV(tmploc, heap(eva))
             mc.MOV(RawEbpLoc(ofs), tmploc)
+        #
         if exctploc is not None:
             assert exctploc.is_core_reg()
-            mc.MOV(exctploc, heap(self.cpu.pos_exception()))
-
-        mc.MOV(heap(self.cpu.pos_exception()), imm0)
-        mc.MOV(heap(self.cpu.pos_exc_value()), imm0)
+            self._stm_tl_segment_prefix_if_necessary(mc)
+            mc.MOV(exctploc, heap(ea))
+        #
+        self._stm_tl_segment_prefix_if_necessary(mc)
+        mc.MOV(heap(ea), imm0)
+        self._stm_tl_segment_prefix_if_necessary(mc)
+        mc.MOV(heap(eva), imm0)
 
     def _restore_exception(self, mc, excvalloc, exctploc, tmploc=None):
+        eva = self._get_stm_tl(self.cpu.pos_exc_value())
+        ea = self._get_stm_tl(self.cpu.pos_exception())
         if excvalloc is not None:
-            mc.MOV(heap(self.cpu.pos_exc_value()), excvalloc)
+            self._stm_tl_segment_prefix_if_necessary(mc)
+            mc.MOV(heap(eva), excvalloc)
         else:
             assert tmploc is not None
             ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
             mc.MOV(tmploc, RawEbpLoc(ofs))
             mc.MOV_bi(ofs, 0)
-            mc.MOV(heap(self.cpu.pos_exc_value()), tmploc)
-        mc.MOV(heap(self.cpu.pos_exception()), exctploc)
+            self._stm_tl_segment_prefix_if_necessary(mc)
+            mc.MOV(heap(eva), tmploc)
+        self._stm_tl_segment_prefix_if_necessary(mc)
+        mc.MOV(heap(ea), exctploc)
 
     def _gen_guard_overflow(self, guard_op, guard_token):
         guard_opnum = guard_op.getopnum()
@@ -1983,9 +2017,14 @@
 
         if exc:
             # We might have an exception pending.  Load it into ebx...
-            mc.MOV(ebx, heap(self.cpu.pos_exc_value()))
-            mc.MOV(heap(self.cpu.pos_exception()), imm0)
-            mc.MOV(heap(self.cpu.pos_exc_value()), imm0)
+            eva = self._get_stm_tl(self.cpu.pos_exc_value())
+            ea = self._get_stm_tl(self.cpu.pos_exception())
+            self._stm_tl_segment_prefix_if_necessary(mc)
+            mc.MOV(ebx, heap(eva))
+            self._stm_tl_segment_prefix_if_necessary(mc)
+            mc.MOV(heap(ea), imm0)
+            self._stm_tl_segment_prefix_if_necessary(mc)
+            mc.MOV(heap(eva), imm0)
             # ...and save ebx into 'jf_guard_exc'
             offset = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
             mc.MOV_br(offset, ebx.value)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to