anymul_1.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:6k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. /*
  2. Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2006, 2007, 2008
  3. Free Software Foundation, Inc.
  4. This file is part of the GNU MP Library.
  5. The GNU MP Library is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU Lesser General Public License as published by
  7. the Free Software Foundation; either version 3 of the License, or (at your
  8. option) any later version.
  9. The GNU MP Library is distributed in the hope that it will be useful, but
  10. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  12. License for more details.
  13. You should have received a copy of the GNU Lesser General Public License
  14. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <stdio.h>
  18. #include "gmp.h"
  19. #include "gmp-impl.h"
  20. #include "longlong.h"
  21. #include "tests.h"
  22. #ifdef OPERATION_mul_1
  23. #define func __gmpn_mul_1
  24. #define reffunc refmpn_mul_1
  25. #define funcname "mpn_mul_1"
  26. #endif
  27. #ifdef OPERATION_addmul_1
  28. #define func __gmpn_addmul_1
  29. #define reffunc refmpn_addmul_1
  30. #define funcname "mpn_addmul_1"
  31. #endif
  32. #ifdef OPERATION_submul_1
  33. #define func __gmpn_submul_1
  34. #define reffunc refmpn_submul_1
  35. #define funcname "mpn_submul_1"
  36. #endif
  37. #if defined (USG) || defined (__SVR4) || defined (_UNICOS) || defined (__hpux)
  38. #include <time.h>
  39. int
  40. cputime ()
  41. {
  42.   if (CLOCKS_PER_SEC < 100000)
  43.     return clock () * 1000 / CLOCKS_PER_SEC;
  44.   return clock () / (CLOCKS_PER_SEC / 1000);
  45. }
  46. #else
  47. #include <sys/types.h>
  48. #include <sys/time.h>
  49. #include <sys/resource.h>
  50. int
  51. cputime ()
  52. {
  53.   struct rusage rus;
  54.   getrusage (0, &rus);
  55.   return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
  56. }
  57. #endif
  58. static void print_posneg (mp_limb_t);
  59. static void mpn_print (mp_ptr, mp_size_t);
  60. #define LXW ((int) (2 * sizeof (mp_limb_t)))
  61. #define M * 1000000
  62. #ifndef CLOCK
  63. #error "Don't know CLOCK of your machine"
  64. #endif
  65. #ifndef OPS
  66. #define OPS (CLOCK/5)
  67. #endif
  68. #ifndef SIZE
  69. #define SIZE 496
  70. #endif
  71. #ifndef TIMES
  72. #define TIMES OPS/(SIZE+1)
  73. #endif
  74. int
  75. main (int argc, char **argv)
  76. {
  77.   mp_ptr s1, ref, rp;
  78.   mp_limb_t cy_ref, cy_try;
  79.   int i;
  80.   long t0, t;
  81.   unsigned int test;
  82.   mp_limb_t xlimb;
  83.   mp_size_t size;
  84.   double cyc;
  85.   unsigned int ntests;
  86.   s1 = malloc (SIZE * sizeof (mp_limb_t));
  87.   ref = malloc (SIZE * sizeof (mp_limb_t));
  88.   rp = malloc ((SIZE + 2) * sizeof (mp_limb_t));
  89.   rp++;
  90.   ntests = ~(unsigned) 0;
  91.   if (argc == 2)
  92.     ntests = strtol (argv[1], 0, 0);
  93.   for (test = 1; test <= ntests; test++)
  94.     {
  95. #if TIMES == 1 && ! defined (PRINT)
  96.       if (test % (1 + 0x80000 / (SIZE + 20)) == 0)
  97. {
  98.   printf ("r%u", test);
  99.   fflush (stdout);
  100. }
  101. #endif
  102. #ifdef RANDOM
  103.       size = random () % SIZE + 1;
  104. #else
  105.       size = SIZE;
  106. #endif
  107.       rp[-1] = 0x87654321;
  108.       rp[size] = 0x12345678;
  109. #ifdef FIXED_XLIMB
  110.       xlimb = FIXED_XLIMB;
  111. #else
  112.       mpn_random2 (&xlimb, 1);
  113. #endif
  114. #if TIMES != 1
  115.       mpn_random (s1, size);
  116.       mpn_random (rp, size);
  117.       MPN_COPY (ref, rp, size);
  118.       t0 = cputime();
  119.       for (i = 0; i < TIMES; i++)
  120. func (ref, s1, size, xlimb);
  121.       t = cputime() - t0;
  122.       cyc = ((double) t * CLOCK) / (TIMES * size * 1000.0);
  123.       printf (funcname ":    %5ldms (%.3f cycles/limb) [%.2f Gb/s]n",
  124.       t, cyc,
  125.       CLOCK/cyc*GMP_LIMB_BITS*GMP_LIMB_BITS/1e9);
  126. #endif
  127. #ifndef NOCHECK
  128.       mpn_random2 (s1, size);
  129. #ifdef ZERO
  130.       memset (rp, 0, size * sizeof *rp);
  131. #else
  132.       mpn_random2 (rp, size);
  133. #endif
  134. #if defined (PRINT) || defined (XPRINT)
  135.       printf ("xlimb=");
  136.       mpn_print (&xlimb, 1);
  137. #endif
  138. #ifdef PRINT
  139. #ifndef OPERATION_mul_1
  140.       printf ("%*s ", (int) (2 * sizeof(mp_limb_t)), "");
  141.       mpn_print (rp, size);
  142. #endif
  143.       printf ("%*s ", (int) (2 * sizeof(mp_limb_t)), "");
  144.       mpn_print (s1, size);
  145. #endif
  146.       MPN_COPY (ref, rp, size);
  147.       cy_ref = reffunc (ref, s1, size, xlimb);
  148.       cy_try = func (rp, s1, size, xlimb);
  149. #ifdef PRINT
  150.       mpn_print (&cy_ref, 1);
  151.       mpn_print (ref, size);
  152.       mpn_print (&cy_try, 1);
  153.       mpn_print (rp, size);
  154. #endif
  155.       if (cy_ref != cy_try || mpn_cmp (ref, rp, size) != 0
  156.   || rp[-1] != 0x87654321 || rp[size] != 0x12345678)
  157. {
  158.   printf ("n        ref%*s try%*s diffn", LXW - 3, "", 2 * LXW - 6, "");
  159.   for (i = 0; i < size; i++)
  160.     {
  161.       printf ("%6d: ", i);
  162.       printf ("%0*llX ", LXW, (unsigned long long) ref[i]);
  163.       printf ("%0*llX ", LXW, (unsigned long long) rp[i]);
  164.       print_posneg (rp[i] - ref[i]);
  165.       printf ("n");
  166.     }
  167.   printf ("retval: ");
  168.   printf ("%0*llX ", LXW, (unsigned long long) cy_ref);
  169.   printf ("%0*llX ", LXW, (unsigned long long) cy_try);
  170.   print_posneg (cy_try - cy_ref);
  171.   printf ("n");
  172.   if (rp[-1] != 0x87654321)
  173.     printf ("clobbered at low endn");
  174.   if (rp[size] != 0x12345678)
  175.     printf ("clobbered at high endn");
  176.   printf ("TEST NUMBER %un", test);
  177.   abort();
  178. }
  179. #endif
  180.     }
  181.   exit (0);
  182. }
  183. static void
  184. print_posneg (mp_limb_t d)
  185. {
  186.   char buf[LXW + 2];
  187.   if (d == 0)
  188.     printf (" %*X", LXW, 0);
  189.   else if (-d < d)
  190.     {
  191.       sprintf (buf, "%llX", (unsigned long long) -d);
  192.       printf ("%*s-%s", LXW - (int) strlen (buf), "", buf);
  193.     }
  194.   else
  195.     {
  196.       sprintf (buf, "%llX", (unsigned long long) d);
  197.       printf ("%*s+%s", LXW - (int) strlen (buf), "", buf);
  198.     }
  199. }
  200. static void
  201. mpn_print (mp_ptr p, mp_size_t size)
  202. {
  203.   mp_size_t i;
  204.   for (i = size - 1; i >= 0; i--)
  205.     {
  206. #ifdef _LONG_LONG_LIMB
  207.       printf ("%0*lX%0*lX", (int) (sizeof(mp_limb_t)),
  208.       (unsigned long) (p[i] >> (GMP_LIMB_BITS/2)),
  209.               (int) (sizeof(mp_limb_t)), (unsigned long) (p[i]));
  210. #else
  211.       printf ("%0*lX", (int) (2 * sizeof(mp_limb_t)), p[i]);
  212. #endif
  213. #ifdef SPACE
  214.       if (i != 0)
  215. printf (" ");
  216. #endif
  217.     }
  218.   puts ("");
  219. }