[pypy-commit] pypy int-float-list-strategy: Test, and fixes for 32-bit

arigo noreply at buildbot.pypy.org
Thu Jul 2 10:56:06 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: int-float-list-strategy
Changeset: r78406:5e7568a7f96d
Date: 2015-07-02 10:56 +0200
http://bitbucket.org/pypy/pypy/changeset/5e7568a7f96d/

Log:	Test, and fixes for 32-bit

diff --git a/rpython/rlib/longlong2float.py b/rpython/rlib/longlong2float.py
--- a/rpython/rlib/longlong2float.py
+++ b/rpython/rlib/longlong2float.py
@@ -9,7 +9,7 @@
 from __future__ import with_statement
 import sys
 from rpython.annotator import model as annmodel
-from rpython.rlib.rarithmetic import r_int64
+from rpython.rlib.rarithmetic import r_int64, intmask
 from rpython.rtyper.lltypesystem import lltype, rffi
 from rpython.rtyper.extregistry import ExtRegistryEntry
 from rpython.translator.tool.cbuild import ExternalCompilationInfo
@@ -107,7 +107,7 @@
 # For encoding integers inside nonstandard NaN bit patterns.
 #   ff ff ff fe xx xx xx xx    (signed 32-bit int)
 nan_high_word_int32 = -2       # -2 == (int)0xfffffffe
-nan_encoded_zero = rffi.cast(rffi.LONGLONG, nan_high_word_int32 << 32)
+nan_encoded_zero = r_int64(nan_high_word_int32 << 32)
 
 def encode_int32_into_longlong_nan(value):
     return (nan_encoded_zero +
@@ -117,7 +117,7 @@
     return rffi.cast(lltype.Signed, rffi.cast(rffi.INT, value))
 
 def is_int32_from_longlong_nan(value):
-    return (value >> 32) == nan_high_word_int32
+    return intmask(value >> 32) == nan_high_word_int32
 
 CAN_ALWAYS_ENCODE_INT32 = (sys.maxint == 2147483647)
 
@@ -127,4 +127,4 @@
     return value == rffi.cast(lltype.Signed, rffi.cast(rffi.INT, value))
 
 def can_encode_float(value):
-    return (float2longlong(value) >> 32) != nan_high_word_int32
+    return intmask(float2longlong(value) >> 32) != nan_high_word_int32
diff --git a/rpython/rlib/test/test_longlong2float.py b/rpython/rlib/test/test_longlong2float.py
--- a/rpython/rlib/test/test_longlong2float.py
+++ b/rpython/rlib/test/test_longlong2float.py
@@ -66,3 +66,32 @@
     for x in enum_floats():
         res = fn2(x)
         assert repr(res) == repr(float(r_singlefloat(x)))
+
+# ____________________________________________________________
+
+def fn_encode_nan(f1, i2):
+    from rpython.rlib.longlong2float import can_encode_float, can_encode_int32
+    from rpython.rlib.longlong2float import encode_int32_into_longlong_nan
+    from rpython.rlib.longlong2float import decode_int32_from_longlong_nan
+    from rpython.rlib.longlong2float import is_int32_from_longlong_nan
+    from rpython.rlib.rfloat import isnan
+    assert can_encode_float(f1)
+    assert can_encode_int32(i2)
+    l1 = float2longlong(f1)
+    l2 = encode_int32_into_longlong_nan(i2)
+    assert not is_int32_from_longlong_nan(l1)
+    assert is_int32_from_longlong_nan(l2)
+    f1b = longlong2float(l1)
+    assert f1b == f1 or (isnan(f1b) and isnan(f1))
+    assert decode_int32_from_longlong_nan(l2) == i2
+    return 42
+
+def test_compiled_encode_nan():
+    fn2 = compile(fn_encode_nan, [float, int])
+    ints = [-2**31, 2**31-1, 42]
+    for x in enum_floats():
+        y = ints.pop()
+        ints.insert(0, y)
+        fn_encode_nan(x, y)
+        res = fn2(x, y)
+        assert res == 42


More information about the pypy-commit mailing list