Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60740:c8a77fc582c4
Date: 2013-01-30 18:29 +0200
http://bitbucket.org/pypy/pypy/changeset/c8a77fc582c4/
Log: memcpy called like that cannot collect (and does not free the GIL
either)
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
@@ -1143,9 +1143,10 @@
return genop_cmp_guard_float
def _emit_call(self, x, arglocs, start=0, tmp=eax,
- argtypes=None, callconv=FFI_DEFAULT_ABI):
+ argtypes=None, callconv=FFI_DEFAULT_ABI, can_collect=True):
if IS_X86_64:
- return self._emit_call_64(x, arglocs, start, argtypes)
+ return self._emit_call_64(x, arglocs, start, argtypes,
+ can_collect=can_collect)
XXX
p = 0
n = len(arglocs)
@@ -1183,7 +1184,7 @@
# the called function just added 'p' to ESP, by subtracting it again.
self.mc.SUB_ri(esp.value, p)
- def _emit_call_64(self, x, arglocs, start, argtypes):
+ def _emit_call_64(self, x, arglocs, start, argtypes, can_collect=True):
src_locs = []
dst_locs = []
xmm_src_locs = []
@@ -1261,13 +1262,16 @@
dst_locs.append(r10)
x = r10
remap_frame_layout(self, src_locs, dst_locs, X86_64_SCRATCH_REG)
- self.push_gcmap(self.mc, self._regalloc.get_gcmap([eax], noregs=True),
- store=True)
+ if can_collect:
+ self.push_gcmap(self.mc, self._regalloc.get_gcmap([eax],
noregs=True),
+ store=True)
self.mc.CALL(x)
- self._reload_frame_if_necessary(self.mc)
+ if can_collect:
+ self._reload_frame_if_necessary(self.mc)
if align:
self.mc.ADD_ri(esp.value, align * WORD)
- self.pop_gcmap(self.mc)
+ if can_collect:
+ self.pop_gcmap(self.mc)
def _reload_frame_if_necessary(self, mc):
gcrootmap = self.cpu.gc_ll_descr.gcrootmap
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1151,7 +1151,8 @@
self.rm.before_call()
self.xrm.before_call()
self.assembler._emit_call(imm(self.assembler.memcpy_addr),
- [dstaddr_loc, srcaddr_loc, length_loc])
+ [dstaddr_loc, srcaddr_loc, length_loc],
+ can_collect=False)
self.rm.possibly_free_var(length_box)
self.rm.possibly_free_var(dstaddr_box)
self.rm.possibly_free_var(srcaddr_box)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit