[pypy-commit] pypy s390x-backend: many more methods in place. it is now possible to step through the whole assemble_loop method for a trace with like int_add(...), finish(...). sadly the code is not yet correct :)
plan_rich
noreply at buildbot.pypy.org
Mon Oct 26 10:49:22 EDT 2015
Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r80464:bc3119a598cf
Date: 2015-10-26 15:38 +0100
http://bitbucket.org/pypy/pypy/changeset/bc3119a598cf/
Log: many more methods in place. it is now possible to step through the
whole assemble_loop method for a trace with like int_add(...),
finish(...). sadly the code is not yet correct :)
diff --git a/rpython/jit/backend/zarch/assembler.py b/rpython/jit/backend/zarch/assembler.py
--- a/rpython/jit/backend/zarch/assembler.py
+++ b/rpython/jit/backend/zarch/assembler.py
@@ -6,10 +6,13 @@
from rpython.jit.backend.zarch import registers as r
from rpython.jit.backend.zarch import locations as loc
from rpython.jit.backend.zarch.codebuilder import InstrBuilder
-from rpython.jit.backend.zarch.arch import WORD
+from rpython.jit.backend.zarch.arch import (WORD, JITFRAME_FIXED_SIZE)
from rpython.jit.backend.zarch.opassembler import IntOpAssembler
from rpython.jit.backend.zarch.regalloc import Regalloc
from rpython.jit.metainterp.resoperation import rop
+from rpython.rlib.debug import (debug_print, debug_start, debug_stop,
+ have_debug_prints)
+from rpython.rlib.rarithmetic import r_uint
from rpython.rlib.objectmodel import we_are_translated, specialize, compute_unique_id
from rpython.rlib import rgc
from rpython.rtyper.lltypesystem import lltype, rffi, llmemory
@@ -35,7 +38,8 @@
self.debug = False
self.current_clt = looptoken.compiled_loop_token
self.mc = InstrBuilder()
- self.pending_guards = []
+ self.pending_guard_tokens = []
+ self.pending_guard_tokens_recovered = 0
#assert self.datablockwrapper is None --- but obscure case
# possible, e.g. getting MemoryError and continuing
allblocks = self.get_asmmemmgr_blocks(looptoken)
@@ -259,6 +263,67 @@
assert 0, "not supported location"
assert 0, "not supported location"
+ def update_frame_depth(self, frame_depth):
+ if frame_depth > 0x7fff:
+ raise JitFrameTooDeep
+ baseofs = self.cpu.get_baseofs_of_frame_field()
+ self.current_clt.frame_info.update_frame_depth(baseofs, frame_depth)
+
+ def write_pending_failure_recoveries(self):
+ # for each pending guard, generate the code of the recovery stub
+ # at the end of self.mc.
+ for i in range(self.pending_guard_tokens_recovered,
+ len(self.pending_guard_tokens)):
+ tok = self.pending_guard_tokens[i]
+ tok.pos_recovery_stub = self.generate_quick_failure(tok)
+ self.pending_guard_tokens_recovered = len(self.pending_guard_tokens)
+
+ def patch_stack_checks(self, frame_depth):
+ if frame_depth > 0x7fff:
+ raise JitFrameTooDeep # XXX
+ for traps_pos, jmp_target in self.frame_depth_to_patch:
+ pmc = OverwritingBuilder(self.mc, traps_pos, 3)
+ # three traps, so exactly three instructions to patch here
+ #pmc.cmpdi(0, r.r2.value, frame_depth) # 1
+ #pmc.bc(7, 0, jmp_target - (traps_pos + 4)) # 2 "bge+"
+ #pmc.li(r.r0.value, frame_depth) # 3
+ #pmc.overwrite()
+
+ def materialize_loop(self, looptoken):
+ self.datablockwrapper.done()
+ self.datablockwrapper = None
+ allblocks = self.get_asmmemmgr_blocks(looptoken)
+ start = self.mc.materialize(self.cpu, allblocks,
+ self.cpu.gc_ll_descr.gcrootmap)
+ return start
+
+ def patch_pending_failure_recoveries(self, rawstart):
+ assert (self.pending_guard_tokens_recovered ==
+ len(self.pending_guard_tokens))
+ clt = self.current_clt
+ for tok in self.pending_guard_tokens:
+ addr = rawstart + tok.pos_jump_offset
+ #
+ # XXX see patch_jump_for_descr()
+ tok.faildescr.adr_jump_offset = rawstart + tok.pos_recovery_stub
+ #
+ relative_target = tok.pos_recovery_stub - tok.pos_jump_offset
+ #
+ if not tok.guard_not_invalidated():
+ mc = InstrBuilder()
+ mc.b_cond_offset(relative_target, tok.fcond)
+ mc.copy_to_raw_memory(addr)
+ else:
+ # GUARD_NOT_INVALIDATED, record an entry in
+ # clt.invalidate_positions of the form:
+ # (addr-in-the-code-of-the-not-yet-written-jump-target,
+ # relative-target-to-use)
+ relpos = tok.pos_jump_offset
+ clt.invalidate_positions.append((rawstart + relpos,
+ relative_target))
+
+
+
# ________________________________________
# ASSEMBLER EMISSION
More information about the pypy-commit
mailing list