[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