OSDN Git Service

* gcc.c-torture/execute/ieee/mul-subnormal-single-1.c: New test.
authorhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Mar 2004 00:32:24 +0000 (00:32 +0000)
committerhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Mar 2004 00:32:24 +0000 (00:32 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@78952 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/ieee/mul-subnormal-single-1.c [new file with mode: 0644]

index bd7dfe5..db88add 100644 (file)
@@ -1,3 +1,7 @@
+2004-03-05  Hans-Peter Nilsson  <hp@axis.com>
+
+       * gcc.c-torture/execute/ieee/mul-subnormal-single-1.c: New test.
+
 2004-03-04  Ziemowit Laski  <zlaski@apple.com>
 
        PR c++/14425, c++/14426
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/mul-subnormal-single-1.c b/gcc/testsuite/gcc.c-torture/execute/ieee/mul-subnormal-single-1.c
new file mode 100644 (file)
index 0000000..d5f3fb4
--- /dev/null
@@ -0,0 +1,75 @@
+/* Check that certain subnormal numbers (formerly known as denormalized
+   numbers) are rounded to within 0.5 ulp.  PR other/14354.  */
+
+/* This test requires that float and unsigned int are the same size and
+   that the sign-bit of the float is at MSB of the unsigned int.  */
+
+#if __INT_MAX__ != 2147483647L
+int main () { exit (0); }
+#else
+
+union uf
+{
+  unsigned int u;
+  float f;
+};
+
+static float
+u2f (unsigned int v)
+{
+  union uf u;
+  u.u = v;
+  return u.f;
+}
+
+static unsigned int
+f2u (float v)
+{
+  union uf u;
+  u.f = v;
+  return u.u;
+}
+
+int ok = 1;
+
+static void
+tstmul (unsigned int ux, unsigned int uy, unsigned int ur)
+{
+  float x = u2f (ux);
+  float y = u2f (uy);
+
+  if (f2u (x * y) != ur)
+    /* Set a variable rather than aborting here, to simplify tracing when
+       several computations are wrong.  */
+    ok = 0;
+}
+
+/* We don't want to make this const and static, or else we risk inlining
+   causing the test to fold as constants at compile-time.  */
+struct
+{
+  unsigned int p1, p2, res;
+} expected[] =
+  {
+    {0xfff, 0x3f800400, 0xfff},
+    {0xf, 0x3fc88888, 0x17},
+    {0xf, 0x3f844444, 0xf}
+  };
+
+int
+main (int argc, char *argv[], char *envp[])
+{
+  unsigned int i;
+
+  for (i = 0; i < sizeof (expected) / sizeof (expected[0]); i++)
+    {
+      tstmul (expected[i].p1, expected[i].p2, expected[i].res);
+      tstmul (expected[i].p2, expected[i].p1, expected[i].res);
+    }
+
+  if (!ok)
+    abort ();
+
+  exit (0);
+}
+#endif