soft-fp: add macro FP_NO_EXCEPTIONS.

This commit is contained in:
Joseph Myers 2013-10-12 12:20:12 +00:00
parent 8399acaf7c
commit 8edc4a11cf
8 changed files with 48 additions and 12 deletions

View File

@ -1,5 +1,23 @@
2013-10-12 Joseph Myers <joseph@codesourcery.com> 2013-10-12 Joseph Myers <joseph@codesourcery.com>
* soft-fp/soft-fp.h [FP_NO_EXCEPTIONS] (FP_SET_EXCEPTION):
Undefine and redefine.
[FP_NO_EXCEPTIONS] (FP_CUR_EXCEPTIONS): Likewise.
[FP_NO_EXCEPTIONS] (FP_TRAPPING_EXCEPTIONS): Likewise.
[FP_NO_EXCEPTIONS] (FP_ROUNDMODE): Likewise.
* soft-fp/floatditf.c (FP_NO_EXCEPTIONS): Define macro.
(__floatditf): Don't use FP_DECL_EX or FP_HANDLE_EXCEPTIONS.
* soft-fp/floatsidf.c (FP_NO_EXCEPTIONS): Define macro.
(__floatsidf): Don't use FP_DECL_EX or FP_HANDLE_EXCEPTIONS.
* soft-fp/floatsitf.c (FP_NO_EXCEPTIONS): Define macro.
(__floatsitf): Don't use FP_DECL_EX or FP_HANDLE_EXCEPTIONS.
* soft-fp/floatunditf.c (FP_NO_EXCEPTIONS): Define macro.
(__floatunditf): Don't use FP_DECL_EX or FP_HANDLE_EXCEPTIONS.
* soft-fp/floatunsidf.c (FP_NO_EXCEPTIONS): Define macro.
(__floatunsidf): Don't use FP_DECL_EX or FP_HANDLE_EXCEPTIONS.
* soft-fp/floatunsitf.c (FP_NO_EXCEPTIONS): Define macro.
(__floatunsitf): Don't use FP_DECL_EX or FP_HANDLE_EXCEPTIONS.
[BZ #16032] [BZ #16032]
* soft-fp/op-2.h (_FP_DIV_MEAT_2_udiv): Shift numerator right * soft-fp/op-2.h (_FP_DIV_MEAT_2_udiv): Shift numerator right
without decrementing exponent if mantissa >= that for the without decrementing exponent if mantissa >= that for the

View File

@ -28,18 +28,17 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __floatditf(DItype i) TFtype __floatditf(DItype i)
{ {
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);
TFtype a; TFtype a;
FP_FROM_INT_Q(A, i, DI_BITS, UDItype); FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
FP_PACK_RAW_Q(a, A); FP_PACK_RAW_Q(a, A);
FP_HANDLE_EXCEPTIONS;
return a; return a;
} }

View File

@ -28,18 +28,17 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __floatsidf(SItype i) DFtype __floatsidf(SItype i)
{ {
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);
DFtype a; DFtype a;
FP_FROM_INT_D(A, i, SI_BITS, USItype); FP_FROM_INT_D(A, i, SI_BITS, USItype);
FP_PACK_RAW_D(a, A); FP_PACK_RAW_D(a, A);
FP_HANDLE_EXCEPTIONS;
return a; return a;
} }

View File

@ -28,18 +28,17 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __floatsitf(SItype i) TFtype __floatsitf(SItype i)
{ {
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);
TFtype a; TFtype a;
FP_FROM_INT_Q(A, i, SI_BITS, USItype); FP_FROM_INT_Q(A, i, SI_BITS, USItype);
FP_PACK_RAW_Q(a, A); FP_PACK_RAW_Q(a, A);
FP_HANDLE_EXCEPTIONS;
return a; return a;
} }

View File

@ -28,19 +28,18 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype TFtype
__floatunditf(UDItype i) __floatunditf(UDItype i)
{ {
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);
TFtype a; TFtype a;
FP_FROM_INT_Q(A, i, DI_BITS, UDItype); FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
FP_PACK_RAW_Q(a, A); FP_PACK_RAW_Q(a, A);
FP_HANDLE_EXCEPTIONS;
return a; return a;
} }

View File

@ -28,18 +28,17 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __floatunsidf(USItype i) DFtype __floatunsidf(USItype i)
{ {
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);
DFtype a; DFtype a;
FP_FROM_INT_D(A, i, SI_BITS, USItype); FP_FROM_INT_D(A, i, SI_BITS, USItype);
FP_PACK_RAW_D(a, A); FP_PACK_RAW_D(a, A);
FP_HANDLE_EXCEPTIONS;
return a; return a;
} }

View File

@ -28,19 +28,18 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype TFtype
__floatunsitf(USItype i) __floatunsitf(USItype i)
{ {
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);
TFtype a; TFtype a;
FP_FROM_INT_Q(A, i, SI_BITS, USItype); FP_FROM_INT_Q(A, i, SI_BITS, USItype);
FP_PACK_RAW_Q(a, A); FP_PACK_RAW_Q(a, A);
FP_HANDLE_EXCEPTIONS;
return a; return a;
} }

View File

@ -142,6 +142,30 @@
#define FP_TRAPPING_EXCEPTIONS 0 #define FP_TRAPPING_EXCEPTIONS 0
#endif #endif
/* A file using soft-fp may define FP_NO_EXCEPTIONS before including
soft-fp.h to indicate that, although a macro used there could raise
exceptions, or do rounding and potentially thereby raise
exceptions, for some arguments, for the particular arguments used
in that file no exceptions or rounding can occur. Such a file
should not itself use macros relating to handling exceptions and
rounding modes; this is only for indirect uses (in particular, in
_FP_FROM_INT and the macros it calls). */
#ifdef FP_NO_EXCEPTIONS
#undef FP_SET_EXCEPTION
#define FP_SET_EXCEPTION(ex) do {} while (0)
#undef FP_CUR_EXCEPTIONS
#define FP_CUR_EXCEPTIONS 0
#undef FP_TRAPPING_EXCEPTIONS
#define FP_TRAPPING_EXCEPTIONS 0
#undef FP_ROUNDMODE
#define FP_ROUNDMODE FP_RND_ZERO
#endif
#define _FP_ROUND_NEAREST(wc, X) \ #define _FP_ROUND_NEAREST(wc, X) \
do { \ do { \
if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND) \ if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND) \