Hi J.H., On Aug 3 01:45, J.H. van de Water wrote: > fegetenv() in winsup/cygwin/fenv.cc > > fnstenv MUST be followed by fldenv in fegetenv(), as the former disables all > exceptions in the x87 FPU, which is not appropriate here (fegetenv() ). > fldenv after fnstenv should reload the x87 FPU w/ the configuration that was > saved by fnstenv, i.e. a configuration that might have exceptions enabled. > > Note: x86_64 uses SSE for floating-point, not the x87 FPU. However, because > feraiseexcept() attempts to provoke an exception using the x87 FPU, the bug > in fegetenv() will make this attempt futile here (x86_64). > > Note: WoW uses the x87 FPU for floating-point, not SSE. Here anything that > would normally result in triggering an exception, not only feraiseexcept(), > will not be able to, as result of the bug in fegetenv(). > --- > winsup/cygwin/fenv.cc | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/winsup/cygwin/fenv.cc b/winsup/cygwin/fenv.cc > index bd3f904..eb5260c 100644 > --- a/winsup/cygwin/fenv.cc > +++ b/winsup/cygwin/fenv.cc > @@ -141,7 +141,10 @@ fegetexcept (void) > int > fegetenv (fenv_t *envp) > { > - __asm__ volatile ("fnstenv %0" : "=m" (envp->_fpu) : ); > + /* fnstenv disables all exceptions in the x87 FPU; as this is not what is > + desired here, reload the cfg saved from the x87 FPU, back to the FPU */ > + __asm__ volatile ("fnstenv %0" > + "fldenv %0" : "=m" (envp->_fpu) : ); > if (use_sse) > __asm__ volatile ("stmxcsr %0" : "=m" (envp->_sse_mxcsr) : ); > return 0; > -- > 2.7.5
Thank you! Pushed with tweaks. The string in __asm__ statements works a bit different and I made a slight change to the commit message. In terms of x86_64, do we have to change the fenv stuff completely to use only SSE opcodes? Does that make sense at all? Thanks, Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Maintainer cygwin AT cygwin DOT com Red Hat
signature.asc
Description: PGP signature