target-i386: Wrong conversion infinity from float80 to int32/int64
Signed-off-by: Dmitry Poletaev <poletaev-qemu@yandex.ru> Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
99c9c3cb24
commit
ea32aaf1a7
@ -251,16 +251,34 @@ int32_t helper_fist_ST0(CPUX86State *env)
|
|||||||
int32_t helper_fistl_ST0(CPUX86State *env)
|
int32_t helper_fistl_ST0(CPUX86State *env)
|
||||||
{
|
{
|
||||||
int32_t val;
|
int32_t val;
|
||||||
|
signed char old_exp_flags;
|
||||||
|
|
||||||
|
old_exp_flags = get_float_exception_flags(&env->fp_status);
|
||||||
|
set_float_exception_flags(0, &env->fp_status);
|
||||||
|
|
||||||
val = floatx80_to_int32(ST0, &env->fp_status);
|
val = floatx80_to_int32(ST0, &env->fp_status);
|
||||||
|
if (get_float_exception_flags(&env->fp_status) & float_flag_invalid) {
|
||||||
|
val = 0x80000000;
|
||||||
|
}
|
||||||
|
set_float_exception_flags(get_float_exception_flags(&env->fp_status)
|
||||||
|
| old_exp_flags, &env->fp_status);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t helper_fistll_ST0(CPUX86State *env)
|
int64_t helper_fistll_ST0(CPUX86State *env)
|
||||||
{
|
{
|
||||||
int64_t val;
|
int64_t val;
|
||||||
|
signed char old_exp_flags;
|
||||||
|
|
||||||
val = floatx80_to_int64(ST0, &env->fp_status);
|
old_exp_flags = get_float_exception_flags(&env->fp_status);
|
||||||
|
set_float_exception_flags(0, &env->fp_status);
|
||||||
|
|
||||||
|
val = floatx80_to_int32(ST0, &env->fp_status);
|
||||||
|
if (get_float_exception_flags(&env->fp_status) & float_flag_invalid) {
|
||||||
|
val = 0x8000000000000000ULL;
|
||||||
|
}
|
||||||
|
set_float_exception_flags(get_float_exception_flags(&env->fp_status)
|
||||||
|
| old_exp_flags, &env->fp_status);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user