Revision a2c9ed3c target-i386/op_helper.c
b/target-i386/op_helper.c | ||
---|---|---|
17 | 17 |
* License along with this library; if not, see <http://www.gnu.org/licenses/>. |
18 | 18 |
*/ |
19 | 19 |
|
20 |
#include <math.h> |
|
20 | 21 |
#include "exec.h" |
21 | 22 |
#include "exec-all.h" |
22 | 23 |
#include "host-utils.h" |
... | ... | |
3981 | 3982 |
|
3982 | 3983 |
void helper_f2xm1(void) |
3983 | 3984 |
{ |
3984 |
ST0 = pow(2.0,ST0) - 1.0; |
|
3985 |
double val = CPU86_LDouble_to_double(ST0); |
|
3986 |
val = pow(2.0, val) - 1.0; |
|
3987 |
ST0 = double_to_CPU86_LDouble(val); |
|
3985 | 3988 |
} |
3986 | 3989 |
|
3987 | 3990 |
void helper_fyl2x(void) |
3988 | 3991 |
{ |
3989 |
CPU86_LDouble fptemp;
|
|
3992 |
double fptemp = CPU86_LDouble_to_double(ST0);
|
|
3990 | 3993 |
|
3991 |
fptemp = ST0; |
|
3992 | 3994 |
if (fptemp>0.0){ |
3993 |
fptemp = log(fptemp)/log(2.0); /* log2(ST) */ |
|
3994 |
ST1 *= fptemp; |
|
3995 |
fptemp = log(fptemp)/log(2.0); /* log2(ST) */ |
|
3996 |
fptemp *= CPU86_LDouble_to_double(ST1); |
|
3997 |
ST1 = double_to_CPU86_LDouble(fptemp); |
|
3995 | 3998 |
fpop(); |
3996 | 3999 |
} else { |
3997 | 4000 |
env->fpus &= (~0x4700); |
... | ... | |
4001 | 4004 |
|
4002 | 4005 |
void helper_fptan(void) |
4003 | 4006 |
{ |
4004 |
CPU86_LDouble fptemp;
|
|
4007 |
double fptemp = CPU86_LDouble_to_double(ST0);
|
|
4005 | 4008 |
|
4006 |
fptemp = ST0; |
|
4007 | 4009 |
if((fptemp > MAXTAN)||(fptemp < -MAXTAN)) { |
4008 | 4010 |
env->fpus |= 0x400; |
4009 | 4011 |
} else { |
4010 |
ST0 = tan(fptemp); |
|
4012 |
fptemp = tan(fptemp); |
|
4013 |
ST0 = double_to_CPU86_LDouble(fptemp); |
|
4011 | 4014 |
fpush(); |
4012 |
ST0 = 1.0;
|
|
4015 |
ST0 = floatx_one;
|
|
4013 | 4016 |
env->fpus &= (~0x400); /* C2 <-- 0 */ |
4014 | 4017 |
/* the above code is for |arg| < 2**52 only */ |
4015 | 4018 |
} |
... | ... | |
4017 | 4020 |
|
4018 | 4021 |
void helper_fpatan(void) |
4019 | 4022 |
{ |
4020 |
CPU86_LDouble fptemp, fpsrcop;
|
|
4023 |
double fptemp, fpsrcop;
|
|
4021 | 4024 |
|
4022 |
fpsrcop = ST1;
|
|
4023 |
fptemp = ST0;
|
|
4024 |
ST1 = atan2(fpsrcop,fptemp);
|
|
4025 |
fpsrcop = CPU86_LDouble_to_double(ST1);
|
|
4026 |
fptemp = CPU86_LDouble_to_double(ST0);
|
|
4027 |
ST1 = double_to_CPU86_LDouble(atan2(fpsrcop, fptemp));
|
|
4025 | 4028 |
fpop(); |
4026 | 4029 |
} |
4027 | 4030 |
|
... | ... | |
4159 | 4162 |
|
4160 | 4163 |
void helper_fyl2xp1(void) |
4161 | 4164 |
{ |
4162 |
CPU86_LDouble fptemp;
|
|
4165 |
double fptemp = CPU86_LDouble_to_double(ST0);
|
|
4163 | 4166 |
|
4164 |
fptemp = ST0; |
|
4165 | 4167 |
if ((fptemp+1.0)>0.0) { |
4166 | 4168 |
fptemp = log(fptemp+1.0) / log(2.0); /* log2(ST+1.0) */ |
4167 |
ST1 *= fptemp; |
|
4169 |
fptemp *= CPU86_LDouble_to_double(ST1); |
|
4170 |
ST1 = double_to_CPU86_LDouble(fptemp); |
|
4168 | 4171 |
fpop(); |
4169 | 4172 |
} else { |
4170 | 4173 |
env->fpus &= (~0x4700); |
... | ... | |
4183 | 4186 |
|
4184 | 4187 |
void helper_fsincos(void) |
4185 | 4188 |
{ |
4186 |
CPU86_LDouble fptemp;
|
|
4189 |
double fptemp = CPU86_LDouble_to_double(ST0);
|
|
4187 | 4190 |
|
4188 |
fptemp = ST0; |
|
4189 | 4191 |
if ((fptemp > MAXTAN)||(fptemp < -MAXTAN)) { |
4190 | 4192 |
env->fpus |= 0x400; |
4191 | 4193 |
} else { |
4192 |
ST0 = sin(fptemp);
|
|
4194 |
ST0 = double_to_CPU86_LDouble(sin(fptemp));
|
|
4193 | 4195 |
fpush(); |
4194 |
ST0 = cos(fptemp);
|
|
4196 |
ST0 = double_to_CPU86_LDouble(cos(fptemp));
|
|
4195 | 4197 |
env->fpus &= (~0x400); /* C2 <-- 0 */ |
4196 | 4198 |
/* the above code is for |arg| < 2**63 only */ |
4197 | 4199 |
} |
... | ... | |
4214 | 4216 |
|
4215 | 4217 |
void helper_fsin(void) |
4216 | 4218 |
{ |
4217 |
CPU86_LDouble fptemp;
|
|
4219 |
double fptemp = CPU86_LDouble_to_double(ST0);
|
|
4218 | 4220 |
|
4219 |
fptemp = ST0; |
|
4220 | 4221 |
if ((fptemp > MAXTAN)||(fptemp < -MAXTAN)) { |
4221 | 4222 |
env->fpus |= 0x400; |
4222 | 4223 |
} else { |
4223 |
ST0 = sin(fptemp);
|
|
4224 |
ST0 = double_to_CPU86_LDouble(sin(fptemp));
|
|
4224 | 4225 |
env->fpus &= (~0x400); /* C2 <-- 0 */ |
4225 | 4226 |
/* the above code is for |arg| < 2**53 only */ |
4226 | 4227 |
} |
... | ... | |
4228 | 4229 |
|
4229 | 4230 |
void helper_fcos(void) |
4230 | 4231 |
{ |
4231 |
CPU86_LDouble fptemp;
|
|
4232 |
double fptemp = CPU86_LDouble_to_double(ST0);
|
|
4232 | 4233 |
|
4233 |
fptemp = ST0; |
|
4234 | 4234 |
if((fptemp > MAXTAN)||(fptemp < -MAXTAN)) { |
4235 | 4235 |
env->fpus |= 0x400; |
4236 | 4236 |
} else { |
4237 |
ST0 = cos(fptemp);
|
|
4237 |
ST0 = double_to_CPU86_LDouble(cos(fptemp));
|
|
4238 | 4238 |
env->fpus &= (~0x400); /* C2 <-- 0 */ |
4239 | 4239 |
/* the above code is for |arg5 < 2**63 only */ |
4240 | 4240 |
} |
Also available in: Unified diff