[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