]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
powerpc: Refactor modf{f}
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 18 Mar 2019 20:18:49 +0000 (20:18 +0000)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 8 Jul 2019 20:22:22 +0000 (17:22 -0300)
The modf{f} optimization is not an optimization for ISA 2.07+.  This
patch move the IFUNC for powerpc64 only, move the power5+ to generic
location, and include the generic implementation for ISA 2.07+.

The performance changes are based on modf benchtests:

  * POWER9 - ppc64
  "modf": {
   "": {
    "duration": 4.97057e+09,
    "iterations": 1.00688e+09,
    "max": 28.76,
    "min": 4.912,
    "mean": 4.9366
   }
  }
  * POWER9 - power5+
  "modf": {
   "": {
    "duration": 4.98291e+09,
    "iterations": 9.32818e+08,
    "max": 15.058,
    "min": 5.107,
    "mean": 5.34178
   }
  }

  * POWER8 - ppc64
   "modf": {
   "": {
    "duration": 5.05329e+09,
    "iterations": 8.38814e+08,
    "max": 518.051,
    "min": 5.79,
    "mean": 6.02433
   }
  }
  * POWER8 - power5+
  "modf": {
   "": {
    "duration": 5.05573e+09,
    "iterations": 8.35254e+08,
    "max": 63.141,
    "min": 5.873,
    "mean": 6.05293
   }
  }

  * POWER7 - ppc64
  "modf": {
   "": {
    "duration": 4.89818e+09,
    "iterations": 1.08408e+09,
    "max": 57.556,
    "min": 3.953,
    "mean": 4.51827
   }
  }
  * POWER7 - power5+
  "modf": {
   "": {
    "duration": 4.83789e+09,
    "iterations": 1.33409e+09,
    "max": 46.608,
    "min": 2.224,
    "mean": 3.62636
   }
  }

Checked on powerpc-linux-gnu (built without --with-cpu, with
--with-cpu=power4 and with --with-cpu=power5+ and --disable-multi-arch),
powerpc64-linux-gnu (built without --with-cp and with --with-cpu=power5+
and --disable-multi-arch).

* sysdeps/powerpc/power5+/fpu/s_modf.c: Move to ...
* sysdeps/powerpc/fpu/s_modf.c: ... here.  Add ISA 2.07 optimization.
* sysdeps/powerpc/power5+/fpu/s_modff.c: Move to ...
* sysdeps/powerpc/fpu/s_modff.c: ... here.  Add ISA 2.07 optimization.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_modf-power5+.c:
Adjust include.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_modff-power5+.c:
Likewise.
* sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile (sysdep_calls,
sysdep_routines): Add s_modf* objects.
(CFLAGS-s_modf-power5+.c, CFLAGS-s_modff-power5+.c,
CFLAGS-s_modf-ppc64.c, CFLAGS-s_modff-ppc64.c): New rule.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-power5+.c: Move
to ...
* sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modf-power5+.c:
... here.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-power5+.c: Movo
to ...
* sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modf-power5+.c: Move
... here.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c: Move to ...
* sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modf.c: ... here.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-power5+.c: Move
to ...
* sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modff-power5+.c:
... here.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-ppc64.c: Move to ...
* sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modff-ppc64.c:
... here.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff.c: Move to ...
* sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modff.c: ... here.

Reviewed-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
13 files changed:
ChangeLog
sysdeps/powerpc/fpu/s_modf.c [moved from sysdeps/powerpc/power5+/fpu/s_modf.c with 74% similarity]
sysdeps/powerpc/fpu/s_modff.c [moved from sysdeps/powerpc/power5+/fpu/s_modff.c with 77% similarity]
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_modf-power5+.c
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_modff-power5+.c
sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile
sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modf-power5+.c [moved from sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-power5+.c with 91% similarity]
sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modf-ppc64.c [moved from sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-ppc64.c with 100% similarity]
sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modf.c [moved from sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c with 100% similarity]
sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modff-power5+.c [moved from sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-power5+.c with 91% similarity]
sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modff-ppc64.c [moved from sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-ppc64.c with 100% similarity]
sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modff.c [moved from sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff.c with 100% similarity]
sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile

index 0b2d80ffcc4c121229bd942c0450d60c88023592..a9aefa6e2f78e67f9c3fc753f462f95e1b14e857 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,37 @@
 2019-07-08  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
+       * sysdeps/powerpc/power5+/fpu/s_modf.c: Move to ...
+       * sysdeps/powerpc/fpu/s_modf.c: ... here.  Add ISA 2.07 optimization.
+       * sysdeps/powerpc/power5+/fpu/s_modff.c: Move to ...
+       * sysdeps/powerpc/fpu/s_modff.c: ... here.  Add ISA 2.07 optimization.
+       * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_modf-power5+.c:
+       Adjust include.
+       * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_modff-power5+.c:
+       Likewise.
+       * sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile (sysdep_calls,
+       sysdep_routines): Add s_modf* objects.
+       (CFLAGS-s_modf-power5+.c, CFLAGS-s_modff-power5+.c,
+       CFLAGS-s_modf-ppc64.c, CFLAGS-s_modff-ppc64.c): New rule.
+       * sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-power5+.c: Move
+       to ...
+       * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modf-power5+.c:
+       ... here.
+       * sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-power5+.c: Movo
+       to ...
+       * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modf-power5+.c: Move
+       ... here.
+       * sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c: Move to ...
+       * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modf.c: ... here.
+       * sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-power5+.c: Move
+       to ...
+       * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modff-power5+.c:
+       ... here.
+       * sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-ppc64.c: Move to ...
+       * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modff-ppc64.c:
+       ... here.
+       * sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff.c: Move to ...
+       * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modff.c: ... here.
+
        * sysdeps/powerpc/fpu/e_hypot.c (two60, two500, two600, two1022,
        twoM500, twoM600, two60factor, pdnum): Remove.
        (TEST_INFO_NAN, GET_TW0_HIGH_WORD): Remove macro.
similarity index 74%
rename from sysdeps/powerpc/power5+/fpu/s_modf.c
rename to sysdeps/powerpc/fpu/s_modf.c
index dbb11652e12abec20fa07ea2ae33cd5f096a2931..2304fc48ed0be799cb982bb50a538b6f9f822f5f 100644 (file)
    License along with the GNU C Library; see the file COPYING.LIB.  If
    not, see <http://www.gnu.org/licenses/>.  */
 
-#include <math.h>
-#include <math_ldbl_opt.h>
-#include <libm-alias-double.h>
+/* ISA 2.07 provides fast GPR to FP instruction (mfvsr{d,wz}) which make
+   generic implementation faster.  Also disables for old ISAs that do not
+   have ceil/floor instructions.  */
+#if defined(_ARCH_PWR8) || !defined(_ARCH_PWR5X)
+# include <sysdeps/ieee754/ldbl-opt/s_modf.c>
+#else
+# include <math.h>
+# include <math_ldbl_opt.h>
+# include <libm-alias-double.h>
 
 double
 __modf (double x, double *iptr)
@@ -44,7 +50,10 @@ __modf (double x, double *iptr)
       return copysign (x - *iptr, x);
     }
 }
+# ifndef __modf
 libm_alias_double (__modf, modf)
-#if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
+#  if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
 compat_symbol (libc, __modf, modfl, GLIBC_2_0);
+#  endif
+# endif
 #endif
similarity index 77%
rename from sysdeps/powerpc/power5+/fpu/s_modff.c
rename to sysdeps/powerpc/fpu/s_modff.c
index 87c9f020f7117547347e6f918c6756bf9f55ee75..2a0f114b200e1dbbbba63562e1098ad70d2cb1fd 100644 (file)
    License along with the GNU C Library; see the file COPYING.LIB.  If
    not, see <http://www.gnu.org/licenses/>.  */
 
-#include <math.h>
-#include <libm-alias-float.h>
+/* ISA 2.07 provides fast GPR to FP instruction (mfvsr{d,wz}) which make
+   generic implementation faster.  Also disables for old ISAs that do not
+   have ceil/floor instructions.  */
+#if defined(_ARCH_PWR8) || !defined(_ARCH_PWR5X)
+# include <sysdeps/ieee754/flt-32/s_modff.c>
+#else
+# include <math.h>
+# include <libm-alias-float.h>
 
 float
 __modff (float x, float *iptr)
@@ -43,4 +49,7 @@ __modff (float x, float *iptr)
       return copysignf (x - *iptr, x);
     }
 }
+# ifndef __modff
 libm_alias_float (__modf, modf)
+# endif
+#endif
index b1d0540b31ab56dc8bd0504b6b8e1ed86f3c8b70..6f93c2b65203fd399e45938bfc6a8f0354875778 100644 (file)
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <math.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
 #define __modf __modf_power5plus
-
-#include <sysdeps/powerpc/power5+/fpu/s_modf.c>
+#include <sysdeps/powerpc/fpu/s_modf.c>
index 8b333eae0de4dd869160cbf92512baef2e4081bb..2e701881e82af630faae4675d73d0f7adbef8431 100644 (file)
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <math.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-
 #define __modff __modff_power5plus
-
-#include <sysdeps/powerpc/power5+/fpu/s_modff.c>
+#include <sysdeps/powerpc/fpu/s_modff.c>
index f542e89520fd583b790c6165a03245bf22c59144..f5fa357d57e30cbfaea6d457c6603f5a27ced3f7 100644 (file)
@@ -1,4 +1,13 @@
 ifeq ($(subdir),math)
+# These functions are built both for libc and libm because they're required
+# by printf.  While the libc objects have the prefix s_, the libm ones are
+# prefixed with  m_.
+sysdep_calls := s_modf-power5+ \
+               s_modf-ppc64 \
+               s_modff-power5+ \
+               s_modff-ppc64
+
+sysdep_routines += $(sysdep_calls)
 libm-sysdep_routines += s_ceil-power5+ \
                        s_ceil-ppc64 \
                        s_ceilf-power5+ \
@@ -22,7 +31,8 @@ libm-sysdep_routines += s_ceil-power5+ \
                        s_llround-power6x \
                        s_llround-power5+ \
                        s_llround-ppc64 \
-                       s_llroundf-ppc64
+                       s_llroundf-ppc64 \
+                       $(sysdep_calls:s_%=m_%)
 
 CFLAGS-s_ceil-power5+.c = -mcpu=power5+
 CFLAGS-s_ceilf-power5+.c = -mcpu=power5+
@@ -37,4 +47,11 @@ CFLAGS-s_llrint-power6x.c += -mcpu=power6x
 CFLAGS-s_llround-power8.c += -mcpu=power8
 CFLAGS-s_llround-power6x.c += -mcpu=power6x
 CFLAGS-s_llround-power5+.c += -mcpu=power5+
+
+CFLAGS-s_modf-power5+.c += -mcpu=power5+
+CFLAGS-s_modff-power5+.c += -mcpu=power5+
+# These files quiet sNaNs in a way that is optimized away without
+# -fsignaling-nans.
+CFLAGS-s_modf-ppc64.c += -fsignaling-nans
+CFLAGS-s_modff-ppc64.c += -fsignaling-nans
 endif
similarity index 91%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf-power5+.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modf-power5+.c
index 1a958de17837dea2115742a20e1619941e3c6125..6f93c2b65203fd399e45938bfc6a8f0354875778 100644 (file)
@@ -16,4 +16,5 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_modf-power5+.c>
+#define __modf __modf_power5plus
+#include <sysdeps/powerpc/fpu/s_modf.c>
similarity index 91%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_modff-power5+.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_modff-power5+.c
index 4939d4bc2b6e6648fcecc3084b009b4194a6386f..2e701881e82af630faae4675d73d0f7adbef8431 100644 (file)
@@ -16,4 +16,5 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_modff-power5+.c>
+#define __modff __modff_power5plus
+#include <sysdeps/powerpc/fpu/s_modff.c>
index 534d5a7133a737ccbdc34d67e99a735a6afc543d..d7ad1e27249270880d550681d38c972f8dde9b9b 100644 (file)
@@ -1,10 +1,4 @@
 ifeq ($(subdir),math)
-# These functions are built both for libc and libm because they're required
-# by printf.  While the libc objects have the prefix s_, the libm ones are
-# prefixed with  m_.
-sysdep_calls := s_modf-power5+ s_modf-ppc64 \
-               s_modff-power5+ s_modff-ppc64
-
 sysdep_routines += $(sysdep_calls)
 libm-sysdep_routines += s_logb-power7 s_logbf-power7 \
                        s_logbl-power7 s_logb-ppc64 s_logbf-ppc64 \
@@ -14,11 +8,4 @@ libm-sysdep_routines += s_logb-power7 s_logbf-power7 \
 CFLAGS-s_logbf-power7.c = -mcpu=power7
 CFLAGS-s_logbl-power7.c = -mcpu=power7
 CFLAGS-s_logb-power7.c = -mcpu=power7
-CFLAGS-s_modf-power5+.c = -mcpu=power5+
-CFLAGS-s_modff-power5+.c = -mcpu=power5+
-
-# These files quiet sNaNs in a way that is optimized away without
-# -fsignaling-nans.
-CFLAGS-s_modf-ppc64.c += -fsignaling-nans
-CFLAGS-s_modff-ppc64.c += -fsignaling-nans
 endif