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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpn_add_1 and mpn_sub_1.
  2. Copyright 2001, 2002 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 <stdio.h>
  15. #include <stdlib.h>
  16. #include "gmp.h"
  17. #include "gmp-impl.h"
  18. #include "tests.h"
  19. #define M      GMP_NUMB_MAX
  20. #define ASIZE  10
  21. #define MAGIC  0x1234
  22. #define SETUP()                         
  23.   do {                                  
  24.     refmpn_random (got, data[i].size);  
  25.     got[data[i].size] = MAGIC;          
  26.   } while (0)
  27. #define SETUP_INPLACE()                                 
  28.   do {                                                  
  29.     refmpn_copyi (got, data[i].src, data[i].size);      
  30.     got[data[i].size] = MAGIC;                          
  31.   } while (0)
  32. #define VERIFY(name)                            
  33.   do {                                          
  34.     verify (name, i, data[i].src, data[i].n,    
  35.             got_c, data[i].want_c,              
  36.             got, data[i].want, data[i].size);   
  37.   } while (0)
  38. typedef mp_limb_t (*mpn_aors_1_t)
  39.      __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
  40. mpn_aors_1_t fudge __GMP_PROTO ((mpn_aors_1_t));
  41. void
  42. verify (const char *name, int i,
  43.         mp_srcptr src, mp_limb_t n,
  44.         mp_limb_t got_c, mp_limb_t want_c,
  45.         mp_srcptr got, mp_srcptr want, mp_size_t size)
  46. {
  47.   if (got[size] != MAGIC)
  48.     {
  49.       printf ("Overwrite at %s i=%dn", name, i);
  50.       abort ();
  51.     }
  52.   if (got_c != want_c || ! refmpn_equal_anynail (got, want, size))
  53.     {
  54.       printf ("Wrong at %s i=%d size=%ldn", name, i, size);
  55.       mpn_trace ("   src", src,  size);
  56.       mpn_trace ("     n", &n,   (mp_size_t) 1);
  57.       mpn_trace ("   got", got,  size);
  58.       mpn_trace ("  want", want, size);
  59.       mpn_trace (" got c", &got_c,  (mp_size_t) 1);
  60.       mpn_trace ("want c", &want_c, (mp_size_t) 1);
  61.       abort ();
  62.     }
  63. }
  64. void
  65. check_add_1 (void)
  66. {
  67.   static const struct {
  68.     mp_size_t        size;
  69.     mp_limb_t        n;
  70.     const mp_limb_t  src[ASIZE];
  71.     mp_limb_t        want_c;
  72.     const mp_limb_t  want[ASIZE];
  73.   } data[] = {
  74.     { 1, 0, { 0 },  0, { 0 } },
  75.     { 1, 0, { 1 },  0, { 1 } },
  76.     { 1, 1, { 0 },  0, { 1 } },
  77.     { 1, 0, { M },  0, { M } },
  78.     { 1, M, { 0 },  0, { M } },
  79.     { 1, 1, { 123 }, 0, { 124 } },
  80.     { 1, 1, { M },  1, { 0 } },
  81.     { 1, M, { 1 },  1, { 0 } },
  82.     { 1, M, { M },  1, { M-1 } },
  83.     { 2, 0, { 0, 0 },  0, { 0, 0 } },
  84.     { 2, 0, { 1, 0 },  0, { 1, 0 } },
  85.     { 2, 1, { 0, 0 },  0, { 1, 0 } },
  86.     { 2, 0, { M, 0 },  0, { M, 0 } },
  87.     { 2, M, { 0, 0 },  0, { M, 0 } },
  88.     { 2, 1, { M, 0 },  0, { 0, 1 } },
  89.     { 2, M, { 1, 0 },  0, { 0, 1 } },
  90.     { 2, M, { M, 0 },  0, { M-1, 1 } },
  91.     { 2, M, { M, 0 },  0, { M-1, 1 } },
  92.     { 2, 1, { M, M },  1, { 0, 0 } },
  93.     { 2, M, { 1, M },  1, { 0, 0 } },
  94.     { 2, M, { M, M },  1, { M-1, 0 } },
  95.     { 2, M, { M, M },  1, { M-1, 0 } },
  96.     { 3, 1, { M, M, M },  1, { 0, 0, 0 } },
  97.     { 3, M, { 1, M, M },  1, { 0, 0, 0 } },
  98.     { 3, M, { M, M, M },  1, { M-1, 0, 0 } },
  99.     { 3, M, { M, M, M },  1, { M-1, 0, 0 } },
  100.     { 4, 1, { M, M, M, M },  1, { 0, 0, 0, 0 } },
  101.     { 4, M, { 1, M, M, M },  1, { 0, 0, 0, 0 } },
  102.     { 4, M, { M, M, M, M },  1, { M-1, 0, 0, 0 } },
  103.     { 4, M, { M, M, M, M },  1, { M-1, 0, 0, 0 } },
  104.     { 4, M, { M, 0,   M, M },  0, { M-1, 1, M, M } },
  105.     { 4, M, { M, M-1, M, M },  0, { M-1, M, M, M } },
  106.     { 4, M, { M, M, 0,   M },  0, { M-1, 0, 1, M } },
  107.     { 4, M, { M, M, M-1, M },  0, { M-1, 0, M, M } },
  108.   };
  109.   mp_limb_t  got[ASIZE];
  110.   mp_limb_t  got_c;
  111.   int        i;
  112.   for (i = 0; i < numberof (data); i++)
  113.     {
  114.       SETUP ();
  115.       got_c = mpn_add_1 (got, data[i].src, data[i].size, data[i].n);
  116.       VERIFY ("check_add_1 (separate)");
  117.       SETUP_INPLACE ();
  118.       got_c = mpn_add_1 (got, got, data[i].size, data[i].n);
  119.       VERIFY ("check_add_1 (in-place)");
  120.       if (data[i].n == 1)
  121.         {
  122.           SETUP ();
  123.           got_c = mpn_add_1 (got, data[i].src, data[i].size, CNST_LIMB(1));
  124.           VERIFY ("check_add_1 (separate, const 1)");
  125.           SETUP_INPLACE ();
  126.           got_c = mpn_add_1 (got, got, data[i].size, CNST_LIMB(1));
  127.           VERIFY ("check_add_1 (in-place, const 1)");
  128.         }
  129.       /* Same again on functions, not inlines. */
  130.       SETUP ();
  131.       got_c = (*fudge(mpn_add_1)) (got, data[i].src, data[i].size, data[i].n);
  132.       VERIFY ("check_add_1 (function, separate)");
  133.       SETUP_INPLACE ();
  134.       got_c = (*fudge(mpn_add_1)) (got, got, data[i].size, data[i].n);
  135.       VERIFY ("check_add_1 (function, in-place)");
  136.     }
  137. }
  138. void
  139. check_sub_1 (void)
  140. {
  141.   static const struct {
  142.     mp_size_t        size;
  143.     mp_limb_t        n;
  144.     const mp_limb_t  src[ASIZE];
  145.     mp_limb_t        want_c;
  146.     const mp_limb_t  want[ASIZE];
  147.   } data[] = {
  148.     { 1, 0, { 0 },  0, { 0 } },
  149.     { 1, 0, { 1 },  0, { 1 } },
  150.     { 1, 1, { 1 },  0, { 0 } },
  151.     { 1, 0, { M },  0, { M } },
  152.     { 1, 1, { M },  0, { M-1 } },
  153.     { 1, 1, { 123 }, 0, { 122 } },
  154.     { 1, 1, { 0 },  1, { M } },
  155.     { 1, M, { 0 },  1, { 1 } },
  156.     { 2, 0, { 0, 0 },  0, { 0, 0 } },
  157.     { 2, 0, { 1, 0 },  0, { 1, 0 } },
  158.     { 2, 1, { 1, 0 },  0, { 0, 0 } },
  159.     { 2, 0, { M, 0 },  0, { M, 0 } },
  160.     { 2, 1, { M, 0 },  0, { M-1, 0 } },
  161.     { 2, 1, { 123, 0 }, 0, { 122, 0 } },
  162.     { 2, 1, { 0, 0 },  1, { M, M } },
  163.     { 2, M, { 0, 0 },  1, { 1, M } },
  164.     { 3, 0, { 0,   0, 0 },  0, { 0,   0, 0 } },
  165.     { 3, 0, { 123, 0, 0 },  0, { 123, 0, 0 } },
  166.     { 3, 1, { 0, 0, 0 },  1, { M, M, M } },
  167.     { 3, M, { 0, 0, 0 },  1, { 1, M, M } },
  168.     { 4, 1, { 0, 0, 0, 0 },  1, { M, M, M, M } },
  169.     { 4, M, { 0, 0, 0, 0 },  1, { 1, M, M, M } },
  170.     { 4, 1, { 0, 0, 1,   42 },  0, { M, M, 0,   42 } },
  171.     { 4, M, { 0, 0, 123, 24 },  0, { 1, M, 122, 24 } },
  172.   };
  173.   mp_limb_t  got[ASIZE];
  174.   mp_limb_t  got_c;
  175.   int        i;
  176.   for (i = 0; i < numberof (data); i++)
  177.     {
  178.       SETUP ();
  179.       got_c = mpn_sub_1 (got, data[i].src, data[i].size, data[i].n);
  180.       VERIFY ("check_sub_1 (separate)");
  181.       SETUP_INPLACE ();
  182.       got_c = mpn_sub_1 (got, got, data[i].size, data[i].n);
  183.       VERIFY ("check_sub_1 (in-place)");
  184.       if (data[i].n == 1)
  185.         {
  186.           SETUP ();
  187.           got_c = mpn_sub_1 (got, data[i].src, data[i].size, CNST_LIMB(1));
  188.           VERIFY ("check_sub_1 (separate, const 1)");
  189.           SETUP_INPLACE ();
  190.           got_c = mpn_sub_1 (got, got, data[i].size, CNST_LIMB(1));
  191.           VERIFY ("check_sub_1 (in-place, const 1)");
  192.         }
  193.       /* Same again on functions, not inlines. */
  194.       SETUP ();
  195.       got_c = (*fudge(mpn_sub_1)) (got, data[i].src, data[i].size, data[i].n);
  196.       VERIFY ("check_sub_1 (function, separate)");
  197.       SETUP_INPLACE ();
  198.       got_c = (*fudge(mpn_sub_1)) (got, got, data[i].size, data[i].n);
  199.       VERIFY ("check_sub_1 (function, in-place)");
  200.     }
  201. }
  202. /* Try to prevent the optimizer inlining. */
  203. mpn_aors_1_t
  204. fudge (mpn_aors_1_t f)
  205. {
  206.   return f;
  207. }
  208. int
  209. main (void)
  210. {
  211.   tests_start ();
  212.   mp_trace_base = -16;
  213.   check_add_1 ();
  214.   check_sub_1 ();
  215.   tests_end ();
  216.   exit (0);
  217. }