Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 30 Jun 2004 23:43:49 +0000 (23:43 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 30 Jun 2004 23:43:49 +0000 (23:43 +0000)
2004-06-11  Dwayne Grant McConnell  <dgm69@us.ibm.com>

* sysdeps/powerpc/fpu/s_lround.c: Removed.
* sysdeps/powerpc/fpu/s_lroundf.c: Removed.
* sysdeps/powerpc/powerpc32/fpu/s_ceilf.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_ceil.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_floorf.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_floor.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_lrint.c: Removed.
* sysdeps/powerpc/powerpc32/fpu/s_lrint.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_lroundf.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_lround.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_rintf.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_rint.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_roundf.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_round.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_truncf.S: New file.
* sysdeps/powerpc/powerpc32/fpu/s_trunc.S: New file.

16 files changed:
ChangeLog
sysdeps/powerpc/fpu/s_lround.c [deleted file]
sysdeps/powerpc/fpu/s_lroundf.c [deleted file]
sysdeps/powerpc/powerpc32/fpu/s_ceil.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_ceilf.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_floor.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_floorf.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_lrint.S [moved from sysdeps/powerpc/powerpc32/fpu/s_lrint.c with 65% similarity]
sysdeps/powerpc/powerpc32/fpu/s_lround.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_lroundf.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_rint.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_rintf.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_round.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_roundf.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_trunc.S [new file with mode: 0644]
sysdeps/powerpc/powerpc32/fpu/s_truncf.S [new file with mode: 0644]

index 3ccd8fb..844e631 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2004-06-11  Dwayne Grant McConnell  <dgm69@us.ibm.com>
+
+       * sysdeps/powerpc/fpu/s_lround.c: Removed.
+       * sysdeps/powerpc/fpu/s_lroundf.c: Removed.
+       * sysdeps/powerpc/powerpc32/fpu/s_ceilf.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_ceil.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_floorf.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_floor.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_lrint.c: Removed.
+       * sysdeps/powerpc/powerpc32/fpu/s_lrint.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_lroundf.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_lround.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_rintf.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_rint.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_roundf.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_round.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_truncf.S: New file.
+       * sysdeps/powerpc/powerpc32/fpu/s_trunc.S: New file.
+
 2004-06-30  Ulrich Drepper  <drepper@redhat.com>
 
        * include/net/if.h: Handle if_nameindex and if_freenameindex with
diff --git a/sysdeps/powerpc/fpu/s_lround.c b/sysdeps/powerpc/fpu/s_lround.c
deleted file mode 100644 (file)
index 430bc2d..0000000
+++ /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 (file)
index 712bc74..0000000
+++ /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 (file)
index 0000000..d211314
--- /dev/null
@@ -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 (file)
index 0000000..4439dc2
--- /dev/null
@@ -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 (file)
index 0000000..143f907
--- /dev/null
@@ -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 (file)
index 0000000..154bc30
--- /dev/null
@@ -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)
+
similarity index 65%
rename from sysdeps/powerpc/powerpc32/fpu/s_lrint.c
rename to sysdeps/powerpc/powerpc32/fpu/s_lrint.S
index c78fb03..57d56c4 100644 (file)
@@ -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
    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 (file)
index 0000000..dcb97e3
--- /dev/null
@@ -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 (file)
index 0000000..e3c992d
--- /dev/null
@@ -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 (file)
index 0000000..dee25f2
--- /dev/null
@@ -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 (file)
index 0000000..cebf642
--- /dev/null
@@ -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 (file)
index 0000000..13fc74f
--- /dev/null
@@ -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 (file)
index 0000000..ea8aaf3
--- /dev/null
@@ -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 (file)
index 0000000..a4be651
--- /dev/null
@@ -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 (file)
index 0000000..9a8dae9
--- /dev/null
@@ -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)
+