| Consolidated two commits: |
| |
| From 51c33bd233d00d77f268ec28565506a6cd1e7d10 Mon Sep 17 00:00:00 2001 |
| From: Adhemerval Zanella <azanella@linux.vnet.ibm.com> |
| 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 <azanella@linux.vnet.ibm.com> |
| 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 |
| |
| |
| @@ -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 <http://www.gnu.org/licenses/>. */ |
| + |
| +#include <math.h> |
| +#include <math_private.h> |
| +#include <math_ldbl_opt.h> |
| + |
| +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 |
| |
| |
| @@ -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 <http://www.gnu.org/licenses/>. */ |
| + |
| +#include <math.h> |
| +#include <math_private.h> |
| + |
| +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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -1,2 +1,4 @@ |
| +powerpc/power5+/fpu |
| +powerpc/power5+ |
| powerpc/powerpc64/power5/fpu |
| powerpc/powerpc64/power5 |