[pypy-svn] pypy jit-longlong: LLONG_FROM_INT: use suggestion by bobbyz to load the two registers
arigo
commits-noreply at bitbucket.org
Sun Jan 9 19:19:25 CET 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: jit-longlong
Changeset: r40536:8daa9eb6ac7a
Date: 2011-01-09 19:19 +0100
http://bitbucket.org/pypy/pypy/changeset/8daa9eb6ac7a/
Log: LLONG_FROM_INT: use suggestion by bobbyz to load the two registers
in two different xmm registers and combine them afterwards.
diff --git a/pypy/jit/backend/x86/rx86.py b/pypy/jit/backend/x86/rx86.py
--- a/pypy/jit/backend/x86/rx86.py
+++ b/pypy/jit/backend/x86/rx86.py
@@ -546,12 +546,14 @@
CVTTSD2SI_rb = xmminsn('\xF2', rex_w, '\x0F\x2C', register(1, 8), stack_bp(2))
MOVD_rx = xmminsn('\x66', rex_w, '\x0F\x7E', register(2, 8), register(1), '\xC0')
+ MOVD_xr = xmminsn('\x66', rex_w, '\x0F\x6E', register(1, 8), register(2), '\xC0')
PADDQ_xx = xmminsn('\x66', rex_nw, '\x0F\xD4', register(1, 8), register(2), '\xC0')
PSUBQ_xx = xmminsn('\x66', rex_nw, '\x0F\xFB', register(1, 8), register(2), '\xC0')
PAND_xx = xmminsn('\x66', rex_nw, '\x0F\xDB', register(1, 8), register(2), '\xC0')
POR_xx = xmminsn('\x66', rex_nw, '\x0F\xEB', register(1, 8), register(2), '\xC0')
PXOR_xx = xmminsn('\x66', rex_nw, '\x0F\xEF', register(1, 8), register(2), '\xC0')
# PSLLQ
+ PUNPCKLDQ_xx = xmminsn('\x66', rex_nw, '\x0F\x62', register(1, 8), register(2), '\xC0')
# ------------------------------------------------------------
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
@@ -1121,10 +1121,13 @@
self.mc.MOVSD(resloc, loc)
else:
assert loc is eax
- assert isinstance(resloc, StackLoc)
+ assert isinstance(resloc, RegLoc)
+ loc2 = arglocs[1]
+ assert isinstance(loc2, RegLoc)
self.mc.CDQ() # eax -> eax:edx
- self.mc.MOV_br(resloc.value, eax.value)
- self.mc.MOV_br(resloc.value + 4, edx.value)
+ self.mc.MOVD_xr(resloc.value, eax.value)
+ self.mc.MOVD_xr(loc2.value, edx.value)
+ self.mc.PUNPCKLDQ_xx(resloc.value, loc2.value)
def genop_llong_from_two_ints(self, op, arglocs, resloc):
assert isinstance(resloc, StackLoc)
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -648,6 +648,7 @@
def _consider_llong_from_int(self, op):
assert IS_X86_32
+ loc0 = self.xrm.force_allocate_reg(op.result)
box = op.getarg(1)
if isinstance(box, ConstInt):
from pypy.rlib.longlong2float import longlong2float
@@ -655,16 +656,17 @@
value = r_longlong(box.value)
c = ConstFloat(longlong2float(value))
loc1 = self.xrm.convert_to_imm(c)
- loc0 = self.xrm.force_allocate_reg(op.result)
+ loc2 = loc0 # unused
else:
# requires the argument to be in eax, and trash edx.
- # requires the result to be in the stack.
loc1 = self.rm.make_sure_var_in_reg(box, selected_reg=eax)
- loc0 = self.fm.loc(op.result)
tmpvar = TempBox()
self.rm.force_allocate_reg(tmpvar, [box], selected_reg=edx)
self.rm.possibly_free_var(tmpvar)
- self.PerformLLong(op, [loc1], loc0)
+ tmpxvar = TempBox()
+ loc2 = self.xrm.force_allocate_reg(tmpxvar, [op.result])
+ self.xrm.possibly_free_var(tmpxvar)
+ self.PerformLLong(op, [loc1, loc2], loc0)
self.rm.possibly_free_var(box)
def _consider_llong_from_two_ints(self, op):
More information about the Pypy-commit
mailing list