Author: Armin Rigo <ar...@tunes.org> Branch: jit-targets Changeset: r48779:8e7affa7409d Date: 2011-11-05 13:33 +0100 http://bitbucket.org/pypy/pypy/changeset/8e7affa7409d/
Log: Support LABEL in the x86 backend. Probably not RPython yet. diff --git a/pypy/jit/backend/llgraph/llimpl.py b/pypy/jit/backend/llgraph/llimpl.py --- a/pypy/jit/backend/llgraph/llimpl.py +++ b/pypy/jit/backend/llgraph/llimpl.py @@ -638,7 +638,7 @@ # return _op_default_implementation - def op_target(self, _, *args): + def op_label(self, _, *args): pass def op_debug_merge_point(self, _, *args): diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py --- a/pypy/jit/backend/llgraph/runner.py +++ b/pypy/jit/backend/llgraph/runner.py @@ -183,7 +183,7 @@ if isinstance(descr, history.LoopToken): if op.getopnum() != rop.JUMP: llimpl.compile_add_loop_token(c, descr) - if isinstance(descr, history.TargetToken) and op.getopnum() == rop.TARGET: + if isinstance(descr, history.TargetToken) and op.getopnum() == rop.LABEL: llimpl.compile_add_target_token(c, descr) if self.is_oo and isinstance(descr, (OODescr, MethDescr)): # hack hack, not rpython diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py --- a/pypy/jit/backend/test/runner_test.py +++ b/pypy/jit/backend/test/runner_test.py @@ -2971,13 +2971,13 @@ i2 = BoxInt() i3 = BoxInt() looptoken = LoopToken() - targettoken = TargetToken() + targettoken = TargetToken(None) faildescr = BasicFailDescr(2) operations = [ ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1), ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2), ResOperation(rop.GUARD_TRUE, [i2], None, descr=faildescr), - ResOperation(rop.TARGET, [i1], None, descr=targettoken), + ResOperation(rop.LABEL, [i1], None, descr=targettoken), ResOperation(rop.INT_GE, [i1, ConstInt(0)], i3), ResOperation(rop.GUARD_TRUE, [i3], None, descr=BasicFailDescr(3)), ResOperation(rop.JUMP, [i1], None, descr=looptoken), diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py --- a/pypy/jit/backend/x86/assembler.py +++ b/pypy/jit/backend/x86/assembler.py @@ -152,14 +152,13 @@ allblocks = self.get_asmmemmgr_blocks(looptoken) self.datablockwrapper = MachineDataBlockWrapper(self.cpu.asmmemmgr, allblocks) + self.target_tokens_currently_compiling = {} def teardown(self): self.pending_guard_tokens = None if WORD == 8: self.pending_memoryerror_trampoline_from = None self.mc = None - self.looppos = -1 - self.currently_compiling_loop = None self.current_clt = None def finish_once(self): @@ -443,7 +442,6 @@ assert len(set(inputargs)) == len(inputargs) self.setup(looptoken) - self.currently_compiling_loop = looptoken if log: self._register_counter(False, looptoken.number) operations = self._inject_debugging_code(looptoken, operations) @@ -455,7 +453,9 @@ bootstrappos = self.mc.get_relative_pos() stackadjustpos = self._assemble_bootstrap_code(inputargs, arglocs) - self.looppos = self.mc.get_relative_pos() + looppos = self.mc.get_relative_pos() + looptoken._x86_loop_code = looppos + self.target_tokens_currently_compiling[looptoken] = None looptoken._x86_frame_depth = -1 # temporarily looptoken._x86_param_depth = -1 # temporarily frame_depth, param_depth = self._assemble(regalloc, operations) @@ -463,7 +463,7 @@ looptoken._x86_param_depth = param_depth directbootstrappos = self.mc.get_relative_pos() - self._assemble_bootstrap_direct_call(arglocs, self.looppos, + self._assemble_bootstrap_direct_call(arglocs, looppos, frame_depth+param_depth) self.write_pending_failure_recoveries() fullsize = self.mc.get_relative_pos() @@ -472,7 +472,7 @@ debug_start("jit-backend-addr") debug_print("Loop %d (%s) has address %x to %x (bootstrap %x)" % ( looptoken.number, loopname, - rawstart + self.looppos, + rawstart + looppos, rawstart + directbootstrappos, rawstart)) debug_stop("jit-backend-addr") @@ -488,8 +488,8 @@ looptoken._x86_ops_offset = ops_offset looptoken._x86_bootstrap_code = rawstart + bootstrappos - looptoken._x86_loop_code = rawstart + self.looppos looptoken._x86_direct_bootstrap_code = rawstart + directbootstrappos + self.fixup_target_tokens(rawstart) self.teardown() # oprofile support if self.cpu.profile_agent is not None: @@ -548,6 +548,7 @@ # patch the jump from original guard self.patch_jump_for_descr(faildescr, rawstart) ops_offset = self.mc.ops_offset + self.fixup_target_tokens(rawstart) self.teardown() # oprofile support if self.cpu.profile_agent is not None: @@ -668,6 +669,11 @@ mc.copy_to_raw_memory(adr_target) faildescr._x86_adr_jump_offset = 0 # means "patched" + def fixup_target_tokens(self, rawstart): + for looptoken in self.target_tokens_currently_compiling: + looptoken._x86_loop_code += rawstart + self.target_tokens_currently_compiling = None + @specialize.argtype(1) def _inject_debugging_code(self, looptoken, operations): if self._debug: @@ -2576,11 +2582,12 @@ return loop_token._x86_arglocs def closing_jump(self, loop_token): - if loop_token is self.currently_compiling_loop: + target = loop_token._x86_loop_code + if loop_token in self.target_tokens_currently_compiling: curpos = self.mc.get_relative_pos() + 5 - self.mc.JMP_l(self.looppos - curpos) + self.mc.JMP_l(target - curpos) else: - self.mc.JMP(imm(loop_token._x86_loop_code)) + self.mc.JMP(imm(target)) def malloc_cond(self, nursery_free_adr, nursery_top_adr, size, tid): size = max(size, self.cpu.gc_ll_descr.minimal_size_in_nursery) diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py --- a/pypy/jit/backend/x86/regalloc.py +++ b/pypy/jit/backend/x86/regalloc.py @@ -5,7 +5,8 @@ import os from pypy.jit.metainterp.history import (Box, Const, ConstInt, ConstPtr, ResOperation, BoxPtr, ConstFloat, - BoxFloat, LoopToken, INT, REF, FLOAT) + BoxFloat, LoopToken, INT, REF, FLOAT, + TargetToken) from pypy.jit.backend.x86.regloc import * from pypy.rpython.lltypesystem import lltype, rffi, rstr from pypy.rlib.objectmodel import we_are_translated @@ -1313,9 +1314,9 @@ assembler = self.assembler assert self.jump_target_descr is None descr = op.getdescr() - assert isinstance(descr, LoopToken) + assert isinstance(descr, (LoopToken, TargetToken)) # XXX refactor! + nonfloatlocs, floatlocs = assembler.target_arglocs(descr) self.jump_target_descr = descr - nonfloatlocs, floatlocs = assembler.target_arglocs(self.jump_target_descr) # compute 'tmploc' to be all_regs[0] by spilling what is there box = TempBox() box1 = TempBox() @@ -1388,6 +1389,27 @@ # the FORCE_TOKEN operation returns directly 'ebp' self.rm.force_allocate_frame_reg(op.result) + def consider_label(self, op): + # XXX big refactoring needed? + descr = op.getdescr() + assert isinstance(descr, TargetToken) + inputargs = op.getarglist() + floatlocs = [None] * len(inputargs) + nonfloatlocs = [None] * len(inputargs) + for i in range(len(inputargs)): + arg = inputargs[i] + assert not isinstance(arg, Const) + loc = self.loc(arg) + if arg.type == FLOAT: + floatlocs[i] = loc + else: + nonfloatlocs[i] = loc + descr._x86_arglocs = nonfloatlocs, floatlocs + descr._x86_loop_code = self.assembler.mc.get_relative_pos() + descr._x86_frame_depth = self.fm.frame_depth + descr._x86_param_depth = self.param_depth + self.assembler.target_tokens_currently_compiling[descr] = None + def not_implemented_op(self, op): not_implemented("not implemented operation: %s" % op.getopname()) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit