This is the mail archive of the libc-alpha@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]

soft-fp: make __unord* raise "invalid" for signaling NaNs


As noted in bug 16036, soft-fp __unord* should raise the "invalid"
exception for signaling NaN operands.  This patch implements this.
Tested for powerpc-nofpu.

2013-10-11  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.

diff --git a/soft-fp/unorddf2.c b/soft-fp/unorddf2.c
index 2e77f2d..bc4efa3 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 b5b5322..217975f 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 1a85c25..3650cf4 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;
 }

-- 
Joseph S. Myers
joseph@codesourcery.com


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