From 6f57efcaa9bb32c6e6c089bcbfe100a9fbecf4d7 Mon Sep 17 00:00:00 2001 From: bumbread Date: Fri, 10 Jun 2022 23:34:51 +1100 Subject: [PATCH] non-std functions for fenv.g --- code/fenv.c | 20 ++++++++++++++++++++ inc/fenv.h | 16 ++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/code/fenv.c b/code/fenv.c index dfbd6ec..0de9a8d 100644 --- a/code/fenv.c +++ b/code/fenv.c @@ -103,3 +103,23 @@ int feupdateenv(fenv_t const *envp) { feraiseexcept(excepts); return 0; } + +int _feenabletraps(int excepts) { + if((excepts & FE_ALL_EXCEPT) != excepts) { + return 1; + } + fexcept_t csr = _mm_getcsr(); + csr &= ~fe_masks(excepts); + _mm_setcsr(csr); + return 0; +} + +int _fedisabletraps(int excepts) { + if((excepts & FE_ALL_EXCEPT) != excepts) { + return 1; + } + fexcept_t csr = _mm_getcsr(); + csr |= fe_masks(excepts); + _mm_setcsr(csr); + return 0; +} diff --git a/inc/fenv.h b/inc/fenv.h index bd49803..7e93c8b 100644 --- a/inc/fenv.h +++ b/inc/fenv.h @@ -30,16 +30,32 @@ typedef unsigned fenv_t; extern fenv_t _fe_dfl_env; #define FE_DFL_ENV (&_fe_dfl_env) +// Exceptions + int feclearexcept(int excepts); int fegetexceptflag(fexcept_t *flagp, int excepts); int feraiseexcept(int excepts); int fesetexceptflag(const fexcept_t *flagp, int excepts); int fetestexcept(int excepts); +// Rounding behaviour + int fegetround(void); int fesetround(int round); +// Environment + int fegetenv(fenv_t *env); int fesetenv(fenv_t *env); int feholdexcept(fenv_t *envp); int feupdateenv(fenv_t const *envp); + +// Non-standard functions + +int _feenabletraps(int excepts); +int _fedisabletraps(int excepts); + +#if defined(_CIABATTA_EXT) + #define feenabletraps _feenabletraps + #define _fedisabletraps _fedisabletraps +#endif \ No newline at end of file