[pypy-svn] pypy jit-longlong: Merge the 'smalllong' branch.
arigo
commits-noreply at bitbucket.org
Sun Jan 9 14:24:41 CET 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: jit-longlong
Changeset: r40522:339ddd6245f2
Date: 2011-01-09 14:23 +0100
http://bitbucket.org/pypy/pypy/changeset/339ddd6245f2/
Log: Merge the 'smalllong' branch.
diff --git a/pypy/rlib/rarithmetic.py b/pypy/rlib/rarithmetic.py
--- a/pypy/rlib/rarithmetic.py
+++ b/pypy/rlib/rarithmetic.py
@@ -49,6 +49,9 @@
LONG_BIT = _bits+1
LONG_MASK = _Ltest*2-1
LONG_TEST = _Ltest
+LONGLONG_BIT = 64
+LONGLONG_MASK = (2**LONGLONG_BIT)-1
+LONGLONG_TEST = 2**(LONGLONG_BIT-1)
LONG_BIT_SHIFT = 0
while (1 << LONG_BIT_SHIFT) != LONG_BIT:
@@ -76,6 +79,15 @@
n -= 2*LONG_TEST
return int(n)
+def longlongmask(n):
+ if isinstance(n, int):
+ n = long(n)
+ assert isinstance(n, long)
+ n &= LONGLONG_MASK
+ if n >= LONGLONG_TEST:
+ n -= 2*LONGLONG_TEST
+ return r_longlong(n)
+
def widen(n):
from pypy.rpython.lltypesystem import lltype
if _should_widen_type(lltype.typeOf(n)):
@@ -408,6 +420,8 @@
r_longlong = build_int('r_longlong', True, 64)
r_ulonglong = build_int('r_ulonglong', False, 64)
+longlongmax = r_longlong(LONGLONG_TEST - 1)
+
if r_longlong is not r_int:
r_int64 = r_longlong
else:
diff --git a/pypy/rlib/rbigint.py b/pypy/rlib/rbigint.py
--- a/pypy/rlib/rbigint.py
+++ b/pypy/rlib/rbigint.py
@@ -559,6 +559,34 @@
if self._numdigits() == 1 and self.digits[0] == 0:
self.sign = 0
+ def getsign(self):
+ return self.sign
+
+
+ @staticmethod
+ def static_add(a, b):
+ return a.add(b)
+
+ @staticmethod
+ def static_mul(a, b):
+ return a.mul(b)
+
+ @staticmethod
+ def static_floordiv(a, b):
+ return a.floordiv(b)
+
+ @staticmethod
+ def static_lshift(a, b):
+ return a.lshift(b)
+
+ @staticmethod
+ def static_rshift(a, b):
+ return a.rshift(b)
+
+ @staticmethod
+ def static_pow(a, b):
+ return a.pow(b)
+
def __repr__(self):
return "<rbigint digits=%s, sign=%s, %s>" % (self.digits, self.sign, self.str())
diff --git a/pypy/rpython/rint.py b/pypy/rpython/rint.py
--- a/pypy/rpython/rint.py
+++ b/pypy/rpython/rint.py
@@ -226,7 +226,7 @@
# return (x/y) - (((x^y)<0)&((x%y)!=0));
v_xor = hop.genop(prefix + 'xor', vlist,
resulttype=repr)
- v_xor_le = hop.genop(prefix + 'le', [v_xor, c_zero],
+ v_xor_le = hop.genop(prefix + 'lt', [v_xor, c_zero],
resulttype=Bool)
v_xor_le = hop.llops.convertvar(v_xor_le, bool_repr, repr)
v_mod = hop.genop(prefix + 'mod', vlist,
diff --git a/pypy/jit/codewriter/support.py b/pypy/jit/codewriter/support.py
--- a/pypy/jit/codewriter/support.py
+++ b/pypy/jit/codewriter/support.py
@@ -179,12 +179,12 @@
def _ll_2_int_floordiv_ovf_zer(x, y):
if y == 0:
raise ZeroDivisionError
- if ((x + sys.maxint) & y) == -1: # detect "x = -sys.maxint-1, y = -1".
+ if x == -sys.maxint - 1 and y == -1:
raise OverflowError
return llop.int_floordiv(lltype.Signed, x, y)
def _ll_2_int_floordiv_ovf(x, y):
- if ((x + sys.maxint) & y) == -1: # detect "x = -sys.maxint-1, y = -1".
+ if x == -sys.maxint - 1 and y == -1:
raise OverflowError
return llop.int_floordiv(lltype.Signed, x, y)
@@ -196,12 +196,12 @@
def _ll_2_int_mod_ovf_zer(x, y):
if y == 0:
raise ZeroDivisionError
- if ((x + sys.maxint) & y) == -1: # detect "x = -sys.maxint-1, y = -1".
+ if x == -sys.maxint - 1 and y == -1:
raise OverflowError
return llop.int_mod(lltype.Signed, x, y)
def _ll_2_int_mod_ovf(x, y):
- if ((x + sys.maxint) & y) == -1: # detect "x = -sys.maxint-1, y = -1".
+ if x == -sys.maxint - 1 and y == -1:
raise OverflowError
return llop.int_mod(lltype.Signed, x, y)
More information about the Pypy-commit
mailing list