gmp-impl.h
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:174k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. #endif
  2. #ifndef mpn_decr_u
  3. #define mpn_decr_u(p,incr)                              
  4.   do {                                                  
  5.     mp_limb_t __x;                                      
  6.     mp_ptr __p = (p);                                   
  7.     if (__builtin_constant_p (incr) && (incr) == 1)     
  8.       {                                                 
  9.         while ((*(__p++))-- == 0)                       
  10.           ;                                             
  11.       }                                                 
  12.     else                                                
  13.       {                                                 
  14.         __x = *__p;                                     
  15.         *__p = __x - (incr);                            
  16.         if (__x < (incr))                               
  17.           while ((*(++__p))-- == 0)                     
  18.             ;                                           
  19.       }                                                 
  20.   } while (0)
  21. #endif
  22. #endif
  23. #if GMP_NAIL_BITS >= 1
  24. #ifndef mpn_incr_u
  25. #define mpn_incr_u(p,incr)                              
  26.   do {
  27.     mp_limb_t __x;
  28.     mp_ptr __p = (p);
  29.     if (__builtin_constant_p (incr) && (incr) == 1)
  30.       {
  31. do
  32.   {
  33.     __x = (*__p + 1) & GMP_NUMB_MASK;
  34.     *__p++ = __x;
  35.   }
  36. while (__x == 0);
  37.       }
  38.     else
  39.       {
  40. __x = (*__p + (incr));
  41. *__p++ = __x & GMP_NUMB_MASK;
  42. if (__x >> GMP_NUMB_BITS != 0)
  43.   {
  44.     do
  45.       {
  46. __x = (*__p + 1) & GMP_NUMB_MASK;
  47. *__p++ = __x;
  48.       }
  49.     while (__x == 0);
  50.   }
  51.       }
  52.   } while (0)
  53. #endif
  54. #ifndef mpn_decr_u
  55. #define mpn_decr_u(p,incr)
  56.   do {
  57.     mp_limb_t __x;
  58.     mp_ptr __p = (p);
  59.     if (__builtin_constant_p (incr) && (incr) == 1)
  60.       {
  61. do
  62.   {
  63.     __x = *__p;
  64.     *__p++ = (__x - 1) & GMP_NUMB_MASK;
  65.   }
  66. while (__x == 0);
  67.       }
  68.     else
  69.       {
  70. __x = *__p - (incr);
  71. *__p++ = __x & GMP_NUMB_MASK;
  72. if (__x >> GMP_NUMB_BITS != 0)
  73.   {
  74.     do
  75.       {
  76. __x = *__p;
  77. *__p++ = (__x - 1) & GMP_NUMB_MASK;
  78.       }
  79.     while (__x == 0);
  80.   }
  81.       }
  82.   } while (0)
  83. #endif
  84. #endif
  85. #ifndef MPN_INCR_U
  86. #if WANT_ASSERT
  87. #define MPN_INCR_U(ptr, size, n)                        
  88.   do {                                                  
  89.     ASSERT ((size) >= 1);                               
  90.     ASSERT_NOCARRY (mpn_add_1 (ptr, ptr, size, n));     
  91.   } while (0)
  92. #else
  93. #define MPN_INCR_U(ptr, size, n)   mpn_incr_u (ptr, n)
  94. #endif
  95. #endif
  96. #ifndef MPN_DECR_U
  97. #if WANT_ASSERT
  98. #define MPN_DECR_U(ptr, size, n)                        
  99.   do {                                                  
  100.     ASSERT ((size) >= 1);                               
  101.     ASSERT_NOCARRY (mpn_sub_1 (ptr, ptr, size, n));     
  102.   } while (0)
  103. #else
  104. #define MPN_DECR_U(ptr, size, n)   mpn_decr_u (ptr, n)
  105. #endif
  106. #endif
  107. /* Structure for conversion between internal binary format and
  108.    strings in base 2..36.  */
  109. struct bases
  110. {
  111.   /* Number of digits in the conversion base that always fits in an mp_limb_t.
  112.      For example, for base 10 on a machine where a mp_limb_t has 32 bits this
  113.      is 9, since 10**9 is the largest number that fits into a mp_limb_t.  */
  114.   int chars_per_limb;
  115.   /* log(2)/log(conversion_base) */
  116.   double chars_per_bit_exactly;
  117.   /* base**chars_per_limb, i.e. the biggest number that fits a word, built by
  118.      factors of base.  Exception: For 2, 4, 8, etc, big_base is log2(base),
  119.      i.e. the number of bits used to represent each digit in the base.  */
  120.   mp_limb_t big_base;
  121.   /* A GMP_LIMB_BITS bit approximation to 1/big_base, represented as a
  122.      fixed-point number.  Instead of dividing by big_base an application can
  123.      choose to multiply by big_base_inverted.  */
  124.   mp_limb_t big_base_inverted;
  125. };
  126. #define   mp_bases __MPN(bases)
  127. __GMP_DECLSPEC extern const struct bases mp_bases[257];
  128. /* For power of 2 bases this is exact.  For other bases the result is either
  129.    exact or one too big.
  130.    To be exact always it'd be necessary to examine all the limbs of the
  131.    operand, since numbers like 100..000 and 99...999 generally differ only
  132.    in the lowest limb.  It'd be possible to examine just a couple of high
  133.    limbs to increase the probability of being exact, but that doesn't seem
  134.    worth bothering with.  */
  135. #define MPN_SIZEINBASE(result, ptr, size, base)                         
  136.   do {                                                                  
  137.     int       __lb_base, __cnt;                                         
  138.     size_t __totbits;                                                   
  139.                                                                         
  140.     ASSERT ((size) >= 0);                                               
  141.     ASSERT ((base) >= 2);                                               
  142.     ASSERT ((base) < numberof (mp_bases));                              
  143.                                                                         
  144.     /* Special case for X == 0.  */                                     
  145.     if ((size) == 0)                                                    
  146.       (result) = 1;                                                     
  147.     else                                                                
  148.       {                                                                 
  149.         /* Calculate the total number of significant bits of X.  */     
  150.         count_leading_zeros (__cnt, (ptr)[(size)-1]);                   
  151.         __totbits = (size_t) (size) * GMP_NUMB_BITS - (__cnt - GMP_NAIL_BITS);
  152.                                                                         
  153.         if (POW2_P (base))                                              
  154.           {                                                             
  155.             __lb_base = mp_bases[base].big_base;                        
  156.             (result) = (__totbits + __lb_base - 1) / __lb_base;         
  157.           }                                                             
  158.         else                                                            
  159.           (result) = (size_t)                                           
  160.             (__totbits * mp_bases[base].chars_per_bit_exactly) + 1;     
  161.       }                                                                 
  162.   } while (0)
  163. /* eliminate mp_bases lookups for base==16 */
  164. #define MPN_SIZEINBASE_16(result, ptr, size)                            
  165.   do {                                                                  
  166.     int       __cnt;                                                    
  167.     mp_size_t __totbits;                                                
  168.                                                                         
  169.     ASSERT ((size) >= 0);                                               
  170.                                                                         
  171.     /* Special case for X == 0.  */                                     
  172.     if ((size) == 0)                                                    
  173.       (result) = 1;                                                     
  174.     else                                                                
  175.       {                                                                 
  176.         /* Calculate the total number of significant bits of X.  */     
  177.         count_leading_zeros (__cnt, (ptr)[(size)-1]);                   
  178.         __totbits = (size_t) (size) * GMP_NUMB_BITS - (__cnt - GMP_NAIL_BITS);
  179.         (result) = (__totbits + 4 - 1) / 4;                             
  180.       }                                                                 
  181.   } while (0)
  182. /* bit count to limb count, rounding up */
  183. #define BITS_TO_LIMBS(n)  (((n) + (GMP_NUMB_BITS - 1)) / GMP_NUMB_BITS)
  184. /* MPN_SET_UI sets an mpn (ptr, cnt) to given ui.  MPZ_FAKE_UI creates fake
  185.    mpz_t from ui.  The zp argument must have room for LIMBS_PER_ULONG limbs
  186.    in both cases (LIMBS_PER_ULONG is also defined here.) */
  187. #if BITS_PER_ULONG <= GMP_NUMB_BITS /* need one limb per ulong */
  188. #define LIMBS_PER_ULONG 1
  189. #define MPN_SET_UI(zp, zn, u)   
  190.   (zp)[0] = (u);                
  191.   (zn) = ((zp)[0] != 0);
  192. #define MPZ_FAKE_UI(z, zp, u)   
  193.   (zp)[0] = (u);                
  194.   PTR (z) = (zp);               
  195.   SIZ (z) = ((zp)[0] != 0);     
  196.   ASSERT_CODE (ALLOC (z) = 1);
  197. #else /* need two limbs per ulong */
  198. #define LIMBS_PER_ULONG 2
  199. #define MPN_SET_UI(zp, zn, u)                          
  200.   (zp)[0] = (u) & GMP_NUMB_MASK;                       
  201.   (zp)[1] = (u) >> GMP_NUMB_BITS;                      
  202.   (zn) = ((zp)[1] != 0 ? 2 : (zp)[0] != 0 ? 1 : 0);
  203. #define MPZ_FAKE_UI(z, zp, u)                          
  204.   (zp)[0] = (u) & GMP_NUMB_MASK;                       
  205.   (zp)[1] = (u) >> GMP_NUMB_BITS;                      
  206.   SIZ (z) = ((zp)[1] != 0 ? 2 : (zp)[0] != 0 ? 1 : 0); 
  207.   PTR (z) = (zp);                                      
  208.   ASSERT_CODE (ALLOC (z) = 2);
  209. #endif
  210. #if HAVE_HOST_CPU_FAMILY_x86
  211. #define TARGET_REGISTER_STARVED 1
  212. #else
  213. #define TARGET_REGISTER_STARVED 0
  214. #endif
  215. /* LIMB_HIGHBIT_TO_MASK(n) examines the high bit of a limb value and turns 1
  216.    or 0 there into a limb 0xFF..FF or 0 respectively.
  217.    On most CPUs this is just an arithmetic right shift by GMP_LIMB_BITS-1,
  218.    but C99 doesn't guarantee signed right shifts are arithmetic, so we have
  219.    a little compile-time test and a fallback to a "? :" form.  The latter is
  220.    necessary for instance on Cray vector systems.
  221.    Recent versions of gcc (eg. 3.3) will in fact optimize a "? :" like this
  222.    to an arithmetic right shift anyway, but it's good to get the desired
  223.    shift on past versions too (in particular since an important use of
  224.    LIMB_HIGHBIT_TO_MASK is in udiv_qrnnd_preinv).  */
  225. #define LIMB_HIGHBIT_TO_MASK(n)                                 
  226.   (((mp_limb_signed_t) -1 >> 1) < 0                             
  227.    ? (mp_limb_signed_t) (n) >> (GMP_LIMB_BITS - 1)              
  228.    : (n) & GMP_LIMB_HIGHBIT ? MP_LIMB_T_MAX : CNST_LIMB(0))
  229. /* Use a library function for invert_limb, if available. */
  230. #define   mpn_invert_limb __MPN(invert_limb)
  231. __GMP_DECLSPEC mp_limb_t mpn_invert_limb __GMP_PROTO ((mp_limb_t)) ATTRIBUTE_CONST;
  232. #if ! defined (invert_limb) && HAVE_NATIVE_mpn_invert_limb
  233. #define invert_limb(invxl,xl)           
  234.   do {                                  
  235.     (invxl) = mpn_invert_limb (xl);     
  236.   } while (0)
  237. #endif
  238. #ifndef invert_limb
  239. #define invert_limb(invxl,xl)                   
  240.   do {                                          
  241.     mp_limb_t dummy;                            
  242.     ASSERT ((xl) != 0);                         
  243.     udiv_qrnnd (invxl, dummy, ~(xl), ~CNST_LIMB(0), xl);  
  244.   } while (0)
  245. #endif
  246. #define invert_pi1(dinv, d1, d0)
  247.   do {
  248.     mp_limb_t v, p, t1, t0, mask;
  249.     invert_limb (v, d1);
  250.     p = d1 * v;
  251.     p += d0;
  252.     if (p < d0)
  253.       {
  254. v--;
  255. mask = -(p >= d1);
  256. p -= d1;
  257. v += mask;
  258. p -= mask & d1;
  259.       }
  260.     umul_ppmm (t1, t0, d0, v);
  261.     p += t1;
  262.     if (p < t1)
  263.       {
  264.         v--;
  265. if (UNLIKELY (p >= d1))
  266.   {
  267.     if (p > d1 || t0 >= d0)
  268.       v--;
  269.   }
  270.       }
  271.     (dinv).inv32 = v;
  272.   } while (0)
  273. #ifndef udiv_qrnnd_preinv
  274. #define udiv_qrnnd_preinv udiv_qrnnd_preinv3
  275. #endif
  276. /* Divide the two-limb number in (NH,,NL) by D, with DI being the largest
  277.    limb not larger than (2**(2*GMP_LIMB_BITS))/D - (2**GMP_LIMB_BITS).
  278.    If this would yield overflow, DI should be the largest possible number
  279.    (i.e., only ones).  For correct operation, the most significant bit of D
  280.    has to be set.  Put the quotient in Q and the remainder in R.  */
  281. #define udiv_qrnnd_preinv1(q, r, nh, nl, d, di)
  282.   do {
  283.     mp_limb_t _q, _ql, _r;
  284.     mp_limb_t _xh, _xl;
  285.     ASSERT ((d) != 0);
  286.     umul_ppmm (_q, _ql, (nh), (di));
  287.     _q += (nh); /* Compensate, di is 2**GMP_LIMB_BITS too small */
  288.     umul_ppmm (_xh, _xl, _q, (d));
  289.     sub_ddmmss (_xh, _r, (nh), (nl), _xh, _xl);
  290.     if (_xh != 0)
  291.       {
  292. sub_ddmmss (_xh, _r, _xh, _r, 0, (d));
  293. _q += 1;
  294. if (_xh != 0)
  295.   {
  296.     _r -= (d);
  297.     _q += 1;
  298.   }
  299.       }
  300.     if (_r >= (d))
  301.       {
  302. _r -= (d);
  303. _q += 1;
  304.       }
  305.     (r) = _r;
  306.     (q) = _q;
  307.   } while (0)
  308. /* Like udiv_qrnnd_preinv, but branch-free. */
  309. #define udiv_qrnnd_preinv2(q, r, nh, nl, d, di)
  310.   do {
  311.     mp_limb_t _n2, _n10, _nmask, _nadj, _q1;
  312.     mp_limb_t _xh, _xl;
  313.     _n2 = (nh);
  314.     _n10 = (nl);
  315.     _nmask = LIMB_HIGHBIT_TO_MASK (_n10);
  316.     _nadj = _n10 + (_nmask & (d));
  317.     umul_ppmm (_xh, _xl, di, _n2 - _nmask);
  318.     add_ssaaaa (_xh, _xl, _xh, _xl, _n2, _nadj);
  319.     _q1 = ~_xh;
  320.     umul_ppmm (_xh, _xl, _q1, d);
  321.     add_ssaaaa (_xh, _xl, _xh, _xl, nh, nl);
  322.     _xh -= (d); /* xh = 0 or -1 */
  323.     (r) = _xl + ((d) & _xh);
  324.     (q) = _xh - _q1;
  325.   } while (0)
  326. /* Like udiv_qrnnd_preinv2, but for for any value D.  DNORM is D shifted left
  327.    so that its most significant bit is set.  LGUP is ceil(log2(D)).  */
  328. #define udiv_qrnnd_preinv2gen(q, r, nh, nl, d, di, dnorm, lgup) 
  329.   do {
  330.     mp_limb_t _n2, _n10, _nmask, _nadj, _q1;
  331.     mp_limb_t _xh, _xl;
  332.     _n2 = ((nh) << (GMP_LIMB_BITS - (lgup))) + ((nl) >> 1 >> (l - 1));
  333.     _n10 = (nl) << (GMP_LIMB_BITS - (lgup));
  334.     _nmask = LIMB_HIGHBIT_TO_MASK (_n10);
  335.     _nadj = _n10 + (_nmask & (dnorm));
  336.     umul_ppmm (_xh, _xl, di, _n2 - _nmask);
  337.     add_ssaaaa (_xh, _xl, _xh, _xl, _n2, _nadj);
  338.     _q1 = ~_xh;
  339.     umul_ppmm (_xh, _xl, _q1, d);
  340.     add_ssaaaa (_xh, _xl, _xh, _xl, nh, nl);
  341.     _xh -= (d);
  342.     (r) = _xl + ((d) & _xh);
  343.     (q) = _xh - _q1;
  344.   } while (0)
  345. /* udiv_qrnnd_preinv3 -- Based on work by Niels M鰈ler and Torbj鰎n Granlund.
  346.    We write things strangely below, to help gcc.  A more straightforward
  347.    version:
  348.    _r = (nl) - _qh * (d);
  349.    _t = _r + (d);
  350.    if (_r >= _ql)
  351.      {
  352.        _qh--;
  353.        _r = _t;
  354.      }
  355.    For one operation shorter critical path, one may want to use this form:
  356.    _p = _qh * (d)
  357.    _s = (nl) + (d);
  358.    _r = (nl) - _p;
  359.    _t = _s - _p;
  360.    if (_r >= _ql)
  361.      {
  362.        _qh--;
  363.        _r = _t;
  364.      }
  365. */
  366. #define udiv_qrnnd_preinv3(q, r, nh, nl, d, di)
  367.   do {
  368.     mp_limb_t _qh, _ql, _r;
  369.     umul_ppmm (_qh, _ql, (nh), (di));
  370.     if (__builtin_constant_p (nl) && (nl) == 0)
  371.       _qh += (nh) + 1;
  372.     else
  373.       add_ssaaaa (_qh, _ql, _qh, _ql, (nh) + 1, (nl));
  374.     _r = (nl) - _qh * (d);
  375.     if (_r > _ql) /* both > and >= should be OK */
  376.       {
  377. _r += (d);
  378. _qh--;
  379.       }
  380.     if (UNLIKELY (_r >= (d)))
  381.       {
  382. _r -= (d);
  383. _qh++;
  384.       }
  385.     (r) = _r;
  386.     (q) = _qh;
  387.   } while (0)
  388. /* Compute r = nh*B mod d, where di is the inverse of d.  */
  389. #define udiv_rnd_preinv(r, nh, d, di)
  390.   do {
  391.     mp_limb_t _qh, _ql, _r;
  392.     umul_ppmm (_qh, _ql, (nh), (di));
  393.     _qh += (nh) + 1;
  394.     _r = - _qh * (d);
  395.     if (_r > _ql)
  396.       _r += (d);
  397.     (r) = _r;
  398.   } while (0)
  399. /* Compute quotient the quotient and remainder for n / d. Requires d
  400.    >= B^2 / 2 and n < d B. di is the inverse
  401.      floor ((B^3 - 1) / (d0 + d1 B)) - B.
  402.    NOTE: Output variables are updated multiple times. Only some inputs
  403.    and outputs may overlap.
  404. */
  405. #define udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv)
  406.   do {
  407.     mp_limb_t _q0, _t1, _t0, _mask;
  408.     umul_ppmm ((q), _q0, (n2), (dinv));
  409.     add_ssaaaa ((q), _q0, (q), _q0, (n2), (n1));
  410.     /* Compute the two most significant limbs of n - q'd */
  411.     (r1) = (n1) - (d1) * (q);
  412.     (r0) = (n0);
  413.     sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0));
  414.     umul_ppmm (_t1, _t0, (d0), (q));
  415.     sub_ddmmss ((r1), (r0), (r1), (r0), _t1, _t0);
  416.     (q)++;
  417.     /* Conditionally adjust q and the remainders */
  418.     _mask = - (mp_limb_t) ((r1) >= _q0);
  419.     (q) += _mask;
  420.     add_ssaaaa ((r1), (r0), (r1), (r0), _mask & (d1), _mask & (d0));
  421.     if (UNLIKELY ((r1) >= (d1)))
  422.       {
  423. if ((r1) > (d1) || (r0) >= (d0))
  424.   {
  425.     (q)++;
  426.     sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0));
  427.   }
  428.       }
  429.   } while (0)
  430. #ifndef mpn_preinv_divrem_1  /* if not done with cpuvec in a fat binary */
  431. #define   mpn_preinv_divrem_1 __MPN(preinv_divrem_1)
  432. __GMP_DECLSPEC mp_limb_t mpn_preinv_divrem_1 __GMP_PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t, int));
  433. #endif
  434. /* USE_PREINV_DIVREM_1 is whether to use mpn_preinv_divrem_1, as opposed to the
  435.    plain mpn_divrem_1.  The default is yes, since the few CISC chips where
  436.    preinv is not good have defines saying so.  */
  437. #ifndef USE_PREINV_DIVREM_1
  438. #define USE_PREINV_DIVREM_1   1
  439. #endif
  440. #if USE_PREINV_DIVREM_1
  441. #define MPN_DIVREM_OR_PREINV_DIVREM_1(qp,xsize,ap,size,d,dinv,shift)    
  442.   mpn_preinv_divrem_1 (qp, xsize, ap, size, d, dinv, shift)
  443. #else
  444. #define MPN_DIVREM_OR_PREINV_DIVREM_1(qp,xsize,ap,size,d,dinv,shift)    
  445.   mpn_divrem_1 (qp, xsize, ap, size, d)
  446. #endif
  447. #ifndef PREINV_MOD_1_TO_MOD_1_THRESHOLD
  448. #define PREINV_MOD_1_TO_MOD_1_THRESHOLD 10
  449. #endif
  450. /* This selection may seem backwards.  The reason mpn_mod_1 typically takes
  451.    over for larger sizes is that it uses the mod_1_1 function.  */
  452. #define MPN_MOD_OR_PREINV_MOD_1(src,size,divisor,inverse)       
  453.   (BELOW_THRESHOLD (size, PREINV_MOD_1_TO_MOD_1_THRESHOLD)
  454.    ? mpn_preinv_mod_1 (src, size, divisor, inverse)
  455.    : mpn_mod_1 (src, size, divisor))
  456. #ifndef mpn_mod_34lsub1  /* if not done with cpuvec in a fat binary */
  457. #define   mpn_mod_34lsub1 __MPN(mod_34lsub1)
  458. __GMP_DECLSPEC mp_limb_t mpn_mod_34lsub1 __GMP_PROTO ((mp_srcptr, mp_size_t)) __GMP_ATTRIBUTE_PURE;
  459. #endif
  460. /* DIVEXACT_1_THRESHOLD is at what size to use mpn_divexact_1, as opposed to
  461.    plain mpn_divrem_1.  Likewise BMOD_1_TO_MOD_1_THRESHOLD for
  462.    mpn_modexact_1_odd against plain mpn_mod_1.  On most CPUs divexact and
  463.    modexact are faster at all sizes, so the defaults are 0.  Those CPUs
  464.    where this is not right have a tuned threshold.  */
  465. #ifndef DIVEXACT_1_THRESHOLD
  466. #define DIVEXACT_1_THRESHOLD  0
  467. #endif
  468. #ifndef BMOD_1_TO_MOD_1_THRESHOLD
  469. #define BMOD_1_TO_MOD_1_THRESHOLD  10
  470. #endif
  471. #ifndef mpn_divexact_1  /* if not done with cpuvec in a fat binary */
  472. #define mpn_divexact_1 __MPN(divexact_1)
  473. __GMP_DECLSPEC void    mpn_divexact_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
  474. #endif
  475. #define MPN_DIVREM_OR_DIVEXACT_1(dst, src, size, divisor)                     
  476.   do {                                                                        
  477.     if (BELOW_THRESHOLD (size, DIVEXACT_1_THRESHOLD))                         
  478.       ASSERT_NOCARRY (mpn_divrem_1 (dst, (mp_size_t) 0, src, size, divisor)); 
  479.     else                                                                      
  480.       {                                                                       
  481.         ASSERT (mpn_mod_1 (src, size, divisor) == 0);                         
  482.         mpn_divexact_1 (dst, src, size, divisor);                             
  483.       }                                                                       
  484.   } while (0)
  485. #ifndef mpn_modexact_1c_odd  /* if not done with cpuvec in a fat binary */
  486. #define   mpn_modexact_1c_odd __MPN(modexact_1c_odd)
  487. __GMP_DECLSPEC mp_limb_t mpn_modexact_1c_odd __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE;
  488. #endif
  489. #if HAVE_NATIVE_mpn_modexact_1_odd
  490. #define   mpn_modexact_1_odd  __MPN(modexact_1_odd)
  491. __GMP_DECLSPEC mp_limb_t mpn_modexact_1_odd __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE;
  492. #else
  493. #define mpn_modexact_1_odd(src,size,divisor) 
  494.   mpn_modexact_1c_odd (src, size, divisor, CNST_LIMB(0))
  495. #endif
  496. #define MPN_MOD_OR_MODEXACT_1_ODD(src,size,divisor)
  497.   (BELOW_THRESHOLD (size, BMOD_1_TO_MOD_1_THRESHOLD)
  498.    ? mpn_modexact_1_odd (src, size, divisor)
  499.    : mpn_mod_1 (src, size, divisor))
  500. /* binvert_limb() sets inv to the multiplicative inverse of n modulo
  501.    2^GMP_NUMB_BITS, ie. satisfying inv*n == 1 mod 2^GMP_NUMB_BITS.
  502.    n must be odd (otherwise such an inverse doesn't exist).
  503.    This is not to be confused with invert_limb(), which is completely
  504.    different.
  505.    The table lookup gives an inverse with the low 8 bits valid, and each
  506.    multiply step doubles the number of bits.  See Jebelean "An algorithm for
  507.    exact division" end of section 4 (reference in gmp.texi).
  508.    Possible enhancement: Could use UHWtype until the last step, if half-size
  509.    multiplies are faster (might help under _LONG_LONG_LIMB).
  510.    Alternative: As noted in Granlund and Montgomery "Division by Invariant
  511.    Integers using Multiplication" (reference in gmp.texi), n itself gives a
  512.    3-bit inverse immediately, and could be used instead of a table lookup.
  513.    A 4-bit inverse can be obtained effectively from xoring bits 1 and 2 into
  514.    bit 3, for instance with (((n + 2) & 4) << 1) ^ n.  */
  515. #define binvert_limb_table  __gmp_binvert_limb_table
  516. __GMP_DECLSPEC extern const unsigned char  binvert_limb_table[128];
  517. #define binvert_limb(inv,n)
  518.   do {
  519.     mp_limb_t  __n = (n);
  520.     mp_limb_t  __inv;
  521.     ASSERT ((__n & 1) == 1);
  522.     __inv = binvert_limb_table[(__n/2) & 0x7F]; /*  8 */
  523.     if (GMP_NUMB_BITS > 8)   __inv = 2 * __inv - __inv * __inv * __n;
  524.     if (GMP_NUMB_BITS > 16)  __inv = 2 * __inv - __inv * __inv * __n;
  525.     if (GMP_NUMB_BITS > 32)  __inv = 2 * __inv - __inv * __inv * __n;
  526.     if (GMP_NUMB_BITS > 64)
  527.       {
  528. int  __invbits = 64;
  529. do {
  530.   __inv = 2 * __inv - __inv * __inv * __n;
  531.   __invbits *= 2;
  532. } while (__invbits < GMP_NUMB_BITS);
  533.       }
  534.     ASSERT ((__inv * __n & GMP_NUMB_MASK) == 1);
  535.     (inv) = __inv & GMP_NUMB_MASK;
  536.   } while (0)
  537. #define modlimb_invert binvert_limb  /* backward compatibility */
  538. /* Multiplicative inverse of 3, modulo 2^GMP_NUMB_BITS.
  539.    Eg. 0xAAAAAAAB for 32 bits, 0xAAAAAAAAAAAAAAAB for 64 bits.
  540.    GMP_NUMB_MAX/3*2+1 is right when GMP_NUMB_BITS is even, but when it's odd
  541.    we need to start from GMP_NUMB_MAX>>1. */
  542. #define MODLIMB_INVERSE_3 (((GMP_NUMB_MAX >> (GMP_NUMB_BITS % 2)) / 3) * 2 + 1)
  543. /* ceil(GMP_NUMB_MAX/3) and ceil(2*GMP_NUMB_MAX/3).
  544.    These expressions work because GMP_NUMB_MAX%3 != 0 for all GMP_NUMB_BITS. */
  545. #define GMP_NUMB_CEIL_MAX_DIV3   (GMP_NUMB_MAX / 3 + 1)
  546. #define GMP_NUMB_CEIL_2MAX_DIV3  ((GMP_NUMB_MAX>>1) / 3 + 1 + GMP_NUMB_HIGHBIT)
  547. /* Set r to -a mod d.  a>=d is allowed.  Can give r>d.  All should be limbs.
  548.    It's not clear whether this is the best way to do this calculation.
  549.    Anything congruent to -a would be fine for the one limb congruence
  550.    tests.  */
  551. #define NEG_MOD(r, a, d)
  552.   do {
  553.     ASSERT ((d) != 0);
  554.     ASSERT_LIMB (a);
  555.     ASSERT_LIMB (d);
  556.     if ((a) <= (d))
  557.       {
  558.         /* small a is reasonably likely */
  559.         (r) = (d) - (a);
  560.       }
  561.     else
  562.       {
  563.         unsigned   __twos;
  564.         mp_limb_t  __dnorm;
  565.         count_leading_zeros (__twos, d);
  566.         __twos -= GMP_NAIL_BITS;
  567.         __dnorm = (d) << __twos;
  568.         (r) = ((a) <= __dnorm ? __dnorm : 2*__dnorm) - (a);
  569.       }
  570.     ASSERT_LIMB (r);
  571.   } while (0)
  572. /* A bit mask of all the least significant zero bits of n, or -1 if n==0. */
  573. #define LOW_ZEROS_MASK(n)  (((n) & -(n)) - 1)
  574. /* ULONG_PARITY sets "p" to 1 if there's an odd number of 1 bits in "n", or
  575.    to 0 if there's an even number.  "n" should be an unsigned long and "p"
  576.    an int.  */
  577. #if defined (__GNUC__) && ! defined (NO_ASM) && HAVE_HOST_CPU_alpha_CIX
  578. #define ULONG_PARITY(p, n)
  579.   do {
  580.     int __p;
  581.     __asm__ ("ctpop %1, %0" : "=r" (__p) : "r" (n));
  582.     (p) = __p & 1;
  583.   } while (0)
  584. #endif
  585. /* Cray intrinsic _popcnt. */
  586. #ifdef _CRAY
  587. #define ULONG_PARITY(p, n)      
  588.   do {                          
  589.     (p) = _popcnt (n) & 1;      
  590.   } while (0)
  591. #endif
  592. #if defined (__GNUC__) && ! defined (__INTEL_COMPILER)
  593.     && ! defined (NO_ASM) && defined (__ia64)
  594. /* unsigned long is either 32 or 64 bits depending on the ABI, zero extend
  595.    to a 64 bit unsigned long long for popcnt */
  596. #define ULONG_PARITY(p, n)
  597.   do {
  598.     unsigned long long  __n = (unsigned long) (n);
  599.     int  __p;
  600.     __asm__ ("popcnt %0 = %1" : "=r" (__p) : "r" (__n));
  601.     (p) = __p & 1;
  602.   } while (0)
  603. #endif
  604. #if defined (__GNUC__) && ! defined (__INTEL_COMPILER)
  605.     && ! defined (NO_ASM) && HAVE_HOST_CPU_FAMILY_x86
  606. #if __GMP_GNUC_PREREQ (3,1)
  607. #define __GMP_qm "=Qm"
  608. #define __GMP_q "=Q"
  609. #else
  610. #define __GMP_qm "=qm"
  611. #define __GMP_q "=q"
  612. #endif
  613. #define ULONG_PARITY(p, n)
  614.   do {
  615.     char    __p;
  616.     unsigned long  __n = (n);
  617.     __n ^= (__n >> 16);
  618.     __asm__ ("xorb %h1, %b1nt"
  619.      "setpo %0"
  620.  : __GMP_qm (__p), __GMP_q (__n)
  621.  : "1" (__n));
  622.     (p) = __p;
  623.   } while (0)
  624. #endif
  625. #if ! defined (ULONG_PARITY)
  626. #define ULONG_PARITY(p, n)
  627.   do {
  628.     unsigned long  __n = (n);
  629.     int  __p = 0;
  630.     do
  631.       {
  632.         __p ^= 0x96696996L >> (__n & 0x1F);
  633.         __n >>= 5;
  634.       }
  635.     while (__n != 0);
  636.     (p) = __p & 1;
  637.   } while (0)
  638. #endif
  639. /* 3 cycles on 604 or 750 since shifts and rlwimi's can pair.  gcc (as of
  640.    version 3.1 at least) doesn't seem to know how to generate rlwimi for
  641.    anything other than bit-fields, so use "asm".  */
  642. #if defined (__GNUC__) && ! defined (NO_ASM)                    
  643.   && HAVE_HOST_CPU_FAMILY_powerpc && GMP_LIMB_BITS == 32
  644. #define BSWAP_LIMB(dst, src)
  645.   do {
  646.     mp_limb_t  __bswapl_src = (src);
  647.     mp_limb_t  __tmp1 = __bswapl_src >> 24; /* low byte */
  648.     mp_limb_t  __tmp2 = __bswapl_src << 24; /* high byte */
  649.     __asm__ ("rlwimi %0, %2, 24, 16, 23" /* 2nd low */
  650.  : "=r" (__tmp1) : "0" (__tmp1), "r" (__bswapl_src));
  651.     __asm__ ("rlwimi %0, %2,  8,  8, 15" /* 3nd high */
  652.  : "=r" (__tmp2) : "0" (__tmp2), "r" (__bswapl_src));
  653.     (dst) = __tmp1 | __tmp2; /* whole */
  654.   } while (0)
  655. #endif
  656. /* bswap is available on i486 and up and is fast.  A combination rorw $8 /
  657.    roll $16 / rorw $8 is used in glibc for plain i386 (and in the linux
  658.    kernel with xchgb instead of rorw), but this is not done here, because
  659.    i386 means generic x86 and mixing word and dword operations will cause
  660.    partial register stalls on P6 chips.  */
  661. #if defined (__GNUC__) && ! defined (NO_ASM)            
  662.   && HAVE_HOST_CPU_FAMILY_x86 && ! HAVE_HOST_CPU_i386   
  663.   && GMP_LIMB_BITS == 32
  664. #define BSWAP_LIMB(dst, src)
  665.   do {
  666.     __asm__ ("bswap %0" : "=r" (dst) : "0" (src));
  667.   } while (0)
  668. #endif
  669. #if defined (__GNUC__) && ! defined (NO_ASM)            
  670.   && defined (__amd64__) && GMP_LIMB_BITS == 64
  671. #define BSWAP_LIMB(dst, src)
  672.   do {
  673.     __asm__ ("bswap %q0" : "=r" (dst) : "0" (src));
  674.   } while (0)
  675. #endif
  676. #if defined (__GNUC__) && ! defined (__INTEL_COMPILER)
  677.     && ! defined (NO_ASM) && defined (__ia64) && GMP_LIMB_BITS == 64
  678. #define BSWAP_LIMB(dst, src)
  679.   do {
  680.     __asm__ ("mux1 %0 = %1, @rev" : "=r" (dst) :  "r" (src));
  681.   } while (0)
  682. #endif
  683. /* As per glibc. */
  684. #if defined (__GNUC__) && ! defined (NO_ASM)                    
  685.   && HAVE_HOST_CPU_FAMILY_m68k && GMP_LIMB_BITS == 32
  686. #define BSWAP_LIMB(dst, src)
  687.   do {
  688.     mp_limb_t  __bswapl_src = (src);
  689.     __asm__ ("ror%.w %#8, %0nt"
  690.      "swap   %0nt"
  691.      "ror%.w %#8, %0"
  692.      : "=d" (dst)
  693.      : "0" (__bswapl_src));
  694.   } while (0)
  695. #endif
  696. #if ! defined (BSWAP_LIMB)
  697. #if GMP_LIMB_BITS == 8
  698. #define BSWAP_LIMB(dst, src)            
  699.   do { (dst) = (src); } while (0)
  700. #endif
  701. #if GMP_LIMB_BITS == 16
  702. #define BSWAP_LIMB(dst, src)                    
  703.   do {                                          
  704.     (dst) = ((src) << 8) + ((src) >> 8);        
  705.   } while (0)
  706. #endif
  707. #if GMP_LIMB_BITS == 32
  708. #define BSWAP_LIMB(dst, src)    
  709.   do {                          
  710.     (dst) =                     
  711.       ((src) << 24)             
  712.       + (((src) & 0xFF00) << 8) 
  713.       + (((src) >> 8) & 0xFF00) 
  714.       + ((src) >> 24);          
  715.   } while (0)
  716. #endif
  717. #if GMP_LIMB_BITS == 64
  718. #define BSWAP_LIMB(dst, src)            
  719.   do {                                  
  720.     (dst) =                             
  721.       ((src) << 56)                     
  722.       + (((src) & 0xFF00) << 40)        
  723.       + (((src) & 0xFF0000) << 24)      
  724.       + (((src) & 0xFF000000) << 8)     
  725.       + (((src) >> 8) & 0xFF000000)     
  726.       + (((src) >> 24) & 0xFF0000)      
  727.       + (((src) >> 40) & 0xFF00)        
  728.       + ((src) >> 56);                  
  729.   } while (0)
  730. #endif
  731. #endif
  732. #if ! defined (BSWAP_LIMB)
  733. #define BSWAP_LIMB(dst, src)                            
  734.   do {                                                  
  735.     mp_limb_t  __bswapl_src = (src);                    
  736.     mp_limb_t  __dst = 0;                               
  737.     int        __i;                                     
  738.     for (__i = 0; __i < BYTES_PER_MP_LIMB; __i++)       
  739.       {                                                 
  740.         __dst = (__dst << 8) | (__bswapl_src & 0xFF);   
  741.         __bswapl_src >>= 8;                             
  742.       }                                                 
  743.     (dst) = __dst;                                      
  744.   } while (0)
  745. #endif
  746. /* Apparently lwbrx might be slow on some PowerPC chips, so restrict it to
  747.    those we know are fast.  */
  748. #if defined (__GNUC__) && ! defined (NO_ASM)                            
  749.   && GMP_LIMB_BITS == 32 && HAVE_LIMB_BIG_ENDIAN                        
  750.   && (HAVE_HOST_CPU_powerpc604                                          
  751.       || HAVE_HOST_CPU_powerpc604e                                      
  752.       || HAVE_HOST_CPU_powerpc750                                       
  753.       || HAVE_HOST_CPU_powerpc7400)
  754. #define BSWAP_LIMB_FETCH(limb, src)
  755.   do {
  756.     mp_srcptr  __blf_src = (src);
  757.     mp_limb_t  __limb;
  758.     __asm__ ("lwbrx %0, 0, %1"
  759.      : "=r" (__limb)
  760.      : "r" (__blf_src),
  761.        "m" (*__blf_src));
  762.     (limb) = __limb;
  763.   } while (0)
  764. #endif
  765. #if ! defined (BSWAP_LIMB_FETCH)
  766. #define BSWAP_LIMB_FETCH(limb, src)  BSWAP_LIMB (limb, *(src))
  767. #endif
  768. /* On the same basis that lwbrx might be slow, restrict stwbrx to those we
  769.    know are fast.  FIXME: Is this necessary?  */
  770. #if defined (__GNUC__) && ! defined (NO_ASM)                            
  771.   && GMP_LIMB_BITS == 32 && HAVE_LIMB_BIG_ENDIAN                        
  772.   && (HAVE_HOST_CPU_powerpc604                                          
  773.       || HAVE_HOST_CPU_powerpc604e                                      
  774.       || HAVE_HOST_CPU_powerpc750                                       
  775.       || HAVE_HOST_CPU_powerpc7400)
  776. #define BSWAP_LIMB_STORE(dst, limb)
  777.   do {
  778.     mp_ptr     __dst = (dst);
  779.     mp_limb_t  __limb = (limb);
  780.     __asm__ ("stwbrx %1, 0, %2"
  781.      : "=m" (*__dst)
  782.      : "r" (__limb),
  783.        "r" (__dst));
  784.   } while (0)
  785. #endif
  786. #if ! defined (BSWAP_LIMB_STORE)
  787. #define BSWAP_LIMB_STORE(dst, limb)  BSWAP_LIMB (*(dst), limb)
  788. #endif
  789. /* Byte swap limbs from {src,size} and store at {dst,size}. */
  790. #define MPN_BSWAP(dst, src, size)                       
  791.   do {                                                  
  792.     mp_ptr     __dst = (dst);                           
  793.     mp_srcptr  __src = (src);                           
  794.     mp_size_t  __size = (size);                         
  795.     mp_size_t  __i;                                     
  796.     ASSERT ((size) >= 0);                               
  797.     ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, size));   
  798.     CRAY_Pragma ("_CRI ivdep");                         
  799.     for (__i = 0; __i < __size; __i++)                  
  800.       {                                                 
  801.         BSWAP_LIMB_FETCH (*__dst, __src);               
  802.         __dst++;                                        
  803.         __src++;                                        
  804.       }                                                 
  805.   } while (0)
  806. /* Byte swap limbs from {dst,size} and store in reverse order at {src,size}. */
  807. #define MPN_BSWAP_REVERSE(dst, src, size)               
  808.   do {                                                  
  809.     mp_ptr     __dst = (dst);                           
  810.     mp_size_t  __size = (size);                         
  811.     mp_srcptr  __src = (src) + __size - 1;              
  812.     mp_size_t  __i;                                     
  813.     ASSERT ((size) >= 0);                               
  814.     ASSERT (! MPN_OVERLAP_P (dst, size, src, size));    
  815.     CRAY_Pragma ("_CRI ivdep");                         
  816.     for (__i = 0; __i < __size; __i++)                  
  817.       {                                                 
  818.         BSWAP_LIMB_FETCH (*__dst, __src);               
  819.         __dst++;                                        
  820.         __src--;                                        
  821.       }                                                 
  822.   } while (0)
  823. /* No processor claiming to be SPARC v9 compliant seems to
  824.    implement the POPC instruction.  Disable pattern for now.  */
  825. #if 0
  826. #if defined __GNUC__ && defined __sparc_v9__ && GMP_LIMB_BITS == 64
  827. #define popc_limb(result, input)
  828.   do {
  829.     DItype __res;
  830.     __asm__ ("popc %1,%0" : "=r" (result) : "rI" (input));
  831.   } while (0)
  832. #endif
  833. #endif
  834. #if defined (__GNUC__) && ! defined (NO_ASM) && HAVE_HOST_CPU_alpha_CIX
  835. #define popc_limb(result, input)
  836.   do {
  837.     __asm__ ("ctpop %1, %0" : "=r" (result) : "r" (input));
  838.   } while (0)
  839. #endif
  840. /* Cray intrinsic. */
  841. #ifdef _CRAY
  842. #define popc_limb(result, input)        
  843.   do {                                  
  844.     (result) = _popcnt (input);         
  845.   } while (0)
  846. #endif
  847. #if defined (__GNUC__) && ! defined (__INTEL_COMPILER)
  848.     && ! defined (NO_ASM) && defined (__ia64) && GMP_LIMB_BITS == 64
  849. #define popc_limb(result, input)
  850.   do {
  851.     __asm__ ("popcnt %0 = %1" : "=r" (result) : "r" (input));
  852.   } while (0)
  853. #endif
  854. /* Cool population count of an mp_limb_t.
  855.    You have to figure out how this works, We won't tell you!
  856.    The constants could also be expressed as:
  857.      0x55... = [2^N / 3]     = [(2^N-1)/3]
  858.      0x33... = [2^N / 5]     = [(2^N-1)/5]
  859.      0x0f... = [2^N / 17]    = [(2^N-1)/17]
  860.      (N is GMP_LIMB_BITS, [] denotes truncation.) */
  861. #if ! defined (popc_limb) && GMP_LIMB_BITS == 8
  862. #define popc_limb(result, input)
  863.   do {
  864.     mp_limb_t  __x = (input);
  865.     __x -= (__x >> 1) & MP_LIMB_T_MAX/3;
  866.     __x = ((__x >> 2) & MP_LIMB_T_MAX/5) + (__x & MP_LIMB_T_MAX/5);
  867.     __x = ((__x >> 4) + __x) & MP_LIMB_T_MAX/17;
  868.     (result) = __x & 0xff;
  869.   } while (0)
  870. #endif
  871. #if ! defined (popc_limb) && GMP_LIMB_BITS == 16
  872. #define popc_limb(result, input)
  873.   do {
  874.     mp_limb_t  __x = (input);
  875.     __x -= (__x >> 1) & MP_LIMB_T_MAX/3;
  876.     __x = ((__x >> 2) & MP_LIMB_T_MAX/5) + (__x & MP_LIMB_T_MAX/5);
  877.     __x = ((__x >> 4) + __x) & MP_LIMB_T_MAX/17;
  878.     __x = ((__x >> 8) + __x);
  879.     (result) = __x & 0xff;
  880.   } while (0)
  881. #endif
  882. #if ! defined (popc_limb) && GMP_LIMB_BITS == 32
  883. #define popc_limb(result, input)
  884.   do {
  885.     mp_limb_t  __x = (input);
  886.     __x -= (__x >> 1) & MP_LIMB_T_MAX/3;
  887.     __x = ((__x >> 2) & MP_LIMB_T_MAX/5) + (__x & MP_LIMB_T_MAX/5);
  888.     __x = ((__x >> 4) + __x) & MP_LIMB_T_MAX/17;
  889.     __x = ((__x >> 8) + __x);
  890.     __x = ((__x >> 16) + __x);
  891.     (result) = __x & 0xff;
  892.   } while (0)
  893. #endif
  894. #if ! defined (popc_limb) && GMP_LIMB_BITS == 64
  895. #define popc_limb(result, input)
  896.   do {
  897.     mp_limb_t  __x = (input);
  898.     __x -= (__x >> 1) & MP_LIMB_T_MAX/3;
  899.     __x = ((__x >> 2) & MP_LIMB_T_MAX/5) + (__x & MP_LIMB_T_MAX/5);
  900.     __x = ((__x >> 4) + __x) & MP_LIMB_T_MAX/17;
  901.     __x = ((__x >> 8) + __x);
  902.     __x = ((__x >> 16) + __x);
  903.     __x = ((__x >> 32) + __x);
  904.     (result) = __x & 0xff;
  905.   } while (0)
  906. #endif
  907. /* Define stuff for longlong.h.  */
  908. #if HAVE_ATTRIBUTE_MODE
  909. typedef unsigned int UQItype __attribute__ ((mode (QI)));
  910. typedef  int SItype __attribute__ ((mode (SI)));
  911. typedef unsigned int USItype __attribute__ ((mode (SI)));
  912. typedef  int DItype __attribute__ ((mode (DI)));
  913. typedef unsigned int UDItype __attribute__ ((mode (DI)));
  914. #else
  915. typedef unsigned char UQItype;
  916. typedef  long SItype;
  917. typedef unsigned long USItype;
  918. #if HAVE_LONG_LONG
  919. typedef long long int DItype;
  920. typedef unsigned long long int UDItype;
  921. #else /* Assume `long' gives us a wide enough type.  Needed for hppa2.0w.  */
  922. typedef long int DItype;
  923. typedef unsigned long int UDItype;
  924. #endif
  925. #endif
  926. typedef mp_limb_t UWtype;
  927. typedef unsigned int UHWtype;
  928. #define W_TYPE_SIZE GMP_LIMB_BITS
  929. /* Define ieee_double_extract and _GMP_IEEE_FLOATS.
  930.    Bit field packing is "implementation defined" according to C99, which
  931.    leaves us at the compiler's mercy here.  For some systems packing is
  932.    defined in the ABI (eg. x86).  In any case so far it seems universal that
  933.    little endian systems pack from low to high, and big endian from high to
  934.    low within the given type.
  935.    Within the fields we rely on the integer endianness being the same as the
  936.    float endianness, this is true everywhere we know of and it'd be a fairly
  937.    strange system that did anything else.  */
  938. #if HAVE_DOUBLE_IEEE_LITTLE_SWAPPED
  939. #define _GMP_IEEE_FLOATS 1
  940. union ieee_double_extract
  941. {
  942.   struct
  943.     {
  944.       gmp_uint_least32_t manh:20;
  945.       gmp_uint_least32_t exp:11;
  946.       gmp_uint_least32_t sig:1;
  947.       gmp_uint_least32_t manl:32;
  948.     } s;
  949.   double d;
  950. };
  951. #endif
  952. #if HAVE_DOUBLE_IEEE_LITTLE_ENDIAN
  953. #define _GMP_IEEE_FLOATS 1
  954. union ieee_double_extract
  955. {
  956.   struct
  957.     {
  958.       gmp_uint_least32_t manl:32;
  959.       gmp_uint_least32_t manh:20;
  960.       gmp_uint_least32_t exp:11;
  961.       gmp_uint_least32_t sig:1;
  962.     } s;
  963.   double d;
  964. };
  965. #endif
  966. #if HAVE_DOUBLE_IEEE_BIG_ENDIAN
  967. #define _GMP_IEEE_FLOATS 1
  968. union ieee_double_extract
  969. {
  970.   struct
  971.     {
  972.       gmp_uint_least32_t sig:1;
  973.       gmp_uint_least32_t exp:11;
  974.       gmp_uint_least32_t manh:20;
  975.       gmp_uint_least32_t manl:32;
  976.     } s;
  977.   double d;
  978. };
  979. #endif
  980. /* Use (4.0 * ...) instead of (2.0 * ...) to work around buggy compilers
  981.    that don't convert ulong->double correctly (eg. SunOS 4 native cc).  */
  982. #define MP_BASE_AS_DOUBLE (4.0 * ((mp_limb_t) 1 << (GMP_NUMB_BITS - 2)))
  983. /* Maximum number of limbs it will take to store any `double'.
  984.    We assume doubles have 53 mantissa bits.  */
  985. #define LIMBS_PER_DOUBLE ((53 + GMP_NUMB_BITS - 2) / GMP_NUMB_BITS + 1)
  986. __GMP_DECLSPEC int __gmp_extract_double __GMP_PROTO ((mp_ptr, double));
  987. #define mpn_get_d __gmpn_get_d
  988. __GMP_DECLSPEC double mpn_get_d __GMP_PROTO ((mp_srcptr, mp_size_t, mp_size_t, long)) __GMP_ATTRIBUTE_PURE;
  989. /* DOUBLE_NAN_INF_ACTION executes code a_nan if x is a NaN, or executes
  990.    a_inf if x is an infinity.  Both are considered unlikely values, for
  991.    branch prediction.  */
  992. #if _GMP_IEEE_FLOATS
  993. #define DOUBLE_NAN_INF_ACTION(x, a_nan, a_inf)  
  994.   do {                                          
  995.     union ieee_double_extract  u;               
  996.     u.d = (x);                                  
  997.     if (UNLIKELY (u.s.exp == 0x7FF))            
  998.       {                                         
  999.         if (u.s.manl == 0 && u.s.manh == 0)     
  1000.           { a_inf; }                            
  1001.         else                                    
  1002.           { a_nan; }                            
  1003.       }                                         
  1004.   } while (0)
  1005. #endif
  1006. #if HAVE_DOUBLE_VAX_D || HAVE_DOUBLE_VAX_G || HAVE_DOUBLE_CRAY_CFP
  1007. /* no nans or infs in these formats */
  1008. #define DOUBLE_NAN_INF_ACTION(x, a_nan, a_inf)  
  1009.   do { } while (0)
  1010. #endif
  1011. #ifndef DOUBLE_NAN_INF_ACTION
  1012. /* Unknown format, try something generic.
  1013.    NaN should be "unordered", so x!=x.
  1014.    Inf should be bigger than DBL_MAX.  */
  1015. #define DOUBLE_NAN_INF_ACTION(x, a_nan, a_inf)                  
  1016.   do {                                                          
  1017.     {                                                           
  1018.       if (UNLIKELY ((x) != (x)))                                
  1019.         { a_nan; }                                              
  1020.       else if (UNLIKELY ((x) > DBL_MAX || (x) < -DBL_MAX))      
  1021.         { a_inf; }                                              
  1022.     }                                                           
  1023.   } while (0)
  1024. #endif
  1025. /* On m68k, x86 and amd64, gcc (and maybe other compilers) can hold doubles
  1026.    in the coprocessor, which means a bigger exponent range than normal, and
  1027.    depending on the rounding mode, a bigger mantissa than normal.  (See
  1028.    "Disappointments" in the gcc manual.)  FORCE_DOUBLE stores and fetches
  1029.    "d" through memory to force any rounding and overflows to occur.
  1030.    On amd64, and on x86s with SSE2, gcc (depending on options) uses the xmm
  1031.    registers, where there's no such extra precision and no need for the
  1032.    FORCE_DOUBLE.  We don't bother to detect this since the present uses for
  1033.    FORCE_DOUBLE are only in test programs and default generic C code.
  1034.    Not quite sure that an "automatic volatile" will use memory, but it does
  1035.    in gcc.  An asm("":"=m"(d):"0"(d)) can't be used to trick gcc, since
  1036.    apparently matching operands like "0" are only allowed on a register
  1037.    output.  gcc 3.4 warns about this, though in fact it and past versions
  1038.    seem to put the operand through memory as hoped.  */
  1039. #if (HAVE_HOST_CPU_FAMILY_m68k || HAVE_HOST_CPU_FAMILY_x86      
  1040.      || defined (__amd64__))
  1041. #define FORCE_DOUBLE(d) 
  1042.   do { volatile double __gmp_force = (d); (d) = __gmp_force; } while (0)
  1043. #else
  1044. #define FORCE_DOUBLE(d)  do { } while (0)
  1045. #endif
  1046. __GMP_DECLSPEC extern int __gmp_junk;
  1047. __GMP_DECLSPEC extern const int __gmp_0;
  1048. __GMP_DECLSPEC void __gmp_exception __GMP_PROTO ((int)) ATTRIBUTE_NORETURN;
  1049. __GMP_DECLSPEC void __gmp_divide_by_zero __GMP_PROTO ((void)) ATTRIBUTE_NORETURN;
  1050. __GMP_DECLSPEC void __gmp_sqrt_of_negative __GMP_PROTO ((void)) ATTRIBUTE_NORETURN;
  1051. __GMP_DECLSPEC void __gmp_invalid_operation __GMP_PROTO ((void)) ATTRIBUTE_NORETURN;
  1052. #define GMP_ERROR(code)   __gmp_exception (code)
  1053. #define DIVIDE_BY_ZERO    __gmp_divide_by_zero ()
  1054. #define SQRT_OF_NEGATIVE  __gmp_sqrt_of_negative ()
  1055. #if defined _LONG_LONG_LIMB
  1056. #if __GMP_HAVE_TOKEN_PASTE
  1057. #define CNST_LIMB(C) ((mp_limb_t) C##LL)
  1058. #else
  1059. #define CNST_LIMB(C) ((mp_limb_t) C/**/LL)
  1060. #endif
  1061. #else /* not _LONG_LONG_LIMB */
  1062. #if __GMP_HAVE_TOKEN_PASTE
  1063. #define CNST_LIMB(C) ((mp_limb_t) C##L)
  1064. #else
  1065. #define CNST_LIMB(C) ((mp_limb_t) C/**/L)
  1066. #endif
  1067. #endif /* _LONG_LONG_LIMB */
  1068. /* Stuff used by mpn/generic/perfsqr.c and mpz/prime_p.c */
  1069. #if GMP_NUMB_BITS == 2
  1070. #define PP 0x3 /* 3 */
  1071. #define PP_FIRST_OMITTED 5
  1072. #endif
  1073. #if GMP_NUMB_BITS == 4
  1074. #define PP 0xF /* 3 x 5 */
  1075. #define PP_FIRST_OMITTED 7
  1076. #endif
  1077. #if GMP_NUMB_BITS == 8
  1078. #define PP 0x69 /* 3 x 5 x 7 */
  1079. #define PP_FIRST_OMITTED 11
  1080. #endif
  1081. #if GMP_NUMB_BITS == 16
  1082. #define PP 0x3AA7 /* 3 x 5 x 7 x 11 x 13 */
  1083. #define PP_FIRST_OMITTED 17
  1084. #endif
  1085. #if GMP_NUMB_BITS == 32
  1086. #define PP 0xC0CFD797L /* 3 x 5 x 7 x 11 x ... x 29 */
  1087. #define PP_INVERTED 0x53E5645CL
  1088. #define PP_FIRST_OMITTED 31
  1089. #endif
  1090. #if GMP_NUMB_BITS == 64
  1091. #define PP CNST_LIMB(0xE221F97C30E94E1D) /* 3 x 5 x 7 x 11 x ... x 53 */
  1092. #define PP_INVERTED CNST_LIMB(0x21CFE6CFC938B36B)
  1093. #define PP_FIRST_OMITTED 59
  1094. #endif
  1095. #ifndef PP_FIRST_OMITTED
  1096. #define PP_FIRST_OMITTED 3
  1097. #endif
  1098. /* BIT1 means a result value in bit 1 (second least significant bit), with a
  1099.    zero bit representing +1 and a one bit representing -1.  Bits other than
  1100.    bit 1 are garbage.  These are meant to be kept in "int"s, and casts are
  1101.    used to ensure the expressions are "int"s even if a and/or b might be
  1102.    other types.
  1103.    JACOBI_TWOS_U_BIT1 and JACOBI_RECIP_UU_BIT1 are used in mpn_jacobi_base
  1104.    and their speed is important.  Expressions are used rather than
  1105.    conditionals to accumulate sign changes, which effectively means XORs
  1106.    instead of conditional JUMPs. */
  1107. /* (a/0), with a signed; is 1 if a=+/-1, 0 otherwise */
  1108. #define JACOBI_S0(a)   (((a) == 1) | ((a) == -1))
  1109. /* (a/0), with a unsigned; is 1 if a=+/-1, 0 otherwise */
  1110. #define JACOBI_U0(a)   ((a) == 1)
  1111. /* (a/0), with a given by low and size;
  1112.    is 1 if a=+/-1, 0 otherwise */
  1113. #define JACOBI_LS0(alow,asize) 
  1114.   (((asize) == 1 || (asize) == -1) && (alow) == 1)
  1115. /* (a/0), with a an mpz_t;
  1116.    fetch of low limb always valid, even if size is zero */
  1117. #define JACOBI_Z0(a)   JACOBI_LS0 (PTR(a)[0], SIZ(a))
  1118. /* (0/b), with b unsigned; is 1 if b=1, 0 otherwise */
  1119. #define JACOBI_0U(b)   ((b) == 1)
  1120. /* (0/b), with b unsigned; is 1 if b=+/-1, 0 otherwise */
  1121. #define JACOBI_0S(b)   ((b) == 1 || (b) == -1)
  1122. /* (0/b), with b given by low and size; is 1 if b=+/-1, 0 otherwise */
  1123. #define JACOBI_0LS(blow,bsize) 
  1124.   (((bsize) == 1 || (bsize) == -1) && (blow) == 1)
  1125. /* Convert a bit1 to +1 or -1. */
  1126. #define JACOBI_BIT1_TO_PN(result_bit1) 
  1127.   (1 - ((int) (result_bit1) & 2))
  1128. /* (2/b), with b unsigned and odd;
  1129.    is (-1)^((b^2-1)/8) which is 1 if b==1,7mod8 or -1 if b==3,5mod8 and
  1130.    hence obtained from (b>>1)^b */
  1131. #define JACOBI_TWO_U_BIT1(b) 
  1132.   ((int) (((b) >> 1) ^ (b)))
  1133. /* (2/b)^twos, with b unsigned and odd */
  1134. #define JACOBI_TWOS_U_BIT1(twos, b) 
  1135.   ((int) ((twos) << 1) & JACOBI_TWO_U_BIT1 (b))
  1136. /* (2/b)^twos, with b unsigned and odd */
  1137. #define JACOBI_TWOS_U(twos, b) 
  1138.   (JACOBI_BIT1_TO_PN (JACOBI_TWOS_U_BIT1 (twos, b)))
  1139. /* (-1/b), with b odd (signed or unsigned);
  1140.    is (-1)^((b-1)/2) */
  1141. #define JACOBI_N1B_BIT1(b) 
  1142.   ((int) (b))
  1143. /* (a/b) effect due to sign of a: signed/unsigned, b odd;
  1144.    is (-1/b) if a<0, or +1 if a>=0 */
  1145. #define JACOBI_ASGN_SU_BIT1(a, b) 
  1146.   ((((a) < 0) << 1) & JACOBI_N1B_BIT1(b))
  1147. /* (a/b) effect due to sign of b: signed/signed;
  1148.    is -1 if a and b both negative, +1 otherwise */
  1149. #define JACOBI_BSGN_SS_BIT1(a, b) 
  1150.   ((((a)<0) & ((b)<0)) << 1)
  1151. /* (a/b) effect due to sign of b: signed/mpz;
  1152.    is -1 if a and b both negative, +1 otherwise */
  1153. #define JACOBI_BSGN_SZ_BIT1(a, b) 
  1154.   JACOBI_BSGN_SS_BIT1 (a, SIZ(b))
  1155. /* (a/b) effect due to sign of b: mpz/signed;
  1156.    is -1 if a and b both negative, +1 otherwise */
  1157. #define JACOBI_BSGN_ZS_BIT1(a, b) 
  1158.   JACOBI_BSGN_SZ_BIT1 (b, a)
  1159. /* (a/b) reciprocity to switch to (b/a), a,b both unsigned and odd;
  1160.    is (-1)^((a-1)*(b-1)/4), which means +1 if either a,b==1mod4, or -1 if
  1161.    both a,b==3mod4, achieved in bit 1 by a&b.  No ASSERT()s about a,b odd
  1162.    because this is used in a couple of places with only bit 1 of a or b
  1163.    valid. */
  1164. #define JACOBI_RECIP_UU_BIT1(a, b) 
  1165.   ((int) ((a) & (b)))
  1166. /* Strip low zero limbs from {b_ptr,b_size} by incrementing b_ptr and
  1167.    decrementing b_size.  b_low should be b_ptr[0] on entry, and will be
  1168.    updated for the new b_ptr.  result_bit1 is updated according to the
  1169.    factors of 2 stripped, as per (a/2).  */
  1170. #define JACOBI_STRIP_LOW_ZEROS(result_bit1, a, b_ptr, b_size, b_low)    
  1171.   do {                                                                  
  1172.     ASSERT ((b_size) >= 1);                                             
  1173.     ASSERT ((b_low) == (b_ptr)[0]);                                     
  1174.                                                                         
  1175.     while (UNLIKELY ((b_low) == 0))                                     
  1176.       {                                                                 
  1177.         (b_size)--;                                                     
  1178.         ASSERT ((b_size) >= 1);                                         
  1179.         (b_ptr)++;                                                      
  1180.         (b_low) = *(b_ptr);                                             
  1181.                                                                         
  1182.         ASSERT (((a) & 1) != 0);                                        
  1183.         if ((GMP_NUMB_BITS % 2) == 1)                                   
  1184.           (result_bit1) ^= JACOBI_TWO_U_BIT1(a);                        
  1185.       }                                                                 
  1186.   } while (0)
  1187. /* Set a_rem to {a_ptr,a_size} reduced modulo b, either using mod_1 or
  1188.    modexact_1_odd, but in either case leaving a_rem<b.  b must be odd and
  1189.    unsigned.  modexact_1_odd effectively calculates -a mod b, and
  1190.    result_bit1 is adjusted for the factor of -1.
  1191.    The way mpn_modexact_1_odd sometimes bases its remainder on a_size and
  1192.    sometimes on a_size-1 means if GMP_NUMB_BITS is odd we can't know what
  1193.    factor to introduce into result_bit1, so for that case use mpn_mod_1
  1194.    unconditionally.
  1195.    FIXME: mpn_modexact_1_odd is more efficient, so some way to get it used
  1196.    for odd GMP_NUMB_BITS would be good.  Perhaps it could mung its result,
  1197.    or not skip a divide step, or something. */
  1198. #define JACOBI_MOD_OR_MODEXACT_1_ODD(result_bit1, a_rem, a_ptr, a_size, b) 
  1199.   do {                                                                     
  1200.     mp_srcptr  __a_ptr  = (a_ptr);                                         
  1201.     mp_size_t  __a_size = (a_size);                                        
  1202.     mp_limb_t  __b      = (b);                                             
  1203.                                                                            
  1204.     ASSERT (__a_size >= 1);                                                
  1205.     ASSERT (__b & 1);                                                      
  1206.                                                                            
  1207.     if ((GMP_NUMB_BITS % 2) != 0                                           
  1208.         || ABOVE_THRESHOLD (__a_size, BMOD_1_TO_MOD_1_THRESHOLD))          
  1209.       {                                                                    
  1210.         (a_rem) = mpn_mod_1 (__a_ptr, __a_size, __b);                      
  1211.       }                                                                    
  1212.     else                                                                   
  1213.       {                                                                    
  1214.         (result_bit1) ^= JACOBI_N1B_BIT1 (__b);                            
  1215.         (a_rem) = mpn_modexact_1_odd (__a_ptr, __a_size, __b);             
  1216.       }                                                                    
  1217.   } while (0)
  1218. /* Matrix multiplication */
  1219. #define   mpn_matrix22_mul __MPN(matrix22_mul)
  1220. __GMP_DECLSPEC void      mpn_matrix22_mul __GMP_PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_srcptr, mp_srcptr, mp_srcptr, mp_size_t, mp_ptr));
  1221. #define   mpn_matrix22_mul_strassen __MPN(matrix22_mul_strassen)
  1222. __GMP_DECLSPEC void      mpn_matrix22_mul_strassen __GMP_PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_srcptr, mp_srcptr, mp_srcptr, mp_size_t, mp_ptr));
  1223. #define   mpn_matrix22_mul_itch __MPN(matrix22_mul_itch)
  1224. __GMP_DECLSPEC mp_size_t mpn_matrix22_mul_itch __GMP_PROTO ((mp_size_t, mp_size_t));
  1225. #ifndef MATRIX22_STRASSEN_THRESHOLD
  1226. #define MATRIX22_STRASSEN_THRESHOLD 30
  1227. #endif
  1228. /* HGCD definitions */
  1229. /* Extract one numb, shifting count bits left
  1230.     ________  ________
  1231.    |___xh___||___xl___|
  1232.   |____r____|
  1233.    >count <
  1234.    The count includes any nail bits, so it should work fine if count
  1235.    is computed using count_leading_zeros. If GMP_NAIL_BITS > 0, all of
  1236.    xh, xl and r include nail bits. Must have 0 < count < GMP_LIMB_BITS.
  1237.    FIXME: Omit masking with GMP_NUMB_MASK, and let callers do that for
  1238.    those calls where the count high bits of xh may be non-zero.
  1239. */
  1240. #define MPN_EXTRACT_NUMB(count, xh, xl)
  1241.   ((((xh) << ((count) - GMP_NAIL_BITS)) & GMP_NUMB_MASK) |
  1242.    ((xl) >> (GMP_LIMB_BITS - (count))))
  1243. /* The matrix non-negative M = (u, u'; v,v') keeps track of the
  1244.    reduction (a;b) = M (alpha; beta) where alpha, beta are smaller
  1245.    than a, b. The determinant must always be one, so that M has an
  1246.    inverse (v', -u'; -v, u). Elements always fit in GMP_NUMB_BITS - 1
  1247.    bits. */
  1248. struct hgcd_matrix1
  1249. {
  1250.   mp_limb_t u[2][2];
  1251. };
  1252. #define mpn_hgcd2 __MPN (hgcd2)
  1253. __GMP_DECLSPEC int mpn_hgcd2 __GMP_PROTO ((mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t, struct hgcd_matrix1 *));
  1254. #define mpn_hgcd_mul_matrix1_vector __MPN (hgcd_mul_matrix1_vector)
  1255. __GMP_DECLSPEC mp_size_t mpn_hgcd_mul_matrix1_vector __GMP_PROTO ((const struct hgcd_matrix1 *, mp_ptr, mp_srcptr, mp_ptr, mp_size_t));
  1256. #define mpn_hgcd_mul_matrix1_inverse_vector __MPN (hgcd_mul_matrix1_inverse_vector)
  1257. __GMP_DECLSPEC mp_size_t mpn_hgcd_mul_matrix1_inverse_vector __GMP_PROTO ((const struct hgcd_matrix1 *, mp_ptr, mp_srcptr, mp_ptr, mp_size_t));
  1258. struct hgcd_matrix
  1259. {
  1260.   mp_size_t alloc; /* for sanity checking only */
  1261.   mp_size_t n;
  1262.   mp_ptr p[2][2];
  1263. };
  1264. #define MPN_HGCD_MATRIX_INIT_ITCH(n) (4 * ((n+1)/2 + 1))
  1265. #define mpn_hgcd_matrix_init __MPN (hgcd_matrix_init)
  1266. __GMP_DECLSPEC void mpn_hgcd_matrix_init __GMP_PROTO ((struct hgcd_matrix *, mp_size_t, mp_ptr));
  1267. #define mpn_hgcd_matrix_mul __MPN (hgcd_matrix_mul)
  1268. __GMP_DECLSPEC void mpn_hgcd_matrix_mul __GMP_PROTO ((struct hgcd_matrix *, const struct hgcd_matrix *, mp_ptr));
  1269. #define mpn_hgcd_matrix_adjust __MPN (hgcd_matrix_adjust)
  1270. __GMP_DECLSPEC mp_size_t mpn_hgcd_matrix_adjust __GMP_PROTO ((struct hgcd_matrix *, mp_size_t, mp_ptr, mp_ptr, mp_size_t, mp_ptr));
  1271. #define mpn_hgcd_itch __MPN (hgcd_itch)
  1272. __GMP_DECLSPEC mp_size_t mpn_hgcd_itch __GMP_PROTO ((mp_size_t));
  1273. #define mpn_hgcd __MPN (hgcd)
  1274. __GMP_DECLSPEC mp_size_t mpn_hgcd __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, struct hgcd_matrix *, mp_ptr));
  1275. #define MPN_HGCD_LEHMER_ITCH(n) (n)
  1276. #define mpn_hgcd_lehmer __MPN (hgcd_lehmer)
  1277. __GMP_DECLSPEC mp_size_t mpn_hgcd_lehmer __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, struct hgcd_matrix *, mp_ptr));
  1278. /* Needs storage for the quotient */
  1279. #define MPN_GCD_SUBDIV_STEP_ITCH(n) (n)
  1280. #define mpn_gcd_subdiv_step __MPN(gcd_subdiv_step)
  1281. __GMP_DECLSPEC mp_size_t mpn_gcd_subdiv_step __GMP_PROTO ((mp_ptr, mp_size_t *, mp_ptr, mp_ptr, mp_size_t, mp_ptr));
  1282. #define MPN_GCD_LEHMER_N_ITCH(n) (n)
  1283. #define mpn_gcd_lehmer_n __MPN(gcd_lehmer_n)
  1284. __GMP_DECLSPEC mp_size_t mpn_gcd_lehmer_n __GMP_PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_ptr));
  1285. #define mpn_gcdext_subdiv_step __MPN(gcdext_subdiv_step)
  1286. __GMP_DECLSPEC mp_size_t mpn_gcdext_subdiv_step __GMP_PROTO ((mp_ptr, mp_size_t *, mp_ptr, mp_size_t *, mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_ptr, mp_size_t *, mp_ptr, mp_ptr));
  1287. #define MPN_GCDEXT_LEHMER_N_ITCH(n) (4*(n) + 3)
  1288. #define mpn_gcdext_lehmer_n __MPN(gcdext_lehmer_n)
  1289. __GMP_DECLSPEC mp_size_t mpn_gcdext_lehmer_n __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t *, mp_ptr, mp_ptr, mp_size_t, mp_ptr));
  1290. /* 4*(an + 1) + 4*(bn + 1) + an */
  1291. #define MPN_GCDEXT_LEHMER_ITCH(an, bn) (5*(an) + 4*(bn) + 8)
  1292. #ifndef HGCD_THRESHOLD
  1293. #define HGCD_THRESHOLD 400
  1294. #endif
  1295. #ifndef GCD_DC_THRESHOLD
  1296. #define GCD_DC_THRESHOLD 1000
  1297. #endif
  1298. #ifndef GCDEXT_DC_THRESHOLD
  1299. #define GCDEXT_DC_THRESHOLD 600
  1300. #endif
  1301. /* Definitions for mpn_set_str and mpn_get_str */
  1302. struct powers
  1303. {
  1304.   mp_ptr p; /* actual power value */
  1305.   mp_size_t n; /* # of limbs at p */
  1306.   mp_size_t shift; /* weight of lowest limb, in limb base B */
  1307.   size_t digits_in_base; /* number of corresponding digits */
  1308.   int base;
  1309. };
  1310. typedef struct powers powers_t;
  1311. #define mpn_dc_set_str_powtab_alloc(n) ((n) + GMP_LIMB_BITS)
  1312. #define mpn_dc_set_str_itch(n) ((n) + GMP_LIMB_BITS)
  1313. #define mpn_dc_get_str_powtab_alloc(n) ((n) + 2 * GMP_LIMB_BITS)
  1314. #define mpn_dc_get_str_itch(n) ((n) + GMP_LIMB_BITS)
  1315. #define   mpn_dc_set_str __MPN(dc_set_str)
  1316. __GMP_DECLSPEC mp_size_t mpn_dc_set_str __GMP_PROTO ((mp_ptr, const unsigned char *, size_t, const powers_t *, mp_ptr));
  1317. #define   mpn_bc_set_str __MPN(bc_set_str)
  1318. __GMP_DECLSPEC mp_size_t mpn_bc_set_str __GMP_PROTO ((mp_ptr, const unsigned char *, size_t, int));
  1319. #define   mpn_set_str_compute_powtab __MPN(set_str_compute_powtab)
  1320. __GMP_DECLSPEC void      mpn_set_str_compute_powtab __GMP_PROTO ((powers_t *, mp_ptr, mp_size_t, int));
  1321. /* __GMPF_BITS_TO_PREC applies a minimum 53 bits, rounds upwards to a whole
  1322.    limb and adds an extra limb.  __GMPF_PREC_TO_BITS drops that extra limb,
  1323.    hence giving back the user's size in bits rounded up.  Notice that
  1324.    converting prec->bits->prec gives an unchanged value.  */
  1325. #define __GMPF_BITS_TO_PREC(n)
  1326.   ((mp_size_t) ((__GMP_MAX (53, n) + 2 * GMP_NUMB_BITS - 1) / GMP_NUMB_BITS))
  1327. #define __GMPF_PREC_TO_BITS(n) 
  1328.   ((mp_bitcnt_t) (n) * GMP_NUMB_BITS - GMP_NUMB_BITS)
  1329. __GMP_DECLSPEC extern mp_size_t __gmp_default_fp_limb_precision;
  1330. /* Set n to the number of significant digits an mpf of the given _mp_prec
  1331.    field, in the given base.  This is a rounded up value, designed to ensure
  1332.    there's enough digits to reproduce all the guaranteed part of the value.
  1333.    There are prec many limbs, but the high might be only "1" so forget it
  1334.    and just count prec-1 limbs into chars.  +1 rounds that upwards, and a
  1335.    further +1 is because the limbs usually won't fall on digit boundaries.
  1336.    FIXME: If base is a power of 2 and the bits per digit divides
  1337.    GMP_LIMB_BITS then the +2 is unnecessary.  This happens always for
  1338.    base==2, and in base==16 with the current 32 or 64 bit limb sizes. */
  1339. #define MPF_SIGNIFICANT_DIGITS(n, base, prec)                           
  1340.   do {                                                                  
  1341.     ASSERT (base >= 2 && base < numberof (mp_bases));                   
  1342.     (n) = 2 + (size_t) ((((size_t) (prec) - 1) * GMP_NUMB_BITS)         
  1343.                         * mp_bases[(base)].chars_per_bit_exactly);      
  1344.   } while (0)
  1345. /* Decimal point string, from the current C locale.  Needs <langinfo.h> for
  1346.    nl_langinfo and constants, preferably with _GNU_SOURCE defined to get
  1347.    DECIMAL_POINT from glibc, and needs <locale.h> for localeconv, each under
  1348.    their respective #if HAVE_FOO_H.
  1349.    GLIBC recommends nl_langinfo because getting only one facet can be
  1350.    faster, apparently. */
  1351. /* DECIMAL_POINT seems to need _GNU_SOURCE defined to get it from glibc. */
  1352. #if HAVE_NL_LANGINFO && defined (DECIMAL_POINT)
  1353. #define GMP_DECIMAL_POINT  (nl_langinfo (DECIMAL_POINT))
  1354. #endif
  1355. /* RADIXCHAR is deprecated, still in unix98 or some such. */
  1356. #if HAVE_NL_LANGINFO && defined (RADIXCHAR) && ! defined (GMP_DECIMAL_POINT)
  1357. #define GMP_DECIMAL_POINT  (nl_langinfo (RADIXCHAR))
  1358. #endif
  1359. /* localeconv is slower since it returns all locale stuff */
  1360. #if HAVE_LOCALECONV && ! defined (GMP_DECIMAL_POINT)
  1361. #define GMP_DECIMAL_POINT  (localeconv()->decimal_point)
  1362. #endif
  1363. #if ! defined (GMP_DECIMAL_POINT)
  1364. #define GMP_DECIMAL_POINT  (".")
  1365. #endif
  1366. #define DOPRNT_CONV_FIXED        1
  1367. #define DOPRNT_CONV_SCIENTIFIC   2
  1368. #define DOPRNT_CONV_GENERAL      3
  1369. #define DOPRNT_JUSTIFY_NONE      0
  1370. #define DOPRNT_JUSTIFY_LEFT      1
  1371. #define DOPRNT_JUSTIFY_RIGHT     2
  1372. #define DOPRNT_JUSTIFY_INTERNAL  3
  1373. #define DOPRNT_SHOWBASE_YES      1
  1374. #define DOPRNT_SHOWBASE_NO       2
  1375. #define DOPRNT_SHOWBASE_NONZERO  3
  1376. struct doprnt_params_t {
  1377.   int         base;          /* negative for upper case */
  1378.   int         conv;          /* choices above */
  1379.   const char  *expfmt;       /* exponent format */
  1380.   int         exptimes4;     /* exponent multiply by 4 */
  1381.   char        fill;          /* character */
  1382.   int         justify;       /* choices above */
  1383.   int         prec;          /* prec field, or -1 for all digits */
  1384.   int         showbase;      /* choices above */
  1385.   int         showpoint;     /* if radix point always shown */
  1386.   int         showtrailing;  /* if trailing zeros wanted */
  1387.   char        sign;          /* '+', ' ', or '' */
  1388.   int         width;         /* width field */
  1389. };
  1390. #if _GMP_H_HAVE_VA_LIST
  1391. __GMP_DECLSPEC typedef int (*doprnt_format_t) __GMP_PROTO ((void *, const char *, va_list));
  1392. __GMP_DECLSPEC typedef int (*doprnt_memory_t) __GMP_PROTO ((void *, const char *, size_t));
  1393. __GMP_DECLSPEC typedef int (*doprnt_reps_t)   __GMP_PROTO ((void *, int, int));
  1394. __GMP_DECLSPEC typedef int (*doprnt_final_t)  __GMP_PROTO ((void *));
  1395. struct doprnt_funs_t {
  1396.   doprnt_format_t  format;
  1397.   doprnt_memory_t  memory;
  1398.   doprnt_reps_t    reps;
  1399.   doprnt_final_t   final;   /* NULL if not required */
  1400. };
  1401. extern const struct doprnt_funs_t  __gmp_fprintf_funs;
  1402. extern const struct doprnt_funs_t  __gmp_sprintf_funs;
  1403. extern const struct doprnt_funs_t  __gmp_snprintf_funs;
  1404. extern const struct doprnt_funs_t  __gmp_obstack_printf_funs;
  1405. extern const struct doprnt_funs_t  __gmp_ostream_funs;
  1406. /* "buf" is a __gmp_allocate_func block of "alloc" many bytes.  The first
  1407.    "size" of these have been written.  "alloc > size" is maintained, so
  1408.    there's room to store a '' at the end.  "result" is where the
  1409.    application wants the final block pointer.  */
  1410. struct gmp_asprintf_t {
  1411.   char    **result;
  1412.   char    *buf;
  1413.   size_t  size;
  1414.   size_t  alloc;
  1415. };
  1416. #define GMP_ASPRINTF_T_INIT(d, output)                          
  1417.   do {                                                          
  1418.     (d).result = (output);                                      
  1419.     (d).alloc = 256;                                            
  1420.     (d).buf = (char *) (*__gmp_allocate_func) ((d).alloc);      
  1421.     (d).size = 0;                                               
  1422.   } while (0)
  1423. /* If a realloc is necessary, use twice the size actually required, so as to
  1424.    avoid repeated small reallocs.  */
  1425. #define GMP_ASPRINTF_T_NEED(d, n)                                       
  1426.   do {                                                                  
  1427.     size_t  alloc, newsize, newalloc;                                   
  1428.     ASSERT ((d)->alloc >= (d)->size + 1);                               
  1429.                                                                         
  1430.     alloc = (d)->alloc;                                                 
  1431.     newsize = (d)->size + (n);                                          
  1432.     if (alloc <= newsize)                                               
  1433.       {                                                                 
  1434.         newalloc = 2*newsize;                                           
  1435.         (d)->alloc = newalloc;                                          
  1436.         (d)->buf = __GMP_REALLOCATE_FUNC_TYPE ((d)->buf,                
  1437.                                                alloc, newalloc, char);  
  1438.       }                                                                 
  1439.   } while (0)
  1440. __GMP_DECLSPEC int __gmp_asprintf_memory __GMP_PROTO ((struct gmp_asprintf_t *, const char *, size_t));
  1441. __GMP_DECLSPEC int __gmp_asprintf_reps __GMP_PROTO ((struct gmp_asprintf_t *, int, int));
  1442. __GMP_DECLSPEC int __gmp_asprintf_final __GMP_PROTO ((struct gmp_asprintf_t *));
  1443. /* buf is where to write the next output, and size is how much space is left
  1444.    there.  If the application passed size==0 then that's what we'll have
  1445.    here, and nothing at all should be written.  */
  1446. struct gmp_snprintf_t {
  1447.   char    *buf;
  1448.   size_t  size;
  1449. };
  1450. /* Add the bytes printed by the call to the total retval, or bail out on an
  1451.    error.  */
  1452. #define DOPRNT_ACCUMULATE(call) 
  1453.   do {                          
  1454.     int  __ret;                 
  1455.     __ret = call;               
  1456.     if (__ret == -1)            
  1457.       goto error;               
  1458.     retval += __ret;            
  1459.   } while (0)
  1460. #define DOPRNT_ACCUMULATE_FUN(fun, params)      
  1461.   do {                                          
  1462.     ASSERT ((fun) != NULL);                     
  1463.     DOPRNT_ACCUMULATE ((*(fun)) params);        
  1464.   } while (0)
  1465. #define DOPRNT_FORMAT(fmt, ap)                          
  1466.   DOPRNT_ACCUMULATE_FUN (funs->format, (data, fmt, ap))
  1467. #define DOPRNT_MEMORY(ptr, len)                                 
  1468.   DOPRNT_ACCUMULATE_FUN (funs->memory, (data, ptr, len))
  1469. #define DOPRNT_REPS(c, n)                               
  1470.   DOPRNT_ACCUMULATE_FUN (funs->reps, (data, c, n))
  1471. #define DOPRNT_STRING(str)      DOPRNT_MEMORY (str, strlen (str))
  1472. #define DOPRNT_REPS_MAYBE(c, n) 
  1473.   do {                          
  1474.     if ((n) != 0)               
  1475.       DOPRNT_REPS (c, n);       
  1476.   } while (0)
  1477. #define DOPRNT_MEMORY_MAYBE(ptr, len)   
  1478.   do {                                  
  1479.     if ((len) != 0)                     
  1480.       DOPRNT_MEMORY (ptr, len);         
  1481.   } while (0)
  1482. __GMP_DECLSPEC int __gmp_doprnt __GMP_PROTO ((const struct doprnt_funs_t *, void *, const char *, va_list));
  1483. __GMP_DECLSPEC int __gmp_doprnt_integer __GMP_PROTO ((const struct doprnt_funs_t *, void *, const struct doprnt_params_t *, const char *));
  1484. #define __gmp_doprnt_mpf __gmp_doprnt_mpf2
  1485. __GMP_DECLSPEC int __gmp_doprnt_mpf __GMP_PROTO ((const struct doprnt_funs_t *, void *, const struct doprnt_params_t *, const char *, mpf_srcptr));
  1486. __GMP_DECLSPEC int __gmp_replacement_vsnprintf __GMP_PROTO ((char *, size_t, const char *, va_list));
  1487. #endif /* _GMP_H_HAVE_VA_LIST */
  1488. typedef int (*gmp_doscan_scan_t)  __GMP_PROTO ((void *, const char *, ...));
  1489. typedef void *(*gmp_doscan_step_t) __GMP_PROTO ((void *, int));
  1490. typedef int (*gmp_doscan_get_t)   __GMP_PROTO ((void *));
  1491. typedef int (*gmp_doscan_unget_t) __GMP_PROTO ((int, void *));
  1492. struct gmp_doscan_funs_t {
  1493.   gmp_doscan_scan_t   scan;
  1494.   gmp_doscan_step_t   step;
  1495.   gmp_doscan_get_t    get;
  1496.   gmp_doscan_unget_t  unget;
  1497. };
  1498. extern const struct gmp_doscan_funs_t  __gmp_fscanf_funs;
  1499. extern const struct gmp_doscan_funs_t  __gmp_sscanf_funs;
  1500. #if _GMP_H_HAVE_VA_LIST
  1501. __GMP_DECLSPEC int __gmp_doscan __GMP_PROTO ((const struct gmp_doscan_funs_t *, void *, const char *, va_list));
  1502. #endif
  1503. /* For testing and debugging.  */
  1504. #define MPZ_CHECK_FORMAT(z)
  1505.   do {                                                          
  1506.     ASSERT_ALWAYS (SIZ(z) == 0 || PTR(z)[ABSIZ(z) - 1] != 0);
  1507.     ASSERT_ALWAYS (ALLOC(z) >= ABSIZ(z));
  1508.     ASSERT_ALWAYS_MPN (PTR(z), ABSIZ(z));                       
  1509.   } while (0)
  1510. #define MPQ_CHECK_FORMAT(q)                             
  1511.   do {                                                  
  1512.     MPZ_CHECK_FORMAT (mpq_numref (q));                  
  1513.     MPZ_CHECK_FORMAT (mpq_denref (q));                  
  1514.     ASSERT_ALWAYS (SIZ(mpq_denref(q)) >= 1);            
  1515.                                                         
  1516.     if (SIZ(mpq_numref(q)) == 0)                        
  1517.       {                                                 
  1518.         /* should have zero as 0/1 */                   
  1519.         ASSERT_ALWAYS (SIZ(mpq_denref(q)) == 1          
  1520.                        && PTR(mpq_denref(q))[0] == 1);  
  1521.       }                                                 
  1522.     else                                                
  1523.       {                                                 
  1524.         /* should have no common factors */             
  1525.         mpz_t  g;                                       
  1526.         mpz_init (g);                                   
  1527.         mpz_gcd (g, mpq_numref(q), mpq_denref(q));      
  1528.         ASSERT_ALWAYS (mpz_cmp_ui (g, 1) == 0);         
  1529.         mpz_clear (g);                                  
  1530.       }                                                 
  1531.   } while (0)
  1532. #define MPF_CHECK_FORMAT(f)                             
  1533.   do {                                                  
  1534.     ASSERT_ALWAYS (PREC(f) >= __GMPF_BITS_TO_PREC(53)); 
  1535.     ASSERT_ALWAYS (ABSIZ(f) <= PREC(f)+1);              
  1536.     if (SIZ(f) == 0)                                    
  1537.       ASSERT_ALWAYS (EXP(f) == 0);                      
  1538.     if (SIZ(f) != 0)                                    
  1539.       ASSERT_ALWAYS (PTR(f)[ABSIZ(f) - 1] != 0);        
  1540.   } while (0)
  1541. #define MPZ_PROVOKE_REALLOC(z)
  1542.   do { ALLOC(z) = ABSIZ(z); } while (0)
  1543. /* Enhancement: The "mod" and "gcd_1" functions below could have
  1544.    __GMP_ATTRIBUTE_PURE, but currently (gcc 3.3) that's not supported on
  1545.    function pointers, only actual functions.  It probably doesn't make much
  1546.    difference to the gmp code, since hopefully we arrange calls so there's
  1547.    no great need for the compiler to move things around.  */
  1548. #if WANT_FAT_BINARY && (HAVE_HOST_CPU_FAMILY_x86 || HAVE_HOST_CPU_FAMILY_x86_64)
  1549. /* NOTE: The function pointers in this struct are also in CPUVEC_FUNCS_LIST
  1550.    in mpn/x86/x86-defs.m4.  Be sure to update that when changing here.  */
  1551. struct cpuvec_t {
  1552.   DECL_add_n           ((*add_n));
  1553.   DECL_addmul_1        ((*addmul_1));
  1554.   DECL_copyd           ((*copyd));
  1555.   DECL_copyi           ((*copyi));
  1556.   DECL_divexact_1      ((*divexact_1));
  1557.   DECL_divexact_by3c   ((*divexact_by3c));
  1558.   DECL_divrem_1        ((*divrem_1));
  1559.   DECL_gcd_1           ((*gcd_1));
  1560.   DECL_lshift          ((*lshift));
  1561.   DECL_mod_1           ((*mod_1));
  1562.   DECL_mod_34lsub1     ((*mod_34lsub1));
  1563.   DECL_modexact_1c_odd ((*modexact_1c_odd));
  1564.   DECL_mul_1           ((*mul_1));
  1565.   DECL_mul_basecase    ((*mul_basecase));
  1566.   DECL_preinv_divrem_1 ((*preinv_divrem_1));
  1567.   DECL_preinv_mod_1    ((*preinv_mod_1));
  1568.   DECL_rshift          ((*rshift));
  1569.   DECL_sqr_basecase    ((*sqr_basecase));
  1570.   DECL_sub_n           ((*sub_n));
  1571.   DECL_submul_1        ((*submul_1));
  1572.   int                  initialized;
  1573.   mp_size_t            mul_toom22_threshold;
  1574.   mp_size_t            mul_toom33_threshold;
  1575.   mp_size_t            sqr_toom2_threshold;
  1576.   mp_size_t            sqr_toom3_threshold;
  1577. };
  1578. __GMP_DECLSPEC extern struct cpuvec_t __gmpn_cpuvec;
  1579. #endif /* x86 fat binary */
  1580. __GMP_DECLSPEC void __gmpn_cpuvec_init __GMP_PROTO ((void));
  1581. /* Get a threshold "field" from __gmpn_cpuvec, running __gmpn_cpuvec_init()
  1582.    if that hasn't yet been done (to establish the right values).  */
  1583. #define CPUVEC_THRESHOLD(field)                                               
  1584.   ((LIKELY (__gmpn_cpuvec.initialized) ? 0 : (__gmpn_cpuvec_init (), 0)),     
  1585.    __gmpn_cpuvec.field)
  1586. #if HAVE_NATIVE_mpn_add_nc
  1587. #define mpn_add_nc __MPN(add_nc)
  1588. __GMP_DECLSPEC mp_limb_t mpn_add_nc __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t));
  1589. #else
  1590. static inline
  1591. mp_limb_t
  1592. mpn_add_nc (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n, mp_limb_t ci)
  1593. {
  1594.   mp_limb_t co;
  1595.   co = mpn_add_n (rp, up, vp, n);
  1596.   co += mpn_add_1 (rp, rp, n, ci);
  1597.   return co;
  1598. }
  1599. #endif
  1600. #if HAVE_NATIVE_mpn_sub_nc
  1601. #define mpn_sub_nc __MPN(sub_nc)
  1602. __GMP_DECLSPEC mp_limb_t mpn_sub_nc __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t));
  1603. #else
  1604. static inline mp_limb_t
  1605. mpn_sub_nc (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n, mp_limb_t ci)
  1606. {
  1607.   mp_limb_t co;
  1608.   co = mpn_sub_n (rp, up, vp, n);
  1609.   co += mpn_sub_1 (rp, rp, n, ci);
  1610.   return co;
  1611. }
  1612. #endif
  1613. static inline int
  1614. mpn_zero_p (mp_srcptr ap, mp_size_t n)
  1615. {
  1616.   mp_size_t i;
  1617.   for (i = n - 1; i >= 0; i--)
  1618.     {
  1619.       if (ap[i] != 0)
  1620. return 0;
  1621.     }
  1622.   return 1;
  1623. }
  1624. #if TUNE_PROGRAM_BUILD
  1625. /* Some extras wanted when recompiling some .c files for use by the tune
  1626.    program.  Not part of a normal build.
  1627.    It's necessary to keep these thresholds as #defines (just to an
  1628.    identically named variable), since various defaults are established based
  1629.    on #ifdef in the .c files.  For some this is not so (the defaults are
  1630.    instead established above), but all are done this way for consistency. */
  1631. #undef MUL_TOOM22_THRESHOLD
  1632. #define MUL_TOOM22_THRESHOLD mul_toom22_threshold
  1633. extern mp_size_t mul_toom22_threshold;
  1634. #undef MUL_TOOM33_THRESHOLD
  1635. #define MUL_TOOM33_THRESHOLD mul_toom33_threshold
  1636. extern mp_size_t mul_toom33_threshold;
  1637. #undef MUL_TOOM44_THRESHOLD
  1638. #define MUL_TOOM44_THRESHOLD mul_toom44_threshold
  1639. extern mp_size_t mul_toom44_threshold;
  1640. #undef MUL_TOOM6H_THRESHOLD
  1641. #define MUL_TOOM6H_THRESHOLD mul_toom6h_threshold
  1642. extern mp_size_t mul_toom6h_threshold;
  1643. #undef MUL_TOOM8H_THRESHOLD
  1644. #define MUL_TOOM8H_THRESHOLD mul_toom8h_threshold
  1645. extern mp_size_t mul_toom8h_threshold;
  1646. #undef MUL_TOOM32_TO_TOOM43_THRESHOLD
  1647. #define MUL_TOOM32_TO_TOOM43_THRESHOLD mul_toom32_to_toom43_threshold
  1648. extern mp_size_t mul_toom32_to_toom43_threshold;
  1649. #undef MUL_TOOM32_TO_TOOM53_THRESHOLD
  1650. #define MUL_TOOM32_TO_TOOM53_THRESHOLD mul_toom32_to_toom53_threshold
  1651. extern mp_size_t mul_toom32_to_toom53_threshold;
  1652. #undef MUL_TOOM42_TO_TOOM53_THRESHOLD
  1653. #define MUL_TOOM42_TO_TOOM53_THRESHOLD mul_toom42_to_toom53_threshold
  1654. extern mp_size_t mul_toom42_to_toom53_threshold;
  1655. #undef MUL_TOOM42_TO_TOOM63_THRESHOLD
  1656. #define MUL_TOOM42_TO_TOOM63_THRESHOLD mul_toom42_to_toom63_threshold
  1657. extern mp_size_t mul_toom42_to_toom63_threshold;
  1658. #undef MUL_FFT_THRESHOLD
  1659. #define MUL_FFT_THRESHOLD mul_fft_threshold
  1660. extern mp_size_t mul_fft_threshold;
  1661. #undef MUL_FFT_MODF_THRESHOLD
  1662. #define MUL_FFT_MODF_THRESHOLD mul_fft_modf_threshold
  1663. extern mp_size_t mul_fft_modf_threshold;
  1664. #undef MUL_FFT_TABLE
  1665. #define MUL_FFT_TABLE { 0 }
  1666. #undef MUL_FFT_TABLE3
  1667. #define MUL_FFT_TABLE3 { {0,0} }
  1668. /* A native mpn_sqr_basecase is not tuned and SQR_BASECASE_THRESHOLD should
  1669.    remain as zero (always use it). */
  1670. #if ! HAVE_NATIVE_mpn_sqr_basecase
  1671. #undef SQR_BASECASE_THRESHOLD
  1672. #define SQR_BASECASE_THRESHOLD sqr_basecase_threshold
  1673. extern mp_size_t sqr_basecase_threshold;
  1674. #endif
  1675. #if TUNE_PROGRAM_BUILD_SQR
  1676. #undef SQR_TOOM2_THRESHOLD
  1677. #define SQR_TOOM2_THRESHOLD SQR_TOOM2_MAX_GENERIC
  1678. #else
  1679. #undef SQR_TOOM2_THRESHOLD
  1680. #define SQR_TOOM2_THRESHOLD sqr_toom2_threshold
  1681. extern mp_size_t sqr_toom2_threshold;
  1682. #endif
  1683. #undef SQR_TOOM3_THRESHOLD
  1684. #define SQR_TOOM3_THRESHOLD sqr_toom3_threshold
  1685. extern mp_size_t sqr_toom3_threshold;
  1686. #undef SQR_TOOM4_THRESHOLD
  1687. #define SQR_TOOM4_THRESHOLD sqr_toom4_threshold
  1688. extern mp_size_t sqr_toom4_threshold;
  1689. #undef SQR_TOOM6_THRESHOLD
  1690. #define SQR_TOOM6_THRESHOLD sqr_toom6_threshold
  1691. extern mp_size_t sqr_toom6_threshold;
  1692. #undef SQR_TOOM8_THRESHOLD
  1693. #define SQR_TOOM8_THRESHOLD sqr_toom8_threshold
  1694. extern mp_size_t sqr_toom8_threshold;
  1695. #undef  SQR_FFT_THRESHOLD
  1696. #define SQR_FFT_THRESHOLD sqr_fft_threshold
  1697. extern mp_size_t sqr_fft_threshold;
  1698. #undef  SQR_FFT_MODF_THRESHOLD
  1699. #define SQR_FFT_MODF_THRESHOLD sqr_fft_modf_threshold
  1700. extern mp_size_t sqr_fft_modf_threshold;
  1701. #undef SQR_FFT_TABLE
  1702. #define SQR_FFT_TABLE { 0 }
  1703. #undef SQR_FFT_TABLE3
  1704. #define SQR_FFT_TABLE3 { {0,0} }
  1705. #undef MULLO_BASECASE_THRESHOLD
  1706. #define MULLO_BASECASE_THRESHOLD mullo_basecase_threshold
  1707. extern mp_size_t mullo_basecase_threshold;
  1708. #undef MULLO_DC_THRESHOLD
  1709. #define MULLO_DC_THRESHOLD mullo_dc_threshold
  1710. extern mp_size_t mullo_dc_threshold;
  1711. #undef MULLO_MUL_N_THRESHOLD
  1712. #define MULLO_MUL_N_THRESHOLD mullo_mul_n_threshold
  1713. extern mp_size_t mullo_mul_n_threshold;
  1714. #undef DC_DIV_QR_THRESHOLD
  1715. #define DC_DIV_QR_THRESHOLD dc_div_qr_threshold
  1716. extern mp_size_t dc_div_qr_threshold;
  1717. #undef DC_DIVAPPR_Q_THRESHOLD
  1718. #define DC_DIVAPPR_Q_THRESHOLD dc_divappr_q_threshold
  1719. extern mp_size_t dc_divappr_q_threshold;
  1720. #undef DC_BDIV_Q_THRESHOLD
  1721. #define DC_BDIV_Q_THRESHOLD dc_bdiv_q_threshold
  1722. extern mp_size_t dc_bdiv_q_threshold;
  1723. #undef DC_BDIV_QR_THRESHOLD
  1724. #define DC_BDIV_QR_THRESHOLD dc_bdiv_qr_threshold
  1725. extern mp_size_t dc_bdiv_qr_threshold;
  1726. #undef MU_DIV_QR_THRESHOLD
  1727. #define MU_DIV_QR_THRESHOLD mu_div_qr_threshold
  1728. extern mp_size_t mu_div_qr_threshold;
  1729. #undef MU_DIVAPPR_Q_THRESHOLD
  1730. #define MU_DIVAPPR_Q_THRESHOLD mu_divappr_q_threshold
  1731. extern mp_size_t mu_divappr_q_threshold;
  1732. #undef MUPI_DIV_QR_THRESHOLD
  1733. #define MUPI_DIV_QR_THRESHOLD mupi_div_qr_threshold
  1734. extern mp_size_t mupi_div_qr_threshold;
  1735. #undef MU_BDIV_QR_THRESHOLD
  1736. #define MU_BDIV_QR_THRESHOLD mu_bdiv_qr_threshold
  1737. extern mp_size_t mu_bdiv_qr_threshold;
  1738. #undef MU_BDIV_Q_THRESHOLD
  1739. #define MU_BDIV_Q_THRESHOLD mu_bdiv_q_threshold
  1740. extern mp_size_t mu_bdiv_q_threshold;
  1741. #undef INV_MULMOD_BNM1_THRESHOLD
  1742. #define INV_MULMOD_BNM1_THRESHOLD inv_mulmod_bnm1_threshold
  1743. extern mp_size_t inv_mulmod_bnm1_threshold;
  1744. #undef INV_NEWTON_THRESHOLD
  1745. #define INV_NEWTON_THRESHOLD inv_newton_threshold
  1746. extern mp_size_t inv_newton_threshold;
  1747. #undef INV_APPR_THRESHOLD
  1748. #define INV_APPR_THRESHOLD inv_appr_threshold
  1749. extern mp_size_t inv_appr_threshold;
  1750. #undef BINV_NEWTON_THRESHOLD
  1751. #define BINV_NEWTON_THRESHOLD binv_newton_threshold
  1752. extern mp_size_t binv_newton_threshold;
  1753. #undef REDC_1_TO_REDC_2_THRESHOLD
  1754. #define REDC_1_TO_REDC_2_THRESHOLD redc_1_to_redc_2_threshold
  1755. extern mp_size_t redc_1_to_redc_2_threshold;
  1756. #undef REDC_2_TO_REDC_N_THRESHOLD
  1757. #define REDC_2_TO_REDC_N_THRESHOLD redc_2_to_redc_n_threshold
  1758. extern mp_size_t redc_2_to_redc_n_threshold;
  1759. #undef REDC_1_TO_REDC_N_THRESHOLD
  1760. #define REDC_1_TO_REDC_N_THRESHOLD redc_1_to_redc_n_threshold
  1761. extern mp_size_t redc_1_to_redc_n_threshold;
  1762. #undef MATRIX22_STRASSEN_THRESHOLD
  1763. #define MATRIX22_STRASSEN_THRESHOLD matrix22_strassen_threshold
  1764. extern mp_size_t matrix22_strassen_threshold;
  1765. #undef HGCD_THRESHOLD
  1766. #define HGCD_THRESHOLD hgcd_threshold
  1767. extern mp_size_t hgcd_threshold;
  1768. #undef GCD_DC_THRESHOLD
  1769. #define GCD_DC_THRESHOLD gcd_dc_threshold
  1770. extern mp_size_t gcd_dc_threshold;
  1771. #undef  GCDEXT_DC_THRESHOLD
  1772. #define GCDEXT_DC_THRESHOLD gcdext_dc_threshold
  1773. extern mp_size_t gcdext_dc_threshold;
  1774. #undef  DIVREM_1_NORM_THRESHOLD
  1775. #define DIVREM_1_NORM_THRESHOLD divrem_1_norm_threshold
  1776. extern mp_size_t divrem_1_norm_threshold;
  1777. #undef  DIVREM_1_UNNORM_THRESHOLD
  1778. #define DIVREM_1_UNNORM_THRESHOLD divrem_1_unnorm_threshold
  1779. extern mp_size_t divrem_1_unnorm_threshold;
  1780. #undef MOD_1_NORM_THRESHOLD
  1781. #define MOD_1_NORM_THRESHOLD mod_1_norm_threshold
  1782. extern mp_size_t mod_1_norm_threshold;
  1783. #undef MOD_1_UNNORM_THRESHOLD
  1784. #define MOD_1_UNNORM_THRESHOLD mod_1_unnorm_threshold
  1785. extern mp_size_t mod_1_unnorm_threshold;
  1786. #undef MOD_1N_TO_MOD_1_1_THRESHOLD
  1787. #define MOD_1N_TO_MOD_1_1_THRESHOLD mod_1n_to_mod_1_1_threshold
  1788. extern mp_size_t mod_1n_to_mod_1_1_threshold;
  1789. #undef MOD_1U_TO_MOD_1_1_THRESHOLD
  1790. #define MOD_1U_TO_MOD_1_1_THRESHOLD mod_1u_to_mod_1_1_threshold
  1791. extern mp_size_t mod_1u_to_mod_1_1_threshold;
  1792. #undef MOD_1_1_TO_MOD_1_2_THRESHOLD
  1793. #define MOD_1_1_TO_MOD_1_2_THRESHOLD mod_1_1_to_mod_1_2_threshold
  1794. extern mp_size_t mod_1_1_to_mod_1_2_threshold;
  1795. #undef MOD_1_2_TO_MOD_1_4_THRESHOLD
  1796. #define MOD_1_2_TO_MOD_1_4_THRESHOLD mod_1_2_to_mod_1_4_threshold
  1797. extern mp_size_t mod_1_2_to_mod_1_4_threshold;
  1798. #undef PREINV_MOD_1_TO_MOD_1_THRESHOLD
  1799. #define PREINV_MOD_1_TO_MOD_1_THRESHOLD preinv_mod_1_to_mod_1_threshold
  1800. extern mp_size_t preinv_mod_1_to_mod_1_threshold;
  1801. #if ! UDIV_PREINV_ALWAYS
  1802. #undef DIVREM_2_THRESHOLD
  1803. #define DIVREM_2_THRESHOLD divrem_2_threshold
  1804. extern mp_size_t divrem_2_threshold;
  1805. #endif
  1806. #undef MULMOD_BNM1_THRESHOLD
  1807. #define MULMOD_BNM1_THRESHOLD mulmod_bnm1_threshold
  1808. extern mp_size_t mulmod_bnm1_threshold;
  1809. #undef SQRMOD_BNM1_THRESHOLD
  1810. #define SQRMOD_BNM1_THRESHOLD sqrmod_bnm1_threshold
  1811. extern mp_size_t sqrmod_bnm1_threshold;
  1812. #undef GET_STR_DC_THRESHOLD
  1813. #define GET_STR_DC_THRESHOLD get_str_dc_threshold
  1814. extern mp_size_t get_str_dc_threshold;
  1815. #undef  GET_STR_PRECOMPUTE_THRESHOLD
  1816. #define GET_STR_PRECOMPUTE_THRESHOLD get_str_precompute_threshold
  1817. extern mp_size_t get_str_precompute_threshold;
  1818. #undef SET_STR_DC_THRESHOLD
  1819. #define SET_STR_DC_THRESHOLD set_str_dc_threshold
  1820. extern mp_size_t set_str_dc_threshold;
  1821. #undef  SET_STR_PRECOMPUTE_THRESHOLD
  1822. #define SET_STR_PRECOMPUTE_THRESHOLD set_str_precompute_threshold
  1823. extern mp_size_t set_str_precompute_threshold;
  1824. #undef  FFT_TABLE_ATTRS
  1825. #define FFT_TABLE_ATTRS
  1826. extern mp_size_t  mpn_fft_table[2][MPN_FFT_TABLE_SIZE];
  1827. #define FFT_TABLE3_SIZE 2000 /* generous space for tuning */
  1828. extern struct fft_table_nk mpn_fft_table3[2][FFT_TABLE3_SIZE];
  1829. /* Sizes the tune program tests up to, used in a couple of recompilations. */
  1830. #undef MUL_TOOM22_THRESHOLD_LIMIT
  1831. #undef MUL_TOOM33_THRESHOLD_LIMIT
  1832. #undef MULLO_BASECASE_THRESHOLD_LIMIT
  1833. #undef SQR_TOOM3_THRESHOLD_LIMIT
  1834. #define SQR_TOOM2_MAX_GENERIC           200
  1835. #define MUL_TOOM22_THRESHOLD_LIMIT      700
  1836. #define MUL_TOOM33_THRESHOLD_LIMIT      700
  1837. #define SQR_TOOM3_THRESHOLD_LIMIT       400
  1838. #define MUL_TOOM44_THRESHOLD_LIMIT     1000
  1839. #define SQR_TOOM4_THRESHOLD_LIMIT      1000
  1840. #define MUL_TOOM6H_THRESHOLD_LIMIT     1100
  1841. #define SQR_TOOM6_THRESHOLD_LIMIT      1100
  1842. #define MUL_TOOM8H_THRESHOLD_LIMIT     1200
  1843. #define SQR_TOOM8_THRESHOLD_LIMIT      1200
  1844. #define MULLO_BASECASE_THRESHOLD_LIMIT  200
  1845. #define GET_STR_THRESHOLD_LIMIT         150
  1846. #endif /* TUNE_PROGRAM_BUILD */
  1847. #if defined (__cplusplus)
  1848. }
  1849. #endif
  1850. /* FIXME: Make these itch functions less conservative.  Also consider making
  1851.    them dependent on just 'an', and compute the allocation directly from 'an'
  1852.    instead of via n.  */
  1853. /* toom22/toom2: Scratch need is 2*(an + k), k is the recursion depth.
  1854.    k is ths smallest k such that
  1855.      ceil(an/2^k) < MUL_TOOM22_THRESHOLD.
  1856.    which implies that
  1857.      k = bitsize of floor ((an-1)/(MUL_TOOM22_THRESHOLD-1))
  1858.        = 1 + floor (log_2 (floor ((an-1)/(MUL_TOOM22_THRESHOLD-1))))
  1859. */
  1860. #define mpn_toom22_mul_itch(an, bn) 
  1861.   (2 * ((an) + GMP_NUMB_BITS))
  1862. #define mpn_toom2_sqr_itch(an) 
  1863.   (2 * ((an) + GMP_NUMB_BITS))
  1864. /* Can probably be trimmed to 2 an + O(log an). */
  1865. #define mpn_toom33_mul_itch(an, bn) 
  1866.   ((5 * (an) >> 1) + GMP_NUMB_BITS)
  1867. #define mpn_toom3_sqr_itch(an) 
  1868.   ((5 * (an) >> 1) + GMP_NUMB_BITS)
  1869. #define mpn_toom44_mul_itch(an, bn) 
  1870.   (3 * (an) + GMP_NUMB_BITS)
  1871. #define mpn_toom4_sqr_itch(an) 
  1872.   (3 * (an) + GMP_NUMB_BITS)
  1873. #define mpn_toom6_sqr_itch(n)
  1874. ( ((n) - SQR_TOOM6_THRESHOLD)*2 +
  1875.    MAX(SQR_TOOM6_THRESHOLD*2 + GMP_NUMB_BITS*6,
  1876.        mpn_toom4_sqr_itch(SQR_TOOM6_THRESHOLD)) )
  1877. #define mpn_toom6_mul_n_itch(n)
  1878. ( ((n) - MUL_TOOM6H_THRESHOLD)*2 +
  1879.    MAX(MUL_TOOM6H_THRESHOLD*2 + GMP_NUMB_BITS*6,
  1880.        mpn_toom44_mul_itch(MUL_TOOM6H_THRESHOLD,MUL_TOOM6H_THRESHOLD)) )
  1881. static inline mp_size_t
  1882. mpn_toom6h_mul_itch (mp_size_t an, mp_size_t bn) {
  1883.   mp_size_t estimatedN;
  1884.   estimatedN = (an + bn) / (size_t) 10 + 1;
  1885.   return mpn_toom6_mul_n_itch (estimatedN * 6);
  1886. }
  1887. #define mpn_toom8_sqr_itch(n)
  1888. ( (((n)*15)>>3) - ((SQR_TOOM8_THRESHOLD*15)>>3) +
  1889.    MAX(((SQR_TOOM8_THRESHOLD*15)>>3) + GMP_NUMB_BITS*6,
  1890.        mpn_toom6_sqr_itch(SQR_TOOM8_THRESHOLD)) )
  1891. #define mpn_toom8_mul_n_itch(n)
  1892. ( (((n)*15)>>3) - ((MUL_TOOM8H_THRESHOLD*15)>>3) +
  1893.    MAX(((MUL_TOOM8H_THRESHOLD*15)>>3) + GMP_NUMB_BITS*6,
  1894.        mpn_toom6_mul_n_itch(MUL_TOOM8H_THRESHOLD)) )
  1895. static inline mp_size_t
  1896. mpn_toom8h_mul_itch (mp_size_t an, mp_size_t bn) {
  1897.   mp_size_t estimatedN;
  1898.   estimatedN = (an + bn) / (size_t) 14 + 1;
  1899.   return mpn_toom8_mul_n_itch (estimatedN * 8);
  1900. }
  1901. static inline mp_size_t
  1902. mpn_toom32_mul_itch (mp_size_t an, mp_size_t bn)
  1903. {
  1904.   mp_size_t n = 1 + (2 * an >= 3 * bn ? (an - 1) / (size_t) 3 : (bn - 1) >> 1);
  1905.   mp_size_t itch = 2 * n + 1;
  1906.   return itch;
  1907. }
  1908. static inline mp_size_t
  1909. mpn_toom42_mul_itch (mp_size_t an, mp_size_t bn)
  1910. {
  1911.   mp_size_t n = an >= 2 * bn ? (an + 3) >> 2 : (bn + 1) >> 1;
  1912.   return 6 * n + 3;
  1913. }
  1914. static inline mp_size_t
  1915. mpn_toom43_mul_itch (mp_size_t an, mp_size_t bn)
  1916. {
  1917.   mp_size_t n = 1 + (3 * an >= 4 * bn ? (an - 1) >> 2 : (bn - 1) / (size_t) 3);
  1918.   return 6*n + 4;
  1919. }
  1920. static inline mp_size_t
  1921. mpn_toom52_mul_itch (mp_size_t an, mp_size_t bn)
  1922. {
  1923.   mp_size_t n = 1 + (2 * an >= 5 * bn ? (an - 1) / (size_t) 5 : (bn - 1) >> 1);
  1924.   return 6*n + 4;
  1925. }
  1926. static inline mp_size_t
  1927. mpn_toom53_mul_itch (mp_size_t an, mp_size_t bn)
  1928. {
  1929.   mp_size_t n = 1 + (3 * an >= 5 * bn ? (an - 1) / (size_t) 5 : (bn - 1) / (size_t) 3);
  1930.   return 10 * n + 10;
  1931. }
  1932. static inline mp_size_t
  1933. mpn_toom62_mul_itch (mp_size_t an, mp_size_t bn)
  1934. {
  1935.   mp_size_t n = 1 + (an >= 3 * bn ? (an - 1) / (size_t) 6 : (bn - 1) >> 1);
  1936.   return 10 * n + 10;
  1937. }
  1938. static inline mp_size_t
  1939. mpn_toom63_mul_itch (mp_size_t an, mp_size_t bn)
  1940. {
  1941.   mp_size_t n = 1 + (an >= 2 * bn ? (an - 1) / (size_t) 6 : (bn - 1) / (size_t) 3);
  1942.   return 9 * n + 3;
  1943. }
  1944. #if 0
  1945. #define mpn_fft_mul mpn_mul_fft_full
  1946. #else
  1947. #define mpn_fft_mul mpn_nussbaumer_mul
  1948. #endif
  1949. #ifdef __cplusplus
  1950. /* A little helper for a null-terminated __gmp_allocate_func string.
  1951.    The destructor ensures it's freed even if an exception is thrown.
  1952.    The len field is needed by the destructor, and can be used by anyone else
  1953.    to avoid a second strlen pass over the data.
  1954.    Since our input is a C string, using strlen is correct.  Perhaps it'd be
  1955.    more C++-ish style to use std::char_traits<char>::length, but char_traits
  1956.    isn't available in gcc 2.95.4.  */
  1957. class gmp_allocated_string {
  1958.  public:
  1959.   char *str;
  1960.   size_t len;
  1961.   gmp_allocated_string(char *arg)
  1962.   {
  1963.     str = arg;
  1964.     len = std::strlen (str);
  1965.   }
  1966.   ~gmp_allocated_string()
  1967.   {
  1968.     (*__gmp_free_func) (str, len+1);
  1969.   }
  1970. };
  1971. std::istream &__gmpz_operator_in_nowhite (std::istream &, mpz_ptr, char);
  1972. int __gmp_istream_set_base (std::istream &, char &, bool &, bool &);
  1973. void __gmp_istream_set_digits (std::string &, std::istream &, char &, bool &, int);
  1974. void __gmp_doprnt_params_from_ios (struct doprnt_params_t *p, std::ios &o);
  1975. std::ostream& __gmp_doprnt_integer_ostream (std::ostream &o, struct doprnt_params_t *p, char *s);
  1976. extern const struct doprnt_funs_t  __gmp_asprintf_funs_noformat;
  1977. #endif /* __cplusplus */
  1978. #endif /* __GMP_IMPL_H__ */