about summary refs log tree commit diff
path: root/soft-fp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-01-15 23:43:04 +0000
committerJakub Jelinek <jakub@redhat.com>2007-01-15 23:43:04 +0000
commitd68f5d2cff7cd9fb5f1f5dfa4c24d245766bab49 (patch)
treec0cea5b208d8ff8f46eb3b6008959b268012bf51 /soft-fp
parent2a1dea970d565187255f6acffcb9963d6cefc674 (diff)
downloadglibc-d68f5d2cff7cd9fb5f1f5dfa4c24d245766bab49.tar.gz
glibc-d68f5d2cff7cd9fb5f1f5dfa4c24d245766bab49.tar.xz
glibc-d68f5d2cff7cd9fb5f1f5dfa4c24d245766bab49.zip
[BZ #2749]
* soft-fp/op-common.h (FP_TRUNC): When truncating a NaN, clear 
workbits in semi-raw fraction.
	* math/test-misc.c: Add new tests.

	* math/basic-test.c: Include test-skeleton.c.
	(TEST_TRUNC): Define.
	(truncdfsf_test, trunctfsf_test, trunctfdf_test): New.
	(main): Rename to ...
	(do_test): ...this.  Run new tests.
	(TEST_FUNCTION): Define.

	[BZ #2749]
	* soft-fp/op-4.h (__FP_FRAC_SUB_3, __FP_FRAC_SUB_4): Correct borrow
	handling for high words.
	* soft-fp/op-common.h (_FP_OVERFLOW_SEMIRAW): Always set inexact
	and overflow for infinity.
2007-01-15  Jakub Jelinek  <jakub@redhat.com>

	* soft-fp/op-common.h (FP_TRUNC): When truncating a NaN, clear
	workbits in semi-raw fraction.

	* math/test-misc.c: Add new tests.

2007-01-14  Steven Munroe  <sjmunroe@us.ibm.com>

	* math/basic-test.c: Include test-skeleton.c.
	(TEST_TRUNC): Define.
	(truncdfsf_test, trunctfsf_test, trunctfdf_test): New.
	(main): Rename to ...
	(do_test): ...this.  Run new tests.
	(TEST_FUNCTION): Define.

2006-10-05  Steven Munroe  <sjmunroe@us.ibm.com>
	    Joe Kerian  <jkerian@us.us.ibm.com>

	[BZ #2749]
	* soft-fp/op-4.h (__FP_FRAC_SUB_3, __FP_FRAC_SUB_4): Correct borrow
	handling for high words.
	* soft-fp/op-common.h (_FP_OVERFLOW_SEMIRAW): Always set inexact
	and overflow for infinity.
Diffstat (limited to 'soft-fp')
-rw-r--r--soft-fp/op-4.h6
-rw-r--r--soft-fp/op-common.h9
2 files changed, 9 insertions, 6 deletions
diff --git a/soft-fp/op-4.h b/soft-fp/op-4.h
index 34f5098e8c..1b90535c56 100644
--- a/soft-fp/op-4.h
+++ b/soft-fp/op-4.h
@@ -564,7 +564,7 @@
     r1 = x1 - y1;						\
     _c2 = r1 > x1;						\
     r1 -= _c1;							\
-    _c2 |= r1 > _c1;						\
+    _c2 |= _c1 && (y1 == x1);					\
     r2 = x2 - y2 - _c2;						\
   } while (0)
 #endif
@@ -578,11 +578,11 @@
     r1 = x1 - y1;						\
     _c2 = r1 > x1;						\
     r1 -= _c1;							\
-    _c2 |= r1 > _c1;						\
+    _c2 |= _c1 && (y1 == x1);					\
     r2 = x2 - y2;						\
     _c3 = r2 > x2;						\
     r2 -= _c2;							\
-    _c3 |= r2 > _c2;						\
+    _c3 |= _c2 && (y2 == x2);					\
     r3 = x3 - y3 - _c3;						\
   } while (0)
 #endif
diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
index 4ec7fade48..0aa6e3e05d 100644
--- a/soft-fp/op-common.h
+++ b/soft-fp/op-common.h
@@ -1,5 +1,5 @@
 /* Software floating-point emulation. Common operations.
-   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -99,10 +99,10 @@ do {							\
   else							\
     {							\
       X##_e = _FP_EXPMAX_##fs - 1;			\
-      FP_SET_EXCEPTION(FP_EX_OVERFLOW);			\
-      FP_SET_EXCEPTION(FP_EX_INEXACT);			\
       _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc);		\
     }							\
+    FP_SET_EXCEPTION(FP_EX_INEXACT);			\
+    FP_SET_EXCEPTION(FP_EX_OVERFLOW);			\
 } while (0)
 
 /* Check for a semi-raw value being a signaling NaN and raise the
@@ -1252,6 +1252,9 @@ do {									     \
 	      _FP_FRAC_SRL_##swc(S, (_FP_WFRACBITS_##sfs		     \
 				     - _FP_WFRACBITS_##dfs));		     \
 	      _FP_FRAC_COPY_##dwc##_##swc(D, S);			     \
+	      /* Semi-raw NaN must have all workbits cleared.  */	     \
+	      _FP_FRAC_LOW_##dwc(D)					     \
+		&= ~(_FP_W_TYPE) ((1 << _FP_WORKBITS) - 1);		     \
 	      _FP_FRAC_HIGH_##dfs(D) |= _FP_QNANBIT_SH_##dfs;		     \
 	    }								     \
 	}								     \