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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* Software floating-point emulation.
  2.    Definitions for IEEE Extended Precision.
  3.    Copyright (C) 1999 Free Software Foundation, Inc.
  4.    This file is part of the GNU C Library.
  5.    Contributed by Jakub Jelinek (jj@ultra.linux.cz).
  6.    The GNU C Library is free software; you can redistribute it and/or
  7.    modify it under the terms of the GNU Library General Public License as
  8.    published by the Free Software Foundation; either version 2 of the
  9.    License, or (at your option) any later version.
  10.    The GNU C Library is distributed in the hope that it will be useful,
  11.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.    Library General Public License for more details.
  14.    You should have received a copy of the GNU Library General Public
  15.    License along with the GNU C Library; see the file COPYING.LIB.  If
  16.    not, write to the Free Software Foundation, Inc.,
  17.    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  18. #ifndef    __MATH_EMU_EXTENDED_H__
  19. #define    __MATH_EMU_EXTENDED_H__
  20. #if _FP_W_TYPE_SIZE < 32
  21. #error "Here's a nickel, kid. Go buy yourself a real computer."
  22. #endif
  23. #if _FP_W_TYPE_SIZE < 64
  24. #define _FP_FRACTBITS_E         (4*_FP_W_TYPE_SIZE)
  25. #else
  26. #define _FP_FRACTBITS_E (2*_FP_W_TYPE_SIZE)
  27. #endif
  28. #define _FP_FRACBITS_E 64
  29. #define _FP_FRACXBITS_E (_FP_FRACTBITS_E - _FP_FRACBITS_E)
  30. #define _FP_WFRACBITS_E (_FP_WORKBITS + _FP_FRACBITS_E)
  31. #define _FP_WFRACXBITS_E (_FP_FRACTBITS_E - _FP_WFRACBITS_E)
  32. #define _FP_EXPBITS_E 15
  33. #define _FP_EXPBIAS_E 16383
  34. #define _FP_EXPMAX_E 32767
  35. #define _FP_QNANBIT_E
  36. ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2) % _FP_W_TYPE_SIZE)
  37. #define _FP_IMPLBIT_E
  38. ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1) % _FP_W_TYPE_SIZE)
  39. #define _FP_OVERFLOW_E
  40. ((_FP_W_TYPE)1 << (_FP_WFRACBITS_E % _FP_W_TYPE_SIZE))
  41. #if _FP_W_TYPE_SIZE < 64
  42. union _FP_UNION_E
  43. {
  44.    long double flt;
  45.    struct 
  46.    {
  47. #if __BYTE_ORDER == __BIG_ENDIAN
  48.       unsigned long pad1 : _FP_W_TYPE_SIZE;
  49.       unsigned long pad2 : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
  50.       unsigned long sign : 1;
  51.       unsigned long exp : _FP_EXPBITS_E;
  52.       unsigned long frac1 : _FP_W_TYPE_SIZE;
  53.       unsigned long frac0 : _FP_W_TYPE_SIZE;
  54. #else
  55.       unsigned long frac0 : _FP_W_TYPE_SIZE;
  56.       unsigned long frac1 : _FP_W_TYPE_SIZE;
  57.       unsigned exp : _FP_EXPBITS_E;
  58.       unsigned sign : 1;
  59. #endif /* not bigendian */
  60.    } bits __attribute__((packed));
  61. };
  62. #define FP_DECL_E(X) _FP_DECL(4,X)
  63. #define FP_UNPACK_RAW_E(X, val)
  64.   do {
  65.     union _FP_UNION_E _flo; _flo.flt = (val);
  66.     X##_f[2] = 0; X##_f[3] = 0;
  67.     X##_f[0] = _flo.bits.frac0;
  68.     X##_f[1] = _flo.bits.frac1;
  69.     X##_e  = _flo.bits.exp;
  70.     X##_s  = _flo.bits.sign;
  71.     if (!X##_e && (X##_f[1] || X##_f[0])
  72.         && !(X##_f[1] & _FP_IMPLBIT_E))
  73.       {
  74.         X##_e++;
  75.         FP_SET_EXCEPTION(FP_EX_DENORM);
  76.       }
  77.   } while (0)
  78. #define FP_UNPACK_RAW_EP(X, val)
  79.   do {
  80.     union _FP_UNION_E *_flo =
  81.     (union _FP_UNION_E *)(val);
  82.     X##_f[2] = 0; X##_f[3] = 0;
  83.     X##_f[0] = _flo->bits.frac0;
  84.     X##_f[1] = _flo->bits.frac1;
  85.     X##_e  = _flo->bits.exp;
  86.     X##_s  = _flo->bits.sign;
  87.     if (!X##_e && (X##_f[1] || X##_f[0])
  88.         && !(X##_f[1] & _FP_IMPLBIT_E))
  89.       {
  90.         X##_e++;
  91.         FP_SET_EXCEPTION(FP_EX_DENORM);
  92.       }
  93.   } while (0)
  94. #define FP_PACK_RAW_E(val, X)
  95.   do {
  96.     union _FP_UNION_E _flo;
  97.     if (X##_e) X##_f[1] |= _FP_IMPLBIT_E;
  98.     else X##_f[1] &= ~(_FP_IMPLBIT_E);
  99.     _flo.bits.frac0 = X##_f[0];
  100.     _flo.bits.frac1 = X##_f[1];
  101.     _flo.bits.exp   = X##_e;
  102.     _flo.bits.sign  = X##_s;
  103.     (val) = _flo.flt;
  104.   } while (0)
  105. #define FP_PACK_RAW_EP(val, X)
  106.   do {
  107.     if (!FP_INHIBIT_RESULTS)
  108.       {
  109. union _FP_UNION_E *_flo =
  110.   (union _FP_UNION_E *)(val);
  111. if (X##_e) X##_f[1] |= _FP_IMPLBIT_E;
  112. else X##_f[1] &= ~(_FP_IMPLBIT_E);
  113. _flo->bits.frac0 = X##_f[0];
  114. _flo->bits.frac1 = X##_f[1];
  115. _flo->bits.exp   = X##_e;
  116. _flo->bits.sign  = X##_s;
  117.       }
  118.   } while (0)
  119. #define FP_UNPACK_E(X,val)
  120.   do {
  121.     FP_UNPACK_RAW_E(X,val);
  122.     _FP_UNPACK_CANONICAL(E,4,X);
  123.   } while (0)
  124. #define FP_UNPACK_EP(X,val)
  125.   do {
  126.     FP_UNPACK_RAW_2_P(X,val);
  127.     _FP_UNPACK_CANONICAL(E,4,X);
  128.   } while (0)
  129. #define FP_PACK_E(val,X)
  130.   do {
  131.     _FP_PACK_CANONICAL(E,4,X);
  132.     FP_PACK_RAW_E(val,X);
  133.   } while (0)
  134. #define FP_PACK_EP(val,X)
  135.   do {
  136.     _FP_PACK_CANONICAL(E,4,X);
  137.     FP_PACK_RAW_EP(val,X);
  138.   } while (0)
  139. #define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,4,X)
  140. #define FP_NEG_E(R,X) _FP_NEG(E,4,R,X)
  141. #define FP_ADD_E(R,X,Y) _FP_ADD(E,4,R,X,Y)
  142. #define FP_SUB_E(R,X,Y) _FP_SUB(E,4,R,X,Y)
  143. #define FP_MUL_E(R,X,Y) _FP_MUL(E,4,R,X,Y)
  144. #define FP_DIV_E(R,X,Y) _FP_DIV(E,4,R,X,Y)
  145. #define FP_SQRT_E(R,X) _FP_SQRT(E,4,R,X)
  146. /*
  147.  * Square root algorithms:
  148.  * We have just one right now, maybe Newton approximation
  149.  * should be added for those machines where division is fast.
  150.  * This has special _E version because standard _4 square
  151.  * root would not work (it has to start normally with the
  152.  * second word and not the first), but as we have to do it
  153.  * anyway, we optimize it by doing most of the calculations
  154.  * in two UWtype registers instead of four.
  155.  */
  156.  
  157. #define _FP_SQRT_MEAT_E(R, S, T, X, q)
  158.   do {
  159.     q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);
  160.     _FP_FRAC_SRL_4(X, (_FP_WORKBITS));
  161.     while (q)
  162.       {
  163. T##_f[1] = S##_f[1] + q;
  164. if (T##_f[1] <= X##_f[1])
  165.   {
  166.     S##_f[1] = T##_f[1] + q;
  167.     X##_f[1] -= T##_f[1];
  168.     R##_f[1] += q;
  169.   }
  170. _FP_FRAC_SLL_2(X, 1);
  171. q >>= 1;
  172.       }
  173.     q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);
  174.     while (q)
  175.       {
  176. T##_f[0] = S##_f[0] + q;
  177. T##_f[1] = S##_f[1];
  178. if (T##_f[1] < X##_f[1] || 
  179.     (T##_f[1] == X##_f[1] &&
  180.      T##_f[0] <= X##_f[0]))
  181.   {
  182.     S##_f[0] = T##_f[0] + q;
  183.     S##_f[1] += (T##_f[0] > S##_f[0]);
  184.     _FP_FRAC_DEC_2(X, T);
  185.     R##_f[0] += q;
  186.   }
  187. _FP_FRAC_SLL_2(X, 1);
  188. q >>= 1;
  189.       }
  190.     _FP_FRAC_SLL_4(R, (_FP_WORKBITS));
  191.     if (X##_f[0] | X##_f[1])
  192.       {
  193. if (S##_f[1] < X##_f[1] || 
  194.     (S##_f[1] == X##_f[1] &&
  195.      S##_f[0] < X##_f[0]))
  196.   R##_f[0] |= _FP_WORK_ROUND;
  197. R##_f[0] |= _FP_WORK_STICKY;
  198.       }
  199.   } while (0)
  200. #define FP_CMP_E(r,X,Y,un) _FP_CMP(E,4,r,X,Y,un)
  201. #define FP_CMP_EQ_E(r,X,Y) _FP_CMP_EQ(E,4,r,X,Y)
  202. #define FP_TO_INT_E(r,X,rsz,rsg) _FP_TO_INT(E,4,r,X,rsz,rsg)
  203. #define FP_TO_INT_ROUND_E(r,X,rsz,rsg) _FP_TO_INT_ROUND(E,4,r,X,rsz,rsg)
  204. #define FP_FROM_INT_E(X,r,rs,rt) _FP_FROM_INT(E,4,X,r,rs,rt)
  205. #define _FP_FRAC_HIGH_E(X) (X##_f[2])
  206. #define _FP_FRAC_HIGH_RAW_E(X) (X##_f[1])
  207. #else   /* not _FP_W_TYPE_SIZE < 64 */
  208. union _FP_UNION_E
  209. {
  210.   long double flt /* __attribute__((mode(TF))) */ ;
  211.   struct {
  212. #if __BYTE_ORDER == __BIG_ENDIAN
  213.     unsigned long pad : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
  214.     unsigned sign  : 1;
  215.     unsigned exp   : _FP_EXPBITS_E;
  216.     unsigned long frac : _FP_W_TYPE_SIZE;
  217. #else
  218.     unsigned long frac : _FP_W_TYPE_SIZE;
  219.     unsigned exp   : _FP_EXPBITS_E;
  220.     unsigned sign  : 1;
  221. #endif
  222.   } bits;
  223. };
  224. #define FP_DECL_E(X) _FP_DECL(2,X)
  225. #define FP_UNPACK_RAW_E(X, val)
  226.   do {
  227.     union _FP_UNION_E _flo; _flo.flt = (val);
  228.     X##_f0 = _flo.bits.frac;
  229.     X##_f1 = 0;
  230.     X##_e = _flo.bits.exp;
  231.     X##_s = _flo.bits.sign;
  232.     if (!X##_e && X##_f0 && !(X##_f0 & _FP_IMPLBIT_E))
  233.       {
  234.         X##_e++;
  235.         FP_SET_EXCEPTION(FP_EX_DENORM);
  236.       }
  237.   } while (0)
  238. #define FP_UNPACK_RAW_EP(X, val)
  239.   do {
  240.     union _FP_UNION_E *_flo =
  241.       (union _FP_UNION_E *)(val);
  242.     X##_f0 = _flo->bits.frac;
  243.     X##_f1 = 0;
  244.     X##_e = _flo->bits.exp;
  245.     X##_s = _flo->bits.sign;
  246.     if (!X##_e && X##_f0 && !(X##_f0 & _FP_IMPLBIT_E))
  247.       {
  248.         X##_e++;
  249.         FP_SET_EXCEPTION(FP_EX_DENORM);
  250.       }
  251.   } while (0)
  252. #define FP_PACK_RAW_E(val, X)
  253.   do {
  254.     union _FP_UNION_E _flo;
  255.     if (X##_e) X##_f0 |= _FP_IMPLBIT_E;
  256.     else X##_f0 &= ~(_FP_IMPLBIT_E);
  257.     _flo.bits.frac = X##_f0;
  258.     _flo.bits.exp  = X##_e;
  259.     _flo.bits.sign = X##_s;
  260.     (val) = _flo.flt;
  261.   } while (0)
  262. #define FP_PACK_RAW_EP(fs, val, X)
  263.   do {
  264.     if (!FP_INHIBIT_RESULTS)
  265.       {
  266. union _FP_UNION_E *_flo =
  267.   (union _FP_UNION_E *)(val);
  268. if (X##_e) X##_f0 |= _FP_IMPLBIT_E;
  269. else X##_f0 &= ~(_FP_IMPLBIT_E);
  270. _flo->bits.frac = X##_f0;
  271. _flo->bits.exp  = X##_e;
  272. _flo->bits.sign = X##_s;
  273.       }
  274.   } while (0)
  275. #define FP_UNPACK_E(X,val)
  276.   do {
  277.     FP_UNPACK_RAW_E(X,val);
  278.     _FP_UNPACK_CANONICAL(E,2,X);
  279.   } while (0)
  280. #define FP_UNPACK_EP(X,val)
  281.   do {
  282.     FP_UNPACK_RAW_EP(X,val);
  283.     _FP_UNPACK_CANONICAL(E,2,X);
  284.   } while (0)
  285. #define FP_PACK_E(val,X)
  286.   do {
  287.     _FP_PACK_CANONICAL(E,2,X);
  288.     FP_PACK_RAW_E(val,X);
  289.   } while (0)
  290. #define FP_PACK_EP(val,X)
  291.   do {
  292.     _FP_PACK_CANONICAL(E,2,X);
  293.     FP_PACK_RAW_EP(val,X);
  294.   } while (0)
  295. #define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,2,X)
  296. #define FP_NEG_E(R,X) _FP_NEG(E,2,R,X)
  297. #define FP_ADD_E(R,X,Y) _FP_ADD(E,2,R,X,Y)
  298. #define FP_SUB_E(R,X,Y) _FP_SUB(E,2,R,X,Y)
  299. #define FP_MUL_E(R,X,Y) _FP_MUL(E,2,R,X,Y)
  300. #define FP_DIV_E(R,X,Y) _FP_DIV(E,2,R,X,Y)
  301. #define FP_SQRT_E(R,X) _FP_SQRT(E,2,R,X)
  302. /*
  303.  * Square root algorithms:
  304.  * We have just one right now, maybe Newton approximation
  305.  * should be added for those machines where division is fast.
  306.  * We optimize it by doing most of the calculations
  307.  * in one UWtype registers instead of two, although we don't
  308.  * have to.
  309.  */
  310. #define _FP_SQRT_MEAT_E(R, S, T, X, q)
  311.   do {
  312.     q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);
  313.     _FP_FRAC_SRL_2(X, (_FP_WORKBITS));
  314.     while (q)
  315.       {
  316.         T##_f0 = S##_f0 + q;
  317.         if (T##_f0 <= X##_f0)
  318.           {
  319.             S##_f0 = T##_f0 + q;
  320.             X##_f0 -= T##_f0;
  321.             R##_f0 += q;
  322.           }
  323.         _FP_FRAC_SLL_1(X, 1);
  324.         q >>= 1;
  325.       }
  326.     _FP_FRAC_SLL_2(R, (_FP_WORKBITS));
  327.     if (X##_f0)
  328.       {
  329. if (S##_f0 < X##_f0)
  330.   R##_f0 |= _FP_WORK_ROUND;
  331. R##_f0 |= _FP_WORK_STICKY;
  332.       }
  333.   } while (0)
  334.  
  335. #define FP_CMP_E(r,X,Y,un) _FP_CMP(E,2,r,X,Y,un)
  336. #define FP_CMP_EQ_E(r,X,Y) _FP_CMP_EQ(E,2,r,X,Y)
  337. #define FP_TO_INT_E(r,X,rsz,rsg) _FP_TO_INT(E,2,r,X,rsz,rsg)
  338. #define FP_TO_INT_ROUND_E(r,X,rsz,rsg) _FP_TO_INT_ROUND(E,2,r,X,rsz,rsg)
  339. #define FP_FROM_INT_E(X,r,rs,rt) _FP_FROM_INT(E,2,X,r,rs,rt)
  340. #define _FP_FRAC_HIGH_E(X) (X##_f1)
  341. #define _FP_FRAC_HIGH_RAW_E(X) (X##_f0)
  342. #endif /* not _FP_W_TYPE_SIZE < 64 */
  343. #endif /* __MATH_EMU_EXTENDED_H__ */