[pypy-svn] r66963 - pypy/branch/pyjitpl5/pypy/jit/backend/x86/test
fijal at codespeak.net
fijal at codespeak.net
Wed Aug 19 12:28:01 CEST 2009
Author: fijal
Date: Wed Aug 19 12:28:00 2009
New Revision: 66963
Modified:
pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_regalloc.py
Log:
(pedronis, fijal) Improve test coverage of assembler.py
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_regalloc.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_regalloc.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_regalloc.py Wed Aug 19 12:28:00 2009
@@ -7,7 +7,7 @@
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.backend.x86.runner import CPU
from pypy.jit.metainterp.test.oparser import parse
-from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.rpython.annlowlevel import llhelper
class TestRegalloc(object):
@@ -16,25 +16,39 @@
namespace = locals().copy()
type_system = 'lltype'
- def parse(self, s, boxkinds=None):
+ def parse(self, s, boxkinds=None, jump_targets=None):
return parse(s, self.cpu, self.namespace,
type_system=self.type_system,
+ jump_targets=jump_targets,
boxkinds=boxkinds)
- def interpret(self, ops, args):
- loop = self.parse(ops)
+ def interpret(self, ops, args, jump_targets=None):
+ loop = self.parse(ops, jump_targets=jump_targets)
self.cpu.compile_operations(loop)
for i, arg in enumerate(args):
if isinstance(arg, int):
self.cpu.set_future_value_int(i, arg)
else:
- raise NotImplementedError("Arg: %s" % arg)
+ assert isinstance(lltype.typeOf(arg), lltype.Ptr)
+ llgcref = lltype.cast_opaque_ptr(llmemory.GCREF, arg)
+ self.cpu.set_future_value_ptr(i, llgcref)
self.cpu.execute_operations(loop)
return loop
def getint(self, index):
return self.cpu.get_latest_value_int(index)
+ def getptr(self, index, T):
+ gcref = self.cpu.get_latest_value_ptr(index)
+ return lltype.cast_opaque_ptr(T, gcref)
+
+ def attach_bridge(self, ops, loop, guard_op):
+ assert guard_op.is_guard()
+ bridge = self.parse(ops)
+ guard_op.suboperations = bridge.operations
+ self.cpu.compile_operations(loop, guard_op)
+ return bridge
+
def test_simple_loop(self):
ops = '''
[i0]
@@ -66,10 +80,7 @@
i6 = int_add(i5, 1)
fail(i3, i4, i5, i6)
'''
- bridge = self.parse(ops)
- guard_op = loop.operations[-2]
- guard_op.suboperations = bridge.operations
- self.cpu.compile_operations(loop, guard_op)
+ bridge = self.attach_bridge(ops, loop, loop.operations[-2])
self.cpu.set_future_value_int(0, 0)
op = self.cpu.execute_operations(loop)
assert op is bridge.operations[-1]
@@ -77,4 +88,45 @@
assert self.getint(1) == 22
assert self.getint(2) == 23
assert self.getint(3) == 24
-
+
+ def test_two_loops_and_a_bridge(self):
+ ops = '''
+ [i0, i1, i2, i3]
+ i4 = int_add(i0, 1)
+ i5 = int_lt(i4, 20)
+ guard_true(i5)
+ fail(i4, i1, i2, i3)
+ jump(i4, i1, i2, i3)
+ '''
+ loop = self.interpret(ops, [0])
+ ops2 = '''
+ [i5]
+ i1 = int_add(i5, 1)
+ i3 = int_add(i1, 1)
+ i4 = int_add(i3, 1)
+ i2 = int_lt(i4, 30)
+ guard_true(i2)
+ jump(i4, i4, i4, i4)
+ jump(i4)
+ '''
+ loop2 = self.interpret(ops2, [0], jump_targets=[loop, 'self'])
+ assert self.getint(0) == 31
+ assert self.getint(1) == 30
+ assert self.getint(2) == 30
+ assert self.getint(3) == 30
+
+ def test_pointer_arg(self):
+ ops = '''
+ [i0, p0]
+ i1 = int_add(i0, 1)
+ i2 = int_lt(i1, 10)
+ guard_true(i2)
+ fail(p0)
+ jump(i1, p0)
+ '''
+ S = lltype.GcStruct('S')
+ ptr = lltype.malloc(S)
+ self.interpret(ops, [0, ptr])
+ assert self.getptr(0, lltype.Ptr(S)) == ptr
+ assert not self.cpu.assembler.fail_boxes_ptr[0]
+ assert not self.cpu.assembler.fail_boxes_ptr[1]
More information about the Pypy-commit
mailing list