16 lines
443 B
C
16 lines
443 B
C
#include "libm.h"
|
|
|
|
double sqrt(double x)
|
|
{
|
|
union ldshape ux;
|
|
unsigned fpsr;
|
|
__asm__ ("fsqrt; fnstsw %%ax": "=t"(ux.f), "=a"(fpsr) : "0"(x));
|
|
if ((ux.i.m & 0x7ff) != 0x400)
|
|
return (double)ux.f;
|
|
/* Rounding to double would have encountered an exact halfway case.
|
|
Adjust mantissa downwards if fsqrt rounded up, else upwards.
|
|
(result of fsqrt could not have been exact) */
|
|
ux.i.m ^= (fpsr & 0x200) + 0x300;
|
|
return (double)ux.f;
|
|
}
|