]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
sfp-machine.h (_FP_DECL_EX): Declare _fpsr as a union of u64 and double.
authorPaul E. Murphy <murphyp@linux.vnet.ibm.com>
Fri, 26 Feb 2016 19:20:54 +0000 (19:20 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Fri, 26 Feb 2016 19:20:54 +0000 (19:20 +0000)
2016-02-26  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>
    Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

* config/rs6000/sfp-machine.h (_FP_DECL_EX): Declare _fpsr as a
union of u64 and double.
(FP_TRAPPING_EXCEPTIONS): Return a bitmask of trapping exceptions.
(FP_INIT_ROUNDMODE): Read the fpscr instead of writing a mystery
value.
(FP_ROUNDMODE): Update the usage of _fpscr.

Co-Authored-By: Bill Schmidt <wschmidt@linux.vnet.ibm.com>
From-SVN: r233756

libgcc/ChangeLog
libgcc/config/rs6000/sfp-machine.h

index 36d10b0450faf6da735ed982f87dc6d09439ad43..7587434fa3168ca8c8fbf34b087888d57ade74c8 100644 (file)
@@ -1,3 +1,13 @@
+2016-02-26  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>
+           Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       * config/rs6000/sfp-machine.h (_FP_DECL_EX): Declare _fpsr as a
+       union of u64 and double.
+       (FP_TRAPPING_EXCEPTIONS): Return a bitmask of trapping exceptions.
+       (FP_INIT_ROUNDMODE): Read the fpscr instead of writing a mystery
+       value.
+       (FP_ROUNDMODE): Update the usage of _fpscr.
+
 2016-02-25  Ilya Verbin  <ilya.verbin@intel.com>
 
        PR driver/68463
index 75d5e1a2d522e0a3d3c5b0463fcfe9b054f7c263..ab028fe4211b10449362bf46415058dfbbd36b65 100644 (file)
@@ -130,10 +130,14 @@ void __sfp_handle_exceptions (int);
     if (__builtin_expect (_fex, 0))            \
       __sfp_handle_exceptions (_fex);          \
   } while (0);
-/* A set bit indicates an exception is masked and a clear bit indicates it is
-   trapping.  */
-# define FP_TRAPPING_EXCEPTIONS (~_fpscr & (FP_EX_ALL >> 22))
 
+/* The FP_EX_* bits track whether the exception has occurred.  This macro
+   must set the FP_EX_* bits of those exceptions which are configured to
+   trap.  The FPSCR bit which indicates this is 22 ISA bits above the
+   respective FP_EX_* bit.  Note, the ISA labels bits from msb to lsb,
+   so 22 ISA bits above is 22 bits below when counted from the lsb.  */
+# define FP_TRAPPING_EXCEPTIONS ((_fpscr.i << 22) & FP_EX_ALL)
+  
 # define FP_RND_NEAREST        0x0
 # define FP_RND_ZERO   0x1
 # define FP_RND_PINF   0x2
@@ -141,16 +145,16 @@ void __sfp_handle_exceptions (int);
 # define FP_RND_MASK   0x3
 
 # define _FP_DECL_EX \
-  unsigned long long _fpscr __attribute__ ((unused)) = FP_RND_NEAREST
-
+  union { unsigned long long i; double d; } _fpscr __attribute__ ((unused)) = \
+        { .i = FP_RND_NEAREST }
+  
 #define FP_INIT_ROUNDMODE                      \
   do {                                         \
-    __asm__ __volatile__ ("mtfsf 255, %0"      \
-                         :                     \
-                         : "f" (_fpscr));      \
+    __asm__ __volatile__ ("mffs %0"            \
+                         : "=f" (_fpscr.d));   \
   } while (0)
 
-# define FP_ROUNDMODE  (_fpscr & FP_RND_MASK)
+# define FP_ROUNDMODE  (_fpscr.i & FP_RND_MASK)
 #endif /* !__FLOAT128__ */
 
 /* Define ALIASNAME as a strong alias for NAME.  */