powerpc: Remove optimized isinf

The powerpc isinf optimizations onyl adds complexity:

  - 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 power7 uses ftdiv to optimize for some input pattern and branch
    implementation for INF and denormal that does:

    return (ix & UINT64_C (0x7fffffffffffffff)) == UINT64_C (0x7ff0000000000000)

    Although it does show slight better latency than generic algorithm
    (as below), it is only for power7 and requires it to override it
    for power8.

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

Reviewed-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
This commit is contained in:
Adhemerval Zanella 2019-03-08 20:26:00 +00:00
parent a8c590f789
commit 6427a6ac8c
20 changed files with 28 additions and 634 deletions

View File

@ -1,5 +1,31 @@
2019-06-12 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
(sysdeps_routines, libm-sysdep_routines): Remove s_isinf* and s_isinf*
objects.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isinf-power7.S:
Remove file.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isinf-ppc32.c:
Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isinf.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isinff-ppc32.c:
Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isinff.c: Likewise.
* sysdeps/powerpc/powerpc32/power7/fpu/s_isinf.S: Likewise.
* sysdeps/powerpc/powerpc32/power7/fpu/s_isinff.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile (sysdep_call):
Remove s_isinf* and s_isinf* objects.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power7.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power8.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-ppc64.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff-ppc64.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff.c: Likewise.
* sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S: Likewise.
* sysdeps/powerpc/powerpc64/power7/fpu/s_isinff.S: Likewise.
* sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S: Likewise.
* sysdeps/powerpc/powerpc64/power8/fpu/s_isinff.S: Likewise.
* sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c: Move to ...
* sysdeps/ieee754/dbl-64/s_isinf.c: ... here and format code.

View File

@ -1,14 +1,12 @@
ifeq ($(subdir),math)
sysdep_routines += s_isinf-power7 \
s_isinf-ppc32 s_isinff-ppc32 s_finite-power7 \
sysdep_routines += s_finite-power7 \
s_finite-ppc32 s_finitef-ppc32 \
s_modf-power5+ s_modf-ppc32 \
s_modff-power5+ s_modff-ppc32
libm-sysdep_routines += s_llrintf-power6 s_llrintf-ppc32 s_llrint-power6 \
s_llrint-ppc32 s_llround-power6 s_llround-power5+ \
s_llround-ppc32 s_isinf-power7 \
s_isinf-ppc32 s_isinff-ppc32 s_finite-power7 \
s_llround-ppc32 s_finite-power7 \
s_finite-ppc32 s_finitef-ppc32 s_ceil-power5+ \
s_ceil-ppc32 s_ceilf-power5+ s_ceilf-ppc32 \
s_floor-power5+ s_floor-ppc32 s_floorf-power5+ \

View File

