public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
To: Adhemerval Zanella <adhemerval.zanella@linaro.org>,
	"libc-alpha@sourceware.org" <libc-alpha@sourceware.org>,
	"H . J . Lu" <hjl.tools@gmail.com>
Subject: Re: [PATCH v4 5/5] math: Remove the error handling wrapper from fmod and fmodf
Date: Mon, 3 Apr 2023 13:43:07 +0000	[thread overview]
Message-ID: <PAWPR08MB898249921EC7DE26E77B837583929@PAWPR08MB8982.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <20230320160118.352206-6-adhemerval.zanella@linaro.org>

Hi Adhemerval,

LGTM - one minor nit about the is_inf functions, are they actually needed?
I'm happy for this to go in either way.

Reviewed-by: Wilco Dijkstra  <Wilco.Dijkstra@arm.com>

Cheers,
Wilco


diff --git a/sysdeps/ieee754/dbl-64/e_fmod.c b/sysdeps/ieee754/dbl-64/e_fmod.c
index d20466fd5d..ff506c40b4 100644
--- a/sysdeps/ieee754/dbl-64/e_fmod.c
+++ b/sysdeps/ieee754/dbl-64/e_fmod.c
@@ -16,7 +16,9 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#include <libm-alias-double.h>
 #include <libm-alias-finite.h>
+#include <math-svid-compat.h>
 #include <math.h>
 #include "math_config.h"
 
@@ -44,7 +46,7 @@
      }  */
 
 double
-__ieee754_fmod (double x, double y)
+__fmod (double x, double y)
 {
   uint64_t hx = asuint64 (x);
   uint64_t hy = asuint64 (y);
@@ -56,11 +58,16 @@ __ieee754_fmod (double x, double y)
 
   /* Special cases:
      - If x or y is a Nan, NaN is returned.
-     - If x is an inifinity, a NaN is returned.
+     - If x is an inifinity, a NaN is returned and EDOM is set.
      - If y is zero, Nan is returned.
      - If x is +0/-0, and y is not zero, +0/-0 is returned.  */
-  if (__glibc_unlikely (hy == 0        || hx >= EXPONENT_MASK || hy > EXPONENT_MASK))
-    return (x * y) / (x * y);
+  if (__glibc_unlikely (hy == 0
+                       || hx >= EXPONENT_MASK || hy > EXPONENT_MASK))
+    {
+      if (is_nan (hx) || is_nan (hy))
+       return (x * y) / (x * y);
+      return __math_edom ((x * y) / (x * y));
+    }

OK

   if (__glibc_unlikely (hx <= hy))
     {
@@ -142,4 +149,11 @@ __ieee754_fmod (double x, double y)
 
   return make_double (mx, ey, sx);
 }
+strong_alias (__fmod, __ieee754_fmod)
 libm_alias_finite (__ieee754_fmod, __fmod)
+#if LIBM_SVID_COMPAT
+versioned_symbol (libm, __fmod, fmod, GLIBC_2_38);
+libm_alias_double_other (__fmod, fmod)
+#else
+libm_alias_double (__fmod, fmod)
+#endif
diff --git a/sysdeps/ieee754/dbl-64/math_config.h b/sysdeps/ieee754/dbl-64/math_config.h
index 2049cea3f7..5173b99e4a 100644
--- a/sysdeps/ieee754/dbl-64/math_config.h
+++ b/sysdeps/ieee754/dbl-64/math_config.h
@@ -121,6 +121,12 @@ is_nan (uint64_t x)
   return (x & EXP_MANT_MASK) > EXPONENT_MASK;
 }
 
+static inline bool
+is_inf (uint64_t x)
+{
+  return (x & EXP_MANT_MASK) == EXPONENT_MASK;
+}

