From e7bcf43b6440ac9fc61a0eef5591393810daafb5 Mon Sep 17 00:00:00 2001 From: Joakim Tjernlund Date: Sat, 31 Mar 2007 13:28:15 +0000 Subject: From Steve Papacharalambous: Add math support for PowerPC e500. --- libm/powerpc/classic/s_nearbyint.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 libm/powerpc/classic/s_nearbyint.c (limited to 'libm/powerpc/classic/s_nearbyint.c') diff --git a/libm/powerpc/classic/s_nearbyint.c b/libm/powerpc/classic/s_nearbyint.c new file mode 100644 index 000000000..068e21378 --- /dev/null +++ b/libm/powerpc/classic/s_nearbyint.c @@ -0,0 +1,38 @@ +#include +#include + +/******************************************************************************* +* * +* The function nearbyint rounds its double argument to integral value * +* according to the current rounding direction and returns the result in * +* double format. This function does not signal inexact. * +* * +******************************************************************************** +* * +* This function calls fabs and copysign. * +* * +*******************************************************************************/ + +static const double twoTo52 = 4503599627370496.0; + +libm_hidden_proto(nearbyint) +double nearbyint ( double x ) + { + double y; + double OldEnvironment; + + y = twoTo52; + + asm ("mffs %0" : "=f" (OldEnvironment)); /* get the environement */ + + if ( fabs ( x ) >= y ) /* huge case is exact */ + return x; + if ( x < 0 ) y = -y; /* negative case */ + y = ( x + y ) - y; /* force rounding */ + if ( y == 0.0 ) /* zero results mirror sign of x */ + y = copysign ( y, x ); +// restore old flags + asm ("mtfsf 255,%0" : /*NULLOUT*/ : /*IN*/ "f" ( OldEnvironment )); + return ( y ); + } +libm_hidden_def(nearbyint) -- cgit v1.2.3