aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorwschmidt <wschmidt@138bc75d-0d04-0410-961f-82ee72b054a4>2016-02-26 19:20:54 +0000
committerwschmidt <wschmidt@138bc75d-0d04-0410-961f-82ee72b054a4>2016-02-26 19:20:54 +0000
commit9b71efb93dc5ab518d44e9afa6ca5ba055f68584 (patch)
treeb520e9e8378645bb1a8b1ca2aae14a40d523241c /libgcc
parent5b50029964594f3dd325737d1e454516112ef3ac (diff)
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233756 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog10
-rw-r--r--libgcc/config/rs6000/sfp-machine.h22
2 files changed, 23 insertions, 9 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 36d10b0450f..7587434fa31 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -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
diff --git a/libgcc/config/rs6000/sfp-machine.h b/libgcc/config/rs6000/sfp-machine.h
index 75d5e1a2d52..ab028fe4211 100644
--- a/libgcc/config/rs6000/sfp-machine.h
+++ b/libgcc/config/rs6000/sfp-machine.h
@@ -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. */