about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--soft-fp/extenddftf2.c1
-rw-r--r--soft-fp/extendsfdf2.c1
-rw-r--r--soft-fp/extendsftf2.c1
-rw-r--r--soft-fp/extendxftf2.c2
-rw-r--r--soft-fp/op-common.h2
-rw-r--r--soft-fp/soft-fp.h18
7 files changed, 36 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index b5faff4fe7..703934d098 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
 2014-10-09  Joseph Myers  <joseph@codesourcery.com>
 
+	* soft-fp/op-common.h (FP_EXTEND): When a subnormal input produces
+	a subnormal result, set the underflow exception if trapping on
+	underflow is enabled.
+	* soft-fp/soft-fp.h (FP_INIT_TRAPPING_EXCEPTIONS): New macro.
+	(FP_INIT_EXCEPTIONS): Default to FP_INIT_TRAPPING_EXCEPTIONS.
+	[FP_NO_EXACT_UNDERFLOW] (FP_TRAPPING_EXCEPTIONS): Undefine and
+	redefine to 0.
+	* soft-fp/extenddftf2.c (FP_NO_EXACT_UNDERFLOW): Define.
+	* soft-fp/extendsfdf2.c (FP_NO_EXACT_UNDERFLOW): Likewise.
+	* soft-fp/extendsftf2.c (FP_NO_EXACT_UNDERFLOW): Likewise.
+	* soft-fp/extendxftf2.c (__extendxftf2): Use
+	FP_INIT_TRAPPING_EXCEPTIONS instead of FP_INIT_ROUNDMODE.
+
 	* soft-fp/soft-fp.h (FP_CLEAR_EXCEPTIONS): Remove macro.
 	* sysdeps/sparc/sparc32/soft-fp/q_itoq.c: Define FP_NO_EXCEPTIONS.
 	(_Q_itoq): Do not use FP_DECL_EX, FP_CLEAR_EXCEPTIONS or
diff --git a/soft-fp/extenddftf2.c b/soft-fp/extenddftf2.c
index 6984b41a80..17655326d8 100644
--- a/soft-fp/extenddftf2.c
+++ b/soft-fp/extenddftf2.c
@@ -28,6 +28,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXACT_UNDERFLOW
 #include "soft-fp.h"
 #include "double.h"
 #include "quad.h"
diff --git a/soft-fp/extendsfdf2.c b/soft-fp/extendsfdf2.c
index a9b6bfbee7..6224195ce9 100644
--- a/soft-fp/extendsfdf2.c
+++ b/soft-fp/extendsfdf2.c
@@ -28,6 +28,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXACT_UNDERFLOW
 #include "soft-fp.h"
 #include "single.h"
 #include "double.h"
diff --git a/soft-fp/extendsftf2.c b/soft-fp/extendsftf2.c
index 07fc3679ac..f67d614d7c 100644
--- a/soft-fp/extendsftf2.c
+++ b/soft-fp/extendsftf2.c
@@ -28,6 +28,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXACT_UNDERFLOW
 #include "soft-fp.h"
 #include "single.h"
 #include "quad.h"
diff --git a/soft-fp/extendxftf2.c b/soft-fp/extendxftf2.c
index 67b909563f..a1386a68e6 100644
--- a/soft-fp/extendxftf2.c
+++ b/soft-fp/extendxftf2.c
@@ -39,7 +39,7 @@ __extendxftf2 (XFtype a)
   FP_DECL_Q (R);
   TFtype r;
 
-  FP_INIT_ROUNDMODE;
+  FP_INIT_TRAPPING_EXCEPTIONS;
   FP_UNPACK_RAW_E (A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
   FP_EXTEND (Q, E, 4, 4, R, A);
diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
index ec0bc426e3..e3212ecfd5 100644
--- a/soft-fp/op-common.h
+++ b/soft-fp/op-common.h
@@ -1522,6 +1522,8 @@
 		  _FP_FRAC_SLL_##dwc (D, (_FP_FRACBITS_##dfs		\
 					  - _FP_FRACBITS_##sfs));	\
 		  D##_e = 0;						\
+		  if (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW)		\
+		    FP_SET_EXCEPTION (FP_EX_UNDERFLOW);			\
 		}							\
 	      else							\
 		{							\
diff --git a/soft-fp/soft-fp.h b/soft-fp/soft-fp.h
index ead9c97874..4018b0ee91 100644
--- a/soft-fp/soft-fp.h
+++ b/soft-fp/soft-fp.h
@@ -108,9 +108,15 @@
 #endif
 
 /* Initialize any machine-specific state used in
+   FP_TRAPPING_EXCEPTIONS or FP_HANDLE_EXCEPTIONS.  */
+#ifndef FP_INIT_TRAPPING_EXCEPTIONS
+# define FP_INIT_TRAPPING_EXCEPTIONS FP_INIT_ROUNDMODE
+#endif
+
+/* Initialize any machine-specific state used in
    FP_HANDLE_EXCEPTIONS.  */
 #ifndef FP_INIT_EXCEPTIONS
-# define FP_INIT_EXCEPTIONS FP_INIT_ROUNDMODE
+# define FP_INIT_EXCEPTIONS FP_INIT_TRAPPING_EXCEPTIONS
 #endif
 
 #ifndef FP_HANDLE_EXCEPTIONS
@@ -162,6 +168,16 @@
 
 #endif
 
+/* A file using soft-fp may define FP_NO_EXACT_UNDERFLOW before
+   including soft-fp.h to indicate that, although a macro used there
+   could allow for the case of exact underflow requiring the underflow
+   exception to be raised if traps are enabled, for the particular
+   arguments used in that file no exact underflow can occur.  */
+#ifdef FP_NO_EXACT_UNDERFLOW
+# undef FP_TRAPPING_EXCEPTIONS
+# define FP_TRAPPING_EXCEPTIONS 0
+#endif
+
 #define _FP_ROUND_NEAREST(wc, X)				\
   do								\
     {								\