@ -1,33 +0,0 @@
/* isinf(). PowerPC32/POWER7 version.
Copyright (C) 2013-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <math_ldbl_opt.h>
#undef hidden_def
#define hidden_def(name)
#undef weak_alias
#define weak_alias(name, alias)
#undef strong_alias
#define strong_alias(name, alias)
#undef compat_symbol
#define compat_symbol(lib, name, alias, ver)
#define __isinf __isinf_power7
#include <sysdeps/powerpc/powerpc32/power7/fpu/s_isinf.S>

View File

@ -1,33 +0,0 @@
/* isinf(). PowerPC32 default version.
Copyright (C) 2013-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <math.h>
#undef weak_alias
#define weak_alias(a, b)
#undef strong_alias
#define strong_alias(a, b)
#define __isinf __isinf_ppc32
#ifdef SHARED
# undef hidden_def
# define hidden_def(a) \
__hidden_ver1 (__isinf_ppc32, __GI___isinf, __isinf_ppc32);
#endif
#include <sysdeps/ieee754/dbl-64/s_isinf.c>

View File

@ -1,50 +0,0 @@
/* Multiple versions of isinf.
Copyright (C) 2013-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define __isinf __redirect___isinf
#define __isinff __redirect___isinff
#define __isinfl __redirect___isinfl
#include <math.h>
#include <math_ldbl_opt.h>
#include <shlib-compat.h>
#include "init-arch.h"
extern __typeof (__isinf) __isinf_ppc32 attribute_hidden;
extern __typeof (__isinf) __isinf_power7 attribute_hidden;
#undef __isinf
#undef __isinff
#undef __isinfl
libc_ifunc_redirected (__redirect___isinf, __isinf,
(hwcap & PPC_FEATURE_ARCH_2_06)
? __isinf_power7
: __isinf_ppc32);
weak_alias (__isinf, isinf)
#ifdef NO_LONG_DOUBLE
strong_alias (__isinf, __isinfl)
weak_alias (__isinf, isinfl)
#endif
#if !IS_IN (libm)
# if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0);
compat_symbol (libc, isinf, isinfl, GLIBC_2_0);
# endif
#endif

View File

@ -1,31 +0,0 @@
/* isinff(). PowerPC32 default version.
Copyright (C) 2013-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <math.h>
#undef weak_alias
#define weak_alias(a, b)
#define __isinff __isinff_ppc32
#ifdef SHARED
# undef hidden_def
# define hidden_def(a) \
__hidden_ver1 (__isinff_ppc32, __GI___isinff, __isinff_ppc32);
#endif
#include <sysdeps/ieee754/flt-32/s_isinff.c>

View File

@ -1,35 +0,0 @@
/* Multiple versions of isinf.
Copyright (C) 2013-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define __isinff __redirect___isinff
#include <math.h>
#include <math_ldbl_opt.h>
#include <shlib-compat.h>
#include "init-arch.h"
extern __typeof (__isinff) __isinff_ppc32 attribute_hidden;
/* The power7 isinf(double) works for float. */
extern __typeof (__isinff) __isinf_power7 attribute_hidden;
#undef __isinff
libc_ifunc_redirected (__redirect___isinff, __isinff,
(hwcap & PPC_FEATURE_ARCH_2_06)
? __isinf_power7
: __isinff_ppc32);
weak_alias (__isinff, isinff)

View File

@ -1,85 +0,0 @@
/* isinf(). PowerPC32/POWER7 version.
Copyright (C) 2010-2019 Free Software Foundation, Inc.
Contributed by Luis Machado <luisgpm@br.ibm.com>.
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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <math_ldbl_opt.h>
/* int __isinf(x) */
.section .rodata.cst8,"aM",@progbits,8
.align 3
.LC0: /* 1.0 */
.quad 0x3ff0000000000000
.section ".text"
.type __isinf, @function
.machine power7
ENTRY (__isinf)
#ifdef SHARED
mflr r11
cfi_register(lr,r11)
SETUP_GOT_ACCESS(r9,got_label)
addis r9,r9,.LC0-got_label@ha
lfd fp0,.LC0-got_label@l(r9)
mtlr r11
cfi_same_value (lr)
#else
lis r9,.LC0@ha
lfd fp0,.LC0@l(r9)
#endif
ftdiv cr7,fp1,fp0
li r3,0
bflr 29 /* If not INF, return. */
/* Either we have +INF or -INF. */
stwu r1,-16(r1) /* Allocate stack space. */
stfd fp1,8(r1) /* Transfer FP to GPR's. */
ori 2,2,0 /* Force a new dispatch group. */
lhz r4,8+HISHORT(r1) /* Fetch the upper 16 bits of the FP value
(biased exponent and sign bit). */
addi r1,r1,16 /* Reset the stack pointer. */
cmpwi cr7,r4,0x7ff0 /* r4 == 0x7ff0? */
li r3,1
beqlr cr7 /* EQ means INF, otherwise -INF. */
li r3,-1
blr
END (__isinf)
hidden_def (__isinf)
weak_alias (__isinf, isinf)
/* It turns out that the 'double' version will also always work for
single-precision. */
strong_alias (__isinf, __isinff)
hidden_def (__isinff)
weak_alias (__isinff, isinff)
#ifdef NO_LONG_DOUBLE
strong_alias (__isinf, __isinfl)
weak_alias (__isinf, isinfl)
#endif
#if !IS_IN (libm)
# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0);
compat_symbol (libc, isinf, isinfl, GLIBC_2_0);
# endif
#endif

View File

