aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc')
-rw-r--r--sysdeps/powerpc/fpu/s_lround.c50
-rw-r--r--sysdeps/powerpc/fpu/s_lroundf.c46
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_ceil.S96
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_ceilf.S92
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_floor.S78
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_floorf.S74
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_lrint.S (renamed from sysdeps/powerpc/powerpc32/fpu/s_lrint.c)42
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_lround.S100
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_lroundf.S2
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_rint.S74
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_rintf.S68
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_round.S118
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_roundf.S114
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_trunc.S98
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_truncf.S94
15 files changed, 1023 insertions, 123 deletions
diff --git a/sysdeps/powerpc/fpu/s_lround.c b/sysdeps/powerpc/fpu/s_lround.c
deleted file mode 100644
index 430bc2d98a..0000000000
--- a/sysdeps/powerpc/fpu/s_lround.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Round double value to long int.
- Copyright (C) 1997 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <math.h>
-
-/* I think that what this routine is supposed to do is round a value
- to the nearest integer, with values exactly on the boundary rounded
- away from zero. */
-/* This routine relies on (long int)x, when x is out of range of a long int,
- clipping to MAX_LONG or MIN_LONG. */
-
-long int
-__lround (double x)
-{
- double xrf;
- long int xr;
- xr = (long int) x;
- xrf = (double) xr;
- if (x >= 0.0)
- if (x - xrf >= 0.5 && x - xrf < 1.0 && x+1 > 0)
- return x+1;
- else
- return x;
- else
- if (xrf - x >= 0.5 && xrf - x < 1.0 && x-1 < 0)
- return x-1;
- else
- return x;
-}
-weak_alias (__lround, lround)
-#ifdef NO_LONG_DOUBLE
-strong_alias (__lround, __lroundl)
-weak_alias (__lround, lroundl)
-#endif
diff --git a/sysdeps/powerpc/fpu/s_lroundf.c b/sysdeps/powerpc/fpu/s_lroundf.c
deleted file mode 100644
index 712bc74278..0000000000
--- a/sysdeps/powerpc/fpu/s_lroundf.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Round float value to long int.
- Copyright (C) 1997 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <math.h>
-
-/* I think that what this routine is supposed to do is round a value
- to the nearest integer, with values exactly on the boundary rounded
- away from zero. */
-/* This routine relies on (long int)x, when x is out of range of a long int,
- clipping to MAX_LONG or MIN_LONG. */
-
-long int
-__lroundf (float x)
-{
- float xrf;
- long int xr;
- xr = (long int) x;
- xrf = (float) xr;
- if (x >= 0.0)
- if (x - xrf >= 0.5 && x - xrf < 1.0 && x+1 > 0)
- return x+1;
- else
- return x;
- else
- if (xrf - x >= 0.5 && xrf - x < 1.0 && x-1 < 0)
- return x-1;
- else
- return x;
-}
-weak_alias (__lroundf, lroundf)
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_ceil.S b/sysdeps/powerpc/powerpc32/fpu/s_ceil.S
new file mode 100644
index 0000000000..d211314bbf
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_ceil.S
@@ -0,0 +1,96 @@
+/* ceil function. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ .section .rodata
+ .align 3
+ .type TWO52.0,@object
+ .size TWO52.0,8
+TWO52.0:
+ .long 0x43300000
+ .long 0
+ .type NEGZERO.0,@object
+ .size NEGZERO.0,8
+NEGZERO.0:
+ .long 0x80000000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 2**52 */
+ .long 0x43300000
+ .long 0
+.LC1: /* -0.0 */
+ .long 0x80000000
+ .long 0
+
+ .section ".text"
+ENTRY (__ceil)
+ mffs fp11 /* Save current FPU rounding mode. */
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp13,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp13,.LC0@l(r9)
+#endif
+ fabs fp0,fp1
+ fsub fp12,fp13,fp13 /* generate 0.0 */
+ fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ bnllr- cr7
+ mtfsfi 7,2 /* Set rounding mode toward +inf. */
+ ble- cr6,.L4
+ fadd fp1,fp1,fp13 /* x+= TWO52; */
+ fsub fp1,fp1,fp13 /* x-= TWO52; */
+.L9:
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ blr
+.L4:
+ bge- cr6,.L9 /* if (x < 0.0) */
+ fsub fp1,fp1,fp13 /* x-= TWO52; */
+ fadd fp1,fp1,fp13 /* x+= TWO52; */
+ fcmpu cr5,fp1,fp12 /* if (x > 0.0) */
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ bnelr+ cr5
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC1@got(10)
+ mtlr r11
+ lfd fp1,0(r9)
+#else
+ lis r9,.LC1@ha
+ lfd fp1,.LC1@l(r9)
+#endif
+ blr
+ END (__ceil)
+
+weak_alias (__ceil, ceil)
+
+#ifdef NO_LONG_DOUBLE
+weak_alias (__ceil, ceill)
+strong_alias (__ceil, __ceill)
+#endif
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_ceilf.S b/sysdeps/powerpc/powerpc32/fpu/s_ceilf.S
new file mode 100644
index 0000000000..4439dc2338
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_ceilf.S
@@ -0,0 +1,92 @@
+/* float ceil function. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ .section .rodata
+ .align 3
+ .type TWO52.0,@object
+ .size TWO52.0,8
+TWO52.0:
+ .long 0x43300000
+ .long 0
+ .type NEGZERO.0,@object
+ .size NEGZERO.0,8
+NEGZERO.0:
+ .long 0x80000000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 2**23 */
+ .long 0x41600000
+ .long 0
+.LC1: /* -0.0 */
+ .long 0x80000000
+ .long 0
+
+ .section ".text"
+ENTRY (__ceilf)
+ mffs fp11 /* Save current FPU rounding mode. */
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp13,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp13,.LC0@l(r9)
+#endif
+ fabs fp0,fp1
+ fsubs fp12,fp13,fp13 /* generate 0.0 */
+ fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ bnllr- cr7
+ mtfsfi 7,2 /* Set rounding mode toward +inf. */
+ ble- cr6,.L4
+ fadds fp1,fp1,fp13 /* x+= TWO23; */
+ fsubs fp1,fp1,fp13 /* x-= TWO23; */
+.L9:
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ blr
+.L4:
+ bge- cr6,.L9 /* if (x < 0.0) */
+ fsubs fp1,fp1,fp13 /* x-= TWO23; */
+ fadds fp1,fp1,fp13 /* x+= TWO23; */
+ fcmpu cr5,fp1,fp12 /* if (x > 0.0) */
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ bnelr+ cr5
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC1@got(10)
+ mtlr r11
+ lfd fp1,0(r9)
+#else
+ lis r9,.LC1@ha
+ lfd fp1,.LC1@l(r9)
+#endif
+ blr
+ END (__ceilf)
+
+weak_alias (__ceilf, ceilf)
+
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_floor.S b/sysdeps/powerpc/powerpc32/fpu/s_floor.S
new file mode 100644
index 0000000000..143f907b18
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_floor.S
@@ -0,0 +1,78 @@
+/* Floor function. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ .section .rodata
+ .align 3
+ .type TWO52.0,@object
+ .size TWO52.0,8
+TWO52.0:
+ .long 0x43300000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 2**52 */
+ .long 0x43300000
+ .long 0
+
+ .section ".text"
+ENTRY (__floor)
+ mffs fp11 /* Save current FPU rounding mode. */
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp13,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp13,.LC0@l(r9)
+#endif
+ fabs fp0,fp1
+ fsub fp12,fp13,fp13 /* generate 0.0 */
+ fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ bnllr- cr7
+ mtfsfi 7,3 /* Set rounding mode toward -inf. */
+ ble- cr6,.L4
+ fadd fp1,fp1,fp13 /* x+= TWO52; */
+ fsub fp1,fp1,fp13 /* x-= TWO52; */
+ fcmpu cr5,fp1,fp12 /* if (x > 0.0) */
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ bnelr+ cr5
+ fmr fp1,fp12 /* x must be +0.0 for the 0.0 case. */
+ blr
+.L4:
+ bge- cr6,.L9 /* if (x < 0.0) */
+ fsub fp1,fp1,fp13 /* x-= TWO52; */
+ fadd fp1,fp1,fp13 /* x+= TWO52; */
+.L9:
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ blr
+ END (__floor)
+
+weak_alias (__floor, floor)
+
+#ifdef NO_LONG_DOUBLE
+weak_alias (__floor, floorl)
+strong_alias (__floor, __floorl)
+#endif
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_floorf.S b/sysdeps/powerpc/powerpc32/fpu/s_floorf.S
new file mode 100644
index 0000000000..154bc30ff7
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_floorf.S
@@ -0,0 +1,74 @@
+/* float Floor function. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ .section .rodata
+ .align 3
+ .type TWO23.0,@object
+ .size TWO23.0,8
+TWO23.0:
+ .long 0x41600000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 2**23 */
+ .long 0x41600000
+ .long 0
+
+ .section ".text"
+ENTRY (__floorf)
+ mffs fp11 /* Save current FPU rounding mode. */
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp13,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp13,.LC0@l(r9)
+#endif
+ fabs fp0,fp1
+ fsubs fp12,fp13,fp13 /* generate 0.0 */
+ fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ bnllr- cr7
+ mtfsfi 7,3 /* Set rounding mode toward -inf. */
+ ble- cr6,.L4
+ fadds fp1,fp1,fp13 /* x+= TWO23; */
+ fsubs fp1,fp1,fp13 /* x-= TWO23; */
+ fcmpu cr5,fp1,fp12 /* if (x > 0.0) */
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ bnelr+ cr5
+ fmr fp1,fp12 /* x must be +0.0 for the 0.0 case. */
+ blr
+.L4:
+ bge- cr6,.L9 /* if (x < 0.0) */
+ fsubs fp1,fp1,fp13 /* x-= TWO23; */
+ fadds fp1,fp1,fp13 /* x+= TWO23; */
+.L9:
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ blr
+ END (__floorf)
+
+weak_alias (__floorf, floorf)
+
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_lrint.c b/sysdeps/powerpc/powerpc32/fpu/s_lrint.S
index c78fb035bd..57d56c48cd 100644
--- a/sysdeps/powerpc/powerpc32/fpu/s_lrint.c
+++ b/sysdeps/powerpc/powerpc32/fpu/s_lrint.S
@@ -1,5 +1,5 @@
-/* Round floating-point to integer. PowerPC version.
- Copyright (C) 1997,2002 Free Software Foundation, Inc.
+/* Round double to long int. PowerPC32 version.
+ Copyright (C) 2004 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
@@ -17,31 +17,19 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-/* Kludge to avoid decls that will confuse strong_alias below. */
-#define __lrintf XXX__lrintf
-#define __lrintl XXX__lrintl
-#define lrintf XXXlrintf
-#define lrintl XXXlrintl
-
-#include "math.h"
-
-#undef __lrintf
-#undef __lrintl
-#undef lrintf
-#undef lrintl
-
-
-long int
-__lrint (double x)
-{
- union
- {
- double d;
- int ll[2];
- } u;
- asm ("fctiw %0,%1" : "=f"(u.d) : "f"(x));
- return u.ll[1];
-}
+#include <sysdep.h>
+
+/* long int[r3] __lrint (double x[fp1]) */
+ENTRY (__lrint)
+ fctiw fp13,fp1
+ stfd fp13,-8(r1)
+ nop /* Insure the following load is in a different dispatch group */
+ nop /* to avoid pipe stall on POWER4&5. */
+ nop
+ lwz r3,-4(r1)
+ blr
+ END (__lrint)
+
weak_alias (__lrint, lrint)
strong_alias (__lrint, __lrintf)
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_lround.S b/sysdeps/powerpc/powerpc32/fpu/s_lround.S
new file mode 100644
index 0000000000..dcb97e373b
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_lround.S
@@ -0,0 +1,100 @@
+/* lround function. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ .section .rodata
+ .align 3
+ .type NEGZERO.0,@object
+ .size NEGZERO.0,8
+NEGZERO.0:
+ .long 0x00000000
+ .long 0
+ .type POINTFIVE.0,@object
+ .size POINTFIVE.0,8
+POINTFIVE.0:
+ .long 0x3fe00000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 0.0 */
+ .long 0x00000000
+ .long 0
+.LC1: /* 0.5 */
+ .long 0x3fe00000
+ .long 0
+
+ .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. */
+
+ENTRY (__lround)
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp12,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp12,.LC0@l(r9)
+#endif
+#ifdef SHARED
+ lwz r9,.LC1@got(10)
+ lfd fp10,0(r9)
+#else
+ lis r9,.LC1@ha
+ lfd fp10,.LC1@l(r9)
+#endif
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ ble- cr6,.L4
+ fadd fp1,fp1,fp10 /* x+= 0.5; */
+.L9:
+ fctiwz fp2,fp1 /* Convert To Integer DW lround toward 0. */
+ stfd fp2,-8(r1)
+ nop /* Insure the following load is in a different dispatch group */
+ nop /* to avoid pipe stall on POWER4&5. */
+ nop
+ lwz r3,-4(r1)
+ blr
+.L4:
+ fsub fp1,fp1,fp10 /* x-= 0.5; */
+ b .L9
+ END (__lround)
+
+strong_alias (__lround, __lround)
+weak_alias (__lround, lround)
+
+strong_alias (__lround, __lroundf)
+weak_alias (__lround, lroundf)
+
+#ifdef NO_LONG_DOUBLE
+weak_alias (__lround, lroundl)
+strong_alias (__lround, __lroundl)
+#endif
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_lroundf.S b/sysdeps/powerpc/powerpc32/fpu/s_lroundf.S
new file mode 100644
index 0000000000..e3c992d771
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_lroundf.S
@@ -0,0 +1,2 @@
+/* __lroundf is in s_lround.S */
+/* __lroundf is in s_lround.S */
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_rint.S b/sysdeps/powerpc/powerpc32/fpu/s_rint.S
new file mode 100644
index 0000000000..dee25f204f
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_rint.S
@@ -0,0 +1,74 @@
+/* Round to int floating-point values. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* This has been coded in assembler because GCC makes such a mess of it
+ when it's coded in C. */
+
+#include <sysdep.h>
+
+ .section .rodata
+ .align 3
+ .type TWO52.0,@object
+ .size TWO52.0,8
+TWO52.0:
+ .long 0x43300000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 2**52 */
+ .long 0x43300000
+ .long 0
+
+ .section ".text"
+ENTRY (__rint)
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp13,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp13,.LC0@l(r9)
+#endif
+ fabs fp0,fp1
+ fsub fp12,fp13,fp13 /* generate 0.0 */
+ fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ bnllr- cr7
+ bng- cr6,.L4
+ fadd fp1,fp1,fp13 /* x+= TWO52; */
+ fsub fp1,fp1,fp13 /* x-= TWO52; */
+ blr
+.L4:
+ bnllr- cr6 /* if (x < 0.0) */
+ fsub fp1,fp13,fp1 /* x = TWO52 - x; */
+ fsub fp0,fp1,fp13 /* x = - (x - TWO52); */
+ fneg fp1,fp0
+ blr
+ END (__rint)
+
+weak_alias (__rint, rint)
+
+#ifdef NO_LONG_DOUBLE
+weak_alias (__rint, rintl)
+strong_alias (__rint, __rintl)
+#endif
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_rintf.S b/sysdeps/powerpc/powerpc32/fpu/s_rintf.S
new file mode 100644
index 0000000000..cebf6423af
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_rintf.S
@@ -0,0 +1,68 @@
+/* Round float to int floating-point values. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+
+ .section .rodata
+ .align 3
+ .type TWO23.0,@object
+ .size TWO23.0,8
+TWO23.0:
+ .long 0x41600000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 2**23 */
+ .long 0x41600000
+ .long 0
+
+ .section ".text"
+ENTRY (__rintf)
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp13,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp13,.LC0@l(r9)
+#endif
+ fabs fp0,fp1
+ fsubs fp12,fp13,fp13 /* generate 0.0 */
+ fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ bnllr- cr7
+ bng- cr6,.L4
+ fadds fp1,fp1,fp13 /* x+= TWO23; */
+ fsubs fp1,fp1,fp13 /* x-= TWO23; */
+ blr
+.L4:
+ bnllr- cr6 /* if (x < 0.0) */
+ fsubs fp1,fp13,fp1 /* x = TWO23 - x; */
+ fsubs fp0,fp1,fp13 /* x = - (x - TWO23); */
+ fneg fp1,fp0
+ blr
+ END (__rintf)
+
+weak_alias (__rintf, rintf)
+
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_round.S b/sysdeps/powerpc/powerpc32/fpu/s_round.S
new file mode 100644
index 0000000000..13fc74f001
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_round.S
@@ -0,0 +1,118 @@
+/* round function. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ .section .rodata
+ .align 3
+ .type TWO52.0,@object
+ .size TWO52.0,8
+TWO52.0:
+ .long 0x43300000
+ .long 0
+ .type POINTFIVE.0,@object
+ .size POINTFIVE.0,8
+POINTFIVE.0:
+ .long 0x3fe00000
+ .long 0
+ .type NEGZERO.0,@object
+ .size NEGZERO.0,8
+NEGZERO.0:
+ .long 0x80000000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 2**52 */
+ .long 0x43300000
+ .long 0
+.LC1: /* 0.5 */
+ .long 0x3fe00000
+ .long 0
+.LC2: /* -0.0 */
+ .long 0x80000000
+ .long 0
+
+/* double [fp1] round (double x [fp1])
+ IEEE 1003.1 round 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. */
+
+ENTRY (__round)
+ mffs fp11 /* Save current FPU rounding mode. */
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp13,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp13,.LC0@l(r9)
+#endif
+ fabs fp0,fp1
+ fsub fp12,fp13,fp13 /* generate 0.0 */
+ fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ bnllr- cr7
+ mtfsfi 7,1 /* Set rounding mode toward 0. */
+#ifdef SHARED
+ lwz r9,.LC1@got(10)
+ lfd fp10,0(r9)
+#else
+ lis r9,.LC1@ha
+ lfd fp10,.LC1@l(r9)
+#endif
+ ble- cr6,.L4
+ fadd fp1,fp1,fp10 /* x+= 0.5; */
+ fadd fp1,fp1,fp13 /* x+= TWO52; */
+ fsub fp1,fp1,fp13 /* x-= TWO52; */
+.L9:
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ blr
+.L4:
+ fsub fp9,fp1,fp10 /* x+= 0.5; */
+ bge- cr6,.L9 /* if (x < 0.0) */
+ fsub fp1,fp9,fp13 /* x-= TWO52; */
+ fadd fp1,fp1,fp13 /* x+= TWO52; */
+ fcmpu cr5,fp1,fp12 /* if (x > 0.0) */
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ bnelr+ cr5
+#ifdef SHARED
+ lwz r9,.LC2@got(10)
+ lfd fp1,0(r9)
+#else
+ lis r9,.LC2@ha
+ lfd fp1,.LC2@l(r9)
+#endif
+ blr
+ END (__round)
+
+weak_alias (__round, round)
+
+#ifdef NO_LONG_DOUBLE
+weak_alias (__round, roundl)
+strong_alias (__round, __roundl)
+#endif
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_roundf.S b/sysdeps/powerpc/powerpc32/fpu/s_roundf.S
new file mode 100644
index 0000000000..ea8aaf3add
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_roundf.S
@@ -0,0 +1,114 @@
+/* roundf function. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ .section .rodata
+ .align 3
+ .type TWO23.0,@object
+ .size TWO23.0,8
+TWO23.0:
+ .long 0x43300000
+ .long 0
+ .type POINTFIVE.0,@object
+ .size POINTFIVE.0,8
+POINTFIVE.0:
+ .long 0x3fe00000
+ .long 0
+ .type NEGZERO.0,@object
+ .size NEGZERO.0,8
+NEGZERO.0:
+ .long 0x80000000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 2**23 */
+ .long 0x41600000
+ .long 0
+.LC1: /* 0.5 */
+ .long 0x3fe00000
+ .long 0
+.LC2: /* -0.0 */
+ .long 0x80000000
+ .long 0
+
+/* float [fp1] roundf (float x [fp1])
+ IEEE 1003.1 round 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. */
+
+ENTRY (__roundf )
+ mffs fp11 /* Save current FPU rounding mode. */
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp13,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp13,.LC0@l(r9)
+#endif
+ fabs fp0,fp1
+ fsubs fp12,fp13,fp13 /* generate 0.0 */
+ fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ bnllr- cr7
+ mtfsfi 7,1 /* Set rounding mode toward 0. */
+#ifdef SHARED
+ lwz r9,.LC1@got(10)
+ lfd fp10,0(r9)
+#else
+ lis r9,.LC1@ha
+ lfd fp10,.LC1@l(r9)
+#endif
+ ble- cr6,.L4
+ fadds fp1,fp1,fp10 /* x+= 0.5; */
+ fadds fp1,fp1,fp13 /* x+= TWO23; */
+ fsubs fp1,fp1,fp13 /* x-= TWO23; */
+.L9:
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ blr
+.L4:
+ fsubs fp9,fp1,fp10 /* x+= 0.5; */
+ bge- cr6,.L9 /* if (x < 0.0) */
+ fsubs fp1,fp9,fp13 /* x-= TWO23; */
+ fadds fp1,fp1,fp13 /* x+= TWO23; */
+ fcmpu cr5,fp1,fp12 /* if (x > 0.0) */
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ bnelr+ cr5
+#ifdef SHARED
+ lwz r9,.LC2@got(10)
+ lfd fp1,0(r9)
+#else
+ lis r9,.LC2@ha
+ lfd fp1,.LC2@l(r9)
+#endif
+ blr
+ END (__roundf)
+
+weak_alias (__roundf, roundf)
+
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_trunc.S b/sysdeps/powerpc/powerpc32/fpu/s_trunc.S
new file mode 100644
index 0000000000..a4be651f8c
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_trunc.S
@@ -0,0 +1,98 @@
+/* trunc function. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ .section .rodata
+ .align 3
+ .type TWO52.0,@object
+ .size TWO52.0,8
+TWO52.0:
+ .long 0x43300000
+ .long 0
+ .type NEGZERO.0,@object
+ .size NEGZERO.0,8
+NEGZERO.0:
+ .long 0x80000000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 2**52 */
+ .long 0x43300000
+ .long 0
+.LC1: /* -0.0 */
+ .long 0x80000000
+ .long 0
+
+/* double [fp1] trunc (double x [fp1])
+ IEEE 1003.1 trunc function. IEEE specifies "trunc to the integer
+ value, in floating format, nearest to but no larger in magnitude
+ then the argument."
+ We set "round toward Zero" mode and trunc by adding +-2**52 then
+ subtracting +-2**52. */
+
+ENTRY (__trunc)
+ mffs fp11 /* Save current FPU rounding mode. */
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp13,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp13,.LC0@l(r9)
+#endif
+ fabs fp0,fp1
+ fsub fp12,fp13,fp13 /* generate 0.0 */
+ fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52) */
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ bnllr- cr7
+ mtfsfi 7,1 /* Set rounding toward 0 mode. */
+ ble- cr6,.L4
+ fadd fp1,fp1,fp13 /* x+= TWO52; */
+ fsub fp1,fp1,fp13 /* x-= TWO52; */
+.L9:
+ mtfsf 0x01,fp11 /* restore previous truncing mode. */
+ blr
+.L4:
+ bge- cr6,.L9 /* if (x < 0.0) */
+ fsub fp1,fp1,fp13 /* x-= TWO52; */
+ fadd fp1,fp1,fp13 /* x+= TWO52; */
+ fcmpu cr5,fp1,fp12 /* if (x > 0.0) */
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ bnelr+ cr5
+#ifdef SHARED
+ lwz r9,.LC1@got(10)
+ lfd fp1,0(r9)
+#else
+ lis r9,.LC1@ha
+ lfd fp1,.LC1@l(r9)
+#endif
+ blr
+ END (__trunc)
+
+weak_alias (__trunc, trunc)
+
+#ifdef NO_LONG_DOUBLE
+weak_alias (__trunc, truncl)
+strong_alias (__trunc, __truncl)
+#endif
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_truncf.S b/sysdeps/powerpc/powerpc32/fpu/s_truncf.S
new file mode 100644
index 0000000000..9a8dae931b
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/fpu/s_truncf.S
@@ -0,0 +1,94 @@
+/* truncf function. PowerPC32 version.
+ Copyright (C) 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ .section .rodata
+ .align 3
+ .type TWO23.0,@object
+ .size TWO23.0,8
+TWO23.0:
+ .long 0x41600000
+ .long 0
+ .type NEGZERO.0,@object
+ .size NEGZERO.0,8
+NEGZERO.0:
+ .long 0x80000000
+ .long 0
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .align 3
+.LC0: /* 2**23 */
+ .long 0x41600000
+ .long 0
+.LC1: /* -0.0 */
+ .long 0x80000000
+ .long 0
+
+/* float [fp1] truncf (float x [fp1])
+ IEEE 1003.1 trunc function. IEEE specifies "trunc to the integer
+ value, in floating format, nearest to but no larger in magnitude
+ then the argument."
+ We set "round toward Zero" mode and trunc by adding +-2**23 then
+ subtracting +-2**23. */
+
+ENTRY (__truncf)
+ mffs fp11 /* Save current FPU rounding mode. */
+#ifdef SHARED
+ mflr r11
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r10
+ lwz r9,.LC0@got(10)
+ mtlr r11
+ lfd fp13,0(r9)
+#else
+ lis r9,.LC0@ha
+ lfd fp13,.LC0@l(r9)
+#endif
+ fabs fp0,fp1
+ fsubs fp12,fp13,fp13 /* generate 0.0 */
+ fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
+ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
+ bnllr- cr7
+ mtfsfi 7,1 /* Set rounding toward 0 mode. */
+ ble- cr6,.L4
+ fadds fp1,fp1,fp13 /* x+= TWO23; */
+ fsubs fp1,fp1,fp13 /* x-= TWO23; */
+.L9:
+ mtfsf 0x01,fp11 /* restore previous truncing mode. */
+ blr
+.L4:
+ bge- cr6,.L9 /* if (x < 0.0) */
+ fsubs fp1,fp1,fp13 /* x-= TWO23; */
+ fadds fp1,fp1,fp13 /* x+= TWO23; */
+ fcmpu cr5,fp1,fp12 /* if (x > 0.0) */
+ mtfsf 0x01,fp11 /* restore previous rounding mode. */
+ bnelr+ cr5
+#ifdef SHARED
+ lwz r9,.LC1@got(10)
+ lfd fp1,0(r9)
+#else
+ lis r9,.LC1@ha
+ lfd fp1,.LC1@l(r9)
+#endif
+ blr
+ END (__truncf)
+
+weak_alias (__truncf, truncf)
+