[pypy-commit] pypy stmgc-c4: possibly fix things by not using registers that aren't saved

Raemi noreply at buildbot.pypy.org
Tue Jul 23 10:03:12 CEST 2013


Author: Remi Meier <remi.meier at gmail.com>
Branch: stmgc-c4
Changeset: r65538:c292736702e8
Date: 2013-07-23 09:52 +0200
http://bitbucket.org/pypy/pypy/changeset/c292736702e8/

Log:	possibly fix things by not using registers that aren't saved

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
@@ -347,18 +347,19 @@
         mc.CALL(imm(func))
         # eax has result
         if IS_X86_32:
-            mc.ADD_ri(esp.value, 5 * WORD)
+            # ||val2|val1|retaddr|x||x|x|val2|val1|
+            mc.MOV_sr(7 * WORD, eax.value)
+            # ||result|val1|retaddr|x||x|x|val2|val1|
         else:
-            mc.ADD_ri(esp.value, WORD)
-        #
-        # result in eax, save (not sure if necessary)
-        mc.PUSH_r(eax.value)
+            # ||val2|val1||retaddr|x||
+            mc.MOV_sr(3 * WORD, eax.value)
+            # ||result|val1||retaddr|x||
         #
         self._pop_all_regs_from_frame(mc, [], withfloats=False,
                                       callee_only=True)
         #
-        mc.POP_r(eax.value)
-        mc.RET16_i(2 * WORD)
+        # only remove one arg:
+        mc.RET16_i(1 * WORD)
         
         rawstart = mc.materialize(self.cpu.asmmemmgr, [])
         self.ptr_eq_slowpath = rawstart
@@ -465,11 +466,10 @@
             self._pop_all_regs_from_frame(mc, [], withfloats, callee_only=True)
 
             if descr.returns_modified_object:
-                if IS_X86_32:
-                    mc.MOV_rs(eax.value, 3 * WORD)
-                else:
-                    mc.MOV_rs(eax.value, WORD)
-            mc.RET16_i(WORD)
+                # preserve argument which now holds the result
+                mc.RET()
+            else:
+                mc.RET16_i(WORD)
         else:
             if IS_X86_32:
                 mc.MOV_rs(edx.value, 5 * WORD)
@@ -481,7 +481,7 @@
             mc.MOV(exc1, RawEspLoc(WORD * 7, INT))
 
             if IS_X86_32:
-                mc.POP_r(edx.value) # return value
+                mc.POP_r(ecx.value) # return value
             else:
                 mc.POP_r(edi.value) # return value
 
@@ -2138,8 +2138,10 @@
         mc.PUSH(a_base)
         func = self.ptr_eq_slowpath
         mc.CALL(imm(func))
+        # result still on stack
         assert isinstance(result_loc, RegLoc)
-        mc.MOV_rr(result_loc.value, eax.value)
+        mc.POP_r(result_loc.value)
+        
         
     def _stm_barrier_fastpath(self, mc, descr, arglocs, is_frame=False,
                               align_stack=False):
@@ -2166,15 +2168,17 @@
             # ||retadr|...||
         func = descr.get_b_slowpath(helper_num)
         mc.CALL(imm(func))
-
-        # result in eax, except if is_frame
+        # get result:
         if is_frame:
+            # result in register:
             if IS_X86_32:
-                mc.MOV_rr(loc_base.value, edx.value)
+                mc.MOV_rr(loc_base.value, ecx.value)
             else:
                 mc.MOV_rr(loc_base.value, edi.value)
         else:
-            mc.MOV_rr(loc_base.value, eax.value)
+            # result where argument was:
+            mc.POP_r(loc_base.value)
+
             
         if is_frame and align_stack:
             mc.ADD_ri(esp.value, 16 - WORD) # erase the return address


More information about the pypy-commit mailing list