From f65a43a48c68a59a690bd0fb03613069521c143c Mon Sep 17 00:00:00 2001
From: Francois-Xavier Coudert <fxcoudert@gmail.com>
Date: Sat, 1 Jan 2022 01:57:21 +0100
Subject: [PATCH] Libquadmath: Add nansq() function

We currently do not have a function in libquadmath to generate a
signaling NaN. The function nansq() is similar to the nanq() function,
except it returns a signaling NaN instead of a quiet NaN.

libquadmath/ChangeLog:

	* math/nansq.c: New file
	* Makefile.am: Add math/nansq.c.
	* Makefile.in: Regenerate.
	* libquadmath.texi: Add nansq() function.
	* quadmath.h: Add prototype for nansq().
	* quadmath_weak.h: Add prototype for nansq().
	* quadmath.map: Add nansq.
---
 libquadmath/Makefile.am      |  2 +-
 libquadmath/Makefile.in      | 16 +++++++++-------
 libquadmath/libquadmath.texi |  1 +
 libquadmath/math/nansq.c     | 11 +++++++++++
 libquadmath/quadmath.h       |  1 +
 libquadmath/quadmath.map     |  5 +++++
 libquadmath/quadmath_weak.h  |  1 +
 7 files changed, 29 insertions(+), 8 deletions(-)
 create mode 100644 libquadmath/math/nansq.c

diff --git a/libquadmath/Makefile.am b/libquadmath/Makefile.am
index c5ec3aa73e2..90302cdb857 100644
--- a/libquadmath/Makefile.am
+++ b/libquadmath/Makefile.am
@@ -60,7 +60,7 @@ libquadmath_la_SOURCES = \
   math/sinq.c math/cosq_kernel.c math/log1pq.c math/sinq_kernel.c \
   math/erfq.c math/logq.c math/sqrtq.c math/expm1q.c math/lroundq.c \
   math/tanhq.c math/expq.c math/modfq.c math/tanq.c math/fabsq.c \
-  math/nanq.c math/tgammaq.c math/finiteq.c math/nextafterq.c \
+  math/nanq.c math/nansq.c math/tgammaq.c math/finiteq.c math/nextafterq.c \
   math/truncq.c math/floorq.c math/powq.c math/fmaq.c math/logbq.c \
   math/exp2q.c math/issignalingq.c math/lgammaq_neg.c math/lgammaq_product.c \
   math/tanq_kernel.c math/tgammaq_product.c math/casinhq_kernel.c \
diff --git a/libquadmath/Makefile.in b/libquadmath/Makefile.in
index a01649e598a..dc8c060431b 100644
--- a/libquadmath/Makefile.in
+++ b/libquadmath/Makefile.in
@@ -173,12 +173,12 @@ am__dirstamp = $(am__leading_dot)dirstamp
 @BUILD_LIBQUADMATH_TRUE@	math/lroundq.lo math/tanhq.lo \
 @BUILD_LIBQUADMATH_TRUE@	math/expq.lo math/modfq.lo \
 @BUILD_LIBQUADMATH_TRUE@	math/tanq.lo math/fabsq.lo \
-@BUILD_LIBQUADMATH_TRUE@	math/nanq.lo math/tgammaq.lo \
-@BUILD_LIBQUADMATH_TRUE@	math/finiteq.lo math/nextafterq.lo \
-@BUILD_LIBQUADMATH_TRUE@	math/truncq.lo math/floorq.lo \
-@BUILD_LIBQUADMATH_TRUE@	math/powq.lo math/fmaq.lo \
-@BUILD_LIBQUADMATH_TRUE@	math/logbq.lo math/exp2q.lo \
-@BUILD_LIBQUADMATH_TRUE@	math/issignalingq.lo \
+@BUILD_LIBQUADMATH_TRUE@	math/nanq.lo math/nansq.lo \
+@BUILD_LIBQUADMATH_TRUE@	math/tgammaq.lo math/finiteq.lo \
+@BUILD_LIBQUADMATH_TRUE@	math/nextafterq.lo math/truncq.lo \
+@BUILD_LIBQUADMATH_TRUE@	math/floorq.lo math/powq.lo \
+@BUILD_LIBQUADMATH_TRUE@	math/fmaq.lo math/logbq.lo \
+@BUILD_LIBQUADMATH_TRUE@	math/exp2q.lo math/issignalingq.lo \
 @BUILD_LIBQUADMATH_TRUE@	math/lgammaq_neg.lo \
 @BUILD_LIBQUADMATH_TRUE@	math/lgammaq_product.lo \
 @BUILD_LIBQUADMATH_TRUE@	math/tanq_kernel.lo \
@@ -484,7 +484,7 @@ AUTOMAKE_OPTIONS = foreign info-in-builddir
 @BUILD_LIBQUADMATH_TRUE@  math/sinq.c math/cosq_kernel.c math/log1pq.c math/sinq_kernel.c \
 @BUILD_LIBQUADMATH_TRUE@  math/erfq.c math/logq.c math/sqrtq.c math/expm1q.c math/lroundq.c \
 @BUILD_LIBQUADMATH_TRUE@  math/tanhq.c math/expq.c math/modfq.c math/tanq.c math/fabsq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/nanq.c math/tgammaq.c math/finiteq.c math/nextafterq.c \
