Author: stian Branch: math-improvements Changeset: r93002:3f4aca709e49 Date: 2017-11-13 13:53 +0100 http://bitbucket.org/pypy/pypy/changeset/3f4aca709e49/
Log: Remove invert logic from rqshift (it is only used with positive numbers) diff --git a/rpython/rlib/rbigint.py b/rpython/rlib/rbigint.py --- a/rpython/rlib/rbigint.py +++ b/rpython/rlib/rbigint.py @@ -1314,38 +1314,22 @@ wordshift = int_other / SHIFT loshift = int_other % SHIFT newsize = self.numdigits() - wordshift - - invert = False - if self.sign == -1: - first = self.digit(0) - if first == 0: - a = self.invert().rqshift(int_other) - return a.invert() - invert = True if newsize <= 0: - if invert: - return ONENEGATIVERBIGINT - else: - return NULLRBIGINT + return NULLRBIGINT - hishift = SHIFT - loshift z = rbigint([NULLDIGIT] * newsize, self.sign, newsize) i = 0 while i < newsize: digit = self.udigit(wordshift) - if invert and i == 0 and wordshift == 0: - digit -= 1 newdigit = (digit >> loshift) if i+1 < newsize: newdigit |= (self.udigit(wordshift+1) << hishift) z.setdigit(i, newdigit) i += 1 - wordshift += 1 - if invert: - z.setdigit(0, z.digit(0)+1) + wordshift += 1 z._normalize() return z rshift._always_inline_ = 'try' # It's so fast that it's always benefitial. diff --git a/rpython/rlib/test/test_rbigint.py b/rpython/rlib/test/test_rbigint.py --- a/rpython/rlib/test/test_rbigint.py +++ b/rpython/rlib/test/test_rbigint.py @@ -609,21 +609,18 @@ res1 = f1.lqshift(z).tolong() res2 = f1.rqshift(z).tolong() res3 = nf1.lqshift(z).tolong() - res4 = nf1.rqshift(z).tolong() + assert res1 == num << z assert res2 == num >> z assert res3 == -num << z - assert res4 == -num >> z - # Large digit, also invertion test. + + # Large digit for x in range((1 << SHIFT) - 10, (1 << SHIFT) + 10): f1 = rbigint.fromlong(x) - nf1 = rbigint.fromlong(-x) assert f1.rqshift(SHIFT).tolong() == x >> SHIFT - assert nf1.rqshift(SHIFT).tolong() == -x >> SHIFT assert f1.rqshift(SHIFT+1).tolong() == x >> (SHIFT+1) - assert nf1.rqshift(SHIFT+1).tolong() == -x >> (SHIFT+1) def test_from_list_n_bits(self): for x in ([3L ** 30L, 5L ** 20L, 7 ** 300] + _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit