Module Name: src Committed By: martin Date: Sun Feb 2 08:14:39 UTC 2014
Modified Files: src/lib/libc/arch/sparc64/softfloat: qp.c Log Message: Fix unsigned 64 bit int to long double conversion for numbers that would not fit into a signed 64 bit int. Found by latest t_floatunditf test case failuer, hint from Matt Thomas. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/lib/libc/arch/sparc64/softfloat/qp.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/arch/sparc64/softfloat/qp.c diff -u src/lib/libc/arch/sparc64/softfloat/qp.c:1.10 src/lib/libc/arch/sparc64/softfloat/qp.c:1.11 --- src/lib/libc/arch/sparc64/softfloat/qp.c:1.10 Fri Feb 15 09:24:05 2013 +++ src/lib/libc/arch/sparc64/softfloat/qp.c Sun Feb 2 08:14:39 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: qp.c,v 1.10 2013/02/15 09:24:05 martin Exp $ */ +/* $NetBSD: qp.c,v 1.11 2014/02/02 08:14:39 martin Exp $ */ /*- * Copyright (c) 2002, 2003 The NetBSD Foundation, Inc. @@ -32,6 +32,7 @@ #include "milieu.h" #include "softfloat.h" +int printf(const char *, ...); void _Qp_add(float128 *c, float128 *a, float128 *b); int _Qp_cmp(float128 *a, float128 *b); @@ -166,9 +167,10 @@ _Qp_mul(float128 *c, float128 *a, float1 /* - * XXX need corresponding softfloat function + * XXX need corresponding softfloat functions */ static float128 __sf128_zero = {0x4034000000000000, 0x00000000}; +static float128 __sf128_one = {0x3fff000000000000, 0}; void _Qp_neg(float128 *c, float128 *a) @@ -268,13 +270,15 @@ _Qp_uitoq(float128 *c, unsigned int a) void _Qp_uxtoq(float128 *c, unsigned long a) { - if (a & 0x8000000000000000ULL) { - a = (a >> 1) | (a & 1); - *c = int64_to_float128((long long)a); + /* a would not fit in a signed conversion */ + *c = int64_to_float128((long long)(a>>1)); *c = float128_add(*c, *c); - } else + if (a & 1) + *c = float128_add(*c, __sf128_one); + } else { *c = int64_to_float128((long long)a); + } }