[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: |
Thu, 24 Jul 2014 14:57:26 +0400 |
23.07.2014, 21:13, "Peter Maydell" <address@hidden>:
> On 23 July 2014 16:04, Dmitry Poletaev <address@hidden> wrote:
>> I'm understood. So, am I right?
> Pretty much, except it's better to use the accessor functions
> get_float_exception_flags() and set_float_exception_flags().
>> + if (env->fp_status.float_exception_flags & FPUS_IE) {
>> + val = 0x8000000000000000;
> Also this constant needs a "ULL" suffix or it won't build on
> 32 bit hosts.
>
> thanks
> -- PMM
Done.
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 1b2900d..e3543a8 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) & FPUS_IE) {
+ 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) & FPUS_IE) {
+ 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