static void ieee0(bool enableTrap)
{
  TEUCHOS_TEST_FOR_EXCEPTION(
    enableTrap == false, std::logic_error,
    "Error, don't know how to turn off trap for Alpha!"
    );
	ieee_set_fp_control(IEEE_TRAP_ENABLE_INV);
}
Example #2
0
void HardwareInit( void )
{
#ifdef osf1
   unsigned long fpcontrolmask = 0x000000;  
   fpcontrolmask |=  IEEE_INHERIT ;
   fpcontrolmask |=  IEEE_TRAP_ENABLE_INV ;
   fpcontrolmask |=  IEEE_TRAP_ENABLE_DZE ;
   fpcontrolmask |=  IEEE_TRAP_ENABLE_OVF ;
   fpcontrolmask |=  IEEE_MAP_DMZ ; 
   fpcontrolmask |=  IEEE_MAP_UMZ ; 
   ieee_set_fp_control( fpcontrolmask ) ;
#endif
}
Example #3
0
static PyObject *turnoff_sigfpe(PyObject *self,PyObject *args)
{
#ifdef __FreeBSD__
    fpresetsticky(fpgetsticky());
    fpsetmask(0);
#elif defined(__VMS)
	IEEE clrmsk;
	 clrmsk.ieee$q_flags =
		IEEE$M_TRAP_ENABLE_UNF |  IEEE$M_TRAP_ENABLE_INE |
		IEEE$M_MAP_UMZ | IEEE$M_TRAP_ENABLE_INV |
		IEEE$M_TRAP_ENABLE_DZE | IEEE$M_TRAP_ENABLE_OVF |
		IEEE$M_INHERIT;
	sys$ieee_set_fp_control(&clrmsk, 0, 0);
#else
    fputs("Operation not implemented\n", stderr);
#endif
    Py_INCREF(Py_None);
    return Py_None;
}
Example #4
0
static void fpe_reset(Sigfunc *handler)
{
    /* Reset the exception handling machinery, and reset the signal
     * handler for SIGFPE to the given handler.
     */

/*-- SunOS and Solaris ----------------------------------------------------*/
#if defined(sun)
    /* References: ieee_handler, ieee_sun, ieee_functions, and ieee_flags
       man pages (SunOS or Solaris)
       cc -c -I/usr/local/python/include fpectlmodule.c
       ld -G -o fpectlmodule.so -L/opt/SUNWspro/lib fpectlmodule.o -lsunmath -lm
     */
#include <math.h>
#ifndef _SUNMATH_H
    extern void nonstandard_arithmetic(void);
    extern int ieee_flags(const char*, const char*, const char*, char **);
    extern long ieee_handler(const char*, const char*, sigfpe_handler_type);
#endif

    char *mode="exception", *in="all", *out;
    (void) nonstandard_arithmetic();
    (void) ieee_flags("clearall",mode,in,&out);
    (void) ieee_handler("set","common",(sigfpe_handler_type)handler);
    PyOS_setsig(SIGFPE, handler);

/*-- HPUX -----------------------------------------------------------------*/
#elif defined(__hppa) || defined(hppa)
    /* References:   fpsetmask man page */
    /* cc -Aa +z -c -I/usr/local/python/include fpectlmodule.c */
    /* ld -b -o fpectlmodule.sl fpectlmodule.o -lm */
#include <math.h>
    fpsetdefaults();
    PyOS_setsig(SIGFPE, handler);

/*-- IBM AIX --------------------------------------------------------------*/
#elif defined(__AIX) || defined(_AIX)
    /* References:   fp_trap, fp_enable man pages */
#include <fptrap.h>
    fp_trap(FP_TRAP_SYNC);
    fp_enable(TRP_INVALID | TRP_DIV_BY_ZERO | TRP_OVERFLOW);
    PyOS_setsig(SIGFPE, handler);

/*-- DEC ALPHA LINUX ------------------------------------------------------*/
#elif defined(__alpha) && defined(linux)
#include <asm/fpu.h>
    unsigned long fp_control =
    IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE | IEEE_TRAP_ENABLE_OVF;
    ieee_set_fp_control(fp_control);
    PyOS_setsig(SIGFPE, handler);

/*-- Cray Unicos ----------------------------------------------------------*/
#elif defined(cray)
    /* UNICOS delivers SIGFPE by default, but no matherr */
#ifdef HAS_LIBMSET
    libmset(-1);
#endif
    PyOS_setsig(SIGFPE, handler);

/*-- FreeBSD ----------------------------------------------------------------*/
#elif defined(__FreeBSD__)
    fpresetsticky(fpgetsticky());
    fpsetmask(FP_X_INV | FP_X_DZ | FP_X_OFL);
    PyOS_setsig(SIGFPE, handler);

/*-- Linux ----------------------------------------------------------------*/
#elif defined(linux)
#ifdef __GLIBC__
#include <fpu_control.h>
#else
#include <i386/fpu_control.h>
#endif
#ifdef _FPU_SETCW
    {
        fpu_control_t cw = 0x1372;
        _FPU_SETCW(cw);
    }
#else
    __setfpucw(0x1372);
#endif
    PyOS_setsig(SIGFPE, handler);

/*-- Microsoft Windows, NT ------------------------------------------------*/
#elif defined(_MSC_VER)
    /* Reference: Visual C++ Books Online 4.2,
       Run-Time Library Reference, _control87, _controlfp */
#include <float.h>
    unsigned int cw = _EM_INVALID | _EM_ZERODIVIDE | _EM_OVERFLOW;
    (void)_controlfp(0, cw);
    PyOS_setsig(SIGFPE, handler);

/*-- Give Up --------------------------------------------------------------*/
#else
    fputs("Operation not implemented\n", stderr);
#endif

}
Example #5
0
 static void
