Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60300:9071ec11ee34
Date: 2013-01-21 19:26 +0200
http://bitbucket.org/pypy/pypy/changeset/9071ec11ee34/
Log: solid refactoring - gcmap is now per call
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
@@ -197,11 +197,13 @@
self._push_all_regs_to_frame(mc, [], self.cpu.supports_floats)
assert not IS_X86_32
# push first arg
+ mc.POP_r(ecx.value)
+ gcmap_ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap')
+ mc.MOV_br(gcmap_ofs, ecx.value)
mc.LEA_rb(edi.value, -base_ofs)
- mc.SUB_ri(esp.value, WORD) # we need that cause we're inside a call
mc.CALL(imm(self.cpu.realloc_frame))
- mc.ADD_ri(esp.value, WORD)
mc.LEA_rm(ebp.value, (eax.value, base_ofs))
+ mc.MOV_bi(gcmap_ofs, 0)
self._pop_all_regs_from_frame(mc, [], self.cpu.supports_floats)
mc.RET()
self._stack_check_failure = mc.materialize(self.cpu.asmmemmgr, [])
@@ -581,7 +583,8 @@
operations,
self.current_clt.allgcrefs,
self.current_clt.frame_info)
- stack_check_patch_ofs = self._check_frame_depth(self.mc)
+ stack_check_patch_ofs = self._check_frame_depth(self.mc,
+ regalloc.get_gcmap())
frame_depth = self._assemble(regalloc, inputargs, operations)
codeendpos = self.mc.get_relative_pos()
self.write_pending_failure_recoveries()
@@ -662,7 +665,7 @@
mc.writeimm32(self.error_trampoline_64 - pos_after_jz)
mc.copy_to_raw_memory(rawstart + pos_after_jz - 4)
- def _check_frame_depth(self, mc):
+ def _check_frame_depth(self, mc, gcmap):
""" check if the frame is of enough depth to follow this bridge.
Otherwise reallocate the frame in a helper.
There are other potential solutions
@@ -676,6 +679,7 @@
assert not IS_X86_32
mc.J_il8(rx86.Conditions['GE'], 0)
jg_location = mc.get_relative_pos()
+ self.push_gcmap(mc, gcmap, push=True)
mc.CALL(imm(self._stack_check_failure))
# patch the JG above
offset = mc.get_relative_pos() - jg_location
@@ -1218,7 +1222,9 @@
dst_locs.append(r10)
x = r10
remap_frame_layout(self, src_locs, dst_locs, X86_64_SCRATCH_REG)
+ self.push_gcmap(self.mc, self._regalloc.get_gcmap(), store=True)
self.mc.CALL(x)
+ self.pop_gcmap(self.mc)
if align:
self.mc.ADD_ri(esp.value, align * WORD)
self._reload_frame_if_necessary(self.mc)
@@ -1867,13 +1873,28 @@
# mc.JMP(imm(target))
#else:
mc.PUSH(imm(fail_descr))
- gcmapref = lltype.cast_opaque_ptr(llmemory.GCREF, guardtok.gcmap)
+ self.push_gcmap(mc, guardtok.gcmap, push=True)
+ mc.JMP(imm(target))
+ return startpos
+
+ def push_gcmap(self, mc, gcmap, push=False, mov=False, store=False):
+ gcmapref = lltype.cast_opaque_ptr(llmemory.GCREF, gcmap)
# keep the ref alive
self.current_clt.allgcrefs.append(gcmapref)
rgc._make_sure_does_not_move(gcmapref)
- mc.PUSH(imm(rffi.cast(lltype.Signed, gcmapref)))
- mc.JMP(imm(target))
- return startpos
+ if push:
+ mc.PUSH(imm(rffi.cast(lltype.Signed, gcmapref)))
+ elif mov:
+ mc.MOV(RawEspLoc(0, REF),
+ imm(rffi.cast(lltype.Signed, gcmapref)))
+ else:
+ assert store
+ ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap')
+ mc.MOV(raw_stack(ofs), imm(rffi.cast(lltype.Signed, gcmapref)))
+
+ def pop_gcmap(self, mc):
+ ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap')
+ mc.MOV_bi(ofs, 0)
def rebuild_faillocs_from_descr(self, descr, inputargs):
locs = []
@@ -2402,12 +2423,8 @@
self.mc.CMP(edi, heap(nursery_top_adr))
self.mc.J_il8(rx86.Conditions['NA'], 0) # patched later
jmp_adr = self.mc.get_relative_pos()
- # this is a 32bit gcpattern that describes where are GC roots
- # in registers (which will be saved while doing slowpath)
- # store it on top of the stack (we might not have a register free)
- gcmapref = lltype.cast_opaque_ptr(llmemory.GCREF, gcmap)
- rgc._make_sure_does_not_move(gcmapref)
- self.mc.MOV(RawEspLoc(0, REF), imm(rffi.cast(lltype.Signed, gcmapref)))
+ # save the gcmap
+ self.push_gcmap(self.mc, gcmap, mov=True)
self.mc.CALL(imm(self.malloc_slowpath))
offset = self.mc.get_relative_pos() - jmp_adr
assert 0 < offset <= 127
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -896,14 +896,14 @@
self.rm.force_allocate_reg(tmp_box, selected_reg=edi)
self.rm.possibly_free_var(tmp_box)
#
- gcmap = self._compute_gcmap()
+ gcmap = self.get_gcmap()
gc_ll_descr = self.assembler.cpu.gc_ll_descr
self.assembler.malloc_cond(
gc_ll_descr.get_nursery_free_addr(),
gc_ll_descr.get_nursery_top_addr(),
size, gcmap)
- def _compute_gcmap(self):
+ def get_gcmap(self):
frame_depth = self.fm.get_frame_depth()
size = frame_depth + JITFRAME_FIXED_SIZE
gcmap = lltype.malloc(GCMAP, size // WORD // 8 + 1,
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit