mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-10 23:30:07 +00:00
Math exception and environment handling.
This commit is contained in:
parent
f10d86ecba
commit
91650f79e3
36
sysdeps/alpha/fpu/fclrexcpt.c
Normal file
36
sysdeps/alpha/fpu/fclrexcpt.c
Normal file
@ -0,0 +1,36 @@
|
||||
/* Clear given exceptions in current floating-point environment.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
void
|
||||
feclearexcept (int excepts)
|
||||
{
|
||||
unsigned long swcr;
|
||||
|
||||
/* Get the current state. */
|
||||
swcr = __ieee_get_fp_control();
|
||||
|
||||
/* Clear the relevant bits. */
|
||||
swcr &= ~((unsigned long)excepts & FE_ALL_EXCEPT);
|
||||
|
||||
/* Put the new state in effect. */
|
||||
__ieee_set_fp_control(swcr);
|
||||
}
|
37
sysdeps/alpha/fpu/fegetenv.c
Normal file
37
sysdeps/alpha/fpu/fegetenv.c
Normal file
@ -0,0 +1,37 @@
|
||||
/* Store current floating-point environment.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
void
|
||||
fegetenv (fenv_t *envp)
|
||||
{
|
||||
unsigned long fpcr, swcr;
|
||||
|
||||
/* Get status from software and hardware. Note that we don't need an
|
||||
excb because the callsys is an implied trap barrier. */
|
||||
swcr = __ieee_get_fp_control();
|
||||
__asm__ __volatile__("mf_fpcr %0" : "=f"(fpcr));
|
||||
|
||||
/* Merge the two bits of information. The magic number at the end is
|
||||
the exception enable mask. */
|
||||
|
||||
*envp = (fpcr & (3UL << 58)) | (swcr & (FE_ALL_EXCEPT | 0x3e));
|
||||
}
|
31
sysdeps/alpha/fpu/fegetround.c
Normal file
31
sysdeps/alpha/fpu/fegetround.c
Normal file
@ -0,0 +1,31 @@
|
||||
/* Return current rounding direction.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
int
|
||||
fegetround (void)
|
||||
{
|
||||
unsigned long fpcr;
|
||||
|
||||
__asm__ __volatile__("excb; mf_fpcr %0" : "=f"(fpcr));
|
||||
|
||||
return (fpcr >> 58) & 3;
|
||||
}
|
33
sysdeps/alpha/fpu/feholdexcpt.c
Normal file
33
sysdeps/alpha/fpu/feholdexcpt.c
Normal file
@ -0,0 +1,33 @@
|
||||
/* Store current floating-point environment and clear exceptions.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
int
|
||||
feholdexcept (fenv_t *envp)
|
||||
{
|
||||
/* Save the current state. */
|
||||
fegetenv(envp);
|
||||
|
||||
/* Clear all exception status bits and exception enable bits. */
|
||||
__ieee_set_fp_control(0);
|
||||
|
||||
return 1;
|
||||
}
|
107
sysdeps/alpha/fpu/fenvbits.h
Normal file
107
sysdeps/alpha/fpu/fenvbits.h
Normal file
@ -0,0 +1,107 @@
|
||||
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* This file should never be included directly. */
|
||||
|
||||
#ifndef _FENVBITS_H
|
||||
#define _FENVBITS_H 1
|
||||
|
||||
/* Define the bits representing the exception.
|
||||
|
||||
Note that these are the bit positions as defined by the OSF/1
|
||||
ieee_{get,set}_control_word interface and not by the hardware fpcr.
|
||||
|
||||
See the Alpha Architecture Handbook section 4.7.7.3 for details,
|
||||
but in summary, trap shadows mean the hardware register can acquire
|
||||
extra exception bits so for proper IEEE support the tracking has to
|
||||
be done in software -- in this case with kernel support.
|
||||
|
||||
As to why the system call interface isn't in the same format as
|
||||
the hardware register, only those crazy folks at DEC can tell you. */
|
||||
|
||||
enum
|
||||
{
|
||||
FE_INEXACT = 1UL << 21,
|
||||
#define FE_INEXACT FE_INEXACT
|
||||
|
||||
FE_UNDERFLOW = 1UL << 20,
|
||||
#define FE_UNDERFLOW FE_UNDERFLOW
|
||||
|
||||
FE_OVERFLOW = 1UL << 19,
|
||||
#define FE_OVERFLOW FE_OVERFLOW
|
||||
|
||||
FE_DIVBYZERO = 1UL << 18,
|
||||
#define FE_DIVBYZERO FE_DIVBYZERO
|
||||
|
||||
FE_INVALID = 1UL << 17,
|
||||
#define FE_INVALID FE_INVALID
|
||||
|
||||
FE_ALL_EXCEPT =
|
||||
(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
|
||||
#define FE_ALL_EXCEPT FE_ALL_EXCEPT
|
||||
};
|
||||
|
||||
|
||||
/* Alpha chips support all four defined rouding modes.
|
||||
|
||||
Note that code must be compiled to use dynamic rounding (/d) instructions
|
||||
to see these changes. For gcc this is -mfp-rounding-mode=d; for DEC cc
|
||||
this is -fprm d. The default for both is static rounding to nearest.
|
||||
|
||||
These are shifted down 58 bits from the hardware fpcr because the
|
||||
functions are declared to take integers. */
|
||||
|
||||
enum
|
||||
{
|
||||
FE_TOWARDSZERO = 0,
|
||||
#define FE_TOWARDSZERO FE_TOWARDSZERO
|
||||
|
||||
FE_DOWNWARD = 1,
|
||||
#define FE_DOWNWARD FE_DOWNWARD
|
||||
|
||||
FE_TONEAREST = 2,
|
||||
#define FE_TONEAREST FE_TONEAREST
|
||||
|
||||
FE_UPWARD = 3,
|
||||
#define FE_UPWARD FE_UPWARD
|
||||
};
|
||||
|
||||
|
||||
/* Type representing exception flags. */
|
||||
typedef unsigned long fexcept_t;
|
||||
|
||||
/* Type representing floating-point environment. */
|
||||
typedef unsigned long fenv_t;
|
||||
|
||||
/* If the default argument is used we use this value. Note that due to
|
||||
architecture-specified page mappings, no user-space pointer will ever
|
||||
have its two high bits set. Co-opt one. */
|
||||
#define FE_DFL_ENV ((fenv_t *) 0x8800000000000000UL)
|
||||
|
||||
#ifdef __USE_GNU
|
||||
/* Floating-point environment where none of the exceptions are masked. */
|
||||
# define FE_NOMASK_ENV ((fenv_t *) 0x880000000000003eUL)
|
||||
#endif
|
||||
|
||||
/* The system calls to talk to the kernel's FP code. */
|
||||
extern unsigned long __ieee_get_fp_control(void);
|
||||
extern void __ieee_set_fp_control(unsigned long);
|
||||
|
||||
|
||||
#endif /* fenvbits.h */
|
45
sysdeps/alpha/fpu/fesetenv.c
Normal file
45
sysdeps/alpha/fpu/fesetenv.c
Normal file
@ -0,0 +1,45 @@
|
||||
/* Install given floating-point environment.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
void
|
||||
fesetenv (const fenv_t *envp)
|
||||
{
|
||||
unsigned long fpcr;
|
||||
fenv_t env;
|
||||
|
||||
/* Magic encoding of default values: high bit set (never possible for a
|
||||
user-space address) is not indirect. And we don't even have to get
|
||||
rid of it since we mask things around just below. */
|
||||
if ((long)envp >= 0)
|
||||
env = *envp;
|
||||
else
|
||||
env = (unsigned long)envp;
|
||||
|
||||
/* Reset the rounding mode with the hardware fpcr. Note that the following
|
||||
system call is an implied trap barrier for our modification. */
|
||||
__asm__ __volatile__("excb; mf_fpcr %0" : "=f"(fpcr));
|
||||
fpcr = (fpcr & ~(3UL << 58)) | (env & (3UL << 58));
|
||||
__asm__ __volatile__("mt_fpcr %0" : : "f"(fpcr));
|
||||
|
||||
/* Reset the exception status and mask with the kernel's FP code. */
|
||||
__ieee_set_fp_control(env & (FE_ALL_EXCEPT | 0x3e));
|
||||
}
|
41
sysdeps/alpha/fpu/fesetround.c
Normal file
41
sysdeps/alpha/fpu/fesetround.c
Normal file
@ -0,0 +1,41 @@
|
||||
/* Set current rounding direction.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
int
|
||||
fesetround (int round)
|
||||
{
|
||||
unsigned long fpcr;
|
||||
|
||||
if (round & ~3)
|
||||
return 0;
|
||||
|
||||
/* Get the current state. */
|
||||
__asm__ __volatile__("excb; mf_fpcr %0" : "=f"(fpcr));
|
||||
|
||||
/* Set the relevant bits. */
|
||||
fpcr = (fpcr & ~(3UL << 58)) | ((unsigned long)round << 58);
|
||||
|
||||
/* Put the new state in effect. */
|
||||
__asm__ __volatile__("mt_fpcr %0; excb" : : "f"(fpcr));
|
||||
|
||||
return 1;
|
||||
}
|
38
sysdeps/alpha/fpu/feupdateenv.c
Normal file
38
sysdeps/alpha/fpu/feupdateenv.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Install given floating-point environment and raise exceptions.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
void
|
||||
feupdateenv (const fenv_t *envp)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
/* Get the current exception state. */
|
||||
tmp = __ieee_get_fp_control();
|
||||
|
||||
/* Install new environment. */
|
||||
fesetenv(envp);
|
||||
|
||||
/* Raise the saved exception. Incidently for us the implementation
|
||||
defined format of the values in objects of type fexcept_t is the
|
||||
same as the ones specified using the FE_* constants. */
|
||||
feraiseexcept((int)tmp & FE_ALL_EXCEPT);
|
||||
}
|
33
sysdeps/alpha/fpu/fgetexcptflg.c
Normal file
33
sysdeps/alpha/fpu/fgetexcptflg.c
Normal file
@ -0,0 +1,33 @@
|
||||
/* Store current representation for exceptions.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
void
|
||||
fegetexceptflag (fexcept_t *flagp, int excepts)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
/* Get the current state. */
|
||||
tmp = __ieee_get_fp_control();
|
||||
|
||||
/* Return that portion that corresponds to the requested exceptions. */
|
||||
*flagp = tmp & excepts & FE_ALL_EXCEPT;
|
||||
}
|
72
sysdeps/alpha/fpu/fraiseexcpt.c
Normal file
72
sysdeps/alpha/fpu/fraiseexcpt.c
Normal file
@ -0,0 +1,72 @@
|
||||
/* Raise given exceptions.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <math.h>
|
||||
|
||||
void
|
||||
feraiseexcept (int excepts)
|
||||
{
|
||||
double tmp;
|
||||
|
||||
/* Raise exceptions represented by EXPECTS. But we must raise only
|
||||
one signal at a time. It is important the if the overflow/underflow
|
||||
exception and the inexact exception are given at the same time,
|
||||
the overflow/underflow exception precedes the inexact exception. */
|
||||
|
||||
/* We do these bits in assembly to be certain GCC doesn't optimize
|
||||
away something important. */
|
||||
|
||||
/* First: invalid exception. */
|
||||
if (FE_INVALID & excepts)
|
||||
{
|
||||
/* One example of a invalid operation is 0 * Infinity. */
|
||||
__asm__ __volatile__("mult/sui $f31,%1,%0; trapb"
|
||||
: "=f"(tmp) : "f"(HUGE_VAL));
|
||||
}
|
||||
|
||||
/* Next: division by zero. */
|
||||
if (FE_DIVBYZERO & excepts)
|
||||
{
|
||||
__asm__ __volatile__("cmpteq $f31,$f31,%0; divt/sui %0,$f31,%0; trapb"
|
||||
: "=f"(tmp));
|
||||
}
|
||||
|
||||
/* Next: overflow. */
|
||||
if (FE_OVERFLOW & excepts)
|
||||
{
|
||||
__asm__ __volatile__("mult/sui %1,%1,%0; trapb"
|
||||
: "=f"(tmp) : "f"(DBL_MAX));
|
||||
}
|
||||
|
||||
/* Next: underflow. */
|
||||
if (FE_UNDERFLOW & excepts)
|
||||
{
|
||||
__asm__ __volatile__("divt/sui %1,%2,%0; trapb"
|
||||
: "=f"(tmp) : "f"(DBL_MIN), "f"(16.0));
|
||||
}
|
||||
|
||||
/* Last: inexact. */
|
||||
if (FE_INEXACT & excepts)
|
||||
{
|
||||
__asm__ __volatile__("divt/sui %1,%2,%0; trapb"
|
||||
: "=f"(tmp) : "f"(1.0), "f"(M_PI));
|
||||
}
|
||||
}
|
36
sysdeps/alpha/fpu/fsetexcptflg.c
Normal file
36
sysdeps/alpha/fpu/fsetexcptflg.c
Normal file
@ -0,0 +1,36 @@
|
||||
/* Set floating-point environment exception handling.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
void
|
||||
fesetexceptflag (const fexcept_t *flagp, int excepts)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
/* Get the current exception state. */
|
||||
tmp = __ieee_get_fp_control();
|
||||
|
||||
/* Set all the bits that were called for. */
|
||||
tmp = tmp & ~FE_ALL_EXCEPT | *flagp & excepts & FE_ALL_EXCEPT;
|
||||
|
||||
/* And store it back. */
|
||||
__ieee_set_fp_control(tmp);
|
||||
}
|
32
sysdeps/alpha/fpu/ftestexcept.c
Normal file
32
sysdeps/alpha/fpu/ftestexcept.c
Normal file
@ -0,0 +1,32 @@
|
||||
/* Test exception in current environment.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
int
|
||||
fetestexcept (int excepts)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
/* Get current exceptions. */
|
||||
tmp = __ieee_get_fp_control();
|
||||
|
||||
return tmp & excepts & FE_ALL_EXCEPT;
|
||||
}
|
Loading…
Reference in New Issue
Block a user