diff options
Diffstat (limited to 'sysdeps/powerpc')
-rw-r--r-- | sysdeps/powerpc/powerpc32/fpu/s_fabsl.S | 21 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/s_fabsl.S | 5 |
2 files changed, 21 insertions, 5 deletions
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_fabsl.S b/sysdeps/powerpc/powerpc32/fpu/s_fabsl.S index 0462d20630..866e817008 100644 --- a/sysdeps/powerpc/powerpc32/fpu/s_fabsl.S +++ b/sysdeps/powerpc/powerpc32/fpu/s_fabsl.S @@ -24,11 +24,28 @@ ENTRY(__fabsl) /* long double [f1,f2] fabs (long double [f1,f2] x); fabs(x,y) returns a value with the magnitude of x and with the sign bit of y. */ +#ifdef _ARCH_PPCGR + /* fsel available. */ fmr fp0,fp1 +#else + /* Use integer operations to test sign of high part to avoid + exceptions on sNaNs. */ + stwu r1,-16(r1) + cfi_adjust_cfa_offset (16) + stfd fp1,8(r1) +#endif fabs fp1,fp1 - fcmpu cr1,fp0,fp1 - beqlr cr1 +#ifdef _ARCH_PPCGR + fneg fp3,fp2 + fsel fp2,fp0,fp2,fp3 +#else + lwz r3,8+HIWORD(r1) + cmpwi cr6,r3,0 + addi r1,r1,16 + cfi_adjust_cfa_offset (-16) + bgelr cr6 fneg fp2,fp2 +#endif blr END (__fabsl) diff --git a/sysdeps/powerpc/powerpc64/fpu/s_fabsl.S b/sysdeps/powerpc/powerpc64/fpu/s_fabsl.S index 0462d20630..1f8f05e091 100644 --- a/sysdeps/powerpc/powerpc64/fpu/s_fabsl.S +++ b/sysdeps/powerpc/powerpc64/fpu/s_fabsl.S @@ -26,9 +26,8 @@ ENTRY(__fabsl) with the sign bit of y. */ fmr fp0,fp1 fabs fp1,fp1 - fcmpu cr1,fp0,fp1 - beqlr cr1 - fneg fp2,fp2 + fneg fp3,fp2 + fsel fp2,fp0,fp2,fp3 blr END (__fabsl) |