Author: Armin Rigo <ar...@tunes.org>
Branch: stmgc-c7
Changeset: r71196:34b987aa50c1
Date: 2014-05-02 17:04 +0200
http://bitbucket.org/pypy/pypy/changeset/34b987aa50c1/

Log:    Bah, can't pass anything via r11 across the call --- the CALL
        instruction itself may need r11

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
@@ -395,10 +395,6 @@
         mc = codebuf.MachineCodeBlockWrapper()
         #
         if not for_frame:
-            if self.cpu.gc_ll_descr.stm:
-                assert IS_X86_64
-                mc.PUSH_r(X86_64_SCRATCH_REG.value)
-            #
             self._push_all_regs_to_frame(mc, [], withfloats, callee_only=True)
             #
             if self.cpu.gc_ll_descr.stm:
@@ -407,7 +403,7 @@
                 # current 'stm_location' so that it is found.  The easiest
                 # is to simply push it on the shadowstack, from its source
                 # location as two extra arguments on the machine stack
-                # (at this point containing: [ref][retaddr][num][obj]...)
+                # (at this point containing: [retaddr][ref][num][obj]...)
                 # XXX this should also be done if 'for_frame' is true...
                 mc.MOV(esi, self.heap_shadowstack_top())
                 mc.MOV_rs(edi.value, 2 * WORD)   # [num]
@@ -416,9 +412,8 @@
                 mc.LEA_ra(edi.value, (self.SEGMENT_NO, rx86.NO_BASE_REGISTER,
                                       edi.value, 1, +1))
                 mc.MOV_mr((self.SEGMENT_NO, esi.value, 0), edi.value)
-                mc.MOV_rs(edi.value, 0 * WORD)   # [ref]
+                mc.MOV_rs(edi.value, 1 * WORD)   # [ref]
                 mc.MOV_mr((self.SEGMENT_NO, esi.value, WORD), edi.value)
-                mc.MOV_sr(0 * WORD, esi.value)   # save org shadowstack_top
                 mc.LEA_rm(esi.value, (self.SEGMENT_NO, esi.value, 2 * WORD))
                 mc.MOV(self.heap_shadowstack_top(), esi)
                 mc.MOV_rs(edi.value, 3 * WORD)   # [obj]
@@ -466,13 +461,17 @@
         #
 
         if not for_frame:
+            if self.cpu.gc_ll_descr.stm:
+                # SUB touches CPU flags
+                mc.MOV(esi, self.heap_shadowstack_top())
+                mc.LEA_rm(esi.value, (self.SEGMENT_NO, esi.value, -2 * WORD))
+                mc.MOV(self.heap_shadowstack_top(), esi)
             if IS_X86_32:
                 # ADD touches CPU flags
                 mc.LEA_rs(esp.value, 2 * WORD)
             self._pop_all_regs_from_frame(mc, [], withfloats, callee_only=True)
             if self.cpu.gc_ll_descr.stm:
-                mc.POP(self.heap_shadowstack_top())
-                mc.RET16_i(2 * WORD)
+                mc.RET16_i(3 * WORD)
             else:
                 mc.RET16_i(WORD)
         else:
@@ -2269,7 +2268,7 @@
                 num, ref = extract_raw_stm_location(
                     self._regalloc.stm_location)
                 mc.PUSH(imm(rffi.cast(lltype.Signed, num)))
-                mc.MOV(X86_64_SCRATCH_REG, imm(rffi.cast(lltype.Signed, ref)))
+                mc.PUSH(imm(rffi.cast(lltype.Signed, ref)))
         if is_frame and align_stack:
             mc.SUB_ri(esp.value, 16 - WORD) # erase the return address
         mc.CALL(imm(self.wb_slowpath[helper_num]))
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to