From a4f79641824cbf9f60ca9d1168d1fcc46717a82a Mon Sep 17 00:00:00 2001 From: deraadt <> Date: Wed, 18 Oct 1995 08:49:34 +0000 Subject: initial import of NetBSD tree --- src/regress/lib/libc/ieeefp/except/Makefile | 12 ++++ src/regress/lib/libc/ieeefp/except/except.c | 87 +++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/regress/lib/libc/ieeefp/except/Makefile create mode 100644 src/regress/lib/libc/ieeefp/except/except.c (limited to 'src/regress/lib/libc/ieeefp/except') diff --git a/src/regress/lib/libc/ieeefp/except/Makefile b/src/regress/lib/libc/ieeefp/except/Makefile new file mode 100644 index 0000000000..91f24f15f6 --- /dev/null +++ b/src/regress/lib/libc/ieeefp/except/Makefile @@ -0,0 +1,12 @@ +# $NetBSD: Makefile,v 1.1 1995/04/26 00:27:25 jtc Exp $ + +PROG= except +SRCS= except.c +NOMAN= + +install: + +regress: ${PROG} + ./${PROG} + +.include diff --git a/src/regress/lib/libc/ieeefp/except/except.c b/src/regress/lib/libc/ieeefp/except/except.c new file mode 100644 index 0000000000..0ffdcdd468 --- /dev/null +++ b/src/regress/lib/libc/ieeefp/except/except.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include + +void sigfpe(); +volatile sig_atomic_t signal_cought; + +static volatile const double one = 1.0; +static volatile const double zero = 0.0; +static volatile const double huge = DBL_MAX; +static volatile const double tiny = DBL_MIN; + +main() +{ + volatile double x; + + /* + * check to make sure that all exceptions are masked and + * that the accumulated exception status is clear. + */ + assert(fpgetmask() == 0); + assert(fpgetsticky() == 0); + + /* set up signal handler */ + signal (SIGFPE, sigfpe); + signal_cought = 0; + + /* trip divide by zero */ + x = one / zero; + assert (fpgetsticky() & FP_X_DZ); + assert (signal_cought == 0); + fpsetsticky(0); + + /* trip invalid operation */ + x = zero / zero; + assert (fpgetsticky() & FP_X_INV); + assert (signal_cought == 0); + fpsetsticky(0); + + /* trip overflow */ + x = huge * huge; + assert (fpgetsticky() & FP_X_OFL); + assert (signal_cought == 0); + fpsetsticky(0); + + /* trip underflow */ + x = tiny * tiny; + assert (fpgetsticky() & FP_X_UFL); + assert (signal_cought == 0); + fpsetsticky(0); + +#if 0 + /* unmask and then trip divide by zero */ + fpsetmask(FP_X_DZ); + x = one / zero; + assert (signal_cought == 1); + signal_cought = 0; + + /* unmask and then trip invalid operation */ + fpsetmask(FP_X_INV); + x = zero / zero; + assert (signal_cought == 1); + signal_cought = 0; + + /* unmask and then trip overflow */ + fpsetmask(FP_X_OFL); + x = huge * huge; + assert (signal_cought == 1); + signal_cought = 0; + + /* unmask and then trip underflow */ + fpsetmask(FP_X_UFL); + x = tiny * tiny; + assert (signal_cought == 1); + signal_cought = 0; +#endif + + exit(0); +} + +void +sigfpe() +{ + signal_cought = 1; +} -- cgit v1.2.3-55-g6feb