Author: Maciej Fijalkowski <[email protected]>
Branch: fast-slowpath
Changeset: r65444:1c382497f8eb
Date: 2013-07-17 18:04 +0200
http://bitbucket.org/pypy/pypy/changeset/1c382497f8eb/

Log:    finish cond_call for x86_64

diff --git a/rpython/jit/backend/llsupport/assembler.py 
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -106,7 +106,7 @@
                 kind='unicode')
         else:
             self.malloc_slowpath_unicode = None
-        self.cond_call_slowpath = [0, self._build_cond_call_slowpath(1)]
+        self.cond_call_slowpath = self._build_cond_call_slowpath()
 
         self._build_stack_check_slowpath()
         self._build_release_gil(gc_ll_descr.gcrootmap)
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
@@ -149,18 +149,22 @@
         mc.RET()
         self._frame_realloc_slowpath = mc.materialize(self.cpu.asmmemmgr, [])
 
-    def _build_cond_call_slowpath(self, no_args):
+    def _build_cond_call_slowpath(self):
         """ This builds a general call slowpath, for whatever call happens to
         come.
         """
         mc = codebuf.MachineCodeBlockWrapper()
         self._push_all_regs_to_frame(mc, [], self.cpu.supports_floats,
                                      callee_only=False)
-        assert no_args == 1
+        gcrootmap = self.cpu.gc_ll_descr.gcrootmap
+        if gcrootmap and gcrootmap.is_shadow_stack:
+            self._call_header_shadowstack(mc, gcrootmap)
         mc.SUB(esp, imm(WORD))
         # first arg is always in edi
         mc.CALL(eax)
         mc.ADD(esp, imm(WORD))
+        if gcrootmap and gcrootmap.is_shadow_stack:
+            self._call_footer_shadowstack(mc, gcrootmap)
         self._pop_all_regs_from_frame(mc, [], self.cpu.supports_floats,
                                       callee_only=False)
         mc.RET()
@@ -718,7 +722,7 @@
 
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
-            self._call_header_shadowstack(gcrootmap)
+            self._call_header_shadowstack(self.mc, gcrootmap)
 
     def _call_header_with_stack_check(self):
         self._call_header()
@@ -741,7 +745,7 @@
     def _call_footer(self):
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
-            self._call_footer_shadowstack(gcrootmap)
+            self._call_footer_shadowstack(self.mc, gcrootmap)
 
         for i in range(len(self.cpu.CALLEE_SAVE_REGISTERS)-1, -1, -1):
             self.mc.MOV_rs(self.cpu.CALLEE_SAVE_REGISTERS[i].value,
@@ -762,23 +766,23 @@
         #
         return rst
 
-    def _call_header_shadowstack(self, gcrootmap):
-        rst = self._load_shadowstack_top_in_ebx(self.mc, gcrootmap)
-        self.mc.MOV_mr((ebx.value, 0), ebp.value)      # MOV [ebx], ebp
-        self.mc.ADD_ri(ebx.value, WORD)
+    def _call_header_shadowstack(self, mc, gcrootmap):
+        rst = self._load_shadowstack_top_in_ebx(mc, gcrootmap)
+        mc.MOV_mr((ebx.value, 0), ebp.value)      # MOV [ebx], ebp
+        mc.ADD_ri(ebx.value, WORD)
         if rx86.fits_in_32bits(rst):
-            self.mc.MOV_jr(rst, ebx.value)            # MOV [rootstacktop], ebx
+            mc.MOV_jr(rst, ebx.value)            # MOV [rootstacktop], ebx
         else:
-            self.mc.MOV_mr((X86_64_SCRATCH_REG.value, 0),
-                           ebx.value) # MOV [r11], ebx
+            mc.MOV_mr((X86_64_SCRATCH_REG.value, 0),
+                      ebx.value) # MOV [r11], ebx
 
-    def _call_footer_shadowstack(self, gcrootmap):
+    def _call_footer_shadowstack(self, mc, gcrootmap):
         rst = gcrootmap.get_root_stack_top_addr()
         if rx86.fits_in_32bits(rst):
-            self.mc.SUB_ji8(rst, WORD)       # SUB [rootstacktop], WORD
+            mc.SUB_ji8(rst, WORD)       # SUB [rootstacktop], WORD
         else:
-            self.mc.MOV_ri(ebx.value, rst)           # MOV ebx, rootstacktop
-            self.mc.SUB_mi8((ebx.value, 0), WORD)  # SUB [ebx], WORD
+            mc.MOV_ri(ebx.value, rst)           # MOV ebx, rootstacktop
+            mc.SUB_mi8((ebx.value, 0), WORD)  # SUB [ebx], WORD
 
     def redirect_call_assembler(self, oldlooptoken, newlooptoken):
         # some minimal sanity checking
@@ -2146,7 +2150,7 @@
         self.mc.J_il8(rx86.Conditions['Z'], 0) # patched later
         jmp_adr = self.mc.get_relative_pos()
         self.push_gcmap(self.mc, gcmap, store=True)
-        self.mc.CALL(imm(self.cond_call_slowpath[len(arglocs)]))
+        self.mc.CALL(imm(self.cond_call_slowpath))
         self.pop_gcmap(self.mc)
         # never any result value
         offset = self.mc.get_relative_pos() - jmp_adr
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to