[pypy-commit] pypy default: (bivab, arigo)
arigo
noreply at buildbot.pypy.org
Mon May 23 17:27:25 CEST 2011
Author: Armin Rigo <arigo at 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()
More information about the pypy-commit
mailing list