Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r81403:77683cabfc5b Date: 2015-12-20 09:57 +0100 http://bitbucket.org/pypy/pypy/changeset/77683cabfc5b/
Log: Use INT_LSHIFT instead of INT_MUL when possible diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py --- a/rpython/jit/backend/llsupport/rewrite.py +++ b/rpython/jit/backend/llsupport/rewrite.py @@ -1,6 +1,6 @@ from rpython.rlib import rgc from rpython.rlib.objectmodel import we_are_translated -from rpython.rlib.rarithmetic import ovfcheck +from rpython.rlib.rarithmetic import ovfcheck, highest_bit from rpython.rtyper.lltypesystem import llmemory, lltype, rstr from rpython.jit.metainterp import history from rpython.jit.metainterp.history import ConstInt, ConstPtr @@ -165,7 +165,14 @@ if isinstance(index_box, ConstInt): index_box = ConstInt(index_box.value * factor) else: - index_box = ResOperation(rop.INT_MUL, [index_box, ConstInt(factor)]) + # x & (x - 1) == 0 is a quick test for power of 2 + assert factor > 0 + if (factor & (factor - 1)) == 0: + index_box = ResOperation(rop.INT_LSHIFT, + [index_box, ConstInt(highest_bit(factor))]) + else: + index_box = ResOperation(rop.INT_MUL, + [index_box, ConstInt(factor)]) self.emit_op(index_box) factor = 1 # adjust the constant offset diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py --- a/rpython/jit/backend/llsupport/test/test_rewrite.py +++ b/rpython/jit/backend/llsupport/test/test_rewrite.py @@ -37,6 +37,7 @@ return ','.join([str(n) for n in [descr.itemsize, descr.basesize, size]]) + WORD = globals()['WORD'] S = lltype.GcStruct('S', ('x', lltype.Signed), ('y', lltype.Signed)) sdescr = get_size_descr(self.gc_ll_descr, S) @@ -71,6 +72,12 @@ itzdescr = get_interiorfield_descr(self.gc_ll_descr, S1I, 'z') itydescr = get_interiorfield_descr(self.gc_ll_descr, S1I, 'y') itxdescr = get_interiorfield_descr(self.gc_ll_descr, S1I, 'x') + S2I = lltype.GcArray(('x', lltype.Ptr(S1)), + ('y', lltype.Ptr(S1)), + ('z', lltype.Ptr(S1)), + ('t', lltype.Ptr(S1))) # size is a power of two + s2i_item_size_in_bits = (4 if WORD == 4 else 5) + ity2descr = get_interiorfield_descr(self.gc_ll_descr, S2I, 'y') R1 = lltype.GcStruct('R', ('x', lltype.Signed), ('y', lltype.Float), ('z', lltype.Ptr(S1))) @@ -90,7 +97,6 @@ # tiddescr = self.gc_ll_descr.fielddescr_tid wbdescr = self.gc_ll_descr.write_barrier_descr - WORD = globals()['WORD'] # F = lltype.GcArray(lltype.Float) fdescr = get_array_descr(self.gc_ll_descr, F) @@ -1224,6 +1230,13 @@ '%(itydescr.arraydescr.basesize' ' + itydescr.fielddescr.offset)d,' '%(itydescr.fielddescr.field_size)d)'], + [True, (1,2,4,8), 'i3 = setinteriorfield_gc(p0,i1,i2,descr=ity2descr)' '->' + 'i4 = int_lshift(i1,' + '%(s2i_item_size_in_bits)d);' + 'i3 = gc_store_indexed(p0,i4,i2,1,' + '%(ity2descr.arraydescr.basesize' + ' + itydescr.fielddescr.offset)d,' + '%(ity2descr.fielddescr.field_size)d)'], ]) def test_gc_load_store_transform(self, support_offset, factors, fromto): self.cpu.load_constant_offset = support_offset _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit