From 068a6274556f9f362443648f4fd47525c8cf2dba Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 11 Mar 2015 01:14:15 +0000 Subject: 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. --- soft-fp/op-common.h | 8 ++++---- soft-fp/soft-fp.h | 9 +++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) (limited to 'soft-fp') diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h index 0a2f86aad9..83c2156954 100644 --- a/soft-fp/op-common.h +++ b/soft-fp/op-common.h @@ -927,7 +927,7 @@ break; \ \ default: \ - abort (); \ + _FP_UNREACHABLE; \ } \ } \ while (0) @@ -1092,7 +1092,7 @@ break; \ \ default: \ - abort (); \ + _FP_UNREACHABLE; \ } \ \ /* T = X * Y is zero, infinity or NaN. */ \ @@ -1148,7 +1148,7 @@ break; \ \ default: \ - abort (); \ + _FP_UNREACHABLE; \ } \ done_fma: ; \ } \ @@ -1215,7 +1215,7 @@ break; \ \ default: \ - abort (); \ + _FP_UNREACHABLE; \ } \ } \ while (0) 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 -- cgit 1.4.1