frankc@mips.COM (Frank Cianflone) (01/03/91)
/* You may try this: calling sequence: integer condition logical old,new,setfpe old = setfpe(condition,new) The value of condition must be one of the following: 1 - Invalid Operation Condition 2 - Divide By Zero Condition 3 - Inexact Result Condition 4 - Overflow Condition The value of new must be .TRUE. or .FALSE. depending on whether we want to enable or disable the floating point exception signal when the given condition occurrs. The return value of the setfpe function is a logical value indicating if the floating point exception signal was enabled for that condition when the setfpe function was called. The following is an example of the use of the setfpe function: */ integer SIGFPE,DIVIDE0 parameter (SIGFPE=8,DIVIDE0=2) logical old,setfpe external fperror data a/0.0/ old = setfpe(DIVIDE0,.true.) isig = signal(SIGFPE,fperror,-1) b = 1.0/b print *,b end */ #include <signal.h> #ifdef SYSV #include <sys/fpu.h> #else #include <machine/fpu.h> #endif #define WORD 0 #define INVALID 1 #define DIVIDE0 2 #define INEXACT 3 #define OVERFLOW 4 setfpe_(exception,flag) int *exception,*flag; { int retval; union fpc_csr fpc_csr; extern unsigned long get_fpc_csr(); extern unsigned long set_fpc_csr(); fpc_csr.fc_word = get_fpc_csr(); switch ( *exception ) { case WORD: retval = fpc_csr.fc_word; fpc_csr.fc_word = *flag; break; case INVALID: retval = fpc_csr.fc_struct.en_invalid; fpc_csr.fc_struct.en_invalid = *flag ? 1 : 0; break; case DIVIDE0: retval = fpc_csr.fc_struct.en_invalid; fpc_csr.fc_struct.en_divide0 = *flag ? 1 : 0; break; case INEXACT: retval = fpc_csr.fc_struct.en_invalid; fpc_csr.fc_struct.en_inexact = *flag ? 1 : 0; break; case OVERFLOW: retval = fpc_csr.fc_struct.en_invalid; fpc_csr.fc_struct.en_overflow = *flag ? 1 : 0; break; default: return(0); } (void)set_fpc_csr(fpc_csr.fc_word); return(retval); } -- Frank Cianflone {ames,decwrl,prls,pyramid}!mips!frankc MIPS Computer Systems frankc@mips.com 930 Arques Ave, Sunnyvale CA, 94086 Ma Bell: (408)524-7460 Fax: (408)524-7521