about summary refs log tree commit diff
path: root/soft-fp/soft-fp.h
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-03-11 01:14:15 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-03-11 01:14:34 +0000
commit068a6274556f9f362443648f4fd47525c8cf2dba (patch)
treeabf011f3003985f34b109d3dbfdb96c934336a17 /soft-fp/soft-fp.h
parent44a6213c8eebf3f69712a5fba9a33bbb90a79023 (diff)
downloadglibc-068a6274556f9f362443648f4fd47525c8cf2dba.tar.gz
glibc-068a6274556f9f362443648f4fd47525c8cf2dba.tar.xz
glibc-068a6274556f9f362443648f4fd47525c8cf2dba.zip
soft-fp: Add _FP_UNREACHABLE.
This patch makes soft-fp use a new macro _FP_UNREACHABLE in place of
calling abort in unreachable default cases of switch statements.
_FP_UNREACHABLE expands to call __builtin_unreachable for GCC 4.5 and
later; the fallback to abort is thus only for kernel use.

Tested for powerpc-nofpu that installed stripped shared libraries are
unchanged by this patch.  Also tested with the math/ tests for mips64
(in the case of fma there *was* previously an abort call generated,
unlike for the other operations - one switch only deals with a subset
of classes for one operand based on what could have been generated in
the earlier part of fma, whereas the other switches deal with all
combinations of two classes - and this is apparently too complicated
for the default case to have been optimized away).

	* soft-fp/soft-fp.h (_FP_UNREACHABLE): New macro.
	* soft-fp/op-common.h (_FP_MUL): Use _FP_UNREACHABLE instead of
	abort.
	(_FP_FMA): Likewise.
	(_FP_DIV): Likewise.
Diffstat (limited to 'soft-fp/soft-fp.h')
-rw-r--r--soft-fp/soft-fp.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/soft-fp/soft-fp.h b/soft-fp/soft-fp.h
index bb68df9160..b247125a39 100644
--- a/soft-fp/soft-fp.h
+++ b/soft-fp/soft-fp.h
@@ -51,6 +51,15 @@
 # endif
 #endif
 
+/* For unreachable default cases in switch statements over bitwise OR
+   of FP_CLS_* values.  */
+#if (defined __GNUC__							\
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)))
+# define _FP_UNREACHABLE	__builtin_unreachable ()
+#else
+# define _FP_UNREACHABLE	abort ()
+#endif
+
 /* In the Linux kernel, some architectures have a single function that
    uses different kinds of unpacking and packing depending on the
    instruction being emulated, meaning it is not readily visible to