Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r62159:afa6402200b1
Date: 2013-03-07 10:34 +0200
http://bitbucket.org/pypy/pypy/changeset/afa6402200b1/

Log:    start working on gcmap

diff --git a/rpython/jit/backend/arm/assembler.py 
b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -352,7 +352,7 @@
             self.wb_slowpath[withcards + 2 * withfloats] = rawstart
 
     def _build_malloc_slowpath(self):
-        return # XXX fix me
+        XXX
         mc = ARMv7Builder()
         if self.cpu.supports_floats:
             vfp_regs = r.all_vfp_regs
@@ -1262,7 +1262,7 @@
         else:
             raise AssertionError('Trying to pop to an invalid location')
 
-    def malloc_cond(self, nursery_free_adr, nursery_top_adr, size):
+    def malloc_cond(self, gcmap, nursery_free_adr, nursery_top_adr, size):
         assert size & (WORD-1) == 0     # must be correctly aligned
 
         self.mc.gen_load_int(r.r0.value, nursery_free_adr)
@@ -1291,14 +1291,11 @@
         self.mc.gen_load_int(r.ip.value, nursery_free_adr)
         self.mc.STR_ri(r.r1.value, r.ip.value)
 
-    def push_gcmap(self, mc, gcmap, push=False, mov=False, store=False):
+    def push_gcmap(self, mc, gcmap, push=False, store=False):
         ptr = rffi.cast(lltype.Signed, gcmap)
         if push:
             mc.gen_load_int(r.ip.value, ptr)
             mc.PUSH([r.ip.value])
-        elif mov:
-            assert 0
-            mc.MOV(RawEspLoc(0, REF), ptr)
         else:
             assert store
             ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap')
diff --git a/rpython/jit/backend/arm/opassembler.py 
b/rpython/jit/backend/arm/opassembler.py
--- a/rpython/jit/backend/arm/opassembler.py
+++ b/rpython/jit/backend/arm/opassembler.py
@@ -1293,7 +1293,9 @@
         assert len(arglocs) == 1
         size = arglocs[0].value
         gc_ll_descr = self.cpu.gc_ll_descr
+        gcmap = regalloc.get_gcmap([r.r0, r.r1])
         self.malloc_cond(
+            gcmap,
             gc_ll_descr.get_nursery_free_addr(),
             gc_ll_descr.get_nursery_top_addr(),
             size
diff --git a/rpython/jit/backend/arm/regalloc.py 
b/rpython/jit/backend/arm/regalloc.py
--- a/rpython/jit/backend/arm/regalloc.py
+++ b/rpython/jit/backend/arm/regalloc.py
@@ -15,13 +15,13 @@
                                                     check_imm_box
                                                     )
 from rpython.jit.backend.arm.jump import remap_frame_layout_mixed
-from rpython.jit.backend.arm.arch import MY_COPY_OF_REGS
 from rpython.jit.backend.arm.arch import WORD, JITFRAME_FIXED_SIZE
 from rpython.jit.codewriter import longlong
-from rpython.jit.metainterp.history import (Const, ConstInt, ConstFloat, 
ConstPtr,
-                                        Box, BoxPtr,
-                                        INT, REF, FLOAT)
-from rpython.jit.metainterp.history import JitCellToken, TargetToken
+from rpython.jit.metainterp.history import (Const, ConstInt, ConstFloat,
+                                            ConstPtr, BoxInt,
+                                            Box, BoxPtr,
+                                            INT, REF, FLOAT)
+from rpython.jit.metainterp.history import TargetToken
 from rpython.jit.metainterp.resoperation import rop
 from rpython.jit.backend.llsupport.descr import ArrayDescr
 from rpython.jit.backend.llsupport.gcmap import allocate_gcmap
@@ -32,7 +32,7 @@
 from rpython.jit.backend.llsupport.descr import unpack_arraydescr
 from rpython.jit.backend.llsupport.descr import unpack_fielddescr
 from rpython.jit.backend.llsupport.descr import unpack_interiorfielddescr
-from rpython.rlib.rarithmetic import r_longlong, r_uint
+from rpython.rlib.rarithmetic import r_uint
 
 
 # xxx hack: set a default value for TargetToken._ll_loop_code.  If 0, we know
@@ -338,7 +338,6 @@
         frame_depth = self.fm.get_frame_depth()
         gcmap = allocate_gcmap(self.assembler,
                         frame_depth, JITFRAME_FIXED_SIZE)
-        debug_start("jit-backend-gcmap")
         for box, loc in self.rm.reg_bindings.iteritems():
             if loc in forbidden_regs:
                 continue
@@ -352,9 +351,6 @@
                 assert loc.is_stack()
                 val = loc.value // WORD
                 gcmap[val // WORD // 8] |= r_uint(1) << (val % (WORD * 8))
-        for i in range(len(gcmap)):
-            debug_print(str(gcmap[i]))
-        debug_stop('jit-backend-gcmap')
         return gcmap
 
     # ------------------------------------------------------------
@@ -1012,24 +1008,17 @@
         self.possibly_free_var(t)
         return [imm(size)]
 
-    def get_mark_gc_roots(self, gcrootmap, use_copy_area=False):
-        shape = gcrootmap.get_basic_shape()
-        for v, val in self.frame_manager.bindings.items():
-            if (isinstance(v, BoxPtr) and self.rm.stays_alive(v)):
-                assert val.is_stack()
-                gcrootmap.add_frame_offset(shape, -val.value)
-        for v, reg in self.rm.reg_bindings.items():
-            if reg is r.r0:
-                continue
-            if (isinstance(v, BoxPtr) and self.rm.stays_alive(v)):
-                if use_copy_area:
-                    assert reg in self.rm.REGLOC_TO_COPY_AREA_OFS
-                    area_offset = self.rm.REGLOC_TO_COPY_AREA_OFS[reg]
-                    gcrootmap.add_frame_offset(shape, area_offset)
-                else:
-                    assert 0, 'sure??'
-        return gcrootmap.compress_callshape(shape,
-                                            self.assembler.datablockwrapper)
+    def prepare_op_call_malloc_nursery_varsize_small(self, op, fcond):
+        size_box = op.getarg(0)
+        assert isinstance(size_box, BoxInt)
+        size = size_box.getint()
+
+        self.rm.force_allocate_reg(op.result, selected_reg=r.r0)
+        t = TempInt()
+        self.rm.force_allocate_reg(t, selected_reg=r.r1)
+        self.possibly_free_var(op.result)
+        self.possibly_free_var(t)
+        return [imm(size)]
 
     prepare_op_debug_merge_point = void
     prepare_op_jit_debug = void
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to