[comp.sys.m88k] Questions/problems with SIGFPE handler

sasrer@mozart.unx.sas.com (Rodney Radford) (08/18/90)

I need info on writing a user floating point exception handler that is able
to do the following:

       1) Catch the SIGFPE exception
       2) Decode the exception into one of the following types
          a) Floating point overflow
          b) Floating point underflow
          c) Floating point divide by zero
          d) Floating point to inter conversion overflow
          e) Operations on reserved operands (NANs, infinity, denormalized)
          f) Any others...
       3) And then, either:
          a) longjmp() to a previosly setjmp() address
          b) bring down the application - exit()
          c) jump to a specific instruction address
          d) return to the instruction following the faulting instruction
 
Some of the problems I am having are:

       1) How do I decode the specific type of SIGFPE exception that
          occurred? I am currently using the si_fpsr field in the
          struct siginfo structure. This works, but the MC88100 guide
          states that this register is set by software from the FPECR.
          The FPSR seems to show accumulated information, not necessarily
          what happed on the current exception. 
       2) How do I reset the bit in the FPCR if I do a longjmp to another
          address? If I just return, then the siginfo information is
          copied to the real processor registers (with the sigret), but
          how is this done otherwise? I've currently written two small
          assembly routines that allow me to get/set the fpsr - but do not
          seem to be working.
       3) The assembler (as) under DG/UX 4.30 complains with the instruction
          "fstcr   r2,fcr62" giving the error message:
          "as: "setfpsr.s": line 17: operand 'fcr62' type mismatch for 'fstcr'".
          What is wrong with this instruction? If I change the 'fcr62' to
          'cr62', it assembles OK, but this seems contrary to the assembler
          documenation in the 88open OCS.
       4) When I try to return to a specific instruction address, I currently
          use the following algorithm:
               set the SNIP to the address, with bit 1 on (V) and 0 off (E)
               set the SFIP to SNIP+4
               return from user-handler
          What should I do if the exception occurred in a delay slot, ie:
                 bcnd.n   eq0,R2,label
                 fdiv.sss R8,R2,R3     
          Do I have to look at the instruction last executed (whatever that
          was - could have gotten here by a branch), and then emulate it to 
          find out where to set the SFIP? Or if I continue to set the SFIP to 
          SNIP+4, will the branch be executed correctly?
       5) Do I have to use siglongjmp() to jump out of a handler? If so,
          do I have to use sigsetjmp() to create the original buffer? In my
          application, I do not know at setjmp() time whether I will get here
          from within an exception or not.

If anyone has any experience with 88K SIGFPE exceptions, and can offer any
advice, please do so. Thank you.

PS: Thanks for all the replies about how to catch fixed point multiply 
    overflows.
-- 
Rodney Radford        DG/UX AViiON developer        SAS Institute, Inc.
sasrer@unx.sas.com    (919) 677-8000 x7703          Box 8000, Cary, NC 27512