[pypy-svn] r74782 - in pypy/branch/blackhole-improvement/pypy/jit: codewriter metainterp/test

arigo at codespeak.net arigo at codespeak.net
Wed May 26 16:56:55 CEST 2010


Author: arigo
Date: Wed May 26 16:56:53 2010
New Revision: 74782

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_basic.py
Log:
Use the same trick for int_floordiv_xxx and int_mod_xxx.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py	Wed May 26 16:56:53 2010
@@ -1,3 +1,4 @@
+import sys
 from pypy.rpython.lltypesystem import lltype, rclass
 from pypy.rpython.ootypesystem import ootype
 from pypy.rpython import rlist
@@ -170,19 +171,40 @@
 def _ll_1_jit_force_virtual(inst):
     return llop.jit_force_virtual(lltype.typeOf(inst), inst)
 
+
 def _ll_2_int_floordiv_ovf_zer(x, y):
-    return llop.int_floordiv_ovf_zer(lltype.Signed, x, y)
+    if y == 0:
+        raise ZeroDivisionError
+    if ((x + sys.maxint) & y) == -1:    # detect "x = -sys.maxint-1, y = -1".
+        raise OverflowError
+    return llop.int_floordiv(lltype.Signed, x, y)
+
 def _ll_2_int_floordiv_ovf(x, y):
-    return llop.int_floordiv_ovf(lltype.Signed, x, y)
+    if ((x + sys.maxint) & y) == -1:    # detect "x = -sys.maxint-1, y = -1".
+        raise OverflowError
+    return llop.int_floordiv(lltype.Signed, x, y)
+
 def _ll_2_int_floordiv_zer(x, y):
+    if y == 0:
+        raise ZeroDivisionError
     return llop.int_floordiv_zer(lltype.Signed, x, y)
 
 def _ll_2_int_mod_ovf_zer(x, y):
-    return llop.int_mod_ovf_zer(lltype.Signed, x, y)
+    if y == 0:
+        raise ZeroDivisionError
+    if ((x + sys.maxint) & y) == -1:    # detect "x = -sys.maxint-1, y = -1".
+        raise OverflowError
+    return llop.int_mod(lltype.Signed, x, y)
+
 def _ll_2_int_mod_ovf(x, y):
-    return llop.int_mod_ovf(lltype.Signed, x, y)
+    if ((x + sys.maxint) & y) == -1:    # detect "x = -sys.maxint-1, y = -1".
+        raise OverflowError
+    return llop.int_mod(lltype.Signed, x, y)
+
 def _ll_2_int_mod_zer(x, y):
-    return llop.int_mod_zer(lltype.Signed, x, y)
+    if y == 0:
+        raise ZeroDivisionError
+    return llop.int_mod(lltype.Signed, x, y)
 
 def _ll_2_int_lshift_ovf(x, y):
     result = x << y
@@ -198,8 +220,14 @@
 
 # in the following calls to builtins, the JIT is allowed to look inside:
 inline_calls_to = [
-    ('int_lshift_ovf', [lltype.Signed, lltype.Signed], lltype.Signed),
-    ('int_abs',        [lltype.Signed],                lltype.Signed),
+    ('int_floordiv_ovf_zer', [lltype.Signed, lltype.Signed], lltype.Signed),
+    ('int_floordiv_ovf',     [lltype.Signed, lltype.Signed], lltype.Signed),
+    ('int_floordiv_zer',     [lltype.Signed, lltype.Signed], lltype.Signed),
+    ('int_mod_ovf_zer',      [lltype.Signed, lltype.Signed], lltype.Signed),
+    ('int_mod_ovf',          [lltype.Signed, lltype.Signed], lltype.Signed),
+    ('int_mod_zer',          [lltype.Signed, lltype.Signed], lltype.Signed),
+    ('int_lshift_ovf',       [lltype.Signed, lltype.Signed], lltype.Signed),
+    ('int_abs',              [lltype.Signed],                lltype.Signed),
     ]
 
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_basic.py	Wed May 26 16:56:53 2010
@@ -578,6 +578,7 @@
             return n
         res = self.meta_interp(f, [20, 1, 2])
         assert res == 0
+        self.check_loops(call=0)
 
     def test_abs(self):
         myjitdriver = JitDriver(greens = [], reds = ['i', 't'])



More information about the Pypy-commit mailing list