[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