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.5Thank 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
