dfa500
commit 6cac323c8dd78668e65aaa29f044cbd33c1a66a5
dfa500
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
dfa500
Date:   Fri Mar 15 18:42:00 2019 +0000
dfa500
dfa500
    powerpc: ceil/ceilf refactor
dfa500
    
dfa500
    This patches consolidates all the powerpc ceil{f} implementations on
dfa500
    the generic sysdeps/powerpc/fpu/s_ceil{f}.  The generic implementation
dfa500
    uses either the compiler builts for ISA 2.03+ (which generates the frip
dfa500
    instruction) or a generic implementation which uses FP only operations.
dfa500
    
dfa500
    It adds a generic implementation (round_to_integer.h) which is shared
dfa500
    with other rounding to integer routines.  The resulting code should be
dfa500
    similar in term os performance to previous assembly one.
dfa500
    
dfa500
    The IFUNC organization for powerpc64 is also change to be enabled only
dfa500
    for powerpc64 and not for powerpc64le (since minium ISA of 2.08 does not
dfa500
    require the fallback generic implementation).
dfa500
    
dfa500
    Checked on powerpc-linux-gnu (built without --with-cpu, with
dfa500
    --with-cpu=power4 and with --with-cpu=power5+ and --disable-multi-arch),
dfa500
    powerpc64-linux-gnu (built without --with-cp and with --with-cpu=power5+
dfa500
    and --disable-multi-arch).
dfa500
    
dfa500
            * sysdeps/powerpc/fpu/fenv_libc.h (__fesetround_inline_nocheck): New
dfa500
            function.
dfa500
            * sysdeps/powerpc/fpu/round_to_integer.h: New file.
dfa500
            * sysdeps/powerpc/fpu/s_ceil.c: Likewise.
dfa500
            * sysdeps/powerpc/fpu/s_ceilf.c: Likewise.
dfa500
            * sysdeps/powerpc/powerpc32/fpu/s_ceil.S: Remove file.
dfa500
            * sysdeps/powerpc/powerpc32/fpu/s_ceilf.S: Likewise.
dfa500
            * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
dfa500
            (CFLAGS-s_ceil-power5+.c, CFLAGS-s_ceilf-power5+.c): New rule.
dfa500
            * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-power5+.S:
dfa500
            Remove file.
dfa500
            * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-ppc32.S:
dfa500
            Likewise.
dfa500
            * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-power5+.S:
dfa500
            Likewise.
dfa500
            * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-ppc32.S:
dfa500
            Likewise.
dfa500
            * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-power5+.c:
dfa500
            New file.
dfa500
            * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-ppc32.c:
dfa500
            Likewise.
dfa500
            * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-power5+.c:
dfa500
            Likewise.
dfa500
            * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-ppc32.c:
dfa500
            Likewise.
dfa500
            * sysdeps/powerpc/powerpc32/power5+/fpu/s_ceil.S: Remove file.
dfa500
            * sysdeps/powerpc/powerpc32/power5+/fpu/s_ceilf.S: Likewise.
dfa500
            * sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile: New file.
dfa500
            * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil-power5+.c:
dfa500
            Likewise.
dfa500
            * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil-ppc64.c:
dfa500
            Likewise.
dfa500
            * sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil.c: Move to ...
dfa500
            * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil.c: ... here.
dfa500
            * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf-power5+.c: New
dfa500
            file.
dfa500
            * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf-ppc64.c:
dfa500
            Likewise.
dfa500
            * sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf.c: Move to ...
dfa500
            * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf.c: ...
dfa500
            * here.
dfa500
            * sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile
dfa500
            (libm-sysdep_routines): Remove s_ceil-power5+, s_ceil-ppc64,
dfa500
            s_ceilf-power5+, and s_ceilf-ppc64.
dfa500
            * sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-power5+.S: Remove
dfa500
            file.
dfa500
            * sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-ppc64.S: Likewise.
dfa500
            * sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-power5+.S: Likewise.
dfa500
            * sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-ppc64.S: Likewise.
dfa500
            * sysdeps/powerpc/powerpc64/fpu/s_ceil.S: Likewise.
dfa500
            * sysdeps/powerpc/powerpc64/fpu/s_ceilf.S: Likewise.
dfa500
            * sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S: Likewise.
dfa500
            * sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S: Likewise.
dfa500
    
dfa500
    Reviewed-by: Gabriel F. T. Gomes <gabriel@inconstante.eti.br>
dfa500
dfa500
Conflicts:
dfa500
	sysdeps/powerpc/powerpc32/fpu/s_ceil.S
dfa500
	sysdeps/powerpc/powerpc32/fpu/s_ceilf.S
dfa500
	sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-power5+.S
dfa500
	sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-ppc32.S
dfa500
	sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-power5+.S
dfa500
	sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-ppc32.S
dfa500
	sysdeps/powerpc/powerpc32/power5+/fpu/s_ceil.S
dfa500
	sysdeps/powerpc/powerpc32/power5+/fpu/s_ceilf.S
dfa500
	sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-power5+.S
dfa500
	sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-ppc64.S
dfa500
	sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-power5+.S
dfa500
	sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-ppc64.S
dfa500
	sysdeps/powerpc/powerpc64/fpu/s_ceil.S
dfa500
	sysdeps/powerpc/powerpc64/fpu/s_ceilf.S
dfa500
	sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S
dfa500
	sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S
dfa500
	  (Removal after the copyright year header change upstream.)
