soft-fp.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.soft-fp.h 1.5 05/17/01 18:14:23 cort
  3.  */
  4. #ifndef SOFT_FP_H
  5. #define SOFT_FP_H
  6. #include "sfp-machine.h"
  7. #define _FP_WORKBITS 3
  8. #define _FP_WORK_LSB ((_FP_W_TYPE)1 << 3)
  9. #define _FP_WORK_ROUND ((_FP_W_TYPE)1 << 2)
  10. #define _FP_WORK_GUARD ((_FP_W_TYPE)1 << 1)
  11. #define _FP_WORK_STICKY ((_FP_W_TYPE)1 << 0)
  12. #ifndef FP_RND_NEAREST
  13. # define FP_RND_NEAREST 0
  14. # define FP_RND_ZERO 1
  15. # define FP_RND_PINF 2
  16. # define FP_RND_MINF 3
  17. #ifndef FP_ROUNDMODE
  18. # define FP_ROUNDMODE FP_RND_NEAREST
  19. #endif
  20. #endif
  21. #define _FP_ROUND_NEAREST(wc, X)
  22. ({  int __ret = 0;
  23.     int __frac = _FP_FRAC_LOW_##wc(X) & 15;
  24.     if (__frac & 7) {
  25.       __ret = EFLAG_INEXACT;
  26.       if ((__frac & 7) != _FP_WORK_ROUND)
  27.         _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);
  28.       else if (__frac & _FP_WORK_LSB)
  29.         _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);
  30.     }
  31.     __ret;
  32. })
  33. #define _FP_ROUND_ZERO(wc, X)
  34. ({  int __ret = 0;
  35.     if (_FP_FRAC_LOW_##wc(X) & 7)
  36.       __ret = EFLAG_INEXACT;
  37.     __ret;
  38. })
  39. #define _FP_ROUND_PINF(wc, X)
  40. ({  int __ret = EFLAG_INEXACT;
  41.     if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7))
  42.       _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);
  43.     else __ret = 0;
  44.     __ret;
  45. })
  46. #define _FP_ROUND_MINF(wc, X)
  47. ({  int __ret = EFLAG_INEXACT;
  48.     if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7))
  49.       _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);
  50.     else __ret = 0;
  51.     __ret;
  52. })
  53. #define _FP_ROUND(wc, X)
  54. ({ int __ret = 0;
  55. switch (FP_ROUNDMODE)
  56. {
  57.   case FP_RND_NEAREST:
  58.     __ret |= _FP_ROUND_NEAREST(wc,X);
  59.     break;
  60.   case FP_RND_ZERO:
  61.     __ret |= _FP_ROUND_ZERO(wc,X);
  62.     break;
  63.   case FP_RND_PINF:
  64.     __ret |= _FP_ROUND_PINF(wc,X);
  65.     break;
  66.   case FP_RND_MINF:
  67.     __ret |= _FP_ROUND_MINF(wc,X);
  68.     break;
  69. };
  70. __ret;
  71. })
  72. #define FP_CLS_NORMAL 0
  73. #define FP_CLS_ZERO 1
  74. #define FP_CLS_INF 2
  75. #define FP_CLS_NAN 3
  76. #define _FP_CLS_COMBINE(x,y) (((x) << 2) | (y))
  77. #include "op-1.h"
  78. #include "op-2.h"
  79. #include "op-4.h"
  80. #include "op-common.h"
  81. /* Sigh.  Silly things longlong.h needs.  */
  82. #define UWtype _FP_W_TYPE
  83. #define W_TYPE_SIZE _FP_W_TYPE_SIZE
  84. typedef int SItype __attribute__((mode(SI)));
  85. typedef int DItype __attribute__((mode(DI)));
  86. typedef unsigned int USItype __attribute__((mode(SI)));
  87. typedef unsigned int UDItype __attribute__((mode(DI)));
  88. #if _FP_W_TYPE_SIZE == 32
  89. typedef unsigned int UHWtype __attribute__((mode(HI)));
  90. #elif _FP_W_TYPE_SIZE == 64
  91. typedef USItype UHWtype;
  92. #endif
  93. #endif