[pypy-commit] pypy jit-singlefloat: Fixes.
arigo
noreply at buildbot.pypy.org
Fri Jul 29 21:10:55 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: jit-singlefloat
Changeset: r46095:7e43eb0ad5c9
Date: 2011-07-29 20:41 +0200
http://bitbucket.org/pypy/pypy/changeset/7e43eb0ad5c9/
Log: Fixes.
diff --git a/pypy/jit/backend/llgraph/llimpl.py b/pypy/jit/backend/llgraph/llimpl.py
--- a/pypy/jit/backend/llgraph/llimpl.py
+++ b/pypy/jit/backend/llgraph/llimpl.py
@@ -1494,6 +1494,7 @@
'i': lltype.Signed,
'f': lltype.Float,
'L': lltype.SignedLongLong,
+ 'S': lltype.SingleFloat,
'v': lltype.Void,
}
diff --git a/pypy/jit/codewriter/assembler.py b/pypy/jit/codewriter/assembler.py
--- a/pypy/jit/codewriter/assembler.py
+++ b/pypy/jit/codewriter/assembler.py
@@ -76,6 +76,8 @@
TYPE = llmemory.Address
if TYPE == llmemory.Address:
value = heaptracker.adr2int(value)
+ if TYPE is lltype.SingleFloat:
+ value = longlong.singlefloat2int(value)
if not isinstance(value, (llmemory.AddressAsInt,
ComputedIntSymbolic)):
value = lltype.cast_primitive(lltype.Signed, value)
diff --git a/pypy/jit/metainterp/test/test_fficall.py b/pypy/jit/metainterp/test/test_fficall.py
--- a/pypy/jit/metainterp/test/test_fficall.py
+++ b/pypy/jit/metainterp/test/test_fficall.py
@@ -16,18 +16,7 @@
# ===> ../../../rlib/test/test_libffi.py
- def check_loops_if_supported(self, *args, **kwds):
- if self.supports_all:
- self.check_loops(*args, **kwds)
- else:
- self.check_loops({'call': 1,
- 'guard_no_exception': 1,
- 'int_add': 1,
- 'int_lt': 1,
- 'guard_true': 1,
- 'jump': 1})
-
- def call(self, funcspec, args, RESULT, is_struct=False):
+ def call(self, funcspec, args, RESULT, is_struct=False, jitif=[]):
"""
Call the function specified by funcspec in a loop, and let the jit to
see and optimize it.
@@ -72,8 +61,30 @@
res = self.meta_interp(f, [0], backendopt=True,
supports_floats = self.supports_all,
supports_longlong = self.supports_all,
- supports_singlefloats = False) # XXX self.supports_all)
- # the calls to check_loops() are in pypy.rlib.test.test_libffi
+ supports_singlefloats = self.supports_all)
+ d = {'floats': self.supports_all,
+ 'longlong': self.supports_all,
+ 'singlefloats': self.supports_all,
+ 'byval': False}
+ supported = all(d[check] for check in jitif)
+ if supported:
+ self.check_loops(
+ call_release_gil=1, # a CALL_RELEASE_GIL, and no other CALLs
+ call=0,
+ call_may_force=0,
+ guard_no_exception=1,
+ guard_not_forced=1,
+ int_add=1,
+ int_lt=1,
+ guard_true=1,
+ jump=1)
+ else:
+ self.check_loops(
+ call_release_gil=0, # no CALL_RELEASE_GIL
+ int_add=1,
+ int_lt=1,
+ guard_true=1,
+ jump=1)
return res
def test_byval_result(self):
diff --git a/pypy/rlib/rarithmetic.py b/pypy/rlib/rarithmetic.py
--- a/pypy/rlib/rarithmetic.py
+++ b/pypy/rlib/rarithmetic.py
@@ -71,9 +71,8 @@
return int(n)
def longlongmask(n):
- if isinstance(n, int):
- n = long(n)
- assert isinstance(n, long)
+ assert isinstance(n, (int, long))
+ n = long(n)
n &= LONGLONG_MASK
if n >= LONGLONG_TEST:
n -= 2*LONGLONG_TEST
diff --git a/pypy/rlib/test/test_libffi.py b/pypy/rlib/test/test_libffi.py
--- a/pypy/rlib/test/test_libffi.py
+++ b/pypy/rlib/test/test_libffi.py
@@ -98,7 +98,7 @@
def get_libfoo(self):
return self.CDLL(self.libfoo_name)
- def call(self, funcspec, args, RESULT, is_struct=False):
+ def call(self, funcspec, args, RESULT, is_struct=False, jitif=[]):
"""
Call the specified function after constructing and ArgChain with the
arguments in ``args``.
@@ -123,19 +123,6 @@
chain.arg(arg)
return func.call(chain, RESULT, is_struct=is_struct)
- def check_loops(self, *args, **kwds):
- """
- Ignored here, but does something in the JIT tests
- """
- pass
-
- def check_loops_if_supported(self, *args, **kwds):
- """
- Same as check_loops(), but only if support for
- float/longlong/singlefloat has been enabled
- """
- pass
-
# ------------------------------------------------------------------------
def test_very_simple(self):
@@ -149,14 +136,6 @@
func = (libfoo, 'diff_xy', [types.sint, types.slong], types.sint)
res = self.call(func, [50, 8], lltype.Signed)
assert res == 42
- self.check_loops({
- 'call_release_gil': 1,
- 'guard_no_exception': 1,
- 'guard_not_forced': 1,
- 'int_add': 1,
- 'int_lt': 1,
- 'guard_true': 1,
- 'jump': 1})
def test_simple(self):
"""
@@ -167,25 +146,14 @@
"""
libfoo = self.get_libfoo()
func = (libfoo, 'sum_xy', [types.sint, types.double], types.sint)
- res = self.call(func, [38, 4.2], lltype.Signed)
+ res = self.call(func, [38, 4.2], lltype.Signed, jitif=["floats"])
assert res == 42
- self.check_loops_if_supported({
- 'call_release_gil': 1,
- 'guard_no_exception': 1,
- 'guard_not_forced': 1,
- 'int_add': 1,
- 'int_lt': 1,
- 'guard_true': 1,
- 'jump': 1})
def test_float_result(self):
libm = self.get_libm()
func = (libm, 'pow', [types.double, types.double], types.double)
- res = self.call(func, [2.0, 3.0], rffi.DOUBLE)
+ res = self.call(func, [2.0, 3.0], rffi.DOUBLE, jitif=["floats"])
assert res == 8.0
- self.check_loops_if_supported(call_release_gil=1,
- guard_no_exception=1,
- guard_not_forced=1)
def test_cast_result(self):
"""
@@ -198,7 +166,6 @@
func = (libfoo, 'cast_to_uchar_and_ovf', [types.sint], types.uchar)
res = self.call(func, [0], rffi.UCHAR)
assert res == 200
- self.check_loops(call_release_gil=1, guard_no_exception=1, guard_not_forced=1)
def test_cast_argument(self):
"""
@@ -313,10 +280,9 @@
func = (libfoo, 'sum_xy_float', [types.float, types.float], types.float)
x = r_singlefloat(12.34)
y = r_singlefloat(56.78)
- res = self.call(func, [x, y], rffi.FLOAT)
+ res = self.call(func, [x, y], rffi.FLOAT, jitif=["singlefloats"])
expected = c_float(c_float(12.34).value + c_float(56.78).value).value
assert float(res) == expected
- self.check_loops_if_supported({})
def test_slonglong_args(self):
"""
@@ -337,12 +303,9 @@
else:
x = maxint32+1
y = maxint32+2
- res = self.call(func, [x, y], rffi.LONGLONG)
+ res = self.call(func, [x, y], rffi.LONGLONG, jitif=["longlong"])
expected = maxint32*2 + 3
assert res == expected
- self.check_loops_if_supported(call_release_gil=1,
- guard_no_exception=1,
- guard_not_forced=1)
def test_ulonglong_args(self):
"""
@@ -360,7 +323,7 @@
types.ulonglong)
x = r_ulonglong(maxint64+1)
y = r_ulonglong(2)
- res = self.call(func, [x, y], rffi.ULONGLONG)
+ res = self.call(func, [x, y], rffi.ULONGLONG, jitif=["longlong"])
expected = maxint64 + 3
assert res == expected
@@ -407,7 +370,8 @@
buf[0] = 30
buf[1] = 12
adr = rffi.cast(rffi.VOIDP, buf)
- res = self.call(sum_point, [('arg_raw', adr)], rffi.LONG)
+ res = self.call(sum_point, [('arg_raw', adr)], rffi.LONG,
+ jitif=["byval"])
assert res == 42
# check that we still have the ownership on the buffer
assert buf[0] == 30
@@ -432,7 +396,8 @@
make_point = (libfoo, 'make_point', [types.slong, types.slong], ffi_point)
#
PTR = lltype.Ptr(rffi.CArray(rffi.LONG))
- p = self.call(make_point, [12, 34], PTR, is_struct=True)
+ p = self.call(make_point, [12, 34], PTR, is_struct=True,
+ jitif=["byval"])
assert p[0] == 12
assert p[1] == 34
lltype.free(p, flavor='raw')
diff --git a/pypy/rpython/lltypesystem/lltype.py b/pypy/rpython/lltypesystem/lltype.py
--- a/pypy/rpython/lltypesystem/lltype.py
+++ b/pypy/rpython/lltypesystem/lltype.py
@@ -1,7 +1,7 @@
import py
from pypy.rlib.rarithmetic import (r_int, r_uint, intmask, r_singlefloat,
r_ulonglong, r_longlong, r_longfloat,
- base_int, normalizedinttype)
+ base_int, normalizedinttype, longlongmask)
from pypy.rlib.objectmodel import Symbolic
from pypy.tool.uid import Hashable
from pypy.tool.identity_dict import identity_dict
@@ -654,6 +654,9 @@
_numbertypes = {int: Number("Signed", int, intmask)}
_numbertypes[r_int] = _numbertypes[int]
+if r_longlong is not r_int:
+ _numbertypes[r_longlong] = Number("SignedLongLong", r_longlong,
+ longlongmask)
def build_number(name, type):
try:
More information about the pypy-commit
mailing list