1/* Copyright (C) 2007-2022 Free Software Foundation, Inc. 2 3This file is part of GCC. 4 5GCC is free software; you can redistribute it and/or modify it under 6the terms of the GNU General Public License as published by the Free 7Software Foundation; either version 3, or (at your option) any later 8version. 9 10GCC is distributed in the hope that it will be useful, but WITHOUT ANY 11WARRANTY; without even the implied warranty of MERCHANTABILITY or 12FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13for more details. 14 15Under Section 7 of GPL version 3, you are granted additional 16permissions described in the GCC Runtime Library Exception, version 173.1, as published by the Free Software Foundation. 18 19You should have received a copy of the GNU General Public License and 20a copy of the GCC Runtime Library Exception along with this program; 21see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 22<http://www.gnu.org/licenses/>. */ 23 24#include "bid_internal.h" 25#include "bid_gcc_intrinsics.h" 26 27#if DECIMAL_GLOBAL_ROUNDING 28BID_THREAD _IDEC_round _IDEC_glbround = ROUNDING_TO_NEAREST; 29 30#if DECIMAL_GLOBAL_ROUNDING_ACCESS_FUNCTIONS 31void 32__dfp_set_round (int mode) { 33 _IDEC_glbround = mode; 34} 35 36int 37__dfp_get_round (void) { 38 return _IDEC_glbround; 39} 40#endif 41#endif 42 43#if DECIMAL_GLOBAL_EXCEPTION_FLAGS 44BID_THREAD _IDEC_flags _IDEC_glbflags = EXACT_STATUS; 45 46#if DECIMAL_GLOBAL_EXCEPTION_FLAGS_ACCESS_FUNCTIONS 47#include <fenv.h> 48 49void 50__dfp_clear_except (void) { 51 _IDEC_glbflags &= ~FLAG_MASK; 52} 53 54int 55__dfp_test_except (int mask) { 56 int flags = 0; 57 58 if ((_IDEC_glbflags & INEXACT_EXCEPTION) != 0) 59 flags |= mask & FE_INEXACT; 60 if ((_IDEC_glbflags & UNDERFLOW_EXCEPTION) != 0) 61 flags |= mask & FE_UNDERFLOW; 62 if ((_IDEC_glbflags & OVERFLOW_EXCEPTION) != 0) 63 flags |= mask & FE_OVERFLOW; 64 if ((_IDEC_glbflags & ZERO_DIVIDE_EXCEPTION) != 0) 65 flags |= mask & FE_DIVBYZERO; 66 if ((_IDEC_glbflags & INVALID_EXCEPTION) != 0) 67 flags |= mask & FE_INVALID; 68 69 return flags; 70} 71 72void 73__dfp_raise_except (int mask) { 74 _IDEC_flags flags = 0; 75 76 if ((mask & FE_INEXACT) != 0) 77 flags |= INEXACT_EXCEPTION; 78 if ((mask & FE_UNDERFLOW) != 0) 79 flags |= UNDERFLOW_EXCEPTION; 80 if ((mask & FE_OVERFLOW) != 0) 81 flags |= OVERFLOW_EXCEPTION; 82 if ((mask & FE_DIVBYZERO) != 0) 83 flags |= ZERO_DIVIDE_EXCEPTION; 84 if ((mask & FE_INVALID) != 0) 85 flags |= INVALID_EXCEPTION; 86 87 _IDEC_glbflags |= flags; 88} 89#endif 90#endif 91 92#if DECIMAL_ALTERNATE_EXCEPTION_HANDLING 93#if DECIMAL_GLOBAL_EXCEPTION_MASKS 94BID_THREAD _IDEC_exceptionmasks _IDEC_glbexceptionmasks = 95 _IDEC_allexcmasksset; 96#endif 97#if DECIMAL_GLOBAL_EXCEPTION_INFO 98BID_THREAD _IDEC_excepthandling _IDEC_glbexcepthandling; 99#endif 100#endif 101