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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [bootloaders/] [orpmon/] [coremark/] [fmod.c] - Diff between revs 355 and 406

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 355 Rev 406
 
 
typedef unsigned int u_int32_t;
typedef unsigned int u_int32_t;
typedef signed int int32_t;
typedef signed int int32_t;
 
 
// Big endian struct...
// Big endian struct...
typedef union
typedef union {
{
 
  double value;
  double value;
  struct
        struct {
  {
 
    u_int32_t msw;
    u_int32_t msw;
    u_int32_t lsw;
                u_int32_t lsw;
  } parts;
        } parts;
} ieee_double_shape_type;
} ieee_double_shape_type;
 
 
 
 
/*
/*
typedef union
typedef union
{
{
  double value;
  double value;
  struct
  struct
  {
  {
    u_int32_t lsw;
    u_int32_t lsw;
    u_int32_t msw;
    u_int32_t msw;
  } parts;
  } parts;
} ieee_double_shape_type;
} ieee_double_shape_type;
 
 
*/
*/
/* Get two 32 bit ints from a double.  */
/* Get two 32 bit ints from a double.  */
 
 
#define EXTRACT_WORDS(ix0,ix1,d)                                \
#define EXTRACT_WORDS(ix0,ix1,d)                                \
do {                                                            \
do {                                                            \
  ieee_double_shape_type ew_u;                                  \
  ieee_double_shape_type ew_u;                                  \
  ew_u.value = (d);                                             \
  ew_u.value = (d);                                             \
  (ix0) = ew_u.parts.msw;                                       \
  (ix0) = ew_u.parts.msw;                                       \
  (ix1) = ew_u.parts.lsw;                                       \
  (ix1) = ew_u.parts.lsw;                                       \
} while (0)
} while (0)
 
 
/* Get the more significant 32 bit int from a double.  */
/* Get the more significant 32 bit int from a double.  */
 
 
#define GET_HIGH_WORD(i,d)                                      \
#define GET_HIGH_WORD(i,d)                                      \
do {                                                            \
do {                                                            \
  ieee_double_shape_type gh_u;                                  \
  ieee_double_shape_type gh_u;                                  \
  gh_u.value = (d);                                             \
  gh_u.value = (d);                                             \
  (i) = gh_u.parts.msw;                                         \
  (i) = gh_u.parts.msw;                                         \
} while (0)
} while (0)
 
 
/* Get the less significant 32 bit int from a double.  */
/* Get the less significant 32 bit int from a double.  */
 
 
#define GET_LOW_WORD(i,d)                                       \
#define GET_LOW_WORD(i,d)                                       \
do {                                                            \
do {                                                            \
  ieee_double_shape_type gl_u;                                  \
  ieee_double_shape_type gl_u;                                  \
  gl_u.value = (d);                                             \
  gl_u.value = (d);                                             \
  (i) = gl_u.parts.lsw;                                         \
  (i) = gl_u.parts.lsw;                                         \
} while (0)
} while (0)
 
 
/* Set a double from two 32 bit ints.  */
/* Set a double from two 32 bit ints.  */
 
 
#define INSERT_WORDS(d,ix0,ix1)                                 \
#define INSERT_WORDS(d,ix0,ix1)                                 \
do {                                                            \
do {                                                            \
  ieee_double_shape_type iw_u;                                  \
  ieee_double_shape_type iw_u;                                  \
  iw_u.parts.msw = (ix0);                                       \
  iw_u.parts.msw = (ix0);                                       \
  iw_u.parts.lsw = (ix1);                                       \
  iw_u.parts.lsw = (ix1);                                       \
  (d) = iw_u.value;                                             \
  (d) = iw_u.value;                                             \
} while (0)
} while (0)
 
 
/* Set the more significant 32 bits of a double from an int.  */
/* Set the more significant 32 bits of a double from an int.  */
 
 
#define SET_HIGH_WORD(d,v)                                      \
#define SET_HIGH_WORD(d,v)                                      \
do {                                                            \
do {                                                            \
  ieee_double_shape_type sh_u;                                  \
  ieee_double_shape_type sh_u;                                  \
  sh_u.value = (d);                                             \
  sh_u.value = (d);                                             \
  sh_u.parts.msw = (v);                                         \
  sh_u.parts.msw = (v);                                         \
  (d) = sh_u.value;                                             \
  (d) = sh_u.value;                                             \
} while (0)
} while (0)
 
 
/* Set the less significant 32 bits of a double from an int.  */
/* Set the less significant 32 bits of a double from an int.  */
 
 
#define SET_LOW_WORD(d,v)                                       \
#define SET_LOW_WORD(d,v)                                       \
do {                                                            \
do {                                                            \
  ieee_double_shape_type sl_u;                                  \
  ieee_double_shape_type sl_u;                                  \
  sl_u.value = (d);                                             \
  sl_u.value = (d);                                             \
  sl_u.parts.lsw = (v);                                         \
  sl_u.parts.lsw = (v);                                         \
  (d) = sl_u.value;                                             \
  (d) = sl_u.value;                                             \
} while (0)
} while (0)
 
 
/* A union which permits us to convert between a float and a 32 bit
/* A union which permits us to convert between a float and a 32 bit
   int.  */
   int.  */
 
 
