[pypy-commit] pypy regalloc-playground: support for more operations, including shifts

cfbolz pypy.commits at gmail.com
Tue Sep 5 15:44:43 EDT 2017


Author: Carl Friedrich Bolz-Tereick <cfbolz at gmx.de>
Branch: regalloc-playground
Changeset: r92320:33863bdafaae
Date: 2017-09-03 09:26 +0200
http://bitbucket.org/pypy/pypy/changeset/33863bdafaae/

Log:	support for more operations, including shifts

diff --git a/rpython/jit/backend/x86/reghint.py b/rpython/jit/backend/x86/reghint.py
--- a/rpython/jit/backend/x86/reghint.py
+++ b/rpython/jit/backend/x86/reghint.py
@@ -50,13 +50,13 @@
     def _consider_binop_symm(self, op, position):
         self._consider_binop_part(op, position, symm=True)
 
-    #consider_int_mul = _consider_binop_symm
-    #consider_int_and = _consider_binop_symm
-    #consider_int_or  = _consider_binop_symm
-    #consider_int_xor = _consider_binop_symm
+    consider_int_mul = _consider_binop_symm
+    consider_int_and = _consider_binop_symm
+    consider_int_or  = _consider_binop_symm
+    consider_int_xor = _consider_binop_symm
 
-    #consider_int_mul_ovf = _consider_binop_symm
-    #consider_int_sub_ovf = _consider_binop
+    consider_int_mul_ovf = _consider_binop_symm
+    consider_int_sub_ovf = _consider_binop
     consider_int_add_ovf = _consider_binop_symm
 
     def _consider_lea(self, op, loc):
@@ -73,12 +73,15 @@
 
     consider_nursery_ptr_increment = consider_int_add
 
-    def Xconsider_int_lshift(self, op, position):
-        if not isinstance(op.getarg(1), Const):
+    def consider_int_lshift(self, op, position):
+        x, y = op.getarg(0), op.getarg(1)
+        if not isinstance(y, Const):
             self.longevity.fixed_register(position, ecx, op.getarg(1))
+        if not isinstance(x, Const):
+            self.longevity.try_use_same_register(x, op)
 
-    #consider_int_rshift  = consider_int_lshift
-    #consider_uint_rshift = consider_int_lshift
+    consider_int_rshift  = consider_int_lshift
+    consider_uint_rshift = consider_int_lshift
 
     def Xconsider_call_malloc_nursery(self, op, position):
         self.longevity.fixed_register(position, ecx, op)
diff --git a/rpython/jit/backend/x86/test/test_regalloc.py b/rpython/jit/backend/x86/test/test_regalloc.py
--- a/rpython/jit/backend/x86/test/test_regalloc.py
+++ b/rpython/jit/backend/x86/test/test_regalloc.py
@@ -102,6 +102,35 @@
         # coalescing makes sure that i0 (and thus i71) lands in edi
         assert len([entry for entry in self.log if entry.name == "mov"]) == 2
 
+    def test_coalescing_mul(self):
+        # won't test all operations, but at least check a second one
+        ops = '''
+        [i0, i1, i2, i3]
+        i7 = int_mul(i0, i1)
+        i8 = int_mul(i7, i3)
+        i9 = call_i(ConstClass(f1ptr), i8, descr=f1_calldescr)
+        i10 = int_is_true(i9)
+        guard_true(i10) []
+        finish(i9)
+        '''
+        self.interpret(ops, [5, 6, 7, 8])
+        assert len([entry for entry in self.log if entry.name == "mov"]) == 2
+
+    def test_lshift(self):
+        ops = '''
+        [i0, i1, i2, i3]
+        i5 = int_add(i2, i3)
+        i7 = int_lshift(i0, i5)
+        i8 = int_lshift(i7, i3)
+        i9 = call_i(ConstClass(f1ptr), i8, descr=f1_calldescr)
+        i10 = int_is_true(i9)
+        guard_true(i10) []
+        finish(i9)
+        '''
+        self.interpret(ops, [5, 6, 7, 8])
+        # 3 moves for arguments, 1 move for result
+        assert len([entry for entry in self.log if entry.name == "mov"]) == 4
+
     def test_binop_dont_swap_unnecessarily(self):
         ops = '''
         [i0, i1, i2, i3]


More information about the pypy-commit mailing list