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-81-ga736ec3


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  a736ec370a05e4b37e6101eb3168bf8dc4c5af13 (commit)
      from  ff12c11f4515a9f83467471e8d4381eb3dbc06b5 (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=a736ec370a05e4b37e6101eb3168bf8dc4c5af13

commit a736ec370a05e4b37e6101eb3168bf8dc4c5af13
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Thu Oct 9 15:00:37 2014 +0000

    soft-fp: Support rsigned == 2 in _FP_TO_INT.
    
    Continuing the addition of soft-fp features in the Linux kernel
    version, this patch adds _FP_TO_INT support for rsigned == 2 (reduce
    overflowing results modulo 2^rsize to fit in the destination, used for
    alpha emulation).
    
    The kernel version is buggy; it can left shift by a negative amount
    when right shifting is required in an overflow case (the kernel
    version also has other bugs fixed long ago in glibc; at least,
    spurious exceptions converting to the most negative integer).  This
    version avoids that by handling overflow (other than to 0) for rsigned
    == 2 along with the normal non-overflow case, which already properly
    determines the direction in which to shift.
    
    Tested for powerpc-nofpu.  Some functions get slightly bigger and some
    get slightly smaller, no doubt as a result of the change to where in
    the macro "inexact" is raised, but I don't think those changes are
    significant.  Also tested for powerpc-nofpu with the relevant __fix*
    functions changed to use rsigned == 2 (which is after all just as
    valid as rsigned == 1 in IEEE terms), including verifying the results
    and exceptions for various cases of conversions.
    
    With these seven patches, the one remaining feature to add for the
    soft-fp code to have all the features of the kernel version is
    _FP_TO_INT_ROUND.
    
    	* soft-fp/op-common.h (_FP_TO_INT): Handle rsigned == 2.

diff --git a/ChangeLog b/ChangeLog
index fa354c2..f8f2221 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2014-10-09  Joseph Myers  <joseph@codesourcery.com>
 
+	* soft-fp/op-common.h (_FP_TO_INT): Handle rsigned == 2.
+
 	* soft-fp/soft-fp.h (FP_EX_INVALID_SNAN): New macro.
 	(FP_EX_INVALID_IMZ): Likewise.
 	(FP_EX_INVALID_IMZ_FMA): Likewise.
diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
index 8344be5..3591c47 100644
--- a/soft-fp/op-common.h
+++ b/soft-fp/op-common.h
@@ -1399,6 +1399,8 @@
    1:  the number is required to be -(2^(rsize-1))..(2^(rsize-1))-1, if not,
        NV is set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
        depending on the sign in such case.
+   2:  the number is required to be -(2^(rsize-1))..(2^(rsize-1))-1, if not,
+       NV is set plus the result is reduced modulo 2^rsize.
    -1: the number is required to be -(2^(rsize-1))..(2^rsize)-1, if not, NV is
        set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
        depending on the sign in such case.  */
@@ -1420,10 +1422,28 @@
 	  else								\
 	    FP_SET_EXCEPTION (FP_EX_INEXACT);				\
 	}								\
-      else if (X##_e >= (_FP_EXPMAX_##fs < _FP_EXPBIAS_##fs + rsize	\
-			 ? _FP_EXPMAX_##fs				\
-			 : _FP_EXPBIAS_##fs + rsize - (rsigned > 0 || X##_s)) \
-	       || (!rsigned && X##_s))					\
+      else if (rsigned == 2						\
+	       && (X##_e						\
+		   >= ((_FP_EXPMAX_##fs					\
+			< _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs + rsize - 1) \
+		       ? _FP_EXPMAX_##fs				\
+		       : _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs + rsize - 1))) \
+	{								\
+	  /* Overflow resulting in 0.  */				\
+	  r = 0;							\
+	  FP_SET_EXCEPTION (FP_EX_INVALID				\
+			    | FP_EX_INVALID_CVI				\
+			    | ((FP_EX_INVALID_SNAN			\
+				&& _FP_ISSIGNAN (fs, wc, X))		\
+			       ? FP_EX_INVALID_SNAN			\
+			       : 0));					\
+	}								\
+      else if (rsigned != 2						\
+	       && (X##_e >= (_FP_EXPMAX_##fs < _FP_EXPBIAS_##fs + rsize	\
+			     ? _FP_EXPMAX_##fs				\
+			     : (_FP_EXPBIAS_##fs + rsize		\
+				- (rsigned > 0 || X##_s)))		\
+		   || (!rsigned && X##_s)))				\
 	{								\
 	  /* Overflow or converting to the most negative integer.  */	\
 	  if (rsigned)							\
@@ -1470,6 +1490,7 @@
 	}								\
       else								\
 	{								\
+	  int _FP_TO_INT_inexact = 0;					\
 	  _FP_FRAC_HIGH_RAW_##fs (X) |= _FP_IMPLBIT_##fs;		\
 	  if (X##_e >= _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1)	\
 	    {								\
@@ -1478,17 +1499,27 @@
 	    }								\
 	  else								\
 	    {								\
-	      int _FP_TO_INT_inexact;					\
 	      _FP_FRAC_SRST_##wc (X, _FP_TO_INT_inexact,		\
 				  (_FP_FRACBITS_##fs + _FP_EXPBIAS_##fs - 1 \
 				   - X##_e),				\
 				  _FP_FRACBITS_##fs);			\
-	      if (_FP_TO_INT_inexact)					\
-		FP_SET_EXCEPTION (FP_EX_INEXACT);			\
 	      _FP_FRAC_ASSEMBLE_##wc (r, X, rsize);			\
 	    }								\
 	  if (rsigned && X##_s)						\
 	    r = -r;							\
+	  if (rsigned == 2 && X##_e >= _FP_EXPBIAS_##fs + rsize - 1)	\
+	    {								\
+	      /* Overflow or converting to the most negative integer.  */ \
+	      if (X##_e > _FP_EXPBIAS_##fs + rsize - 1			\
+		  || !X##_s						\
+		  || r != (((typeof (r)) 1) << (rsize - 1)))		\
+		{							\
+		  _FP_TO_INT_inexact = 0;				\
+		  FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_CVI);	\
+		}							\
+	    }								\
+	  if (_FP_TO_INT_inexact)					\
+	    FP_SET_EXCEPTION (FP_EX_INEXACT);				\
 	}								\
     }									\
   while (0)

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

Summary of changes:
 ChangeLog           |    2 ++
 soft-fp/op-common.h |   45 ++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 40 insertions(+), 7 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]