typedef union
typedef union {
{
 
  float value;
  float value;
  u_int32_t word;
        u_int32_t word;
} ieee_float_shape_type;
} ieee_float_shape_type;
 
 
/* Get a 32 bit int from a float.  */
/* Get a 32 bit int from a float.  */
 
 
#define GET_FLOAT_WORD(i,d)                                     \
#define GET_FLOAT_WORD(i,d)                                     \
do {                                                            \
do {                                                            \
  ieee_float_shape_type gf_u;                                   \
  ieee_float_shape_type gf_u;                                   \
  gf_u.value = (d);                                             \
  gf_u.value = (d);                                             \
  (i) = gf_u.word;                                              \
  (i) = gf_u.word;                                              \
} while (0)
} while (0)
 
 
/* Set a float from a 32 bit int.  */
/* Set a float from a 32 bit int.  */
 
 
#define SET_FLOAT_WORD(d,i)                                     \
#define SET_FLOAT_WORD(d,i)                                     \
do {                                                            \
do {                                                            \
  ieee_float_shape_type sf_u;                                   \
  ieee_float_shape_type sf_u;                                   \
  sf_u.word = (i);                                              \
  sf_u.word = (i);                                              \
  (d) = sf_u.value;                                             \
  (d) = sf_u.value;                                             \
} while (0)
} while (0)
 
 
 
 
static const double one = 1.0;
static const double one = 1.0;
 
 
double modf(double x, double *iptr)
double modf(double x, double *iptr)
{
{
        int32_t i0,i1,j0;
        int32_t i0, i1, j0;
        u_int32_t i;
        u_int32_t i;
        EXTRACT_WORDS(i0,i1,x);
        EXTRACT_WORDS(i0, i1, x);
        j0 = ((i0>>20)&0x7ff)-0x3ff;    /* exponent of x */
        j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;      /* exponent of x */
        if(j0<20) {                     /* integer part in high x */
        if (j0 < 20) {          /* integer part in high x */
            if(j0<0) {                   /* |x|<1 */
                if (j0 < 0) {    /* |x|<1 */
                INSERT_WORDS(*iptr,i0&0x80000000,0);     /* *iptr = +-0 */
                        INSERT_WORDS(*iptr, i0 & 0x80000000, 0); /* *iptr = +-0 */
                return x;
                        return x;
            } else {
                } else {
                i = (0x000fffff)>>j0;
                        i = (0x000fffff) >> j0;
                if(((i0&i)|i1)==0) {             /* x is integral */
                        if (((i0 & i) | i1) == 0) {      /* x is integral */
                    u_int32_t high;
                                u_int32_t high;
                    *iptr = x;
                                *iptr = x;
                    GET_HIGH_WORD(high,x);
                                GET_HIGH_WORD(high, x);
                    INSERT_WORDS(x,high&0x80000000,0);   /* return +-0 */
                                INSERT_WORDS(x, high & 0x80000000, 0);   /* return +-0 */
                    return x;
                                return x;
                } else {
                        } else {
                    INSERT_WORDS(*iptr,i0&(~i),0);
                                INSERT_WORDS(*iptr, i0 & (~i), 0);
                    return x - *iptr;
                                return x - *iptr;
                }
                        }
            }
                }
        } else if (j0>51) {             /* no fraction part */
        } else if (j0 > 51) {   /* no fraction part */
            u_int32_t high;
                u_int32_t high;
            *iptr = x*one;
                *iptr = x * one;
            GET_HIGH_WORD(high,x);
                GET_HIGH_WORD(high, x);
            INSERT_WORDS(x,high&0x80000000,0);   /* return +-0 */
                INSERT_WORDS(x, high & 0x80000000, 0);   /* return +-0 */
            return x;
                return x;
        } else {                        /* fraction part in low x */
        } else {                /* fraction part in low x */
            i = ((u_int32_t)(0xffffffff))>>(j0-20);
                i = ((u_int32_t) (0xffffffff)) >> (j0 - 20);
            if((i1&i)==0) {              /* x is integral */
                if ((i1 & i) == 0) {     /* x is integral */
                u_int32_t high;
                        u_int32_t high;
                *iptr = x;
                        *iptr = x;
                GET_HIGH_WORD(high,x);
                        GET_HIGH_WORD(high, x);
                INSERT_WORDS(x,high&0x80000000,0);       /* return +-0 */
                        INSERT_WORDS(x, high & 0x80000000, 0);   /* return +-0 */
                return x;
                        return x;
            } else {
                } else {
                INSERT_WORDS(*iptr,i0,i1&(~i));
                        INSERT_WORDS(*iptr, i0, i1 & (~i));
                return x - *iptr;
                        return x - *iptr;
            }
                }
        }
        }
}
}
 
 

powered by: WebSVN 2.1.0

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