[pypy-commit] pypy improve-rbigint: Faster rshift since SHIFT >= sizeof(int)

stian noreply at buildbot.pypy.org
Sat Jul 21 18:41:48 CEST 2012


Author: stian
Branch: improve-rbigint
Changeset: r56357:88aaf442458b
Date: 2012-07-07 20:24 +0200
http://bitbucket.org/pypy/pypy/changeset/88aaf442458b/

Log:	Faster rshift since SHIFT >= sizeof(int)

diff --git a/pypy/rlib/rbigint.py b/pypy/rlib/rbigint.py
--- a/pypy/rlib/rbigint.py
+++ b/pypy/rlib/rbigint.py
@@ -711,13 +711,12 @@
         newsize = oldsize + wordshift + 1
         z = rbigint([NULLDIGIT] * newsize, self.sign)
         accum = _widen_digit(0)
-        i = wordshift
         j = 0
         while j < oldsize:
             accum += self.widedigit(j) << remshift
-            z.setdigit(i, accum)
+            z.setdigit(wordshift, accum)
             accum >>= SHIFT
-            i += 1
+            wordshift += 1
             j += 1
         
         newsize -= 1
@@ -766,19 +765,19 @@
 
         loshift = int_other % SHIFT
         hishift = SHIFT - loshift
-        lomask = UDIGIT_MASK((UDIGIT_TYPE(1) << hishift) - 1)
-        himask = MASK ^ lomask
+        # Not 100% sure here, but the reason why it won't be a problem is because
+        # int is max 63bit, same as our SHIFT now.
+        #lomask = UDIGIT_MASK((UDIGIT_TYPE(1) << hishift) - 1)
+        #himask = MASK ^ lomask
         z = rbigint([NULLDIGIT] * newsize, self.sign)
         i = 0
-        j = wordshift
-        newdigit = UDIGIT_TYPE(0)
         while i < newsize:
-            newdigit = (self.digit(j) >> loshift) & lomask
+            newdigit = (self.udigit(wordshift) >> loshift) #& lomask
             if i+1 < newsize:
-                newdigit |= UDIGIT_MASK(self.digit(j+1) << hishift) & himask
+                newdigit |= (self.udigit(wordshift+1) << hishift) #& himask
             z.setdigit(i, newdigit)
             i += 1
-            j += 1
+            wordshift += 1
         z._positivenormalize()
         return z
     rshift._always_inline_ = True # It's so fast that it's always benefitial.
diff --git a/pypy/rlib/test/test_rbigint.py b/pypy/rlib/test/test_rbigint.py
--- a/pypy/rlib/test/test_rbigint.py
+++ b/pypy/rlib/test/test_rbigint.py
@@ -430,7 +430,7 @@
                 res2 = f1.rshift(int(y)).tolong()
                 assert res1 == x << y
                 assert res2 == x >> y
-
+                
     def test_bitwise(self):
         for x in gen_signs([0, 1, 5, 11, 42, 43, 3 ** 30]):
             for y in gen_signs([0, 1, 5, 11, 42, 43, 3 ** 30, 3 ** 31]):
diff --git a/pypy/translator/goal/targetbigintbenchmark.py b/pypy/translator/goal/targetbigintbenchmark.py
--- a/pypy/translator/goal/targetbigintbenchmark.py
+++ b/pypy/translator/goal/targetbigintbenchmark.py
@@ -29,21 +29,21 @@
         Sum: 901.7231250000001
         
         Pypy with improvements:
-        2.885155
-        2.301395
-        2.425767
-        1.526053
-        4.066191
-        9.405854
-        1.622019
-        3.089785
-        4.844679
-        6.211589
-        0.038158
-        3.629360
-        8.194571
-        5.000065
-        Sum:  55.240641
+        2.873703
+        2.154623
+        2.427906
+        1.458865
+        4.101600
+        9.396741
+        1.613343
+        3.073679
+        4.862458
+        6.202641
+        0.038174
+        3.642065
+        8.126947
+        5.075265
+        Sum:  55.048011
 
         A pure python form of those tests where also run
         Improved pypy           | Pypy                  | CPython 2.7.3


More information about the pypy-commit mailing list