cygwin 3.5.4-1: signal handling destroys 'long double' values

Takashi Yano takashi.yano@nifty.ne.jp
Tue Oct 8 11:20:57 GMT 2024


On Mon, 7 Oct 2024 15:11:52 +0200
Christian Franke wrote:
> $ gcc -o sigtest -O2 sigtest.c
> 
> $ ./sigtest > out.txt
> (press ^C 42x :-)
> 
> $ sort out.txt | uniq -c
>        3 x = 0x1.23456789p+0, y = -nan, d = -nan
>        6 x = 0x1.23456789p+0, y = 0x1.23456789p+0, d = -nan
>       33 x = 0x1.23456789p+0, y = 0x1.23456789p+0, d = 0x0p+0
> 
> The problem also occurs if compiled without -O2, but less often. No 
> problem occurs if compiled with -DWORKS which suggests that only 'long 
> double' is affected.

Thanks for the report. I looked into this problem and might find the
cause. It seems due to a bug of scripts/gendef. It generates signal
handler caller (sigfe.s) which stores/restores the registers.

In sigdelayed, control word is stored/restored by fnstcw/fldcw instruction,
however, fninit instruction destroys some status registers in FPU (x87).

I think we shold use fnstenv/fldenv rather than fnstcw/fldcw and fninit.
However, I'm not familiar with x87 instructions, so I may overlook
something.

Could anyone expert of x87 instructions and sigfe stuff give some
comments?

-- 
Takashi Yano <takashi.yano@nifty.ne.jp>


More information about the Cygwin mailing list