summaryrefslogtreecommitdiffstats
path: root/gcc/testsuite/gcc.dg/980414-1.c
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1998-04-19 23:40:30 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1998-04-19 23:40:30 +0000
commit240a97c814882bc9588a97914f5f24b66dadbdee (patch)
treebf69821dc17a88a5852804126c5b9fa092e6416e /gcc/testsuite/gcc.dg/980414-1.c
parent84ba508d2e24ce851d3a80bce59341def6100c3f (diff)
downloadppe42-gcc-240a97c814882bc9588a97914f5f24b66dadbdee.tar.gz
ppe42-gcc-240a97c814882bc9588a97914f5f24b66dadbdee.zip
New test from HJ.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@19326 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/gcc.dg/980414-1.c')
-rw-r--r--gcc/testsuite/gcc.dg/980414-1.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/980414-1.c b/gcc/testsuite/gcc.dg/980414-1.c
new file mode 100644
index 00000000000..9646f6dd615
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/980414-1.c
@@ -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;
+}
OpenPOWER on IntegriCloud