diff options
Diffstat (limited to 'sysdeps/powerpc/powerpc32/fpu/s_round.S')
-rw-r--r-- | sysdeps/powerpc/powerpc32/fpu/s_round.S | 23 |
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) |