@ -1 +0,0 @@
/* This function uses the same code as s_isinf.S. */

View File

@ -4,8 +4,6 @@ ifeq ($(subdir),math)
# prefixed with m_.
sysdep_calls := s_finite-power8 s_finite-power7 s_finite-ppc64 \
s_finitef-ppc64 \
s_isinf-power8 s_isinf-ppc64 \
s_isinff-ppc64 s_isinf-power7 \
s_modf-power5+ s_modf-ppc64 \
s_modff-power5+ s_modff-ppc64

View File

@ -1,32 +0,0 @@
/* isinf(). PowerPC64/POWER7 version.
Copyright (C) 2013-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <shlib-compat.h>
#undef hidden_def
#define hidden_def(name)
#undef weak_alias
#define weak_alias(name, alias)
#undef strong_alias
#define strong_alias(name, alias)
#undef compat_symbol
#define compat_symbol(lib, name, alias, ver)
#define __isinf __isinf_power7
#include <sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S>

View File

@ -1,32 +0,0 @@
/* isinf(). PowerPC64/POWER8 version.
Copyright (C) 2014-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <shlib-compat.h>
#undef hidden_def
#define hidden_def(name)
#undef weak_alias
#define weak_alias(name, alias)
#undef strong_alias
#define strong_alias(name, alias)
#undef compat_symbol
#define compat_symbol(lib, name, alias, ver)
#define __isinf __isinf_power8
#include <sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S>

View File

@ -1,33 +0,0 @@
/* isinf(). PowerPC64 default version.
Copyright (C) 2013-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <math.h>
#undef weak_alias
#define weak_alias(a, b)
#undef strong_alias
#define strong_alias(a, b)
#define __isinf __isinf_ppc64
#ifdef SHARED
# undef hidden_def
# define hidden_def(a) \
__hidden_ver1 (__isinf_ppc64, __GI___isinf, __isinf_ppc64);
#endif
#include <sysdeps/ieee754/dbl-64/s_isinf.c>

View File

@ -1,62 +0,0 @@
/* Multiple versions of isinf.
Copyright (C) 2013-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define __isinf __redirect___isinf
/* The following definitions, although not related to the 'double'
version of 'isinf', are required to guarantee macro expansions
(e.g.: from __isinff to __redirect_isinff) in include/math.h, thus
compensating for the unintended macro expansions in
math/bits/mathcalls-helper-functions.h. */
#define __isinff __redirect___isinff
#define __isinfl __redirect___isinfl
#define __isinff128 __redirect___isinff128
#include <math.h>
#include <math_ldbl_opt.h>
#include <shlib-compat.h>
#include "init-arch.h"
extern __typeof (__isinf) __isinf_ppc64 attribute_hidden;
extern __typeof (__isinf) __isinf_power7 attribute_hidden;
extern __typeof (__isinf) __isinf_power8 attribute_hidden;
#undef __isinf
#undef __isinff
#undef __isinfl
#undef __isinff128
libc_ifunc_redirected (__redirect___isinf, __isinf,
(hwcap2 & PPC_FEATURE2_ARCH_2_07)
? __isinf_power8
: (hwcap & PPC_FEATURE_ARCH_2_06)
? __isinf_power7
: __isinf_ppc64);
weak_alias (__isinf, isinf)
#ifdef NO_LONG_DOUBLE
strong_alias (__isinf, __isinfl)
weak_alias (__isinf, isinfl)
#endif
#if !IS_IN (libm)
# if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0);
compat_symbol (libc, isinf, isinfl, GLIBC_2_0);
# endif
#endif

View File

