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