#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; | |
} |