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