[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[qemu-xen master] softfloat,m68k: disable floatx80_invalid_encoding() for m68k



commit d159dd058c7dc48a9291fde92eaae52a9f26a4d1
Author:     Laurent Vivier <laurent@xxxxxxxxx>
AuthorDate: Fri Jun 12 16:04:00 2020 +0200
Commit:     Laurent Vivier <laurent@xxxxxxxxx>
CommitDate: Mon Jul 6 21:41:52 2020 +0200

    softfloat,m68k: disable floatx80_invalid_encoding() for m68k
    
    According to the comment, this definition of invalid encoding is given
    by intel developer's manual, and doesn't comply with 680x0 FPU.
    
    With m68k, the explicit integer bit can be zero in the case of:
     - zeros                (exp == 0, mantissa == 0)
     - denormalized numbers (exp == 0, mantissa != 0)
     - unnormalized numbers (exp != 0, exp < 0x7FFF)
     - infinities           (exp == 0x7FFF, mantissa == 0)
     - not-a-numbers        (exp == 0x7FFF, mantissa != 0)
    
    For infinities and NaNs, the explicit integer bit can be either one or
    zero.
    
    The IEEE 754 standard does not define a zero integer bit. Such a number
    is an unnormalized number. Hardware does not directly support
    denormalized and unnormalized numbers, but implicitly supports them by
    trapping them as unimplemented data types, allowing efficient conversion
    in software.
    
    See "M68000 FAMILY PROGRAMMERâ??S REFERENCE MANUAL",
        "1.6 FLOATING-POINT DATA TYPES"
    
    We will implement in the m68k TCG emulator the FP_UNIMP exception to
    trap into the kernel to normalize the number. In case of linux-user,
    the number will be normalized by QEMU.
    
    Signed-off-by: Laurent Vivier <laurent@xxxxxxxxx>
    Reviewed-by: Alex Bennée <alex.bennee@xxxxxxxxxx>
    Message-Id: <20200612140400.2130118-1-laurent@xxxxxxxxx>
---
 include/fpu/softfloat.h | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
index ff4e2605b1..f1a19df066 100644
--- a/include/fpu/softfloat.h
+++ b/include/fpu/softfloat.h
@@ -794,7 +794,31 @@ static inline bool floatx80_unordered_quiet(floatx80 a, 
floatx80 b,
 *----------------------------------------------------------------------------*/
 static inline bool floatx80_invalid_encoding(floatx80 a)
 {
+#if defined(TARGET_M68K)
+    /*-------------------------------------------------------------------------
+    | With m68k, the explicit integer bit can be zero in the case of:
+    | - zeros                (exp == 0, mantissa == 0)
+    | - denormalized numbers (exp == 0, mantissa != 0)
+    | - unnormalized numbers (exp != 0, exp < 0x7FFF)
+    | - infinities           (exp == 0x7FFF, mantissa == 0)
+    | - not-a-numbers        (exp == 0x7FFF, mantissa != 0)
+    |
+    | For infinities and NaNs, the explicit integer bit can be either one or
+    | zero.
+    |
+    | The IEEE 754 standard does not define a zero integer bit. Such a number
+    | is an unnormalized number. Hardware does not directly support
+    | denormalized and unnormalized numbers, but implicitly supports them by
+    | trapping them as unimplemented data types, allowing efficient conversion
+    | in software.
+    |
+    | See "M68000 FAMILY PROGRAMMERâ??S REFERENCE MANUAL",
+    |     "1.6 FLOATING-POINT DATA TYPES"
+    *------------------------------------------------------------------------*/
+    return false;
+#else
     return (a.low & (1ULL << 63)) == 0 && (a.high & 0x7FFF) != 0;
+#endif
 }
 
 #define floatx80_zero make_floatx80(0x0000, 0x0000000000000000LL)
--
generated by git-patchbot for /home/xen/git/qemu-xen.git#master



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.