[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] target-i386/FPU: wrong conversion infinity from
From: |
Dmitry Poletaev |
Subject: |
Re: [Qemu-devel] [PATCH] target-i386/FPU: wrong conversion infinity from float80 to int32/int64 |
Date: |
Tue, 11 Nov 2014 15:29:39 +0300 |
From: Dmitry Poletaev <address@hidden>
Signed-off-by: Dmitry Poletaev <address@hidden>
---
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" <address@hidden>:
> On 14 October 2014 12:38, Dmitry Poletaev <address@hidden> wrote:
>> 29.07.2014, 23:07, "Richard Henderson" <address@hidden>:
>>> 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
- Re: [Qemu-devel] [PATCH] target-i386/FPU: wrong conversion infinity from float80 to int32/int64,
Dmitry Poletaev <=