diff mbox series

[21/28] powerpc: Refactor powerpc32 lround/lroundf/llround/llroundf

Message ID 20190329133529.22523-22-adhemerval.zanella@linaro.org
State Accepted
Commit 9d5d214e86db30633e905907f7b3cf56b8fee16e
Headers show
Series powerpc floating-point optimization refactor | expand

Commit Message

Adhemerval Zanella March 29, 2019, 1:35 p.m. UTC
This patches consolidates all the powerpc llround{f} implementations on
the generic sysdeps/powerpc/powerpc32/fpu/s_llround{f}.  The only missing
optimization is the power6x one which I could not make GCC generates
mftgpr for 32 bits output.

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/fpu/Makefile
	[$(subdir) == math] (CFLAGS-s_lround.c): New rule.
	* sysdeps/powerpc/powerpc32/fpu/s_llround.c (__llround): Add power5+
	and fctidz optimization.
	* sysdeps/powerpc/powerpc32/fpu/s_lround.S: Remove file.
	* sysdeps/powerpc/powerpc32/fpu/s_lround.c: New file.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
	(CFLAGS-s_llround-power6.c, CFLAGS-s_llround-power5+.c,
	CFLAGS-s_llround-ppc32.c, CFLAGS-s_lround-ppc32.c,
	CFLAGS-s_lround-power5+.c): New rule.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.c:
	New file.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c:
	Likewise.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.c:
	Likewise.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.c:
	Likewise.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.c:
	Likewise.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.S:
	Remove file.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.S:
	Likewise.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.S:
	Likewise.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.S:
	Likewise.
	* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.S:
	Likewise.
	* sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S: Likewise.
	* sysdeps/powerpc/powerpc32/power4/fpu/s_llroundf.S: Likewise.
	* sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S: Likewise.
	* sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S: Likewise.
	* sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S: Likewise.
	* sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S: Likewise.
	* sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S: Likewise.
---
 sysdeps/powerpc/powerpc32/fpu/Makefile        |   1 +
 sysdeps/powerpc/powerpc32/fpu/s_llround.c     |  51 +++++++-
 sysdeps/powerpc/powerpc32/fpu/s_lround.S      | 123 ------------------
 sysdeps/powerpc/powerpc32/fpu/s_lround.c      |  77 +++++++++++
 .../powerpc32/power4/fpu/multiarch/Makefile   |   5 +
 .../power4/fpu/multiarch/s_llround-power5+.S  |  31 -----
 .../power4/fpu/multiarch/s_llround-power5+.c  |   2 +
 .../power4/fpu/multiarch/s_llround-power6.S   |  31 -----
 .../power4/fpu/multiarch/s_llround-power6.c   |   2 +
 .../power4/fpu/multiarch/s_llround-ppc32.S    |  31 -----
 .../power4/fpu/multiarch/s_llround-ppc32.c    |   2 +
 .../power4/fpu/multiarch/s_lround-power5+.S   |  33 -----
 .../power4/fpu/multiarch/s_lround-power5+.c   |   2 +
 .../power4/fpu/multiarch/s_lround-ppc32.S     |  31 -----
 .../power4/fpu/multiarch/s_lround-ppc32.c     |   2 +
 .../powerpc/powerpc32/power4/fpu/s_llround.S  | 105 ---------------
 .../powerpc/powerpc32/power4/fpu/s_llroundf.S |   1 -
 .../powerpc/powerpc32/power5+/fpu/s_llround.S |  53 --------
 .../powerpc32/power5+/fpu/s_llroundf.S        |   1 -
 .../powerpc/powerpc32/power5+/fpu/s_lround.S  |  51 --------
 .../powerpc/powerpc32/power6/fpu/s_llround.S  |  53 --------
 .../powerpc/powerpc32/power6/fpu/s_llroundf.S |   1 -
 22 files changed, 142 insertions(+), 547 deletions(-)
 delete mode 100644 sysdeps/powerpc/powerpc32/fpu/s_lround.S
 create mode 100644 sysdeps/powerpc/powerpc32/fpu/s_lround.c
 delete mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.S
 create mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.c
 delete mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.S
 create mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c
 delete mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.S
 create mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.c
 delete mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.S
 create mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.c
 delete mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.S
 create mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.c
 delete mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S
 delete mode 100644 sysdeps/powerpc/powerpc32/power4/fpu/s_llroundf.S
 delete mode 100644 sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S
 delete mode 100644 sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S
 delete mode 100644 sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S
 delete mode 100644 sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S
 delete mode 100644 sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S

-- 
2.17.1

Comments

Gabriel F. T. Gomes June 24, 2019, 9:07 p.m. UTC | #1
On Fri, Mar 29 2019, Adhemerval Zanella wrote:
> 

> This patches consolidates all the powerpc llround{f} implementations on

> the generic sysdeps/powerpc/powerpc32/fpu/s_llround{f}.  The only missing

> optimization is the power6x one which I could not make GCC generates

> mftgpr for 32 bits output.


