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