Revision a2c9ed3c

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