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

数学计算

开发平台:

Unix_Linux

  1. /*
  2. Copyright 1999, 2000, 2001, 2004, 2009 Free Software Foundation, Inc.
  3. This file is part of the GNU MP Library.
  4. The GNU MP Library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or (at your
  7. option) any later version.
  8. The GNU MP Library is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include "gmp.h"
  17. #include "gmp-impl.h"
  18. #include "tests.h"
  19. #ifdef OPERATION_copyi
  20. #define func MPN_COPY_INCR
  21. #define reffunc refmpn_copyi
  22. #define funcname "MPN_COPY_INCR"
  23. #endif
  24. #ifdef OPERATION_copyd
  25. #define func MPN_COPY_DECR
  26. #define reffunc refmpn_copyd
  27. #define funcname "MPN_COPY_DECR"
  28. #endif
  29. #if defined (USG) || defined (__SVR4) || defined (_UNICOS) || defined (__hpux)
  30. #include <time.h>
  31. int
  32. cputime ()
  33. {
  34.   if (CLOCKS_PER_SEC < 100000)
  35.     return clock () * 1000 / CLOCKS_PER_SEC;
  36.   return clock () / (CLOCKS_PER_SEC / 1000);
  37. }
  38. #else
  39. #include <sys/types.h>
  40. #include <sys/time.h>
  41. #include <sys/resource.h>
  42. int
  43. cputime ()
  44. {
  45.   struct rusage rus;
  46.   getrusage (0, &rus);
  47.   return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
  48. }
  49. #endif
  50. static void mpn_print (mp_ptr, mp_size_t);
  51. #define M * 1000000
  52. #ifndef CLOCK
  53. #error "Don't know CLOCK of your machine"
  54. #endif
  55. #ifndef OPS
  56. #define OPS (CLOCK/2)
  57. #endif
  58. #ifndef SIZE
  59. #define SIZE 496
  60. #endif
  61. #ifndef TIMES
  62. #define TIMES OPS/(SIZE+1)
  63. #endif
  64. int
  65. main (int argc, char **argv)
  66. {
  67.   mp_ptr s1, dx, dy;
  68.   int i;
  69.   long t0, t;
  70.   unsigned int test;
  71.   mp_size_t size;
  72.   unsigned int ntests;
  73.   s1 = malloc (SIZE * sizeof (mp_limb_t));
  74.   dx = malloc ((SIZE + 2) * sizeof (mp_limb_t));
  75.   dy = malloc ((SIZE + 2) * sizeof (mp_limb_t));
  76.   ntests = ~(unsigned) 0;
  77.   if (argc == 2)
  78.     ntests = strtol (argv[1], 0, 0);
  79.   for (test = 1; test <= ntests; test++)
  80.     {
  81. #if TIMES == 1 && ! defined (PRINT)
  82.       if (test % (SIZE > 100000 ? 1 : 100000 / SIZE) == 0)
  83. {
  84.   printf ("r%u", test);
  85.   fflush (stdout);
  86. }
  87. #endif
  88. #ifdef RANDOM
  89.       size = random () % SIZE + 1;
  90. #else
  91.       size = SIZE;
  92. #endif
  93.       dx[0] = 0x87654321;
  94.       dy[0] = 0x87654321;
  95.       dx[size+1] = 0x12345678;
  96.       dy[size+1] = 0x12345678;
  97. #if TIMES != 1
  98.       mpn_random (s1, size);
  99.       t0 = cputime();
  100.       for (i = 0; i < TIMES; i++)
  101. func (dx+1, s1, size);
  102.       t = cputime() - t0;
  103.       printf (funcname ":    %5ldms (%.3f cycles/limb)n",
  104.       t, ((double) t * CLOCK) / (TIMES * size * 1000.0));
  105. #endif
  106. #ifndef NOCHECK
  107.       mpn_random2 (s1, size);
  108. #ifdef PRINT
  109.       mpn_print (s1, size);
  110. #endif
  111.       /* Put garbage in the destination.  */
  112.       for (i = 0; i < size; i++)
  113. {
  114.   dx[i+1] = 0xdead;
  115.   dy[i+1] = 0xbeef;
  116. }
  117.       reffunc (dx+1, s1, size);
  118.       func (dy+1, s1, size);
  119. #ifdef PRINT
  120.       mpn_print (dx+1, size);
  121.       mpn_print (dy+1, size);
  122. #endif
  123.       if (mpn_cmp (dx, dy, size+2) != 0
  124.   || dx[0] != 0x87654321 || dx[size+1] != 0x12345678)
  125. {
  126. #ifndef PRINT
  127.   mpn_print (dx+1, size);
  128.   mpn_print (dy+1, size);
  129. #endif
  130.   printf ("n");
  131.   if (dy[0] != 0x87654321)
  132.     printf ("clobbered at low endn");
  133.   if (dy[size+1] != 0x12345678)
  134.     printf ("clobbered at high endn");
  135.   printf ("TEST NUMBER %un", test);
  136.   abort();
  137. }
  138. #endif
  139.     }
  140.   exit (0);
  141. }
  142. static void
  143. mpn_print (mp_ptr p, mp_size_t size)
  144. {
  145.   mp_size_t i;
  146.   for (i = size - 1; i >= 0; i--)
  147.     {
  148. #ifdef _LONG_LONG_LIMB
  149.       printf ("%0*lX%0*lX", (int) (sizeof(mp_limb_t)),
  150.       (unsigned long) (p[i] >> (GMP_LIMB_BITS/2)),
  151.               (int) (sizeof(mp_limb_t)), (unsigned long) (p[i]));
  152. #else
  153.       printf ("%0*lX", (int) (2 * sizeof(mp_limb_t)), p[i]);
  154. #endif
  155. #ifdef SPACE
  156.       if (i != 0)
  157. printf (" ");
  158. #endif
  159.     }
  160.   puts ("");
  161. }