Author: Richard Plangger <planri...@gmail.com> Branch: ppc-vsx-support Changeset: r86012:bd6d62fca9de Date: 2016-08-04 12:44 +0200 http://bitbucket.org/pypy/pypy/changeset/bd6d62fca9de/
Log: merge default diff --git a/rpython/translator/c/src/float.h b/rpython/translator/c/src/float.h --- a/rpython/translator/c/src/float.h +++ b/rpython/translator/c/src/float.h @@ -34,10 +34,39 @@ #define OP_CAST_FLOAT_TO_UINT(x,r) r = (Unsigned)(x) #define OP_CAST_INT_TO_FLOAT(x,r) r = (double)(x) #define OP_CAST_UINT_TO_FLOAT(x,r) r = (double)(x) -#define OP_CAST_LONGLONG_TO_FLOAT(x,r) r = (double)(x) -#define OP_CAST_ULONGLONG_TO_FLOAT(x,r) r = (double)(x) +#define OP_CAST_LONGLONG_TO_FLOAT(x,r) r = rpy_cast_longlong_to_float(x) +#define OP_CAST_ULONGLONG_TO_FLOAT(x,r) r = rpy_cast_ulonglong_to_float(x) #define OP_CAST_BOOL_TO_FLOAT(x,r) r = (double)(x) +#ifdef _WIN32 +/* The purpose of these two functions is to work around a MSVC bug. + The expression '(double)131146795334735160LL' will lead to bogus + rounding, but apparently everything is fine if we write instead + rpy_cast_longlong_to_float(131146795334735160LL). Tested with + MSVC 2008. Note that even if the two functions contain just + 'return (double)x;' it seems to work on MSVC 2008, but I don't + trust that there are no other corner cases. + http://stackoverflow.com/questions/33829101/incorrect-double-to-long-conversion +*/ +static _inline double rpy_cast_longlong_to_float(long long x) +{ + unsigned int lo = (unsigned int)x; + double result = lo; + result += ((int)(x >> 32)) * 4294967296.0; + return result; +} +static _inline double rpy_cast_ulonglong_to_float(unsigned long long x) +{ + unsigned int lo = (unsigned int)x; + double result = lo; + result += ((unsigned int)(x >> 32)) * 4294967296.0; + return result; +} +#else +# define rpy_cast_longlong_to_float(x) ((double)(x)) +# define rpy_cast_ulonglong_to_float(x) ((double)(x)) +#endif + #ifdef HAVE_LONG_LONG #define OP_CAST_FLOAT_TO_LONGLONG(x,r) r = (long long)(x) #define OP_CAST_FLOAT_TO_ULONGLONG(x,r) r = (unsigned long long)(x) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit