diff mbox series

[v2,2/3] powerpc: Add optimized llogb* for POWER9

Message ID 20210301175140.29109-2-rzinsly@linux.ibm.com
State New
Headers show
Series [v2,1/3] powerpc: Add optimized ilogb* for POWER9 | expand

Commit Message

Raphael M Zinsly March 1, 2021, 5:51 p.m. UTC
Changes since v1:
	- Check if the correct GCC version is used.

--8<---

The POWER9 builtins used to improve the ilogb* functions can be
used in the llogb* functions as well.
---
 .../powerpc64/le/fpu/w_llogb_template.c       | 40 +++++++++++++++++++
 1 file changed, 40 insertions(+)
 create mode 100644 sysdeps/powerpc/powerpc64/le/fpu/w_llogb_template.c
diff mbox series

Patch

diff --git a/sysdeps/powerpc/powerpc64/le/fpu/w_llogb_template.c b/sysdeps/powerpc/powerpc64/le/fpu/w_llogb_template.c
new file mode 100644
index 0000000000..4c1642274f
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/le/fpu/w_llogb_template.c
@@ -0,0 +1,40 @@ 
+/* The builtins used are only available with GCC 8.0 or newer.  */
+#if defined _ARCH_PWR9 && __GNUC_PREREQ (8, 0)
+#include <math.h>
+#include <errno.h>
+#include <limits.h>
+#include <math_private.h>
+#include <fenv.h>
+
+long int
+M_DECL_FUNC (__llogb) (FLOAT x)
+{
+  int r;
+  /* Check for exceptional cases.  */
+  if (! M_SUF(__builtin_test_dc_ilogb) (x, 0x7f))
+    r = M_SUF (__builtin_ilogb) (x);
+  else
+    /* Fallback to the generic ilogb if x is NaN, Inf or subnormal.  */
+    r = M_SUF (__ieee754_ilogb) (x);
+  long int lr = r;
+  if (__glibc_unlikely (r == FP_ILOGB0)
+      || __glibc_unlikely (r == FP_ILOGBNAN)
+      || __glibc_unlikely (r == INT_MAX))
+    {
+#if LONG_MAX != INT_MAX
+      if (r == FP_ILOGB0)
+	lr = FP_LLOGB0;
+      else if (r == FP_ILOGBNAN)
+	lr = FP_LLOGBNAN;
+      else
+	lr = LONG_MAX;
+#endif
+      __set_errno (EDOM);
+      __feraiseexcept (FE_INVALID);
+    }
+  return lr;
+}
+declare_mgen_alias (__llogb, llogb)
+#else
+#include <math/w_llogb_template.c>
+#endif