[pypy-svn] pypy arm-backend-2: Fix an off-by-one error when doing a jump to a location that is more than 255 bytes away
bivab
commits-noreply at bitbucket.org
Wed Feb 23 18:56:07 CET 2011
Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r42237:1aa4e6cf725e
Date: 2011-02-23 18:42 +0100
http://bitbucket.org/pypy/pypy/changeset/1aa4e6cf725e/
Log: Fix an off-by-one error when doing a jump to a location that is more
than 255 bytes away
diff --git a/pypy/jit/backend/arm/test/test_regalloc.py b/pypy/jit/backend/arm/test/test_regalloc.py
--- a/pypy/jit/backend/arm/test/test_regalloc.py
+++ b/pypy/jit/backend/arm/test/test_regalloc.py
@@ -72,6 +72,14 @@
zero_division_value)
FPTR = lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Void))
raising_fptr = llhelper(FPTR, raising_func)
+
+ def f(a):
+ return 23
+
+ FPTR = lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Signed))
+ f_fptr = llhelper(FPTR, f)
+ f_calldescr = cpu.calldescrof(FPTR.TO, FPTR.TO.ARGS, FPTR.TO.RESULT)
+
zero_division_tp, zero_division_value = cpu.get_zero_division_error()
zd_addr = cpu.cast_int_to_adr(zero_division_tp)
zero_division_error = llmemory.cast_adr_to_ptr(zd_addr,
@@ -421,6 +429,7 @@
fielddescr = cpu.fielddescrof(S, 'field')
A = lltype.GcArray(lltype.Char)
+ I = lltype.GcArray(lltype.Signed)
arraydescr = cpu.arraydescrof(A)
namespace = locals().copy()
@@ -485,6 +494,36 @@
self.interpret(ops, [s, ord('a')])
assert s[1] == 'a'
+ def test_setarrayitem2_gc(self):
+ ops = '''
+ [p0, i, i1]
+ setarrayitem_gc(p0, i1, i, descr=arraydescr)
+ finish()
+ '''
+ s = lltype.malloc(self.A, 3)
+ self.interpret(ops, [s, ord('a'), 1])
+ assert s[1] == 'a'
+
+ def test_setarrayitem3_gc(self):
+ ops = '''
+ [p0, i0, i1]
+ setarrayitem_gc(p0, i1, i0, descr=arraydescr)
+ finish()
+ '''
+ s = lltype.malloc(self.I, 3)
+ self.interpret(ops, [s, 1234567890, 1])
+ assert s[1] == 1234567890
+
+ def test_setarrayitem4_gc(self):
+ ops = '''
+ [p0, i0]
+ setarrayitem_gc(p0, 1, i0, descr=arraydescr)
+ finish()
+ '''
+ s = lltype.malloc(self.I, 3)
+ self.interpret(ops, [s, 1234567890])
+ assert s[1] == 1234567890
+
def test_division_optimized(self):
ops = '''
[i7, i6]
@@ -626,6 +665,68 @@
bridge = self.attach_bridge(ops, loop, -2)
+ def test_from_loop_to_loop(self):
+ def assembler_helper(failindex, virtualizable):
+ return 1
+
+ FUNCPTR = lltype.Ptr(lltype.FuncType([lltype.Signed, llmemory.GCREF],
+ lltype.Signed))
+ class FakeJitDriverSD:
+ index_of_virtualizable = -1
+ _assembler_helper_ptr = llhelper(FUNCPTR, assembler_helper)
+ assembler_helper_adr = llmemory.cast_ptr_to_adr(
+ _assembler_helper_ptr)
+
+ FakeJitDriverSD.portal_calldescr = self.cpu.calldescrof(
+ lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Signed)), [lltype.Signed], lltype.Signed)
+ loop1 = """
+ [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10]
+ i11 = int_add(i0, i1)
+ finish(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11)
+ """
+ large = self.interpret(loop1, range(11), run=False)
+ large.token.outermost_jitdriver_sd = FakeJitDriverSD()
+ self.namespace['looptoken'] = large.token
+ assert self.namespace['looptoken']._arm_bootstrap_code != 0
+ loop2 = """
+ [i0]
+ i1 = force_token()
+ call_assembler(1,2,3,4,5,6,7,8,9,10,11, descr=looptoken)
+ guard_not_forced() [i0]
+ finish(i0)
+ """
+
+ self.interpret(loop2, [110])
+ assert self.getint(0) == 0
+
+ def test_far_far_jump(self):
+ ops = """
+ [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10]
+ i11 = int_add(i0, 1)
+ i12 = int_lt(i11, 2)
+ i13 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i14 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i15 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i16 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i17 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i18 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i19 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i20 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i21 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i22 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i23 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i24 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i26 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i27 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i28 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i29 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ i30 = call(ConstClass(f_fptr), i12, descr=f_calldescr)
+ guard_true(i12) [i11, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10]
+ jump(i11, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10)
+ """
+ self.interpret(ops, range(11))
+ assert self.getint(0) == 2 # and not segfault()
+
self.cpu.set_future_value_int(0, 4)
self.cpu.set_future_value_int(1, 7)
self.run(loop)
diff --git a/pypy/jit/backend/arm/codebuilder.py b/pypy/jit/backend/arm/codebuilder.py
--- a/pypy/jit/backend/arm/codebuilder.py
+++ b/pypy/jit/backend/arm/codebuilder.py
@@ -87,7 +87,7 @@
assert c == cond.AL
self.LDR_ri(reg.ip.value, reg.pc.value, cond=c)
self.SUB_rr(reg.pc.value, reg.pc.value, reg.ip.value, cond=c)
- target += 2 * WORD
+ target += WORD
self.write32(target)
def BL(self, target, c=cond.AL):
More information about the Pypy-commit
mailing list