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.
This commit is contained in:
Joseph Myers 2015-03-11 01:14:15 +00:00
parent 44a6213c8e
commit 068a627455
3 changed files with 21 additions and 4 deletions

View File

@ -1,3 +1,11 @@
2015-03-11 Joseph Myers <joseph@codesourcery.com>
* 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.
2015-03-10 Roland McGrath <roland@hack.frob.com> 2015-03-10 Roland McGrath <roland@hack.frob.com>
* scripts/evaluate-test.sh: Grok exit code 77 as UNSUPPORTED and exit * scripts/evaluate-test.sh: Grok exit code 77 as UNSUPPORTED and exit

View File

@ -927,7 +927,7 @@
break; \ break; \
\ \
default: \ default: \
abort (); \ _FP_UNREACHABLE; \
} \ } \
} \ } \
while (0) while (0)
@ -1092,7 +1092,7 @@
break; \ break; \
\ \
default: \ default: \
abort (); \ _FP_UNREACHABLE; \
} \ } \
\ \
/* T = X * Y is zero, infinity or NaN. */ \ /* T = X * Y is zero, infinity or NaN. */ \
@ -1148,7 +1148,7 @@
break; \ break; \
\ \
default: \ default: \
abort (); \ _FP_UNREACHABLE; \
} \ } \
done_fma: ; \ done_fma: ; \
} \ } \
@ -1215,7 +1215,7 @@
break; \ break; \
\ \
default: \ default: \
abort (); \ _FP_UNREACHABLE; \
} \ } \
} \ } \
while (0) while (0)

View File

@ -51,6 +51,15 @@
# endif # endif
#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 /* In the Linux kernel, some architectures have a single function that
uses different kinds of unpacking and packing depending on the uses different kinds of unpacking and packing depending on the
instruction being emulated, meaning it is not readily visible to instruction being emulated, meaning it is not readily visible to