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

Reply via email to