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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* 
  2.  * IEEE754 floating point
  3.  * common internal header file
  4.  */
  5. /*
  6.  * MIPS floating point support
  7.  * Copyright (C) 1994-2000 Algorithmics Ltd.  All rights reserved.
  8.  * http://www.algor.co.uk
  9.  *
  10.  * ########################################################################
  11.  *
  12.  *  This program is free software; you can distribute it and/or modify it
  13.  *  under the terms of the GNU General Public License (Version 2) as
  14.  *  published by the Free Software Foundation.
  15.  *
  16.  *  This program is distributed in the hope it will be useful, but WITHOUT
  17.  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  18.  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  19.  *  for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License along
  22.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  23.  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  24.  *
  25.  * ########################################################################
  26.  */
  27. #include "ieee754.h"
  28. #define DP_EBIAS 1023
  29. #define DP_EMIN (-1022)
  30. #define DP_EMAX 1023
  31. #define DP_MBITS 52
  32. #define SP_EBIAS 127
  33. #define SP_EMIN (-126)
  34. #define SP_EMAX 127
  35. #define SP_MBITS 23
  36. #define DP_MBIT(x) ((unsigned long long)1 << (x))
  37. #define DP_HIDDEN_BIT DP_MBIT(DP_MBITS)
  38. #define DP_SIGN_BIT DP_MBIT(63)
  39. #define SP_MBIT(x) ((unsigned long)1 << (x))
  40. #define SP_HIDDEN_BIT SP_MBIT(SP_MBITS)
  41. #define SP_SIGN_BIT SP_MBIT(31)
  42. #define SPSIGN(sp) (sp.parts.sign)
  43. #define SPBEXP(sp) (sp.parts.bexp)
  44. #define SPMANT(sp) (sp.parts.mant)
  45. #define DPSIGN(dp) (dp.parts.sign)
  46. #define DPBEXP(dp) (dp.parts.bexp)
  47. #define DPMANT(dp) (dp.parts.mant)
  48. #define CLPAIR(x,y) ((x)*6+(y))
  49. #define CLEARCX
  50.   (ieee754_csr.cx = 0)
  51. #define SETCX(x) 
  52.   (ieee754_csr.cx |= (x),ieee754_csr.sx |= (x),ieee754_csr.mx & (x))
  53. #define TSTX()
  54. (ieee754_csr.cx & ieee754_csr.mx)
  55. #define COMPXSP 
  56.   unsigned xm; int xe; int xs; int xc
  57. #define COMPYSP 
  58.   unsigned ym; int ye; int ys; int yc
  59. #define EXPLODESP(v,vc,vs,ve,vm) 
  60. {
  61.     vs = SPSIGN(v);
  62.     ve = SPBEXP(v);
  63.     vm = SPMANT(v);
  64.     if(ve == SP_EMAX+1+SP_EBIAS){
  65. if(vm == 0)
  66.   vc = IEEE754_CLASS_INF;
  67. else if(vm & SP_MBIT(SP_MBITS-1)) 
  68.   vc = IEEE754_CLASS_QNAN;
  69. else 
  70.   vc = IEEE754_CLASS_SNAN;
  71.     } else if(ve == SP_EMIN-1+SP_EBIAS) {
  72. if(vm) {
  73.     ve = SP_EMIN;
  74.     vc = IEEE754_CLASS_DNORM;
  75. } else
  76.   vc = IEEE754_CLASS_ZERO;
  77.     } else {
  78. ve -= SP_EBIAS;
  79. vm |= SP_HIDDEN_BIT;
  80. vc = IEEE754_CLASS_NORM;
  81.     }
  82. }
  83. #define EXPLODEXSP EXPLODESP(x,xc,xs,xe,xm)
  84. #define EXPLODEYSP EXPLODESP(y,yc,ys,ye,ym)
  85. #define COMPXDP 
  86. unsigned long long xm; int xe; int xs; int xc
  87. #define COMPYDP 
  88. unsigned long long ym; int ye; int ys; int yc
  89. #define EXPLODEDP(v,vc,vs,ve,vm) 
  90. {
  91.     vm = DPMANT(v);
  92.     vs = DPSIGN(v);
  93.     ve = DPBEXP(v);
  94.     if(ve == DP_EMAX+1+DP_EBIAS){
  95. if(vm == 0)
  96.   vc = IEEE754_CLASS_INF;
  97. else if(vm & DP_MBIT(DP_MBITS-1)) 
  98.   vc = IEEE754_CLASS_QNAN;
  99. else 
  100.   vc = IEEE754_CLASS_SNAN;
  101.     } else if(ve == DP_EMIN-1+DP_EBIAS) {
  102. if(vm) {
  103.     ve = DP_EMIN;
  104.     vc = IEEE754_CLASS_DNORM;
  105. } else
  106.   vc = IEEE754_CLASS_ZERO;
  107.     } else {
  108. ve -= DP_EBIAS;
  109. vm |= DP_HIDDEN_BIT;
  110. vc = IEEE754_CLASS_NORM;
  111.     }
  112. }
  113. #define EXPLODEXDP EXPLODEDP(x,xc,xs,xe,xm)
  114. #define EXPLODEYDP EXPLODEDP(y,yc,ys,ye,ym)