Author: stian
Branch: improve-rbigint
Changeset: r56340:89890e8a28a8
Date: 2012-06-27 05:17 +0200
http://bitbucket.org/pypy/pypy/changeset/89890e8a28a8/

Log:    Add some jit hooks and remove the shift len check from int.h
        (because rbigint is the only place we use longlonglong, and probably
        ever gonna use it)

diff --git a/pypy/rlib/rbigint.py b/pypy/rlib/rbigint.py
--- a/pypy/rlib/rbigint.py
+++ b/pypy/rlib/rbigint.py
@@ -232,6 +232,7 @@
         return rbigint(*args_from_long(l))
 
     @staticmethod
+    @jit.elidable
     def fromfloat(dval):
         """ Create a new bigint object from a float """
         # This function is not marked as pure because it can raise
@@ -328,20 +329,25 @@
         """Return r_ulonglong(self), truncating."""
         return _AsULonglong_mask(self)
 
+    @jit.elidable
     def tofloat(self):
         return _AsDouble(self)
 
+    @jit.elidable
     def format(self, digits, prefix='', suffix=''):
         # 'digits' is a string whose length is the base to use,
         # and where each character is the corresponding digit.
         return _format(self, digits, prefix, suffix)
 
+    @jit.elidable
     def repr(self):
         return _format(self, BASE10, '', 'L')
 
+    @jit.elidable
     def str(self):
         return _format(self, BASE10)
 
+    @jit.elidable
     def eq(self, other):
         if (self.sign != other.sign or
             self.numdigits() != other.numdigits()):
@@ -401,9 +407,11 @@
     def ge(self, other):
         return not self.lt(other)
 
+    @jit.elidable
     def hash(self):
         return _hash(self)
 
+    @jit.elidable
     def add(self, other):
         if self.sign == 0:
             return other
@@ -416,6 +424,7 @@
         result.sign *= other.sign
         return result
 
+    @jit.elidable
     def sub(self, other):
         if other.sign == 0:
             return self
@@ -429,6 +438,7 @@
         result._normalize()
         return result
 
+    @jit.elidable
     def mul(self, b):
         asize = self.numdigits()
         bsize = b.numdigits()
@@ -477,11 +487,13 @@
 
         result.sign = a.sign * b.sign
         return result
-    
+
+    @jit.elidable
     def truediv(self, other):
         div = _bigint_true_divide(self, other)
         return div
 
+    @jit.elidable
     def floordiv(self, other):
         if other.numdigits() == 1 and other.sign == 1:
             digit = other.digit(0)
@@ -495,15 +507,18 @@
             div = div.sub(ONERBIGINT)
         return div
 
+    @jit.elidable
     def div(self, other):
         return self.floordiv(other)
 
+    @jit.elidable
     def mod(self, other):
         div, mod = _divrem(self, other)
         if mod.sign * other.sign == -1:
             mod = mod.add(other)
         return mod
 
+    @jit.elidable
     def divmod(v, w):
         """
         The / and % operators are now defined in terms of divmod().
@@ -527,6 +542,7 @@
             div = div.sub(ONERBIGINT)
         return div, mod
 
+    @jit.elidable
     def pow(a, b, c=None):
         negativeOutput = False  # if x<0 return negative output
 
@@ -663,6 +679,7 @@
     def invert(self): #Implement ~x as -(x + 1)
         return self.add(ONERBIGINT).neg()
 
+    @jit.elidable
     def lshift(self, int_other):
         if int_other < 0:
             raise ValueError("negative shift count")
@@ -696,6 +713,7 @@
         z._normalize()
         return z
 
+    @jit.elidable
     def lqshift(self, int_other):
         " A quicker one with much less checks, int_other is valid and for the 
most part constant."
         assert int_other > 0
@@ -714,6 +732,7 @@
         z._normalize()
         return z
     
+    @jit.elidable
     def rshift(self, int_other, dont_invert=False):
         if int_other < 0:
             raise ValueError("negative shift count")
@@ -747,12 +766,15 @@
         z._normalize()
         return z
 
+    @jit.elidable
     def and_(self, other):
         return _bitwise(self, '&', other)
 
+    @jit.elidable
     def xor(self, other):
         return _bitwise(self, '^', other)
 
+    @jit.elidable
     def or_(self, other):
         return _bitwise(self, '|', other)
 
@@ -765,6 +787,7 @@
     def hex(self):
         return _format(self, BASE16, '0x', 'L')
 
+    @jit.elidable
     def log(self, base):
         # base is supposed to be positive or 0.0, which means we use e
         if base == 10.0:
diff --git a/pypy/translator/c/src/int.h b/pypy/translator/c/src/int.h
--- a/pypy/translator/c/src/int.h
+++ b/pypy/translator/c/src/int.h
@@ -98,8 +98,7 @@
                                                r = 
Py_ARITHMETIC_RIGHT_SHIFT(PY_LONG_LONG,x, (y))
 #define OP_ULLONG_RSHIFT(x,y,r) CHECK_SHIFT_RANGE(y, PYPY_LONGLONG_BIT); \
                                                r = (x) >> (y)
-#define OP_LLLONG_RSHIFT(x,y,r)  CHECK_SHIFT_RANGE(y, PYPY_LONGLONGLONG_BIT); \
-                                                r = 
Py_ARITHMETIC_RIGHT_SHIFT(PY_LONG_LONG_LONG,x, (y))
+#define OP_LLLONG_RSHIFT(x,y,r)  r = 
Py_ARITHMETIC_RIGHT_SHIFT(PY_LONG_LONG_LONG,x, (y))
 
 #define OP_INT_LSHIFT(x,y,r)    CHECK_SHIFT_RANGE(y, PYPY_LONG_BIT); \
                                                        r = (x) << (y)
@@ -107,8 +106,7 @@
                                                        r = (x) << (y)
 #define OP_LLONG_LSHIFT(x,y,r)  CHECK_SHIFT_RANGE(y, PYPY_LONGLONG_BIT); \
                                                        r = (x) << (y)
-#define OP_LLLONG_LSHIFT(x,y,r)  CHECK_SHIFT_RANGE(y, PYPY_LONGLONGLONG_BIT); \
-                                                        r = (x) << (y)
+#define OP_LLLONG_LSHIFT(x,y,r)  r = (x) << (y)
 #define OP_ULLONG_LSHIFT(x,y,r) CHECK_SHIFT_RANGE(y, PYPY_LONGLONG_BIT); \
                                                        r = (x) << (y)
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to