ieee0(Void)
{
	ieee_set_fp_control(IEEE_TRAP_ENABLE_INV);
	}
Example #6
0
static void fpe_reset(Sigfunc *handler)
{
    /* Reset the exception handling machinery, and reset the signal
     * handler for SIGFPE to the given handler.
     */

/*-- IRIX -----------------------------------------------------------------*/
#if defined(sgi)
    /* See man page on handle_sigfpes -- must link with -lfpe
     * My usage doesn't follow the man page exactly.  Maybe somebody
     * else can explain handle_sigfpes to me....
     * cc -c -I/usr/local/python/include fpectlmodule.c
     * ld -shared -o fpectlmodule.so fpectlmodule.o -lfpe 
     */
#include <sigfpe.h>
    typedef void user_routine (unsigned[5], int[2]);
    typedef void abort_routine (unsigned long);
    handle_sigfpes(_OFF, 0,
		 (user_routine *)0,
		 _TURN_OFF_HANDLER_ON_ERROR,
		 NULL);
    handle_sigfpes(_ON, _EN_OVERFL | _EN_DIVZERO | _EN_INVALID,
		 (user_routine *)0,
		 _ABORT_ON_ERROR,
		 NULL);
    PyOS_setsig(SIGFPE, handler);

/*-- SunOS and Solaris ----------------------------------------------------*/
#elif defined(sun)
    /* References: ieee_handler, ieee_sun, ieee_functions, and ieee_flags
       man pages (SunOS or Solaris)
       cc -c -I/usr/local/python/include fpectlmodule.c
       ld -G -o fpectlmodule.so -L/opt/SUNWspro/lib fpectlmodule.o -lsunmath -lm
     */
#include <math.h>
#ifndef _SUNMATH_H
    extern void nonstandard_arithmetic(void);
    extern int ieee_flags(const char*, const char*, const char*, char **);
    extern long ieee_handler(const char*, const char*, sigfpe_handler_type);
#endif

    char *mode="exception", *in="all", *out;
    (void) nonstandard_arithmetic();
    (void) ieee_flags("clearall",mode,in,&out);
    (void) ieee_handler("set","common",(sigfpe_handler_type)handler);
    PyOS_setsig(SIGFPE, handler);

/*-- HPUX -----------------------------------------------------------------*/
#elif defined(__hppa) || defined(hppa)
    /* References:   fpsetmask man page */
    /* cc -Aa +z -c -I/usr/local/python/include fpectlmodule.c */
    /* ld -b -o fpectlmodule.sl fpectlmodule.o -lm */
#include <math.h>
    fpsetdefaults();
    PyOS_setsig(SIGFPE, handler);

/*-- IBM AIX --------------------------------------------------------------*/
#elif defined(__AIX) || defined(_AIX)
    /* References:   fp_trap, fp_enable man pages */
#include <fptrap.h>
    fp_trap(FP_TRAP_SYNC);
    fp_enable(TRP_INVALID | TRP_DIV_BY_ZERO | TRP_OVERFLOW);
    PyOS_setsig(SIGFPE, handler);

/*-- DEC ALPHA OSF --------------------------------------------------------*/
#elif defined(__alpha) && defined(__osf__)
    /* References:   exception_intro, ieee man pages */
    /* cc -c -I/usr/local/python/include fpectlmodule.c */
    /* ld -shared -o fpectlmodule.so fpectlmodule.o */
#include <machine/fpu.h>
    unsigned long fp_control =
    IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE | IEEE_TRAP_ENABLE_OVF;
    ieee_set_fp_control(fp_control);
    PyOS_setsig(SIGFPE, handler);

/*-- DEC ALPHA LINUX ------------------------------------------------------*/
#elif defined(__alpha) && defined(linux)
#include <asm/fpu.h>
    unsigned long fp_control =
    IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE | IEEE_TRAP_ENABLE_OVF;
    ieee_set_fp_control(fp_control);
    PyOS_setsig(SIGFPE, handler);

/*-- DEC ALPHA VMS --------------------------------------------------------*/
#elif defined(__ALPHA) && defined(__VMS)
	IEEE clrmsk;
	IEEE setmsk;
	clrmsk.ieee$q_flags =
		IEEE$M_TRAP_ENABLE_UNF |  IEEE$M_TRAP_ENABLE_INE |
		 IEEE$M_MAP_UMZ;
	setmsk.ieee$q_flags =
		IEEE$M_TRAP_ENABLE_INV | IEEE$M_TRAP_ENABLE_DZE |
		IEEE$M_TRAP_ENABLE_OVF;
	sys$ieee_set_fp_control(&clrmsk, &setmsk, 0);
	PyOS_setsig(SIGFPE, handler);

/*-- HP IA64 VMS --------------------------------------------------------*/
#elif defined(__ia64) && defined(__VMS)
    PyOS_setsig(SIGFPE, handler);

/*-- Cray Unicos ----------------------------------------------------------*/
#elif defined(cray)
    /* UNICOS delivers SIGFPE by default, but no matherr */
#ifdef HAS_LIBMSET
    libmset(-1);
#endif
    PyOS_setsig(SIGFPE, handler);

/*-- FreeBSD ----------------------------------------------------------------*/
#elif defined(__FreeBSD__)
    fpresetsticky(fpgetsticky());
    fpsetmask(FP_X_INV | FP_X_DZ | FP_X_OFL);
    PyOS_setsig(SIGFPE, handler);

/*-- Linux ----------------------------------------------------------------*/
#elif defined(linux)
#ifdef __GLIBC__
#include <fpu_control.h>
#else
#include <i386/fpu_control.h>
#endif
#ifdef _FPU_SETCW
    {
        fpu_control_t cw = 0x1372;
        _FPU_SETCW(cw);
    }
#else
    __setfpucw(0x1372);
#endif
    PyOS_setsig(SIGFPE, handler);

/*-- Microsoft Windows, NT ------------------------------------------------*/
#elif defined(_MSC_VER)
    /* Reference: Visual C++ Books Online 4.2,
       Run-Time Library Reference, _control87, _controlfp */
#include <float.h>
    unsigned int cw = _EM_INVALID | _EM_ZERODIVIDE | _EM_OVERFLOW;
    (void)_controlfp(0, cw);
    PyOS_setsig(SIGFPE, handler);

/*-- Give Up --------------------------------------------------------------*/
#else
    fputs("Operation not implemented\n", stderr);
#endif

}
Example #7
0
int
gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
{
    unsigned long int mode = 0 ;
    unsigned int    rnd  = 0 ;

    /* I'm actually not completely sure that the alpha only supports default
     * precisions rounding, but I couldn't find any information regarding this, so
     * it seems safe to assume this for now until it's proven otherwise.
     */

    switch (precision)
    {
    case GSL_IEEE_SINGLE_PRECISION:
        GSL_ERROR ("Tru64 Unix on the alpha only supports default precision rounding",
                   GSL_EUNSUP) ;
        break ;
    case GSL_IEEE_DOUBLE_PRECISION:
        GSL_ERROR ("Tru64 Unix on the alpha only supports default precision rounding",
                   GSL_EUNSUP) ;
        break ;
    case GSL_IEEE_EXTENDED_PRECISION:
        GSL_ERROR ("Tru64 Unix on the alpha only supports default precision rounding",
                   GSL_EUNSUP) ;
        break ;
    }


    switch (rounding)
    {
    case GSL_IEEE_ROUND_TO_NEAREST:
        rnd = FP_RND_RN ;
        write_rnd (rnd) ;
        break ;
    case GSL_IEEE_ROUND_DOWN:
        rnd = FP_RND_RM ;
        write_rnd (rnd) ;
        break ;
    case GSL_IEEE_ROUND_UP:
        rnd = FP_RND_RP ;
        write_rnd (rnd) ;
        break ;
    case GSL_IEEE_ROUND_TO_ZERO:
        rnd = FP_RND_RZ ;
        write_rnd (rnd) ;
        break ;
    default:
        rnd = FP_RND_RN ;
        write_rnd (rnd) ;
    }

    /* Turn on all the exceptions apart from 'inexact' */

    /* from the ieee(3) man page:
     * IEEE_TRAP_ENABLE_INV	->	Invalid operation
     * IEEE_TRAP_ENABLE_DZE	->	Divide by 0
     * IEEE_TRAP_ENABLE_OVF	->	Overflow
     * IEEE_TRAP_ENABLE_UNF	->	Underflow
     * IEEE_TRAP_ENABLE_INE	->	Inexact (requires special option to C compiler)
     * IEEE_TRAP_ENABLE_DNO	->	denormal operand
     * Note: IEEE_TRAP_ENABLE_DNO is not supported on OSF 3.x or Digital Unix
     * 4.0 - 4.0d(?).
     * IEEE_TRAP_ENABLE_MASK	->	mask of all the trap enables
     * IEEE_MAP_DMZ			->	map denormal inputs to zero
     * IEEE_MAP_UMZ			->	map underflow results to zero
     */

    mode = IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE | IEEE_TRAP_ENABLE_OVF
           | IEEE_TRAP_ENABLE_UNF ;

    if (exception_mask & GSL_IEEE_MASK_INVALID)
        mode &= ~ IEEE_TRAP_ENABLE_INV ;

    if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
    {
#ifdef IEEE_TRAP_ENABLE_DNO
        mode &= ~ IEEE_TRAP_ENABLE_DNO ;
#else
        GSL_ERROR ("Sorry, this version of Digital Unix does not support denormalized operands", GSL_EUNSUP) ;
#endif
    }

    if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
        mode &= ~ IEEE_TRAP_ENABLE_DZE ;

    if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
        mode &= ~ IEEE_TRAP_ENABLE_OVF ;

    if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
        mode &=  ~ IEEE_TRAP_ENABLE_UNF ;

    if (exception_mask & GSL_IEEE_TRAP_INEXACT)
    {
        /* To implement this would require a special flag to the C
         compiler which can cause degraded performance */

        GSL_ERROR ("Sorry, GSL does not implement trap-inexact for Tru64 Unix on the alpha - see fp-tru64.c for details", GSL_EUNSUP) ;

        /* In case you need to add it, the appropriate line would be
         *
         *  mode |= IEEE_TRAP_ENABLE_INE ;
         *
         */

    }
    else
    {
        mode &= ~ IEEE_TRAP_ENABLE_INE ;
    }

    ieee_set_fp_control (mode) ;

    return GSL_SUCCESS ;
}