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

数学计算

开发平台:

Unix_Linux

  1. /* Include file for internal GNU MP types and definitions.
  2.    THE CONTENTS OF THIS FILE ARE FOR INTERNAL USE AND ARE ALMOST CERTAIN TO
  3.    BE SUBJECT TO INCOMPATIBLE CHANGES IN FUTURE GNU MP RELEASES.
  4. Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003,
  5. 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
  6. This file is part of the GNU MP Library.
  7. The GNU MP Library is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU Lesser General Public License as published by
  9. the Free Software Foundation; either version 3 of the License, or (at your
  10. option) any later version.
  11. The GNU MP Library is distributed in the hope that it will be useful, but
  12. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  13. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  14. License for more details.
  15. You should have received a copy of the GNU Lesser General Public License
  16. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  17. /* __GMP_DECLSPEC must be given on any global data that will be accessed
  18.    from outside libgmp, meaning from the test or development programs, or
  19.    from libgmpxx.  Failing to do this will result in an incorrect address
  20.    being used for the accesses.  On functions __GMP_DECLSPEC makes calls
  21.    from outside libgmp more efficient, but they'll still work fine without
  22.    it.  */
  23. #ifndef __GMP_IMPL_H__
  24. #define __GMP_IMPL_H__
  25. #if defined _CRAY
  26. #include <intrinsics.h>  /* for _popcnt */
  27. #endif
  28. /* limits.h is not used in general, since it's an ANSI-ism, and since on
  29.    solaris gcc 2.95 under -mcpu=ultrasparc in ABI=32 ends up getting wrong
  30.    values (the ABI=64 values).
  31.    On Cray vector systems, however, we need the system limits.h since sizes
  32.    of signed and unsigned types can differ there, depending on compiler
  33.    options (eg. -hnofastmd), making our SHRT_MAX etc expressions fail.  For
  34.    reference, int can be 46 or 64 bits, whereas uint is always 64 bits; and
  35.    short can be 24, 32, 46 or 64 bits, and different for ushort.  */
  36. #if defined _CRAY
  37. #include <limits.h>
  38. #endif
  39. /* For fat.h and other fat binary stuff.
  40.    No need for __GMP_ATTRIBUTE_PURE or __GMP_NOTHROW, since functions
  41.    declared this way are only used to set function pointers in __gmp_cpuvec,
  42.    they're not called directly.  */
  43. #define DECL_add_n(name) 
  44.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t))
  45. #define DECL_addmul_1(name) 
  46.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t))
  47. #define DECL_copyd(name) 
  48.   __GMP_DECLSPEC void name __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t))
  49. #define DECL_copyi(name) 
  50.   DECL_copyd (name)
  51. #define DECL_divexact_1(name) 
  52.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t))
  53. #define DECL_divexact_by3c(name) 
  54.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t))
  55. #define DECL_divrem_1(name) 
  56.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t))
  57. #define DECL_gcd_1(name) 
  58.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t))
  59. #define DECL_lshift(name) 
  60.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned))
  61. #define DECL_mod_1(name) 
  62.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t))
  63. #define DECL_mod_34lsub1(name) 
  64.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_srcptr, mp_size_t))
  65. #define DECL_modexact_1c_odd(name) 
  66.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t))
  67. #define DECL_mul_1(name) 
  68.   DECL_addmul_1 (name)
  69. #define DECL_mul_basecase(name) 
  70.   __GMP_DECLSPEC void name __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t))
  71. #define DECL_preinv_divrem_1(name) 
  72.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t, int))
  73. #define DECL_preinv_mod_1(name) 
  74.   __GMP_DECLSPEC mp_limb_t name __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t))
  75. #define DECL_rshift(name) 
  76.   DECL_lshift (name)
  77. #define DECL_sqr_basecase(name) 
  78.   __GMP_DECLSPEC void name __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t))
  79. #define DECL_sub_n(name) 
  80.   DECL_add_n (name)
  81. #define DECL_submul_1(name) 
  82.   DECL_addmul_1 (name)
  83. #if ! __GMP_WITHIN_CONFIGURE
  84. #include "config.h"
  85. #include "gmp-mparam.h"
  86. #include "fib_table.h"
  87. #include "mp_bases.h"
  88. #if WANT_FAT_BINARY
  89. #include "fat.h"
  90. #endif
  91. #endif
  92. #if HAVE_INTTYPES_H      /* for uint_least32_t */
  93. # include <inttypes.h>
  94. #else
  95. # if HAVE_STDINT_H
  96. #  include <stdint.h>
  97. # endif
  98. #endif
  99. #ifdef __cplusplus
  100. #include <cstring>  /* for strlen */
  101. #include <string>   /* for std::string */
  102. #endif
  103. #ifndef WANT_TMP_DEBUG  /* for TMP_ALLOC_LIMBS_2 and others */
  104. #define WANT_TMP_DEBUG 0
  105. #endif
  106. /* The following tries to get a good version of alloca.  The tests are
  107.    adapted from autoconf AC_FUNC_ALLOCA, with a couple of additions.
  108.    Whether this succeeds is tested by GMP_FUNC_ALLOCA and HAVE_ALLOCA will
  109.    be setup appropriately.
  110.    ifndef alloca - a cpp define might already exist.
  111.        glibc <stdlib.h> includes <alloca.h> which uses GCC __builtin_alloca.
  112.        HP cc +Olibcalls adds a #define of alloca to __builtin_alloca.
  113.    GCC __builtin_alloca - preferred whenever available.
  114.    _AIX pragma - IBM compilers need a #pragma in "each module that needs to
  115.        use alloca".  Pragma indented to protect pre-ANSI cpp's.  _IBMR2 was
  116.        used in past versions of GMP, retained still in case it matters.
  117.        The autoconf manual says this pragma needs to be at the start of a C
  118.        file, apart from comments and preprocessor directives.  Is that true?
  119.        xlc on aix 4.xxx doesn't seem to mind it being after prototypes etc
  120.        from gmp.h.
  121. */
  122. #ifndef alloca
  123. # ifdef __GNUC__
  124. #  define alloca __builtin_alloca
  125. # else
  126. #  ifdef __DECC
  127. #   define alloca(x) __ALLOCA(x)
  128. #  else
  129. #   ifdef _MSC_VER
  130. #    include <malloc.h>
  131. #    define alloca _alloca
  132. #   else
  133. #    if HAVE_ALLOCA_H
  134. #     include <alloca.h>
  135. #    else
  136. #     if defined (_AIX) || defined (_IBMR2)
  137.  #pragma alloca
  138. #     else
  139.        char *alloca ();
  140. #     endif
  141. #    endif
  142. #   endif
  143. #  endif
  144. # endif
  145. #endif
  146. /* if not provided by gmp-mparam.h */
  147. #ifndef BYTES_PER_MP_LIMB
  148. #define BYTES_PER_MP_LIMB  SIZEOF_MP_LIMB_T
  149. #endif
  150. #define GMP_LIMB_BYTES  BYTES_PER_MP_LIMB
  151. #ifndef GMP_LIMB_BITS
  152. #define GMP_LIMB_BITS  (8 * SIZEOF_MP_LIMB_T)
  153. #endif
  154. #define BITS_PER_ULONG  (8 * SIZEOF_UNSIGNED_LONG)
  155. /* gmp_uint_least32_t is an unsigned integer type with at least 32 bits. */
  156. #if HAVE_UINT_LEAST32_T
  157. typedef uint_least32_t      gmp_uint_least32_t;
  158. #else
  159. #if SIZEOF_UNSIGNED_SHORT >= 4
  160. typedef unsigned short      gmp_uint_least32_t;
  161. #else
  162. #if SIZEOF_UNSIGNED >= 4
  163. typedef unsigned            gmp_uint_least32_t;
  164. #else
  165. typedef unsigned long       gmp_uint_least32_t;
  166. #endif
  167. #endif
  168. #endif
  169. /* gmp_intptr_t, for pointer to integer casts */
  170. #if HAVE_INTPTR_T
  171. typedef intptr_t            gmp_intptr_t;
  172. #else /* fallback */
  173. typedef size_t              gmp_intptr_t;
  174. #endif
  175. /* pre-inverse types for truncating division and modulo */
  176. typedef struct {mp_limb_t inv32;} gmp_pi1_t;
  177. typedef struct {mp_limb_t inv21, inv32, inv53;} gmp_pi2_t;
  178. /* const and signed must match __gmp_const and __gmp_signed, so follow the
  179.    decision made for those in gmp.h.    */
  180. #if ! __GMP_HAVE_CONST
  181. #define const   /* empty */
  182. #define signed  /* empty */
  183. #endif
  184. /* "const" basically means a function does nothing but examine its arguments
  185.    and give a return value, it doesn't read or write any memory (neither
  186.    global nor pointed to by arguments), and has no other side-effects.  This
  187.    is more restrictive than "pure".  See info node "(gcc)Function
  188.    Attributes".  __GMP_NO_ATTRIBUTE_CONST_PURE lets tune/common.c etc turn
  189.    this off when trying to write timing loops.  */
  190. #if HAVE_ATTRIBUTE_CONST && ! defined (__GMP_NO_ATTRIBUTE_CONST_PURE)
  191. #define ATTRIBUTE_CONST  __attribute__ ((const))
  192. #else
  193. #define ATTRIBUTE_CONST
  194. #endif
  195. #if HAVE_ATTRIBUTE_NORETURN
  196. #define ATTRIBUTE_NORETURN  __attribute__ ((noreturn))
  197. #else
  198. #define ATTRIBUTE_NORETURN
  199. #endif
  200. /* "malloc" means a function behaves like malloc in that the pointer it
  201.    returns doesn't alias anything.  */
  202. #if HAVE_ATTRIBUTE_MALLOC
  203. #define ATTRIBUTE_MALLOC  __attribute__ ((malloc))
  204. #else
  205. #define ATTRIBUTE_MALLOC
  206. #endif
  207. #if ! HAVE_STRCHR
  208. #define strchr(s,c)  index(s,c)
  209. #endif
  210. #if ! HAVE_MEMSET
  211. #define memset(p, c, n)                 
  212.   do {                                  
  213.     ASSERT ((n) >= 0);                  
  214.     char *__memset__p = (p);            
  215.     int  __i;                           
  216.     for (__i = 0; __i < (n); __i++)     
  217.       __memset__p[__i] = (c);           
  218.   } while (0)
  219. #endif
  220. /* va_copy is standard in C99, and gcc provides __va_copy when in strict C89
  221.    mode.  Falling back to a memcpy will give maximum portability, since it
  222.    works no matter whether va_list is a pointer, struct or array.  */
  223. #if ! defined (va_copy) && defined (__va_copy)
  224. #define va_copy(dst,src)  __va_copy(dst,src)
  225. #endif
  226. #if ! defined (va_copy)
  227. #define va_copy(dst,src) 
  228.   do { memcpy (&(dst), &(src), sizeof (va_list)); } while (0)
  229. #endif
  230. /* HAVE_HOST_CPU_alpha_CIX is 1 on an alpha with the CIX instructions
  231.    (ie. ctlz, ctpop, cttz).  */
  232. #if HAVE_HOST_CPU_alphaev67 || HAVE_HOST_CPU_alphaev68  
  233.   || HAVE_HOST_CPU_alphaev7
  234. #define HAVE_HOST_CPU_alpha_CIX 1
  235. #endif
  236. #if defined (__cplusplus)
  237. extern "C" {
  238. #endif
  239. /* Usage: TMP_DECL;
  240.           TMP_MARK;
  241.           ptr = TMP_ALLOC (bytes);
  242.           TMP_FREE;
  243.    Small allocations should use TMP_SALLOC, big allocations should use
  244.    TMP_BALLOC.  Allocations that might be small or big should use TMP_ALLOC.
  245.    Functions that use just TMP_SALLOC should use TMP_SDECL, TMP_SMARK, and
  246.    TMP_SFREE.
  247.    TMP_DECL just declares a variable, but might be empty and so must be last
  248.    in a list of variables.  TMP_MARK must be done before any TMP_ALLOC.
  249.    TMP_ALLOC(0) is not allowed.  TMP_FREE doesn't need to be done if a
  250.    TMP_MARK was made, but then no TMP_ALLOCs.  */
  251. /* The alignment in bytes, used for TMP_ALLOCed blocks, when alloca or
  252.    __gmp_allocate_func doesn't already determine it.  Currently TMP_ALLOC
  253.    isn't used for "double"s, so that's not in the union.  */
  254. union tmp_align_t {
  255.   mp_limb_t  l;
  256.   char       *p;
  257. };
  258. #define __TMP_ALIGN  sizeof (union tmp_align_t)
  259. /* Return "a" rounded upwards to a multiple of "m", if it isn't already.
  260.    "a" must be an unsigned type.
  261.    This is designed for use with a compile-time constant "m".
  262.    The POW2 case is expected to be usual, and gcc 3.0 and up recognises
  263.    "(-(8*n))%8" or the like is always zero, which means the rounding up in
  264.    the WANT_TMP_NOTREENTRANT version of TMP_ALLOC below will be a noop.  */
  265. #define ROUND_UP_MULTIPLE(a,m)          
  266.   (POW2_P(m) ? (a) + (-(a))%(m)         
  267.    : (a)+(m)-1 - (((a)+(m)-1) % (m)))
  268. #if defined (WANT_TMP_ALLOCA) || defined (WANT_TMP_REENTRANT)
  269. struct tmp_reentrant_t {
  270.   struct tmp_reentrant_t  *next;
  271.   size_t   size;   /* bytes, including header */
  272. };
  273. __GMP_DECLSPEC void *__gmp_tmp_reentrant_alloc __GMP_PROTO ((struct tmp_reentrant_t **, size_t)) ATTRIBUTE_MALLOC;
  274. __GMP_DECLSPEC void  __gmp_tmp_reentrant_free __GMP_PROTO ((struct tmp_reentrant_t *));
  275. #endif
  276. #if WANT_TMP_ALLOCA
  277. #define TMP_SDECL
  278. #define TMP_DECL struct tmp_reentrant_t *__tmp_marker
  279. #define TMP_SMARK
  280. #define TMP_MARK __tmp_marker = 0
  281. #define TMP_SALLOC(n) alloca(n)
  282. #define TMP_BALLOC(n) __gmp_tmp_reentrant_alloc (&__tmp_marker, n)
  283. #define TMP_ALLOC(n)
  284.   (LIKELY ((n) < 65536) ? TMP_SALLOC(n) : TMP_BALLOC(n))
  285. #define TMP_SFREE
  286. #define TMP_FREE    
  287.   do {    
  288.     if (UNLIKELY (__tmp_marker != 0)) __gmp_tmp_reentrant_free (__tmp_marker); 
  289.   } while (0)
  290. #endif
  291. #if WANT_TMP_REENTRANT
  292. #define TMP_SDECL TMP_DECL
  293. #define TMP_DECL struct tmp_reentrant_t *__tmp_marker
  294. #define TMP_SMARK TMP_MARK
  295. #define TMP_MARK __tmp_marker = 0
  296. #define TMP_SALLOC(n) TMP_ALLOC(n)
  297. #define TMP_BALLOC(n) TMP_ALLOC(n)
  298. #define TMP_ALLOC(n) __gmp_tmp_reentrant_alloc (&__tmp_marker, n)
  299. #define TMP_SFREE TMP_FREE
  300. #define TMP_FREE __gmp_tmp_reentrant_free (__tmp_marker)
  301. #endif
  302. #if WANT_TMP_NOTREENTRANT
  303. struct tmp_marker
  304. {
  305.   struct tmp_stack *which_chunk;
  306.   void *alloc_point;
  307. };
  308. __GMP_DECLSPEC void *__gmp_tmp_alloc __GMP_PROTO ((unsigned long)) ATTRIBUTE_MALLOC;
  309. __GMP_DECLSPEC void __gmp_tmp_mark __GMP_PROTO ((struct tmp_marker *));
  310. __GMP_DECLSPEC void __gmp_tmp_free __GMP_PROTO ((struct tmp_marker *));
  311. #define TMP_SDECL TMP_DECL
  312. #define TMP_DECL struct tmp_marker __tmp_marker
  313. #define TMP_SMARK TMP_MARK
  314. #define TMP_MARK __gmp_tmp_mark (&__tmp_marker)
  315. #define TMP_SALLOC(n) TMP_ALLOC(n)
  316. #define TMP_BALLOC(n) TMP_ALLOC(n)
  317. #define TMP_ALLOC(n)
  318.   __gmp_tmp_alloc (ROUND_UP_MULTIPLE ((unsigned long) (n), __TMP_ALIGN))
  319. #define TMP_SFREE TMP_FREE
  320. #define TMP_FREE __gmp_tmp_free (&__tmp_marker)
  321. #endif
  322. #if WANT_TMP_DEBUG
  323. /* See tal-debug.c for some comments. */
  324. struct tmp_debug_t {
  325.   struct tmp_debug_entry_t  *list;
  326.   const char                *file;
  327.   int                       line;
  328. };
  329. struct tmp_debug_entry_t {
  330.   struct tmp_debug_entry_t  *next;
  331.   char                      *block;
  332.   size_t                    size;
  333. };
  334. __GMP_DECLSPEC void  __gmp_tmp_debug_mark  __GMP_PROTO ((const char *, int, struct tmp_debug_t **,
  335.  struct tmp_debug_t *,
  336.  const char *, const char *));
  337. __GMP_DECLSPEC void *__gmp_tmp_debug_alloc __GMP_PROTO ((const char *, int, int,
  338.  struct tmp_debug_t **, const char *,
  339.  size_t)) ATTRIBUTE_MALLOC;
  340. __GMP_DECLSPEC void  __gmp_tmp_debug_free  __GMP_PROTO ((const char *, int, int,
  341.  struct tmp_debug_t **,
  342.  const char *, const char *));
  343. #define TMP_SDECL TMP_DECL_NAME(__tmp_xmarker, "__tmp_marker")
  344. #define TMP_DECL TMP_DECL_NAME(__tmp_xmarker, "__tmp_marker")
  345. #define TMP_SMARK TMP_MARK_NAME(__tmp_xmarker, "__tmp_marker")
  346. #define TMP_MARK TMP_MARK_NAME(__tmp_xmarker, "__tmp_marker")
  347. #define TMP_SFREE TMP_FREE_NAME(__tmp_xmarker, "__tmp_marker")
  348. #define TMP_FREE TMP_FREE_NAME(__tmp_xmarker, "__tmp_marker")
  349. /* The marker variable is designed to provoke an uninitialized variable
  350.    warning from the compiler if TMP_FREE is used without a TMP_MARK.
  351.    __tmp_marker_inscope does the same for TMP_ALLOC.  Runtime tests pick
  352.    these things up too.  */
  353. #define TMP_DECL_NAME(marker, marker_name)                      
  354.   int marker;                                                   
  355.   int __tmp_marker_inscope;                                     
  356.   const char *__tmp_marker_name = marker_name;                  
  357.   struct tmp_debug_t  __tmp_marker_struct;                      
  358.   /* don't demand NULL, just cast a zero */                     
  359.   struct tmp_debug_t  *__tmp_marker = (struct tmp_debug_t *) 0
  360. #define TMP_MARK_NAME(marker, marker_name)                      
  361.   do {                                                          
  362.     marker = 1;                                                 
  363.     __tmp_marker_inscope = 1;                                   
  364.     __gmp_tmp_debug_mark  (ASSERT_FILE, ASSERT_LINE,            
  365.                            &__tmp_marker, &__tmp_marker_struct, 
  366.                            __tmp_marker_name, marker_name);     
  367.   } while (0)
  368. #define TMP_SALLOC(n) TMP_ALLOC(n)
  369. #define TMP_BALLOC(n) TMP_ALLOC(n)
  370. #define TMP_ALLOC(size)                                                 
  371.   __gmp_tmp_debug_alloc (ASSERT_FILE, ASSERT_LINE,                      
  372.                          __tmp_marker_inscope,                          
  373.                          &__tmp_marker, __tmp_marker_name, size)
  374. #define TMP_FREE_NAME(marker, marker_name)                      
  375.   do {                                                          
  376.     __gmp_tmp_debug_free  (ASSERT_FILE, ASSERT_LINE,            
  377.                            marker, &__tmp_marker,               
  378.                            __tmp_marker_name, marker_name);     
  379.   } while (0)
  380. #endif /* WANT_TMP_DEBUG */
  381. /* Allocating various types. */
  382. #define TMP_ALLOC_TYPE(n,type)  ((type *) TMP_ALLOC ((n) * sizeof (type)))
  383. #define TMP_SALLOC_TYPE(n,type) ((type *) TMP_SALLOC ((n) * sizeof (type)))
  384. #define TMP_BALLOC_TYPE(n,type) ((type *) TMP_BALLOC ((n) * sizeof (type)))
  385. #define TMP_ALLOC_LIMBS(n)      TMP_ALLOC_TYPE(n,mp_limb_t)
  386. #define TMP_SALLOC_LIMBS(n)     TMP_SALLOC_TYPE(n,mp_limb_t)
  387. #define TMP_BALLOC_LIMBS(n)     TMP_BALLOC_TYPE(n,mp_limb_t)
  388. #define TMP_ALLOC_MP_PTRS(n)    TMP_ALLOC_TYPE(n,mp_ptr)
  389. #define TMP_SALLOC_MP_PTRS(n)   TMP_SALLOC_TYPE(n,mp_ptr)
  390. #define TMP_BALLOC_MP_PTRS(n)   TMP_BALLOC_TYPE(n,mp_ptr)
  391. /* It's more efficient to allocate one block than two.  This is certainly
  392.    true of the malloc methods, but it can even be true of alloca if that
  393.    involves copying a chunk of stack (various RISCs), or a call to a stack
  394.    bounds check (mingw).  In any case, when debugging keep separate blocks
  395.    so a redzoning malloc debugger can protect each individually.  */
  396. #define TMP_ALLOC_LIMBS_2(xp,xsize, yp,ysize)           
  397.   do {                                                  
  398.     if (WANT_TMP_DEBUG)                                 
  399.       {                                                 
  400.         (xp) = TMP_ALLOC_LIMBS (xsize);                 
  401.         (yp) = TMP_ALLOC_LIMBS (ysize);                 
  402.       }                                                 
  403.     else                                                
  404.       {                                                 
  405.         (xp) = TMP_ALLOC_LIMBS ((xsize) + (ysize));     
  406.         (yp) = (xp) + (xsize);                          
  407.       }                                                 
  408.   } while (0)
  409. /* From gmp.h, nicer names for internal use. */
  410. #define CRAY_Pragma(str)               __GMP_CRAY_Pragma(str)
  411. #define MPN_CMP(result, xp, yp, size)  __GMPN_CMP(result, xp, yp, size)
  412. #define LIKELY(cond)                   __GMP_LIKELY(cond)
  413. #define UNLIKELY(cond)                 __GMP_UNLIKELY(cond)
  414. #define ABS(x) ((x) >= 0 ? (x) : -(x))
  415. #undef MIN
  416. #define MIN(l,o) ((l) < (o) ? (l) : (o))
  417. #undef MAX
  418. #define MAX(h,i) ((h) > (i) ? (h) : (i))
  419. #define numberof(x)  (sizeof (x) / sizeof ((x)[0]))
  420. /* Field access macros.  */
  421. #define SIZ(x) ((x)->_mp_size)
  422. #define ABSIZ(x) ABS (SIZ (x))
  423. #define PTR(x) ((x)->_mp_d)
  424. #define LIMBS(x) ((x)->_mp_d)
  425. #define EXP(x) ((x)->_mp_exp)
  426. #define PREC(x) ((x)->_mp_prec)
  427. #define ALLOC(x) ((x)->_mp_alloc)
  428. /* n-1 inverts any low zeros and the lowest one bit.  If n&(n-1) leaves zero
  429.    then that lowest one bit must have been the only bit set.  n==0 will
  430.    return true though, so avoid that.  */
  431. #define POW2_P(n)  (((n) & ((n) - 1)) == 0)
  432. /* The "short" defines are a bit different because shorts are promoted to
  433.    ints by ~ or >> etc.
  434.    #ifndef's are used since on some systems (HP?) header files other than
  435.    limits.h setup these defines.  We could forcibly #undef in that case, but
  436.    there seems no need to worry about that.  */
  437. #ifndef ULONG_MAX
  438. #define ULONG_MAX   __GMP_ULONG_MAX
  439. #endif
  440. #ifndef UINT_MAX
  441. #define UINT_MAX    __GMP_UINT_MAX
  442. #endif
  443. #ifndef USHRT_MAX
  444. #define USHRT_MAX   __GMP_USHRT_MAX
  445. #endif
  446. #define MP_LIMB_T_MAX      (~ (mp_limb_t) 0)
  447. /* Must cast ULONG_MAX etc to unsigned long etc, since they might not be
  448.    unsigned on a K&R compiler.  In particular the HP-UX 10 bundled K&R cc
  449.    treats the plain decimal values in <limits.h> as signed.  */
  450. #define ULONG_HIGHBIT      (ULONG_MAX ^ ((unsigned long) ULONG_MAX >> 1))
  451. #define UINT_HIGHBIT       (UINT_MAX ^ ((unsigned) UINT_MAX >> 1))
  452. #define USHRT_HIGHBIT      ((unsigned short) (USHRT_MAX ^ ((unsigned short) USHRT_MAX >> 1)))
  453. #define GMP_LIMB_HIGHBIT  (MP_LIMB_T_MAX ^ (MP_LIMB_T_MAX >> 1))
  454. #ifndef LONG_MIN
  455. #define LONG_MIN           ((long) ULONG_HIGHBIT)
  456. #endif
  457. #ifndef LONG_MAX
  458. #define LONG_MAX           (-(LONG_MIN+1))
  459. #endif
  460. #ifndef INT_MIN
  461. #define INT_MIN            ((int) UINT_HIGHBIT)
  462. #endif
  463. #ifndef INT_MAX
  464. #define INT_MAX            (-(INT_MIN+1))
  465. #endif
  466. #ifndef SHRT_MIN
  467. #define SHRT_MIN           ((short) USHRT_HIGHBIT)
  468. #endif
  469. #ifndef SHRT_MAX
  470. #define SHRT_MAX           ((short) (-(SHRT_MIN+1)))
  471. #endif
  472. #if __GMP_MP_SIZE_T_INT
  473. #define MP_SIZE_T_MAX      INT_MAX
  474. #define MP_SIZE_T_MIN      INT_MIN
  475. #else
  476. #define MP_SIZE_T_MAX      LONG_MAX
  477. #define MP_SIZE_T_MIN      LONG_MIN
  478. #endif
  479. /* mp_exp_t is the same as mp_size_t */
  480. #define MP_EXP_T_MAX   MP_SIZE_T_MAX
  481. #define MP_EXP_T_MIN   MP_SIZE_T_MIN
  482. #define LONG_HIGHBIT       LONG_MIN
  483. #define INT_HIGHBIT        INT_MIN
  484. #define SHRT_HIGHBIT       SHRT_MIN
  485. #define GMP_NUMB_HIGHBIT  (CNST_LIMB(1) << (GMP_NUMB_BITS-1))
  486. #if GMP_NAIL_BITS == 0
  487. #define GMP_NAIL_LOWBIT   CNST_LIMB(0)
  488. #else
  489. #define GMP_NAIL_LOWBIT   (CNST_LIMB(1) << GMP_NUMB_BITS)
  490. #endif
  491. #if GMP_NAIL_BITS != 0
  492. /* Set various *_THRESHOLD values to be used for nails.  Thus we avoid using
  493.    code that has not yet been qualified.  */
  494. #undef  DC_DIV_QR_THRESHOLD
  495. #define DC_DIV_QR_THRESHOLD              50
  496. #undef DIVREM_1_NORM_THRESHOLD
  497. #undef DIVREM_1_UNNORM_THRESHOLD
  498. #undef MOD_1_NORM_THRESHOLD
  499. #undef MOD_1_UNNORM_THRESHOLD
  500. #undef USE_PREINV_DIVREM_1
  501. #undef DIVREM_2_THRESHOLD
  502. #undef DIVEXACT_1_THRESHOLD
  503. #define DIVREM_1_NORM_THRESHOLD           MP_SIZE_T_MAX  /* no preinv */
  504. #define DIVREM_1_UNNORM_THRESHOLD         MP_SIZE_T_MAX  /* no preinv */
  505. #define MOD_1_NORM_THRESHOLD              MP_SIZE_T_MAX  /* no preinv */
  506. #define MOD_1_UNNORM_THRESHOLD            MP_SIZE_T_MAX  /* no preinv */
  507. #define USE_PREINV_DIVREM_1               0  /* no preinv */
  508. #define DIVREM_2_THRESHOLD                MP_SIZE_T_MAX  /* no preinv */
  509. /* mpn/generic/mul_fft.c is not nails-capable. */
  510. #undef  MUL_FFT_THRESHOLD
  511. #undef  SQR_FFT_THRESHOLD
  512. #define MUL_FFT_THRESHOLD                MP_SIZE_T_MAX
  513. #define SQR_FFT_THRESHOLD                MP_SIZE_T_MAX
  514. #endif
  515. /* Swap macros. */
  516. #define MP_LIMB_T_SWAP(x, y)                    
  517.   do {                                          
  518.     mp_limb_t __mp_limb_t_swap__tmp = (x);      
  519.     (x) = (y);                                  
  520.     (y) = __mp_limb_t_swap__tmp;                
  521.   } while (0)
  522. #define MP_SIZE_T_SWAP(x, y)                    
  523.   do {                                          
  524.     mp_size_t __mp_size_t_swap__tmp = (x);      
  525.     (x) = (y);                                  
  526.     (y) = __mp_size_t_swap__tmp;                
  527.   } while (0)
  528. #define MP_PTR_SWAP(x, y)               
  529.   do {                                  
  530.     mp_ptr __mp_ptr_swap__tmp = (x);    
  531.     (x) = (y);                          
  532.     (y) = __mp_ptr_swap__tmp;           
  533.   } while (0)
  534. #define MP_SRCPTR_SWAP(x, y)                    
  535.   do {                                          
  536.     mp_srcptr __mp_srcptr_swap__tmp = (x);      
  537.     (x) = (y);                                  
  538.     (y) = __mp_srcptr_swap__tmp;                
  539.   } while (0)
  540. #define MPN_PTR_SWAP(xp,xs, yp,ys)      
  541.   do {                                  
  542.     MP_PTR_SWAP (xp, yp);               
  543.     MP_SIZE_T_SWAP (xs, ys);            
  544.   } while(0)
  545. #define MPN_SRCPTR_SWAP(xp,xs, yp,ys)   
  546.   do {                                  
  547.     MP_SRCPTR_SWAP (xp, yp);            
  548.     MP_SIZE_T_SWAP (xs, ys);            
  549.   } while(0)
  550. #define MPZ_PTR_SWAP(x, y)              
  551.   do {                                  
  552.     mpz_ptr __mpz_ptr_swap__tmp = (x);  
  553.     (x) = (y);                          
  554.     (y) = __mpz_ptr_swap__tmp;          
  555.   } while (0)
  556. #define MPZ_SRCPTR_SWAP(x, y)                   
  557.   do {                                          
  558.     mpz_srcptr __mpz_srcptr_swap__tmp = (x);    
  559.     (x) = (y);                                  
  560.     (y) = __mpz_srcptr_swap__tmp;               
  561.   } while (0)
  562. /* Enhancement: __gmp_allocate_func could have "__attribute__ ((malloc))",
  563.    but current gcc (3.0) doesn't seem to support that.  */
  564. __GMP_DECLSPEC extern void * (*__gmp_allocate_func) __GMP_PROTO ((size_t));
  565. __GMP_DECLSPEC extern void * (*__gmp_reallocate_func) __GMP_PROTO ((void *, size_t, size_t));
  566. __GMP_DECLSPEC extern void   (*__gmp_free_func) __GMP_PROTO ((void *, size_t));
  567. __GMP_DECLSPEC void *__gmp_default_allocate __GMP_PROTO ((size_t));
  568. __GMP_DECLSPEC void *__gmp_default_reallocate __GMP_PROTO ((void *, size_t, size_t));
  569. __GMP_DECLSPEC void __gmp_default_free __GMP_PROTO ((void *, size_t));
  570. #define __GMP_ALLOCATE_FUNC_TYPE(n,type) 
  571.   ((type *) (*__gmp_allocate_func) ((n) * sizeof (type)))
  572. #define __GMP_ALLOCATE_FUNC_LIMBS(n)   __GMP_ALLOCATE_FUNC_TYPE (n, mp_limb_t)
  573. #define __GMP_REALLOCATE_FUNC_TYPE(p, old_size, new_size, type) 
  574.   ((type *) (*__gmp_reallocate_func)                            
  575.    (p, (old_size) * sizeof (type), (new_size) * sizeof (type)))
  576. #define __GMP_REALLOCATE_FUNC_LIMBS(p, old_size, new_size) 
  577.   __GMP_REALLOCATE_FUNC_TYPE(p, old_size, new_size, mp_limb_t)
  578. #define __GMP_FREE_FUNC_TYPE(p,n,type) (*__gmp_free_func) (p, (n) * sizeof (type))
  579. #define __GMP_FREE_FUNC_LIMBS(p,n)     __GMP_FREE_FUNC_TYPE (p, n, mp_limb_t)
  580. #define __GMP_REALLOCATE_FUNC_MAYBE(ptr, oldsize, newsize)      
  581.   do {                                                          
  582.     if ((oldsize) != (newsize))                                 
  583.       (ptr) = (*__gmp_reallocate_func) (ptr, oldsize, newsize); 
  584.   } while (0)
  585. #define __GMP_REALLOCATE_FUNC_MAYBE_TYPE(ptr, oldsize, newsize, type)   
  586.   do {                                                                  
  587.     if ((oldsize) != (newsize))                                         
  588.       (ptr) = (type *) (*__gmp_reallocate_func)                         
  589.         (ptr, (oldsize) * sizeof (type), (newsize) * sizeof (type));    
  590.   } while (0)
  591. /* Dummy for non-gcc, code involving it will go dead. */
  592. #if ! defined (__GNUC__) || __GNUC__ < 2
  593. #define __builtin_constant_p(x)   0
  594. #endif
  595. /* In gcc 2.96 and up on i386, tail calls are optimized to jumps if the
  596.    stack usage is compatible.  __attribute__ ((regparm (N))) helps by
  597.    putting leading parameters in registers, avoiding extra stack.
  598.    regparm cannot be used with calls going through the PLT, because the
  599.    binding code there may clobber the registers (%eax, %edx, %ecx) used for
  600.    the regparm parameters.  Calls to local (ie. static) functions could
  601.    still use this, if we cared to differentiate locals and globals.
  602.    On athlon-unknown-freebsd4.9 with gcc 3.3.3, regparm cannot be used with
  603.    -p or -pg profiling, since that version of gcc doesn't realize the
  604.    .mcount calls will clobber the parameter registers.  Other systems are
  605.    ok, like debian with glibc 2.3.2 (mcount doesn't clobber), but we don't
  606.    bother to try to detect this.  regparm is only an optimization so we just
  607.    disable it when profiling (profiling being a slowdown anyway).  */
  608. #if HAVE_HOST_CPU_FAMILY_x86 && __GMP_GNUC_PREREQ (2,96) && ! defined (PIC) 
  609.   && ! WANT_PROFILING_PROF && ! WANT_PROFILING_GPROF
  610. #define USE_LEADING_REGPARM 1
  611. #else
  612. #define USE_LEADING_REGPARM 0
  613. #endif
  614. /* Macros for altering parameter order according to regparm usage. */
  615. #if USE_LEADING_REGPARM
  616. #define REGPARM_2_1(a,b,x)    x,a,b
  617. #define REGPARM_3_1(a,b,c,x)  x,a,b,c
  618. #define REGPARM_ATTR(n) __attribute__ ((regparm (n)))
  619. #else
  620. #define REGPARM_2_1(a,b,x)    a,b,x
  621. #define REGPARM_3_1(a,b,c,x)  a,b,c,x
  622. #define REGPARM_ATTR(n)
  623. #endif
  624. /* ASM_L gives a local label for a gcc asm block, for use when temporary
  625.    local labels like "1:" might not be available, which is the case for
  626.    instance on the x86s (the SCO assembler doesn't support them).
  627.    The label generated is made unique by including "%=" which is a unique
  628.    number for each insn.  This ensures the same name can be used in multiple
  629.    asm blocks, perhaps via a macro.  Since jumps between asm blocks are not
  630.    allowed there's no need for a label to be usable outside a single
  631.    block.  */
  632. #define ASM_L(name)  LSYM_PREFIX "asm_%=_" #name
  633. #if defined (__GNUC__) && HAVE_HOST_CPU_FAMILY_x86
  634. #if 0
  635. /* FIXME: Check that these actually improve things.
  636.    FIXME: Need a cld after each std.
  637.    FIXME: Can't have inputs in clobbered registers, must describe them as
  638.    dummy outputs, and add volatile. */
  639. #define MPN_COPY_INCR(DST, SRC, N)
  640.   __asm__ ("cldntrepntmovsl" : :
  641.    "D" (DST), "S" (SRC), "c" (N) :
  642.    "cx", "di", "si", "memory")
  643. #define MPN_COPY_DECR(DST, SRC, N)
  644.   __asm__ ("stdntrepntmovsl" : :
  645.    "D" ((DST) + (N) - 1), "S" ((SRC) + (N) - 1), "c" (N) :
  646.    "cx", "di", "si", "memory")
  647. #endif
  648. #endif
  649. __GMP_DECLSPEC void __gmpz_aorsmul_1 __GMP_PROTO ((REGPARM_3_1 (mpz_ptr, mpz_srcptr, mp_limb_t, mp_size_t))) REGPARM_ATTR(1);
  650. #define mpz_aorsmul_1(w,u,v,sub)  __gmpz_aorsmul_1 (REGPARM_3_1 (w, u, v, sub))
  651. #define mpz_n_pow_ui __gmpz_n_pow_ui
  652. __GMP_DECLSPEC void    mpz_n_pow_ui __GMP_PROTO ((mpz_ptr, mp_srcptr, mp_size_t, unsigned long));
  653. #define mpn_addmul_1c __MPN(addmul_1c)
  654. __GMP_DECLSPEC mp_limb_t mpn_addmul_1c __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
  655. #define mpn_addmul_2 __MPN(addmul_2)
  656. __GMP_DECLSPEC mp_limb_t mpn_addmul_2 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  657. #define mpn_addmul_3 __MPN(addmul_3)
  658. __GMP_DECLSPEC mp_limb_t mpn_addmul_3 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  659. #define mpn_addmul_4 __MPN(addmul_4)
  660. __GMP_DECLSPEC mp_limb_t mpn_addmul_4 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  661. #define mpn_addmul_5 __MPN(addmul_5)
  662. __GMP_DECLSPEC mp_limb_t mpn_addmul_5 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  663. #define mpn_addmul_6 __MPN(addmul_6)
  664. __GMP_DECLSPEC mp_limb_t mpn_addmul_6 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  665. #define mpn_addmul_7 __MPN(addmul_7)
  666. __GMP_DECLSPEC mp_limb_t mpn_addmul_7 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  667. #define mpn_addmul_8 __MPN(addmul_8)
  668. __GMP_DECLSPEC mp_limb_t mpn_addmul_8 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  669. /* mpn_addlsh1_n(c,a,b,n), when it exists, sets {c,n} to {a,n}+2*{b,n}, and
  670.    returns the carry out (0, 1 or 2).  */
  671. #define mpn_addlsh1_n __MPN(addlsh1_n)
  672. __GMP_DECLSPEC mp_limb_t mpn_addlsh1_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  673. /* mpn_addlsh2_n(c,a,b,n), when it exists, sets {c,n} to {a,n}+4*{b,n}, and
  674.    returns the carry out (0, ..., 4).  */
  675. #define mpn_addlsh2_n __MPN(addlsh2_n)
  676. __GMP_DECLSPEC mp_limb_t mpn_addlsh2_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  677. /* mpn_addlsh_n(c,a,b,n,k), when it exists, sets {c,n} to {a,n}+2^k*{b,n}, and
  678.    returns the carry out (0, ..., 2^k).  */
  679. #define mpn_addlsh_n __MPN(addlsh_n)
  680.   __GMP_DECLSPEC mp_limb_t mpn_addlsh_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int));
  681. /* mpn_sublsh1_n(c,a,b,n), when it exists, sets {c,n} to {a,n}-2*{b,n}, and
  682.    returns the borrow out (0, 1 or 2).  */
  683. #define mpn_sublsh1_n __MPN(sublsh1_n)
  684. __GMP_DECLSPEC mp_limb_t mpn_sublsh1_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  685. /* mpn_rsblsh1_n(c,a,b,n), when it exists, sets {c,n} to 2*{b,n}-{a,n}, and
  686.    returns the carry out (-1, 0, 1).  */
  687. #define mpn_rsblsh1_n __MPN(rsblsh1_n)
  688. __GMP_DECLSPEC mp_limb_signed_t mpn_rsblsh1_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  689. /* mpn_sublsh2_n(c,a,b,n), when it exists, sets {c,n} to {a,n}-4*{b,n}, and
  690.    returns the borrow out (FIXME 0, 1, 2 or 3).  */
  691. #define mpn_sublsh2_n __MPN(sublsh2_n)
  692. __GMP_DECLSPEC mp_limb_t mpn_sublsh2_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  693. /* mpn_rsblsh2_n(c,a,b,n), when it exists, sets {c,n} to 4*{b,n}-{a,n}, and
  694.    returns the carry out (-1, ..., 3).  */
  695. #define mpn_rsblsh2_n __MPN(rsblsh2_n)
  696. __GMP_DECLSPEC mp_limb_signed_t mpn_rsblsh2_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  697. /* mpn_rsblsh_n(c,a,b,n,k), when it exists, sets {c,n} to 2^k*{b,n}-{a,n}, and
  698.    returns the carry out (-1, 0, ..., 2^k-1).  */
  699. #define mpn_rsblsh_n __MPN(rsblsh_n)
  700. __GMP_DECLSPEC mp_limb_signed_t mpn_rsblsh_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int));
  701. /* mpn_rsh1add_n(c,a,b,n), when it exists, sets {c,n} to ({a,n} + {b,n}) >> 1,
  702.    and returns the bit rshifted out (0 or 1).  */
  703. #define mpn_rsh1add_n __MPN(rsh1add_n)
  704. __GMP_DECLSPEC mp_limb_t mpn_rsh1add_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  705. #define mpn_rsh1add_nc __MPN(rsh1add_nc)
  706. __GMP_DECLSPEC mp_limb_t mpn_rsh1add_nc __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t));
  707. /* mpn_rsh1sub_n(c,a,b,n), when it exists, sets {c,n} to ({a,n} - {b,n}) >> 1,
  708.    and returns the bit rshifted out (0 or 1).  If there's a borrow from the
  709.    subtract, it's stored as a 1 in the high bit of c[n-1], like a twos
  710.    complement negative.  */
  711. #define mpn_rsh1sub_n __MPN(rsh1sub_n)
  712. __GMP_DECLSPEC mp_limb_t mpn_rsh1sub_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  713. #define mpn_rsh1sub_nc __MPN(rsh1sub_nc)
  714. __GMP_DECLSPEC mp_limb_t mpn_rsh1sub_nc __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t));
  715. #define mpn_lshiftc __MPN(lshiftc)
  716. __GMP_DECLSPEC mp_limb_t mpn_lshiftc __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
  717. #define mpn_add_n_sub_n __MPN(add_n_sub_n)
  718. __GMP_DECLSPEC mp_limb_t mpn_add_n_sub_n __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  719. #define mpn_add_n_sub_nc __MPN(add_n_sub_nc)
  720. __GMP_DECLSPEC mp_limb_t mpn_add_n_sub_nc __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t));
  721. #define mpn_addaddmul_1msb0 __MPN(addaddmul_1msb0)
  722. __GMP_DECLSPEC mp_limb_t mpn_addaddmul_1msb0 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
  723. #define mpn_divrem_1c __MPN(divrem_1c)
  724. __GMP_DECLSPEC mp_limb_t mpn_divrem_1c __GMP_PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
  725. #define mpn_dump __MPN(dump)
  726. __GMP_DECLSPEC void mpn_dump __GMP_PROTO ((mp_srcptr, mp_size_t));
  727. #define mpn_fib2_ui __MPN(fib2_ui)
  728. __GMP_DECLSPEC mp_size_t mpn_fib2_ui __GMP_PROTO ((mp_ptr, mp_ptr, unsigned long));
  729. /* Remap names of internal mpn functions.  */
  730. #define __clz_tab               __MPN(clz_tab)
  731. #define mpn_udiv_w_sdiv __MPN(udiv_w_sdiv)
  732. #define mpn_jacobi_base __MPN(jacobi_base)
  733. __GMP_DECLSPEC int mpn_jacobi_base __GMP_PROTO ((mp_limb_t, mp_limb_t, int)) ATTRIBUTE_CONST;
  734. #define mpn_mod_1c __MPN(mod_1c)
  735. __GMP_DECLSPEC mp_limb_t mpn_mod_1c __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE;
  736. #define mpn_mul_1c __MPN(mul_1c)
  737. __GMP_DECLSPEC mp_limb_t mpn_mul_1c __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
  738. #define mpn_mul_2 __MPN(mul_2)
  739. __GMP_DECLSPEC mp_limb_t mpn_mul_2 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  740. #define mpn_mul_3 __MPN(mul_3)
  741. __GMP_DECLSPEC mp_limb_t mpn_mul_3 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  742. #define mpn_mul_4 __MPN(mul_4)
  743. __GMP_DECLSPEC mp_limb_t mpn_mul_4 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  744. #ifndef mpn_mul_basecase  /* if not done with cpuvec in a fat binary */
  745. #define mpn_mul_basecase __MPN(mul_basecase)
  746. __GMP_DECLSPEC void mpn_mul_basecase __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
  747. #endif
  748. #define mpn_mullo_n __MPN(mullo_n)
  749. __GMP_DECLSPEC void mpn_mullo_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  750. #define mpn_mullo_basecase __MPN(mullo_basecase)
  751. __GMP_DECLSPEC void mpn_mullo_basecase __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
  752. #define mpn_sqr __MPN(sqr)
  753. __GMP_DECLSPEC void mpn_sqr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t));
  754. #ifndef mpn_sqr_basecase  /* if not done with cpuvec in a fat binary */
  755. #define mpn_sqr_basecase __MPN(sqr_basecase)
  756. __GMP_DECLSPEC void mpn_sqr_basecase __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t));
  757. #endif
  758. #define mpn_submul_1c __MPN(submul_1c)
  759. __GMP_DECLSPEC mp_limb_t mpn_submul_1c __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
  760. #define mpn_redc_1 __MPN(redc_1)
  761. __GMP_DECLSPEC void mpn_redc_1 __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
  762. #define mpn_redc_2 __MPN(redc_2)
  763. __GMP_DECLSPEC void mpn_redc_2 __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  764. #define mpn_redc_n __MPN(redc_n)
  765. __GMP_DECLSPEC void mpn_redc_n __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_srcptr));
  766. #define mpn_mod_1_1p_cps __MPN(mod_1_1p_cps)
  767. __GMP_DECLSPEC void mpn_mod_1_1p_cps __GMP_PROTO ((mp_limb_t [4], mp_limb_t));
  768. #define mpn_mod_1_1p __MPN(mod_1_1p)
  769. __GMP_DECLSPEC mp_limb_t mpn_mod_1_1p __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t [4])) __GMP_ATTRIBUTE_PURE;
  770. #define mpn_mod_1s_2p_cps __MPN(mod_1s_2p_cps)
  771. __GMP_DECLSPEC void mpn_mod_1s_2p_cps __GMP_PROTO ((mp_limb_t [5], mp_limb_t));
  772. #define mpn_mod_1s_2p __MPN(mod_1s_2p)
  773. __GMP_DECLSPEC mp_limb_t mpn_mod_1s_2p __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t [5])) __GMP_ATTRIBUTE_PURE;
  774. #define mpn_mod_1s_3p_cps __MPN(mod_1s_3p_cps)
  775. __GMP_DECLSPEC void mpn_mod_1s_3p_cps __GMP_PROTO ((mp_limb_t [6], mp_limb_t));
  776. #define mpn_mod_1s_3p __MPN(mod_1s_3p)
  777. __GMP_DECLSPEC mp_limb_t mpn_mod_1s_3p __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t [6])) __GMP_ATTRIBUTE_PURE;
  778. #define mpn_mod_1s_4p_cps __MPN(mod_1s_4p_cps)
  779. __GMP_DECLSPEC void mpn_mod_1s_4p_cps __GMP_PROTO ((mp_limb_t [7], mp_limb_t));
  780. #define mpn_mod_1s_4p __MPN(mod_1s_4p)
  781. __GMP_DECLSPEC mp_limb_t mpn_mod_1s_4p __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t [7])) __GMP_ATTRIBUTE_PURE;
  782. #define mpn_bc_mulmod_bnm1 __MPN(bc_mulmod_bnm1)
  783. __GMP_DECLSPEC void mpn_bc_mulmod_bnm1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_ptr));
  784. #define mpn_mulmod_bnm1 __MPN(mulmod_bnm1)
  785. __GMP_DECLSPEC void mpn_mulmod_bnm1 __GMP_PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  786. #define mpn_mulmod_bnm1_next_size __MPN(mulmod_bnm1_next_size)
  787. __GMP_DECLSPEC mp_size_t mpn_mulmod_bnm1_next_size __GMP_PROTO ((mp_size_t)) ATTRIBUTE_CONST;
  788. static inline mp_size_t
  789. mpn_mulmod_bnm1_itch (mp_size_t rn, mp_size_t an, mp_size_t bn) {
  790.   mp_size_t n, itch;
  791.   n = rn >> 1;
  792.   itch = rn + 4 +
  793.     (an > n ? (bn > n ? rn : n) : 0);
  794.   return itch;
  795. }
  796. #define mpn_sqrmod_bnm1 __MPN(sqrmod_bnm1)
  797. __GMP_DECLSPEC void mpn_sqrmod_bnm1 __GMP_PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  798. #define mpn_sqrmod_bnm1_next_size __MPN(sqrmod_bnm1_next_size)
  799. __GMP_DECLSPEC mp_size_t mpn_sqrmod_bnm1_next_size __GMP_PROTO ((mp_size_t)) ATTRIBUTE_CONST;
  800. static inline mp_size_t
  801. mpn_sqrmod_bnm1_itch (mp_size_t rn, mp_size_t an) {
  802.   mp_size_t n, itch;
  803.   n = rn >> 1;
  804.   itch = rn + 3 +
  805.     (an > n ? an : 0);
  806.   return itch;
  807. }
  808. typedef __gmp_randstate_struct *gmp_randstate_ptr;
  809. typedef const __gmp_randstate_struct *gmp_randstate_srcptr;
  810. /* Pseudo-random number generator function pointers structure.  */
  811. typedef struct {
  812.   void (*randseed_fn) __GMP_PROTO ((gmp_randstate_t, mpz_srcptr));
  813.   void (*randget_fn) __GMP_PROTO ((gmp_randstate_t, mp_ptr, unsigned long int));
  814.   void (*randclear_fn) __GMP_PROTO ((gmp_randstate_t));
  815.   void (*randiset_fn) __GMP_PROTO ((gmp_randstate_ptr, gmp_randstate_srcptr));
  816. } gmp_randfnptr_t;
  817. /* Macro to obtain a void pointer to the function pointers structure.  */
  818. #define RNG_FNPTR(rstate) ((rstate)->_mp_algdata._mp_lc)
  819. /* Macro to obtain a pointer to the generator's state.
  820.    When used as a lvalue the rvalue needs to be cast to mp_ptr.  */
  821. #define RNG_STATE(rstate) ((rstate)->_mp_seed->_mp_d)
  822. /* Write a given number of random bits to rp.  */
  823. #define _gmp_rand(rp, state, bits)                              
  824.   do {                                                          
  825.     gmp_randstate_ptr  __rstate = (state);                      
  826.     (*((gmp_randfnptr_t *) RNG_FNPTR (__rstate))->randget_fn)   
  827.        (__rstate, rp, bits);                                    
  828.   } while (0)
  829. __GMP_DECLSPEC void __gmp_randinit_mt_noseed __GMP_PROTO ((gmp_randstate_t));
  830. /* __gmp_rands is the global state for the old-style random functions, and
  831.    is also used in the test programs (hence the __GMP_DECLSPEC).
  832.    There's no seeding here, so mpz_random etc will generate the same
  833.    sequence every time.  This is not unlike the C library random functions
  834.    if you don't seed them, so perhaps it's acceptable.  Digging up a seed
  835.    from /dev/random or the like would work on many systems, but might
  836.    encourage a false confidence, since it'd be pretty much impossible to do
  837.    something that would work reliably everywhere.  In any case the new style
  838.    functions are recommended to applications which care about randomness, so
  839.    the old functions aren't too important.  */
  840. __GMP_DECLSPEC extern char             __gmp_rands_initialized;
  841. __GMP_DECLSPEC extern gmp_randstate_t  __gmp_rands;
  842. #define RANDS                                       
  843.   ((__gmp_rands_initialized ? 0                     
  844.     : (__gmp_rands_initialized = 1,                 
  845.        __gmp_randinit_mt_noseed (__gmp_rands), 0)), 
  846.    __gmp_rands)
  847. /* this is used by the test programs, to free memory */
  848. #define RANDS_CLEAR()                   
  849.   do {                                  
  850.     if (__gmp_rands_initialized)        
  851.       {                                 
  852.         __gmp_rands_initialized = 0;    
  853.         gmp_randclear (__gmp_rands);    
  854.       }                                 
  855.   } while (0)
  856. /* For a threshold between algorithms A and B, size>=thresh is where B
  857.    should be used.  Special value MP_SIZE_T_MAX means only ever use A, or
  858.    value 0 means only ever use B.  The tests for these special values will
  859.    be compile-time constants, so the compiler should be able to eliminate
  860.    the code for the unwanted algorithm.  */
  861. #define ABOVE_THRESHOLD(size,thresh)    
  862.   ((thresh) == 0                        
  863.    || ((thresh) != MP_SIZE_T_MAX        
  864.        && (size) >= (thresh)))
  865. #define BELOW_THRESHOLD(size,thresh)  (! ABOVE_THRESHOLD (size, thresh))
  866. #define MPN_TOOM22_MUL_MINSIZE    4
  867. #define MPN_TOOM2_SQR_MINSIZE     4
  868. #define MPN_TOOM33_MUL_MINSIZE   17
  869. #define MPN_TOOM3_SQR_MINSIZE    17
  870. #define MPN_TOOM44_MUL_MINSIZE   30
  871. #define MPN_TOOM4_SQR_MINSIZE    30
  872. #define MPN_TOOM6H_MUL_MINSIZE   46
  873. #define MPN_TOOM6_SQR_MINSIZE    46
  874. #define MPN_TOOM8H_MUL_MINSIZE   86
  875. #define MPN_TOOM8_SQR_MINSIZE    86
  876. #define MPN_TOOM32_MUL_MINSIZE   10
  877. #define MPN_TOOM42_MUL_MINSIZE   10
  878. #define MPN_TOOM43_MUL_MINSIZE   49 /* ??? */
  879. #define MPN_TOOM53_MUL_MINSIZE   49 /* ??? */
  880. #define MPN_TOOM63_MUL_MINSIZE   49
  881. #define   mpn_sqr_diagonal __MPN(sqr_diagonal)
  882. __GMP_DECLSPEC void      mpn_sqr_diagonal __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t));
  883. #define   mpn_toom_interpolate_5pts __MPN(toom_interpolate_5pts)
  884. __GMP_DECLSPEC void      mpn_toom_interpolate_5pts __GMP_PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_size_t, int, mp_limb_t));
  885. enum toom6_flags {toom6_all_pos = 0, toom6_vm1_neg = 1, toom6_vm2_neg = 2};
  886. #define   mpn_toom_interpolate_6pts __MPN(toom_interpolate_6pts)
  887. __GMP_DECLSPEC void      mpn_toom_interpolate_6pts __GMP_PROTO ((mp_ptr, mp_size_t, enum toom6_flags, mp_ptr, mp_ptr, mp_ptr, mp_size_t));
  888. enum toom7_flags { toom7_w1_neg = 1, toom7_w3_neg = 2 };
  889. #define   mpn_toom_interpolate_7pts __MPN(toom_interpolate_7pts)
  890. __GMP_DECLSPEC void      mpn_toom_interpolate_7pts __GMP_PROTO ((mp_ptr, mp_size_t, enum toom7_flags, mp_ptr, mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_ptr));
  891. #define mpn_toom_interpolate_8pts __MPN(toom_interpolate_8pts)
  892. __GMP_DECLSPEC void      mpn_toom_interpolate_8pts __GMP_PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_ptr, mp_size_t, mp_ptr));
  893. #define mpn_toom_interpolate_12pts __MPN(toom_interpolate_12pts)
  894. __GMP_DECLSPEC void      mpn_toom_interpolate_12pts __GMP_PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_size_t, int, mp_ptr));
  895. #define mpn_toom_interpolate_16pts __MPN(toom_interpolate_16pts)
  896. __GMP_DECLSPEC void      mpn_toom_interpolate_16pts __GMP_PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_size_t, int, mp_ptr));
  897. #define   mpn_toom_couple_handling __MPN(toom_couple_handling)
  898. __GMP_DECLSPEC void mpn_toom_couple_handling __GMP_PROTO ((mp_ptr, mp_size_t, mp_ptr, int, mp_size_t, int, int));
  899. #define   mpn_toom_eval_dgr3_pm1 __MPN(toom_eval_dgr3_pm1)
  900. __GMP_DECLSPEC int mpn_toom_eval_dgr3_pm1 __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_size_t, mp_ptr));
  901. #define   mpn_toom_eval_dgr3_pm2 __MPN(toom_eval_dgr3_pm2)
  902. __GMP_DECLSPEC int mpn_toom_eval_dgr3_pm2 __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_size_t, mp_ptr));
  903. #define   mpn_toom_eval_pm1 __MPN(toom_eval_pm1)
  904. __GMP_DECLSPEC int mpn_toom_eval_pm1 __GMP_PROTO ((mp_ptr, mp_ptr, unsigned, mp_srcptr, mp_size_t, mp_size_t, mp_ptr));
  905. #define   mpn_toom_eval_pm2 __MPN(toom_eval_pm2)
  906. __GMP_DECLSPEC int mpn_toom_eval_pm2 __GMP_PROTO ((mp_ptr, mp_ptr, unsigned, mp_srcptr, mp_size_t, mp_size_t, mp_ptr));
  907. #define   mpn_toom_eval_pm2exp __MPN(toom_eval_pm2exp)
  908. __GMP_DECLSPEC int mpn_toom_eval_pm2exp __GMP_PROTO ((mp_ptr, mp_ptr, unsigned, mp_srcptr, mp_size_t, mp_size_t, unsigned, mp_ptr));
  909. #define   mpn_toom_eval_pm2rexp __MPN(toom_eval_pm2rexp)
  910. __GMP_DECLSPEC int mpn_toom_eval_pm2rexp __GMP_PROTO ((mp_ptr, mp_ptr, unsigned, mp_srcptr, mp_size_t, mp_size_t, unsigned, mp_ptr));
  911. #define   mpn_toom22_mul __MPN(toom22_mul)
  912. __GMP_DECLSPEC void      mpn_toom22_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  913. #define   mpn_toom32_mul __MPN(toom32_mul)
  914. __GMP_DECLSPEC void      mpn_toom32_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  915. #define   mpn_toom42_mul __MPN(toom42_mul)
  916. __GMP_DECLSPEC void      mpn_toom42_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  917. #define   mpn_toom52_mul __MPN(toom52_mul)
  918. __GMP_DECLSPEC void      mpn_toom52_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  919. #define   mpn_toom62_mul __MPN(toom62_mul)
  920. __GMP_DECLSPEC void      mpn_toom62_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  921. #define   mpn_toom2_sqr __MPN(toom2_sqr)
  922. __GMP_DECLSPEC void      mpn_toom2_sqr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
  923. #define   mpn_toom33_mul __MPN(toom33_mul)
  924. __GMP_DECLSPEC void      mpn_toom33_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  925. #define   mpn_toom43_mul __MPN(toom43_mul)
  926. __GMP_DECLSPEC void      mpn_toom43_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  927. #define   mpn_toom53_mul __MPN(toom53_mul)
  928. __GMP_DECLSPEC void      mpn_toom53_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  929. #define   mpn_toom63_mul __MPN(toom63_mul)
  930. __GMP_DECLSPEC void      mpn_toom63_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  931. #define   mpn_toom3_sqr __MPN(toom3_sqr)
  932. __GMP_DECLSPEC void      mpn_toom3_sqr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
  933. #define   mpn_toom44_mul __MPN(toom44_mul)
  934. __GMP_DECLSPEC void      mpn_toom44_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  935. #define   mpn_toom4_sqr __MPN(toom4_sqr)
  936. __GMP_DECLSPEC void      mpn_toom4_sqr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
  937. #define   mpn_toom6h_mul __MPN(toom6h_mul)
  938. __GMP_DECLSPEC void      mpn_toom6h_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  939. #define   mpn_toom6_sqr __MPN(toom6_sqr)
  940. __GMP_DECLSPEC void      mpn_toom6_sqr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
  941. #define   mpn_toom8h_mul __MPN(toom8h_mul)
  942. __GMP_DECLSPEC void      mpn_toom8h_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  943. #define   mpn_toom8_sqr __MPN(toom8_sqr)
  944. __GMP_DECLSPEC void      mpn_toom8_sqr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
  945. #define   mpn_fft_best_k __MPN(fft_best_k)
  946. __GMP_DECLSPEC int       mpn_fft_best_k __GMP_PROTO ((mp_size_t, int)) ATTRIBUTE_CONST;
  947. #define   mpn_mul_fft __MPN(mul_fft)
  948. __GMP_DECLSPEC mp_limb_t mpn_mul_fft __GMP_PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, int));
  949. #define   mpn_mul_fft_full __MPN(mul_fft_full)
  950. __GMP_DECLSPEC void      mpn_mul_fft_full __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
  951. #define   mpn_nussbaumer_mul __MPN(nussbaumer_mul)
  952. __GMP_DECLSPEC void      mpn_nussbaumer_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
  953. #define   mpn_fft_next_size __MPN(fft_next_size)
  954. __GMP_DECLSPEC mp_size_t mpn_fft_next_size __GMP_PROTO ((mp_size_t, int)) ATTRIBUTE_CONST;
  955. #define   mpn_sbpi1_div_qr __MPN(sbpi1_div_qr)
  956. __GMP_DECLSPEC mp_limb_t mpn_sbpi1_div_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
  957. #define   mpn_sbpi1_div_q __MPN(sbpi1_div_q)
  958. __GMP_DECLSPEC mp_limb_t mpn_sbpi1_div_q __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
  959. #define   mpn_sbpi1_divappr_q __MPN(sbpi1_divappr_q)
  960. __GMP_DECLSPEC mp_limb_t mpn_sbpi1_divappr_q __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
  961. #define   mpn_dcpi1_div_qr __MPN(dcpi1_div_qr)
  962. __GMP_DECLSPEC mp_limb_t mpn_dcpi1_div_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, gmp_pi1_t *));
  963. #define   mpn_dcpi1_div_qr_n __MPN(dcpi1_div_qr_n)
  964. __GMP_DECLSPEC mp_limb_t mpn_dcpi1_div_qr_n __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, gmp_pi1_t *, mp_ptr));
  965. #define   mpn_dcpi1_div_q __MPN(dcpi1_div_q)
  966. __GMP_DECLSPEC mp_limb_t mpn_dcpi1_div_q __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, gmp_pi1_t *));
  967. #define   mpn_dcpi1_divappr_q __MPN(dcpi1_divappr_q)
  968. __GMP_DECLSPEC mp_limb_t mpn_dcpi1_divappr_q __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, gmp_pi1_t *));
  969. #define   mpn_dcpi1_divappr_q_n __MPN(dcpi1_divappr_q_n)
  970. __GMP_DECLSPEC mp_limb_t mpn_dcpi1_divappr_q_n __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, gmp_pi1_t *, mp_ptr));
  971. #define   mpn_mu_div_qr __MPN(mu_div_qr)
  972. __GMP_DECLSPEC mp_limb_t mpn_mu_div_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  973. #define   mpn_mu_div_qr_itch __MPN(mu_div_qr_itch)
  974. __GMP_DECLSPEC mp_size_t mpn_mu_div_qr_itch __GMP_PROTO ((mp_size_t, mp_size_t, int));
  975. #define   mpn_mu_div_qr_choose_in __MPN(mu_div_qr_choose_in)
  976. __GMP_DECLSPEC mp_size_t mpn_mu_div_qr_choose_in __GMP_PROTO ((mp_size_t, mp_size_t, int));
  977. #define   mpn_preinv_mu_div_qr __MPN(preinv_mu_div_qr)
  978. __GMP_DECLSPEC mp_limb_t mpn_preinv_mu_div_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  979. #define   mpn_mu_divappr_q __MPN(mu_divappr_q)
  980. __GMP_DECLSPEC mp_limb_t mpn_mu_divappr_q __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  981. #define   mpn_mu_divappr_q_itch __MPN(mu_divappr_q_itch)
  982. __GMP_DECLSPEC mp_size_t mpn_mu_divappr_q_itch __GMP_PROTO ((mp_size_t, mp_size_t, int));
  983. #define   mpn_mu_divappr_q_choose_in __MPN(mu_divappr_q_choose_in)
  984. __GMP_DECLSPEC mp_size_t mpn_mu_divappr_q_choose_in __GMP_PROTO ((mp_size_t, mp_size_t, int));
  985. #define   mpn_preinv_mu_divappr_q __MPN(preinv_mu_divappr_q)
  986. __GMP_DECLSPEC mp_limb_t mpn_preinv_mu_divappr_q __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  987. #define   mpn_mu_div_q __MPN(mu_div_q)
  988. __GMP_DECLSPEC mp_limb_t mpn_mu_div_q __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  989. #define   mpn_mu_div_q_itch __MPN(mu_div_q_itch)
  990. __GMP_DECLSPEC mp_size_t mpn_mu_div_q_itch __GMP_PROTO ((mp_size_t, mp_size_t, int));
  991. #define  mpn_div_q __MPN(div_q)
  992. __GMP_DECLSPEC void mpn_div_q __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  993. #define   mpn_invert __MPN(invert)
  994. __GMP_DECLSPEC void      mpn_invert __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
  995. #define mpn_invert_itch(n)  mpn_invertappr_itch(n)
  996. #define   mpn_ni_invertappr __MPN(ni_invertappr)
  997. __GMP_DECLSPEC mp_limb_t mpn_ni_invertappr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
  998. #define   mpn_invertappr __MPN(invertappr)
  999. __GMP_DECLSPEC mp_limb_t mpn_invertappr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
  1000. #define mpn_invertappr_itch(n)  (3 * (n) + 2)
  1001. #define   mpn_binvert __MPN(binvert)
  1002. __GMP_DECLSPEC void      mpn_binvert __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
  1003. #define   mpn_binvert_itch __MPN(binvert_itch)
  1004. __GMP_DECLSPEC mp_size_t mpn_binvert_itch __GMP_PROTO ((mp_size_t));
  1005. #define mpn_bdiv_q_1 __MPN(bdiv_q_1)
  1006. __GMP_DECLSPEC mp_limb_t mpn_bdiv_q_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
  1007. #define mpn_pi1_bdiv_q_1 __MPN(pi1_bdiv_q_1)
  1008. __GMP_DECLSPEC mp_limb_t mpn_pi1_bdiv_q_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t, int));
  1009. #define   mpn_sbpi1_bdiv_qr __MPN(sbpi1_bdiv_qr)
  1010. __GMP_DECLSPEC mp_limb_t mpn_sbpi1_bdiv_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
  1011. #define   mpn_sbpi1_bdiv_q __MPN(sbpi1_bdiv_q)
  1012. __GMP_DECLSPEC void      mpn_sbpi1_bdiv_q __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
  1013. #define   mpn_dcpi1_bdiv_qr __MPN(dcpi1_bdiv_qr)
  1014. __GMP_DECLSPEC mp_limb_t mpn_dcpi1_bdiv_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
  1015. #define   mpn_dcpi1_bdiv_qr_n_itch __MPN(dcpi1_bdiv_qr_n_itch)
  1016. __GMP_DECLSPEC mp_size_t mpn_dcpi1_bdiv_qr_n_itch __GMP_PROTO ((mp_size_t));
  1017. #define   mpn_dcpi1_bdiv_qr_n __MPN(dcpi1_bdiv_qr_n)
  1018. __GMP_DECLSPEC mp_limb_t mpn_dcpi1_bdiv_qr_n __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr));
  1019. #define   mpn_dcpi1_bdiv_q __MPN(dcpi1_bdiv_q)
  1020. __GMP_DECLSPEC void      mpn_dcpi1_bdiv_q __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
  1021. #define   mpn_dcpi1_bdiv_q_n_itch __MPN(dcpi1_bdiv_q_n_itch)
  1022. __GMP_DECLSPEC mp_size_t mpn_dcpi1_bdiv_q_n_itch __GMP_PROTO ((mp_size_t));
  1023. #define   mpn_dcpi1_bdiv_q_n __MPN(dcpi1_bdiv_q_n)
  1024. __GMP_DECLSPEC void      mpn_dcpi1_bdiv_q_n __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr));
  1025. #define   mpn_mu_bdiv_qr __MPN(mu_bdiv_qr)
  1026. __GMP_DECLSPEC mp_limb_t mpn_mu_bdiv_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  1027. #define   mpn_mu_bdiv_qr_itch __MPN(mu_bdiv_qr_itch)
  1028. __GMP_DECLSPEC mp_size_t mpn_mu_bdiv_qr_itch __GMP_PROTO ((mp_size_t, mp_size_t));
  1029. #define   mpn_mu_bdiv_q __MPN(mu_bdiv_q)
  1030. __GMP_DECLSPEC void      mpn_mu_bdiv_q __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  1031. #define   mpn_mu_bdiv_q_itch __MPN(mu_bdiv_q_itch)
  1032. __GMP_DECLSPEC mp_size_t mpn_mu_bdiv_q_itch __GMP_PROTO ((mp_size_t, mp_size_t));
  1033. #define   mpn_bdiv_qr __MPN(bdiv_qr)
  1034. __GMP_DECLSPEC mp_limb_t mpn_bdiv_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  1035. #define   mpn_bdiv_qr_itch __MPN(bdiv_qr_itch)
  1036. __GMP_DECLSPEC mp_size_t mpn_bdiv_qr_itch __GMP_PROTO ((mp_size_t, mp_size_t));
  1037. #define   mpn_bdiv_q __MPN(bdiv_q)
  1038. __GMP_DECLSPEC void      mpn_bdiv_q __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  1039. #define   mpn_bdiv_q_itch __MPN(bdiv_q_itch)
  1040. __GMP_DECLSPEC mp_size_t mpn_bdiv_q_itch __GMP_PROTO ((mp_size_t, mp_size_t));
  1041. #define   mpn_divexact __MPN(divexact)
  1042. __GMP_DECLSPEC void      mpn_divexact __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
  1043. #define   mpn_divexact_itch __MPN(divexact_itch)
  1044. __GMP_DECLSPEC mp_size_t mpn_divexact_itch __GMP_PROTO ((mp_size_t, mp_size_t));
  1045. #define   mpn_bdiv_dbm1c __MPN(bdiv_dbm1c)
  1046. __GMP_DECLSPEC mp_limb_t mpn_bdiv_dbm1c __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t));
  1047. #define   mpn_bdiv_dbm1(dst, src, size, divisor) 
  1048.   mpn_bdiv_dbm1c (dst, src, size, divisor, __GMP_CAST (mp_limb_t, 0))
  1049. #define   mpn_powm __MPN(powm)
  1050. __GMP_DECLSPEC void      mpn_powm __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  1051. #define   mpn_powlo __MPN(powlo)
  1052. __GMP_DECLSPEC void      mpn_powlo __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_size_t, mp_ptr));
  1053. #define   mpn_powm_sec __MPN(powm_sec)
  1054. __GMP_DECLSPEC void      mpn_powm_sec __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
  1055. #define   mpn_powm_sec_itch __MPN(powm_sec_itch)
  1056. __GMP_DECLSPEC mp_size_t mpn_powm_sec_itch __GMP_PROTO ((mp_size_t, mp_size_t, mp_size_t));
  1057. #define   mpn_subcnd_n __MPN(subcnd_n)
  1058. __GMP_DECLSPEC mp_limb_t mpn_subcnd_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t));
  1059. #define   mpn_tabselect __MPN(tabselect)
  1060. __GMP_DECLSPEC void      mpn_tabselect __GMP_PROTO ((volatile mp_limb_t *, volatile mp_limb_t *, mp_size_t, mp_size_t, mp_size_t));
  1061. #define mpn_redc_1_sec __MPN(redc_1_sec)
  1062. __GMP_DECLSPEC void mpn_redc_1_sec __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
  1063. #ifndef DIVEXACT_BY3_METHOD
  1064. #if GMP_NUMB_BITS % 2 == 0 && ! defined (HAVE_NATIVE_mpn_divexact_by3c)
  1065. #define DIVEXACT_BY3_METHOD 0 /* default to using mpn_bdiv_dbm1c */
  1066. #else
  1067. #define DIVEXACT_BY3_METHOD 1
  1068. #endif
  1069. #endif
  1070. #if DIVEXACT_BY3_METHOD == 0
  1071. #undef mpn_divexact_by3
  1072. #define mpn_divexact_by3(dst,src,size) 
  1073.   (3 & mpn_bdiv_dbm1 (dst, src, size, __GMP_CAST (mp_limb_t, GMP_NUMB_MASK / 3)))
  1074. /* override mpn_divexact_by3c defined in gmp.h */
  1075. /*
  1076. #undef mpn_divexact_by3c
  1077. #define mpn_divexact_by3c(dst,src,size,cy) 
  1078.   (3 & mpn_bdiv_dbm1c (dst, src, size, __GMP_CAST (mp_limb_t, GMP_NUMB_MASK / 3, GMP_NUMB_MASK / 3 * cy)))
  1079. */
  1080. #endif
  1081. #if GMP_NUMB_BITS % 4 == 0
  1082. #define mpn_divexact_by5(dst,src,size) 
  1083.   (7 & 3 * mpn_bdiv_dbm1 (dst, src, size, __GMP_CAST (mp_limb_t, GMP_NUMB_MASK / 5)))
  1084. #endif
  1085. #if GMP_NUMB_BITS % 6 == 0
  1086. #define mpn_divexact_by7(dst,src,size) 
  1087.   (7 & 1 * mpn_bdiv_dbm1 (dst, src, size, __GMP_CAST (mp_limb_t, GMP_NUMB_MASK / 7)))
  1088. #endif
  1089. #if GMP_NUMB_BITS % 6 == 0
  1090. #define mpn_divexact_by9(dst,src,size) 
  1091.   (15 & 7 * mpn_bdiv_dbm1 (dst, src, size, __GMP_CAST (mp_limb_t, GMP_NUMB_MASK / 9)))
  1092. #endif
  1093. #if GMP_NUMB_BITS % 10 == 0
  1094. #define mpn_divexact_by11(dst,src,size) 
  1095.   (15 & 5 * mpn_bdiv_dbm1 (dst, src, size, __GMP_CAST (mp_limb_t, GMP_NUMB_MASK / 11)))
  1096. #endif
  1097. #if GMP_NUMB_BITS % 12 == 0
  1098. #define mpn_divexact_by13(dst,src,size) 
  1099.   (15 & 3 * mpn_bdiv_dbm1 (dst, src, size, __GMP_CAST (mp_limb_t, GMP_NUMB_MASK / 13)))
  1100. #endif
  1101. #if GMP_NUMB_BITS % 4 == 0
  1102. #define mpn_divexact_by15(dst,src,size) 
  1103.   (15 & 1 * mpn_bdiv_dbm1 (dst, src, size, __GMP_CAST (mp_limb_t, GMP_NUMB_MASK / 15)))
  1104. #endif
  1105. #define mpz_divexact_gcd  __gmpz_divexact_gcd
  1106. __GMP_DECLSPEC void    mpz_divexact_gcd __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
  1107. #define mpz_inp_str_nowhite __gmpz_inp_str_nowhite
  1108. #ifdef _GMP_H_HAVE_FILE
  1109. __GMP_DECLSPEC size_t  mpz_inp_str_nowhite __GMP_PROTO ((mpz_ptr, FILE *, int, int, size_t));
  1110. #endif
  1111. #define mpn_divisible_p __MPN(divisible_p)
  1112. __GMP_DECLSPEC int     mpn_divisible_p __GMP_PROTO ((mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)) __GMP_ATTRIBUTE_PURE;
  1113. #define   mpn_rootrem __MPN(rootrem)
  1114. __GMP_DECLSPEC mp_size_t mpn_rootrem __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
  1115. #if defined (_CRAY)
  1116. #define MPN_COPY_INCR(dst, src, n)
  1117.   do {
  1118.     int __i; /* Faster on some Crays with plain int */
  1119.     _Pragma ("_CRI ivdep");
  1120.     for (__i = 0; __i < (n); __i++)
  1121.       (dst)[__i] = (src)[__i];
  1122.   } while (0)
  1123. #endif
  1124. /* used by test programs, hence __GMP_DECLSPEC */
  1125. #ifndef mpn_copyi  /* if not done with cpuvec in a fat binary */
  1126. #define mpn_copyi __MPN(copyi)
  1127. __GMP_DECLSPEC void mpn_copyi __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t));
  1128. #endif
  1129. #if ! defined (MPN_COPY_INCR) && HAVE_NATIVE_mpn_copyi
  1130. #define MPN_COPY_INCR(dst, src, size)                   
  1131.   do {                                                  
  1132.     ASSERT ((size) >= 0);                               
  1133.     ASSERT (MPN_SAME_OR_INCR_P (dst, src, size));       
  1134.     mpn_copyi (dst, src, size);                         
  1135.   } while (0)
  1136. #endif
  1137. /* Copy N limbs from SRC to DST incrementing, N==0 allowed.  */
  1138. #if ! defined (MPN_COPY_INCR)
  1139. #define MPN_COPY_INCR(dst, src, n)                      
  1140.   do {                                                  
  1141.     ASSERT ((n) >= 0);                                  
  1142.     ASSERT (MPN_SAME_OR_INCR_P (dst, src, n));          
  1143.     if ((n) != 0)                                       
  1144.       {                                                 
  1145. mp_size_t __n = (n) - 1;                        
  1146. mp_ptr __dst = (dst);                           
  1147. mp_srcptr __src = (src);                        
  1148. mp_limb_t __x;                                  
  1149. __x = *__src++;                                 
  1150. if (__n != 0)                                   
  1151.   {                                             
  1152.     do                                          
  1153.       {                                         
  1154. *__dst++ = __x;                         
  1155. __x = *__src++;                         
  1156.       }                                         
  1157.     while (--__n);                              
  1158.   }                                             
  1159. *__dst++ = __x;                                 
  1160.       }                                                 
  1161.   } while (0)
  1162. #endif
  1163. #if defined (_CRAY)
  1164. #define MPN_COPY_DECR(dst, src, n)
  1165.   do {
  1166.     int __i; /* Faster on some Crays with plain int */
  1167.     _Pragma ("_CRI ivdep");
  1168.     for (__i = (n) - 1; __i >= 0; __i--)
  1169.       (dst)[__i] = (src)[__i];
  1170.   } while (0)
  1171. #endif
  1172. /* used by test programs, hence __GMP_DECLSPEC */
  1173. #ifndef mpn_copyd  /* if not done with cpuvec in a fat binary */
  1174. #define mpn_copyd __MPN(copyd)
  1175. __GMP_DECLSPEC void mpn_copyd __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t));
  1176. #endif
  1177. #if ! defined (MPN_COPY_DECR) && HAVE_NATIVE_mpn_copyd
  1178. #define MPN_COPY_DECR(dst, src, size)                   
  1179.   do {                                                  
  1180.     ASSERT ((size) >= 0);                               
  1181.     ASSERT (MPN_SAME_OR_DECR_P (dst, src, size));       
  1182.     mpn_copyd (dst, src, size);                         
  1183.   } while (0)
  1184. #endif
  1185. /* Copy N limbs from SRC to DST decrementing, N==0 allowed.  */
  1186. #if ! defined (MPN_COPY_DECR)
  1187. #define MPN_COPY_DECR(dst, src, n)                      
  1188.   do {                                                  
  1189.     ASSERT ((n) >= 0);                                  
  1190.     ASSERT (MPN_SAME_OR_DECR_P (dst, src, n));          
  1191.     if ((n) != 0)                                       
  1192.       {                                                 
  1193. mp_size_t __n = (n) - 1;                        
  1194. mp_ptr __dst = (dst) + __n;                     
  1195. mp_srcptr __src = (src) + __n;                  
  1196. mp_limb_t __x;                                  
  1197. __x = *__src--;                                 
  1198. if (__n != 0)                                   
  1199.   {                                             
  1200.     do                                          
  1201.       {                                         
  1202. *__dst-- = __x;                         
  1203. __x = *__src--;                         
  1204.       }                                         
  1205.     while (--__n);                              
  1206.   }                                             
  1207. *__dst-- = __x;                                 
  1208.       }                                                 
  1209.   } while (0)
  1210. #endif
  1211. #ifndef MPN_COPY
  1212. #define MPN_COPY(d,s,n)                         
  1213.   do {                                          
  1214.     ASSERT (MPN_SAME_OR_SEPARATE_P (d, s, n));  
  1215.     MPN_COPY_INCR (d, s, n);                    
  1216.   } while (0)
  1217. #endif
  1218. /* Set {dst,size} to the limbs of {src,size} in reverse order. */
  1219. #define MPN_REVERSE(dst, src, size)                     
  1220.   do {                                                  
  1221.     mp_ptr     __dst = (dst);                           
  1222.     mp_size_t  __size = (size);                         
  1223.     mp_srcptr  __src = (src) + __size - 1;              
  1224.     mp_size_t  __i;                                     
  1225.     ASSERT ((size) >= 0);                               
  1226.     ASSERT (! MPN_OVERLAP_P (dst, size, src, size));    
  1227.     CRAY_Pragma ("_CRI ivdep");                         
  1228.     for (__i = 0; __i < __size; __i++)                  
  1229.       {                                                 
  1230.         *__dst = *__src;                                
  1231.         __dst++;                                        
  1232.         __src--;                                        
  1233.       }                                                 
  1234.   } while (0)
  1235. /* Zero n limbs at dst.
  1236.    For power and powerpc we want an inline stu/bdnz loop for zeroing.  On
  1237.    ppc630 for instance this is optimal since it can sustain only 1 store per
  1238.    cycle.
  1239.    gcc 2.95.x (for powerpc64 -maix64, or powerpc32) doesn't recognise the
  1240.    "for" loop in the generic code below can become stu/bdnz.  The do/while
  1241.    here helps it get to that.  The same caveat about plain -mpowerpc64 mode
  1242.    applies here as to __GMPN_COPY_INCR in gmp.h.
  1243.    xlc 3.1 already generates stu/bdnz from the generic C, and does so from
  1244.    this loop too.
  1245.    Enhancement: GLIBC does some trickery with dcbz to zero whole cache lines
  1246.    at a time.  MPN_ZERO isn't all that important in GMP, so it might be more
  1247.    trouble than it's worth to do the same, though perhaps a call to memset
  1248.    would be good when on a GNU system.  */
  1249. #if HAVE_HOST_CPU_FAMILY_power || HAVE_HOST_CPU_FAMILY_powerpc
  1250. #define MPN_ZERO(dst, n)
  1251.   do {
  1252.     ASSERT ((n) >= 0);
  1253.     if ((n) != 0)
  1254.       {
  1255. mp_ptr __dst = (dst) - 1;
  1256. mp_size_t __n = (n);
  1257. do
  1258.   *++__dst = 0;
  1259. while (--__n);
  1260.       }
  1261.   } while (0)
  1262. #endif
  1263. #ifndef MPN_ZERO
  1264. #define MPN_ZERO(dst, n)
  1265.   do {
  1266.     ASSERT ((n) >= 0);
  1267.     if ((n) != 0)
  1268.       {
  1269. mp_ptr __dst = (dst);
  1270. mp_size_t __n = (n);
  1271. do
  1272.   *__dst++ = 0;
  1273. while (--__n);
  1274.       }
  1275.   } while (0)
  1276. #endif
  1277. /* On the x86s repe/scasl doesn't seem useful, since it takes many cycles to
  1278.    start up and would need to strip a lot of zeros before it'd be faster
  1279.    than a simple cmpl loop.  Here are some times in cycles for
  1280.    std/repe/scasl/cld and cld/repe/scasl (the latter would be for stripping
  1281.    low zeros).
  1282.                 std   cld
  1283.            P5    18    16
  1284.            P6    46    38
  1285.            K6    36    13
  1286.            K7    21    20
  1287. */
  1288. #ifndef MPN_NORMALIZE
  1289. #define MPN_NORMALIZE(DST, NLIMBS) 
  1290.   do {
  1291.     while ((NLIMBS) > 0)                                                
  1292.       {
  1293. if ((DST)[(NLIMBS) - 1] != 0)
  1294.   break;
  1295. (NLIMBS)--;
  1296.       }
  1297.   } while (0)
  1298. #endif
  1299. #ifndef MPN_NORMALIZE_NOT_ZERO
  1300. #define MPN_NORMALIZE_NOT_ZERO(DST, NLIMBS)     
  1301.   do {                                          
  1302.     ASSERT ((NLIMBS) >= 1);                     
  1303.     while (1)                                   
  1304.       {                                         
  1305. if ((DST)[(NLIMBS) - 1] != 0)           
  1306.   break;                                
  1307. (NLIMBS)--;                             
  1308.       }                                         
  1309.   } while (0)
  1310. #endif
  1311. /* Strip least significant zero limbs from {ptr,size} by incrementing ptr
  1312.    and decrementing size.  low should be ptr[0], and will be the new ptr[0]
  1313.    on returning.  The number in {ptr,size} must be non-zero, ie. size!=0 and
  1314.    somewhere a non-zero limb.  */
  1315. #define MPN_STRIP_LOW_ZEROS_NOT_ZERO(ptr, size, low)    
  1316.   do {                                                  
  1317.     ASSERT ((size) >= 1);                               
  1318.     ASSERT ((low) == (ptr)[0]);                         
  1319.                                                         
  1320.     while ((low) == 0)                                  
  1321.       {                                                 
  1322.         (size)--;                                       
  1323.         ASSERT ((size) >= 1);                           
  1324.         (ptr)++;                                        
  1325.         (low) = *(ptr);                                 
  1326.       }                                                 
  1327.   } while (0)
  1328. /* Initialize X of type mpz_t with space for NLIMBS limbs.  X should be a
  1329.    temporary variable; it will be automatically cleared out at function
  1330.    return.  We use __x here to make it possible to accept both mpz_ptr and
  1331.    mpz_t arguments.  */
  1332. #define MPZ_TMP_INIT(X, NLIMBS)                                         
  1333.   do {                                                                  
  1334.     mpz_ptr __x = (X);                                                  
  1335.     ASSERT ((NLIMBS) >= 1);                                             
  1336.     __x->_mp_alloc = (NLIMBS);                                          
  1337.     __x->_mp_d = TMP_ALLOC_LIMBS (NLIMBS);
  1338.   } while (0)
  1339. /* Realloc for an mpz_t WHAT if it has less than NEEDED limbs.  */
  1340. #define MPZ_REALLOC(z,n) (UNLIKELY ((n) > ALLOC(z))     
  1341.                           ? (mp_ptr) _mpz_realloc(z,n)  
  1342.                           : PTR(z))
  1343. #define MPZ_EQUAL_1_P(z)  (SIZ(z)==1 && PTR(z)[0] == 1)
  1344. /* MPN_FIB2_SIZE(n) is the size in limbs required by mpn_fib2_ui for fp and
  1345.    f1p.
  1346.    From Knuth vol 1 section 1.2.8, F[n] = phi^n/sqrt(5) rounded to the
  1347.    nearest integer, where phi=(1+sqrt(5))/2 is the golden ratio.  So the
  1348.    number of bits required is n*log_2((1+sqrt(5))/2) = n*0.6942419.
  1349.    The multiplier used is 23/32=0.71875 for efficient calculation on CPUs
  1350.    without good floating point.  There's +2 for rounding up, and a further
  1351.    +2 since at the last step x limbs are doubled into a 2x+1 limb region
  1352.    whereas the actual F[2k] value might be only 2x-1 limbs.
  1353.    Note that a division is done first, since on a 32-bit system it's at
  1354.    least conceivable to go right up to n==ULONG_MAX.  (F[2^32-1] would be
  1355.    about 380Mbytes, plus temporary workspace of about 1.2Gbytes here and
  1356.    whatever a multiply of two 190Mbyte numbers takes.)
  1357.    Enhancement: When GMP_NUMB_BITS is not a power of 2 the division could be
  1358.    worked into the multiplier.  */
  1359. #define MPN_FIB2_SIZE(n) 
  1360.   ((mp_size_t) ((n) / 32 * 23 / GMP_NUMB_BITS) + 4)
  1361. /* FIB_TABLE(n) returns the Fibonacci number F[n].  Must have n in the range
  1362.    -1 <= n <= FIB_TABLE_LIMIT (that constant in fib_table.h).
  1363.    FIB_TABLE_LUCNUM_LIMIT (in fib_table.h) is the largest n for which L[n] =
  1364.    F[n] + 2*F[n-1] fits in a limb.  */
  1365. __GMP_DECLSPEC extern const mp_limb_t __gmp_fib_table[];
  1366. #define FIB_TABLE(n)  (__gmp_fib_table[(n)+1])
  1367. #define SIEVESIZE 512 /* FIXME: Allow gmp_init_primesieve to choose */
  1368. typedef struct
  1369. {
  1370.   unsigned long d;    /* current index in s[] */
  1371.   unsigned long s0;    /* number corresponding to s[0] */
  1372.   unsigned long sqrt_s0;    /* misnomer for sqrt(s[SIEVESIZE-1]) */
  1373.   unsigned char s[SIEVESIZE + 1];  /* sieve table */
  1374. } gmp_primesieve_t;
  1375. #define gmp_init_primesieve __gmp_init_primesieve
  1376. __GMP_DECLSPEC void gmp_init_primesieve (gmp_primesieve_t *);
  1377. #define gmp_nextprime __gmp_nextprime
  1378. __GMP_DECLSPEC unsigned long int gmp_nextprime (gmp_primesieve_t *);
  1379. #ifndef MUL_TOOM22_THRESHOLD
  1380. #define MUL_TOOM22_THRESHOLD             30
  1381. #endif
  1382. #ifndef MUL_TOOM33_THRESHOLD
  1383. #define MUL_TOOM33_THRESHOLD            100
  1384. #endif
  1385. #ifndef MUL_TOOM44_THRESHOLD
  1386. #define MUL_TOOM44_THRESHOLD            300
  1387. #endif
  1388. #ifndef MUL_TOOM6H_THRESHOLD
  1389. #define MUL_TOOM6H_THRESHOLD            350
  1390. #endif
  1391. #ifndef SQR_TOOM6_THRESHOLD
  1392. #define SQR_TOOM6_THRESHOLD MUL_TOOM6H_THRESHOLD
  1393. #endif
  1394. #ifndef MUL_TOOM8H_THRESHOLD
  1395. #define MUL_TOOM8H_THRESHOLD            450
  1396. #endif
  1397. #ifndef SQR_TOOM8_THRESHOLD
  1398. #define SQR_TOOM8_THRESHOLD MUL_TOOM8H_THRESHOLD
  1399. #endif
  1400. #ifndef MUL_TOOM32_TO_TOOM43_THRESHOLD
  1401. #define MUL_TOOM32_TO_TOOM43_THRESHOLD  100
  1402. #endif
  1403. #ifndef MUL_TOOM32_TO_TOOM53_THRESHOLD
  1404. #define MUL_TOOM32_TO_TOOM53_THRESHOLD  110
  1405. #endif
  1406. #ifndef MUL_TOOM42_TO_TOOM53_THRESHOLD
  1407. #define MUL_TOOM42_TO_TOOM53_THRESHOLD  100
  1408. #endif
  1409. #ifndef MUL_TOOM42_TO_TOOM63_THRESHOLD
  1410. #define MUL_TOOM42_TO_TOOM63_THRESHOLD  110
  1411. #endif
  1412. /* MUL_TOOM22_THRESHOLD_LIMIT is the maximum for MUL_TOOM22_THRESHOLD.  In a
  1413.    normal build MUL_TOOM22_THRESHOLD is a constant and we use that.  In a fat
  1414.    binary or tune program build MUL_TOOM22_THRESHOLD is a variable and a
  1415.    separate hard limit will have been defined.  Similarly for TOOM3.  */
  1416. #ifndef MUL_TOOM22_THRESHOLD_LIMIT
  1417. #define MUL_TOOM22_THRESHOLD_LIMIT  MUL_TOOM22_THRESHOLD
  1418. #endif
  1419. #ifndef MUL_TOOM33_THRESHOLD_LIMIT
  1420. #define MUL_TOOM33_THRESHOLD_LIMIT  MUL_TOOM33_THRESHOLD
  1421. #endif
  1422. #ifndef MULLO_BASECASE_THRESHOLD_LIMIT
  1423. #define MULLO_BASECASE_THRESHOLD_LIMIT  MULLO_BASECASE_THRESHOLD
  1424. #endif
  1425. /* SQR_BASECASE_THRESHOLD is where mpn_sqr_basecase should take over from
  1426.    mpn_mul_basecase.  Default is to use mpn_sqr_basecase from 0.  (Note that we
  1427.    certainly always want it if there's a native assembler mpn_sqr_basecase.)
  1428.    If it turns out that mpn_toom2_sqr becomes faster than mpn_mul_basecase
  1429.    before mpn_sqr_basecase does, then SQR_BASECASE_THRESHOLD is the toom2
  1430.    threshold and SQR_TOOM2_THRESHOLD is 0.  This oddity arises more or less
  1431.    because SQR_TOOM2_THRESHOLD represents the size up to which mpn_sqr_basecase
  1432.    should be used, and that may be never.  */
  1433. #ifndef SQR_BASECASE_THRESHOLD
  1434. #define SQR_BASECASE_THRESHOLD            0
  1435. #endif
  1436. #ifndef SQR_TOOM2_THRESHOLD
  1437. #define SQR_TOOM2_THRESHOLD              50
  1438. #endif
  1439. #ifndef SQR_TOOM3_THRESHOLD
  1440. #define SQR_TOOM3_THRESHOLD             120
  1441. #endif
  1442. #ifndef SQR_TOOM4_THRESHOLD
  1443. #define SQR_TOOM4_THRESHOLD             400
  1444. #endif
  1445. /* See comments above about MUL_TOOM33_THRESHOLD_LIMIT.  */
  1446. #ifndef SQR_TOOM3_THRESHOLD_LIMIT
  1447. #define SQR_TOOM3_THRESHOLD_LIMIT  SQR_TOOM3_THRESHOLD
  1448. #endif
  1449. #ifndef DC_DIV_QR_THRESHOLD
  1450. #define DC_DIV_QR_THRESHOLD              50
  1451. #endif
  1452. #ifndef DC_DIVAPPR_Q_THRESHOLD
  1453. #define DC_DIVAPPR_Q_THRESHOLD          200
  1454. #endif
  1455. #ifndef DC_BDIV_QR_THRESHOLD
  1456. #define DC_BDIV_QR_THRESHOLD             50
  1457. #endif
  1458. #ifndef DC_BDIV_Q_THRESHOLD
  1459. #define DC_BDIV_Q_THRESHOLD             180
  1460. #endif
  1461. #ifndef DIVEXACT_JEB_THRESHOLD
  1462. #define DIVEXACT_JEB_THRESHOLD           25
  1463. #endif
  1464. #ifndef INV_MULMOD_BNM1_THRESHOLD
  1465. #define INV_MULMOD_BNM1_THRESHOLD  (5*MULMOD_BNM1_THRESHOLD)
  1466. #endif
  1467. #ifndef INV_APPR_THRESHOLD
  1468. #define INV_APPR_THRESHOLD         INV_NEWTON_THRESHOLD
  1469. #endif
  1470. #ifndef INV_NEWTON_THRESHOLD
  1471. #define INV_NEWTON_THRESHOLD            200
  1472. #endif
  1473. #ifndef BINV_NEWTON_THRESHOLD
  1474. #define BINV_NEWTON_THRESHOLD           300
  1475. #endif
  1476. #ifndef MU_DIVAPPR_Q_THRESHOLD
  1477. #define MU_DIVAPPR_Q_THRESHOLD         2000
  1478. #endif
  1479. #ifndef MU_DIV_QR_THRESHOLD
  1480. #define MU_DIV_QR_THRESHOLD            2000
  1481. #endif
  1482. #ifndef MUPI_DIV_QR_THRESHOLD
  1483. #define MUPI_DIV_QR_THRESHOLD           200
  1484. #endif
  1485. #ifndef MU_BDIV_Q_THRESHOLD
  1486. #define MU_BDIV_Q_THRESHOLD            2000
  1487. #endif
  1488. #ifndef MU_BDIV_QR_THRESHOLD
  1489. #define MU_BDIV_QR_THRESHOLD           2000
  1490. #endif
  1491. #ifndef MULMOD_BNM1_THRESHOLD
  1492. #define MULMOD_BNM1_THRESHOLD            16
  1493. #endif
  1494. #ifndef SQRMOD_BNM1_THRESHOLD
  1495. #define SQRMOD_BNM1_THRESHOLD            16
  1496. #endif
  1497. #ifndef MUL_TO_MULMOD_BNM1_FOR_2NXN_THRESHOLD
  1498. #define MUL_TO_MULMOD_BNM1_FOR_2NXN_THRESHOLD  (INV_MULMOD_BNM1_THRESHOLD/2)
  1499. #endif
  1500. #if HAVE_NATIVE_mpn_addmul_2 || HAVE_NATIVE_mpn_redc_2
  1501. #ifndef REDC_1_TO_REDC_2_THRESHOLD
  1502. #define REDC_1_TO_REDC_2_THRESHOLD       15
  1503. #endif
  1504. #ifndef REDC_2_TO_REDC_N_THRESHOLD
  1505. #define REDC_2_TO_REDC_N_THRESHOLD      100
  1506. #endif
  1507. #else
  1508. #ifndef REDC_1_TO_REDC_N_THRESHOLD
  1509. #define REDC_1_TO_REDC_N_THRESHOLD      100
  1510. #endif
  1511. #endif /* HAVE_NATIVE_mpn_addmul_2 || HAVE_NATIVE_mpn_redc_2 */
  1512. /* First k to use for an FFT modF multiply.  A modF FFT is an order
  1513.    log(2^k)/log(2^(k-1)) algorithm, so k=3 is merely 1.5 like karatsuba,
  1514.    whereas k=4 is 1.33 which is faster than toom3 at 1.485.    */
  1515. #define FFT_FIRST_K  4
  1516. /* Threshold at which FFT should be used to do a modF NxN -> N multiply. */
  1517. #ifndef MUL_FFT_MODF_THRESHOLD
  1518. #define MUL_FFT_MODF_THRESHOLD   (MUL_TOOM33_THRESHOLD * 3)
  1519. #endif
  1520. #ifndef SQR_FFT_MODF_THRESHOLD
  1521. #define SQR_FFT_MODF_THRESHOLD   (SQR_TOOM3_THRESHOLD * 3)
  1522. #endif
  1523. /* Threshold at which FFT should be used to do an NxN -> 2N multiply.  This
  1524.    will be a size where FFT is using k=7 or k=8, since an FFT-k used for an
  1525.    NxN->2N multiply and not recursing into itself is an order
  1526.    log(2^k)/log(2^(k-2)) algorithm, so it'll be at least k=7 at 1.39 which
  1527.    is the first better than toom3.  */
  1528. #ifndef MUL_FFT_THRESHOLD
  1529. #define MUL_FFT_THRESHOLD   (MUL_FFT_MODF_THRESHOLD * 10)
  1530. #endif
  1531. #ifndef SQR_FFT_THRESHOLD
  1532. #define SQR_FFT_THRESHOLD   (SQR_FFT_MODF_THRESHOLD * 10)
  1533. #endif
  1534. /* Table of thresholds for successive modF FFT "k"s.  The first entry is
  1535.    where FFT_FIRST_K+1 should be used, the second FFT_FIRST_K+2,
  1536.    etc.  See mpn_fft_best_k(). */
  1537. #ifndef MUL_FFT_TABLE
  1538. #define MUL_FFT_TABLE                           
  1539.   { MUL_TOOM33_THRESHOLD * 4,   /* k=5 */        
  1540.     MUL_TOOM33_THRESHOLD * 8,   /* k=6 */        
  1541.     MUL_TOOM33_THRESHOLD * 16,  /* k=7 */        
  1542.     MUL_TOOM33_THRESHOLD * 32,  /* k=8 */        
  1543.     MUL_TOOM33_THRESHOLD * 96,  /* k=9 */        
  1544.     MUL_TOOM33_THRESHOLD * 288, /* k=10 */       
  1545.     0 }
  1546. #endif
  1547. #ifndef SQR_FFT_TABLE
  1548. #define SQR_FFT_TABLE                           
  1549.   { SQR_TOOM3_THRESHOLD * 4,   /* k=5 */        
  1550.     SQR_TOOM3_THRESHOLD * 8,   /* k=6 */        
  1551.     SQR_TOOM3_THRESHOLD * 16,  /* k=7 */        
  1552.     SQR_TOOM3_THRESHOLD * 32,  /* k=8 */        
  1553.     SQR_TOOM3_THRESHOLD * 96,  /* k=9 */        
  1554.     SQR_TOOM3_THRESHOLD * 288, /* k=10 */       
  1555.     0 }
  1556. #endif
  1557. struct fft_table_nk
  1558. {
  1559.   unsigned int n:27;
  1560.   unsigned int k:5;
  1561. };
  1562. #ifndef FFT_TABLE_ATTRS
  1563. #define FFT_TABLE_ATTRS   static const
  1564. #endif
  1565. #define MPN_FFT_TABLE_SIZE  16
  1566. #ifndef DC_DIV_QR_THRESHOLD
  1567. #define DC_DIV_QR_THRESHOLD    (3 * MUL_TOOM22_THRESHOLD)
  1568. #endif
  1569. #ifndef GET_STR_DC_THRESHOLD
  1570. #define GET_STR_DC_THRESHOLD             18
  1571. #endif
  1572. #ifndef GET_STR_PRECOMPUTE_THRESHOLD
  1573. #define GET_STR_PRECOMPUTE_THRESHOLD     35
  1574. #endif
  1575. #ifndef SET_STR_DC_THRESHOLD
  1576. #define SET_STR_DC_THRESHOLD            750
  1577. #endif
  1578. #ifndef SET_STR_PRECOMPUTE_THRESHOLD
  1579. #define SET_STR_PRECOMPUTE_THRESHOLD   2000
  1580. #endif
  1581. /* Return non-zero if xp,xsize and yp,ysize overlap.
  1582.    If xp+xsize<=yp there's no overlap, or if yp+ysize<=xp there's no
  1583.    overlap.  If both these are false, there's an overlap. */
  1584. #define MPN_OVERLAP_P(xp, xsize, yp, ysize) 
  1585.   ((xp) + (xsize) > (yp) && (yp) + (ysize) > (xp))
  1586. #define MEM_OVERLAP_P(xp, xsize, yp, ysize)     
  1587.   (   (char *) (xp) + (xsize) > (char *) (yp)   
  1588.    && (char *) (yp) + (ysize) > (char *) (xp))
  1589. /* Return non-zero if xp,xsize and yp,ysize are either identical or not
  1590.    overlapping.  Return zero if they're partially overlapping. */
  1591. #define MPN_SAME_OR_SEPARATE_P(xp, yp, size)    
  1592.   MPN_SAME_OR_SEPARATE2_P(xp, size, yp, size)
  1593. #define MPN_SAME_OR_SEPARATE2_P(xp, xsize, yp, ysize)           
  1594.   ((xp) == (yp) || ! MPN_OVERLAP_P (xp, xsize, yp, ysize))
  1595. /* Return non-zero if dst,dsize and src,ssize are either identical or
  1596.    overlapping in a way suitable for an incrementing/decrementing algorithm.
  1597.    Return zero if they're partially overlapping in an unsuitable fashion. */
  1598. #define MPN_SAME_OR_INCR2_P(dst, dsize, src, ssize)             
  1599.   ((dst) <= (src) || ! MPN_OVERLAP_P (dst, dsize, src, ssize))
  1600. #define MPN_SAME_OR_INCR_P(dst, src, size)      
  1601.   MPN_SAME_OR_INCR2_P(dst, size, src, size)
  1602. #define MPN_SAME_OR_DECR2_P(dst, dsize, src, ssize)             
  1603.   ((dst) >= (src) || ! MPN_OVERLAP_P (dst, dsize, src, ssize))
  1604. #define MPN_SAME_OR_DECR_P(dst, src, size)      
  1605.   MPN_SAME_OR_DECR2_P(dst, size, src, size)
  1606. /* ASSERT() is a private assertion checking scheme, similar to <assert.h>.
  1607.    ASSERT() does the check only if WANT_ASSERT is selected, ASSERT_ALWAYS()
  1608.    does it always.  Generally assertions are meant for development, but
  1609.    might help when looking for a problem later too.
  1610.    Note that strings shouldn't be used within the ASSERT expression,
  1611.    eg. ASSERT(strcmp(s,"notgood")!=0), since the quotes upset the "expr"
  1612.    used in the !HAVE_STRINGIZE case (ie. K&R).  */
  1613. #ifdef __LINE__
  1614. #define ASSERT_LINE  __LINE__
  1615. #else
  1616. #define ASSERT_LINE  -1
  1617. #endif
  1618. #ifdef __FILE__
  1619. #define ASSERT_FILE  __FILE__
  1620. #else
  1621. #define ASSERT_FILE  ""
  1622. #endif
  1623. __GMP_DECLSPEC void __gmp_assert_header __GMP_PROTO ((const char *, int));
  1624. __GMP_DECLSPEC void __gmp_assert_fail __GMP_PROTO ((const char *, int, const char *)) ATTRIBUTE_NORETURN;
  1625. #if HAVE_STRINGIZE
  1626. #define ASSERT_FAIL(expr)  __gmp_assert_fail (ASSERT_FILE, ASSERT_LINE, #expr)
  1627. #else
  1628. #define ASSERT_FAIL(expr)  __gmp_assert_fail (ASSERT_FILE, ASSERT_LINE, "expr")
  1629. #endif
  1630. #define ASSERT_ALWAYS(expr)     
  1631.   do {                          
  1632.     if (!(expr))                
  1633.       ASSERT_FAIL (expr);       
  1634.   } while (0)
  1635. #if WANT_ASSERT
  1636. #define ASSERT(expr)   ASSERT_ALWAYS (expr)
  1637. #else
  1638. #define ASSERT(expr)   do {} while (0)
  1639. #endif
  1640. /* ASSERT_CARRY checks the expression is non-zero, and ASSERT_NOCARRY checks
  1641.    that it's zero.  In both cases if assertion checking is disabled the
  1642.    expression is still evaluated.  These macros are meant for use with
  1643.    routines like mpn_add_n() where the return value represents a carry or
  1644.    whatever that should or shouldn't occur in some context.  For example,
  1645.    ASSERT_NOCARRY (mpn_add_n (rp, s1p, s2p, size)); */
  1646. #if WANT_ASSERT
  1647. #define ASSERT_CARRY(expr)     ASSERT_ALWAYS ((expr) != 0)
  1648. #define ASSERT_NOCARRY(expr)   ASSERT_ALWAYS ((expr) == 0)
  1649. #else
  1650. #define ASSERT_CARRY(expr)     (expr)
  1651. #define ASSERT_NOCARRY(expr)   (expr)
  1652. #endif
  1653. /* ASSERT_CODE includes code when assertion checking is wanted.  This is the
  1654.    same as writing "#if WANT_ASSERT", but more compact.  */
  1655. #if WANT_ASSERT
  1656. #define ASSERT_CODE(expr)  expr
  1657. #else
  1658. #define ASSERT_CODE(expr)
  1659. #endif
  1660. /* Test that an mpq_t is in fully canonical form.  This can be used as
  1661.    protection on routines like mpq_equal which give wrong results on
  1662.    non-canonical inputs.  */
  1663. #if WANT_ASSERT
  1664. #define ASSERT_MPQ_CANONICAL(q)                         
  1665.   do {                                                  
  1666.     ASSERT (q->_mp_den._mp_size > 0);                   
  1667.     if (q->_mp_num._mp_size == 0)                       
  1668.       {                                                 
  1669.         /* zero should be 0/1 */                        
  1670.         ASSERT (mpz_cmp_ui (mpq_denref(q), 1L) == 0);   
  1671.       }                                                 
  1672.     else                                                
  1673.       {                                                 
  1674.         /* no common factors */                         
  1675.         mpz_t  __g;                                     
  1676.         mpz_init (__g);                                 
  1677.         mpz_gcd (__g, mpq_numref(q), mpq_denref(q));    
  1678.         ASSERT (mpz_cmp_ui (__g, 1) == 0);              
  1679.         mpz_clear (__g);                                
  1680.       }                                                 
  1681.   } while (0)
  1682. #else
  1683. #define ASSERT_MPQ_CANONICAL(q)  do {} while (0)
  1684. #endif
  1685. /* Check that the nail parts are zero. */
  1686. #define ASSERT_ALWAYS_LIMB(limb)                
  1687.   do {                                          
  1688.     mp_limb_t  __nail = (limb) & GMP_NAIL_MASK; 
  1689.     ASSERT_ALWAYS (__nail == 0);                
  1690.   } while (0)
  1691. #define ASSERT_ALWAYS_MPN(ptr, size)            
  1692.   do {                                          
  1693.     /* let whole loop go dead when no nails */  
  1694.     if (GMP_NAIL_BITS != 0)                     
  1695.       {                                         
  1696.         mp_size_t  __i;                         
  1697.         for (__i = 0; __i < (size); __i++)      
  1698.           ASSERT_ALWAYS_LIMB ((ptr)[__i]);      
  1699.       }                                         
  1700.   } while (0)
  1701. #if WANT_ASSERT
  1702. #define ASSERT_LIMB(limb)       ASSERT_ALWAYS_LIMB (limb)
  1703. #define ASSERT_MPN(ptr, size)   ASSERT_ALWAYS_MPN (ptr, size)
  1704. #else
  1705. #define ASSERT_LIMB(limb)       do {} while (0)
  1706. #define ASSERT_MPN(ptr, size)   do {} while (0)
  1707. #endif
  1708. /* Assert that an mpn region {ptr,size} is zero, or non-zero.
  1709.    size==0 is allowed, and in that case {ptr,size} considered to be zero.  */
  1710. #if WANT_ASSERT
  1711. #define ASSERT_MPN_ZERO_P(ptr,size)     
  1712.   do {                                  
  1713.     mp_size_t  __i;                     
  1714.     ASSERT ((size) >= 0);               
  1715.     for (__i = 0; __i < (size); __i++)  
  1716.       ASSERT ((ptr)[__i] == 0);         
  1717.   } while (0)
  1718. #define ASSERT_MPN_NONZERO_P(ptr,size)  
  1719.   do {                                  
  1720.     mp_size_t  __i;                     
  1721.     int        __nonzero = 0;           
  1722.     ASSERT ((size) >= 0);               
  1723.     for (__i = 0; __i < (size); __i++)  
  1724.       if ((ptr)[__i] != 0)              
  1725.         {                               
  1726.           __nonzero = 1;                
  1727.           break;                        
  1728.         }                               
  1729.     ASSERT (__nonzero);                 
  1730.   } while (0)
  1731. #else
  1732. #define ASSERT_MPN_ZERO_P(ptr,size)     do {} while (0)
  1733. #define ASSERT_MPN_NONZERO_P(ptr,size)  do {} while (0)
  1734. #endif
  1735. #if ! HAVE_NATIVE_mpn_com
  1736. #undef mpn_com
  1737. #define mpn_com(d,s,n)                                  
  1738.   do {                                                  
  1739.     mp_ptr     __d = (d);                               
  1740.     mp_srcptr  __s = (s);                               
  1741.     mp_size_t  __n = (n);                               
  1742.     ASSERT (__n >= 1);                                  
  1743.     ASSERT (MPN_SAME_OR_SEPARATE_P (__d, __s, __n));    
  1744.     do                                                  
  1745.       *__d++ = (~ *__s++) & GMP_NUMB_MASK;              
  1746.     while (--__n);                                      
  1747.   } while (0)
  1748. #endif
  1749. #define MPN_LOGOPS_N_INLINE(rp, up, vp, n, operation)
  1750.   do {
  1751.     mp_srcptr __up = (up);
  1752.     mp_srcptr __vp = (vp);
  1753.     mp_ptr __rp = (rp);
  1754.     mp_size_t __n = (n);
  1755.     mp_limb_t __a, __b;
  1756.     ASSERT (__n > 0);
  1757.     ASSERT (MPN_SAME_OR_SEPARATE_P (__rp, __up, __n));
  1758.     ASSERT (MPN_SAME_OR_SEPARATE_P (__rp, __vp, __n));
  1759.     __up += __n;
  1760.     __vp += __n;
  1761.     __rp += __n;
  1762.     __n = -__n;
  1763.     do {
  1764.       __a = __up[__n];
  1765.       __b = __vp[__n];
  1766.       __rp[__n] = operation;
  1767.     } while (++__n);
  1768.   } while (0)
  1769. #if ! HAVE_NATIVE_mpn_and_n
  1770. #undef mpn_and_n
  1771. #define mpn_and_n(rp, up, vp, n) 
  1772.   MPN_LOGOPS_N_INLINE (rp, up, vp, n, __a & __b)
  1773. #endif
  1774. #if ! HAVE_NATIVE_mpn_andn_n
  1775. #undef mpn_andn_n
  1776. #define mpn_andn_n(rp, up, vp, n) 
  1777.   MPN_LOGOPS_N_INLINE (rp, up, vp, n, __a & ~__b)
  1778. #endif
  1779. #if ! HAVE_NATIVE_mpn_nand_n
  1780. #undef mpn_nand_n
  1781. #define mpn_nand_n(rp, up, vp, n) 
  1782.   MPN_LOGOPS_N_INLINE (rp, up, vp, n, ~(__a & __b) & GMP_NUMB_MASK)
  1783. #endif
  1784. #if ! HAVE_NATIVE_mpn_ior_n
  1785. #undef mpn_ior_n
  1786. #define mpn_ior_n(rp, up, vp, n) 
  1787.   MPN_LOGOPS_N_INLINE (rp, up, vp, n, __a | __b)
  1788. #endif
  1789. #if ! HAVE_NATIVE_mpn_iorn_n
  1790. #undef mpn_iorn_n
  1791. #define mpn_iorn_n(rp, up, vp, n) 
  1792.   MPN_LOGOPS_N_INLINE (rp, up, vp, n, (__a | ~__b) & GMP_NUMB_MASK)
  1793. #endif
  1794. #if ! HAVE_NATIVE_mpn_nior_n
  1795. #undef mpn_nior_n
  1796. #define mpn_nior_n(rp, up, vp, n) 
  1797.   MPN_LOGOPS_N_INLINE (rp, up, vp, n, ~(__a | __b) & GMP_NUMB_MASK)
  1798. #endif
  1799. #if ! HAVE_NATIVE_mpn_xor_n
  1800. #undef mpn_xor_n
  1801. #define mpn_xor_n(rp, up, vp, n) 
  1802.   MPN_LOGOPS_N_INLINE (rp, up, vp, n, __a ^ __b)
  1803. #endif
  1804. #if ! HAVE_NATIVE_mpn_xnor_n
  1805. #undef mpn_xnor_n
  1806. #define mpn_xnor_n(rp, up, vp, n) 
  1807.   MPN_LOGOPS_N_INLINE (rp, up, vp, n, ~(__a ^ __b) & GMP_NUMB_MASK)
  1808. #endif
  1809. #define mpn_trialdiv __MPN(trialdiv)
  1810. __GMP_DECLSPEC mp_limb_t mpn_trialdiv __GMP_PROTO ((mp_srcptr, mp_size_t, mp_size_t, int *));
  1811. #define mpn_remove __MPN(remove)
  1812. __GMP_DECLSPEC mp_bitcnt_t mpn_remove __GMP_PROTO ((mp_ptr, mp_size_t *, mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_bitcnt_t));
  1813. /* ADDC_LIMB sets w=x+y and cout to 0 or 1 for a carry from that addition. */
  1814. #if GMP_NAIL_BITS == 0
  1815. #define ADDC_LIMB(cout, w, x, y)        
  1816.   do {                                  
  1817.     mp_limb_t  __x = (x);               
  1818.     mp_limb_t  __y = (y);               
  1819.     mp_limb_t  __w = __x + __y;         
  1820.     (w) = __w;                          
  1821.     (cout) = __w < __x;                 
  1822.   } while (0)
  1823. #else
  1824. #define ADDC_LIMB(cout, w, x, y)        
  1825.   do {                                  
  1826.     mp_limb_t  __w;                     
  1827.     ASSERT_LIMB (x);                    
  1828.     ASSERT_LIMB (y);                    
  1829.     __w = (x) + (y);                    
  1830.     (w) = __w & GMP_NUMB_MASK;          
  1831.     (cout) = __w >> GMP_NUMB_BITS;      
  1832.   } while (0)
  1833. #endif
  1834. /* SUBC_LIMB sets w=x-y and cout to 0 or 1 for a borrow from that
  1835.    subtract.  */
  1836. #if GMP_NAIL_BITS == 0
  1837. #define SUBC_LIMB(cout, w, x, y)        
  1838.   do {                                  
  1839.     mp_limb_t  __x = (x);               
  1840.     mp_limb_t  __y = (y);               
  1841.     mp_limb_t  __w = __x - __y;         
  1842.     (w) = __w;                          
  1843.     (cout) = __w > __x;                 
  1844.   } while (0)
  1845. #else
  1846. #define SUBC_LIMB(cout, w, x, y)        
  1847.   do {                                  
  1848.     mp_limb_t  __w = (x) - (y);         
  1849.     (w) = __w & GMP_NUMB_MASK;          
  1850.     (cout) = __w >> (GMP_LIMB_BITS-1);  
  1851.   } while (0)
  1852. #endif
  1853. /* MPN_INCR_U does {ptr,size} += n, MPN_DECR_U does {ptr,size} -= n, both
  1854.    expecting no carry (or borrow) from that.
  1855.    The size parameter is only for the benefit of assertion checking.  In a
  1856.    normal build it's unused and the carry/borrow is just propagated as far
  1857.    as it needs to go.
  1858.    On random data, usually only one or two limbs of {ptr,size} get updated,
  1859.    so there's no need for any sophisticated looping, just something compact
  1860.    and sensible.
  1861.    FIXME: Switch all code from mpn_{incr,decr}_u to MPN_{INCR,DECR}_U,
  1862.    declaring their operand sizes, then remove the former.  This is purely
  1863.    for the benefit of assertion checking.  */
  1864. #if defined (__GNUC__) && HAVE_HOST_CPU_FAMILY_x86 && GMP_NAIL_BITS == 0      
  1865.   && GMP_LIMB_BITS == 32 && ! defined (NO_ASM) && ! WANT_ASSERT
  1866. /* Better flags handling than the generic C gives on i386, saving a few
  1867.    bytes of code and maybe a cycle or two.  */
  1868. #define MPN_IORD_U(ptr, incr, aors)
  1869.   do {
  1870.     mp_ptr  __ptr_dummy;
  1871.     if (__builtin_constant_p (incr) && (incr) == 1)
  1872.       {
  1873.         __asm__ __volatile__
  1874.           ("n" ASM_L(top) ":n"
  1875.            "t" aors " $1, (%0)n"
  1876.            "tleal 4(%0),%0n"
  1877.            "tjc " ASM_L(top)
  1878.            : "=r" (__ptr_dummy)
  1879.            : "0"  (ptr)
  1880.            : "memory");
  1881.       }
  1882.     else
  1883.       {
  1884.         __asm__ __volatile__
  1885.           (   aors  " %2,(%0)n"
  1886.            "tjnc " ASM_L(done) "n"
  1887.            ASM_L(top) ":n"
  1888.            "t" aors " $1,4(%0)n"
  1889.            "tleal 4(%0),%0n"
  1890.            "tjc " ASM_L(top) "n"
  1891.            ASM_L(done) ":n"
  1892.            : "=r" (__ptr_dummy)
  1893.            : "0"  (ptr),
  1894.              "ri" (incr)
  1895.            : "memory");
  1896.       }
  1897.   } while (0)
  1898. #define MPN_INCR_U(ptr, size, incr)  MPN_IORD_U (ptr, incr, "addl")
  1899. #define MPN_DECR_U(ptr, size, incr)  MPN_IORD_U (ptr, incr, "subl")
  1900. #define mpn_incr_u(ptr, incr)  MPN_INCR_U (ptr, 0, incr)
  1901. #define mpn_decr_u(ptr, incr)  MPN_DECR_U (ptr, 0, incr)
  1902. #endif
  1903. #if GMP_NAIL_BITS == 0
  1904. #ifndef mpn_incr_u
  1905. #define mpn_incr_u(p,incr)                              
  1906.   do {                                                  
  1907.     mp_limb_t __x;                                      
  1908.     mp_ptr __p = (p);                                   
  1909.     if (__builtin_constant_p (incr) && (incr) == 1)     
  1910.       {                                                 
  1911.         while (++(*(__p++)) == 0)                       
  1912.           ;                                             
  1913.       }                                                 
  1914.     else                                                
  1915.       {                                                 
  1916.         __x = *__p + (incr);                            
  1917.         *__p = __x;                                     
  1918.         if (__x < (incr))                               
  1919.           while (++(*(++__p)) == 0)                     
  1920.             ;                                           
  1921.       }                                                 
  1922.   } while (0)