summaryrefslogtreecommitdiff
path: root/sysdeps/powerpc/powerpc32/fpu/s_trunc.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc/powerpc32/fpu/s_trunc.S')
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_trunc.S64
1 files changed, 36 insertions, 28 deletions
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_trunc.S b/sysdeps/powerpc/powerpc32/fpu/s_trunc.S
index 5bc0856b9f..a4be651f8c 100644
--- a/sysdeps/powerpc/powerpc32/fpu/s_trunc.S
+++ b/sysdeps/powerpc/powerpc32/fpu/s_trunc.S
@@ -1,5 +1,5 @@
/* trunc function. PowerPC32 version.
- Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+ 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
@@ -14,16 +14,32 @@
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., 1 Franklin Street, Fifth Floor, Boston MA
- 02110-1301 USA. */
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
#include <sysdep.h>
-#include <math_ldbl_opt.h>
- .section .rodata.cst4,"aM",@progbits,4
- .align 2
+ .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 0x59800000
+ .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
@@ -32,28 +48,18 @@
We set "round toward Zero" mode and trunc by adding +-2**52 then
subtracting +-2**52. */
- .section ".text"
ENTRY (__trunc)
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
- lfs fp13,.LC0-1b@l(r9)
-# else
bl _GLOBAL_OFFSET_TABLE_@local-4
mflr r10
lwz r9,.LC0@got(10)
- lfs fp13,0(r9)
-# endif
mtlr r11
- cfi_same_value (lr)
+ lfd fp13,0(r9)
#else
lis r9,.LC0@ha
- lfs fp13,.LC0@l(r9)
+ lfd fp13,.LC0@l(r9)
#endif
fabs fp0,fp1
fsub fp12,fp13,fp13 /* generate 0.0 */
@@ -64,18 +70,23 @@ ENTRY (__trunc)
ble- cr6,.L4
fadd fp1,fp1,fp13 /* x+= TWO52; */
fsub fp1,fp1,fp13 /* x-= TWO52; */
- fabs fp1,fp1 /* if (x == 0.0) */
- /* x = 0.0; */
- mtfsf 0x01,fp11 /* restore previous rounding mode. */
+.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; */
- fnabs fp1,fp1 /* if (x == 0.0) */
- /* x = -0.0; */
-.L9:
+ 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)
@@ -85,6 +96,3 @@ weak_alias (__trunc, trunc)
weak_alias (__trunc, truncl)
strong_alias (__trunc, __truncl)
#endif
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __trunc, truncl, GLIBC_2_1)
-#endif