Similar to the llrint case, no harm done as such optimization wasn't
available, anyway.

> +  /* The barrier prevents compiler from optimizing it to llround when

> +     compiled with -fno-math-errno */

> +  math_opt_barrier (x);


I don't actually understand what this accomplishes, and I don't see any
difference in the code generated with and without this barrier (all my
builds have -fno-math-errno passed to the compiler).  Could you help me
understand this?

This is the code I get (with or without the barrier):

  00079dc0 <__llround_power6>:
    79dc0:       fc 20 0b 10     frin    f1,f1
    79dc4:       94 21 ff f0     stwu    r1,-16(r1)
    79dc8:       fc 00 0e 5e     fctidz  f0,f1
    79dcc:       d8 01 00 08     stfd    f0,8(r1)
    79dd0:       80 61 00 08     lwz     r3,8(r1)
    79dd4:       80 81 00 0c     lwz     r4,12(r1)
    79dd8:       38 21 00 10     addi    r1,r1,16
    79ddc:       4e 80 00 20     blr

  00079de0 <__llround_power5plus>:
    79de0:       94 21 ff f0     stwu    r1,-16(r1)
    79de4:       fc 20 0b 10     frin    f1,f1
    79de8:       fc 00 0e 5e     fctidz  f0,f1
    79dec:       d8 01 00 08     stfd    f0,8(r1)
    79df0:       60 00 00 00     nop
    79df4:       60 00 00 00     nop
    79df8:       60 00 00 00     nop
    79dfc:       80 61 00 08     lwz     r3,8(r1)
    79e00:       80 81 00 0c     lwz     r4,12(r1)
    79e04:       38 21 00 10     addi    r1,r1,16
    79e08:       4e 80 00 20     blr

> --- a/sysdeps/powerpc/powerpc32/fpu/s_llround.c

> +++ b/sysdeps/powerpc/powerpc32/fpu/s_llround.c

>

> [...]

>

