[pypy-commit] pypy ppc-jit-backend: make call to function before leave jitted code and save volatile regs

hager noreply at buildbot.pypy.org
Wed Dec 14 11:28:23 CET 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r50491:cc34d3b179e4
Date: 2011-12-14 11:27 +0100
http://bitbucket.org/pypy/pypy/changeset/cc34d3b179e4/

Log:	make call to function before leave jitted code and save volatile
	regs

diff --git a/pypy/jit/backend/ppc/ppcgen/helper/assembler.py b/pypy/jit/backend/ppc/ppcgen/helper/assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/helper/assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/helper/assembler.py
@@ -122,3 +122,28 @@
                 space = (6 + MAX_REG_PARAMS + len(self.regs)) * WORD
             self.mc.addi(r.SP.value, r.SP.value, space)
 
+class Saved_Volatiles(object):
+    """ used in _gen_leave_jitted_hook_code to save volatile registers
+        in ENCODING AREA around calls
+    """
+
+    def __init__(self, codebuilder):
+        self.mc = codebuilder
+
+    def __enter__(self):
+        """ before a call, volatile registers are saved in ENCODING AREA
+        """
+        for i, reg in enumerate(r.VOLATILES):
+            if IS_PPC_32:
+                self.mc.stw(reg.value, r.SPP.value, i * WORD)
+            else:
+                self.mc.std(reg.value, r.SPP.value, i * WORD)
+
+    def __exit__(self, *args):
+        """ after call, volatile registers have to be restored
+        """
+        for i, reg in enumerate(r.VOLATILES):
+            if IS_PPC_32:
+                self.mc.lwz(reg.value, r.SPP.value, i * WORD)
+            else:
+                self.mc.ld(reg.value, r.SPP.value, i * WORD)
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -17,7 +17,8 @@
 from pypy.jit.backend.ppc.ppcgen.helper.assembler import (gen_emit_cmp_op, 
                                                           encode32, decode32,
                                                           decode64,
-                                                          count_reg_args)
+                                                          count_reg_args,
+                                                          Saved_Volatiles)
 import pypy.jit.backend.ppc.ppcgen.register as r
 import pypy.jit.backend.ppc.ppcgen.condition as c
 from pypy.jit.metainterp.history import (Const, ConstPtr, LoopToken,
@@ -292,6 +293,11 @@
 
     def _gen_leave_jitted_hook_code(self, save_exc=False):
         mc = PPCBuilder()
+
+        with Saved_Volatiles(mc):
+            addr = self.cpu.get_on_leave_jitted_int(save_exception=save_exc)
+            mc.bl_abs(addr)
+
         mc.b_abs(self.exit_code_adr)
         mc.prepare_insts_blocks()
         return mc.materialize(self.cpu.asmmemmgr, [],
@@ -505,7 +511,7 @@
         self.memcpy_addr = self.cpu.cast_ptr_to_int(memcpy_fn)
         self.setup_failure_recovery()
         self.exit_code_adr = self._gen_exit_path()
-        #self._leave_jitted_hook_save_exc = self._gen_leave_jitted_hook_code(True)
+        self._leave_jitted_hook_save_exc = self._gen_leave_jitted_hook_code(True)
         self._leave_jitted_hook = self._gen_leave_jitted_hook_code(False)
 
     def assemble_loop(self, inputargs, operations, looptoken, log):


More information about the pypy-commit mailing list