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