OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [gcc.target/] [i386/] [980414-1.c] - Rev 691

Compare with Previous | Blame | View Log

/* Test double on x86. */
 
/* { dg-do run } */
/* { dg-options -O2 } */
 
extern void abort (void);
 
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),%%st\n\t"	/* y * log2(x) */
     "fst	%%st(1)\n\t"
     "frndint\n\t"			/* int(y * log2(x)) */
     "fxch  %%st(1)\n\t"
     "fsub	%%st(1),%%st\n\t"	/* fract(y * log2(x)) */
     "f2xm1\n\t"			/* 2^(fract(y * log2(x))) - 1 */
     : "=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;
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.