[pypy-svn] pypy jit-longlong: Copy from the jitypes2 branch the functions longlong2float()

arigo commits-noreply at bitbucket.org
Thu Jan 6 21:35:46 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: jit-longlong
Changeset: r40426:82fdb2dfbe33
Date: 2011-01-06 20:26 +0100
http://bitbucket.org/pypy/pypy/changeset/82fdb2dfbe33/

Log:	Copy from the jitypes2 branch the functions longlong2float() and
	float2longlong().

diff --git a/pypy/rlib/test/test_longlong2float.py b/pypy/rlib/test/test_longlong2float.py
new file mode 100644
--- /dev/null
+++ b/pypy/rlib/test/test_longlong2float.py
@@ -0,0 +1,19 @@
+from pypy.translator.c.test.test_genc import compile
+from pypy.rlib.longlong2float import longlong2float, float2longlong
+from pypy.rlib.rarithmetic import r_longlong
+
+
+maxint64 = r_longlong(9223372036854775807)
+
+def fn(x):
+    d = longlong2float(x)
+    ll = float2longlong(d)
+    return ll
+
+def test_longlong_as_float():
+    assert fn(maxint64) == maxint64
+
+def test_compiled():
+    fn2 = compile(fn, [r_longlong])
+    res = fn2(maxint64)
+    assert res == maxint64

diff --git a/pypy/rlib/longlong2float.py b/pypy/rlib/longlong2float.py
new file mode 100644
--- /dev/null
+++ b/pypy/rlib/longlong2float.py
@@ -0,0 +1,47 @@
+"""
+This module exposes the functions longlong2float() and float2longlong(),
+which cast the bit pattern of a long long into a float and back.
+"""
+from pypy.rpython.lltypesystem import lltype, rffi
+
+
+# -------- implement longlong2float and float2longlong --------
+DOUBLE_ARRAY_PTR = lltype.Ptr(lltype.Array(rffi.DOUBLE))
+LONGLONG_ARRAY_PTR = lltype.Ptr(lltype.Array(rffi.LONGLONG))
+
+# these definitions are used only in tests, when not translated
+def longlong2float_emulator(llval):
+    d_array = lltype.malloc(DOUBLE_ARRAY_PTR.TO, 1, flavor='raw')
+    ll_array = rffi.cast(LONGLONG_ARRAY_PTR, d_array)
+    ll_array[0] = llval
+    floatval = d_array[0]
+    lltype.free(d_array, flavor='raw')
+    return floatval
+
+def float2longlong_emulator(floatval):
+    d_array = lltype.malloc(DOUBLE_ARRAY_PTR.TO, 1, flavor='raw')
+    ll_array = rffi.cast(LONGLONG_ARRAY_PTR, d_array)
+    d_array[0] = floatval
+    llval = ll_array[0]
+    lltype.free(d_array, flavor='raw')
+    return llval
+
+from pypy.translator.tool.cbuild import ExternalCompilationInfo
+eci = ExternalCompilationInfo(post_include_bits=["""
+static double pypy__longlong2float(long long x) {
+    return *((double*)&x);
+}
+static long long pypy__float2longlong(double x) {
+    return *((long long*)&x);
+}
+"""])
+
+longlong2float = rffi.llexternal(
+    "pypy__longlong2float", [rffi.LONGLONG], rffi.DOUBLE,
+    _callable=longlong2float_emulator, compilation_info=eci,
+    _nowrapper=True, pure_function=True)
+
+float2longlong = rffi.llexternal(
+    "pypy__float2longlong", [rffi.DOUBLE], rffi.LONGLONG,
+    _callable=float2longlong_emulator, compilation_info=eci,
+    _nowrapper=True, pure_function=True)


More information about the Pypy-commit mailing list