diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-04-19 23:40:30 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-04-19 23:40:30 +0000 |
commit | 240a97c814882bc9588a97914f5f24b66dadbdee (patch) | |
tree | bf69821dc17a88a5852804126c5b9fa092e6416e /gcc/testsuite/gcc.dg/980414-1.c | |
parent | 84ba508d2e24ce851d3a80bce59341def6100c3f (diff) | |
download | ppe42-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.c | 76 |
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; +} |