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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* Software floating-point emulation. Common operations.
  2.    Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
  3.    This file is part of the GNU C Library.
  4.    Contributed by Richard Henderson (rth@cygnus.com),
  5.   Jakub Jelinek (jj@ultra.linux.cz),
  6.   David S. Miller (davem@redhat.com) and
  7.   Peter Maydell (pmaydell@chiark.greenend.org.uk).
  8.    The GNU C Library is free software; you can redistribute it and/or
  9.    modify it under the terms of the GNU Library General Public License as
  10.    published by the Free Software Foundation; either version 2 of the
  11.    License, or (at your option) any later version.
  12.    The GNU C Library is distributed in the hope that it will be useful,
  13.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.    Library General Public License for more details.
  16.    You should have received a copy of the GNU Library General Public
  17.    License along with the GNU C Library; see the file COPYING.LIB.  If
  18.    not, write to the Free Software Foundation, Inc.,
  19.    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  20. #ifndef __MATH_EMU_OP_COMMON_H__
  21. #define __MATH_EMU_OP_COMMON_H__
  22. #define _FP_DECL(wc, X)
  23.   _FP_I_TYPE X##_c, X##_s, X##_e;
  24.   _FP_FRAC_DECL_##wc(X)
  25. /*
  26.  * Finish truely unpacking a native fp value by classifying the kind
  27.  * of fp value and normalizing both the exponent and the fraction.
  28.  */
  29. #define _FP_UNPACK_CANONICAL(fs, wc, X)
  30. do {
  31.   switch (X##_e)
  32.   {
  33.   default:
  34.     _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_IMPLBIT_##fs;
  35.     _FP_FRAC_SLL_##wc(X, _FP_WORKBITS);
  36.     X##_e -= _FP_EXPBIAS_##fs;
  37.     X##_c = FP_CLS_NORMAL;
  38.     break;
  39.   case 0:
  40.     if (_FP_FRAC_ZEROP_##wc(X))
  41.       X##_c = FP_CLS_ZERO;
  42.     else
  43.       {
  44. /* a denormalized number */
  45. _FP_I_TYPE _shift;
  46. _FP_FRAC_CLZ_##wc(_shift, X);
  47. _shift -= _FP_FRACXBITS_##fs;
  48. _FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS));
  49. X##_e -= _FP_EXPBIAS_##fs - 1 + _shift;
  50. X##_c = FP_CLS_NORMAL;
  51. FP_SET_EXCEPTION(FP_EX_DENORM);
  52. if (FP_DENORM_ZERO)
  53.   {
  54.     FP_SET_EXCEPTION(FP_EX_INEXACT);
  55.     X##_c = FP_CLS_ZERO;
  56.   }
  57.       }
  58.     break;
  59.   case _FP_EXPMAX_##fs:
  60.     if (_FP_FRAC_ZEROP_##wc(X))
  61.       X##_c = FP_CLS_INF;
  62.     else
  63.       {
  64. X##_c = FP_CLS_NAN;
  65. /* Check for signaling NaN */
  66. if (!(_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs))
  67.   FP_SET_EXCEPTION(FP_EX_INVALID);
  68.       }
  69.     break;
  70.   }
  71. } while (0)
  72. /*
  73.  * Before packing the bits back into the native fp result, take care
  74.  * of such mundane things as rounding and overflow.  Also, for some
  75.  * kinds of fp values, the original parts may not have been fully
  76.  * extracted -- but that is ok, we can regenerate them now.
  77.  */
  78. #define _FP_PACK_CANONICAL(fs, wc, X)
  79. do {
  80.   switch (X##_c)
  81.   {
  82.   case FP_CLS_NORMAL:
  83.     X##_e += _FP_EXPBIAS_##fs;
  84.     if (X##_e > 0)
  85.       {
  86. _FP_ROUND(wc, X);
  87. if (_FP_FRAC_OVERP_##wc(fs, X))
  88.   {
  89.     _FP_FRAC_SRL_##wc(X, (_FP_WORKBITS+1));
  90.     X##_e++;
  91.   }
  92. else
  93.   _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);
  94. if (X##_e >= _FP_EXPMAX_##fs)
  95.   {
  96.     /* overflow */
  97.     switch (FP_ROUNDMODE)
  98.       {
  99.       case FP_RND_NEAREST:
  100. X##_c = FP_CLS_INF;
  101. break;
  102.       case FP_RND_PINF:
  103. if (!X##_s) X##_c = FP_CLS_INF;
  104. break;
  105.       case FP_RND_MINF:
  106. if (X##_s) X##_c = FP_CLS_INF;
  107. break;
  108.       }
  109.     if (X##_c == FP_CLS_INF)
  110.       {
  111. /* Overflow to infinity */
  112. X##_e = _FP_EXPMAX_##fs;
  113. _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);
  114.       }
  115.     else
  116.       {
  117. /* Overflow to maximum normal */
  118. X##_e = _FP_EXPMAX_##fs - 1;
  119. _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc);
  120.       }
  121.     FP_SET_EXCEPTION(FP_EX_OVERFLOW);
  122.             FP_SET_EXCEPTION(FP_EX_INEXACT);
  123.   }
  124.       }
  125.     else
  126.       {
  127. /* we've got a denormalized number */
  128. X##_e = -X##_e + 1;
  129. if (X##_e <= _FP_WFRACBITS_##fs)
  130.   {
  131.     _FP_FRAC_SRS_##wc(X, X##_e, _FP_WFRACBITS_##fs);
  132.     _FP_ROUND(wc, X);
  133.     if (_FP_FRAC_HIGH_##fs(X)
  134. & (_FP_OVERFLOW_##fs >> 1))
  135.       {
  136.         X##_e = 1;
  137.         _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);
  138.       }
  139.     else
  140.       {
  141. X##_e = 0;
  142. _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);
  143. FP_SET_EXCEPTION(FP_EX_UNDERFLOW);
  144.       }
  145.   }
  146. else
  147.   {
  148.     /* underflow to zero */
  149.     X##_e = 0;
  150.     if (!_FP_FRAC_ZEROP_##wc(X))
  151.       {
  152.         _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);
  153.         _FP_ROUND(wc, X);
  154.         _FP_FRAC_LOW_##wc(X) >>= (_FP_WORKBITS);
  155.       }
  156.     FP_SET_EXCEPTION(FP_EX_UNDERFLOW);
  157.   }
  158.       }
  159.     break;
  160.   case FP_CLS_ZERO:
  161.     X##_e = 0;
  162.     _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);
  163.     break;
  164.   case FP_CLS_INF:
  165.     X##_e = _FP_EXPMAX_##fs;
  166.     _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);
  167.     break;
  168.   case FP_CLS_NAN:
  169.     X##_e = _FP_EXPMAX_##fs;
  170.     if (!_FP_KEEPNANFRACP)
  171.       {
  172. _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);
  173. X##_s = _FP_NANSIGN_##fs;
  174.       }
  175.     else
  176.       _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs;
  177.     break;
  178.   }
  179. } while (0)
  180. /* This one accepts raw argument and not cooked,  returns
  181.  * 1 if X is a signaling NaN.
  182.  */
  183. #define _FP_ISSIGNAN(fs, wc, X)
  184. ({
  185.   int __ret = 0;
  186.   if (X##_e == _FP_EXPMAX_##fs)
  187.     {
  188.       if (!_FP_FRAC_ZEROP_##wc(X)
  189.   && !(_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs))
  190. __ret = 1;
  191.     }
  192.   __ret;
  193. })
  194. /*
  195.  * Main addition routine.  The input values should be cooked.
  196.  */
  197. #define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP)      
  198. do {      
  199.   switch (_FP_CLS_COMBINE(X##_c, Y##_c))      
  200.   {      
  201.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):      
  202.     {      
  203.       /* shift the smaller number so that its exponent matches the larger */ 
  204.       _FP_I_TYPE diff = X##_e - Y##_e;      
  205.      
  206.       if (diff < 0)      
  207. {      
  208.   diff = -diff;      
  209.   if (diff <= _FP_WFRACBITS_##fs)      
  210.     _FP_FRAC_SRS_##wc(X, diff, _FP_WFRACBITS_##fs);      
  211.   else if (!_FP_FRAC_ZEROP_##wc(X))      
  212.     _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);      
  213.   R##_e = Y##_e;      
  214. }      
  215.       else      
  216. {      
  217.   if (diff > 0)      
  218.     {      
  219.       if (diff <= _FP_WFRACBITS_##fs)      
  220.         _FP_FRAC_SRS_##wc(Y, diff, _FP_WFRACBITS_##fs);      
  221.       else if (!_FP_FRAC_ZEROP_##wc(Y))      
  222.         _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc);      
  223.     }      
  224.   R##_e = X##_e;      
  225. }      
  226.      
  227.       R##_c = FP_CLS_NORMAL;      
  228.      
  229.       if (X##_s == Y##_s)      
  230. {      
  231.   R##_s = X##_s;      
  232.   _FP_FRAC_ADD_##wc(R, X, Y);      
  233.   if (_FP_FRAC_OVERP_##wc(fs, R))      
  234.     {      
  235.       _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);      
  236.       R##_e++;      
  237.     }      
  238. }      
  239.       else      
  240. {      
  241.   R##_s = X##_s;      
  242.   _FP_FRAC_SUB_##wc(R, X, Y);      
  243.   if (_FP_FRAC_ZEROP_##wc(R))      
  244.     {      
  245.       /* return an exact zero */      
  246.       if (FP_ROUNDMODE == FP_RND_MINF)      
  247. R##_s |= Y##_s;      
  248.       else      
  249. R##_s &= Y##_s;      
  250.       R##_c = FP_CLS_ZERO;      
  251.     }      
  252.   else      
  253.     {      
  254.       if (_FP_FRAC_NEGP_##wc(R))      
  255. {      
  256.   _FP_FRAC_SUB_##wc(R, Y, X);      
  257.   R##_s = Y##_s;      
  258. }      
  259.      
  260.       /* renormalize after subtraction */      
  261.       _FP_FRAC_CLZ_##wc(diff, R);      
  262.       diff -= _FP_WFRACXBITS_##fs;      
  263.       if (diff)      
  264. {      
  265.   R##_e -= diff;      
  266.   _FP_FRAC_SLL_##wc(R, diff);      
  267. }      
  268.     }      
  269. }      
  270.       break;      
  271.     }      
  272.      
  273.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):      
  274.     _FP_CHOOSENAN(fs, wc, R, X, Y, OP);      
  275.     break;      
  276.      
  277.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):      
  278.     R##_e = X##_e;      
  279.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):      
  280.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):      
  281.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):      
  282.     _FP_FRAC_COPY_##wc(R, X);      
  283.     R##_s = X##_s;      
  284.     R##_c = X##_c;      
  285.     break;      
  286.      
  287.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):      
  288.     R##_e = Y##_e;      
  289.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):      
  290.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):      
  291.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):      
  292.     _FP_FRAC_COPY_##wc(R, Y);      
  293.     R##_s = Y##_s;      
  294.     R##_c = Y##_c;      
  295.     break;      
  296.      
  297.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):      
  298.     if (X##_s != Y##_s)      
  299.       {      
  300. /* +INF + -INF => NAN */      
  301. _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);      
  302. R##_s = _FP_NANSIGN_##fs;      
  303. R##_c = FP_CLS_NAN;      
  304. FP_SET_EXCEPTION(FP_EX_INVALID);      
  305. break;      
  306.       }      
  307.     /* FALLTHRU */      
  308.      
  309.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):      
  310.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):      
  311.     R##_s = X##_s;      
  312.     R##_c = FP_CLS_INF;      
  313.     break;      
  314.      
  315.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):      
  316.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):      
  317.     R##_s = Y##_s;      
  318.     R##_c = FP_CLS_INF;      
  319.     break;      
  320.      
  321.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):      
  322.     /* make sure the sign is correct */      
  323.     if (FP_ROUNDMODE == FP_RND_MINF)      
  324.       R##_s = X##_s | Y##_s;      
  325.     else      
  326.       R##_s = X##_s & Y##_s;      
  327.     R##_c = FP_CLS_ZERO;      
  328.     break;      
  329.      
  330.   default:      
  331.     abort();      
  332.   }      
  333. } while (0)
  334. #define _FP_ADD(fs, wc, R, X, Y) _FP_ADD_INTERNAL(fs, wc, R, X, Y, '+')
  335. #define _FP_SUB(fs, wc, R, X, Y)      
  336.   do {      
  337.     if (Y##_c != FP_CLS_NAN) Y##_s ^= 1;      
  338.     _FP_ADD_INTERNAL(fs, wc, R, X, Y, '-');      
  339.   } while (0)
  340. /*
  341.  * Main negation routine.  FIXME -- when we care about setting exception
  342.  * bits reliably, this will not do.  We should examine all of the fp classes.
  343.  */
  344. #define _FP_NEG(fs, wc, R, X)
  345.   do {
  346.     _FP_FRAC_COPY_##wc(R, X);
  347.     R##_c = X##_c;
  348.     R##_e = X##_e;
  349.     R##_s = 1 ^ X##_s;
  350.   } while (0)
  351. /*
  352.  * Main multiplication routine.  The input values should be cooked.
  353.  */
  354. #define _FP_MUL(fs, wc, R, X, Y)
  355. do {
  356.   R##_s = X##_s ^ Y##_s;
  357.   switch (_FP_CLS_COMBINE(X##_c, Y##_c))
  358.   {
  359.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):
  360.     R##_c = FP_CLS_NORMAL;
  361.     R##_e = X##_e + Y##_e + 1;
  362.     _FP_MUL_MEAT_##fs(R,X,Y);
  363.     if (_FP_FRAC_OVERP_##wc(fs, R))
  364.       _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);
  365.     else
  366.       R##_e--;
  367.     break;
  368.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):
  369.     _FP_CHOOSENAN(fs, wc, R, X, Y, '*');
  370.     break;
  371.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):
  372.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):
  373.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):
  374.     R##_s = X##_s;
  375.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):
  376.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):
  377.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):
  378.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):
  379.     _FP_FRAC_COPY_##wc(R, X);
  380.     R##_c = X##_c;
  381.     break;
  382.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):
  383.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):
  384.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):
  385.     R##_s = Y##_s;
  386.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):
  387.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):
  388.     _FP_FRAC_COPY_##wc(R, Y);
  389.     R##_c = Y##_c;
  390.     break;
  391.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):
  392.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):
  393.     R##_s = _FP_NANSIGN_##fs;
  394.     R##_c = FP_CLS_NAN;
  395.     _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);
  396.     FP_SET_EXCEPTION(FP_EX_INVALID);
  397.     break;
  398.   default:
  399.     abort();
  400.   }
  401. } while (0)
  402. /*
  403.  * Main division routine.  The input values should be cooked.
  404.  */
  405. #define _FP_DIV(fs, wc, R, X, Y)
  406. do {
  407.   R##_s = X##_s ^ Y##_s;
  408.   switch (_FP_CLS_COMBINE(X##_c, Y##_c))
  409.   {
  410.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):
  411.     R##_c = FP_CLS_NORMAL;
  412.     R##_e = X##_e - Y##_e;
  413.     _FP_DIV_MEAT_##fs(R,X,Y);
  414.     break;
  415.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):
  416.     _FP_CHOOSENAN(fs, wc, R, X, Y, '/');
  417.     break;
  418.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):
  419.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):
  420.   case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):
  421.     R##_s = X##_s;
  422.     _FP_FRAC_COPY_##wc(R, X);
  423.     R##_c = X##_c;
  424.     break;
  425.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):
  426.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):
  427.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):
  428.     R##_s = Y##_s;
  429.     _FP_FRAC_COPY_##wc(R, Y);
  430.     R##_c = Y##_c;
  431.     break;
  432.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):
  433.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):
  434.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):
  435.     R##_c = FP_CLS_ZERO;
  436.     break;
  437.   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):
  438.     FP_SET_EXCEPTION(FP_EX_DIVZERO);
  439.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):
  440.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):
  441.     R##_c = FP_CLS_INF;
  442.     break;
  443.   case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):
  444.   case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):
  445.     R##_s = _FP_NANSIGN_##fs;
  446.     R##_c = FP_CLS_NAN;
  447.     _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);
  448.     FP_SET_EXCEPTION(FP_EX_INVALID);
  449.     break;
  450.   default:
  451.     abort();
  452.   }
  453. } while (0)
  454. /*
  455.  * Main differential comparison routine.  The inputs should be raw not
  456.  * cooked.  The return is -1,0,1 for normal values, 2 otherwise.
  457.  */
  458. #define _FP_CMP(fs, wc, ret, X, Y, un)
  459.   do {
  460.     /* NANs are unordered */
  461.     if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))
  462. || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)))
  463.       {
  464. ret = un;
  465.       }
  466.     else
  467.       {
  468. int __is_zero_x;
  469. int __is_zero_y;
  470. __is_zero_x = (!X##_e && _FP_FRAC_ZEROP_##wc(X)) ? 1 : 0;
  471. __is_zero_y = (!Y##_e && _FP_FRAC_ZEROP_##wc(Y)) ? 1 : 0;
  472. if (__is_zero_x && __is_zero_y)
  473. ret = 0;
  474. else if (__is_zero_x)
  475. ret = Y##_s ? 1 : -1;
  476. else if (__is_zero_y)
  477. ret = X##_s ? -1 : 1;
  478. else if (X##_s != Y##_s)
  479.   ret = X##_s ? -1 : 1;
  480. else if (X##_e > Y##_e)
  481.   ret = X##_s ? -1 : 1;
  482. else if (X##_e < Y##_e)
  483.   ret = X##_s ? 1 : -1;
  484. else if (_FP_FRAC_GT_##wc(X, Y))
  485.   ret = X##_s ? -1 : 1;
  486. else if (_FP_FRAC_GT_##wc(Y, X))
  487.   ret = X##_s ? 1 : -1;
  488. else
  489.   ret = 0;
  490.       }
  491.   } while (0)
  492. /* Simplification for strict equality.  */
  493. #define _FP_CMP_EQ(fs, wc, ret, X, Y)   
  494.   do {   
  495.     /* NANs are unordered */   
  496.     if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))   
  497. || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)))   
  498.       {   
  499. ret = 1;   
  500.       }   
  501.     else   
  502.       {   
  503. ret = !(X##_e == Y##_e   
  504. && _FP_FRAC_EQ_##wc(X, Y)   
  505. && (X##_s == Y##_s || !X##_e && _FP_FRAC_ZEROP_##wc(X))); 
  506.       }   
  507.   } while (0)
  508. /*
  509.  * Main square root routine.  The input value should be cooked.
  510.  */
  511. #define _FP_SQRT(fs, wc, R, X)
  512. do {
  513.     _FP_FRAC_DECL_##wc(T); _FP_FRAC_DECL_##wc(S);
  514.     _FP_W_TYPE q;
  515.     switch (X##_c)
  516.     {
  517.     case FP_CLS_NAN:
  518. _FP_FRAC_COPY_##wc(R, X);
  519. R##_s = X##_s;
  520.      R##_c = FP_CLS_NAN;
  521.      break;
  522.     case FP_CLS_INF:
  523.      if (X##_s)
  524.        {
  525.          R##_s = _FP_NANSIGN_##fs;
  526.     R##_c = FP_CLS_NAN; /* NAN */
  527.     _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);
  528.     FP_SET_EXCEPTION(FP_EX_INVALID);
  529.        }
  530.      else
  531.        {
  532.          R##_s = 0;
  533.          R##_c = FP_CLS_INF; /* sqrt(+inf) = +inf */
  534.        }
  535.      break;
  536.     case FP_CLS_ZERO:
  537. R##_s = X##_s;
  538. R##_c = FP_CLS_ZERO; /* sqrt(+-0) = +-0 */
  539. break;
  540.     case FP_CLS_NORMAL:
  541.      R##_s = 0;
  542.         if (X##_s)
  543.           {
  544.     R##_c = FP_CLS_NAN; /* sNAN */
  545.     R##_s = _FP_NANSIGN_##fs;
  546.     _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);
  547.     FP_SET_EXCEPTION(FP_EX_INVALID);
  548.     break;
  549.           }
  550.      R##_c = FP_CLS_NORMAL;
  551.         if (X##_e & 1)
  552.           _FP_FRAC_SLL_##wc(X, 1);
  553.         R##_e = X##_e >> 1;
  554.         _FP_FRAC_SET_##wc(S, _FP_ZEROFRAC_##wc);
  555.         _FP_FRAC_SET_##wc(R, _FP_ZEROFRAC_##wc);
  556.         q = _FP_OVERFLOW_##fs >> 1;
  557.         _FP_SQRT_MEAT_##wc(R, S, T, X, q);
  558.     }
  559.   } while (0)
  560. /*
  561.  * Convert from FP to integer
  562.  */
  563. /* RSIGNED can have following values:
  564.  * 0:  the number is required to be 0..(2^rsize)-1, if not, NV is set plus
  565.  *     the result is either 0 or (2^rsize)-1 depending on the sign in such case.
  566.  * 1:  the number is required to be -(2^(rsize-1))..(2^(rsize-1))-1, if not, NV is
  567.  *     set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1 depending
  568.  *     on the sign in such case.
  569.  * 2:  the number is required to be -(2^(rsize-1))..(2^(rsize-1))-1, if not, NV is
  570.  *     set plus the result is truncated to fit into destination.
  571.  * -1: the number is required to be -(2^(rsize-1))..(2^rsize)-1, if not, NV is
  572.  *     set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1 depending
  573.  *     on the sign in such case.
  574.  */
  575. #define _FP_TO_INT(fs, wc, r, X, rsize, rsigned)
  576.   do {
  577.     switch (X##_c)
  578.       {
  579.       case FP_CLS_NORMAL:
  580. if (X##_e < 0)
  581.   {
  582.     FP_SET_EXCEPTION(FP_EX_INEXACT);
  583.   case FP_CLS_ZERO:
  584.     r = 0;
  585.   }
  586. else if (X##_e >= rsize - (rsigned > 0 || X##_s)
  587.  || (!rsigned && X##_s))
  588.   { /* overflow */
  589.   case FP_CLS_NAN:                                                      
  590.   case FP_CLS_INF:
  591.     if (rsigned == 2)
  592.       {
  593. if (X##_c != FP_CLS_NORMAL
  594.     || X##_e >= rsize - 1 + _FP_WFRACBITS_##fs)
  595.   r = 0;
  596. else
  597.   {
  598.     _FP_FRAC_SLL_##wc(X, (X##_e - _FP_WFRACBITS_##fs + 1));
  599.     _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);
  600.   }
  601.       }
  602.     else if (rsigned)
  603.       {
  604. r = 1;
  605. r <<= rsize - 1;
  606. r -= 1 - X##_s;
  607.       }
  608.     else
  609.       {
  610. r = 0;
  611. if (X##_s)
  612.   r = ~r;
  613.       }
  614.     FP_SET_EXCEPTION(FP_EX_INVALID);
  615.   }
  616. else
  617.   {
  618.     if (_FP_W_TYPE_SIZE*wc < rsize)
  619.       {
  620. _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);
  621. r <<= X##_e - _FP_WFRACBITS_##fs;
  622.       }
  623.     else
  624.       {
  625. if (X##_e >= _FP_WFRACBITS_##fs)
  626.   _FP_FRAC_SLL_##wc(X, (X##_e - _FP_WFRACBITS_##fs + 1));
  627. else if (X##_e < _FP_WFRACBITS_##fs - 1)
  628.   {
  629.     _FP_FRAC_SRS_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 2),
  630.       _FP_WFRACBITS_##fs);
  631.     if (_FP_FRAC_LOW_##wc(X) & 1)
  632.       FP_SET_EXCEPTION(FP_EX_INEXACT);
  633.     _FP_FRAC_SRL_##wc(X, 1);
  634.   }
  635. _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);
  636.       }
  637.     if (rsigned && X##_s)
  638.       r = -r;
  639.   }
  640. break;
  641.       }
  642.   } while (0)
  643. #define _FP_TO_INT_ROUND(fs, wc, r, X, rsize, rsigned)
  644.   do {
  645.     r = 0;
  646.     switch (X##_c)
  647.       {
  648.       case FP_CLS_NORMAL:
  649. if (X##_e >= _FP_FRACBITS_##fs - 1)
  650.   {
  651.     if (X##_e < rsize - 1 + _FP_WFRACBITS_##fs)
  652.       {
  653. if (X##_e >= _FP_WFRACBITS_##fs - 1)
  654.   {
  655.     _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);
  656.     r <<= X##_e - _FP_WFRACBITS_##fs + 1;
  657.   }
  658. else
  659.   {
  660.     _FP_FRAC_SRL_##wc(X, _FP_WORKBITS - X##_e
  661.       + _FP_FRACBITS_##fs - 1);
  662.     _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);
  663.   }
  664.       }
  665.   }
  666. else
  667.   {
  668.     if (X##_e <= -_FP_WORKBITS - 1)
  669.       _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);
  670.     else
  671.       _FP_FRAC_SRS_##wc(X, _FP_FRACBITS_##fs - 1 - X##_e,
  672. _FP_WFRACBITS_##fs);
  673.     _FP_ROUND(wc, X);
  674.     _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);
  675.     _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);
  676.   }
  677. if (rsigned && X##_s)
  678.   r = -r;
  679. if (X##_e >= rsize - (rsigned > 0 || X##_s)
  680.     || (!rsigned && X##_s))
  681.   { /* overflow */
  682.   case FP_CLS_NAN:                                                      
  683.   case FP_CLS_INF:
  684.     if (!rsigned)
  685.       {
  686. r = 0;
  687. if (X##_s)
  688.   r = ~r;
  689.       }
  690.     else if (rsigned != 2)
  691.       {
  692. r = 1;
  693. r <<= rsize - 1;
  694. r -= 1 - X##_s;
  695.       }
  696.     FP_SET_EXCEPTION(FP_EX_INVALID);
  697.   }
  698. break;
  699.       case FP_CLS_ZERO:
  700.         break;
  701.       }
  702.   } while (0)
  703. #define _FP_FROM_INT(fs, wc, X, r, rsize, rtype)
  704.   do {
  705.     if (r)
  706.       {
  707. X##_c = FP_CLS_NORMAL;
  708. if ((X##_s = (r < 0)))
  709.   r = -r;
  710. if (rsize <= _FP_W_TYPE_SIZE)
  711.   __FP_CLZ(X##_e, r);
  712. else
  713.   __FP_CLZ_2(X##_e, (_FP_W_TYPE)(r >> _FP_W_TYPE_SIZE), 
  714.      (_FP_W_TYPE)r);
  715. if (rsize < _FP_W_TYPE_SIZE)
  716. X##_e -= (_FP_W_TYPE_SIZE - rsize);
  717. X##_e = rsize - X##_e - 1;
  718. if (_FP_FRACBITS_##fs < rsize && _FP_WFRACBITS_##fs < X##_e)
  719.   __FP_FRAC_SRS_1(r, (X##_e - _FP_WFRACBITS_##fs), rsize);
  720. r &= ~((rtype)1 << X##_e);
  721. _FP_FRAC_DISASSEMBLE_##wc(X, ((unsigned rtype)r), rsize);
  722. _FP_FRAC_SLL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1));
  723.       }
  724.     else
  725.       {
  726. X##_c = FP_CLS_ZERO, X##_s = 0;
  727.       }
  728.   } while (0)
  729. #define FP_CONV(dfs,sfs,dwc,swc,D,S)
  730.   do {
  731.     _FP_FRAC_CONV_##dwc##_##swc(dfs, sfs, D, S);
  732.     D##_e = S##_e;
  733.     D##_c = S##_c;
  734.     D##_s = S##_s;
  735.   } while (0)
  736. /*
  737.  * Helper primitives.
  738.  */
  739. /* Count leading zeros in a word.  */
  740. #ifndef __FP_CLZ
  741. #if _FP_W_TYPE_SIZE < 64
  742. /* this is just to shut the compiler up about shifts > word length -- PMM 02/1998 */
  743. #define __FP_CLZ(r, x)
  744.   do {
  745.     _FP_W_TYPE _t = (x);
  746.     r = _FP_W_TYPE_SIZE - 1;
  747.     if (_t > 0xffff) r -= 16;
  748.     if (_t > 0xffff) _t >>= 16;
  749.     if (_t > 0xff) r -= 8;
  750.     if (_t > 0xff) _t >>= 8;
  751.     if (_t & 0xf0) r -= 4;
  752.     if (_t & 0xf0) _t >>= 4;
  753.     if (_t & 0xc) r -= 2;
  754.     if (_t & 0xc) _t >>= 2;
  755.     if (_t & 0x2) r -= 1;
  756.   } while (0)
  757. #else /* not _FP_W_TYPE_SIZE < 64 */
  758. #define __FP_CLZ(r, x)
  759.   do {
  760.     _FP_W_TYPE _t = (x);
  761.     r = _FP_W_TYPE_SIZE - 1;
  762.     if (_t > 0xffffffff) r -= 32;
  763.     if (_t > 0xffffffff) _t >>= 32;
  764.     if (_t > 0xffff) r -= 16;
  765.     if (_t > 0xffff) _t >>= 16;
  766.     if (_t > 0xff) r -= 8;
  767.     if (_t > 0xff) _t >>= 8;
  768.     if (_t & 0xf0) r -= 4;
  769.     if (_t & 0xf0) _t >>= 4;
  770.     if (_t & 0xc) r -= 2;
  771.     if (_t & 0xc) _t >>= 2;
  772.     if (_t & 0x2) r -= 1;
  773.   } while (0)
  774. #endif /* not _FP_W_TYPE_SIZE < 64 */
  775. #endif /* ndef __FP_CLZ */
  776. #define _FP_DIV_HELP_imm(q, r, n, d)
  777.   do {
  778.     q = n / d, r = n % d;
  779.   } while (0)
  780. #endif /* __MATH_EMU_OP_COMMON_H__ */