Author: Remi Meier <[email protected]>
Branch: stmgc-c8-gcc
Changeset: r78636:c6df9651efef
Date: 2015-07-23 15:16 +0200
http://bitbucket.org/pypy/pypy/changeset/c6df9651efef/

Log:    probably fix some register saving around gil-release calls (still
        get crashes on raytrace)

diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -128,15 +128,50 @@
         self.float_const_neg_addr = float_constants
         self.float_const_abs_addr = float_constants + 16
 
+
+    def _stm_save_regs_and_leave_transactional_zone(self, mc):
+        assert IS_X86_64 and self.cpu.supports_floats
+        # cannot save regs to frame as we are outside a transactional
+        # zone after "leaving". Thus, the frame must not be accessed 
afterwards.
+        # (there should also be no unsaved references left in registers)
+        gpr_regs = [gpr for gpr in gpr_reg_mgr_cls.save_around_call_regs if 
gpr != eax]
+        xmm_regs = xmm_reg_mgr_cls.all_regs
+
+        # Push the general purpose registers
+        for gpr in gpr_regs:
+            mc.PUSH(gpr)
+        # Push the XMM regs
+        xmm_space = len(xmm_regs) * WORD
+        mc.SUB_ri(esp.value, xmm_space)
+        for off, xmm in enumerate(xmm_regs):
+            mc.MOVSD_sx(off * WORD, xmm.value)
+
+        # align stack and CALL
+        pushed = len(gpr_regs) + len(xmm_regs) + 1  # +1 bc we are not aligned 
initially
+        aligned = bool(pushed % 2 == 0) # works for X86_64
+        if not aligned:
+            mc.SUB_ri(esp.value, WORD)
+        mc.CALL(imm(rstm.adr_stm_leave_noninevitable_transactional_zone))
+        if not aligned:
+            mc.ADD_ri(esp.value, WORD)
+
+        # Push the XMM regs
+        for off, xmm in enumerate(xmm_regs):
+            mc.MOVSD_xs(xmm.value, off * WORD)
+        mc.ADD_ri(esp.value, xmm_space)
+
+        # POP the general purpose registers
+        for gpr in reversed(gpr_regs):
+            mc.POP(gpr)
+
+
     def _build_stm_enter_leave_transactional_zone_helpers(self):
         assert IS_X86_64 and self.cpu.supports_floats
         # a helper to call _stm_leave_noninevitable_transactional_zone(),
         # preserving all registers that are used to pass arguments.
         # (Push an odd total number of registers, to align the stack.)
         mc = codebuf.MachineCodeBlockWrapper()
-        self._push_all_regs_to_frame(mc, [eax], True, callee_only=True)
-        mc.CALL(imm(rstm.adr_stm_leave_noninevitable_transactional_zone))
-        self._pop_all_regs_from_frame(mc, [eax], True, callee_only=True)
+        self._stm_save_regs_and_leave_transactional_zone(mc)
         mc.RET()
         self._stm_leave_noninevitable_tr_slowpath = mc.materialize(
             self.cpu, [])
@@ -146,12 +181,12 @@
         mc = codebuf.MachineCodeBlockWrapper()
         mc.SUB_ri(esp.value, 3 * WORD)     # 3 instead of 2 to align the stack
         mc.MOV_sr(0, eax.value)     # not edx, we're not running 32-bit
-        mc.MOVSD_sx(1, xmm0.value)
+        mc.MOVSD_sx(1 * WORD, xmm0.value)
         # load the value of 'tl->self_or_0_if_atomic' into edi as argument
         mc.MOV(edi, self.heap_stm_thread_local_self_or_0_if_atomic())
         mc.CALL(imm(rstm.adr_stm_reattach_transaction))
         # pop
-        mc.MOVSD_xs(xmm0.value, 1)
+        mc.MOVSD_xs(xmm0.value, 1 * WORD)
         mc.MOV_rs(eax.value, 0)
         mc.ADD_ri(esp.value, 3 * WORD)
         mc.RET()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to