op-4.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:13k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.op-4.h 1.5 05/17/01 18:14:23 cort
  3.  */
  4. /*
  5.  * Basic four-word fraction declaration and manipulation.
  6.  *
  7.  * When adding quadword support for 32 bit machines, we need
  8.  * to be a little careful as double multiply uses some of these
  9.  * macros: (in op-2.h)
  10.  * _FP_MUL_MEAT_2_wide() uses _FP_FRAC_DECL_4, _FP_FRAC_WORD_4,
  11.  * _FP_FRAC_ADD_4, _FP_FRAC_SRS_4
  12.  * _FP_MUL_MEAT_2_gmp() uses _FP_FRAC_SRS_4 (and should use
  13.  * _FP_FRAC_DECL_4: it appears to be broken and is not used 
  14.  * anywhere anyway. )
  15.  *
  16.  * I've now fixed all the macros that were here from the sparc64 code.
  17.  * [*none* of the shift macros were correct!] -- PMM 02/1998
  18.  * 
  19.  * The only quadword stuff that remains to be coded is: 
  20.  * 1) the conversion to/from ints, which requires 
  21.  * that we check (in op-common.h) that the following do the right thing
  22.  * for quadwords: _FP_TO_INT(Q,4,r,X,rsz,rsg), _FP_FROM_INT(Q,4,X,r,rs,rt)
  23.  * 2) multiply, divide and sqrt, which require:
  24.  * _FP_MUL_MEAT_4_*(R,X,Y), _FP_DIV_MEAT_4_*(R,X,Y), _FP_SQRT_MEAT_4(R,S,T,X,q),
  25.  * This also needs _FP_MUL_MEAT_Q and _FP_DIV_MEAT_Q to be defined to
  26.  * some suitable _FP_MUL_MEAT_4_* macros in sfp-machine.h.
  27.  * [we're free to choose whatever FP_MUL_MEAT_4_* macros we need for
  28.  * these; they are used nowhere else. ]
  29.  */
  30. #define _FP_FRAC_DECL_4(X) _FP_W_TYPE X##_f[4]
  31. #define _FP_FRAC_COPY_4(D,S)
  32.   (D##_f[0] = S##_f[0], D##_f[1] = S##_f[1],
  33.    D##_f[2] = S##_f[2], D##_f[3] = S##_f[3])
  34. /* The _FP_FRAC_SET_n(X,I) macro is intended for use with another
  35.  * macro such as _FP_ZEROFRAC_n which returns n comma separated values.
  36.  * The result is that we get an expansion of __FP_FRAC_SET_n(X,I0,I1,I2,I3)
  37.  * which just assigns the In values to the array X##_f[]. 
  38.  * This is why the number of parameters doesn't appear to match
  39.  * at first glance...      -- PMM 
  40.  */
  41. #define _FP_FRAC_SET_4(X,I) __FP_FRAC_SET_4(X, I)
  42. #define _FP_FRAC_HIGH_4(X) (X##_f[3])
  43. #define _FP_FRAC_LOW_4(X) (X##_f[0])
  44. #define _FP_FRAC_WORD_4(X,w) (X##_f[w])
  45. #define _FP_FRAC_SLL_4(X,N)
  46.   do {
  47.     _FP_I_TYPE _up, _down, _skip, _i;
  48.     _skip = (N) / _FP_W_TYPE_SIZE;
  49.     _up = (N) % _FP_W_TYPE_SIZE;
  50.     _down = _FP_W_TYPE_SIZE - _up;
  51.     for (_i = 3; _i > _skip; --_i)
  52.       X##_f[_i] = X##_f[_i-_skip] << _up | X##_f[_i-_skip-1] >> _down;
  53. /* bugfixed: was X##_f[_i] <<= _up;  -- PMM 02/1998 */                  
  54.     X##_f[_i] = X##_f[0] << _up;                                  
  55.     for (--_i; _i >= 0; --_i)
  56.       X##_f[_i] = 0;
  57.   } while (0)
  58. /* This one was broken too */
  59. #define _FP_FRAC_SRL_4(X,N)
  60.   do {
  61.     _FP_I_TYPE _up, _down, _skip, _i;
  62.     _skip = (N) / _FP_W_TYPE_SIZE;
  63.     _down = (N) % _FP_W_TYPE_SIZE;
  64.     _up = _FP_W_TYPE_SIZE - _down;
  65.     for (_i = 0; _i < 3-_skip; ++_i)
  66.       X##_f[_i] = X##_f[_i+_skip] >> _down | X##_f[_i+_skip+1] << _up;
  67.     X##_f[_i] = X##_f[3] >> _down;          
  68.     for (++_i; _i < 4; ++_i)
  69.       X##_f[_i] = 0;
  70.   } while (0)
  71. /* Right shift with sticky-lsb. 
  72.  * What this actually means is that we do a standard right-shift,
  73.  * but that if any of the bits that fall off the right hand side
  74.  * were one then we always set the LSbit.
  75.  */
  76. #define _FP_FRAC_SRS_4(X,N,size)
  77.   do {
  78.     _FP_I_TYPE _up, _down, _skip, _i;
  79.     _FP_W_TYPE _s;
  80.     _skip = (N) / _FP_W_TYPE_SIZE;
  81.     _down = (N) % _FP_W_TYPE_SIZE;
  82.     _up = _FP_W_TYPE_SIZE - _down;
  83.     for (_s = _i = 0; _i < _skip; ++_i)
  84.       _s |= X##_f[_i];
  85.     _s |= X##_f[_i] << _up;
  86. /* s is now != 0 if we want to set the LSbit */                         
  87.     for (_i = 0; _i < 3-_skip; ++_i)
  88.       X##_f[_i] = X##_f[_i+_skip] >> _down | X##_f[_i+_skip+1] << _up;
  89.     X##_f[_i] = X##_f[3] >> _down;
  90.     for (++_i; _i < 4; ++_i)
  91.       X##_f[_i] = 0;
  92.     /* don't fix the LSB until the very end when we're sure f[0] is stable */ 
  93.     X##_f[0] |= (_s != 0);                                              
  94.   } while (0)
  95. #define _FP_FRAC_ADD_4(R,X,Y)
  96.   __FP_FRAC_ADD_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0],
  97.   X##_f[3], X##_f[2], X##_f[1], X##_f[0],
  98.   Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
  99. #define _FP_FRAC_SUB_4(R,X,Y)                                           
  100.   __FP_FRAC_SUB_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0],
  101.   X##_f[3], X##_f[2], X##_f[1], X##_f[0],
  102.   Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
  103. #define _FP_FRAC_ADDI_4(X,I)                                            
  104.   __FP_FRAC_ADDI_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0], I)
  105. #define _FP_ZEROFRAC_4  0,0,0,0
  106. #define _FP_MINFRAC_4   0,0,0,1
  107. #define _FP_FRAC_ZEROP_4(X)     ((X##_f[0] | X##_f[1] | X##_f[2] | X##_f[3]) == 0)
  108. #define _FP_FRAC_NEGP_4(X)      ((_FP_WS_TYPE)X##_f[3] < 0)
  109. #define _FP_FRAC_OVERP_4(fs,X)  (X##_f[0] & _FP_OVERFLOW_##fs)
  110. #define _FP_FRAC_EQ_4(X,Y)                              
  111.  (X##_f[0] == Y##_f[0] && X##_f[1] == Y##_f[1]          
  112.   && X##_f[2] == Y##_f[2] && X##_f[3] == Y##_f[3])
  113. #define _FP_FRAC_GT_4(X,Y)                              
  114.  (X##_f[3] > Y##_f[3] ||                                
  115.   (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] ||      
  116.    (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] ||     
  117.     (X##_f[1] == Y##_f[1] && X##_f[0] > Y##_f[0])       
  118.    ))                                                   
  119.   ))                                                    
  120.  )
  121. #define _FP_FRAC_GE_4(X,Y)                              
  122.  (X##_f[3] > Y##_f[3] ||                                
  123.   (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] ||      
  124.    (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] ||     
  125.     (X##_f[1] == Y##_f[1] && X##_f[0] >= Y##_f[0])      
  126.    ))                                                   
  127.   ))                                                    
  128.  )
  129. #define _FP_FRAC_CLZ_4(R,X)             
  130.   do {                                  
  131.     if (X##_f[3])                       
  132.     {                                   
  133.         __FP_CLZ(R,X##_f[3]);           
  134.     }                                   
  135.     else if (X##_f[2])                  
  136.     {                                   
  137.         __FP_CLZ(R,X##_f[2]);           
  138.         R += _FP_W_TYPE_SIZE;           
  139.     }                                   
  140.     else if (X##_f[1])                  
  141.     {                                   
  142.         __FP_CLZ(R,X##_f[2]);           
  143.         R += _FP_W_TYPE_SIZE*2;         
  144.     }                                   
  145.     else                                
  146.     {                                   
  147.         __FP_CLZ(R,X##_f[0]);           
  148.         R += _FP_W_TYPE_SIZE*3;         
  149.     }                                   
  150.   } while(0)
  151. #define _FP_UNPACK_RAW_4(fs, X, val)                            
  152.   do {                                                          
  153.     union _FP_UNION_##fs _flo; _flo.flt = (val);        
  154.     X##_f[0] = _flo.bits.frac0;                                 
  155.     X##_f[1] = _flo.bits.frac1;                                 
  156.     X##_f[2] = _flo.bits.frac2;                                 
  157.     X##_f[3] = _flo.bits.frac3;                                 
  158.     X##_e  = _flo.bits.exp;                                     
  159.     X##_s  = _flo.bits.sign;                                    
  160.   } while (0)
  161. #define _FP_PACK_RAW_4(fs, val, X)                              
  162.   do {                                                          
  163.     union _FP_UNION_##fs _flo;
  164.     _flo.bits.frac0 = X##_f[0];                                 
  165.     _flo.bits.frac1 = X##_f[1];                                 
  166.     _flo.bits.frac2 = X##_f[2];                                 
  167.     _flo.bits.frac3 = X##_f[3];                                 
  168.     _flo.bits.exp   = X##_e;                                    
  169.     _flo.bits.sign  = X##_s;                                    
  170.     (val) = _flo.flt;                                   
  171.   } while (0)
  172. /*
  173.  * Internals 
  174.  */
  175. #define __FP_FRAC_SET_4(X,I3,I2,I1,I0)
  176.   (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0)
  177. #ifndef __FP_FRAC_ADD_4
  178. #define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)
  179.   (r0 = x0 + y0,
  180.    r1 = x1 + y1 + (r0 < x0),
  181.    r2 = x2 + y2 + (r1 < x1),
  182.    r3 = x3 + y3 + (r2 < x2))
  183. #endif
  184. #ifndef __FP_FRAC_SUB_4
  185. #define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)
  186.   (r0 = x0 - y0,                                                        
  187.    r1 = x1 - y1 - (r0 > x0),                                            
  188.    r2 = x2 - y2 - (r1 > x1),                                            
  189.    r3 = x3 - y3 - (r2 > x2))
  190. #endif
  191. #ifndef __FP_FRAC_ADDI_4
  192. /* I always wanted to be a lisp programmer :-> */
  193. #define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i)                                 
  194.   (x3 += ((x2 += ((x1 += ((x0 += i) < x0)) < x1) < x2)))
  195. #endif
  196. /* Convert FP values between word sizes. This appears to be more
  197.  * complicated than I'd have expected it to be, so these might be
  198.  * wrong... These macros are in any case somewhat bogus because they
  199.  * use information about what various FRAC_n variables look like 
  200.  * internally [eg, that 2 word vars are X_f0 and x_f1]. But so do
  201.  * the ones in op-2.h and op-1.h. 
  202.  */
  203. #define _FP_FRAC_CONV_1_4(dfs, sfs, D, S)                               
  204.    do {                                                                 
  205.      _FP_FRAC_SRS_4(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs),     
  206.                         _FP_WFRACBITS_##sfs);                           
  207.      D##_f = S##_f[0];                                                   
  208.   } while (0)
  209. #define _FP_FRAC_CONV_2_4(dfs, sfs, D, S)                               
  210.    do {                                                                 
  211.      _FP_FRAC_SRS_4(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs),     
  212.                         _FP_WFRACBITS_##sfs);                           
  213.      D##_f0 = S##_f[0];                                                  
  214.      D##_f1 = S##_f[1];                                                  
  215.   } while (0)
  216. /* Assembly/disassembly for converting to/from integral types.  
  217.  * No shifting or overflow handled here.
  218.  */
  219. /* Put the FP value X into r, which is an integer of size rsize. */
  220. #define _FP_FRAC_ASSEMBLE_4(r, X, rsize)                                
  221.   do {                                                                  
  222.     if (rsize <= _FP_W_TYPE_SIZE)                                       
  223.       r = X##_f[0];                                                     
  224.     else if (rsize <= 2*_FP_W_TYPE_SIZE)                                
  225.     {                                                                   
  226.       r = X##_f[1];                                                     
  227.       r <<= _FP_W_TYPE_SIZE;                                            
  228.       r += X##_f[0];                                                    
  229.     }                                                                   
  230.     else                                                                
  231.     {                                                                   
  232.       /* I'm feeling lazy so we deal with int == 3words (implausible)*/ 
  233.       /* and int == 4words as a single case.                         */ 
  234.       r = X##_f[3];                                                     
  235.       r <<= _FP_W_TYPE_SIZE;                                            
  236.       r += X##_f[2];                                                    
  237.       r <<= _FP_W_TYPE_SIZE;                                            
  238.       r += X##_f[1];                                                    
  239.       r <<= _FP_W_TYPE_SIZE;                                            
  240.       r += X##_f[0];                                                    
  241.     }                                                                   
  242.   } while (0)
  243. /* "No disassemble Number Five!" */
  244. /* move an integer of size rsize into X's fractional part. We rely on
  245.  * the _f[] array consisting of words of size _FP_W_TYPE_SIZE to avoid
  246.  * having to mask the values we store into it.
  247.  */
  248. #define _FP_FRAC_DISASSEMBLE_4(X, r, rsize)                             
  249.   do {                                                                  
  250.     X##_f[0] = r;                                                       
  251.     X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);   
  252.     X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); 
  253.     X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); 
  254.   } while (0);
  255. #define _FP_FRAC_CONV_4_1(dfs, sfs, D, S)                               
  256.    do {                                                                 
  257.      D##_f[0] = S##_f;                                                  
  258.      D##_f[1] = D##_f[2] = D##_f[3] = 0;                                
  259.      _FP_FRAC_SLL_4(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs));    
  260.    } while (0)
  261. #define _FP_FRAC_CONV_4_2(dfs, sfs, D, S)                               
  262.    do {                                                                 
  263.      D##_f[0] = S##_f0;                                                 
  264.      D##_f[1] = S##_f1;                                                 
  265.      D##_f[2] = D##_f[3] = 0;                                           
  266.      _FP_FRAC_SLL_4(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs));    
  267.    } while (0)
  268. /* FIXME! This has to be written */
  269. #define _FP_SQRT_MEAT_4(R, S, T, X, q)