[pypy-commit] pypy jitframe-on-heap: _store_and_reset_exception
bivab
noreply at buildbot.pypy.org
Mon Feb 18 16:11:24 CET 2013
Author: David Schneider <david.schneider at picle.org>
Branch: jitframe-on-heap
Changeset: r61410:ca4c8057230f
Date: 2013-02-18 16:09 +0100
http://bitbucket.org/pypy/pypy/changeset/ca4c8057230f/
Log: _store_and_reset_exception
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
@@ -201,23 +201,19 @@
self.propagate_exception_path = rawstart
def _store_and_reset_exception(self, mc, resloc):
- assert resloc is r.r0
+ assert resloc is not r.ip
+ tmpreg = r.lr # use lr as a second temporary reg
+ mc.gen_load_int(r.ip.value, self.cpu.pos_exc_value())
+ if resloc is not None: # store
+ self.load_reg(mc, resloc, r.ip, 0)
- self.mc.gen_load_int(resloc.value, self.cpu.pos_exc_value())
- self.mc.gen_load_int(r.r0.value, self.cpu.pos_exc_value())
- self.mc.gen_load_int(r.ip.value, 0)
- self.mc.STR_ri(r.ip.value, r.r0.value)
-
-
- self.mc.LDR_ri(resloc.value, resloc.value)
- self.mc.MOV(resloc, heap(self.cpu.pos_exc_value()))
+ # reset exception
+ mc.gen_load_int(tmpreg.value, 0)
- with saved_registers(self.mc, [r.r0]):
- self.mc.gen_load_int(r.r0.value, self.cpu.pos_exc_value())
- self.mc.gen_load_int(r.ip.value, 0)
- self.mc.STR_ri(r.ip.value, r.r0.value)
- self.mc.gen_load_int(r.r0.value, self.cpu.pos_exception())
- self.mc.STR_ri(r.ip.value, r.r0.value)
+ self.store_reg(mc, tmpreg, r.ip, 0)
+
+ mc.gen_load_int(r.ip.value, self.cpu.pos_exception())
+ self.store_reg(mc, tmpreg, r.ip, 0)
def _build_stack_check_slowpath(self):
_, _, slowpathaddr = self.cpu.insert_stack_check()
diff --git a/rpython/jit/backend/arm/opassembler.py b/rpython/jit/backend/arm/opassembler.py
--- a/rpython/jit/backend/arm/opassembler.py
+++ b/rpython/jit/backend/arm/opassembler.py
@@ -538,12 +538,7 @@
self.mc.CMP_rr(r.ip.value, loc.value)
self._emit_guard(op, failargs, c.EQ, save_exc=True)
- self.mc.gen_load_int(loc.value, pos_exc_value.value)
- if resloc:
- self.mc.LDR_ri(resloc.value, loc.value)
- self.mc.MOV_ri(r.ip.value, 0)
- self.mc.STR_ri(r.ip.value, loc.value)
- self.mc.STR_ri(r.ip.value, loc1.value)
+ self._store_and_reset_exception(self.mc, resloc)
return fcond
def emit_op_debug_merge_point(self, op, arglocs, regalloc, fcond):
More information about the pypy-commit
mailing list