~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/math-emu/op-2.h

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /include/math-emu/op-2.h (Version linux-6.12-rc7) and /include/math-emu/op-2.h (Version linux-5.4.284)


** Warning: Cannot open xref database.

  1 /* Software floating-point emulation.               1 
  2    Basic two-word fraction declaration and man    
  3    Copyright (C) 1997,1998,1999 Free Software     
  4    This file is part of the GNU C Library.        
  5    Contributed by Richard Henderson (rth@cygnu    
  6                   Jakub Jelinek (jj@ultra.linu    
  7                   David S. Miller (davem@redha    
  8                   Peter Maydell (pmaydell@chia    
  9                                                   
 10    The GNU C Library is free software; you can    
 11    modify it under the terms of the GNU Librar    
 12    published by the Free Software Foundation;     
 13    License, or (at your option) any later vers    
 14                                                   
 15    The GNU C Library is distributed in the hop    
 16    but WITHOUT ANY WARRANTY; without even the     
 17    MERCHANTABILITY or FITNESS FOR A PARTICULAR    
 18    Library General Public License for more det    
 19                                                   
 20    You should have received a copy of the GNU     
 21    License along with the GNU C Library; see t    
 22    not, write to the Free Software Foundation,    
 23    59 Temple Place - Suite 330, Boston, MA 021    
 24                                                   
 25 #ifndef __MATH_EMU_OP_2_H__                       
 26 #define __MATH_EMU_OP_2_H__                       
 27                                                   
 28 #define _FP_FRAC_DECL_2(X)      _FP_W_TYPE X##    
 29 #define _FP_FRAC_COPY_2(D,S)    (D##_f0 = S##_    
 30 #define _FP_FRAC_SET_2(X,I)     __FP_FRAC_SET_    
 31 #define _FP_FRAC_HIGH_2(X)      (X##_f1)          
 32 #define _FP_FRAC_LOW_2(X)       (X##_f0)          
 33 #define _FP_FRAC_WORD_2(X,w)    (X##_f##w)        
 34 #define _FP_FRAC_SLL_2(X, N) (                    
 35         (void) (((N) < _FP_W_TYPE_SIZE)           
 36           ? ({                                    
 37                 if (__builtin_constant_p(N) &&    
 38                         X##_f1 = X##_f1 + X##_    
 39                                 (((_FP_WS_TYPE    
 40                         X##_f0 += X##_f0;         
 41                 } else {                          
 42                         X##_f1 = X##_f1 << (N)    
 43                                                   
 44                         X##_f0 <<= (N);           
 45                 }                                 
 46                 0;                                
 47             })                                    
 48           : ({                                    
 49               X##_f1 = X##_f0 << ((N) - _FP_W_    
 50               X##_f0 = 0;                         
 51           })))                                    
 52                                                   
 53                                                   
 54 #define _FP_FRAC_SRL_2(X, N) (                    
 55         (void) (((N) < _FP_W_TYPE_SIZE)           
 56           ? ({                                    
 57               X##_f0 = X##_f0 >> (N) | X##_f1     
 58               X##_f1 >>= (N);                     
 59             })                                    
 60           : ({                                    
 61               X##_f0 = X##_f1 >> ((N) - _FP_W_    
 62               X##_f1 = 0;                         
 63             })))                                  
 64                                                   
 65                                                   
 66 /* Right shift with sticky-lsb.  */               
 67 #define _FP_FRAC_SRS_2(X, N, sz) (                
 68         (void) (((N) < _FP_W_TYPE_SIZE)           
 69           ? ({                                    
 70               X##_f0 = (X##_f1 << (_FP_W_TYPE_    
 71                         | (__builtin_constant_    
 72                            ? X##_f0 & 1           
 73                            : (X##_f0 << (_FP_W    
 74                 X##_f1 >>= (N);                   
 75             })                                    
 76           : ({                                    
 77               X##_f0 = (X##_f1 >> ((N) - _FP_W    
 78                         | ((((N) == _FP_W_TYPE    
 79                              ? 0                  
 80                              : (X##_f1 << (2*_    
 81                             | X##_f0) != 0));     
 82               X##_f1 = 0;                         
 83             })))                                  
 84                                                   
 85 #define _FP_FRAC_ADDI_2(X,I)    \                 
 86   __FP_FRAC_ADDI_2(X##_f1, X##_f0, I)             
 87                                                   
 88 #define _FP_FRAC_ADD_2(R,X,Y)   \                 
 89   __FP_FRAC_ADD_2(R##_f1, R##_f0, X##_f1, X##_    
 90                                                   
 91 #define _FP_FRAC_SUB_2(R,X,Y)   \                 
 92   __FP_FRAC_SUB_2(R##_f1, R##_f0, X##_f1, X##_    
 93                                                   
 94 #define _FP_FRAC_DEC_2(X,Y)     \                 
 95   __FP_FRAC_DEC_2(X##_f1, X##_f0, Y##_f1, Y##_    
 96                                                   
 97 #define _FP_FRAC_CLZ_2(R,X)     \                 
 98   do {                          \                 
 99     if (X##_f1)                 \                 
100       __FP_CLZ(R,X##_f1);       \                 
101     else                        \                 
102     {                           \                 
103       __FP_CLZ(R,X##_f0);       \                 
104       R += _FP_W_TYPE_SIZE;     \                 
105     }                           \                 
106   } while(0)                                      
107                                                   
108 /* Predicates */                                  
109 #define _FP_FRAC_NEGP_2(X)      ((_FP_WS_TYPE)    
110 #define _FP_FRAC_ZEROP_2(X)     ((X##_f1 | X##    
111 #define _FP_FRAC_OVERP_2(fs,X)  (_FP_FRAC_HIGH    
112 #define _FP_FRAC_CLEAR_OVERP_2(fs,X)    (_FP_F    
113 #define _FP_FRAC_EQ_2(X, Y)     (X##_f1 == Y##    
114 #define _FP_FRAC_GT_2(X, Y)     \                 
115   (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##    
116 #define _FP_FRAC_GE_2(X, Y)     \                 
117   (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##    
118                                                   
119 #define _FP_ZEROFRAC_2          0, 0              
120 #define _FP_MINFRAC_2           0, 1              
121 #define _FP_MAXFRAC_2           (~(_FP_WS_TYPE    
122                                                   
123 /*                                                
124  * Internals                                      
125  */                                               
126                                                   
127 #define __FP_FRAC_SET_2(X,I1,I0)        (X##_f    
128                                                   
129 #define __FP_CLZ_2(R, xh, xl)   \                 
130   do {                          \                 
131     if (xh)                     \                 
132       __FP_CLZ(R,xh);           \                 
133     else                        \                 
134     {                           \                 
135       __FP_CLZ(R,xl);           \                 
136       R += _FP_W_TYPE_SIZE;     \                 
137     }                           \                 
138   } while(0)                                      
139                                                   
140 #if 0                                             
141                                                   
142 #ifndef __FP_FRAC_ADDI_2                          
143 #define __FP_FRAC_ADDI_2(xh, xl, i)     \         
144   (xh += ((xl += i) < i))                         
145 #endif                                            
146 #ifndef __FP_FRAC_ADD_2                           
147 #define __FP_FRAC_ADD_2(rh, rl, xh, xl, yh, yl    
148   (rh = xh + yh + ((rl = xl + yl) < xl))          
149 #endif                                            
150 #ifndef __FP_FRAC_SUB_2                           
151 #define __FP_FRAC_SUB_2(rh, rl, xh, xl, yh, yl    
152   (rh = xh - yh - ((rl = xl - yl) > xl))          
153 #endif                                            
154 #ifndef __FP_FRAC_DEC_2                           
155 #define __FP_FRAC_DEC_2(xh, xl, yh, yl) \         
156   do {                                  \         
157     UWtype _t = xl;                     \         
158     xh -= yh + ((xl -= yl) > _t);       \         
159   } while (0)                                     
160 #endif                                            
161                                                   
162 #else                                             
163                                                   
164 #undef __FP_FRAC_ADDI_2                           
165 #define __FP_FRAC_ADDI_2(xh, xl, i)     add_ss    
166 #undef __FP_FRAC_ADD_2                            
167 #define __FP_FRAC_ADD_2                 add_ss    
168 #undef __FP_FRAC_SUB_2                            
169 #define __FP_FRAC_SUB_2                 sub_dd    
170 #undef __FP_FRAC_DEC_2                            
171 #define __FP_FRAC_DEC_2(xh, xl, yh, yl) sub_dd    
172                                                   
173 #endif                                            
174                                                   
175 /*                                                
176  * Unpack the raw bits of a native fp value.      
177  * normalize the data.                            
178  */                                               
179                                                   
180 #define _FP_UNPACK_RAW_2(fs, X, val)              
181   do {                                            
182     union _FP_UNION_##fs _flo; _flo.flt = (val    
183                                                   
184     X##_f0 = _flo.bits.frac0;                     
185     X##_f1 = _flo.bits.frac1;                     
186     X##_e  = _flo.bits.exp;                       
187     X##_s  = _flo.bits.sign;                      
188   } while (0)                                     
189                                                   
190 #define _FP_UNPACK_RAW_2_P(fs, X, val)            
191   do {                                            
192     union _FP_UNION_##fs *_flo =                  
193       (union _FP_UNION_##fs *)(val);              
194                                                   
195     X##_f0 = _flo->bits.frac0;                    
196     X##_f1 = _flo->bits.frac1;                    
197     X##_e  = _flo->bits.exp;                      
198     X##_s  = _flo->bits.sign;                     
199   } while (0)                                     
200                                                   
201                                                   
202 /*                                                
203  * Repack the raw bits of a native fp value.      
204  */                                               
205                                                   
206 #define _FP_PACK_RAW_2(fs, val, X)                
207   do {                                            
208     union _FP_UNION_##fs _flo;                    
209                                                   
210     _flo.bits.frac0 = X##_f0;                     
211     _flo.bits.frac1 = X##_f1;                     
212     _flo.bits.exp   = X##_e;                      
213     _flo.bits.sign  = X##_s;                      
214                                                   
215     (val) = _flo.flt;                             
216   } while (0)                                     
217                                                   
218 #define _FP_PACK_RAW_2_P(fs, val, X)              
219   do {                                            
220     union _FP_UNION_##fs *_flo =                  
221       (union _FP_UNION_##fs *)(val);              
222                                                   
223     _flo->bits.frac0 = X##_f0;                    
224     _flo->bits.frac1 = X##_f1;                    
225     _flo->bits.exp   = X##_e;                     
226     _flo->bits.sign  = X##_s;                     
227   } while (0)                                     
228                                                   
229                                                   
230 /*                                                
231  * Multiplication algorithms:                     
232  */                                               
233                                                   
234 /* Given a 1W * 1W => 2W primitive, do the ext    
235                                                   
236 #define _FP_MUL_MEAT_2_wide(wfracbits, R, X, Y    
237   do {                                            
238     _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b);     
239                                                   
240     doit(_FP_FRAC_WORD_4(_z,1), _FP_FRAC_WORD_    
241     doit(_b_f1, _b_f0, X##_f0, Y##_f1);           
242     doit(_c_f1, _c_f0, X##_f1, Y##_f0);           
243     doit(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_    
244                                                   
245     __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_    
246                     _FP_FRAC_WORD_4(_z,1), 0,     
247                     _FP_FRAC_WORD_4(_z,3),_FP_    
248                     _FP_FRAC_WORD_4(_z,1));       
249     __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_    
250                     _FP_FRAC_WORD_4(_z,1), 0,     
251                     _FP_FRAC_WORD_4(_z,3),_FP_    
252                     _FP_FRAC_WORD_4(_z,1));       
253                                                   
254     /* Normalize since we know where the msb o    
255        were (bit B), we know that the msb of t    
256        at either 2B or 2B-1.  */                  
257     _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbit    
258     R##_f0 = _FP_FRAC_WORD_4(_z,0);               
259     R##_f1 = _FP_FRAC_WORD_4(_z,1);               
260   } while (0)                                     
261                                                   
262 /* Given a 1W * 1W => 2W primitive, do the ext    
263    Do only 3 multiplications instead of four.     
264    where multiplication is much more expensive    
265                                                   
266 #define _FP_MUL_MEAT_2_wide_3mul(wfracbits, R,    
267   do {                                            
268     _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b);     
269     _FP_W_TYPE _d;                                
270     int _c1, _c2;                                 
271                                                   
272     _b_f0 = X##_f0 + X##_f1;                      
273     _c1 = _b_f0 < X##_f0;                         
274     _b_f1 = Y##_f0 + Y##_f1;                      
275     _c2 = _b_f1 < Y##_f0;                         
276     doit(_d, _FP_FRAC_WORD_4(_z,0), X##_f0, Y#    
277     doit(_FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_    
278     doit(_c_f1, _c_f0, X##_f1, Y##_f1);           
279                                                   
280     _b_f0 &= -_c2;                                
281     _b_f1 &= -_c1;                                
282     __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_    
283                     _FP_FRAC_WORD_4(_z,1), (_c    
284                     0, _FP_FRAC_WORD_4(_z,2),     
285     __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP    
286                      _b_f0);                      
287     __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP    
288                      _b_f1);                      
289     __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_    
290                     _FP_FRAC_WORD_4(_z,1),        
291                     0, _d, _FP_FRAC_WORD_4(_z,    
292     __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_    
293                     _FP_FRAC_WORD_4(_z,1), 0,     
294     __FP_FRAC_ADD_2(_FP_FRAC_WORD_4(_z,3), _FP    
295                     _c_f1, _c_f0,                 
296                     _FP_FRAC_WORD_4(_z,3), _FP    
297                                                   
298     /* Normalize since we know where the msb o    
299        were (bit B), we know that the msb of t    
300        at either 2B or 2B-1.  */                  
301     _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbit    
302     R##_f0 = _FP_FRAC_WORD_4(_z,0);               
303     R##_f1 = _FP_FRAC_WORD_4(_z,1);               
304   } while (0)                                     
305                                                   
306 #define _FP_MUL_MEAT_2_gmp(wfracbits, R, X, Y)    
307   do {                                            
308     _FP_FRAC_DECL_4(_z);                          
309     _FP_W_TYPE _x[2], _y[2];                      
310     _x[0] = X##_f0; _x[1] = X##_f1;               
311     _y[0] = Y##_f0; _y[1] = Y##_f1;               
312                                                   
313     mpn_mul_n(_z_f, _x, _y, 2);                   
314                                                   
315     /* Normalize since we know where the msb o    
316        were (bit B), we know that the msb of t    
317        at either 2B or 2B-1.  */                  
318     _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbit    
319     R##_f0 = _z_f[0];                             
320     R##_f1 = _z_f[1];                             
321   } while (0)                                     
322                                                   
323 /* Do at most 120x120=240 bits multiplication     
324    point multiplication.  This is useful if fl    
325    multiplication has much bigger throughput t    
326    It is supposed to work for _FP_W_TYPE_SIZE     
327    between 106 and 120 only.                      
328    Caller guarantees that X and Y has (1LLL <<    
329    SETFETZ is a macro which will disable all F    
330    towards zero,  RESETFE should optionally re    
331                                                   
332 #define _FP_MUL_MEAT_2_120_240_double(wfracbit    
333   do {                                            
334     static const double _const[] = {              
335       /* 2^-24 */ 5.9604644775390625e-08,         
336       /* 2^-48 */ 3.5527136788005009e-15,         
337       /* 2^-72 */ 2.1175823681357508e-22,         
338       /* 2^-96 */ 1.2621774483536189e-29,         
339       /* 2^28 */ 2.68435456e+08,                  
340       /* 2^4 */ 1.600000e+01,                     
341       /* 2^-20 */ 9.5367431640625e-07,            
342       /* 2^-44 */ 5.6843418860808015e-14,         
343       /* 2^-68 */ 3.3881317890172014e-21,         
344       /* 2^-92 */ 2.0194839173657902e-28,         
345       /* 2^-116 */ 1.2037062152420224e-35};       
346     double _a240, _b240, _c240, _d240, _e240,     
347            _g240, _h240, _i240, _j240, _k240;     
348     union { double d; UDItype i; } _l240, _m24    
349                                    _p240, _q24    
350     UDItype _t240, _u240, _v240, _w240, _x240,    
351                                                   
352     if (wfracbits < 106 || wfracbits > 120)       
353       abort();                                    
354                                                   
355     setfetz;                                      
356                                                   
357     _e240 = (double)(long)(X##_f0 & 0xffffff);    
358     _j240 = (double)(long)(Y##_f0 & 0xffffff);    
359     _d240 = (double)(long)((X##_f0 >> 24) & 0x    
360     _i240 = (double)(long)((Y##_f0 >> 24) & 0x    
361     _c240 = (double)(long)(((X##_f1 << 16) & 0    
362     _h240 = (double)(long)(((Y##_f1 << 16) & 0    
363     _b240 = (double)(long)((X##_f1 >> 8) & 0xf    
364     _g240 = (double)(long)((Y##_f1 >> 8) & 0xf    
365     _a240 = (double)(long)(X##_f1 >> 32);         
366     _f240 = (double)(long)(Y##_f1 >> 32);         
367     _e240 *= _const[3];                           
368     _j240 *= _const[3];                           
369     _d240 *= _const[2];                           
370     _i240 *= _const[2];                           
371     _c240 *= _const[1];                           
372     _h240 *= _const[1];                           
373     _b240 *= _const[0];                           
374     _g240 *= _const[0];                           
375     _s240.d =                                     
376     _r240.d =                                     
377     _q240.d =                             _c24    
378     _p240.d =               _b240*_j240 + _c24    
379     _o240.d = _a240*_j240 + _b240*_i240 + _c24    
380     _n240.d = _a240*_i240 + _b240*_h240 + _c24    
381     _m240.d = _a240*_h240 + _b240*_g240 + _c24    
382     _l240.d = _a240*_g240 + _b240*_f240;          
383     _k240 =   _a240*_f240;                        
384     _r240.d += _s240.d;                           
385     _q240.d += _r240.d;                           
386     _p240.d += _q240.d;                           
387     _o240.d += _p240.d;                           
388     _n240.d += _o240.d;                           
389     _m240.d += _n240.d;                           
390     _l240.d += _m240.d;                           
391     _k240 += _l240.d;                             
392     _s240.d -= ((_const[10]+_s240.d)-_const[10    
393     _r240.d -= ((_const[9]+_r240.d)-_const[9])    
394     _q240.d -= ((_const[8]+_q240.d)-_const[8])    
395     _p240.d -= ((_const[7]+_p240.d)-_const[7])    
396     _o240.d += _const[7];                         
397     _n240.d += _const[6];                         
398     _m240.d += _const[5];                         
399     _l240.d += _const[4];                         
400     if (_s240.d != 0.0) _y240 = 1;                
401     if (_r240.d != 0.0) _y240 = 1;                
402     if (_q240.d != 0.0) _y240 = 1;                
403     if (_p240.d != 0.0) _y240 = 1;                
404     _t240 = (DItype)_k240;                        
405     _u240 = _l240.i;                              
406     _v240 = _m240.i;                              
407     _w240 = _n240.i;                              
408     _x240 = _o240.i;                              
409     R##_f1 = (_t240 << (128 - (wfracbits - 1))    
410              | ((_u240 & 0xffffff) >> ((wfracb    
411     R##_f0 = ((_u240 & 0xffffff) << (168 - (wf    
412              | ((_v240 & 0xffffff) << (144 - (    
413              | ((_w240 & 0xffffff) << (120 - (    
414              | ((_x240 & 0xffffff) >> ((wfracb    
415              | _y240;                             
416     resetfe;                                      
417   } while (0)                                     
418                                                   
419 /*                                                
420  * Division algorithms:                           
421  */                                               
422                                                   
423 #define _FP_DIV_MEAT_2_udiv(fs, R, X, Y)          
424   do {                                            
425     _FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_    
426     if (_FP_FRAC_GT_2(X, Y))                      
427       {                                           
428         _n_f2 = X##_f1 >> 1;                      
429         _n_f1 = X##_f1 << (_FP_W_TYPE_SIZE - 1    
430         _n_f0 = X##_f0 << (_FP_W_TYPE_SIZE - 1    
431       }                                           
432     else                                          
433       {                                           
434         R##_e--;                                  
435         _n_f2 = X##_f1;                           
436         _n_f1 = X##_f0;                           
437         _n_f0 = 0;                                
438       }                                           
439                                                   
440     /* Normalize, i.e. make the most significa    
441        denominator set. */                        
442     _FP_FRAC_SLL_2(Y, _FP_WFRACXBITS_##fs);       
443                                                   
444     udiv_qrnnd(R##_f1, _r_f1, _n_f2, _n_f1, Y#    
445     umul_ppmm(_m_f1, _m_f0, R##_f1, Y##_f0);      
446     _r_f0 = _n_f0;                                
447     if (_FP_FRAC_GT_2(_m, _r))                    
448       {                                           
449         R##_f1--;                                 
450         _FP_FRAC_ADD_2(_r, Y, _r);                
451         if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_G    
452           {                                       
453             R##_f1--;                             
454             _FP_FRAC_ADD_2(_r, Y, _r);            
455           }                                       
456       }                                           
457     _FP_FRAC_DEC_2(_r, _m);                       
458                                                   
459     if (_r_f1 == Y##_f1)                          
460       {                                           
461         /* This is a special case, not an opti    
462            (_r/Y##_f1 would not fit into UWtyp    
463            As _r is guaranteed to be < Y,  R##    
464            (UWtype)-1 or (UWtype)-2.  But as w    
465            of bits it is (sticky, guard, round    
466            We also don't care what the reminde    
467            guard bit will be set anyway.  -jj     
468         R##_f0 = -1;                              
469       }                                           
470     else                                          
471       {                                           
472         udiv_qrnnd(R##_f0, _r_f1, _r_f1, _r_f0    
473         umul_ppmm(_m_f1, _m_f0, R##_f0, Y##_f0    
474         _r_f0 = 0;                                
475         if (_FP_FRAC_GT_2(_m, _r))                
476           {                                       
477             R##_f0--;                             
478             _FP_FRAC_ADD_2(_r, Y, _r);            
479             if (_FP_FRAC_GE_2(_r, Y) && _FP_FR    
480               {                                   
481                 R##_f0--;                         
482                 _FP_FRAC_ADD_2(_r, Y, _r);        
483               }                                   
484           }                                       
485         if (!_FP_FRAC_EQ_2(_r, _m))               
486           R##_f0 |= _FP_WORK_STICKY;              
487       }                                           
488   } while (0)                                     
489                                                   
490                                                   
491 #define _FP_DIV_MEAT_2_gmp(fs, R, X, Y)           
492   do {                                            
493     _FP_W_TYPE _x[4], _y[2], _z[4];               
494     _y[0] = Y##_f0; _y[1] = Y##_f1;               
495     _x[0] = _x[3] = 0;                            
496     if (_FP_FRAC_GT_2(X, Y))                      
497       {                                           
498         R##_e++;                                  
499         _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs    
500                  X##_f1 >> (_FP_W_TYPE_SIZE -     
501                             (_FP_WFRACBITS_##f    
502         _x[2] = X##_f1 << (_FP_WFRACBITS_##fs-    
503       }                                           
504     else                                          
505       {                                           
506         _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs    
507                  X##_f1 >> (_FP_W_TYPE_SIZE -     
508                             (_FP_WFRACBITS_##f    
509         _x[2] = X##_f1 << (_FP_WFRACBITS_##fs     
510       }                                           
511                                                   
512     (void) mpn_divrem (_z, 0, _x, 4, _y, 2);      
513     R##_f1 = _z[1];                               
514     R##_f0 = _z[0] | ((_x[0] | _x[1]) != 0);      
515   } while (0)                                     
516                                                   
517                                                   
518 /*                                                
519  * Square root algorithms:                        
520  * We have just one right now, maybe Newton ap    
521  * should be added for those machines where di    
522  */                                               
523                                                   
524 #define _FP_SQRT_MEAT_2(R, S, T, X, q)            
525   do {                                            
526     while (q)                                     
527       {                                           
528         T##_f1 = S##_f1 + q;                      
529         if (T##_f1 <= X##_f1)                     
530           {                                       
531             S##_f1 = T##_f1 + q;                  
532             X##_f1 -= T##_f1;                     
533             R##_f1 += q;                          
534           }                                       
535         _FP_FRAC_SLL_2(X, 1);                     
536         q >>= 1;                                  
537       }                                           
538     q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1)    
539     while (q != _FP_WORK_ROUND)                   
540       {                                           
541         T##_f0 = S##_f0 + q;                      
542         T##_f1 = S##_f1;                          
543         if (T##_f1 < X##_f1 ||                    
544             (T##_f1 == X##_f1 && T##_f0 <= X##    
545           {                                       
546             S##_f0 = T##_f0 + q;                  
547             S##_f1 += (T##_f0 > S##_f0);          
548             _FP_FRAC_DEC_2(X, T);                 
549             R##_f0 += q;                          
550           }                                       
551         _FP_FRAC_SLL_2(X, 1);                     
552         q >>= 1;                                  
553       }                                           
554     if (X##_f0 | X##_f1)                          
555       {                                           
556         if (S##_f1 < X##_f1 ||                    
557             (S##_f1 == X##_f1 && S##_f0 < X##_    
558           R##_f0 |= _FP_WORK_ROUND;               
559         R##_f0 |= _FP_WORK_STICKY;                
560       }                                           
561   } while (0)                                     
562                                                   
563                                                   
564 /*                                                
565  * Assembly/disassembly for converting to/from    
566  * No shifting or overflow handled here.          
567  */                                               
568                                                   
569 #define _FP_FRAC_ASSEMBLE_2(r, X, rsize)          
570         (void) (((rsize) <= _FP_W_TYPE_SIZE)      
571                 ? ({ (r) = X##_f0; })             
572                 : ({                              
573                      (r) = X##_f1;                
574                      (r) <<= _FP_W_TYPE_SIZE;     
575                      (r) += X##_f0;               
576                     }))                           
577                                                   
578 #define _FP_FRAC_DISASSEMBLE_2(X, r, rsize)       
579   do {                                            
580     X##_f0 = r;                                   
581     X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r    
582   } while (0)                                     
583                                                   
584 /*                                                
585  * Convert FP values between word sizes           
586  */                                               
587                                                   
588 #define _FP_FRAC_CONV_1_2(dfs, sfs, D, S)         
589   do {                                            
590     if (S##_c != FP_CLS_NAN)                      
591       _FP_FRAC_SRS_2(S, (_FP_WFRACBITS_##sfs -    
592                      _FP_WFRACBITS_##sfs);        
593     else                                          
594       _FP_FRAC_SRL_2(S, (_FP_WFRACBITS_##sfs -    
595     D##_f = S##_f0;                               
596   } while (0)                                     
597                                                   
598 #define _FP_FRAC_CONV_2_1(dfs, sfs, D, S)         
599   do {                                            
600     D##_f0 = S##_f;                               
601     D##_f1 = 0;                                   
602     _FP_FRAC_SLL_2(D, (_FP_WFRACBITS_##dfs - _    
603   } while (0)                                     
604                                                   
605 #endif                                            
606                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php