Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit