diff options
Diffstat (limited to 'sysdeps/powerpc/powerpc32/fpu/s_floorf.S')
-rw-r--r-- | sysdeps/powerpc/powerpc32/fpu/s_floorf.S | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_floorf.S b/sysdeps/powerpc/powerpc32/fpu/s_floorf.S index ead41d4657..154bc30ff7 100644 --- a/sysdeps/powerpc/powerpc32/fpu/s_floorf.S +++ b/sysdeps/powerpc/powerpc32/fpu/s_floorf.S @@ -20,16 +20,18 @@ #include <sysdep.h> .section .rodata - .align 2 + .align 3 .type TWO23.0,@object - .size TWO23.0,4 + .size TWO23.0,8 TWO23.0: - .long 0x4b000000 + .long 0x41600000 + .long 0 - .section .rodata.cst4,"aM",@progbits,4 - .align 2 + .section .rodata.cst8,"aM",@progbits,8 + .align 3 .LC0: /* 2**23 */ - .long 0x4b000000 + .long 0x41600000 + .long 0 .section ".text" ENTRY (__floorf) @@ -40,10 +42,10 @@ ENTRY (__floorf) mflr r10 lwz r9,.LC0@got(10) mtlr r11 - lfs fp13,0(r9) + lfd fp13,0(r9) #else lis r9,.LC0@ha - lfs fp13,.LC0@l(r9) + lfd fp13,.LC0@l(r9) #endif fabs fp0,fp1 fsubs fp12,fp13,fp13 /* generate 0.0 */ @@ -54,16 +56,15 @@ ENTRY (__floorf) ble- cr6,.L4 fadds fp1,fp1,fp13 /* x+= TWO23; */ fsubs fp1,fp1,fp13 /* x-= TWO23; */ - fabs fp1,fp1 /* if (x == 0.0) */ - /* x = 0.0; */ + 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; */ - fnabs fp1,fp1 /* if (x == 0.0) */ - /* x = -0.0; */ .L9: mtfsf 0x01,fp11 /* restore previous rounding mode. */ blr |