Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r44385:17d49b1429d4 Date: 2011-05-23 17:38 +0200 http://bitbucket.org/pypy/pypy/changeset/17d49b1429d4/
Log: (bivab, arigo) Fix. The previous code in the 32-bit version of _assemble_bootstrap_direct_call() was doing happy nonsense that only worked if arguments were either all floats or all non-floats. As usual I have no clue how it could have worked so far. diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py --- a/pypy/jit/backend/x86/assembler.py +++ b/pypy/jit/backend/x86/assembler.py @@ -678,27 +678,29 @@ nonfloatlocs, floatlocs = arglocs self._call_header_with_stack_check() self.mc.LEA_rb(esp.value, self._get_offset_of_ebp_from_esp(stackdepth)) - for i in range(len(nonfloatlocs)): - loc = nonfloatlocs[i] - if isinstance(loc, RegLoc): - assert not loc.is_xmm - self.mc.MOV_rb(loc.value, (2 + i) * WORD) - loc = floatlocs[i] - if isinstance(loc, RegLoc): - assert loc.is_xmm - self.mc.MOVSD_xb(loc.value, (1 + i) * 2 * WORD) + offset = 2 * WORD tmp = eax xmmtmp = xmm0 for i in range(len(nonfloatlocs)): loc = nonfloatlocs[i] - if loc is not None and not isinstance(loc, RegLoc): - self.mc.MOV_rb(tmp.value, (2 + i) * WORD) - self.mc.MOV(loc, tmp) + if loc is not None: + assert not loc.is_xmm + if isinstance(loc, RegLoc): + self.mc.MOV_rb(loc.value, offset) + else: + self.mc.MOV_rb(tmp.value, offset) + self.mc.MOV(loc, tmp) + offset += WORD loc = floatlocs[i] - if loc is not None and not isinstance(loc, RegLoc): - self.mc.MOVSD_xb(xmmtmp.value, (1 + i) * 2 * WORD) - assert isinstance(loc, StackLoc) - self.mc.MOVSD_bx(loc.value, xmmtmp.value) + if loc is not None: + assert loc.is_xmm + if isinstance(loc, RegLoc): + self.mc.MOVSD_xb(loc.value, offset) + else: + self.mc.MOVSD_xb(xmmtmp.value, offset) + assert isinstance(loc, StackLoc) + self.mc.MOVSD_bx(loc.value, xmmtmp.value) + offset += 2 * WORD endpos = self.mc.get_relative_pos() + 5 self.mc.JMP_l(jmppos - endpos) assert endpos == self.mc.get_relative_pos() _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit