Author: Squeaky <[email protected]>
Branch: bounds-int-add-or
Changeset: r69198:c57dc327e758
Date: 2014-02-17 20:52 +0100
http://bitbucket.org/pypy/pypy/changeset/c57dc327e758/

Log:    substitute pow2 with loop-less non-overflowing pow2 - 1

diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py 
b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -24,15 +24,15 @@
         return (1 << ((byte_size << 3) - 1)) - 1
 
 
-def next_power2(val):
-    """Calculate next power of 2 greater than val.
-
-       Danger: this can overflow, use only when val is sufficiently
-       lower than symbolic.WORD"""
-    power = 1
-    while power < val + 1:
-        power <<= 1
-    return power
+def next_pow2_m1(n):
+    """Calculate next power of 2 greater than n minus one."""
+    n |= n >> 1
+    n |= n >> 2
+    n |= n >> 4
+    n |= n >> 8
+    n |= n >> 16
+    n |= n >> 32
+    return n
 
 
 class OptIntBounds(Optimization):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_intbounds.py 
b/rpython/jit/metainterp/optimizeopt/test/test_intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_intbounds.py
@@ -1,10 +1,12 @@
-from rpython.jit.metainterp.optimizeopt.intbounds import next_power2
+from rpython.jit.metainterp.optimizeopt.intbounds import next_pow2_m1
 
 
-def test_next_power2():
-    assert next_power2(0) == 1
-    assert next_power2(1) == 2
-    assert next_power2(7) == 8
-    assert next_power2(256) == 512
-    assert next_power2(255) == 256
-    assert next_power2(80) == 128
+def test_next_pow2_m1():
+    assert next_pow2_m1(0) == 0
+    assert next_pow2_m1(1) == 1
+    assert next_pow2_m1(7) == 7
+    assert next_pow2_m1(256) == 511
+    assert next_pow2_m1(255) == 255
+    assert next_pow2_m1(80) == 127
+    assert next_pow2_m1((1 << 32) - 5) == (1 << 32) - 1
+    assert next_pow2_m1((1 << 64) - 1) == (1 << 64) - 1
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to