summaryrefslogtreecommitdiff
path: root/sysdeps/powerpc/powerpc32/fpu/s_roundf.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc/powerpc32/fpu/s_roundf.S')
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_roundf.S69
1 files changed, 25 insertions, 44 deletions
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_roundf.S b/sysdeps/powerpc/powerpc32/fpu/s_roundf.S
index ea8aaf3add..7e99bca315 100644
--- a/sysdeps/powerpc/powerpc32/fpu/s_roundf.S
+++ b/sysdeps/powerpc/powerpc32/fpu/s_roundf.S
@@ -1,5 +1,5 @@
/* roundf function. PowerPC32 version.
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2006 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
@@ -14,40 +14,17 @@
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. */
+ Software Foundation, Inc., 1 Franklin Street, Fifth Floor, Boston MA
+ 02110-1301 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
+ .align 2
.LC0: /* 2**23 */
- .long 0x41600000
- .long 0
+ .long 0x4b000000
.LC1: /* 0.5 */
- .long 0x3fe00000
- .long 0
-.LC2: /* -0.0 */
- .long 0x80000000
- .long 0
+ .long 0x3f000000
/* float [fp1] roundf (float x [fp1])
IEEE 1003.1 round function. IEEE specifies "round to the nearest
@@ -59,18 +36,28 @@ NEGZERO.0:
"Round toward Zero" mode and round by adding +-0.5 before rounding
to the integer value. */
+ .section ".text"
ENTRY (__roundf )
mffs fp11 /* Save current FPU rounding mode. */
#ifdef SHARED
mflr r11
+ cfi_register(lr,r11)
+# ifdef HAVE_ASM_PPC_REL16
+ bcl 20,31,1f
+1: mflr r9
+ addis r9,r9,.LC0-1b@ha
+ addi r9,r9,.LC0-1b@l
+# else
bl _GLOBAL_OFFSET_TABLE_@local-4
mflr r10
lwz r9,.LC0@got(10)
+# endif
mtlr r11
- lfd fp13,0(r9)
+ cfi_same_value (lr)
+ lfs fp13,0(r9)
#else
lis r9,.LC0@ha
- lfd fp13,.LC0@l(r9)
+ lfs fp13,.LC0@l(r9)
#endif
fabs fp0,fp1
fsubs fp12,fp13,fp13 /* generate 0.0 */
@@ -79,17 +66,17 @@ ENTRY (__roundf )
bnllr- cr7
mtfsfi 7,1 /* Set rounding mode toward 0. */
#ifdef SHARED
- lwz r9,.LC1@got(10)
- lfd fp10,0(r9)
+ lfs fp10,.LC1-.LC0(r9)
#else
lis r9,.LC1@ha
- lfd fp10,.LC1@l(r9)
+ lfs 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:
+ fabs fp1,fp1 /* if (x == 0.0) */
+ /* x = 0.0; */
mtfsf 0x01,fp11 /* restore previous rounding mode. */
blr
.L4:
@@ -97,16 +84,10 @@ ENTRY (__roundf )
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) */
+ fnabs fp1,fp1 /* if (x == 0.0) */
+ /* x = -0.0; */
+.L9:
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)