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

数学计算

开发平台:

Unix_Linux

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