Author: Carl Friedrich Bolz-Tereick <cfb...@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] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit