]> git.ipfire.org Git - thirdparty/glibc.git/commit
powerpc: Remove optimized isnan
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 8 Mar 2019 19:32:15 +0000 (19:32 +0000)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 12 Jun 2019 17:32:36 +0000 (14:32 -0300)
commit2666f96390b8283cf8dacd0d0f268bf06ff10eb8
tree11df0f40297f4a20ccd776b227d20899a00f8374
parent197dbda1a155324bfc52ae1bc3cc26e57955c1cf
powerpc: Remove optimized isnan

The powerpc isnan optimizations are not really a gain:

  - GCC will call libm iff -fsignaling-nans is used. This usage pattern
    is usually not performance oriented and for such calls PLT overhead
    should dominate execution time.

  - The power5, power6, and power6x are just micro-optimization to
    improve the Load-Hit-Store hazards from floating-point to general
    register transfer, and current GCC already has support to minimize
    it by inserting either extra nops or group dispatch instructions.

  - The power7 uses ftdiv to optimize for some input patterns, but at
    cost of others.  Comparing against generic C implementation built
    for powerpc-linux-gnu-power4 (which uses the hp-timing support on
    benchtests):

    - Generic sysdeps/ieee754 implementation:
      "isnan": {
       "": {
        "duration": 4.98415e+09,
        "iterations": 2.34516e+09,
        "max": 45.925,
        "min": 2.052,
        "mean": 2.12529
       },
       "INF": {
        "duration": 4.74057e+09,
        "iterations": 1.69761e+09,
        "max": 91.01,
        "min": 2.052,
        "mean": 2.79249
       },
       "NAN": {
        "duration": 4.74071e+09,
        "iterations": 1.68768e+09,
        "max": 282.343,
        "min": 2.052,
        "mean": 2.809
       }
      }

    - power7 optimized one:
    $ ./testrun.sh benchtests/bench-isnan
      "isnan": {
       "": {
        "duration": 4.96842e+09,
        "iterations": 2.56297e+09,
        "max": 50.048,
        "min": 1.872,
        "mean": 1.93854
       },
       "INF": {
        "duration": 4.76648e+09,
        "iterations": 1.54213e+09,
        "max": 373.408,
        "min": 2.661,
        "mean": 3.09084
       },
       "NAN": {
        "duration": 4.76845e+09,
        "iterations": 1.54515e+09,
        "max": 51.016,
        "min": 2.736,
        "mean": 3.08607
       }
      }

    So it basically optimizes marginally for normal numbers while
    increasing the latency for other kind of FP.

  - The generic implementation requires getting the floating point
    status, disable the invalid operation bit, and restore the
    floating-point status.  Each operation is costly and requires
    flushing the FP pipeline.

    Using the same scenarion for the previous analysis:

      "isnan": {
       "": {
        "duration": 5.08284e+09,
        "iterations": 6.2898e+08,
        "max": 41.844,
        "min": 8.057,
        "mean": 8.08108
       },
       "INF": {
        "duration": 4.97904e+09,
        "iterations": 6.16176e+08,
        "max": 39.661,
        "min": 8.057,
        "mean": 8.08055
       },
       "NAN": {
        "duration": 4.98695e+09,
        "iterations": 5.95866e+08,
        "max": 29.728,
        "min": 8.345,
        "mean": 8.36925
       }
      }

  - The power8 implementation is just the generic implementation using
    ISA 2.07 mfvsrd instruction (which GCC uses for generic implementation).
    So generic implementation is the best option for powerpc64le.

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/fpu/s_isnan.c: Remove file.
* sysdeps/powerpc/fpu/s_isnanf.S: Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_isnan.S: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
(sysdeps_routines, libm-sysdep_routines): Remove s_isnan-* and
s_isnanf-* objects.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan-power5.S:
Remove file
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan-power6.S:
Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan-power7.S:
Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan-ppc32.S:
Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnanf-power5.S:
Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnanf-power6.S:
Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnanf.c: Likewise.
* sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S: Likewise.
* sysdeps/powerpc/powerpc32/power5/fpu/s_isnanf.S: Likewise.
* sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S: Likewise.
* sysdeps/powerpc/powerpc32/power6/fpu/s_isnanf.S: Likewise.
* sysdeps/powerpc/powerpc32/power7/fpu/s_isnan.S: Likewise.
* sysdeps/powerpc/powerpc32/power7/fpu/s_isnanf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile (sysdep_calls):
Remove s_isnan-* and s_isnanf-* objects.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power5.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6x.S:
Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power7.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power8.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-ppc64.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_isnan.S: Likewise.
* sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S: Likewise.
* sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S: Likewise.
* sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S: Likewise.
* sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S: Likewise.
* sysdeps/powerpc/powerpc64/power7/fpu/s_isnanf.S: Likewise.
* sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S: Likewise.
* sysdeps/powerpc/powerpc64/power8/fpu/s_isnanf.S: Likewise.

Reviewed-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
36 files changed:
ChangeLog
sysdeps/powerpc/fpu/s_isnan.c [deleted file]
sysdeps/powerpc/fpu/s_isnanf.S [deleted file]
sysdeps/powerpc/powerpc32/fpu/s_isnan.S [deleted file]
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan-power5.S [deleted file]
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan-power6.S [deleted file]
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan-power7.S [deleted file]
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan-ppc32.S [deleted file]
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan.c [deleted file]
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnanf-power5.S [deleted file]
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnanf-power6.S [deleted file]
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnanf.c [deleted file]
sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S [deleted file]
sysdeps/powerpc/powerpc32/power5/fpu/s_isnanf.S [deleted file]
sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S [deleted file]
sysdeps/powerpc/powerpc32/power6/fpu/s_isnanf.S [deleted file]
sysdeps/powerpc/powerpc32/power7/fpu/s_isnan.S [deleted file]
sysdeps/powerpc/powerpc32/power7/fpu/s_isnanf.S [deleted file]
sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile
sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power5.S [deleted file]
sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6.S [deleted file]
sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power6x.S [deleted file]
sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power7.S [deleted file]
sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power8.S [deleted file]
sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-ppc64.S [deleted file]
sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c [deleted file]
sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c [deleted file]
sysdeps/powerpc/powerpc64/fpu/s_isnan.S [deleted file]
sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S [deleted file]
sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S [deleted file]
sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S [deleted file]
sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S [deleted file]
sysdeps/powerpc/powerpc64/power7/fpu/s_isnanf.S [deleted file]
sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S [deleted file]
sysdeps/powerpc/powerpc64/power8/fpu/s_isnanf.S [deleted file]