Logo Search packages:      
Sourcecode: linux version File versions  Download package

soft-fp.h

#ifndef SOFT_FP_H
#define SOFT_FP_H

#include "sfp-machine.h"

#define _FP_WORKBITS          3
#define _FP_WORK_LSB          ((_FP_W_TYPE)1 << 3)
#define _FP_WORK_ROUND        ((_FP_W_TYPE)1 << 2)
#define _FP_WORK_GUARD        ((_FP_W_TYPE)1 << 1)
#define _FP_WORK_STICKY       ((_FP_W_TYPE)1 << 0)

#ifndef FP_RND_NEAREST
# define FP_RND_NEAREST       0
# define FP_RND_ZERO          1
# define FP_RND_PINF          2
# define FP_RND_MINF          3
#ifndef FP_ROUNDMODE
# define FP_ROUNDMODE         FP_RND_NEAREST
#endif
#endif

#define _FP_ROUND_NEAREST(wc, X)                \
({  int __ret = 0;                              \
    int __frac = _FP_FRAC_LOW_##wc(X) & 15;           \
    if (__frac & 7) {                           \
      __ret = EFLAG_INEXACT;                    \
      if ((__frac & 7) != _FP_WORK_ROUND)       \
        _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);        \
      else if (__frac & _FP_WORK_LSB)                 \
        _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);        \
    }                                     \
    __ret;                                \
})

#define _FP_ROUND_ZERO(wc, X)                   \
({  int __ret = 0;                              \
    if (_FP_FRAC_LOW_##wc(X) & 7)               \
      __ret = EFLAG_INEXACT;                    \
    __ret;                                \
})

#define _FP_ROUND_PINF(wc, X)                   \
({  int __ret = EFLAG_INEXACT;                        \
    if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7))         \
      _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);            \
    else __ret = 0;                             \
    __ret;                                \
})

#define _FP_ROUND_MINF(wc, X)                   \
({  int __ret = EFLAG_INEXACT;                        \
    if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7))          \
      _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);            \
    else __ret = 0;                             \
    __ret;                                \
})

#define _FP_ROUND(wc, X)                  \
({    int __ret = 0;                      \
      switch (FP_ROUNDMODE)               \
      {                             \
        case FP_RND_NEAREST:              \
          __ret |= _FP_ROUND_NEAREST(wc,X);     \
          break;                    \
        case FP_RND_ZERO:                 \
          __ret |= _FP_ROUND_ZERO(wc,X);  \
          break;                    \
        case FP_RND_PINF:                 \
          __ret |= _FP_ROUND_PINF(wc,X);  \
          break;                    \
        case FP_RND_MINF:                 \
          __ret |= _FP_ROUND_MINF(wc,X);  \
          break;                    \
      };                            \
      __ret;                              \
})

#define FP_CLS_NORMAL         0
#define FP_CLS_ZERO           1
#define FP_CLS_INF            2
#define FP_CLS_NAN            3

#define _FP_CLS_COMBINE(x,y)  (((x) << 2) | (y))

#include "op-1.h"
#include "op-2.h"
#include "op-4.h"
#include "op-common.h"

/* Sigh.  Silly things longlong.h needs.  */
#define UWtype          _FP_W_TYPE
#define W_TYPE_SIZE     _FP_W_TYPE_SIZE

typedef int SItype __attribute__((mode(SI)));
typedef int DItype __attribute__((mode(DI)));
typedef unsigned int USItype __attribute__((mode(SI)));
typedef unsigned int UDItype __attribute__((mode(DI)));
#if _FP_W_TYPE_SIZE == 32
typedef unsigned int UHWtype __attribute__((mode(HI)));
#elif _FP_W_TYPE_SIZE == 64
typedef USItype UHWtype;
#endif

#endif

Generated by  Doxygen 1.6.0   Back to index