[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