dfa500
dfa500
diff --git a/sysdeps/powerpc/fpu/fenv_libc.h b/sysdeps/powerpc/fpu/fenv_libc.h
dfa500
index 4c19d12b0b31c1f9..a0128c66444a3e46 100644
dfa500
--- a/sysdeps/powerpc/fpu/fenv_libc.h
dfa500
+++ b/sysdeps/powerpc/fpu/fenv_libc.h
dfa500
@@ -98,6 +98,14 @@ __fesetround_inline (int round)
dfa500
   return 0;
dfa500
 }
dfa500
 
dfa500
+/* Same as __fesetround_inline, however without runtime check to use DFP
dfa500
+   mtfsfi syntax (as relax_fenv_state) or if round value is valid.  */
dfa500
+static inline void
dfa500
+__fesetround_inline_nocheck (const int round)
dfa500
+{
dfa500
+  asm volatile ("mtfsfi 7,%0" : : "i" (round));
dfa500
+}
dfa500
+
dfa500
 /* Definitions of all the FPSCR bit numbers */
dfa500
 enum {
dfa500
   FPSCR_FX = 0,    /* exception summary */
dfa500
diff --git a/sysdeps/powerpc/fpu/round_to_integer.h b/sysdeps/powerpc/fpu/round_to_integer.h
dfa500
new file mode 100644
dfa500
index 0000000000000000..c70afbb10f600d81
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/fpu/round_to_integer.h
dfa500
@@ -0,0 +1,105 @@
dfa500
+/* Round to integer generic implementation.
dfa500
+   Copyright (C) 2019 Free Software Foundation, Inc.
dfa500
+   This file is part of the GNU C Library
dfa500
+
dfa500
+   The GNU C Library is free software; you can redistribute it and/or
dfa500
+   modify it under the terms of the GNU Library General Public License as
dfa500
+   published by the Free Software Foundation; either version 2 of the
dfa500
+   License, or (at your option) any later version.
dfa500
+
dfa500
+   The GNU C Library is distributed in the hope that it will be useful,
dfa500
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
+   Library General Public License for more details.
dfa500
+
dfa500
+   You should have received a copy of the GNU Library General Public
dfa500
+   License along with the GNU C Library; see the file COPYING.LIB.  If
dfa500
+   not, see <http://www.gnu.org/licenses/>.  */
dfa500
+
dfa500
+#ifndef _ROUND_TO_INTEGER_H
dfa500
+#define _ROUND_TO_INTEGER_H
dfa500
+
dfa500
+#include <fenv_private.h>
dfa500
+
dfa500
+enum round_mode
dfa500
+{
dfa500
+  CEIL
dfa500
+};
dfa500
+
dfa500
+static inline void
dfa500
+set_fenv_mode (enum round_mode mode)
dfa500
+{
dfa500
+  int rmode;
dfa500
+  switch (mode)
dfa500
+  {
dfa500
+  case CEIL:  rmode = FE_UPWARD; break;
dfa500
+  default:    rmode = FE_TONEAREST; break;
dfa500
+  }
dfa500
+  __fesetround_inline_nocheck (rmode);
dfa500
+}
dfa500
+
dfa500
+static inline float
dfa500
+round_to_integer_float (enum round_mode mode, float x)
dfa500
+{
dfa500
+  /* Ensure sNaN input is converted to qNaN.  */
dfa500
+  if (__glibc_unlikely (isnan (x)))
dfa500
+    return x + x;
dfa500
+
dfa500
+  if (fabs (x) > 0x1p+23)
dfa500
+    return x;
dfa500
+
dfa500
+  float r = x;
dfa500
+
dfa500
+  /* Save current FPU rounding mode and inexact state.  */
dfa500
+  fenv_t fe = fegetenv_register ();
dfa500
+  set_fenv_mode (mode);
dfa500
+  if (x > 0.0)
dfa500
+    {
dfa500
+      r += 0x1p+23;
dfa500
+      r -= 0x1p+23;
dfa500
+      r = fabs (r);
dfa500
+    }
dfa500
+  else if (x < 0.0)
dfa500
+    {
dfa500
+      r -= 0x1p+23;
dfa500
+      r += 0x1p+23;
dfa500
+      r = -fabs (r);
dfa500
+    }
dfa500
+  __builtin_mtfsf (0xff, fe);
dfa500
+
dfa500
+  return r;
dfa500
+}
dfa500
+
dfa500
+static inline double
dfa500
+round_to_integer_double (enum round_mode mode, double x)
dfa500
+{
dfa500
+  /* Ensure sNaN input is converted to qNaN.  */
dfa500
+  if (__glibc_unlikely (isnan (x)))
dfa500
+    return x + x;
dfa500
+
dfa500
+  if (fabs (x) > 0x1p+52)
dfa500
+    return x;
dfa500
+
dfa500
+  double r = x;
dfa500
+
dfa500
+  /* Save current FPU rounding mode and inexact state.  */
dfa500
+  fenv_t fe = fegetenv_register ();
dfa500
+  set_fenv_mode (mode);
dfa500
+  if (x > 0.0)
dfa500
+    {
dfa500
+      r += 0x1p+52;
dfa500
+      r -= 0x1p+52;
dfa500
+      r = fabs (r);
dfa500
+    }
dfa500
+  else if (x < 0.0)
dfa500
+    {
dfa500
+      r -= 0x1p+52;
dfa500
+      r += 0x1p+52;
dfa500
+      r = -fabs (r);
dfa500
+    }
dfa500
+  __builtin_mtfsf (0xff, fe);
dfa500
+
dfa500
+  return r;
dfa500
+}
dfa500
+
dfa500
+#endif
dfa500
diff --git a/sysdeps/powerpc/fpu/s_ceil.c b/sysdeps/powerpc/fpu/s_ceil.c
dfa500
new file mode 100644
dfa500
index 0000000000000000..49008c7af87d6d55
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/fpu/s_ceil.c
dfa500
@@ -0,0 +1,35 @@
dfa500
+/* Smallest integral value not less than argument.  PowerPC version.
dfa500
+   Copyright (C) 2019 Free Software Foundation, Inc.
dfa500
+   This file is part of the GNU C Library
dfa500
+
dfa500
+   The GNU C Library is free software; you can redistribute it and/or
dfa500
+   modify it under the terms of the GNU Library General Public License as
dfa500
+   published by the Free Software Foundation; either version 2 of the
dfa500
+   License, or (at your option) any later version.
dfa500
+
dfa500
+   The GNU C Library is distributed in the hope that it will be useful,
dfa500
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
+   Library General Public License for more details.
dfa500
+
dfa500
+   You should have received a copy of the GNU Library General Public
dfa500
+   License along with the GNU C Library; see the file COPYING.LIB.  If
dfa500
+   not, see <http://www.gnu.org/licenses/>.  */
dfa500
+
dfa500
+#define NO_MATH_REDIRECT
dfa500
+#include <math.h>
dfa500
+#include <libm-alias-double.h>
dfa500
+#include <round_to_integer.h>
dfa500
+
dfa500
+double
dfa500
+__ceil (double x)
dfa500
+{
dfa500
+#ifdef _ARCH_PWR5X
dfa500
+  return __builtin_ceil (x);
dfa500
+#else
dfa500
+  return round_to_integer_double (CEIL, x);
dfa500
+#endif
dfa500
+}
dfa500
+#ifndef __ceil
dfa500
+libm_alias_double (__ceil, ceil)
dfa500
+#endif
dfa500
diff --git a/sysdeps/powerpc/fpu/s_ceilf.c b/sysdeps/powerpc/fpu/s_ceilf.c
dfa500
new file mode 100644
dfa500
index 0000000000000000..8c86bf30a34df4cf
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/fpu/s_ceilf.c
dfa500
@@ -0,0 +1,35 @@
dfa500
+/* Smallest integral value not less than argument.  PowerPC version.
dfa500
+   Copyright (C) 2019 Free Software Foundation, Inc.
dfa500
+   This file is part of the GNU C Library
dfa500
+
dfa500
+   The GNU C Library is free software; you can redistribute it and/or
dfa500
+   modify it under the terms of the GNU Library General Public License as
dfa500
+   published by the Free Software Foundation; either version 2 of the
dfa500
+   License, or (at your option) any later version.
dfa500
+
dfa500
+   The GNU C Library is distributed in the hope that it will be useful,
dfa500
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
+   Library General Public License for more details.
dfa500
+
dfa500
+   You should have received a copy of the GNU Library General Public
dfa500
+   License along with the GNU C Library; see the file COPYING.LIB.  If
dfa500
+   not, see <http://www.gnu.org/licenses/>.  */
dfa500
+
dfa500
+#define NO_MATH_REDIRECT
dfa500
+#include <math.h>
dfa500
+#include <libm-alias-float.h>
dfa500
+#include <round_to_integer.h>
dfa500
+
dfa500
+float
dfa500
+__ceilf (float x)
dfa500
+{
dfa500
+#ifdef _ARCH_PWR5X
dfa500
+  return __builtin_ceilf (x);
dfa500
+#else
dfa500
+  return round_to_integer_float (CEIL, x);
dfa500
+#endif
dfa500
+}
dfa500
+#ifndef __ceilf
dfa500
+libm_alias_float (__ceil, ceil)
dfa500
+#endif
dfa500
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_ceil.S b/sysdeps/powerpc/powerpc32/fpu/s_ceil.S
dfa500
deleted file mode 100644
dfa500
index 7f2f97ada1a14a52..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc32/fpu/s_ceil.S
dfa500
+++ /dev/null
dfa500
@@ -1,76 +0,0 @@
dfa500
-/* ceil function.  PowerPC32 version.
dfa500
-   Copyright (C) 2004-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <math_ldbl_opt.h>
dfa500
-#include <libm-alias-double.h>
dfa500
-
dfa500
-	.section	.rodata.cst4,"aM",@progbits,4
dfa500
-	.align	2
dfa500
-.LC0:	/* 2**52 */
dfa500
-	.long 0x59800000
dfa500
-
dfa500
-	.section	".text"
dfa500
-ENTRY (__ceil)
dfa500
-#ifdef SHARED
dfa500
-	mflr	r11
dfa500
-	cfi_register(lr,r11)
dfa500
-	SETUP_GOT_ACCESS(r9,got_label)
dfa500
-	addis	r9,r9,.LC0-got_label@ha
dfa500
-	lfs	fp13,.LC0-got_label@l(r9)
dfa500
-	mtlr	r11
dfa500
-	cfi_same_value (lr)
dfa500
-#else
dfa500
-	lis	r9,.LC0@ha
dfa500
-	lfs	fp13,.LC0@l(r9)
dfa500
-#endif
dfa500
-	fabs	fp0,fp1
dfa500
-	fsub	fp12,fp13,fp13	/* generate 0.0  */
dfa500
-	fcmpu	cr7,fp0,fp13	/* if (fabs(x) > TWO52)  */
dfa500
-	mffs	fp11		/* Save current FPU rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	fcmpu	cr6,fp1,fp12	/* if (x > 0.0)  */
dfa500
-	bnl-	cr7,.L10
dfa500
-	mtfsfi	7,2		/* Set rounding mode toward +inf.  */
dfa500
-	ble-	cr6,.L4
dfa500
-	fadd	fp1,fp1,fp13	/* x+= TWO52;  */
dfa500
-	fsub	fp1,fp1,fp13	/* x-= TWO52;  */
dfa500
-	fabs	fp1,fp1		/* if (x == 0.0)  */
dfa500
-				/* x = 0.0; */
dfa500
-	mtfsf	0xff,fp11	/* Restore previous rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	blr
dfa500
-.L4:
dfa500
-	bge-	cr6,.L9		/* if (x < 0.0)  */
dfa500
-	fsub	fp1,fp1,fp13	/* x-= TWO52;  */
dfa500
-	fadd	fp1,fp1,fp13	/* x+= TWO52;  */
dfa500
-	fnabs	fp1,fp1		/* if (x == 0.0)  */
dfa500
-				/* x = -0.0; */
dfa500
-.L9:
dfa500
-	mtfsf	0xff,fp11	/* Restore previous rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	blr
dfa500
-.L10:
dfa500
-	/* Ensure sNaN input is converted to qNaN.  */
dfa500
-	fcmpu	cr7,fp1,fp1
dfa500
-	beqlr	cr7
dfa500
-	fadd	fp1,fp1,fp1
dfa500
-	blr
dfa500
-	END (__ceil)
dfa500
-
dfa500
-libm_alias_double (__ceil, ceil)
dfa500
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_ceilf.S b/sysdeps/powerpc/powerpc32/fpu/s_ceilf.S
dfa500
deleted file mode 100644
dfa500
index 3f5949004fa51baf..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc32/fpu/s_ceilf.S
dfa500
+++ /dev/null
dfa500
@@ -1,76 +0,0 @@
dfa500
-/* float ceil function.  PowerPC32 version.
dfa500
-   Copyright (C) 2004-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <libm-alias-float.h>
dfa500
-
dfa500
-	.section	.rodata.cst4,"aM",@progbits,4
dfa500
-	.align	2
dfa500
-.LC0:	/* 2**23 */
dfa500
-	.long 0x4b000000
dfa500
-
dfa500
-	.section	".text"
dfa500
-ENTRY (__ceilf)
dfa500
-#ifdef SHARED
dfa500
-	mflr	r11
dfa500
-	cfi_register(lr,r11)
dfa500
-	SETUP_GOT_ACCESS(r9,got_label)
dfa500
-	addis	r9,r9,.LC0-got_label@ha
dfa500
-	lfs	fp13,.LC0-got_label@l(r9)
dfa500
-	mtlr	r11
dfa500
-	cfi_same_value (lr)
dfa500
-#else
dfa500
-	lis	r9,.LC0@ha
dfa500
-	lfs	fp13,.LC0@l(r9)
dfa500
-#endif
dfa500
-	fabs	fp0,fp1
dfa500
-	fsubs	fp12,fp13,fp13	/* generate 0.0  */
dfa500
-	fcmpu	cr7,fp0,fp13	/* if (fabs(x) > TWO23)  */
dfa500
-	mffs	fp11		/* Save current FPU rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	fcmpu	cr6,fp1,fp12	/* if (x > 0.0)  */
dfa500
-	bnl-	cr7,.L10
dfa500
-	mtfsfi	7,2		/* Set rounding mode toward +inf.  */
dfa500
-	ble-	cr6,.L4
dfa500
-	fadds	fp1,fp1,fp13	/* x+= TWO23;  */
dfa500
-	fsubs	fp1,fp1,fp13	/* x-= TWO23;  */
dfa500
-	fabs	fp1,fp1		/* if (x == 0.0)  */
dfa500
-				/* x = 0.0; */
dfa500
-	mtfsf	0xff,fp11	/* Restore previous rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	blr
dfa500
-.L4:
dfa500
-	bge-	cr6,.L9		/* if (x < 0.0)  */
dfa500
-	fsubs	fp1,fp1,fp13	/* x-= TWO23;  */
dfa500
-	fadds	fp1,fp1,fp13	/* x+= TWO23;  */
dfa500
-	fnabs	fp1,fp1		/* if (x == 0.0)  */
dfa500
-				/* x = -0.0; */
dfa500
-.L9:
dfa500
-	mtfsf	0xff,fp11	/* Restore previous rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	blr
dfa500
-.L10:
dfa500
-	/* Ensure sNaN input is converted to qNaN.  */
dfa500
-	fcmpu	cr7,fp1,fp1
dfa500
-	beqlr	cr7
dfa500
-	fadds	fp1,fp1,fp1
dfa500
-	blr
dfa500
-	END (__ceilf)
dfa500
-
dfa500
-libm_alias_float (__ceil, ceil)
dfa500
-
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
dfa500
index 4e85021d50831eb6..cf38e347f2da74e9 100644
dfa500
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
dfa500
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
dfa500
@@ -26,6 +26,8 @@ libm-sysdep_routines += s_llrintf-power6 s_llrintf-ppc32 s_llrint-power6 \
dfa500
 			s_logbf-power7 s_logbf-ppc32 e_hypot-power7 \
dfa500
 			e_hypot-ppc32 e_hypotf-power7 e_hypotf-ppc32
dfa500
 
dfa500
+CFLAGS-s_ceil-power5+.c = -mcpu=power5+
dfa500
+CFLAGS-s_ceilf-power5+.c = -mcpu=power5+
dfa500
 CFLAGS-s_modf-power5+.c = -mcpu=power5+
dfa500
 CFLAGS-s_modff-power5+.c = -mcpu=power5+
dfa500
 CFLAGS-s_logbl-power7.c = -mcpu=power7
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-power5+.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-power5+.S
dfa500
deleted file mode 100644
dfa500
index b8181585a869bd8a..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-power5+.S
dfa500
+++ /dev/null
dfa500
@@ -1,33 +0,0 @@
dfa500
-/* ceil function.  PowerPC32/power5+ version.
dfa500
-   Copyright (C) 2013-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <math_ldbl_opt.h>
dfa500
-
dfa500
-#undef hidden_def
dfa500
-#define hidden_def(name)
dfa500
-#undef weak_alias
dfa500
-#define weak_alias(name, alias)
dfa500
-#undef strong_alias
dfa500
-#define strong_alias(name, alias)
dfa500
-#undef compat_symbol
dfa500
-#define compat_symbol(lib, name, alias, ver)
dfa500
-
dfa500
-#define __ceil __ceil_power5plus
dfa500
-
dfa500
-#include <sysdeps/powerpc/powerpc32/power5+/fpu/s_ceil.S>
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-power5+.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-power5+.c
dfa500
new file mode 100644
dfa500
index 0000000000000000..87bc66cdb0322c59
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-power5+.c
dfa500
@@ -0,0 +1,3 @@
dfa500
+#include <math.h>
dfa500
+#define __ceil __ceil_power5plus
dfa500
+#include <sysdeps/powerpc/fpu/s_ceil.c>
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-ppc32.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-ppc32.S
dfa500
deleted file mode 100644
dfa500
index cd2bc69b677e76db..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-ppc32.S
dfa500
+++ /dev/null
dfa500
@@ -1,31 +0,0 @@
dfa500
-/* ceil function.  PowerPC32 default version.
dfa500
-   Copyright (C) 2013-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <math_ldbl_opt.h>
dfa500
-
dfa500
-#undef weak_alias
dfa500
-#define weak_alias(a,b)
dfa500
-#undef strong_alias
dfa500
-#define strong_alias(a,b)
dfa500
-#undef compat_symbol
dfa500
-#define compat_symbol(a,b,c,d)
dfa500
-
dfa500
-#define __ceil __ceil_ppc32
dfa500
-
dfa500
-#include <sysdeps/powerpc/powerpc32/fpu/s_ceil.S>
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-ppc32.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-ppc32.c
dfa500
new file mode 100644
dfa500
index 0000000000000000..93c098476b915f9d
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceil-ppc32.c
dfa500
@@ -0,0 +1,3 @@
dfa500
+#include <math.h>
dfa500
+#define __ceil __ceil_ppc32
dfa500
+#include <sysdeps/powerpc/fpu/s_ceil.c>
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-power5+.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-power5+.S
dfa500
deleted file mode 100644
dfa500
index d01aa6e7db3d0b9d..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-power5+.S
dfa500
+++ /dev/null
dfa500
@@ -1,26 +0,0 @@
dfa500
-/* ceilf function.  PowerPC32/power5+ version.
dfa500
-   Copyright (C) 2013-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-
dfa500
-#undef weak_alias
dfa500
-#define weak_alias(name, alias)
dfa500
-
dfa500
-#define __ceilf __ceilf_power5plus
dfa500
-
dfa500
-#include <sysdeps/powerpc/powerpc32/power5+/fpu/s_ceilf.S>
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-power5+.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-power5+.c
dfa500
new file mode 100644
dfa500
index 0000000000000000..a5bfa98535c088a0
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-power5+.c
dfa500
@@ -0,0 +1,3 @@
dfa500
+#include <math.h>
dfa500
+#define __ceilf __ceilf_power5plus
dfa500
+#include <sysdeps/powerpc/fpu/s_ceilf.c>
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-ppc32.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-ppc32.S
dfa500
deleted file mode 100644
dfa500
index 264e032b3b27f9b3..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-ppc32.S
dfa500
+++ /dev/null
dfa500
@@ -1,27 +0,0 @@
dfa500
-/* ceilf function.  PowerPC32 default version.
dfa500
-   Copyright (C) 2013-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <math_ldbl_opt.h>
dfa500
-
dfa500
-#undef weak_alias
dfa500
-#define weak_alias(a,b)
dfa500
-
dfa500
-#define __ceilf __ceilf_ppc32
dfa500
-
dfa500
-#include <sysdeps/powerpc/powerpc32/fpu/s_ceilf.S>
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-ppc32.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-ppc32.c
dfa500
new file mode 100644
dfa500
index 0000000000000000..a4dcdcb4069289d6
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_ceilf-ppc32.c
dfa500
@@ -0,0 +1,3 @@
dfa500
+#include <math.h>
dfa500
+#define __ceilf __ceilf_ppc32
dfa500
+#include <sysdeps/powerpc/fpu/s_ceilf.c>
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power5+/fpu/s_ceil.S b/sysdeps/powerpc/powerpc32/power5+/fpu/s_ceil.S
dfa500
deleted file mode 100644
dfa500
index 356c7a79edf79940..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc32/power5+/fpu/s_ceil.S
dfa500
+++ /dev/null
dfa500
@@ -1,29 +0,0 @@
dfa500
-/* ceil function.  PowerPC32/power5+ version.
dfa500
-   Copyright (C) 2006-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <math_ldbl_opt.h>
dfa500
-#include <libm-alias-double.h>
dfa500
-
dfa500
-	.machine	"power5"
dfa500
-EALIGN (__ceil, 4, 0)
dfa500
-	frip	fp1, fp1
dfa500
-	blr
dfa500
-	END (__ceil)
dfa500
-
dfa500
-libm_alias_double (__ceil, ceil)
dfa500
diff --git a/sysdeps/powerpc/powerpc32/power5+/fpu/s_ceilf.S b/sysdeps/powerpc/powerpc32/power5+/fpu/s_ceilf.S
dfa500
deleted file mode 100644
dfa500
index a0bcda17fde0c0f6..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc32/power5+/fpu/s_ceilf.S
dfa500
+++ /dev/null
dfa500
@@ -1,30 +0,0 @@
dfa500
-/* ceilf function.  PowerPC32/power5+ version.
dfa500
-   Copyright (C) 2006-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <libm-alias-float.h>
dfa500
-
dfa500
-	.machine	"power5"
dfa500
-EALIGN (__ceilf, 4, 0)
dfa500
-	frip	fp1, fp1	/* The rounding instructions are double.  */
dfa500
-	frsp	fp1, fp1	/* But we need to set ooverflow for float.  */
dfa500
-	blr
dfa500
-	END (__ceilf)
dfa500
-
dfa500
-libm_alias_float (__ceil, ceil)
dfa500
-
dfa500
diff --git a/sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile
dfa500
new file mode 100644
dfa500
index 0000000000000000..932c3c7e6c6ad27e
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile
dfa500
@@ -0,0 +1,9 @@
dfa500
+ifeq ($(subdir),math)
dfa500
+libm-sysdep_routines += s_ceil-power5+ \
dfa500
+			s_ceil-ppc64 \
dfa500
+			s_ceilf-power5+ \
dfa500
+			s_ceilf-ppc64
dfa500
+
dfa500
+CFLAGS-s_ceil-power5+.c = -mcpu=power5+
dfa500
+CFLAGS-s_ceilf-power5+.c = -mcpu=power5+
dfa500
+endif
dfa500
diff --git a/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil-power5+.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil-power5+.c
dfa500
new file mode 100644
dfa500
index 0000000000000000..87bc66cdb0322c59
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil-power5+.c
dfa500
@@ -0,0 +1,3 @@
dfa500
+#include <math.h>
dfa500
+#define __ceil __ceil_power5plus
dfa500
+#include <sysdeps/powerpc/fpu/s_ceil.c>
dfa500
diff --git a/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil-ppc64.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil-ppc64.c
dfa500
new file mode 100644
dfa500
index 0000000000000000..8711ff3229467026
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil-ppc64.c
dfa500
@@ -0,0 +1,3 @@
dfa500
+#include <math.h>
dfa500
+#define __ceil __ceil_ppc64
dfa500
+#include <sysdeps/powerpc/fpu/s_ceil.c>
dfa500
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil.c
dfa500
similarity index 95%
dfa500
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil.c
dfa500
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil.c
dfa500
index 5cde4eb46f26ec82..1abca7ef63d6a852 100644
dfa500
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil.c
dfa500
+++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceil.c
dfa500
@@ -17,10 +17,8 @@
dfa500
    <http://www.gnu.org/licenses/>.  */
dfa500
 
dfa500
 #include <math.h>
dfa500
-#include <math_ldbl_opt.h>
dfa500
-#include <shlib-compat.h>
dfa500
-#include "init-arch.h"
dfa500
 #include <libm-alias-double.h>
dfa500
+#include "init-arch.h"
dfa500
 
dfa500
 extern __typeof (__ceil) __ceil_ppc64 attribute_hidden;
dfa500
 extern __typeof (__ceil) __ceil_power5plus attribute_hidden;
dfa500
diff --git a/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf-power5+.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf-power5+.c
dfa500
new file mode 100644
dfa500
index 0000000000000000..a5bfa98535c088a0
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf-power5+.c
dfa500
@@ -0,0 +1,3 @@
dfa500
+#include <math.h>
dfa500
+#define __ceilf __ceilf_power5plus
dfa500
+#include <sysdeps/powerpc/fpu/s_ceilf.c>
dfa500
diff --git a/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf-ppc64.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf-ppc64.c
dfa500
new file mode 100644
dfa500
index 0000000000000000..086251dc0937acfa
dfa500
--- /dev/null
dfa500
+++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf-ppc64.c
dfa500
@@ -0,0 +1,3 @@
dfa500
+#include <math.h>
dfa500
+#define __ceilf __ceilf_ppc64
dfa500
+#include <sysdeps/powerpc/fpu/s_ceilf.c>
dfa500
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf.c
dfa500
similarity index 95%
dfa500
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf.c
dfa500
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf.c
dfa500
index 18697e52b3ac1616..33245968a86ddcf5 100644
dfa500
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf.c
dfa500
+++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_ceilf.c
dfa500
@@ -17,10 +17,8 @@
dfa500
    <http://www.gnu.org/licenses/>.  */
dfa500
 
dfa500
 #include <math.h>
dfa500
-#include <math_ldbl_opt.h>
dfa500
-#include <shlib-compat.h>
dfa500
-#include "init-arch.h"
dfa500
 #include <libm-alias-float.h>
dfa500
+#include "init-arch.h"
dfa500
 
dfa500
 extern __typeof (__ceilf) __ceilf_ppc64 attribute_hidden;
dfa500
 extern __typeof (__ceilf) __ceilf_power5plus attribute_hidden;
dfa500
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile
dfa500
index 73f2f693771027a9..2805e4e0d66f3175 100644
dfa500
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile
dfa500
+++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile
dfa500
@@ -14,8 +14,7 @@ sysdep_calls := s_copysign-power6 s_copysign-ppc64 \
dfa500
 
dfa500
 sysdep_routines += $(sysdep_calls)
dfa500
 libm-sysdep_routines += s_llround-power6x \
dfa500
-			s_llround-power5+ s_llround-ppc64 s_ceil-power5+ \
dfa500
-			s_ceil-ppc64 s_ceilf-power5+ s_ceilf-ppc64 \
dfa500
+			s_llround-power5+ s_llround-ppc64 \
dfa500
 			s_floor-power5+ s_floor-ppc64 s_floorf-power5+ \
dfa500
 			s_floorf-ppc64 s_round-power5+ s_round-ppc64 \
dfa500
 			s_roundf-power5+ s_roundf-ppc64 s_trunc-power5+ \
dfa500
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-power5+.S
dfa500
deleted file mode 100644
dfa500
index 76651b694c251bb4..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-power5+.S
dfa500
+++ /dev/null
dfa500
@@ -1,30 +0,0 @@
dfa500
-/* ceil function.  PowerPC64/power5+ version.
dfa500
-   Copyright (C) 2013-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <shlib-compat.h>
dfa500
-
dfa500
-#undef weak_alias
dfa500
-#define weak_alias(a,b)
dfa500
-#undef strong_alias
dfa500
-#define strong_alias(a,b)
dfa500
-#undef compat_symbol
dfa500
-#define compat_symbol(a,b,c,d)
dfa500
-
dfa500
-#define __ceil __ceil_power5plus
dfa500
-
dfa500
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S>
dfa500
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-ppc64.S
dfa500
deleted file mode 100644
dfa500
index c75c66ba3bbf49c8..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceil-ppc64.S
dfa500
+++ /dev/null
dfa500
@@ -1,30 +0,0 @@
dfa500
-/* ceil function.  PowerPC64 default version.
dfa500
-   Copyright (C) 2013-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <shlib-compat.h>
dfa500
-
dfa500
-#undef weak_alias
dfa500
-#define weak_alias(a,b)
dfa500
-#undef strong_alias
dfa500
-#define strong_alias(a,b)
dfa500
-#undef compat_symbol
dfa500
-#define compat_symbol(a,b,c,d)
dfa500
-
dfa500
-#define __ceil __ceil_ppc64
dfa500
-
dfa500
-#include <sysdeps/powerpc/powerpc64/fpu/s_ceil.S>
dfa500
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-power5+.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-power5+.S
dfa500
deleted file mode 100644
dfa500
index b9c9e14fba6ee134..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-power5+.S
dfa500
+++ /dev/null
dfa500
@@ -1,24 +0,0 @@
dfa500
-/* ceilf function.  PowerPC64/power5+ version.
dfa500
-   Copyright (C) 2013-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#undef weak_alias
dfa500
-#define weak_alias(a,b)
dfa500
-
dfa500
-#define __ceilf __ceilf_power5plus
dfa500
-
dfa500
-#include <sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S>
dfa500
diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-ppc64.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-ppc64.S
dfa500
deleted file mode 100644
dfa500
index ce5cc49770fdfdee..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_ceilf-ppc64.S
dfa500
+++ /dev/null
dfa500
@@ -1,24 +0,0 @@
dfa500
-/* ceilf function.  PowerPC64 default version.
dfa500
-   Copyright (C) 2013-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#undef weak_alias
dfa500
-#define weak_alias(a,b)
dfa500
-
dfa500
-#define __ceilf __ceilf_ppc64
dfa500
-
dfa500
-#include <sysdeps/powerpc/powerpc64/fpu/s_ceilf.S>
dfa500
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_ceil.S b/sysdeps/powerpc/powerpc64/fpu/s_ceil.S
dfa500
deleted file mode 100644
dfa500
index 252d94f51ea1a167..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc64/fpu/s_ceil.S
dfa500
+++ /dev/null
dfa500
@@ -1,65 +0,0 @@
dfa500
-/* ceil function.  PowerPC64 version.
dfa500
-   Copyright (C) 2004-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <math_ldbl_opt.h>
dfa500
-#include <libm-alias-double.h>
dfa500
-
dfa500
-	.section	".toc","aw"
dfa500
-.LC0:	/* 2**52 */
dfa500
-	.tc FD_43300000_0[TC],0x4330000000000000
dfa500
-	.section	".text"
dfa500
-
dfa500
-ENTRY (__ceil, 4)
dfa500
-	CALL_MCOUNT 0
dfa500
-	lfd	fp13,.LC0@toc(2)
dfa500
-	fabs	fp0,fp1
dfa500
-	fsub	fp12,fp13,fp13	/* generate 0.0  */
dfa500
-	fcmpu	cr7,fp0,fp13	/* if (fabs(x) > TWO52)  */
dfa500
-	mffs	fp11		/* Save current FPU rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	fcmpu	cr6,fp1,fp12	/* if (x > 0.0)  */
dfa500
-	bnl-	cr7,.L10
dfa500
-	mtfsfi	7,2		/* Set rounding mode toward +inf.  */
dfa500
-	ble-	cr6,.L4
dfa500
-	fadd	fp1,fp1,fp13	/* x+= TWO52;  */
dfa500
-	fsub	fp1,fp1,fp13	/* x-= TWO52;  */
dfa500
-	fabs	fp1,fp1		/* if (x == 0.0)  */
dfa500
-				/* x = 0.0; */
dfa500
-	mtfsf	0xff,fp11	/* Restore previous rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	blr
dfa500
-.L4:
dfa500
-	bge-	cr6,.L9		/* if (x < 0.0)  */
dfa500
-	fsub	fp1,fp1,fp13	/* x-= TWO52;  */
dfa500
-	fadd	fp1,fp1,fp13	/* x+= TWO52;  */
dfa500
-	fnabs	fp1,fp1		/* if (x == 0.0)  */
dfa500
-				/* x = -0.0; */
dfa500
-.L9:
dfa500
-	mtfsf	0xff,fp11	/* Restore previous rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	blr
dfa500
-.L10:
dfa500
-	/* Ensure sNaN input is converted to qNaN.  */
dfa500
-	fcmpu	cr7,fp1,fp1
dfa500
-	beqlr	cr7
dfa500
-	fadd	fp1,fp1,fp1
dfa500
-	blr
dfa500
-	END (__ceil)
dfa500
-
dfa500
-libm_alias_double (__ceil, ceil)
dfa500
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S b/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S
dfa500
deleted file mode 100644
dfa500
index 3c62077c143eeced..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S
dfa500
+++ /dev/null
dfa500
@@ -1,67 +0,0 @@
dfa500
-/* float ceil function.  PowerPC64 version.
dfa500
-   Copyright (C) 2004-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <libm-alias-float.h>
dfa500
-
dfa500
-	.section	".toc","aw"
dfa500
-	.p2align 3
dfa500
-.LC0:	/* 2**23 */
dfa500
-	.long 0x4b000000
dfa500
-	.long 0x0
dfa500
-	.section	".text"
dfa500
-
dfa500
-ENTRY (__ceilf, 4)
dfa500
-	CALL_MCOUNT 0
dfa500
-	lfs	fp13,.LC0@toc(2)
dfa500
-	fabs	fp0,fp1
dfa500
-	fsubs	fp12,fp13,fp13	/* generate 0.0  */
dfa500
-	fcmpu	cr7,fp0,fp13	/* if (fabs(x) > TWO23)  */
dfa500
-	mffs	fp11		/* Save current FPU rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	fcmpu	cr6,fp1,fp12	/* if (x > 0.0)  */
dfa500
-	bnl-	cr7,.L10
dfa500
-	mtfsfi	7,2		/* Set rounding mode toward +inf.  */
dfa500
-	ble-	cr6,.L4
dfa500
-	fadds	fp1,fp1,fp13	/* x+= TWO23;  */
dfa500
-	fsubs	fp1,fp1,fp13	/* x-= TWO23;  */
dfa500
-	fabs	fp1,fp1		/* if (x == 0.0)  */
dfa500
-				/* x = 0.0; */
dfa500
-	mtfsf	0xff,fp11	/* Restore previous rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	blr
dfa500
-.L4:
dfa500
-	bge-	cr6,.L9		/* if (x < 0.0)  */
dfa500
-	fsubs	fp1,fp1,fp13	/* x-= TWO23;  */
dfa500
-	fadds	fp1,fp1,fp13	/* x+= TWO23;  */
dfa500
-	fnabs	fp1,fp1		/* if (x == 0.0)  */
dfa500
-				/* x = -0.0; */
dfa500
-.L9:
dfa500
-	mtfsf	0xff,fp11	/* Restore previous rounding mode and
dfa500
-				   "inexact" state.  */
dfa500
-	blr
dfa500
-.L10:
dfa500
-	/* Ensure sNaN input is converted to qNaN.  */
dfa500
-	fcmpu	cr7,fp1,fp1
dfa500
-	beqlr	cr7
dfa500
-	fadds	fp1,fp1,fp1
dfa500
-	blr
dfa500
-	END (__ceilf)
dfa500
-
dfa500
-libm_alias_float (__ceil, ceil)
dfa500
-
dfa500
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S
dfa500
deleted file mode 100644
dfa500
index e500932573c07503..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceil.S
dfa500
+++ /dev/null
dfa500
@@ -1,30 +0,0 @@
dfa500
-/* ceil function.  PowerPC64/power5+ version.
dfa500
-   Copyright (C) 2006-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <math_ldbl_opt.h>
dfa500
-#include <libm-alias-double.h>
dfa500
-
dfa500
-	.machine	"power5"
dfa500
-ENTRY_TOCLESS (__ceil, 4)
dfa500
-	CALL_MCOUNT 0
dfa500
-	frip	fp1, fp1
dfa500
-	blr
dfa500
-	END (__ceil)
dfa500
-
dfa500
-libm_alias_double (__ceil, ceil)
dfa500
diff --git a/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S b/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S
dfa500
deleted file mode 100644
dfa500
index d0b2118c2a3f81be..0000000000000000
dfa500
--- a/sysdeps/powerpc/powerpc64/power5+/fpu/s_ceilf.S
dfa500
+++ /dev/null
dfa500
@@ -1,31 +0,0 @@
dfa500
-/* ceilf function.  PowerPC64/power5+ version.
dfa500
-   Copyright (C) 2006-2018 Free Software Foundation, Inc.
dfa500
-   This file is part of the GNU C Library.
dfa500
-
dfa500
-   The GNU C Library is free software; you can redistribute it and/or
dfa500
-   modify it under the terms of the GNU Lesser General Public
dfa500
-   License as published by the Free Software Foundation; either
dfa500
-   version 2.1 of the License, or (at your option) any later version.
dfa500
-
dfa500
-   The GNU C Library is distributed in the hope that it will be useful,
dfa500
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa500
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dfa500
-   Lesser General Public License for more details.
dfa500
-
dfa500
-   You should have received a copy of the GNU Lesser General Public
dfa500
-   License along with the GNU C Library; if not, see
dfa500
-   <http://www.gnu.org/licenses/>.  */
dfa500
-
dfa500
-#include <sysdep.h>
dfa500
-#include <libm-alias-float.h>
dfa500
-
dfa500
-	.machine	"power5"
dfa500
-ENTRY_TOCLESS (__ceilf, 4)
dfa500
-	CALL_MCOUNT 0
dfa500
-	frip	fp1, fp1	/* The rounding instructions are double.  */
dfa500
-	frsp	fp1, fp1	/* But we need to set ooverflow for float.  */
dfa500
-	blr
dfa500
-	END (__ceilf)
dfa500
-
dfa500
-libm_alias_float (__ceil, ceil)
dfa500
-