fegetenv and fegetexceptflag read MXCSR via __mingw_setfp_sse(). On i386 targets without SSE support, this can fault. Keep the SSE status word zeroed and only read it when __mingw_has_sse() reports support.
Bug: https://sourceforge.net/p/mingw-w64/bugs/1026/ Signed-off-by: Xuntao Chi <[email protected]> --- mingw-w64-crt/misc/fegetenv.c | 5 +++-- mingw-w64-crt/misc/fegetexceptflag.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/mingw-w64-crt/misc/fegetenv.c b/mingw-w64-crt/misc/fegetenv.c index c1169cda7..165832f5d 100644 --- a/mingw-w64-crt/misc/fegetenv.c +++ b/mingw-w64-crt/misc/fegetenv.c @@ -13,11 +13,12 @@ int fegetenv(fenv_t *env) { #if defined(__i386__) || (defined(__x86_64__) && !defined(__arm64ec__)) - unsigned int x87, sse; + unsigned int x87, sse = 0; __mingw_control87_2(0, 0, &x87, &sse); env->_Fe_ctl = fenv_encode(x87, sse); __mingw_setfp(NULL, 0, &x87, 0); - __mingw_setfp_sse(NULL, 0, &sse, 0); + if (__mingw_has_sse()) + __mingw_setfp_sse(NULL, 0, &sse, 0); env->_Fe_stat = fenv_encode(x87, sse); #else env->_Fe_ctl = fenv_encode(0, __mingw_controlfp(0, 0)); diff --git a/mingw-w64-crt/misc/fegetexceptflag.c b/mingw-w64-crt/misc/fegetexceptflag.c index cc9bdde4b..ed1eee627 100644 --- a/mingw-w64-crt/misc/fegetexceptflag.c +++ b/mingw-w64-crt/misc/fegetexceptflag.c @@ -15,9 +15,10 @@ int fegetexceptflag(fexcept_t *status, int excepts) { #if defined(__i386__) || (defined(__x86_64__) && !defined(__arm64ec__)) - unsigned int x87, sse; + unsigned int x87, sse = 0; __mingw_setfp(NULL, 0, &x87, 0); - __mingw_setfp_sse(NULL, 0, &sse, 0); + if (__mingw_has_sse()) + __mingw_setfp_sse(NULL, 0, &sse, 0); *status = fenv_encode(x87 & excepts, sse & excepts); #else *status = fenv_encode(0, __mingw_statusfp() & excepts); -- 2.43.0 _______________________________________________ Mingw-w64-public mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
