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

数学计算

开发平台:

Unix_Linux

  1. /*
  2. Copyright 1996, 1998, 1999, 2000, 2001, 2004, 2007, 2009 Free Software
  3. 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 <stdio.h>
  17. #include "gmp.h"
  18. #include "gmp-impl.h"
  19. #include "tests.h"
  20. #ifdef OPERATION_lshift
  21. #define func __gmpn_lshift
  22. #define reffunc refmpn_lshift
  23. #define funcname "mpn_lshift"
  24. #endif
  25. #ifdef OPERATION_rshift
  26. #define func __gmpn_rshift
  27. #define reffunc refmpn_rshift
  28. #define funcname "mpn_rshift"
  29. #endif
  30. #if defined (USG) || defined (__SVR4) || defined (_UNICOS) || defined (__hpux)
  31. #include <time.h>
  32. int
  33. cputime ()
  34. {
  35.   if (CLOCKS_PER_SEC < 100000)
  36.     return clock () * 1000 / CLOCKS_PER_SEC;
  37.   return clock () / (CLOCKS_PER_SEC / 1000);
  38. }
  39. #else
  40. #include <sys/types.h>
  41. #include <sys/time.h>
  42. #include <sys/resource.h>
  43. int
  44. cputime ()
  45. {
  46.   struct rusage rus;
  47.   getrusage (0, &rus);
  48.   return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
  49. }
  50. #endif
  51. static void mpn_print (mp_ptr, mp_size_t);
  52. #define M * 1000000
  53. #ifndef CLOCK
  54. #error "Don't know CLOCK of your machine"
  55. #endif
  56. #ifndef OPS
  57. #define OPS (CLOCK/5)
  58. #endif
  59. #ifndef SIZE
  60. #define SIZE 496
  61. #endif
  62. #ifndef TIMES
  63. #define TIMES OPS/(SIZE+1)
  64. #endif
  65. #ifndef CNT
  66. int CNT = 4;
  67. #endif
  68. int
  69. main (int argc, char **argv)
  70. {
  71.   mp_ptr s1, dx, dy;
  72.   mp_limb_t cyx, cyy;
  73.   int i;
  74.   long t0, t;
  75.   unsigned int test;
  76.   int cnt = CNT;
  77.   mp_size_t size;
  78.   unsigned int ntests;
  79.   s1 = malloc (SIZE * sizeof (mp_limb_t));
  80.   dx = malloc ((SIZE + 2) * sizeof (mp_limb_t));
  81.   dy = malloc ((SIZE + 2) * sizeof (mp_limb_t));
  82.   ntests = ~(unsigned) 0;
  83.   if (argc == 2)
  84.     ntests = strtol (argv[1], 0, 0);
  85.   for (test = 1; test <= ntests; test++)
  86.     {
  87. #if TIMES == 1 && ! defined (PRINT)
  88.       if (test % (SIZE > 100000 ? 1 : 100000 / SIZE) == 0)
  89. {
  90.   printf ("r%u", test);
  91.   fflush (stdout);
  92. }
  93. #endif
  94. #if TIMES == 1
  95.       cnt = random () % (GMP_NUMB_BITS - 1) + 1;
  96. #endif
  97. #ifdef RANDOM
  98.       size = random () % SIZE + 1;
  99. #else
  100.       size = SIZE;
  101. #endif
  102.       dx[0] = 0x87654321;
  103.       dy[0] = 0x87654321;
  104.       dx[size+1] = 0x12345678;
  105.       dy[size+1] = 0x12345678;
  106. #if TIMES != 1
  107.       mpn_random (s1, size);
  108.       t0 = cputime();
  109.       for (i = 0; i < TIMES; i++)
  110. func (dx+1, s1, size, cnt);
  111.       t = cputime() - t0;
  112.       printf (funcname ":    %5ldms (%.3f cycles/limb)n",
  113.       t, ((double) t * CLOCK) / (TIMES * size * 1000.0));
  114. #endif
  115. #ifndef NOCHECK
  116.       mpn_random (s1, size);
  117. #ifdef PRINT
  118.       printf ("cnt=%-*d ", (int) (2 * sizeof(mp_limb_t)) - 4, cnt);
  119.       mpn_print (s1, size);
  120. #endif
  121.       /* Put garbage in the destination.  */
  122.       for (i = 0; i < size; i++)
  123. {
  124.   dx[i+1] = 0xdead;
  125.   dy[i+1] = 0xbeef;
  126. }
  127.       cyx = reffunc (dx+1, s1, size, cnt);
  128.       cyy = func (dy+1, s1, size, cnt);
  129. #ifdef PRINT
  130.       mpn_print (&cyx, 1);
  131.       mpn_print (dx+1, size);
  132.       mpn_print (&cyy, 1);
  133.       mpn_print (dy+1, size);
  134. #endif
  135.       if (cyx != cyy || mpn_cmp (dx, dy, size+2) != 0
  136.   || dx[0] != 0x87654321 || dx[size+1] != 0x12345678)
  137. {
  138. #ifndef PRINT
  139.   mpn_print (&cyx, 1);
  140.   mpn_print (dx+1, size);
  141.   mpn_print (&cyy, 1);
  142.   mpn_print (dy+1, size);
  143. #endif
  144.   printf ("n");
  145.   if (dy[0] != 0x87654321)
  146.     printf ("clobbered at low endn");
  147.   if (dy[size+1] != 0x12345678)
  148.     printf ("clobbered at high endn");
  149.   printf ("TEST NUMBER %un", test);
  150.   abort();
  151. }
  152. #endif
  153.     }
  154.   exit (0);
  155. }
  156. static void
  157. mpn_print (mp_ptr p, mp_size_t size)
  158. {
  159.   mp_size_t i;
  160.   for (i = size - 1; i >= 0; i--)
  161.     {
  162. #ifdef _LONG_LONG_LIMB
  163.       printf ("%0*lX%0*lX", (int) (sizeof(mp_limb_t)),
  164.       (unsigned long) (p[i] >> (GMP_LIMB_BITS/2)),
  165.       (int) (sizeof(mp_limb_t)), (unsigned long) (p[i]));
  166. #else
  167.       printf ("%0*lX", (int) (2 * sizeof(mp_limb_t)), p[i]);
  168. #endif
  169. #ifdef SPACE
  170.       if (i != 0)
  171. printf (" ");
  172. #endif
  173.     }
  174.   puts ("");
  175. }