Is this used?

 static inline uint64_t
 get_mantissa (uint64_t x)
 {
@@ -170,6 +176,9 @@ attribute_hidden double __math_invalid (double);
 
 /* Error handling using output checking, only for errno setting.  */
 
+/* Check if the result generated a demain error.  */
+attribute_hidden double __math_edom (double x);
+
 /* Check if the result overflowed to infinity.  */
 attribute_hidden double __math_check_oflow (double);
 /* Check if the result underflowed to 0.  */
diff --git a/sysdeps/ieee754/dbl-64/math_err.c b/sysdeps/ieee754/dbl-64/math_err.c
index 5f5f965d3e..377a4caad2 100644
--- a/sysdeps/ieee754/dbl-64/math_err.c
+++ b/sysdeps/ieee754/dbl-64/math_err.c
@@ -33,6 +33,12 @@ with_errno (double y, int e)
 #define with_errno(x, e) (x)
 #endif
 
+attribute_hidden double
+__math_edom (double y)
+{
+  return with_errno (y, EDOM);
+}
+
 /* NOINLINE reduces code size.  */
 NOINLINE static double
 xflow (uint32_t sign, double y)
diff --git a/sysdeps/ieee754/dbl-64/w_fmod.c b/sysdeps/ieee754/dbl-64/w_fmod.c
new file mode 100644
index 0000000000..1cc8931700
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/w_fmod.c
@@ -0,0 +1 @@
+/* Not needed.  */
diff --git a/sysdeps/ieee754/flt-32/e_fmodf.c b/sysdeps/ieee754/flt-32/e_fmodf.c
index 53db32cbe2..c0b5dccc23 100644
--- a/sysdeps/ieee754/flt-32/e_fmodf.c
+++ b/sysdeps/ieee754/flt-32/e_fmodf.c
@@ -17,6 +17,8 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <libm-alias-finite.h>
+#include <libm-alias-float.h>
+#include <math-svid-compat.h>
 #include <math.h>
 #include "math_config.h"
 
@@ -44,7 +46,7 @@
      }  */
 
 float
-__ieee754_fmodf (float x, float y)
+__fmodf (float x, float y)
 {
   uint32_t hx = asuint (x);
   uint32_t hy = asuint (y);
@@ -59,8 +61,13 @@ __ieee754_fmodf (float x, float y)
      - If x is an inifinity, a NaN is returned.
      - If y is zero, Nan is returned.
      - If x is +0/-0, and y is not zero, +0/-0 is returned.  */
-  if (__glibc_unlikely (hy == 0        || hx >= EXPONENT_MASK || hy > EXPONENT_MASK))
-    return (x * y) / (x * y);
+  if (__glibc_unlikely (hy == 0
+                       || hx >= EXPONENT_MASK || hy > EXPONENT_MASK))
+    {
+      if (is_nan (hx) || is_nan (hy))
+       return (x * y) / (x * y);
+      return __math_edomf ((x * y) / (x * y));
+    }

OK

   if (__glibc_unlikely (hx <= hy))
     {
@@ -141,4 +148,11 @@ __ieee754_fmodf (float x, float y)
 
   return make_float (mx, ey, sx);
 }
+strong_alias (__fmodf, __ieee754_fmodf)
+#if LIBM_SVID_COMPAT
+versioned_symbol (libm, __fmodf, fmodf, GLIBC_2_38);
+libm_alias_float_other (__fmod, fmod)
+#else
+libm_alias_float (__fmod, fmod)
+#endif
 libm_alias_finite (__ieee754_fmodf, __fmodf)
diff --git a/sysdeps/ieee754/flt-32/math_config.h b/sysdeps/ieee754/flt-32/math_config.h
index 829430ea28..f97cd39df1 100644
--- a/sysdeps/ieee754/flt-32/math_config.h
+++ b/sysdeps/ieee754/flt-32/math_config.h
@@ -125,6 +125,12 @@ is_nan (uint32_t x)
   return (x & EXP_MANT_MASK) > EXPONENT_MASK;
 }
 
+static inline bool
+is_inf (uint32_t x)
+{
+  return (x & EXP_MANT_MASK) == EXPONENT_MASK;
+}

Used?

  reply	other threads:[~2023-04-03 13:43 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-20 16:01 [PATCH v4 0/5] Improve " Adhemerval Zanella
2023-03-20 16:01 ` [PATCH v4 1/5] benchtests: Add fmod benchmark Adhemerval Zanella
2023-04-03 13:13   ` Wilco Dijkstra
2023-03-20 16:01 ` [PATCH v4 2/5] benchtests: Add fmodf benchmark Adhemerval Zanella
2023-04-03 13:16   ` Wilco Dijkstra
2023-03-20 16:01 ` [PATCH v4 3/5] math: Improve fmod Adhemerval Zanella
2023-04-03 13:29   ` Wilco Dijkstra
2023-03-20 16:01 ` [PATCH v4 4/5] math: Improve fmodf Adhemerval Zanella
2023-04-03 13:33   ` Wilco Dijkstra
2023-03-20 16:01 ` [PATCH v4 5/5] math: Remove the error handling wrapper from fmod and fmodf Adhemerval Zanella
2023-04-03 13:43   ` Wilco Dijkstra [this message]
2023-04-03 18:33     ` Adhemerval Zanella Netto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=PAWPR08MB898249921EC7DE26E77B837583929@PAWPR08MB8982.eurprd08.prod.outlook.com \
    --to=wilco.dijkstra@arm.com \
    --cc=adhemerval.zanella@linaro.org \
    --cc=hjl.tools@gmail.com \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).