[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