From 2666f96390b8283cf8dacd0d0f268bf06ff10eb8 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Fri, 8 Mar 2019 19:32:15 +0000 Subject: 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 --- ChangeLog | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'ChangeLog') diff --git a/ChangeLog b/ChangeLog index d020bb9920..db05efec20 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,51 @@ 2019-06-12 Adhemerval Zanella + * 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. + * sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c: Move to ... * sysdeps/ieee754/dbl-64/s_isnan.c: ... here and format code. -- cgit 1.4.1