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

数学计算

开发平台:

Unix_Linux

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