mirror of https://git.musl-libc.org/git/musl
committed by
Rich Felker
2 changed files with 15 additions and 21 deletions
@ -0,0 +1,15 @@ |
|||||
|
#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; |
||||
|
} |
||||
@ -1,21 +0,0 @@ |
|||||
.global sqrt |
|
||||
.type sqrt,@function |
|
||||
sqrt: fldl 4(%esp) |
|
||||
fsqrt |
|
||||
fnstsw %ax |
|
||||
sub $12,%esp |
|
||||
fld %st(0) |
|
||||
fstpt (%esp) |
|
||||
mov (%esp),%ecx |
|
||||
and $0x7ff,%ecx |
|
||||
cmp $0x400,%ecx |
|
||||
jnz 1f |
|
||||
and $0x200,%eax |
|
||||
sub $0x100,%eax |
|
||||
sub %eax,(%esp) |
|
||||
fstp %st(0) |
|
||||
fldt (%esp) |
|
||||
1: add $12,%esp |
|
||||
fstpl 4(%esp) |
|
||||
fldl 4(%esp) |
|
||||
ret |
|
||||
Loading…
Reference in new issue