[pypy-commit] pypy default: merge heads
bdkearns
noreply at buildbot.pypy.org
Thu Mar 21 20:18:24 CET 2013
Author: Brian Kearns <bdkearns at gmail.com>
Branch:
Changeset: r62613:b1a1549418d9
Date: 2013-03-21 15:05 -0400
http://bitbucket.org/pypy/pypy/changeset/b1a1549418d9/
Log: merge heads
diff --git a/rpython/jit/backend/arm/assembler.py b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -242,7 +242,7 @@
#
mc = ARMv7Builder()
# save argument registers and return address
- mc.PUSH([reg.value for reg in r.argument_regs] + [r.lr.value])
+ mc.PUSH([reg.value for reg in r.argument_regs] + [r.ip.value, r.lr.value])
# stack is aligned here
# Pass current stack pointer as argument to the call
mc.MOV_rr(r.r0.value, r.sp.value)
@@ -253,21 +253,13 @@
mc.gen_load_int(r.r0.value, self.cpu.pos_exception())
mc.LDR_ri(r.r0.value, r.r0.value)
mc.TST_rr(r.r0.value, r.r0.value)
+ #
# restore registers and return
# We check for c.EQ here, meaning all bits zero in this case
- mc.POP([reg.value for reg in r.argument_regs] + [r.pc.value], cond=c.EQ)
- #
- # Call the helper, which will return a dead frame object with
- # the correct exception set, or MemoryError by default
- addr = rffi.cast(lltype.Signed, self.cpu.get_propagate_exception())
- mc.BL(addr)
- #
- # footer -- note the ADD, which skips the return address of this
- # function, and will instead return to the caller's caller. Note
- # also that we completely ignore the saved arguments, because we
- # are interrupting the function.
- mc.ADD_ri(r.sp.value, r.sp.value, (len(r.argument_regs) + 1) * WORD)
- mc.POP([r.pc.value])
+ mc.POP([reg.value for reg in r.argument_regs] + [r.ip.value, r.pc.value], cond=c.EQ)
+ # restore sp
+ mc.ADD_ri(r.sp.value, r.sp.value, (len(r.argument_regs) + 2) * WORD)
+ mc.B(self.propagate_exception_path)
#
rawstart = mc.materialize(self.cpu.asmmemmgr, [])
self.stack_check_slowpath = rawstart
@@ -311,6 +303,8 @@
else:
self._restore_exception(mc, exc0, exc1)
mc.VPOP([vfpr.value for vfpr in r.caller_vfp_resp])
+ assert exc0 is not None
+ assert exc1 is not None
mc.POP([gpr.value for gpr in r.caller_resp] +
[exc0.value, exc1.value])
#
@@ -505,7 +499,7 @@
if self.cpu.supports_floats:
mc.VPOP([reg.value for reg in r.callee_saved_vfp_registers],
cond=cond)
- # push all callee saved registers and IP to keep the alignment
+ # pop all callee saved registers and IP to keep the alignment
mc.POP([reg.value for reg in r.callee_restored_registers] +
[r.ip.value], cond=cond)
mc.BKPT()
@@ -564,11 +558,11 @@
self.gen_func_prolog()
def _call_header_with_stack_check(self):
+ self._call_header()
if self.stack_check_slowpath == 0:
pass # no stack check (e.g. not translated)
else:
endaddr, lengthaddr, _ = self.cpu.insert_stack_check()
- self.mc.PUSH([r.lr.value])
# load stack end
self.mc.gen_load_int(r.ip.value, endaddr) # load ip, [end]
self.mc.LDR_ri(r.ip.value, r.ip.value) # LDR ip, ip
@@ -580,9 +574,6 @@
# if ofs
self.mc.CMP_rr(r.ip.value, r.lr.value) # CMP ip, lr
self.mc.BL(self.stack_check_slowpath, c=c.HI) # call if ip > lr
- #
- self.mc.POP([r.lr.value])
- self._call_header()
# cpu interface
def assemble_loop(self, loopname, inputargs, operations, looptoken, log):
diff --git a/rpython/jit/backend/arm/test/test_calling_convention.py b/rpython/jit/backend/arm/test/test_calling_convention.py
--- a/rpython/jit/backend/arm/test/test_calling_convention.py
+++ b/rpython/jit/backend/arm/test/test_calling_convention.py
@@ -4,12 +4,23 @@
from rpython.rtyper.lltypesystem import lltype
from rpython.jit.codewriter.effectinfo import EffectInfo
+from rpython.jit.backend.arm.codebuilder import ARMv7Builder
+from rpython.jit.backend.arm import registers as r
from rpython.jit.backend.arm.test.support import skip_unless_run_slow_tests
skip_unless_run_slow_tests()
class TestARMCallingConvention(CallingConvTests):
# ../../test/calling_convention_test.py
+ def make_function_returning_stack_pointer(self):
+ mc = ARMv7Builder()
+ mc.MOV_rr(r.r0.value, r.sp.value)
+ mc.MOV_rr(r.pc.value, r.lr.value)
+ return mc.materialize(self.cpu.asmmemmgr, [])
+
+ def get_alignment_requirements(self):
+ return 8
+
def test_call_argument_spilling(self):
# bug when we have a value in r0, that is overwritten by an argument
# and needed after the call, so that the register gets spilled after it
@@ -28,12 +39,24 @@
ops = """
[%s]
i99 = call(ConstClass(func_ptr), 22, descr=calldescr)
- finish(%s, i99)""" % (args, args)
+ force_spill(i0)
+ force_spill(i1)
+ force_spill(i2)
+ force_spill(i3)
+ force_spill(i4)
+ force_spill(i5)
+ force_spill(i6)
+ force_spill(i7)
+ force_spill(i8)
+ force_spill(i9)
+ force_spill(i10)
+ guard_true(i0) [%s, i99]
+ finish()""" % (args, args)
loop = parse(ops, namespace=locals())
looptoken = JitCellToken()
self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
args = [x for x in range(11)]
- self.cpu.execute_token(looptoken, *args)
+ deadframe = self.cpu.execute_token(looptoken, *args)
for x in range(11):
- assert self.cpu.get_latest_value_int(x) == x
- assert self.cpu.get_latest_value_int(11) == 38
+ assert self.cpu.get_int_value(deadframe, x) == x
+ assert self.cpu.get_int_value(deadframe, 11) == 38
diff --git a/rpython/jit/backend/test/calling_convention_test.py b/rpython/jit/backend/test/calling_convention_test.py
--- a/rpython/jit/backend/test/calling_convention_test.py
+++ b/rpython/jit/backend/test/calling_convention_test.py
@@ -11,6 +11,7 @@
from rpython.jit.backend.test.runner_test import Runner
import py
import sys
+import platform
def boxfloat(x):
return BoxFloat(longlong.getfloatstorage(x))
@@ -382,7 +383,8 @@
raise NotImplementedError
def test_call_aligned_explicit_check(self):
- if sys.maxint == 2 ** 31 - 1:
+ if (not platform.machine().startswith('arm') and
+ sys.maxint == 2 ** 31 - 1): # XXX is still necessary on x86?
py.test.skip("libffi on 32bit is broken")
cpu = self.cpu
if not cpu.supports_floats:
More information about the pypy-commit
mailing list