summaryrefslogtreecommitdiff
path: root/sysdeps/powerpc/powerpc32/fpu/s_round.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc/powerpc32/fpu/s_round.S')
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_round.S23
1 files changed, 18 insertions, 5 deletions
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_round.S b/sysdeps/powerpc/powerpc32/fpu/s_round.S
index 39eab232f6..13fc74f001 100644
--- a/sysdeps/powerpc/powerpc32/fpu/s_round.S
+++ b/sysdeps/powerpc/powerpc32/fpu/s_round.S
@@ -31,6 +31,11 @@ TWO52.0:
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
@@ -40,6 +45,9 @@ POINTFIVE.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
@@ -81,8 +89,7 @@ ENTRY (__round)
fadd fp1,fp1,fp10 /* x+= 0.5; */
fadd fp1,fp1,fp13 /* x+= TWO52; */
fsub fp1,fp1,fp13 /* x-= TWO52; */
- fabs fp1,fp1 /* if (x == 0.0) */
- /* x = 0.0; */
+.L9:
mtfsf 0x01,fp11 /* restore previous rounding mode. */
blr
.L4:
@@ -90,10 +97,16 @@ ENTRY (__round)
bge- cr6,.L9 /* if (x < 0.0) */
fsub fp1,fp9,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,.LC2@got(10)
+ lfd fp1,0(r9)
+#else
+ lis r9,.LC2@ha
+ lfd fp1,.LC2@l(r9)
+#endif
blr
END (__round)