[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