about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2013-10-12 12:23:28 +0000
committerJoseph Myers <joseph@codesourcery.com>2013-10-12 12:23:28 +0000
commitb7ea74f0747456c99421f14f963082b1dcb6c30d (patch)
tree2e9b1f6ee28bba4c53a305e11217c98af3b431d4
parent8a50944770a5c638b6718bd942798b871153757f (diff)
downloadglibc-b7ea74f0747456c99421f14f963082b1dcb6c30d.tar.gz
glibc-b7ea74f0747456c99421f14f963082b1dcb6c30d.tar.xz
glibc-b7ea74f0747456c99421f14f963082b1dcb6c30d.zip
soft-fp: make __unord* raise "invalid" for signaling NaNs (bug 16036).
-rw-r--r--ChangeLog6
-rw-r--r--NEWS2
-rw-r--r--soft-fp/unorddf2.c5
-rw-r--r--soft-fp/unordsf2.c5
-rw-r--r--soft-fp/unordtf2.c5
5 files changed, 22 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 87a12388fa..db2c7eb697 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2013-10-12  Joseph Myers  <joseph@codesourcery.com>
 
+	[BZ #16036]
+	* soft-fp/unorddf2.c (__unorddf2): Raise "invalid" exception for
+	signaling NaN arguments.
+	* soft-fp/unordsf2.c (__unordsf2): Likewise.
+	* soft-fp/unordtf2.c (__unordtf2): Likewise.
+
 	[BZ #14910]
 	* soft-fp/gedf2.c (__gedf2): Raise "invalid" exception for all
 	unordered operands.
diff --git a/NEWS b/NEWS
index f72f0598c3..d617ae74c1 100644
--- a/NEWS
+++ b/NEWS
@@ -14,7 +14,7 @@ Version 2.19
   15681, 15723, 15734, 15735, 15736, 15748, 15749, 15754, 15760, 15797,
   15844, 15849, 15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890,
   15892, 15893, 15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939,
-  15963, 15966, 15988, 16032, 16034.
+  15963, 15966, 15988, 16032, 16034, 16036.
 
 * CVE-2012-4412 The strcoll implementation caches indices and rules for
   large collation sequences to optimize multiple passes.  This cache
diff --git a/soft-fp/unorddf2.c b/soft-fp/unorddf2.c
index 2e77f2d8ff..bc4efa30b0 100644
--- a/soft-fp/unorddf2.c
+++ b/soft-fp/unorddf2.c
@@ -32,12 +32,17 @@
 
 CMPtype __unorddf2(DFtype a, DFtype b)
 {
+  FP_DECL_EX;
   FP_DECL_D(A); FP_DECL_D(B);
   CMPtype r;
 
+  FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_D(A, a);
   FP_UNPACK_RAW_D(B, b);
   FP_CMP_UNORD_D(r, A, B);
+  if (r && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
diff --git a/soft-fp/unordsf2.c b/soft-fp/unordsf2.c
index b5b5322c16..217975f000 100644
--- a/soft-fp/unordsf2.c
+++ b/soft-fp/unordsf2.c
@@ -32,13 +32,18 @@
 
 CMPtype __unordsf2(SFtype a, SFtype b)
 {
+  FP_DECL_EX;
   FP_DECL_S(A);
   FP_DECL_S(B);
   CMPtype r;
 
+  FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_S(A, a);
   FP_UNPACK_RAW_S(B, b);
   FP_CMP_UNORD_S(r, A, B);
+  if (r && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
diff --git a/soft-fp/unordtf2.c b/soft-fp/unordtf2.c
index 1a85c252c1..3650cf461b 100644
--- a/soft-fp/unordtf2.c
+++ b/soft-fp/unordtf2.c
@@ -32,13 +32,18 @@
 
 CMPtype __unordtf2(TFtype a, TFtype b)
 {
+  FP_DECL_EX;
   FP_DECL_Q(A);
   FP_DECL_Q(B);
   CMPtype r;
 
+  FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_Q(A, a);
   FP_UNPACK_RAW_Q(B, b);
   FP_CMP_UNORD_Q(r, A, B);
+  if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
 
   return r;
 }