summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/execute/ieee
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2016-01-06 01:47:28 -0800
committerYamaArashi <shadow962@live.com>2016-01-06 01:47:28 -0800
commitbe8b04496302184c6e8f04d6179f9c3afc50aeb6 (patch)
tree726e2468c0c07add773c0dbd86ab6386844259ae /gcc/testsuite/gcc.c-torture/execute/ieee
initial commit
Diffstat (limited to 'gcc/testsuite/gcc.c-torture/execute/ieee')
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/920518-1.c8
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/920810-1.c3
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/930529-1.c27
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/980619-1.c23
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/Makefile.in12
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/configure.in15
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/fp-cmp-1.c41
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp61
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/minuszero.c22
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/mzero2.c58
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/rbug.c41
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/rbug.cexp7
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/ieee/rbug.x7
13 files changed, 325 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/920518-1.c b/gcc/testsuite/gcc.c-torture/execute/ieee/920518-1.c
new file mode 100755
index 0000000..7f072b2
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/920518-1.c
@@ -0,0 +1,8 @@
+unsigned u=2147483839;float f0=2147483648e0,f1=2147483904e0;
+main()
+{
+ float f=u;
+ if(f==f0)
+ abort();
+ exit(0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/920810-1.c b/gcc/testsuite/gcc.c-torture/execute/ieee/920810-1.c
new file mode 100755
index 0000000..62d2294
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/920810-1.c
@@ -0,0 +1,3 @@
+#include <stdio.h>
+double normalize(x)double x;{if(x==0)x=0;return x;}
+main(){char b[9];sprintf(b,"%g",normalize(-0.0));if(strcmp(b,"0"))abort();exit(0);}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/930529-1.c b/gcc/testsuite/gcc.c-torture/execute/ieee/930529-1.c
new file mode 100755
index 0000000..b96a3c0
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/930529-1.c
@@ -0,0 +1,27 @@
+main ()
+{
+ union {
+ double d;
+ unsigned char c[8];
+ } d;
+
+ d.d = 1.0/7.0;
+
+ if (sizeof (char) * 8 == sizeof (double))
+ {
+ if (d.c[0] == 0x92 && d.c[1] == 0x24 && d.c[2] == 0x49 && d.c[3] == 0x92
+ && d.c[4] == 0x24 && d.c[5] == 0x49 && d.c[6] == 0xc2 && d.c[7] == 0x3f)
+ exit (0);
+ if (d.c[7] == 0x92 && d.c[6] == 0x24 && d.c[5] == 0x49 && d.c[4] == 0x92
+ && d.c[3] == 0x24 && d.c[2] == 0x49 && d.c[1] == 0xc2 && d.c[0] == 0x3f)
+ exit (0);
+#if defined __arm__ || defined __thumb__
+ if (d.c[4] == 0x92 && d.c[5] == 0x24 && d.c[6] == 0x49 && d.c[7] == 0x92
+ && d.c[0] == 0x24 && d.c[1] == 0x49 && d.c[2] == 0xc2 && d.c[3] == 0x3f)
+ exit (0);
+#endif
+ abort ();
+ }
+
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/980619-1.c b/gcc/testsuite/gcc.c-torture/execute/ieee/980619-1.c
new file mode 100755
index 0000000..0465ed5
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/980619-1.c
@@ -0,0 +1,23 @@
+ int main(void)
+ {
+ float reale = 1.0f;
+ float oneplus;
+ int i;
+
+ if (sizeof (float) != 4)
+ exit (0);
+
+ for (i = 0; ; i++)
+ {
+ oneplus = 1.0f + reale;
+ if (oneplus == 1.0f)
+ break;
+ reale=reale/2.0f;
+ }
+ /* Assumes ieee754 accurate arithmetic above. */
+ if (i != 24)
+ abort ();
+ else
+ exit (0);
+ }
+
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/Makefile.in b/gcc/testsuite/gcc.c-torture/execute/ieee/Makefile.in
new file mode 100755
index 0000000..e6209db
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/Makefile.in
@@ -0,0 +1,12 @@
+#### host, target, and site specific Makefile frags come in here.
+
+srcdir = .
+
+# Nothing to do...
+all:
+
+clean:
+ -rm -f *.o *.diff *~ *.bad core *.x
+
+distclean: clean
+ -rm -f Makefile config.status
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/configure.in b/gcc/testsuite/gcc.c-torture/execute/ieee/configure.in
new file mode 100755
index 0000000..7d7078d
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/configure.in
@@ -0,0 +1,15 @@
+# This file is a shell script fragment that supplies the information
+# necessary to tailor a template configure script into the configure
+# script appropriate for this directory. For more information, check
+# any existing configure script.
+
+srctrigger=execute.exp
+srcname="DejaGnu"
+
+# per-host:
+
+# per-target:
+
+target_makefile_frag=../config/mt-${target_alias}
+
+# post-target:
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/fp-cmp-1.c b/gcc/testsuite/gcc.c-torture/execute/ieee/fp-cmp-1.c
new file mode 100755
index 0000000..4794efc
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/fp-cmp-1.c
@@ -0,0 +1,41 @@
+#include <signal.h>
+
+double nan = 1.0/0.0 - 1.0/0.0;
+double x = 1.0;
+
+void leave ()
+{
+ exit (0);
+}
+
+main ()
+{
+#if ! defined (__vax__) && ! defined (_CRAY)
+ /* Move this line earlier, for architectures (like alpha) that issue
+ SIGFPE on the first comparisons. */
+#ifndef SIGNAL_SUPPRESS
+ /* Some machines catches a SIGFPE when a NaN is compared.
+ Let this test succeed o such machines. */
+ signal (SIGFPE, leave);
+#endif
+ /* NaN is an IEEE unordered operand. All these test should be false. */
+ if (nan == nan)
+ abort ();
+ if (nan != x)
+ x = 1.0;
+ else
+ abort ();
+
+ if (nan < x)
+ abort ();
+ if (nan > x)
+ abort ();
+ if (nan <= x)
+ abort ();
+ if (nan >= x)
+ abort ();
+ if (nan == x)
+ abort ();
+#endif
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp b/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp
new file mode 100755
index 0000000..903d5ce
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp
@@ -0,0 +1,61 @@
+#
+# Expect driver script for GCC Regression Tests
+# Copyright (C) 1993, 1996 Free Software Foundation
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Written by Jeffrey Wheat (cassidy@cygnus.com)
+#
+
+#
+# These tests come from Torbjorn Granlund's (tege@cygnus.com)
+# C torture test suite, and other contributors.
+#
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+if [target_info exists ieee_multilib_flags] {
+ set additional_flags [target_info ieee_multilib_flags];
+} else {
+ set additional_flags "";
+}
+
+# We must use -ffloat-store to ensure that excess precision on some machines
+# does not cause problems
+lappend additional_flags "-ffloat-store"
+
+# load support procs
+load_lib c-torture.exp
+
+# initialize harness
+gcc_init
+
+#
+# main test loop
+#
+
+foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] {
+ # If we're only testing specific files and this isn't one of them, skip it.
+ if ![runtest_file_p $runtests $src] then {
+ continue
+ }
+
+ c-torture-execute $src $additional_flags
+}
+
+# All done.
+gcc_finish
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/minuszero.c b/gcc/testsuite/gcc.c-torture/execute/ieee/minuszero.c
new file mode 100755
index 0000000..8571526
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/minuszero.c
@@ -0,0 +1,22 @@
+main ()
+{
+ union
+ {
+ double d;
+ unsigned short i[sizeof (double) / sizeof (short)];
+ } u;
+ int a = 0;
+ int b = -5;
+ int j;
+
+ u.d = (double) a / b;
+
+ /* Look for the right pattern, but be sloppy since
+ we don't know the byte order. */
+ for (j = 0; j < sizeof (double) / sizeof (short); j++)
+ {
+ if (u.i[j] == 0x8000)
+ exit (0);
+ }
+ abort ();
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/mzero2.c b/gcc/testsuite/gcc.c-torture/execute/ieee/mzero2.c
new file mode 100755
index 0000000..0da53d2
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/mzero2.c
@@ -0,0 +1,58 @@
+/* Test IEEE +0/-0 rules */
+
+static double pzero = +0.0;
+static double nzero = -0.0;
+static double pinf = +1.0 / 0.0;
+static double ninf = -1.0 / 0.0;
+static double nan = 0.0 / 0.0;
+
+void
+expect (double value, double expected)
+{
+ if (expected != expected) /* expected value is Not a number */
+ {
+ if (value == value) /* actual value is a number */
+ abort ();
+ }
+
+ else if (value != value)
+ abort (); /* actual value is a NaN */
+
+ else if (memcmp ((void *)&value, (void *)&expected, sizeof (double)) != 0)
+ abort (); /* values don't match */
+}
+
+main ()
+{
+ expect (pzero + pzero, pzero);
+ expect (pzero + nzero, pzero);
+ expect (nzero + pzero, pzero);
+ expect (nzero + nzero, nzero);
+
+ expect (pzero - pzero, pzero);
+ expect (pzero - nzero, pzero);
+ expect (nzero - pzero, nzero);
+ expect (nzero - nzero, pzero);
+
+ expect (pzero * pzero, pzero);
+ expect (pzero * nzero, nzero);
+ expect (nzero * pzero, nzero);
+ expect (nzero * nzero, pzero);
+
+ expect (+1.00 * pzero, pzero);
+ expect (-1.00 * pzero, nzero);
+ expect (+1.00 * nzero, nzero);
+ expect (-1.00 * nzero, pzero);
+
+ expect (pzero / pzero, nan);
+ expect (pzero / nzero, nan);
+ expect (nzero / pzero, nan);
+ expect (nzero / nzero, nan);
+
+ expect (+1.00 / pzero, pinf);
+ expect (-1.00 / pzero, ninf);
+ expect (+1.00 / nzero, ninf);
+ expect (-1.00 / nzero, pinf);
+
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/rbug.c b/gcc/testsuite/gcc.c-torture/execute/ieee/rbug.c
new file mode 100755
index 0000000..a91a99e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/rbug.c
@@ -0,0 +1,41 @@
+double d (unsigned long long k)
+{
+ double x;
+
+ x = (double) k;
+ return x;
+}
+
+float s (unsigned long long k)
+{
+ float x;
+
+ x = (float) k;
+ return x;
+}
+
+main ()
+{
+ unsigned long long int k;
+ double x;
+
+ /* CYGNUS LOCAL -- meissner/32bit doubles */
+ if (sizeof (double) >= 8)
+ {
+ k = 0x8693ba6d7d220401ULL;
+ x = d (k);
+ k = (unsigned long long) x;
+ if (k != 0x8693ba6d7d220800ULL)
+ abort ();
+ }
+ /* END CYGNUS LOCAL -- meissner/32bit doubles */
+
+ k = 0x8234508000000001ULL;
+ x = s (k);
+ k = (unsigned long long) x;
+ if (k != 0x8234510000000000ULL)
+ abort ();
+
+ exit (0);
+}
+
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/rbug.cexp b/gcc/testsuite/gcc.c-torture/execute/ieee/rbug.cexp
new file mode 100755
index 0000000..0ae0a35
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/rbug.cexp
@@ -0,0 +1,7 @@
+# This doesn't work on d10v if doubles are not 64 bits
+
+if { [istarget "d10v-*-*"] && ! [string-match "*-mdouble64*" $CFLAGS] } {
+ set torture_execute_xfail "d10v-*-*"
+}
+
+return 0
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/rbug.x b/gcc/testsuite/gcc.c-torture/execute/ieee/rbug.x
new file mode 100755
index 0000000..0ae0a35
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/rbug.x
@@ -0,0 +1,7 @@
+# This doesn't work on d10v if doubles are not 64 bits
+
+if { [istarget "d10v-*-*"] && ! [string-match "*-mdouble64*" $CFLAGS] } {
+ set torture_execute_xfail "d10v-*-*"
+}
+
+return 0