[pypy-svn] pypy jit-longlong: LLONG_FROM_TWO_INTS.

arigo commits-noreply at bitbucket.org
Sun Jan 9 12:02:47 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: jit-longlong
Changeset: r40510:e49d7204f45c
Date: 2011-01-09 12:02 +0100
http://bitbucket.org/pypy/pypy/changeset/e49d7204f45c/

Log:	LLONG_FROM_TWO_INTS.

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
@@ -1127,6 +1127,20 @@
             self.mc.MOV_br(resloc.value, eax.value)
             self.mc.MOV_br(resloc.value + 4, edx.value)
 
+    def genop_llong_from_two_ints(self, op, arglocs, resloc):
+        assert isinstance(resloc, StackLoc)
+        stackofs = resloc.value
+        loc1, loc2 = arglocs
+        if isinstance(loc1, ImmedLoc):
+            self.mc.MOV_bi(stackofs, loc1.value)
+        else:
+            self.mc.MOV_br(stackofs, loc1.value)
+        stackofs += 4
+        if isinstance(loc2, ImmedLoc):
+            self.mc.MOV_bi(stackofs, loc2.value)
+        else:
+            self.mc.MOV_br(stackofs, loc2.value)
+
     def genop_new_with_vtable(self, op, arglocs, result_loc):
         assert result_loc is eax
         loc_vtable = arglocs[-1]

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
@@ -659,6 +659,15 @@
         self.PerformLLong(op, [loc1], loc0)
         self.rm.possibly_free_var(op.getarg(1))
 
+    def _consider_llong_from_two_ints(self, op):
+        # requires the arguments to be in registers or immediates.
+        # requires the result to be in the stack.
+        loc0 = self.fm.loc(op.result)
+        loc1 = self.rm.make_sure_var_in_reg(op.getarg(1))
+        loc2 = self.rm.make_sure_var_in_reg(op.getarg(2), [op.getarg(1)])
+        self.PerformLLong(op, [loc1, loc2], loc0)
+        self.rm.possibly_free_vars_for_op(op)
+
     def _call(self, op, arglocs, force_store=[], guard_not_forced_op=None):
         save_all_regs = guard_not_forced_op is not None
         self.rm.before_call(force_store, save_all_regs=save_all_regs)
@@ -706,6 +715,8 @@
                     return self._consider_llong_to_int(op)
                 if oopspecindex == EffectInfo.OS_LLONG_FROM_INT:
                     return self._consider_llong_from_int(op)
+                if oopspecindex == EffectInfo.OS_LLONG_FROM_TWO_INTS:
+                    return self._consider_llong_from_two_ints(op)
         #
         self._consider_call(op)
 


More information about the Pypy-commit mailing list