Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * ====================================================
  3.  * Copyright (C) 1998,2002 by Red Hat Inc. All rights reserved.
  4.  *
  5.  * Permission to use, copy, modify, and distribute this
  6.  * software is freely granted, provided that this notice
  7.  * is preserved.
  8.  * ====================================================
  9.  */
  10.  
  11. #if !defined(_SOFT_FLOAT)
  12.  
  13. /*
  14. Fast version of exp using Intel float instructions.
  15.  
  16.    double _f_exp (double x);
  17.  
  18. Function computes e ** x.  The following special cases exist:
  19.    1. if x is 0.0 ==> return 1.0
  20.    2. if x is infinity ==> return infinity
  21.    3. if x is -infinity ==> return 0.0
  22.    4. if x is NaN ==> return x
  23. There is no error checking or setting of errno.
  24. */
  25.  
  26.  
  27. #include <math.h>
  28. #include <ieeefp.h>
  29. #include "f_math.h"
  30.  
  31. double _f_exp (double x)
  32. {
  33.    if (check_finite(x))
  34.      {
  35.        double result;
  36.        asm ("fldl2e; fmulp; fld %%st; frndint; fsub %%st,%%st(1); fxch;" \
  37.           "fchs; f2xm1; fld1; faddp; fxch; fld1; fscale; fstp %%st(1); fmulp" :
  38.           "=t"(result) : "0"(x));
  39.        return result;
  40.      }
  41.    else if (x == -infinity())
  42.      return 0.0;
  43.  
  44.    return x;
  45. }
  46.  
  47. #endif
  48.