sin ( )函数
double
my_sin(double x)
{
register double ret;
__asm__ (
"fsin"
: "=t" (ret)
: "0" (x)
);
return ret;
}
cos ( )函数
double
my_cos (double x)
{
register double ret;
__asm__(
"fcos"
: "=t" (ret)
: "0" (x)
);
return ret;
}
exp ( )函数
double
my_exp(double x)
{
register double ret, value;
__asm__(
"fldl2e;"
"fmul %%st(1);"
"fst %%st(1);/n/t"
"frndint;"
"fxch;/n/t"
"fsub %%st(1);"
"f2xm1"
: "=t" (ret), "=u" (value)
: "0" (x)
);
ret += 1.0;
__asm__(
"fscale"
: "=t" (ret)
: "0" (ret), "u" (value)
);
return ret;
}
pow ( )函数
double
my_pow(double x, double y)
{
register double ret, value;
double r = 1.0;
long p = (long) y;
if (x == 0.0 && y > 0.0)
return 0.0;
if (y == (double) p)
{
if (p == 0)
return 1.0;
if (p < 0)
{
p = -p;
x = 1.0 / x;
}
while (1)
{
if (p & 1)
r *= x;
p >>= 1;
if (p == 0)
return r;
x *= x;
}
}
__asm__(
"fmul %%st(1);"
"fst %%st(1);"
"frndint;/n/t"
"fxch;/n/t"
"fsub %%st(1);/n/t"
"f2xm1;/n/t"
: "=t" (ret), "=u" (value)
: "0" (log2 (x)), "1" (y)
);
ret += 1.0;
__asm__(
"fscale"
: "=t" (ret)
: "0" (ret), "u" (value)
);
return ret;
}