Author: Armin Rigo <[email protected]>
Branch: stmgc-c4
Changeset: r66097:977c929b6804
Date: 2013-08-12 19:24 +0200
http://bitbucket.org/pypy/pypy/changeset/977c929b6804/

Log:    merge heads

diff --git a/pypy/tool/jitlogparser/parser.py b/pypy/tool/jitlogparser/parser.py
--- a/pypy/tool/jitlogparser/parser.py
+++ b/pypy/tool/jitlogparser/parser.py
@@ -90,7 +90,7 @@
                 v = elem   # --- more compactly:  " ".join(e[2:])
                 if not start:
                     start = int(adr.strip(":"), 16)
-                ofs = int(adr.strip(":"), 16) - start
+                ofs = int(adr.strip(":"), 16)
                 # add symbols to addresses:
                 for addr in lineaddresses(v):
                     sym = symbols.get(addr)
@@ -100,6 +100,7 @@
                 if ofs >= 0:
                     asm.append((ofs, v.strip("\n")))
             #
+            prefix = hex(dump_start)[:-8]
             asm_index = 0
             for i, op in enumerate(loop.operations):
                 end = 0
@@ -113,12 +114,14 @@
                     else:
                         end = loop.operations[j].offset
                 if op.offset is not None:
-                    while asm[asm_index][0] < op.offset:
+                    while asm[asm_index][0] - start < op.offset:
                         asm_index += 1
                     end_index = asm_index
-                    while asm[end_index][0] < end and end_index < len(asm) - 1:
+                    while asm[end_index][0] - start < end and end_index < 
len(asm) - 1:
                         end_index += 1
-                    op.asm = '\n'.join([asm[i][1] for i in range(asm_index, 
end_index)])
+                    op.asm = '\n'.join([
+                        prefix+hex(asm[i][0])[2:] + ": " + asm[i][1] 
+                        for i in range(asm_index, end_index)])
         return loop
 
     def _asm_disassemble(self, d, origin_addr, tp):
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/tool/viewcode.py 
b/rpython/jit/backend/tool/viewcode.py
--- a/rpython/jit/backend/tool/viewcode.py
+++ b/rpython/jit/backend/tool/viewcode.py
@@ -59,7 +59,7 @@
         'arm_32': 'arm',
     }
     cmd = find_objdump()
-    objdump = ('%(command)s -M %(backend)s -b binary -m %(machine)s '
+    objdump = ('%(command)s -w -M %(backend)s -b binary -m %(machine)s '
                '--disassembler-options=intel-mnemonics '
                '--adjust-vma=%(origin)d -D %(file)s')
     #
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)
diff --git a/rpython/jit/backend/x86/test/test_stm_integration.py 
b/rpython/jit/backend/x86/test/test_stm_integration.py
--- a/rpython/jit/backend/x86/test/test_stm_integration.py
+++ b/rpython/jit/backend/x86/test/test_stm_integration.py
@@ -320,6 +320,7 @@
             self.cpu.execute_token(looptoken, sgcref)
             self.assert_in(called_on, [sgcref])
 
+            
     def test_ptr_eq_fastpath(self):
         cpu = self.cpu
         cpu.gc_ll_descr.init_nursery(100)
@@ -339,20 +340,28 @@
                   ConstPtr(s1),
                   ConstPtr(s2)]
             for p1, p2 in itertools.combinations(ps, 2):
-                for guard in [None, rop.GUARD_TRUE, rop.GUARD_FALSE]:
+                for guard in [None, rop.GUARD_TRUE, rop.GUARD_FALSE,
+                              rop.GUARD_VALUE]:
                     cpu.gc_ll_descr.clear_lists()
 
                     # BUILD OPERATIONS:
                     i = i0
                     guarddescr = BasicFailDescr()
                     finaldescr = BasicFinalDescr()
-                    operations = [ResOperation(rop.PTR_EQ, [p1, p2], i0)]
-                    if guard is not None:
-                        gop = ResOperation(guard, [i0], None, 
+                    if guard == rop.GUARD_VALUE:
+                        gop = ResOperation(rop.GUARD_VALUE, [p1, p2], None,
                                            descr=guarddescr)
                         gop.setfailargs([])
-                        operations.append(gop)
+                        operations = [gop]
                         i = i1
+                    else:
+                        operations = [ResOperation(rop.PTR_EQ, [p1, p2], i0)]
+                        if guard is not None:
+                            gop = ResOperation(guard, [i0], None, 
+                                               descr=guarddescr)
+                            gop.setfailargs([])
+                            operations.append(gop)
+                            i = i1
                     # finish must depend on result of ptr_eq if no guard
                     # is inbetween (otherwise ptr_eq gets deleted)
                     # if there is a guard, the result of ptr_eq must not
@@ -393,7 +402,7 @@
 
                     if guard is not None:
                         if s1 == s2:
-                            if guard == rop.GUARD_TRUE:
+                            if guard in (rop.GUARD_TRUE, rop.GUARD_VALUE):
                                 assert not guard_failed
                             else:
                                 assert guard_failed
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to