aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2014-07-09 20:32:12 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2014-07-09 20:32:12 +0000
commitf5168e47a83d6afcab6afa176da2ba466c383dbb (patch)
treecf7f1ee923c572de4622014e7f1078228cf3f283 /gcc
parent958c1d61b1503a70f900a38f6f832ec1beb29d8f (diff)
downloadgcc-f5168e47a83d6afcab6afa176da2ba466c383dbb.zip
gcc-f5168e47a83d6afcab6afa176da2ba466c383dbb.tar.gz
gcc-f5168e47a83d6afcab6afa176da2ba466c383dbb.tar.bz2
libgfortran.h (support_fpu_underflow_control, [...]): New prototypes.
* libgfortran.h (support_fpu_underflow_control, get_fpu_underflow_mode, set_fpu_underflow_mode): New prototypes. * config/fpu-*.h (support_fpu_underflow_control, get_fpu_underflow_mode, set_fpu_underflow_mode): New functions. * ieee/ieee_arithmetic.F90: Support underflow control. * gfortran.dg/ieee/underflow_1.f90: New file. From-SVN: r212407
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gfortran.dg/ieee/underflow_1.f9050
2 files changed, 54 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b2e6a01..e4cd3bc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2014-07-09 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ * gfortran.dg/ieee/underflow_1.f90: New file.
+
2014-07-09 Richard Biener <rguenther@suse.de>
PR c-family/61741
diff --git a/gcc/testsuite/gfortran.dg/ieee/underflow_1.f90 b/gcc/testsuite/gfortran.dg/ieee/underflow_1.f90
new file mode 100644
index 0000000..b77a90c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/ieee/underflow_1.f90
@@ -0,0 +1,50 @@
+! { dg-do run }
+! { dg-require-effective-target sse2_runtime { target { i?86-*-* x86_64-*-* } } }
+! { dg-additional-options "-msse2 -mfpmath=sse" { target { i?86-*-* x86_64-*-* } } }
+
+program test_underflow_control
+ use ieee_arithmetic
+ use iso_fortran_env
+
+ logical l
+ real, volatile :: x
+ double precision, volatile :: y
+ integer, parameter :: kx = kind(x), ky = kind(y)
+
+ if (ieee_support_underflow_control(x)) then
+
+ x = tiny(x)
+ call ieee_set_underflow_mode(.true.)
+ x = x / 2000._kx
+ if (x == 0) call abort
+ call ieee_get_underflow_mode(l)
+ if (.not. l) call abort
+
+ x = tiny(x)
+ call ieee_set_underflow_mode(.false.)
+ x = x / 2000._kx
+ if (x > 0) call abort
+ call ieee_get_underflow_mode(l)
+ if (l) call abort
+
+ end if
+
+ if (ieee_support_underflow_control(y)) then
+
+ y = tiny(y)
+ call ieee_set_underflow_mode(.true.)
+ y = y / 2000._ky
+ if (y == 0) call abort
+ call ieee_get_underflow_mode(l)
+ if (.not. l) call abort
+
+ y = tiny(y)
+ call ieee_set_underflow_mode(.false.)
+ y = y / 2000._ky
+ if (y > 0) call abort
+ call ieee_get_underflow_mode(l)
+ if (l) call abort
+
+ end if
+
+end program