New test from HJ.
authorJeff Law <law@gcc.gnu.org>
Sun, 19 Apr 1998 23:40:30 +0000 (17:40 -0600)
committerJeff Law <law@gcc.gnu.org>
Sun, 19 Apr 1998 23:40:30 +0000 (17:40 -0600)
From-SVN: r19326

gcc/testsuite/gcc.dg/980414-1.c [new file with mode: 0644]

diff --git a/gcc/testsuite/gcc.dg/980414-1.c b/gcc/testsuite/gcc.dg/980414-1.c
new file mode 100644 (file)
index 0000000..9646f6d
--- /dev/null
@@ -0,0 +1,76 @@
+/* Test double on x86. */
+
+/* { dg-do run { target i?86-*-* } } */
+/* { dg-options -O2 } */
+
+static __inline  double
+mypow (double __x, double __y)
+{
+  register double __value, __exponent;
+  long __p = (long) __y;
+  if (__y == (double) __p)
+    {
+      double __r = 1.0;
+      if (__p == 0)
+       return 1.0;
+      if (__p < 0)
+       {
+         __p = -__p;
+         __x = 1.0 / __x;
+       }
+      while (1)
+       {
+         if (__p & 1)
+           __r *= __x;
+         __p >>= 1;
+         if (__p == 0)
+           return __r;
+         __x *= __x;
+       }
+    }
+  __asm __volatile__
+    ("fmul     %%st(1)         # y * log2(x)\n\t"
+     "fstl     %%st(1)\n\t"
+     "frndint                  # int(y * log2(x))\n\t"
+     "fxch\n\t"
+     "fsub     %%st(1)         # fract(y * log2(x))\n\t"
+     "f2xm1                    # 2^(fract(y * log2(x))) - 1\n\t"
+     : "=t" (__value), "=u" (__exponent) :  "0" (__x), "1" (__y));
+  __value += 1.0;
+  __asm __volatile__
+    ("fscale"
+     : "=t" (__value) : "0" (__value), "u" (__exponent));
+  return __value;
+}
+
+const double E1 = 2.71828182845904523536028747135;
+
+double fact (double x)
+{
+  double corr;
+  corr = 1.0;
+  return corr * mypow(x/E1, x);
+}
+
+int main ()
+{
+  double y, z;
+
+  y = fact (46.2);
+  z = mypow (46.2/E1, 46.2);
+
+#if 0
+  printf ("%26.19e, %26.19e\n", y, z);
+#endif
+
+  if (y > z)
+    y -= z;
+  else
+    y = z - y;
+
+  y /= z;
+  if (y > 0.1)
+    abort ();
+  return 0;
+}