[pypy-svn] r79678 - in pypy/branch/jit-free-asm2/pypy/jit/backend: llsupport x86 x86/test

arigo at codespeak.net arigo at codespeak.net
Tue Nov 30 15:33:31 CET 2010


Author: arigo
Date: Tue Nov 30 15:33:30 2010
New Revision: 79678

Modified:
   pypy/branch/jit-free-asm2/pypy/jit/backend/llsupport/asmmemmgr.py
   pypy/branch/jit-free-asm2/pypy/jit/backend/x86/assembler.py
   pypy/branch/jit-free-asm2/pypy/jit/backend/x86/regalloc.py
   pypy/branch/jit-free-asm2/pypy/jit/backend/x86/test/test_gc_integration.py
Log:
Work in progress.


Modified: pypy/branch/jit-free-asm2/pypy/jit/backend/llsupport/asmmemmgr.py
==============================================================================
--- pypy/branch/jit-free-asm2/pypy/jit/backend/llsupport/asmmemmgr.py	(original)
+++ pypy/branch/jit-free-asm2/pypy/jit/backend/llsupport/asmmemmgr.py	Tue Nov 30 15:33:30 2010
@@ -206,7 +206,6 @@
     SUBBLOCK_PTR.TO.become(SUBBLOCK)
 
     gcroot_markers = None
-    gcroot_markers_total_size = 0
 
     def __init__(self, translated=None):
         if translated is None:
@@ -274,11 +273,8 @@
         self.copy_to_raw_memory(rawstart)
         if self.gcroot_markers is not None:
             assert gcrootmap is not None
-            gcrootmap.add_raw_gcroot_markers(asmmemmgr,
-                                             allblocks,
-                                             self.gcroot_markers,
-                                             self.gcroot_markers_total_size,
-                                             rawstart)
+            for pos, mark in self.gcroot_markers:
+                gcrootmap.put(rawstart + pos, mark)
         return rawstart
 
     def _become_a_plain_block_builder(self):
@@ -297,4 +293,3 @@
         if self.gcroot_markers is None:
             self.gcroot_markers = []
         self.gcroot_markers.append((self.get_relative_pos(), mark))
-        self.gcroot_markers_total_size += len(mark)

Modified: pypy/branch/jit-free-asm2/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/jit-free-asm2/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/jit-free-asm2/pypy/jit/backend/x86/assembler.py	Tue Nov 30 15:33:30 2010
@@ -1,5 +1,6 @@
 import sys, os
 from pypy.jit.backend.llsupport import symbolic
+from pypy.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
 from pypy.jit.metainterp.history import Const, Box, BoxInt, BoxPtr, BoxFloat
 from pypy.jit.metainterp.history import (AbstractFailDescr, INT, REF, FLOAT,
                                          LoopToken)
@@ -83,6 +84,7 @@
         self.debug_counter_descr = cpu.fielddescrof(DEBUG_COUNTER, 'i')
         self.fail_boxes_count = 0
         self._current_depths_cache = (0, 0)
+        self.datablockwrapper = None
         self.teardown()
 
     def leave_jitted_hook(self):
@@ -125,10 +127,14 @@
         self.set_debug(have_debug_prints())
         debug_stop('jit-backend-counts')
 
-    def setup(self):
+    def setup(self, looptoken):
         assert self.memcpy_addr != 0, "setup_once() not called?"
         self.pending_guard_tokens = []
         self.mc = codebuf.MachineCodeBlockWrapper()
+        if self.datablockwrapper is None:
+            allblocks = looptoken.compiled_loop_token.asmmemmgr_blocks
+            self.datablockwrapper = MachineDataBlockWrapper(self.cpu.asmmemmgr,
+                                                            allblocks)
 
     def teardown(self):
         self.pending_guard_tokens = None
@@ -209,7 +215,7 @@
             # Arguments should be unique
             assert len(set(inputargs)) == len(inputargs)
 
-        self.setup()
+        self.setup(looptoken)
         self.currently_compiling_loop = looptoken
         funcname = self._find_debug_merge_point(operations)
         if log:
@@ -235,7 +241,7 @@
         self.write_pending_failure_recoveries()
         fullsize = self.mc.get_relative_pos()
         #
