提交 acfe6d03 编写于 作者: A Alexander Monakov 提交者: Rich Felker

math: move i386 sqrt to C with inline asm

上级 29adaeb2
#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;
}
.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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册