65 lines
1.9 KiB
Diff
65 lines
1.9 KiB
Diff
commit a7d88506c260e7a0e4268803e76fc19e38ed041f
|
|
Author: Raphael Moreira Zinsly <rzinsly@linux.ibm.com>
|
|
Date: Thu Feb 25 09:58:52 2021 -0300
|
|
|
|
powerpc: Add optimized llogb* for POWER9
|
|
|
|
The POWER9 builtins used to improve the ilogb* functions can be
|
|
used in the llogb* functions as well.
|
|
|
|
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 0000000000000000..d00b71d2a34e28da
|
|
--- /dev/null
|
|
+++ b/sysdeps/powerpc/powerpc64/le/fpu/w_llogb_template.c
|
|
@@ -0,0 +1,39 @@
|
|
+#include <math.h>
|
|
+#include <errno.h>
|
|
+#include <limits.h>
|
|
+#include <math_private.h>
|
|
+#include <fenv.h>
|
|
+
|
|
+#if _GL_HAS_BUILTIN_ILOGB
|
|
+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
|
|
diff --git a/sysdeps/powerpc/powerpc64/le/fpu/w_llogbl.c b/sysdeps/powerpc/powerpc64/le/fpu/w_llogbl.c
|
|
new file mode 100644
|
|
index 0000000000000000..69477a37ae82c476
|
|
--- /dev/null
|
|
+++ b/sysdeps/powerpc/powerpc64/le/fpu/w_llogbl.c
|
|
@@ -0,0 +1,4 @@
|
|
+/* Skip the optimization for long double as ibm128 does not provide an
|
|
+ optimized builtin. */
|
|
+#include <math-type-macros-ldouble.h>
|
|
+#include <math/w_llogb_template.c>
|