> +    {

> +       /* IEEE 1003.1 lround function.  IEEE specifies "round to the nearest

> +	  integer value, rounding halfway cases away from zero, regardless of

> +	  the current rounding mode."  However PowerPC Architecture defines

> +	  "round to Nearest" as "Choose the best approximation. In case of a

> +	  tie, choose the one that is even (least significant bit o).".

> +	  So we can't use the PowerPC "round to Nearest" mode. Instead we set

> +	  "round toward Zero" mode and round by adding +-0.5 before rounding

> +	  to the integer value.

> +  

   ~~
Two white-spaces here.

> --- a/sysdeps/powerpc/powerpc32/fpu/s_lround.S

> +++ /dev/null

>

> [...]

>

> -	fcmpu	cr5, fp1, fp9	/* if x >= 0x7fffffff.8p0  */

> -	fcmpu	cr1, fp1, fp8	/* if x <= -0x80000000.8p0  */


OK.  These have also been converted to c code in lround.c...

> --- /dev/null

> +++ b/sysdeps/powerpc/powerpc32/fpu/s_lround.c

>

> [...]

>

> +  if (x >= 0x7fffffff.8p0 || x <= -0x80000000.8p0)

> +    x = (x < 0.0) ? -0x1p+52 : 0x1p+52;


... Here.
Adhemerval Zanella June 25, 2019, 6:34 p.m. UTC | #2
On 24/06/2019 18:07, Gabriel F. T. Gomes wrote:
> On Fri, Mar 29 2019, Adhemerval Zanella wrote:

>>

>> This patches consolidates all the powerpc llround{f} implementations on

>> the generic sysdeps/powerpc/powerpc32/fpu/s_llround{f}.  The only missing

>> optimization is the power6x one which I could not make GCC generates

>> mftgpr for 32 bits output.

> 

> Similar to the llrint case, no harm done as such optimization wasn't

> available, anyway.

> 

>> +  /* The barrier prevents compiler from optimizing it to llround when

>> +     compiled with -fno-math-errno */

>> +  math_opt_barrier (x);

> 

> I don't actually understand what this accomplishes, and I don't see any

> difference in the code generated with and without this barrier (all my

> builds have -fno-math-errno passed to the compiler).  Could you help me

> understand this?

> 

> This is the code I get (with or without the barrier):

> 

>   00079dc0 <__llround_power6>:

>     79dc0:       fc 20 0b 10     frin    f1,f1

>     79dc4:       94 21 ff f0     stwu    r1,-16(r1)

>     79dc8:       fc 00 0e 5e     fctidz  f0,f1

>     79dcc:       d8 01 00 08     stfd    f0,8(r1)

>     79dd0:       80 61 00 08     lwz     r3,8(r1)

>     79dd4:       80 81 00 0c     lwz     r4,12(r1)

>     79dd8:       38 21 00 10     addi    r1,r1,16

>     79ddc:       4e 80 00 20     blr

> 

>   00079de0 <__llround_power5plus>:

>     79de0:       94 21 ff f0     stwu    r1,-16(r1)

>     79de4:       fc 20 0b 10     frin    f1,f1

>     79de8:       fc 00 0e 5e     fctidz  f0,f1

>     79dec:       d8 01 00 08     stfd    f0,8(r1)

>     79df0:       60 00 00 00     nop

>     79df4:       60 00 00 00     nop

>     79df8:       60 00 00 00     nop

>     79dfc:       80 61 00 08     lwz     r3,8(r1)

>     79e00:       80 81 00 0c     lwz     r4,12(r1)

>     79e04:       38 21 00 10     addi    r1,r1,16

>     79e08:       4e 80 00 20     blr

> 

>> --- a/sysdeps/powerpc/powerpc32/fpu/s_llround.c

>> +++ b/sysdeps/powerpc/powerpc32/fpu/s_llround.c


Without math_opt_barrier I am seeing with gcc 8.2.1 20190214 
(--build=powerpc64-unknown-linux-gnu --host=powerpc64-unknown-linux-gnu 
--target=powerpc-glibc-linux-gnu no extra option, built with 
build-many-glibcs.py) I see using the flags:

powerpc-glibc-linux-gnu-gcc -mcpu=power4 ../sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c -c -std=gnu11 -fgnu89-inline  -g -O2 -mcpu=power4 -Wall -Wwrite-strings -Wundef -Werror -fmerge-all-constants -frounding-math -fno-stack-protector -mhard-float -Wstrict-prototypes -Wold-style-definition -fno-math-errno -mlong-double-128   -mcpu=power6       -D__NO_MATH_INLINES -D__LIBC_INTERNAL_MATH_INLINES 

---
__llround_power6:
.LVL0:
.LFB46: 
        .file 1 "../sysdeps/powerpc/powerpc32/fpu/s_llround.c"
        .loc 1 33 1 view -0
        .cfi_startproc
        .loc 1 35 3 view .LVU1
        .loc 1 35 10 is_stmt 0 view .LVU2
        b llround
.LVL1:  
        .loc 1 35 10 view .LVU3
        .cfi_endproc
---

This is because gcc transforms the "(long long int) round (x)" to llround
and thus creates a cyclic call (this is similar to aarch64 {l}lrint 
optimization).  

As a side note, the __builtin_llround for powerpc64 generates the expected
code.

>>

>> [...]

>>

>> +    {

>> +       /* IEEE 1003.1 lround function.  IEEE specifies "round to the nearest

>> +	  integer value, rounding halfway cases away from zero, regardless of

>> +	  the current rounding mode."  However PowerPC Architecture defines

>> +	  "round to Nearest" as "Choose the best approximation. In case of a

>> +	  tie, choose the one that is even (least significant bit o).".

>> +	  So we can't use the PowerPC "round to Nearest" mode. Instead we set

>> +	  "round toward Zero" mode and round by adding +-0.5 before rounding

>> +	  to the integer value.

>> +  

>    ~~

> Two white-spaces here.


Acked.

> 

>> --- a/sysdeps/powerpc/powerpc32/fpu/s_lround.S

>> +++ /dev/null

>>

>> [...]

>>

>> -	fcmpu	cr5, fp1, fp9	/* if x >= 0x7fffffff.8p0  */

>> -	fcmpu	cr1, fp1, fp8	/* if x <= -0x80000000.8p0  */

> 

> OK.  These have also been converted to c code in lround.c...

> 

>> --- /dev/null

>> +++ b/sysdeps/powerpc/powerpc32/fpu/s_lround.c

>>

>> [...]

>>

>> +  if (x >= 0x7fffffff.8p0 || x <= -0x80000000.8p0)

>> +    x = (x < 0.0) ? -0x1p+52 : 0x1p+52;

> 

> ... Here.

>
Gabriel F. T. Gomes June 25, 2019, 6:44 p.m. UTC | #3
On Tue, Jun 25 2019, Adhemerval Zanella wrote:
>

> Without math_opt_barrier I am seeing with gcc 8.2.1 20190214 

> (--build=powerpc64-unknown-linux-gnu --host=powerpc64-unknown-linux-gnu 

> --target=powerpc-glibc-linux-gnu no extra option, built with 

> build-many-glibcs.py) I see using the flags:

> 

> powerpc-glibc-linux-gnu-gcc -mcpu=power4 ../sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c -c -std=gnu11 -fgnu89-inline  -g -O2 -mcpu=power4 -Wall -Wwrite-strings -Wundef -Werror -fmerge-all-constants -frounding-math -fno-stack-protector -mhard-float -Wstrict-prototypes -Wold-style-definition -fno-math-errno -mlong-double-128   -mcpu=power6       -D__NO_MATH_INLINES -D__LIBC_INTERNAL_MATH_INLINES 

> 

> ---

> __llround_power6:

> .LVL0:

> .LFB46: 

>         .file 1 "../sysdeps/powerpc/powerpc32/fpu/s_llround.c"

>         .loc 1 33 1 view -0

>         .cfi_startproc

>         .loc 1 35 3 view .LVU1

>         .loc 1 35 10 is_stmt 0 view .LVU2

>         b llround

> .LVL1:  

>         .loc 1 35 10 view .LVU3

>         .cfi_endproc

> ---


Oh, I see.  Thank you for the details! :)

The patch looks good to me.

Reviewed-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
diff mbox series

Patch

diff --git a/sysdeps/powerpc/powerpc32/fpu/Makefile b/sysdeps/powerpc/powerpc32/fpu/Makefile
index c79b192f60..b8b6bb0fa2 100644
--- a/sysdeps/powerpc/powerpc32/fpu/Makefile
+++ b/sysdeps/powerpc/powerpc32/fpu/Makefile
@@ -2,6 +2,7 @@  ifeq ($(subdir),math)
 # lrint is aliased to lrintf, so suppress compiler builtins to
 # avoid mismatched signatures.
 CFLAGS-s_lrint.c += -fno-builtin-lrintf
+CFLAGS-s_lround.c += -fno-builtin-lroundf
 endif
 
 ifeq ($(subdir),misc)
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_llround.c b/sysdeps/powerpc/powerpc32/fpu/s_llround.c
index 14d10e1e63..dc9f41b8e7 100644
--- a/sysdeps/powerpc/powerpc32/fpu/s_llround.c
+++ b/sysdeps/powerpc/powerpc32/fpu/s_llround.c
@@ -18,10 +18,10 @@ 
 
 #include <limits.h>
 #include <math.h>
-#include <math_ldbl_opt.h>
 #include <math_private.h>
 #include <stdint.h>
 #include <libm-alias-double.h>
+#include <math-barriers.h>
 
 /* Round to the nearest integer, with values exactly on a 0.5 boundary
    rounded away from zero, regardless of the current rounding mode.
@@ -31,9 +31,53 @@ 
 long long int
 __llround (double x)
 {
+#ifdef _ARCH_PWR5X
+  x = round (x);
+  /* The barrier prevents compiler from optimizing it to llround when
+     compiled with -fno-math-errno */
+  math_opt_barrier (x);
+  return x;
+#else
   long long xr;
   if (HAVE_PPC_FCTIDZ)
-    xr = (long long) x;
+    {
+       /* IEEE 1003.1 lround function.  IEEE specifies "round to the nearest
+	  integer value, rounding halfway cases away from zero, regardless of
+	  the current rounding mode."  However PowerPC Architecture defines
+	  "round to Nearest" as "Choose the best approximation. In case of a
+	  tie, choose the one that is even (least significant bit o).".
+	  So we can't use the PowerPC "round to Nearest" mode. Instead we set
+	  "round toward Zero" mode and round by adding +-0.5 before rounding
+	  to the integer value.
+  
+	  It is necessary to detect when x is (+-)0x1.fffffffffffffp-2
+	  because adding +-0.5 in this case will cause an erroneous shift,
+	  carry and round.  We simply return 0 if 0.5 > x > -0.5.  Likewise
+	  if x is and odd number between +-(2^52 and 2^53-1) a shift and
+	  carry will erroneously round if biased with +-0.5.  Therefore if x
+	  is greater/less than +-2^52 we don't need to bias the number with
+	  +-0.5.  */
+      double ax = fabs (x);
+
+      if (ax < 0.5)
+	return 0;
+
+      if (ax < 0x1p+52)
+	{
+	  /* Test whether an integer to avoid spurious "inexact".  */
+	  double t = ax + 0x1p+52;
+	  t = t - 0x1p+52;
+	  if (ax != t)
+	    {
+	      ax = ax + 0.5;
+	      if (x < 0.0)
+		ax = -fabs (ax);
+	      x = ax;
+	    }
+        }
+
+      return x;
+    }
   else
     {
       /* Avoid incorrect exceptions from libgcc conversions (as of GCC
@@ -80,5 +124,8 @@  __llround (double x)
 	xr -= (long long) ((unsigned long long) xr - 1) < 0;
     }
   return xr;
+#endif
 }
+#ifndef __llround
 libm_alias_double (__llround, llround)
+#endif
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_lround.S b/sysdeps/powerpc/powerpc32/fpu/s_lround.S
deleted file mode 100644
index 2d9540ceed..0000000000
--- a/sysdeps/powerpc/powerpc32/fpu/s_lround.S
+++ /dev/null
@@ -1,123 +0,0 @@ 
-/* lround function.  PowerPC32 version.
-   Copyright (C) 2004-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>
-#include <libm-alias-float.h>
-#include <libm-alias-double.h>
-
-	.section	.rodata.cst4,"aM",@progbits,4
-	.align	2
-.LC0:	/* 0.5 */
-	.long 0x3f000000
-.LC1:	/* 2^52.  */
-	.long 0x59800000
-	.section	.rodata.cst8,"aM",@progbits,8
-	.align	3
-.LC2:	/* 0x7fffffff.8p0.  */
-	.long 0x41dfffff
-	.long 0xffe00000
-.LC3:	/* -0x80000000.8p0.  */
-	.long 0xc1e00000
-	.long 0x00100000
-	.section	".text"
-
-/* long [r3] lround (float x [fp1])
-   IEEE 1003.1 lround function.  IEEE specifies "round to the nearest
-   integer value, rounding halfway cases away from zero, regardless of
-   the current rounding mode."  However PowerPC Architecture defines
-   "round to Nearest" as "Choose the best approximation. In case of a
-   tie, choose the one that is even (least significant bit o).".
-   So we can't use the PowerPC "round to Nearest" mode. Instead we set
-   "round toward Zero" mode and round by adding +-0.5 before rounding
-   to the integer value.  It is necessary to detect when x is
-   (+-)0x1.fffffffffffffp-2 because adding +-0.5 in this case will
-   cause an erroneous shift, carry and round.  We simply return 0 if
-   0.5 > x > -0.5.  */
-
-ENTRY (__lround)
-	stwu    r1,-16(r1)
-	cfi_adjust_cfa_offset (16)
-#ifdef SHARED
-	mflr	r11
-	cfi_register(lr,r11)
-	SETUP_GOT_ACCESS(r9,got_label)
-	addis	r10,r9,.LC0-got_label@ha
-	lfs	fp10,.LC0-got_label@l(r10)
-	addis	r10,r9,.LC1-got_label@ha
-	lfs	fp11,.LC1-got_label@l(r10)
-	addis	r10,r9,.LC2-got_label@ha
-	lfd	fp9,.LC2-got_label@l(r10)
-	addis	r10,r9,.LC3-got_label@ha
-	lfd	fp8,.LC3-got_label@l(r10)
-	mtlr	r11
-	cfi_same_value (lr)
-#else
-	lis	r9,.LC0@ha
-	lfs	fp10,.LC0@l(r9)
-	lis	r9,.LC1@ha
-	lfs	fp11,.LC1@l(r9)
-	lis	r9,.LC2@ha
-	lfd	fp9,.LC2@l(r9)
-	lis	r9,.LC3@ha
-	lfd	fp8,.LC3@l(r9)
-#endif
-	fabs	fp2, fp1	/* Get the absolute value of x.  */
-	fsub	fp12,fp10,fp10	/* Compute 0.0.  */
-	fcmpu	cr6, fp2, fp10	/* if |x| < 0.5  */
-	fcmpu	cr5, fp1, fp9	/* if x >= 0x7fffffff.8p0  */
-	fcmpu	cr1, fp1, fp8	/* if x <= -0x80000000.8p0  */
-	fcmpu	cr7, fp1, fp12	/* x is negative? x < 0.0  */
-	blt-	cr6,.Lretzero
-	bge-	cr5,.Loflow
-	ble-	cr1,.Loflow
-	/* Test whether an integer to avoid spurious "inexact".  */
-	fadd	fp3,fp2,fp11
-	fsub	fp3,fp3,fp11
-	fcmpu	cr5, fp2, fp3
-	beq	cr5,.Lnobias
-	fadd	fp3,fp2,fp10	/* |x|+=0.5 bias to prepare to round.  */
-	bge	cr7,.Lconvert	/* x is positive so don't negate x.  */
-	fnabs	fp3,fp3		/* -(|x|+=0.5)  */
-.Lconvert:
-	fctiwz	fp4,fp3		/* Convert to Integer word lround toward 0.  */
-	stfd	fp4,8(r1)
-	nop	/* Ensure the following load is in a different dispatch  */
-	nop	/* group to avoid pipe stall on POWER4&5.  */
-	nop
-	lwz	r3,8+LOWORD(r1)	/* Load return as integer.  */
-.Lout:
-	addi	r1,r1,16
-	blr
-.Lretzero:			/* when 0.5 > x > -0.5  */
-	li	r3,0		/* return 0.  */
-	b	.Lout
-.Lnobias:
-	fmr	fp3,fp1
-	b	.Lconvert
-.Loflow:
-	fmr	fp3,fp11
-	bge	cr7,.Lconvert
-	fnabs	fp3,fp3
-	b	.Lconvert
-	END (__lround)
-
-libm_alias_double (__lround, lround)
-
-strong_alias (__lround, __lroundf)
-libm_alias_float (__lround, lround)
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_lround.c b/sysdeps/powerpc/powerpc32/fpu/s_lround.c
new file mode 100644
index 0000000000..28c06d25d2
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_lround.c
@@ -0,0 +1,77 @@ 
+/* lround function.  PowerPC32 version.
+   Copyright (C) 2004-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 lroundf __redirect_lroundf
+#define __lroundf __redirect___lroundf
+#include <math.h>
+#undef lroundf
+#undef __lroundf
+#include <libm-alias-float.h>
+#include <libm-alias-double.h>
+
+long int
+__lround (double x)
+{
+#ifdef _ARCH_PWR5X
+  x = round (x);
+#else
+  /* Ieee 1003.1 lround function.  ieee specifies "round to the nearest
+     integer value, rounding halfway cases away from zero, regardless of
+     the current rounding mode."  however powerpc architecture defines
+     "round to nearest" as "choose the best approximation. in case of a
+     tie, choose the one that is even (least significant bit o).".
+     so we can't use the powerpc "round to nearest" mode. instead we set
+     "round toward zero" mode and round by adding +-0.5 before rounding
+     to the integer value.  it is necessary to detect when x is
+     (+-)0x1.fffffffffffffp-2 because adding +-0.5 in this case will
+     cause an erroneous shift, carry and round.  we simply return 0 if
+     0.5 > x > -0.5.  */
+
+  double ax = fabs (x);
+
+  if (ax < 0.5)
+    return 0;
+
+  if (x >= 0x7fffffff.8p0 || x <= -0x80000000.8p0)
+    x = (x < 0.0) ? -0x1p+52 : 0x1p+52;
+  else
+    {
+      /* Test whether an integer to avoid spurious "inexact".  */
+      double t = ax + 0x1p+52;
+      t = t - 0x1p+52;
+      if (ax != t)
+        {
+	  ax = ax + 0.5;
+	  if (x < 0.0)
+	    ax = -fabs (ax);
+	  x = ax;
+        }
+    }
+#endif
+  /* Force evaluation of values larger than long int, so invalid
+     exceptions are raise.  */
+  long long int ret;
+  asm ("fctiwz %0, %1" : "=d" (ret) : "d" (x));
+  return ret;
+}
+#ifndef __lround
+libm_alias_double (__lround, lround)
+
+strong_alias (__lround, __lroundf)
+libm_alias_float (__lround, lround)
+#endif
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
index d33d403a1b..60f2c95532 100644
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
@@ -23,6 +23,11 @@  CFLAGS-s_llrintf-ppc32.c += -mcpu=power4
 CFLAGS-s_llrint-power6.c += -mcpu=power6
 CFLAGS-s_llrint-ppc32.c += -mcpu=power4
 CFLAGS-s_lrint-ppc32.c += -mcpu=power4
+CFLAGS-s_llround-power6.c += -mcpu=power6
+CFLAGS-s_llround-power5+.c += -mcpu=power5+
+CFLAGS-s_llround-ppc32.c += -mcpu=power4
+CFLAGS-s_lround-ppc32.c += -mcpu=power4
+CFLAGS-s_lround-power5+.c += -mcpu=power5+
 CFLAGS-s_ceil-power5+.c = -mcpu=power5+
 CFLAGS-s_ceilf-power5+.c = -mcpu=power5+
 CFLAGS-s_modf-power5+.c = -mcpu=power5+
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.S
deleted file mode 100644
index 80fc5b0f6c..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.S
+++ /dev/null
@@ -1,31 +0,0 @@ 
-/* lround function.  PowerPC32/POWER5+ 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 weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llround __llround_power5plus
-
-#include <sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.c
new file mode 100644
index 0000000000..794fad71c2
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.c
@@ -0,0 +1,2 @@ 
+#define __llround __llround_power5plus
+#include <sysdeps/powerpc/powerpc32/fpu/s_llround.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.S
deleted file mode 100644
index d6d9a0a4cb..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.S
+++ /dev/null
@@ -1,31 +0,0 @@ 
-/* lround function.  PowerPC32/POWER6 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 weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llround __llround_power6
-
-#include <sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c
new file mode 100644
index 0000000000..2b588c4c54
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c
@@ -0,0 +1,2 @@ 
+#define __llround __llround_power6
+#include <sysdeps/powerpc/powerpc32/fpu/s_llround.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.S
deleted file mode 100644
index 085fbc6de4..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.S
+++ /dev/null
@@ -1,31 +0,0 @@ 
-/* llround function.  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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llround __llround_ppc32
-
-#include <sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.c
new file mode 100644
index 0000000000..3b5ff344bd
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.c
@@ -0,0 +1,2 @@ 
+#define __llround __llround_ppc32
+#include <sysdeps/powerpc/powerpc32/fpu/s_llround.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.S
deleted file mode 100644
index 350315e38b..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.S
+++ /dev/null
@@ -1,33 +0,0 @@ 
-/* lround function.  POWER5+, PowerPC32 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 __lround __lround_power5plus
-
-#include <sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.c
new file mode 100644
index 0000000000..d6a17c4bca
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.c
@@ -0,0 +1,2 @@ 
+#define __lround __lround_power5plus
+#include <sysdeps/powerpc/powerpc32/fpu/s_lround.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.S
deleted file mode 100644
index 245a682720..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.S
+++ /dev/null
@@ -1,31 +0,0 @@ 
-/* lround function.  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 <sysdep.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __lround __lround_ppc32
-
-#include <sysdeps/powerpc/powerpc32/fpu/s_lround.S>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.c
new file mode 100644
index 0000000000..5355e1f712
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.c
@@ -0,0 +1,2 @@ 
+#define __lround __lround_ppc32
+#include <sysdeps/powerpc/powerpc32/fpu/s_lround.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S b/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S
deleted file mode 100644
index 3d6ba34180..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S
+++ /dev/null
@@ -1,105 +0,0 @@ 
-/* llround function.  PowerPC32 on PowerPC64 version.
-   Copyright (C) 2004-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>
-#include <libm-alias-float.h>
-#include <libm-alias-double.h>
-
- .section .rodata.cst8,"aM",@progbits,8
- .align 3
- .LC0:	.long (52+127)<<23 /* 0x1p+52  */
-	.long (-1+127)<<23 /* 0.5  */
-
-	.section	".text"
-
-/* long [r3] lround (float x [fp1])
-   IEEE 1003.1 lround function.  IEEE specifies "round to the nearest
-   integer value, rounding halfway cases away from zero, regardless of
-   the current rounding mode."  However PowerPC Architecture defines
-   "round to Nearest" as "Choose the best approximation. In case of a
-   tie, choose the one that is even (least significant bit o).".
-   So we can't use the PowerPC "round to Nearest" mode. Instead we set
-   "round toward Zero" mode and round by adding +-0.5 before rounding
-   to the integer value.
-
-   It is necessary to detect when x is (+-)0x1.fffffffffffffp-2
-   because adding +-0.5 in this case will cause an erroneous shift,
-   carry and round.  We simply return 0 if 0.5 > x > -0.5.  Likewise
-   if x is and odd number between +-(2^52 and 2^53-1) a shift and
-   carry will erroneously round if biased with +-0.5.  Therefore if x
-   is greater/less than +-2^52 we don't need to bias the number with
-   +-0.5.  */
-
-ENTRY (__llround)
-	stwu    r1,-16(r1)
-	cfi_adjust_cfa_offset (16)
-#ifdef SHARED
-	mflr	r11
-	cfi_register(lr,r11)
-	SETUP_GOT_ACCESS(r9,got_label)
-	addis	r9,r9,.LC0-got_label@ha
-	addi	r9,r9,.LC0-got_label@l
-	mtlr	r11
-	cfi_same_value (lr)
-	lfs	fp9,0(r9)
-	lfs	fp10,4(r9)
-#else
-	lis r9,.LC0@ha
-	lfs fp9,.LC0@l(r9)	/* Load 2^52 into fpr9.  */
-	lfs fp10,.LC0@l+4(r9)	/* Load 0.5 into fpr10.  */
-#endif
-	fabs	fp2,fp1		/* Get the absolute value of x.  */
-	fsub	fp12,fp10,fp10	/* Compute 0.0 into fpr12.  */
-	fcmpu	cr6,fp2,fp10	/* if |x| < 0.5  */
-	fcmpu	cr7,fp2,fp9	/* if |x| >= 2^52  */
-	fcmpu	cr1,fp1,fp12	/* x is negative? x < 0.0  */
-	blt-	cr6,.Lretzero	/* 0.5 > x < -0.5 so just return 0.  */
-	bge-	cr7,.Lnobias	/* 2^52 > x < -2^52 just convert with no bias.  */
-	/* Test whether an integer to avoid spurious "inexact".  */
-	fadd	fp3,fp2,fp9
-	fsub	fp3,fp3,fp9
-	fcmpu	cr5,fp2,fp3
-	beq	cr5,.Lnobias
-	fadd	fp3,fp2,fp10	/* |x|+=0.5 bias to prepare to round.  */
-	bge	cr1,.Lconvert	/* x is positive so don't negate x.  */
-	fnabs	fp3,fp3		/* -(|x|+=0.5)  */
-.Lconvert:
-	fctidz	fp4,fp3		/* Convert to Integer double word round toward 0.  */
-	stfd	fp4,8(r1)
-	nop
-	nop
-	nop
-	lwz	r3,8+HIWORD(r1)	/* Load return as integer.  */
-	lwz	r4,8+LOWORD(r1)
-.Lout:
-	addi	r1,r1,16
-	blr
-.Lretzero:			/* 0.5 > x > -0.5  */
-	li	r3,0		/* return 0.  */
-	li	r4,0
-	b	.Lout
-.Lnobias:
-	fmr	fp3,fp1
-	b	.Lconvert
-	END (__llround)
-
-libm_alias_double (__llround, llround)
-
-strong_alias (__llround, __llroundf)
-libm_alias_float (__llround, llround)
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/s_llroundf.S b/sysdeps/powerpc/powerpc32/power4/fpu/s_llroundf.S
deleted file mode 100644
index 72d6181541..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/s_llroundf.S
+++ /dev/null
@@ -1 +0,0 @@ 
-/* __llroundf is in s_llround.S */
diff --git a/sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S b/sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S
deleted file mode 100644
index 5035170d94..0000000000
--- a/sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S
+++ /dev/null
@@ -1,53 +0,0 @@ 
-/* lround function.  POWER5+, PowerPC32 version.
-   Copyright (C) 2006-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>
-#include <libm-alias-float.h>
-#include <libm-alias-double.h>
-
-/* long [r3] llround (float x [fp1])
-   IEEE 1003.1 lround function.  IEEE specifies "round to the nearest
-   integer value, rounding halfway cases away from zero, regardless of
-   the current rounding mode."  However PowerPC Architecture defines
-   "round to Nearest" as "Choose the best approximation. In case of a
-   tie, choose the one that is even (least significant bit o).".
-   So we pre-round using the V2.02 Floating Round to Integer Nearest
-   instruction before we use the Floating Convert to Integer Word with
-   round to zero instruction.  */
-
-	.machine	"power5"
-ENTRY (__llround)
-	stwu    r1,-16(r1)
-	cfi_adjust_cfa_offset (16)
-	frin	fp2,fp1
-	fctidz	fp3,fp2		/* Convert To Integer Word lround toward 0.  */
-	stfd	fp3,8(r1)
-	nop	/* Ensure the following load is in a different dispatch  */
-	nop	/* group to avoid pipe stall on POWER4&5.  */
-	nop
-	lwz	r3,8+HIWORD(r1)
-	lwz	r4,8+LOWORD(r1)
-	addi	r1,r1,16
-	blr
-	END (__llround)
-
-libm_alias_double (__llround, llround)
-
-strong_alias (__llround, __llroundf)
-libm_alias_float (__llround, llround)
diff --git a/sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S b/sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S
deleted file mode 100644
index 030d2fdff8..0000000000
--- a/sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S
+++ /dev/null
@@ -1 +0,0 @@ 
-/* __llroundf is in s_llround.S  */
diff --git a/sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S b/sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S
deleted file mode 100644
index f30a0bff3e..0000000000
--- a/sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S
+++ /dev/null
@@ -1,51 +0,0 @@ 
-/* lround function.  POWER5+, PowerPC32 version.
-   Copyright (C) 2006-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>
-#include <libm-alias-float.h>
-#include <libm-alias-double.h>
-
-/* long [r3] lround (float x [fp1])
-   IEEE 1003.1 lround function.  IEEE specifies "round to the nearest
-   integer value, rounding halfway cases away from zero, regardless of
-   the current rounding mode."  However PowerPC Architecture defines
-   "round to Nearest" as "Choose the best approximation. In case of a
-   tie, choose the one that is even (least significant bit o).".
-   So we pre-round using the V2.02 Floating Round to Integer Nearest
-   instruction before we use the Floating Convert to Integer Word with
-   round to zero instruction.  */
-
-	.machine	"power5"
-ENTRY (__lround)
-	stwu    r1,-16(r1)
-	cfi_adjust_cfa_offset (16)
-	frin	fp2,fp1
-	fctiwz	fp3,fp2		/* Convert To Integer Word lround toward 0.  */
-	stfd	fp3,8(r1)
-	nop	/* Ensure the following load is in a different dispatch  */
-	nop	/* group to avoid pipe stall on POWER4&5.  */
-	nop
-	lwz	r3,8+LOWORD(r1)
-	addi	r1,r1,16
-	blr
-	END (__lround)
-
-libm_alias_double (__lround, lround)
-
-strong_alias (__lround, __lroundf)
-libm_alias_float (__lround, lround)
diff --git a/sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S b/sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S
deleted file mode 100644
index 7ba312cc6b..0000000000
--- a/sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S
+++ /dev/null
@@ -1,53 +0,0 @@ 
-/* lround function.  POWER5+, PowerPC32 version.
-   Copyright (C) 2006-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>
-#include <libm-alias-float.h>
-#include <libm-alias-double.h>
-
-/* long [r3] llround (float x [fp1])
-   IEEE 1003.1 lround function.  IEEE specifies "round to the nearest
-   integer value, rounding halfway cases away from zero, regardless of
-   the current rounding mode."  However PowerPC Architecture defines
-   "round to Nearest" as "Choose the best approximation. In case of a
-   tie, choose the one that is even (least significant bit o).".
-   So we pre-round using the V2.02 Floating Round to Integer Nearest
-   instruction before we use the Floating Convert to Integer Word with
-   round to zero instruction.  */
-
-	.machine	"power5"
-ENTRY (__llround)
-	stwu    r1,-16(r1)
-	cfi_adjust_cfa_offset (16)
-	frin	fp2,fp1
-	fctidz	fp3,fp2		/* Convert To Integer Word lround toward 0.  */
-	stfd	fp3,8(r1)
-/* Insure the following load is in a different dispatch group by
-   inserting "group ending nop".  */
-	ori	r1,r1,0
-	lwz	r3,8+HIWORD(r1)
-	lwz	r4,8+LOWORD(r1)
-	addi	r1,r1,16
-	blr
-	END (__llround)
-
-libm_alias_double (__llround, llround)
-
-strong_alias (__llround, __llroundf)
-libm_alias_float (__llround, llround)
diff --git a/sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S b/sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S
deleted file mode 100644
index 030d2fdff8..0000000000
--- a/sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S
+++ /dev/null
@@ -1 +0,0 @@ 
-/* __llroundf is in s_llround.S  */