This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.20-76-g454ac70


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  454ac701e3639bfcb8919706319a685341536eda (commit)
      from  0022e688d082761a1e15b19121303cafbdad33ec (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=454ac701e3639bfcb8919706319a685341536eda

commit 454ac701e3639bfcb8919706319a685341536eda
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Thu Oct 9 01:09:22 2014 +0000

    soft-fp: Add FP_DENORM_ZERO.
    
    Continuing the addition of soft-fp features used in the Linux kernel,
    this patch adds soft-fp support for FP_DENORM_ZERO (flushing input
    subnormal operands to zero of the same sign).
    
    There are some differences from the kernel version.  In the kernel,
    the "inexact" exception is set when flushing to zero.  This does not
    appear to match the documented semantics for either of the
    architectures (alpha and sh) for which the kernel uses FP_DENORM_ZERO,
    so this patch does not set "inexact" in this case.  More operations
    now use raw or semi-raw unpacking for optimization than did in the
    ten-year-old soft-fp version in the kernel, so checks of
    FP_DENORM_ZERO are inserted in those operations.  They are also
    inserted for comparisons (which already used raw unpacking in the old
    version) as I believe that's the correct thing to do when input
    subnormals are flushed to zero.  They are *not* inserted for _FP_NEG.
    (If any processors do flush input subnormals to zero for negation, or
    otherwise vary from the rules implemented when FP_DENORM_ZERO is set,
    further macros for sfp-machine.h to control this may need to be
    added.)
    
    Although the addition for comparisons will cause FP_EX_DENORM to be
    set in this case, it still won't be set for comparisons involving
    subnormals when not flushed to zero.  It's quite possible that
    accurate emulation of processors that have such an exception for
    subnormal operands will require further changes relating to when
    FP_EX_DENORM is set (in general, the support for things defined by
    IEEE should be considered more reliable and mature than the support
    for things outside the scope of IEEE floating point).
    
    Although some processors also have a mode for abrupt underflow -
    producing zeroes instead of output subnormals - there is no such mode
    in the kernel's soft-fp, so no such mode is added to glibc's soft-fp
    (although it could be if someone wanted to emulate such processor
    support).
    
    Tested for powerpc-nofpu that the disassembly of installed shared
    libraries is unchanged by this patch.
    
    	* soft-fp/soft-fp.h (FP_DENORM_ZERO): New macro.
    	* soft-fp/op-common.h (_FP_UNPACK_CANONICAL): Check
    	FP_DENORM_ZERO.
    	(_FP_CHECK_FLUSH_ZERO): New macro.
    	(_FP_ADD_INTERNAL): Call _FP_CHECK_FLUSH_ZERO.
    	(_FP_CMP): Likewise.
    	(_FP_CMP_EQ): Likewise.
    	(_FP_TO_INT): Do not set inexact for subnormal arguments if
    	FP_DENORM_ZERO.
    	(FP_EXTEND): Call _FP_CHECK_FLUSH_ZERO.
    	(FP_TRUNC): Likewise.

diff --git a/ChangeLog b/ChangeLog
index 18d1cbc..29a4113 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2014-10-09  Joseph Myers  <joseph@codesourcery.com>
 
+	* soft-fp/soft-fp.h (FP_DENORM_ZERO): New macro.
+	* soft-fp/op-common.h (_FP_UNPACK_CANONICAL): Check
+	FP_DENORM_ZERO.
+	(_FP_CHECK_FLUSH_ZERO): New macro.
+	(_FP_ADD_INTERNAL): Call _FP_CHECK_FLUSH_ZERO.
+	(_FP_CMP): Likewise.
+	(_FP_CMP_EQ): Likewise.
+	(_FP_TO_INT): Do not set inexact for subnormal arguments if
+	FP_DENORM_ZERO.
+	(FP_EXTEND): Call _FP_CHECK_FLUSH_ZERO.
+	(FP_TRUNC): Likewise.
+
 	* soft-fp/op-common.h (_FP_TO_INT): Ensure maximum exponent is
 	treated as invalid conversion, not as normal exponent.
 
diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
index e0a108a..3da234b 100644
--- a/soft-fp/op-common.h
+++ b/soft-fp/op-common.h
@@ -63,6 +63,12 @@
 	case 0:							\
 	  if (_FP_FRAC_ZEROP_##wc (X))				\
 	    X##_c = FP_CLS_ZERO;				\
+	  else if (FP_DENORM_ZERO)				\
+	    {							\
+	      X##_c = FP_CLS_ZERO;				\
+	      _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);		\
+	      FP_SET_EXCEPTION (FP_EX_DENORM);			\
+	    }							\
 	  else							\
 	    {							\
 	      /* A denormalized number.  */			\
@@ -99,6 +105,21 @@
    other classification is not done.  */
 #define _FP_UNPACK_SEMIRAW(fs, wc, X)	_FP_FRAC_SLL_##wc (X, _FP_WORKBITS)
 
+/* Check whether a raw or semi-raw input value should be flushed to
+   zero, and flush it to zero if so.  */
+#define _FP_CHECK_FLUSH_ZERO(fs, wc, X)			\
+  do							\
+    {							\
+      if (FP_DENORM_ZERO				\
+	  && X##_e == 0					\
+	  && !_FP_FRAC_ZEROP_##wc (X))			\
+	{						\
+	  _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);	\
+	  FP_SET_EXCEPTION (FP_EX_DENORM);		\
+	}						\
+    }							\
+  while (0)
+
 /* A semi-raw value has overflowed to infinity.  Adjust the mantissa
    and exponent appropriately.  */
 #define _FP_OVERFLOW_SEMIRAW(fs, wc, X)			\
@@ -387,6 +408,8 @@
 #define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP)				\
   do									\
     {									\
+      _FP_CHECK_FLUSH_ZERO (fs, wc, X);					\
+      _FP_CHECK_FLUSH_ZERO (fs, wc, Y);					\
       if (X##_s == Y##_s)						\
 	{								\
 	  /* Addition.  */						\
@@ -1222,6 +1245,9 @@
 	  int _FP_CMP_is_zero_x;					\
 	  int _FP_CMP_is_zero_y;					\
 									\
+	  _FP_CHECK_FLUSH_ZERO (fs, wc, X);				\
+	  _FP_CHECK_FLUSH_ZERO (fs, wc, Y);				\
+									\
 	  _FP_CMP_is_zero_x						\
 	    = (!X##_e && _FP_FRAC_ZEROP_##wc (X)) ? 1 : 0;		\
 	  _FP_CMP_is_zero_y						\
@@ -1264,6 +1290,9 @@
 	}								\
       else								\
 	{								\
+	  _FP_CHECK_FLUSH_ZERO (fs, wc, X);				\
+	  _FP_CHECK_FLUSH_ZERO (fs, wc, Y);				\
+									\
 	  ret = !(X##_e == Y##_e					\
 		  && _FP_FRAC_EQ_##wc (X, Y)				\
 		  && (X##_s == Y##_s || (!X##_e && _FP_FRAC_ZEROP_##wc (X)))); \
@@ -1361,7 +1390,8 @@
 	    {								\
 	      if (!_FP_FRAC_ZEROP_##wc (X))				\
 		{							\
-		  FP_SET_EXCEPTION (FP_EX_INEXACT);			\
+		  if (!FP_DENORM_ZERO)					\
+		    FP_SET_EXCEPTION (FP_EX_INEXACT);			\
 		  FP_SET_EXCEPTION (FP_EX_DENORM);			\
 		}							\
 	    }								\
@@ -1540,6 +1570,7 @@
 	{								\
 	  if (S##_e == 0)						\
 	    {								\
+	      _FP_CHECK_FLUSH_ZERO (sfs, swc, S);			\
 	      if (_FP_FRAC_ZEROP_##swc (S))				\
 		D##_e = 0;						\
 	      else if (_FP_EXPBIAS_##dfs				\
@@ -1625,6 +1656,7 @@
 	{								\
 	  if (S##_e == 0)						\
 	    {								\
+	      _FP_CHECK_FLUSH_ZERO (sfs, swc, S);			\
 	      D##_e = 0;						\
 	      if (_FP_FRAC_ZEROP_##swc (S))				\
 		_FP_FRAC_SET_##dwc (D, _FP_ZEROFRAC_##dwc);		\
diff --git a/soft-fp/soft-fp.h b/soft-fp/soft-fp.h
index 4018b0e..3ac269e 100644
--- a/soft-fp/soft-fp.h
+++ b/soft-fp/soft-fp.h
@@ -123,6 +123,11 @@
 # define FP_HANDLE_EXCEPTIONS do {} while (0)
 #endif
 
+/* Whether to flush subnormal inputs to zero with the same sign.  */
+#ifndef FP_DENORM_ZERO
+# define FP_DENORM_ZERO 0
+#endif
+
 #ifndef FP_INHIBIT_RESULTS
 /* By default we write the results always.
    sfp-machine may override this and e.g.

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog           |   12 ++++++++++++
 soft-fp/op-common.h |   34 +++++++++++++++++++++++++++++++++-
 soft-fp/soft-fp.h   |    5 +++++
 3 files changed, 50 insertions(+), 1 deletions(-)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]