-        rawstart = self.materialize(looptoken)
+        rawstart = self.materialize_loop(looptoken)
         debug_print("Loop #%d (%s) has address %x to %x" % (
             looptoken.number, funcname,
             rawstart + self.looppos,
@@ -268,7 +274,7 @@
                         "was already compiled!")
             return
 
-        self.setup()
+        self.setup(original_loop_token)
         funcname = self._find_debug_merge_point(operations)
         if log:
             self._register_counter()
@@ -289,7 +295,7 @@
         self.write_pending_failure_recoveries()
         fullsize = self.mc.get_relative_pos()
         #
-        rawstart = self.materialize(original_loop_token)
+        rawstart = self.materialize_loop(original_loop_token)
 
         debug_print("Bridge out of guard %d (%s) has address %x to %x" %
                     (descr_number, funcname, rawstart, rawstart + codeendpos))
@@ -328,7 +334,9 @@
             p = rffi.cast(rffi.INTP, addr)
             p[0] = rffi.cast(rffi.INT, relative_target)
 
-    def materialize(self, looptoken):
+    def materialize_loop(self, looptoken):
+        self.datablockwrapper.done()      # finish using cpu.asmmemmgr
+        self.datablockwrapper = None
         clt = looptoken.compiled_loop_token
         if clt.asmmemmgr_blocks is None:
             clt.asmmemmgr_blocks = []

Modified: pypy/branch/jit-free-asm2/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/jit-free-asm2/pypy/jit/backend/x86/regalloc.py	(original)
+++ pypy/branch/jit-free-asm2/pypy/jit/backend/x86/regalloc.py	Tue Nov 30 15:33:30 2010
@@ -1108,7 +1108,8 @@
             if (isinstance(v, BoxPtr) and self.rm.stays_alive(v)):
                 assert reg in self.rm.REGLOC_TO_GCROOTMAP_REG_INDEX
                 gcrootmap.add_callee_save_reg(shape, self.rm.REGLOC_TO_GCROOTMAP_REG_INDEX[reg])
-        return shape
+        return gcrootmap.compress_callshape(shape,
+                                            self.assembler.datablockwrapper)
 
     def consider_force_token(self, op):
         loc = self.rm.force_allocate_reg(op.result)

Modified: pypy/branch/jit-free-asm2/pypy/jit/backend/x86/test/test_gc_integration.py
==============================================================================
--- pypy/branch/jit-free-asm2/pypy/jit/backend/x86/test/test_gc_integration.py	(original)
+++ pypy/branch/jit-free-asm2/pypy/jit/backend/x86/test/test_gc_integration.py	Tue Nov 30 15:33:30 2010
@@ -33,6 +33,10 @@
     def add_callee_save_reg(self, shape, reg_index):
         index_to_name = { 1: 'ebx', 2: 'esi', 3: 'edi' }
         shape.append(index_to_name[reg_index])
+    def compress_callshape(self, shape, datablockwrapper):
+        assert datablockwrapper == 'fakedatablockwrapper'
+        assert shape[0] == 'shape'
+        return ['compressed'] + shape[1:]
 
 class MockGcDescr(GcCache):
     def get_funcptr_for_new(self):
@@ -57,6 +61,7 @@
         cpu = CPU(None, None)
         cpu.setup_once()
         regalloc = RegAlloc(MockAssembler(cpu, MockGcDescr(False)))
+        regalloc.assembler.datablockwrapper = 'fakedatablockwrapper'
         boxes = [BoxPtr() for i in range(len(X86RegisterManager.all_regs))]
         longevity = {}
         for box in boxes:
@@ -79,7 +84,7 @@
         assert len(regalloc.assembler.movs) == 3
         #
         mark = regalloc.get_mark_gc_roots(cpu.gc_ll_descr.gcrootmap)
-        assert mark[0] == 'shape'
+        assert mark[0] == 'compressed'
         base = -WORD * FRAME_FIXED_SIZE
         expected = ['ebx', 'esi', 'edi', base, base-WORD, base-WORD*2]
         assert dict.fromkeys(mark[1:]) == dict.fromkeys(expected)



More information about the Pypy-commit mailing list