[pypy-commit] pypy jit-usable_retrace_3: random loop tests in progress: basic arithmetic

hakanardo noreply at buildbot.pypy.org
Mon Jan 14 19:17:30 CET 2013


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-usable_retrace_3
Changeset: r60058:04dcba7544c1
Date: 2013-01-13 17:24 +0100
http://bitbucket.org/pypy/pypy/changeset/04dcba7544c1/

Log:	random loop tests in progress: basic arithmetic

diff --git a/pypy/jit/metainterp/test/test_random_loops.py b/pypy/jit/metainterp/test/test_random_loops.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/metainterp/test/test_random_loops.py
@@ -0,0 +1,86 @@
+from pypy.jit.metainterp.test.support import LLJitMixin
+from pypy.rlib.jit import JitDriver
+
+class IntBox(object):
+    def __init__(self, val):
+        self.val = val
+
+    def value(self):
+        return self.val
+
+    def add(self, other):
+        return IntBox(self.value() + other.value())
+
+    def sub(self, other):
+        return IntBox(self.value() - other.value())
+
+class RandomLoopBase(object):
+    def check(self, bytecode, args=(0,0,0,0,0), **kwargs):
+        myjitdriver = JitDriver(greens = ['pc'], reds = ['a', 'b', 'c', 'd', 'e', 'value', 'prev'])
+        def interpreter(_a, _b, _c, _d, _e):
+            pc = 0
+            value = prev = IntBox(0)
+            a = IntBox(_a)
+            b = IntBox(_b)
+            c = IntBox(_c)
+            d = IntBox(_d)
+            e = IntBox(_e)
+            while pc < len(bytecode):
+                myjitdriver.jit_merge_point(pc=pc, a=a, b=b, c=c, d=d, e=e, value=value, prev=prev)
+                op = bytecode[pc]
+                current = value
+
+                if '0' <= op <= '9':
+                    value = IntBox(ord(op) - ord('0'))
+                elif op == 'a':
+                    value = a
+                elif op == 'b':
+                    value = b
+                elif op == 'c':
+                    value = c
+                elif op == 'd':
+                    value = d
+                elif op == 'e':
+                    value = e
+                elif op == 'A':
+                    a = value
+                elif op == 'B':
+                    b = value
+                elif op == 'C':
+                    c = value
+                elif op == 'D':
+                    d = value
+                elif op == 'E':
+                    e = value
+                elif op == '+':
+                    value = prev.add(value)
+                elif op == '-':
+                    value = prev.sub(value)
+                else:
+                    assert False
+
+                prev = current
+                pc += 1
+            return a.value(), b.value(), c.value(), d.value(), e.value()
+        
+        obj = self.meta_interp(interpreter, args)._obj
+        res = {'a': obj.item0, 'b': obj.item1, 'c': obj.item2, 'd': obj.item3, 'e': obj.item4}
+        obj = interpreter(*args)
+        expected = {'a': obj[0], 'b': obj[1], 'c': obj[2], 'd': obj[3], 'e': obj[4]}
+        assert res == expected
+
+        for var, val in kwargs.items():
+            assert res[var] == val
+        return res
+
+
+
+class BaseTests(RandomLoopBase):
+    def test_basic(self):
+        self.check('1A2B3C4D5E', a=1, b=2, c=3, d=4, e=5)
+        self.check('1', [6,7,8,9,0], a=6, b=7, c=8, d=9, e=0)
+        self.check('1a+A2b+B3c+C4d+D5e+E', [6,7,8,9,0], a=7, b=9, c=11, d=13, e=5)
+        self.check('ea+Eeb+Eec+Eed+E', [6,7,8,9,0], a=6, b=7, c=8, d=9, e=30)
+
+class TestLLtype(BaseTests, LLJitMixin):
+    pass


More information about the pypy-commit mailing list