1 /* Software floating-point exception handling emulation. 2 Copyright (C) 2002-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library. If not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #include <signal.h> 20 #include "soft-fp.h" 21 #include "soft-supp.h" 22 23 /* Thread-local to store sticky exceptions. */ 24 __thread int __sim_exceptions_thread; 25 libc_hidden_tls_def (__sim_exceptions_thread); 26 27 /* By default, no exceptions should trap. */ 28 __thread int __sim_disabled_exceptions_thread = 0xffffffff; 29 libc_hidden_tls_def (__sim_disabled_exceptions_thread); 30 31 __thread int __sim_round_mode_thread; 32 libc_hidden_tls_def (__sim_round_mode_thread); 33 34 #if SIM_GLOBAL_COMPAT 35 int __sim_exceptions_global; 36 libc_hidden_data_def (__sim_exceptions_global); 37 SIM_COMPAT_SYMBOL (__sim_exceptions_global, __sim_exceptions); 38 39 int __sim_disabled_exceptions_global = 0xffffffff; 40 libc_hidden_data_def (__sim_disabled_exceptions_global); 41 SIM_COMPAT_SYMBOL (__sim_disabled_exceptions_global, 42 __sim_disabled_exceptions); 43 44 int __sim_round_mode_global; 45 libc_hidden_data_def (__sim_round_mode_global); 46 SIM_COMPAT_SYMBOL (__sim_round_mode_global, __sim_round_mode); 47 #endif 48 49 void __simulate_exceptions(int x)50__simulate_exceptions (int x) 51 { 52 __sim_exceptions_thread |= x; 53 SIM_SET_GLOBAL (__sim_exceptions_global, __sim_exceptions_thread); 54 if (x & ~__sim_disabled_exceptions_thread) 55 raise (SIGFPE); 56 } 57