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.
This commit is contained in:
Ulrich Drepper 2004-06-30 23:43:49 +00:00
parent 442c29abe5
commit f9f70e68fa
16 changed files with 1040 additions and 121 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View 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
@ -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 <sysdep.h>
#include "math.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)
#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];
}
weak_alias (__lrint, lrint)
strong_alias (__lrint, __lrintf)

View File

@ -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

View File

@ -0,0 +1,2 @@
/* __lroundf is in s_lround.S */
/* __lroundf is in s_lround.S */

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)