[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