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);
+ }
}