From: Dmitry Poletaev <poletaev-q...@yandex.ru> Signed-off-by: Dmitry Poletaev <poletaev-q...@yandex.ru>
--- target-i386/fpu_helper.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/target-i386/fpu_helper.c b/target-i386/fpu_helper.c index ab19b71..fc25a03 100644 --- a/target-i386/fpu_helper.c +++ b/target-i386/fpu_helper.c @@ -251,16 +251,34 @@ int32_t helper_fist_ST0(CPUX86State *env) int32_t helper_fistl_ST0(CPUX86State *env) { 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); + 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; } int64_t helper_fistll_ST0(CPUX86State *env) { int64_t val; - - val = floatx80_to_int64(ST0, &env->fp_status); + 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); + 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; } -- 1.8.4.msysgit.0 14.10.2014, 15:56, "Peter Maydell" <peter.mayd...@linaro.org>: > On 14 October 2014 12:38, Dmitry Poletaev <poletaev-q...@yandex.ru> wrote: >> 29.07.2014, 23:07, "Richard Henderson" <r...@twiddle.net>: >>> On 07/23/2014 05:04 AM, Dmitry Poletaev wrote: >>>> + if (env->fp_status.float_exception_flags & FPUS_IE) { >>> Mixing bit masks. s/FPUS_IE/float_status_invalid/ > > [Please don't top-post.] >> What do you mean? > > Richard means that the set of defined flags for > float_exception_flags does not include "FPUS_IE" > (which is defining a symbolic constant for a bit > in an x86 register). You want to use "float_flag_invalid". > (The two happen to have the same value, 1, which is why > your code worked by accident.) > > thanks > -- PMM