[pypy-commit] pypy jit-targets: Support LABEL in the x86 backend. Probably not RPython yet.
arigo
noreply at buildbot.pypy.org
Sat Nov 5 13:34:06 CET 2011
Author: Armin Rigo <arigo at 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())
More information about the pypy-commit
mailing list