qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]