Consolidated two commits: From 51c33bd233d00d77f268ec28565506a6cd1e7d10 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Mon, 25 Mar 2013 16:10:06 -0500 Subject: [PATCH 25/42] PowerPC: modf optimization This patch implements modf/modff optimization for POWER by focus on FP operations instead of relying in integer ones. (backported from commit 3c0265394d9ffedff2b0de508602dc52e077ce5c) This backport does not include the benchmark tests from the original commit. From 599fefcc3e7fbf65d9c441bf1b336b272c39f262 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Fri, 26 Apr 2013 13:00:56 -0500 Subject: [PATCH 26/42] PowerPC: modf optimization fix This patch fix the 3c0265394d9ffedff2b0de508602dc52e077ce5c commits by correctly setting minimum architecture for modf PPC optimization to power5+ instead of power5 (since only on power5+ round/ceil will be inline to inline assembly). (cherry picked from commit aa630f590c9c7d070a7cdf3a2a88069ad6b63de9) diff -pruN glibc-2.17-c758a686/sysdeps/powerpc/power5+/fpu/s_modf.c glibc-2.17-c758a686/sysdeps/powerpc/power5+/fpu/s_modf.c --- glibc-2.17-c758a686/sysdeps/powerpc/power5+/fpu/s_modf.c 1970-01-01 05:30:00.000000000 +0530 +++ glibc-2.17-c758a686/sysdeps/powerpc/power5+/fpu/s_modf.c 2013-08-06 17:48:57.609526556 +0530 @@ -0,0 +1,58 @@ +/* Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If + not, see . */ + +#include +#include +#include + +double +__modf (double x, double *iptr) +{ + if (__builtin_isinf (x)) + { + *iptr = x; + return __copysign (0.0, x); + } + else if (__builtin_isnan (x)) + { + *iptr = NAN; + return NAN; + } + + if (x >= 0.0) + { + *iptr = __floor (x); + return (x - *iptr); + } + else + { + *iptr = __ceil (x); + return (x - *iptr); + } +} +weak_alias (__modf, modf) +#ifdef NO_LONG_DOUBLE +strong_alias (__modf, __modfl) +weak_alias (__modf, modfl) +#endif +#ifdef IS_IN_libm +# if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __modf, modfl, GLIBC_2_0); +# endif +#elif LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) +compat_symbol (libc, __modf, modfl, GLIBC_2_0); +#endif diff -pruN glibc-2.17-c758a686/sysdeps/powerpc/power5+/fpu/s_modff.c glibc-2.17-c758a686/sysdeps/powerpc/power5+/fpu/s_modff.c --- glibc-2.17-c758a686/sysdeps/powerpc/power5+/fpu/s_modff.c 1970-01-01 05:30:00.000000000 +0530 +++ glibc-2.17-c758a686/sysdeps/powerpc/power5+/fpu/s_modff.c 2013-08-06 17:48:57.609526556 +0530 @@ -0,0 +1,46 @@ +/* Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If + not, see . */ + +#include +#include + +float +__modff (float x, float *iptr) +{ + if (__builtin_isinff (x)) + { + *iptr = x; + return __copysignf (0.0, x); + } + else if (__builtin_isnanf (x)) + { + *iptr = NAN; + return NAN; + } + + if (x >= 0.0) + { + *iptr = __floorf (x); + return (x - *iptr); + } + else + { + *iptr = __ceilf (x); + return (x - *iptr); + } +} +weak_alias (__modff, modff) diff -pruN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5/Implies glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5/Implies --- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5/Implies 2012-12-25 08:32:13.000000000 +0530 +++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5/Implies 2013-08-06 17:48:54.266526703 +0530 @@ -1,2 +1,4 @@ +powerpc/power5/fpu +powerpc/power5 powerpc/powerpc32/power4/fpu powerpc/powerpc32/power4 diff -pruN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/Implies glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/Implies --- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/Implies 2012-12-25 08:32:13.000000000 +0530 +++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/Implies 2013-08-06 17:48:57.609526556 +0530 @@ -1,2 +1,4 @@ +powerpc/power5+/fpu +powerpc/power5+ powerpc/powerpc32/power5/fpu powerpc/powerpc32/power5 diff -pruN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power5/Implies glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power5/Implies --- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power5/Implies 2012-12-25 08:32:13.000000000 +0530 +++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power5/Implies 2013-08-06 17:48:54.266526703 +0530 @@ -1,2 +1,4 @@ +powerpc/power5/fpu +powerpc/power5 powerpc/powerpc64/power4/fpu powerpc/powerpc64/power4 diff -pruN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power5+/Implies glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power5+/Implies --- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power5+/Implies 2012-12-25 08:32:13.000000000 +0530 +++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power5+/Implies 2013-08-06 17:48:57.610526556 +0530 @@ -1,2 +1,4 @@ +powerpc/power5+/fpu +powerpc/power5+ powerpc/powerpc64/power5/fpu powerpc/powerpc64/power5