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