Hi Uros! Thanks for lookin at this. I am a real newcomer to 387, and it took me a long time perusing the Intel doc, as well as glibc sources, to come up with that. The “reference” implementation of these FPU functions, the one I am confident in, is that in config/fpu-glibc.h: i.e., the functions in config/fpu-i387.h should have the same effect that config/fpu-glibc.h on i386/x86_64 hardware.
I’ll reply to your comments, but in some cases I was not sure exactly what you were saying… thanks for your help, and patience! > @@ -136,16 +165,54 @@ set_fpu (void) > __asm__ __volatile__ ("%vstmxcsr\t%0" : "=m" (cw_sse)); > > /* The SSE exception masks are shifted by 7 bits. */ > - cw_sse |= _FPU_MASK_ALL << 7; > - cw_sse &= ~(excepts << 7); > - > - /* Clear stalled exception flags. */ > - cw_sse &= ~_FPU_EX_ALL; > > You have to clear stalled SSE exceptions here. Their flags are in LSB > bits, so their position is different than the position of exception > mask bits in the control word. So, if I get you right, I should restore the "cw_sse &= ~_FPU_EX_ALL”, which I had mistakenly removed. But I’m looking at glibc-2.18/sysdeps/x86_64/fpu/feenablxcpt.c and fedisblxcpt.c, and it doesn’t seem to be done there. > + __asm__ __volatile__ ("fnstenv\t%0" : "=m" (*&temp)); > [...] > + __asm__ __volatile__ ("fldenv\t%0" : : "m" (*&temp)); > > Why do you need "*&" here? I don’t. > fldenv will also trigger exceptions with set flags on the next x87 FP insn ... > > + __asm__ __volatile__ ("%vstmxcsr\t%0" : "=m" (cw_sse)); > + > + cw_sse &= ~exc_clr; > + cw_sse |= exc_set; > + > + __asm__ __volatile__ ("%vldmxcsr\t%0" : : "m" (cw_sse)); > > ... and ldmxcsr won't trigger exceptions, neither with SSE insn. > Please see Intel documentation on FP exceptions. This code should be equivalent to glibc’s: feclearexcept (exc_clr); feraiseexcept (exc_set); So yes, raising an exception is the except action. I’ve attached a new version of config/fpu-387.h, along with the glibc version (fpu-glibc.h). I’d be glad if you could review it. Thanks a lot! FX
fpu-387.h
Description: Binary data
fpu-glibc.h
Description: Binary data