Instead of pseudo-pointers. This changes ABI. --- mingw-w64-crt/misc/fesetenv.c | 32 --------------------------- mingw-w64-headers/crt/fenv.h | 41 ++++++++++++++++------------------- 2 files changed, 19 insertions(+), 54 deletions(-)
diff --git a/mingw-w64-crt/misc/fesetenv.c b/mingw-w64-crt/misc/fesetenv.c index ac0dffe46..5a4426a30 100644 --- a/mingw-w64-crt/misc/fesetenv.c +++ b/mingw-w64-crt/misc/fesetenv.c @@ -24,38 +24,6 @@ int fesetenv(const fenv_t *env) unsigned int x87_cw, cw, x87_stat, stat; unsigned int mask = ~0u; -#if defined(__i386__) || defined(__x86_64__) -# if !defined(__arm64ec__) - if (env == FE_PC64_ENV) - { - /* - * fninit initializes the control register to 0x37f, - * the status register to zero and the tag word to 0FFFFh. - * The other registers are unaffected. - */ - __asm__ __volatile__ ("fninit"); - return 0; - } -# endif /* __arm64ec__ */ - if (env == FE_PC53_ENV) - { - /* - * MS _fpreset() does same *except* it sets control word - * to 0x27f (53-bit precision). - * We force calling _fpreset in msvcrt.dll - */ - - (* __MINGW_IMP_SYMBOL(_fpreset))(); - return 0; - } -#endif /* defined(__i386__) || defined(__x86_64__) */ - if (env == FE_DFL_ENV) - { - /* Use the choice made at app startup */ - _fpreset(); - return 0; - } - if (!env->_Fe_ctl && !env->_Fe_stat) { _fpreset(); return 0; diff --git a/mingw-w64-headers/crt/fenv.h b/mingw-w64-headers/crt/fenv.h index d5161757d..3ef5d5cb1 100644 --- a/mingw-w64-headers/crt/fenv.h +++ b/mingw-w64-headers/crt/fenv.h @@ -46,28 +46,6 @@ #ifndef RC_INVOKED -#if defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) - -/* If the default argument is used we use this value. */ -#define FE_DFL_ENV ((const fenv_t *) -1l) - -#else - -/*The C99 standard (7.6.9) allows us to define implementation-specific macros for - different fp environments */ - -/* The default Intel x87 floating point environment (64-bit mantissa) */ -#define FE_PC64_ENV ((const fenv_t *)-1) - -/* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */ -#define FE_PC53_ENV ((const fenv_t *)-2) - -/* The FE_DFL_ENV macro is required by standard. - fesetenv will use the environment set at app startup.*/ -#define FE_DFL_ENV ((const fenv_t *) 0) - -#endif /* defined(_ARM_) || defined(__arm__) */ - typedef struct { unsigned long _Fe_ctl; @@ -81,6 +59,25 @@ typedef unsigned long fexcept_t; extern "C" { #endif +/* The FE_DFL_ENV macro is required by standard. + fesetenv will use the environment set at app startup.*/ +extern const __MINGW_SELECTANY fenv_t __mingw_fe_dfl_env = { 0, 0 }; +#define FE_DFL_ENV (&__mingw_fe_dfl_env) + +/*The C99 standard (7.6.9) allows us to define implementation-specific macros for + different fp environments */ +#if defined(__i386__) || defined(__x86_64__) + +/* The default Intel x87 floating point environment (64-bit mantissa) */ +extern const __MINGW_SELECTANY fenv_t __mingw_fe_pc64_env = { 0x3f3f003f, 0 }; +#define FE_PC64_ENV (&__mingw_fe_pc64_env) + +/* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */ +extern const __MINGW_SELECTANY fenv_t __mingw_fe_pc53_env = { 0x3f3f103f, 0 }; +#define FE_PC53_ENV (&__mingw_fe_pc53_env) + +#endif + /*TODO: Some of these could be inlined */ /* 7.6.2 Exception */ -- 2.48.1 _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public