[pypy-commit] pypy fast-slowpath: x86-32: don't put anything in the stack before esp, because these locations may be overritten randomly
arigo
noreply at buildbot.pypy.org
Sun Jul 28 12:59:43 CEST 2013
Author: Armin Rigo <arigo at tunes.org>
Branch: fast-slowpath
Changeset: r65735:3360d9f154d9
Date: 2013-07-28 12:56 +0200
http://bitbucket.org/pypy/pypy/changeset/3360d9f154d9/
Log: x86-32: don't put anything in the stack before esp, because these
locations may be overritten randomly
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
@@ -14,7 +14,7 @@
from rpython.rlib.jit import AsmInfo
from rpython.jit.backend.model import CompiledLoopToken
from rpython.jit.backend.x86.regalloc import (RegAlloc, get_ebp_ofs,
- gpr_reg_mgr_cls, xmm_reg_mgr_cls)
+ gpr_reg_mgr_cls, xmm_reg_mgr_cls, _register_arguments)
from rpython.jit.backend.llsupport.regalloc import (get_scale, valid_addressing_size)
from rpython.jit.backend.x86.arch import (FRAME_FIXED_SIZE, WORD, IS_X86_64,
JITFRAME_FIXED_SIZE, IS_X86_32,
@@ -163,7 +163,8 @@
# the caller is responsible for putting arguments in the right spot
mc.SUB(esp, imm(WORD * 7))
self.set_extra_stack_depth(mc, 8 * WORD)
- # args are in their respective positions
+ for i in range(4):
+ mc.MOV_sr(i * WORD, _register_arguments[i].value)
mc.CALL(eax)
if IS_X86_64:
mc.ADD(esp, imm(WORD))
@@ -2160,7 +2161,7 @@
def label(self):
self._check_frame_depth_debug(self.mc)
- def cond_call(self, op, gcmap, cond_loc, call_loc, arglocs):
+ def cond_call(self, op, gcmap, cond_loc, call_loc):
self.mc.TEST(cond_loc, cond_loc)
self.mc.J_il8(rx86.Conditions['Z'], 0) # patched later
jmp_adr = self.mc.get_relative_pos()
@@ -2176,11 +2177,6 @@
if self._regalloc.xrm.reg_bindings:
floats = True
cond_call_adr = self.cond_call_slowpath[floats * 2 + callee_only]
- if IS_X86_32:
- p = -8 * WORD
- for loc in arglocs:
- self.mc.MOV(RawEspLoc(p, INT), loc)
- p += WORD
self.mc.CALL(imm(cond_call_adr))
self.pop_gcmap(self.mc)
# never any result value
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
@@ -56,7 +56,6 @@
no_lower_byte_regs = []
save_around_call_regs = [eax, ecx, edx, esi, edi, r8, r9, r10]
- register_arguments = [edi, esi, edx, ecx]
class X86XMMRegisterManager(RegisterManager):
@@ -120,6 +119,9 @@
for _i, _reg in enumerate(gpr_reg_mgr_cls.all_regs):
gpr_reg_mgr_cls.all_reg_indexes[_reg.value] = _i
+_register_arguments = [edi, esi, edx, ecx]
+
+
class RegAlloc(BaseRegalloc):
def __init__(self, assembler, translate_support_code=False):
@@ -809,18 +811,12 @@
imm = self.rm.convert_to_imm(v)
self.assembler.regalloc_mov(imm, eax)
args_so_far = [tmpbox]
- locs = []
for i in range(2, len(args)):
- if IS_X86_64:
- reg = self.rm.register_arguments[i - 2]
- self.make_sure_var_in_reg(args[i], args_so_far, selected_reg=reg)
- else:
- loc = self.make_sure_var_in_reg(args[i], args_so_far)
- locs.append(loc)
+ reg = _register_arguments[i - 2]
+ self.make_sure_var_in_reg(args[i], args_so_far, selected_reg=reg)
args_so_far.append(args[i])
loc_cond = self.make_sure_var_in_reg(args[0], args)
- self.assembler.cond_call(op, self.get_gcmap([eax]), loc_cond, eax,
- locs)
+ self.assembler.cond_call(op, self.get_gcmap([eax]), loc_cond, eax)
self.rm.possibly_free_var(tmpbox)
def consider_call_malloc_nursery(self, op):
More information about the pypy-commit
mailing list