From af7a7593fa558ca9a873ab79484142678c08d6f4 Mon Sep 17 00:00:00 2001
From: Joseph Myers <joseph@codesourcery.com>
Date: Mon, 15 Jan 2007 23:56:32 +0000
Subject: [PATCH] op-common.h, op-4.h: Update from glibc CVS.

	* config/soft-fp/op-common.h, config/soft-fp/op-4.h: Update from
	glibc CVS.

From-SVN: r120806
---
 gcc/ChangeLog                  | 5 +++++
 gcc/config/soft-fp/op-4.h      | 6 +++---
 gcc/config/soft-fp/op-common.h | 9 ++++++---
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 30bc446b07c4..74b2285e37d3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-15  Joseph S. Myers  <joseph@codesourcery.com>
+
+	* config/soft-fp/op-common.h, config/soft-fp/op-4.h: Update from
+	glibc CVS.
+
 2007-01-15  Tom Tromey  <tromey@redhat.com>
 
 	* doc/sourcebuild.texi (libgcj Tests): Don't mention jacks.
diff --git a/gcc/config/soft-fp/op-4.h b/gcc/config/soft-fp/op-4.h
index 34f5098e8c21..1b90535c56e5 100644
--- a/gcc/config/soft-fp/op-4.h
+++ b/gcc/config/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/gcc/config/soft-fp/op-common.h b/gcc/config/soft-fp/op-common.h
index 4ec7fade485e..0aa6e3e05d84 100644
--- a/gcc/config/soft-fp/op-common.h
+++ b/gcc/config/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;		     \
 	    }								     \
 	}								     \
-- 
GitLab