[pypy-commit] pypy unroll-if-const: make this work, mostly boilerplate
fijal
noreply at buildbot.pypy.org
Mon Jul 25 18:49:23 CEST 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: unroll-if-const
Changeset: r45974:c44c81b93c25
Date: 2011-07-25 18:49 +0200
http://bitbucket.org/pypy/pypy/changeset/c44c81b93c25/
Log: make this work, mostly boilerplate
diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py
--- a/pypy/jit/metainterp/blackhole.py
+++ b/pypy/jit/metainterp/blackhole.py
@@ -1035,6 +1035,53 @@
return cpu.bh_call_v(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
args_i, args_r, args_f)
+ @arguments("cpu", "j", "i", "R", returns="i")
+ def bhimpl_inline_ifconst_call_r_i(cpu, jitcode, no, args_r):
+ return cpu.bh_call_i(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
+ None, args_r, None)
+ @arguments("cpu", "j", "i", "R", returns="r")
+ def bhimpl_inline_ifconst_call_r_r(cpu, jitcode, no, args_r):
+ return cpu.bh_call_r(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
+ None, args_r, None)
+ @arguments("cpu", "j", "i", "R")
+ def bhimpl_inline_ifconst_call_r_v(cpu, jitcode, no, args_r):
+ return cpu.bh_call_v(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
+ None, args_r, None)
+
+ @arguments("cpu", "j", "i", "I", "R", returns="i")
+ def bhimpl_inline_ifconst_call_ir_i(cpu, jitcode, no, args_i, args_r):
+ return cpu.bh_call_i(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
+ args_i, args_r, None)
+ @arguments("cpu", "j", "i", "I", "R", returns="r")
+ def bhimpl_inline_ifconst_call_ir_r(cpu, jitcode, no, args_i, args_r):
+ return cpu.bh_call_r(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
+ args_i, args_r, None)
+ @arguments("cpu", "j", "i", "I", "R")
+ def bhimpl_inline_ifconst_call_ir_v(cpu, jitcode, no, args_i, args_r):
+ return cpu.bh_call_v(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
+ args_i, args_r, None)
+
+ @arguments("cpu", "j", "i", "I", "R", "F", returns="i")
+ def bhimpl_inline_ifconst_call_irf_i(cpu, jitcode, no, args_i, args_r,
+ args_f):
+ return cpu.bh_call_i(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
+ args_i, args_r, args_f)
+ @arguments("cpu", "j", "i", "I", "R", "F", returns="r")
+ def bhimpl_inline_ifconst_call_irf_r(cpu, jitcode, no, args_i, args_r,
+ args_f):
+ return cpu.bh_call_r(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
+ args_i, args_r, args_f)
+ @arguments("cpu", "j", "i", "I", "R", "F", returns="f")
+ def bhimpl_inline_ifconst_call_irf_f(cpu, jitcode, no, args_i, args_r,
+ args_f):
+ return cpu.bh_call_f(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
+ args_i, args_r, args_f)
+ @arguments("cpu", "j", "i", "I", "R", "F")
+ def bhimpl_inline_ifconst_call_irf_v(cpu, jitcode, no, args_i, args_r,
+ args_f):
+ return cpu.bh_call_v(jitcode.get_fnaddr_as_int(), jitcode.calldescr,
+ args_i, args_r, args_f)
+
@arguments("cpu", "d", "i", returns="r")
def bhimpl_new_array(cpu, arraydescr, length):
return cpu.bh_new_array(arraydescr, length)
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -751,6 +751,27 @@
opimpl_inline_call_irf_f = _opimpl_inline_call3
opimpl_inline_call_irf_v = _opimpl_inline_call3
+ @arguments("jitcode", "int", "boxes")
+ def _opimpl_inline_ifconst_call1(self, jitcode, no, argboxes):
+ return self.do_inline_ifconst_call(jitcode, no, argboxes)
+ @arguments("jitcode", "int", "boxes2")
+ def _opimpl_inline_ifconst_call2(self, jitcode, no, argboxes):
+ return self.do_inline_ifconst_call(jitcode, no, argboxes)
+ @arguments("jitcode", "int", "boxes3")
+ def _opimpl_inline_ifconst_call3(self, jitcode, no, argboxes):
+ return self.do_inline_ifconst_call(jitcode, no, argboxes)
+
+ opimpl_inline_ifconst_call_r_i = _opimpl_inline_ifconst_call1
+ opimpl_inline_ifconst_call_r_r = _opimpl_inline_ifconst_call1
+ opimpl_inline_ifconst_call_r_v = _opimpl_inline_ifconst_call1
+ opimpl_inline_ifconst_call_ir_i = _opimpl_inline_ifconst_call2
+ opimpl_inline_ifconst_call_ir_r = _opimpl_inline_ifconst_call2
+ opimpl_inline_ifconst_call_ir_v = _opimpl_inline_ifconst_call2
+ opimpl_inline_ifconst_call_irf_i = _opimpl_inline_ifconst_call3
+ opimpl_inline_ifconst_call_irf_r = _opimpl_inline_ifconst_call3
+ opimpl_inline_ifconst_call_irf_f = _opimpl_inline_ifconst_call3
+ opimpl_inline_ifconst_call_irf_v = _opimpl_inline_ifconst_call3
+
@arguments("box", "descr", "boxes")
def _opimpl_residual_call1(self, funcbox, calldescr, argboxes):
return self.do_residual_or_indirect_call(funcbox, calldescr, argboxes)
@@ -1295,6 +1316,14 @@
# but we should not follow calls to that graph
return self.do_residual_call(funcbox, calldescr, argboxes)
+ def do_inline_ifconst_call(self, jitcode, no, argboxes):
+ if isinstance(argboxes[no], Const):
+ return self.metainterp.perform_call(jitcode, argboxes)
+ else:
+ calldescr = jitcode.calldescr
+ funcbox = ConstInt(jitcode.get_fnaddr_as_int())
+ return self.do_residual_call(funcbox, calldescr, argboxes)
+
# ____________________________________________________________
class MetaInterpStaticData(object):
diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py
--- a/pypy/jit/metainterp/test/test_ajit.py
+++ b/pypy/jit/metainterp/test/test_ajit.py
@@ -2424,10 +2424,10 @@
res = self.meta_interp(main, [0, 10, 2], enable_opts='')
assert res == main(0, 10, 2)
- self.check_loops(call=1)
+ self.check_loops(call_may_force=1)
res = self.meta_interp(main, [1, 10, 2], enable_opts='')
- assert res == main(0, 10, 2)
- self.check_loops(call=0)
+ assert res == main(1, 10, 2)
+ self.check_loops(call_may_force=0)
class TestOOtype(BasicTests, OOJitMixin):
More information about the pypy-commit
mailing list