[pypy-commit] pypy arm64: implement _restore_exception
fijal
pypy.commits at gmail.com
Tue Jun 11 10:19:43 EDT 2019
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: arm64
Changeset: r96794:ce1202a8787b
Date: 2019-06-11 14:18 +0000
http://bitbucket.org/pypy/pypy/changeset/ce1202a8787b/
Log: implement _restore_exception
diff --git a/rpython/jit/backend/aarch64/assembler.py b/rpython/jit/backend/aarch64/assembler.py
--- a/rpython/jit/backend/aarch64/assembler.py
+++ b/rpython/jit/backend/aarch64/assembler.py
@@ -389,7 +389,7 @@
"""
assert excvalloc is not r.ip0
assert exctploc is not r.ip0
- tmpreg = r.lr
+ tmpreg = r.ip1
mc.gen_load_int(r.ip0.value, self.cpu.pos_exc_value())
if excvalloc is not None: # store
assert excvalloc.is_core_reg()
@@ -420,7 +420,25 @@
self.store_reg(mc, tmpreg, r.ip0, 0)
def _restore_exception(self, mc, excvalloc, exctploc):
- pass
+ assert excvalloc is not r.ip0
+ assert exctploc is not r.ip0
+ mc.gen_load_int(r.ip0.value, self.cpu.pos_exc_value())
+ if excvalloc is not None:
+ assert excvalloc.is_core_reg()
+ self.store_reg(mc, excvalloc, r.ip0)
+ else:
+ assert exctploc is not r.fp
+ # load exc_value from JITFRAME and put it in pos_exc_value
+ ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
+ self.load_reg(mc, r.ip1, r.fp, ofs)
+ self.store_reg(mc, r.ip1, r.ip0)
+ # reset exc_value in the JITFRAME
+ mc.gen_load_int(r.ip1.value, 0)
+ self.store_reg(mc, r.ip1, r.fp, ofs)
+
+ # restore pos_exception from exctploc register
+ mc.gen_load_int(r.ip0.value, self.cpu.pos_exception())
+ self.store_reg(mc, exctploc, r.ip0)
def _build_propagate_exception_path(self):
mc = InstrBuilder()
diff --git a/rpython/jit/backend/aarch64/opassembler.py b/rpython/jit/backend/aarch64/opassembler.py
--- a/rpython/jit/backend/aarch64/opassembler.py
+++ b/rpython/jit/backend/aarch64/opassembler.py
@@ -10,6 +10,7 @@
from rpython.jit.backend.llsupport.gcmap import allocate_gcmap
from rpython.jit.backend.llsupport.regalloc import get_scale
from rpython.jit.metainterp.history import TargetToken
+from rpython.jit.metainterp.resoperation import rop
def gen_comp_op(name, flag):
def emit_op(self, op, arglocs):
@@ -465,7 +466,32 @@
self.mc.CMP_rr(r.ip0.value, loc.value)
self._emit_guard(op, c.EQ, failargs)
self._store_and_reset_exception(self.mc, resloc)
-
+
+ def emit_op_guard_no_exception(self, op, arglocs):
+ loc = arglocs[0]
+ failargs = arglocs[1:]
+ self.mc.LDR_ri(loc.value, loc.value, 0)
+ self.mc.CMP_ri(loc.value, 0)
+ self._emit_guard(op, c.EQ, failargs)
+ # If the previous operation was a COND_CALL, overwrite its conditional
+ # jump to jump over this GUARD_NO_EXCEPTION as well, if we can
+ #if self._find_nearby_operation(-1).getopnum() == rop.COND_CALL:
+ # XXX
+ # jmp_adr, prev_cond = self.previous_cond_call_jcond
+ # pmc = OverwritingBuilder(self.mc, jmp_adr, WORD)
+ # pmc.B_offs(self.mc.currpos(), prev_cond)
+
+ def emit_op_save_exc_class(self, op, arglocs):
+ resloc = arglocs[0]
+ self.mc.gen_load_int(r.ip0.value, self.cpu.pos_exception())
+ self.load_reg(self.mc, resloc, r.ip0)
+
+ def emit_op_save_exception(self, op, arglocs):
+ resloc = arglocs[0]
+ self._store_and_reset_exception(self.mc, resloc)
+
+ def emit_op_restore_exception(self, op, arglocs):
+ self._restore_exception(self.mc, arglocs[1], arglocs[0])
# ----------------------------- call ------------------------------
diff --git a/rpython/jit/backend/aarch64/regalloc.py b/rpython/jit/backend/aarch64/regalloc.py
--- a/rpython/jit/backend/aarch64/regalloc.py
+++ b/rpython/jit/backend/aarch64/regalloc.py
@@ -20,6 +20,8 @@
from rpython.jit.backend.llsupport.descr import CallDescr
from rpython.jit.codewriter.effectinfo import EffectInfo
+from rpython.rlib.rarithmetic import r_uint
+
class TempInt(TempVar):
@@ -709,6 +711,21 @@
arglocs = [loc, resloc, pos_exc_value, pos_exception] + self._guard_impl(op)
return arglocs
+ def prepare_op_guard_no_exception(self, op):
+ loc = self.make_sure_var_in_reg(ConstInt(self.cpu.pos_exception()))
+ return [loc] + self._guard_impl(op)
+
+ def prepare_op_save_exception(self, op):
+ resloc = self.force_allocate_reg(op)
+ return [resloc]
+ prepare_op_save_exc_class = prepare_op_save_exception
+
+ def prepare_op_restore_exception(self, op):
+ boxes = op.getarglist()
+ loc0 = self.make_sure_var_in_reg(op.getarg(0), boxes) # exc class
+ loc1 = self.make_sure_var_in_reg(op.getarg(1), boxes) # exc instance
+ return [loc0, loc1]
+
prepare_op_ptr_eq = prepare_op_instance_ptr_eq = prepare_op_int_eq
prepare_op_ptr_ne = prepare_op_instance_ptr_ne = prepare_op_int_ne
More information about the pypy-commit
mailing list