+@BUILD_LIBQUADMATH_TRUE@  math/nanq.c math/nansq.c math/tgammaq.c math/finiteq.c math/nextafterq.c \
 @BUILD_LIBQUADMATH_TRUE@  math/truncq.c math/floorq.c math/powq.c math/fmaq.c math/logbq.c \
 @BUILD_LIBQUADMATH_TRUE@  math/exp2q.c math/issignalingq.c math/lgammaq_neg.c math/lgammaq_product.c \
 @BUILD_LIBQUADMATH_TRUE@  math/tanq_kernel.c math/tgammaq_product.c math/casinhq_kernel.c \
@@ -727,6 +727,7 @@ math/modfq.lo: math/$(am__dirstamp) math/$(DEPDIR)/$(am__dirstamp)
 math/tanq.lo: math/$(am__dirstamp) math/$(DEPDIR)/$(am__dirstamp)
 math/fabsq.lo: math/$(am__dirstamp) math/$(DEPDIR)/$(am__dirstamp)
 math/nanq.lo: math/$(am__dirstamp) math/$(DEPDIR)/$(am__dirstamp)
+math/nansq.lo: math/$(am__dirstamp) math/$(DEPDIR)/$(am__dirstamp)
 math/tgammaq.lo: math/$(am__dirstamp) math/$(DEPDIR)/$(am__dirstamp)
 math/finiteq.lo: math/$(am__dirstamp) math/$(DEPDIR)/$(am__dirstamp)
 math/nextafterq.lo: math/$(am__dirstamp) \
@@ -912,6 +913,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/lroundq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/modfq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/nanq.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/nansq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/nearbyintq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/nextafterq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/powq.Plo@am__quote@
diff --git a/libquadmath/libquadmath.texi b/libquadmath/libquadmath.texi
index 261655950e4..97220131c8d 100644
--- a/libquadmath/libquadmath.texi
+++ b/libquadmath/libquadmath.texi
@@ -192,6 +192,7 @@ The following mathematical functions are available:
 @item @code{lroundq}: round to nearest integer value away from zero
 @item @code{modfq}: decompose the floating-point number
 @item @code{nanq}: return quiet NaN
+@item @code{nansq}: return signaling NaN
 @item @code{nearbyintq}: round to nearest integer
 @item @code{nextafterq}: next representable floating-point number
 @item @code{powq}: power function
diff --git a/libquadmath/math/nansq.c b/libquadmath/math/nansq.c
new file mode 100644
index 00000000000..db47e7c16d6
--- /dev/null
+++ b/libquadmath/math/nansq.c
@@ -0,0 +1,11 @@
+#include "quadmath-imp.h"
+
+__float128
+nansq (const char *tagp __attribute__ ((unused)))
+{
+  // FIXME -- we should use the argument
+  ieee854_float128 f = { 0 };
+  f.ieee_nan.exponent = 0x7fff;
+  f.ieee_nan.quiet_nan = 0x0;
+  return f.value;
+}
diff --git a/libquadmath/quadmath.h b/libquadmath/quadmath.h
index 81eb957d2fa..bd408515856 100644
--- a/libquadmath/quadmath.h
+++ b/libquadmath/quadmath.h
@@ -91,6 +91,7 @@ extern long int lrintq (__float128) __quadmath_throw;
 extern long int lroundq (__float128) __quadmath_throw;
 extern __float128 modfq (__float128, __float128 *) __quadmath_throw;
 extern __float128 nanq (const char *) __quadmath_throw;
+extern __float128 nansq (const char *) __quadmath_throw;
 extern __float128 nearbyintq (__float128) __quadmath_throw;
 extern __float128 nextafterq (__float128, __float128) __quadmath_throw;
 extern __float128 powq (__float128, __float128) __quadmath_throw;
diff --git a/libquadmath/quadmath.map b/libquadmath/quadmath.map
index dbdda7029de..6959ca11fa5 100644
--- a/libquadmath/quadmath.map
+++ b/libquadmath/quadmath.map
@@ -107,3 +107,8 @@ QUADMATH_1.2 {
     exp2q;
     issignalingq;
 } QUADMATH_1.1;
+
+QUADMATH_1.3 {
+  global:
+    nansq;
+} QUADMATH_1.2;
diff --git a/libquadmath/quadmath_weak.h b/libquadmath/quadmath_weak.h
index a97c813a013..b2c92e0a324 100644
--- a/libquadmath/quadmath_weak.h
+++ b/libquadmath/quadmath_weak.h
@@ -84,6 +84,7 @@ __qmath3 (lrintq)
 __qmath3 (lroundq)
 __qmath3 (modfq)
 __qmath3 (nanq)
+__qmath3 (nansq)
 __qmath3 (nearbyintq)
 __qmath3 (nextafterq)
 __qmath3 (powq)
-- 
2.32.0 (Apple Git-132)