@ -1,31 +0,0 @@
/* isinff(). PowerPC64 default version.
Copyright (C) 2013-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <math.h>
#undef weak_alias
#define weak_alias(a, b)
#define __isinff __isinff_ppc64
#ifdef SHARED
# undef hidden_def
# define hidden_def(a) \
__hidden_ver1 (__isinff_ppc64, __GI___isinff, __isinff_ppc64);
#endif
#include <sysdeps/ieee754/flt-32/s_isinff.c>

View File

@ -1,38 +0,0 @@
/* Multiple versions of isinf.
Copyright (C) 2013-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define __isinff __redirect___isinff
#include <math.h>
#include <math_ldbl_opt.h>
#include <shlib-compat.h>
#include "init-arch.h"
extern __typeof (__isinff) __isinff_ppc64 attribute_hidden;
/* The double-precision version also works for single-precision. */
extern __typeof (__isinff) __isinf_power7 attribute_hidden;
extern __typeof (__isinff) __isinf_power8 attribute_hidden;
#undef __isinff
libc_ifunc_redirected (__redirect___isinff, __isinff,
(hwcap2 & PPC_FEATURE2_ARCH_2_07)
? __isinf_power8
: (hwcap & PPC_FEATURE_ARCH_2_06)
? __isinf_power7
: __isinff_ppc64);
weak_alias (__isinff, isinff)

View File

@ -1,69 +0,0 @@
/* isinf(). PowerPC64/POWER7 version.
Copyright (C) 2010-2019 Free Software Foundation, Inc.
Contributed by Luis Machado <luisgpm@br.ibm.com>.
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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <math_ldbl_opt.h>
/* int __isinf(x) */
.section ".toc","aw"
.LC0: /* 1.0 */
.tc FD_ONE[TC],0x3ff0000000000000
.section ".text"
.type __isinf, @function
.machine power7
ENTRY (__isinf, 4)
CALL_MCOUNT 0
lfd fp0,.LC0@toc(r2)
ftdiv cr7,fp1,fp0
li r3,0
bflr 29 /* If not INF, return. */
/* Either we have -INF/+INF or a denormal. */
stfd fp1,-16(r1) /* Transfer FP to GPR's. */
ori 2,2,0 /* Force a new dispatch group. */
lhz r4,-16+HISHORT(r1) /* Fetch the upper 16 bits of the FP value
(biased exponent and sign bit). */
cmpwi cr7,r4,0x7ff0 /* r4 == 0x7ff0? */
li r3,1
beqlr cr7 /* EQ means INF, otherwise -INF. */
li r3,-1
blr
END (__isinf)
hidden_def (__isinf)
weak_alias (__isinf, isinf)
/* It turns out that the 'double' version will also always work for
single-precision. */
strong_alias (__isinf, __isinff)
hidden_def (__isinff)
weak_alias (__isinff, isinff)
#ifdef NO_LONG_DOUBLE
strong_alias (__isinf, __isinfl)
weak_alias (__isinf, isinfl)
#endif
#if !IS_IN (libm)
# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0);
compat_symbol (libc, isinf, isinfl, GLIBC_2_0);
# endif
#endif

View File

@ -1 +0,0 @@
/* This function uses the same code as s_isinf.S. */

View File

@ -1,61 +0,0 @@
/* isinf(). PowerPC64/POWER8 version.
Copyright (C) 2014-2019 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <math_ldbl_opt.h>
#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */
/* int [r3] __isinf([fp1] x) */
ENTRY_TOCLESS (__isinf, 4)
CALL_MCOUNT 0
MFVSRD_R3_V1
lis r9,0x7ff0 /* r9 = 0x7ff0 */
rldicl r10,r3,0,1 /* r10 = r3 & (0x8000000000000000) */
sldi r9,r9,32 /* r9 = r9 << 52 */
cmpd cr7,r10,r9 /* fp1 & 0x7ff0000000000000 ? */
beq cr7,L(inf)
li r3,0 /* Not inf */
blr
L(inf):
sradi r3,r3,63 /* r3 = r3 >> 63 */
ori r3,r3,1 /* r3 = r3 | 0x1 */
blr
END (__isinf)
hidden_def (__isinf)
weak_alias (__isinf, isinf)
/* It turns out that the 'double' version will also always work for
single-precision. */
strong_alias (__isinf, __isinff)
hidden_def (__isinff)
weak_alias (__isinff, isinff)
#ifdef NO_LONG_DOUBLE
strong_alias (__isinf, __isinfl)
weak_alias (__isinf, isinfl)
#endif
#if !IS_IN (libm)
# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0);
compat_symbol (libc, isinf, isinfl, GLIBC_2_0);
# endif
#endif

View File

@ -1 +0,0 @@
/* This function uses the same code as s_isinf.S. */