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

数学计算

开发平台:

Unix_Linux

  1. /* Test assembler support for --enable-profiling=instrument.
  2. Copyright 2002, 2003 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 "longlong.h"
  19. #include "tests.h"
  20. #if WANT_PROFILING_INSTRUMENT
  21. /* This program exercises each mpn routine that might be implemented in
  22.    assembler.  It ensures the __cyg_profile_func_enter and exit calls have
  23.    come out right, and that in the x86 code "ret_internal" is correctly used
  24.    for PIC setups.  */
  25. /* Changes to enter_seen done by __cyg_profile_func_enter are essentially
  26.    unknown to the optimizer, so must use volatile.  */
  27. volatile int  enter_seen;
  28. /* Dummy used to stop various calls going dead. */
  29. unsigned long  notdead;
  30. const char     *name = "<none>";
  31. int  old_ncall;
  32. struct {
  33.   void  *this_fn;
  34.   void  *call_site;
  35. } call[100];
  36. int  ncall;
  37. void __cyg_profile_func_enter __GMP_PROTO ((void *this_fn, void *call_site))
  38.      __attribute__ ((no_instrument_function));
  39. void
  40. __cyg_profile_func_enter (void *this_fn, void *call_site)
  41. {
  42. #if 0
  43.   printf ("%24s %p %pn", name, this_fn, call_site);
  44. #endif
  45.   ASSERT_ALWAYS (ncall >= 0);
  46.   ASSERT_ALWAYS (ncall <= numberof (call));
  47.   if (ncall >= numberof (call))
  48.     {
  49.       printf ("__cyg_profile_func_enter: oops, call stack full, from %sn", name);
  50.       abort ();
  51.     }
  52.   enter_seen = 1;
  53.   call[ncall].this_fn = this_fn;
  54.   call[ncall].call_site = call_site;
  55.   ncall++;
  56. }
  57. void __cyg_profile_func_exit __GMP_PROTO ((void *this_fn, void *call_site))
  58.      __attribute__ ((no_instrument_function));
  59. void
  60. __cyg_profile_func_exit  (void *this_fn, void *call_site)
  61. {
  62.   ASSERT_ALWAYS (ncall >= 0);
  63.   ASSERT_ALWAYS (ncall <= numberof (call));
  64.   if (ncall == 0)
  65.     {
  66.       printf ("__cyg_profile_func_exit: call stack empty, from %sn", name);
  67.       abort ();
  68.     }
  69.   ncall--;
  70.   if (this_fn != call[ncall].this_fn || call_site != call[ncall].call_site)
  71.     {
  72.       printf ("__cyg_profile_func_exit: unbalanced this_fn/call_site from %sn", name);
  73.       printf ("  this_fn got  %pn", this_fn);
  74.       printf ("          want %pn", call[ncall].this_fn);
  75.       printf ("  call_site got  %pn", call_site);
  76.       printf ("            want %pn", call[ncall].call_site);
  77.       abort ();
  78.     }
  79. }
  80. void
  81. pre (const char *str)
  82. {
  83.   name = str;
  84.   enter_seen = 0;
  85.   old_ncall = ncall;
  86. }
  87. void
  88. post (void)
  89. {
  90.   if (! enter_seen)
  91.     {
  92.       printf ("did not reach __cyg_profile_func_enter from %sn", name);
  93.       abort ();
  94.     }
  95.   if (ncall != old_ncall)
  96.     {
  97.       printf ("unbalance enter/exit calls from %sn", name);
  98.       printf ("  ncall     %dn", ncall);
  99.       printf ("  old_ncall %dn", old_ncall);
  100.       abort ();
  101.     }
  102. }
  103. void
  104. check (void)
  105. {
  106.   mp_limb_t  wp[100], xp[100], yp[100];
  107.   mp_size_t  size = 100;
  108.   refmpn_zero (xp, size);
  109.   refmpn_zero (yp, size);
  110.   refmpn_zero (wp, size);
  111.   pre ("mpn_add_n");
  112.   mpn_add_n (wp, xp, yp, size);
  113.   post ();
  114. #if HAVE_NATIVE_mpn_add_nc
  115.   pre ("mpn_add_nc");
  116.   mpn_add_nc (wp, xp, yp, size, CNST_LIMB(0));
  117.   post ();
  118. #endif
  119. #if HAVE_NATIVE_mpn_addlsh1_n
  120.   pre ("mpn_addlsh1_n");
  121.   mpn_addlsh1_n (wp, xp, yp, size);
  122.   post ();
  123. #endif
  124. #if HAVE_NATIVE_mpn_and_n
  125.   pre ("mpn_and_n");
  126.   mpn_and_n (wp, xp, yp, size);
  127.   post ();
  128. #endif
  129. #if HAVE_NATIVE_mpn_andn_n
  130.   pre ("mpn_andn_n");
  131.   mpn_andn_n (wp, xp, yp, size);
  132.   post ();
  133. #endif
  134.   pre ("mpn_addmul_1");
  135.   mpn_addmul_1 (wp, xp, size, yp[0]);
  136.   post ();
  137. #if HAVE_NATIVE_mpn_addmul_1c
  138.   pre ("mpn_addmul_1c");
  139.   mpn_addmul_1c (wp, xp, size, yp[0], CNST_LIMB(0));
  140.   post ();
  141. #endif
  142. #if HAVE_NATIVE_mpn_com
  143.   pre ("mpn_com");
  144.   mpn_com (wp, xp, size);
  145.   post ();
  146. #endif
  147. #if HAVE_NATIVE_mpn_copyd
  148.   pre ("mpn_copyd");
  149.   mpn_copyd (wp, xp, size);
  150.   post ();
  151. #endif
  152. #if HAVE_NATIVE_mpn_copyi
  153.   pre ("mpn_copyi");
  154.   mpn_copyi (wp, xp, size);
  155.   post ();
  156. #endif
  157.   pre ("mpn_divexact_1");
  158.   mpn_divexact_1 (wp, xp, size, CNST_LIMB(123));
  159.   post ();
  160.   pre ("mpn_divexact_by3c");
  161.   mpn_divexact_by3c (wp, xp, size, CNST_LIMB(0));
  162.   post ();
  163.   pre ("mpn_divrem_1");
  164.   mpn_divrem_1 (wp, (mp_size_t) 0, xp, size, CNST_LIMB(123));
  165.   post ();
  166. #if HAVE_NATIVE_mpn_divrem_1c
  167.   pre ("mpn_divrem_1c");
  168.   mpn_divrem_1c (wp, (mp_size_t) 0, xp, size, CNST_LIMB(123), CNST_LIMB(122));
  169.   post ();
  170. #endif
  171.   pre ("mpn_gcd_1");
  172.   xp[0] |= 1;
  173.   notdead += (unsigned long) mpn_gcd_1 (xp, size, CNST_LIMB(123));
  174.   post ();
  175.   pre ("mpn_hamdist");
  176.   notdead += mpn_hamdist (xp, yp, size);
  177.   post ();
  178. #if HAVE_NATIVE_mpn_ior_n
  179.   pre ("mpn_ior_n");
  180.   mpn_ior_n (wp, xp, yp, size);
  181.   post ();
  182. #endif
  183. #if HAVE_NATIVE_mpn_iorn_n
  184.   pre ("mpn_iorn_n");
  185.   mpn_iorn_n (wp, xp, yp, size);
  186.   post ();
  187. #endif
  188.   pre ("mpn_lshift");
  189.   mpn_lshift (wp, xp, size, 1);
  190.   post ();
  191.   pre ("mpn_mod_1");
  192.   notdead += mpn_mod_1 (xp, size, CNST_LIMB(123));
  193.   post ();
  194. #if HAVE_NATIVE_mpn_mod_1c
  195.   pre ("mpn_mod_1c");
  196.   notdead += mpn_mod_1c (xp, size, CNST_LIMB(123), CNST_LIMB(122));
  197.   post ();
  198. #endif
  199. #if GMP_NUMB_BITS % 4 == 0
  200.   pre ("mpn_mod_34lsub1");
  201.   notdead += mpn_mod_34lsub1 (xp, size);
  202.   post ();
  203. #endif
  204.   pre ("mpn_modexact_1_odd");
  205.   notdead += mpn_modexact_1_odd (xp, size, CNST_LIMB(123));
  206.   post ();
  207.   pre ("mpn_modexact_1c_odd");
  208.   notdead += mpn_modexact_1c_odd (xp, size, CNST_LIMB(123), CNST_LIMB(456));
  209.   post ();
  210.   pre ("mpn_mul_1");
  211.   mpn_mul_1 (wp, xp, size, yp[0]);
  212.   post ();
  213. #if HAVE_NATIVE_mpn_mul_1c
  214.   pre ("mpn_mul_1c");
  215.   mpn_mul_1c (wp, xp, size, yp[0], CNST_LIMB(0));
  216.   post ();
  217. #endif
  218. #if HAVE_NATIVE_mpn_mul_2
  219.   pre ("mpn_mul_2");
  220.   mpn_mul_2 (wp, xp, size-1, yp);
  221.   post ();
  222. #endif
  223.   pre ("mpn_mul_basecase");
  224.   mpn_mul_basecase (wp, xp, (mp_size_t) 3, yp, (mp_size_t) 3);
  225.   post ();
  226. #if HAVE_NATIVE_mpn_nand_n
  227.   pre ("mpn_nand_n");
  228.   mpn_nand_n (wp, xp, yp, size);
  229.   post ();
  230. #endif
  231. #if HAVE_NATIVE_mpn_nior_n
  232.   pre ("mpn_nior_n");
  233.   mpn_nior_n (wp, xp, yp, size);
  234.   post ();
  235. #endif
  236.   pre ("mpn_popcount");
  237.   notdead += mpn_popcount (xp, size);
  238.   post ();
  239.   pre ("mpn_preinv_mod_1");
  240.   notdead += mpn_preinv_mod_1 (xp, size, GMP_NUMB_MAX,
  241.                                refmpn_invert_limb (GMP_NUMB_MAX));
  242.   post ();
  243. #if USE_PREINV_DIVREM_1 || HAVE_NATIVE_mpn_preinv_divrem_1
  244.   pre ("mpn_preinv_divrem_1");
  245.   mpn_preinv_divrem_1 (wp, (mp_size_t) 0, xp, size, GMP_NUMB_MAX,
  246.                        refmpn_invert_limb (GMP_NUMB_MAX), 0);
  247.   post ();
  248. #endif
  249. #if HAVE_NATIVE_mpn_rsh1add_n
  250.   pre ("mpn_rsh1add_n");
  251.   mpn_rsh1add_n (wp, xp, yp, size);
  252.   post ();
  253. #endif
  254. #if HAVE_NATIVE_mpn_rsh1sub_n
  255.   pre ("mpn_rsh1sub_n");
  256.   mpn_rsh1sub_n (wp, xp, yp, size);
  257.   post ();
  258. #endif
  259.   pre ("mpn_rshift");
  260.   mpn_rshift (wp, xp, size, 1);
  261.   post ();
  262.   pre ("mpn_sqr_basecase");
  263.   mpn_sqr_basecase (wp, xp, (mp_size_t) 3);
  264.   post ();
  265.   pre ("mpn_submul_1");
  266.   mpn_submul_1 (wp, xp, size, yp[0]);
  267.   post ();
  268. #if HAVE_NATIVE_mpn_submul_1c
  269.   pre ("mpn_submul_1c");
  270.   mpn_submul_1c (wp, xp, size, yp[0], CNST_LIMB(0));
  271.   post ();
  272. #endif
  273.   pre ("mpn_sub_n");
  274.   mpn_sub_n (wp, xp, yp, size);
  275.   post ();
  276. #if HAVE_NATIVE_mpn_sub_nc
  277.   pre ("mpn_sub_nc");
  278.   mpn_sub_nc (wp, xp, yp, size, CNST_LIMB(0));
  279.   post ();
  280. #endif
  281. #if HAVE_NATIVE_mpn_sublsh1_n
  282.   pre ("mpn_sublsh1_n");
  283.   mpn_sublsh1_n (wp, xp, yp, size);
  284.   post ();
  285. #endif
  286. #if HAVE_NATIVE_mpn_udiv_qrnnd
  287.   pre ("mpn_udiv_qrnnd");
  288.   mpn_udiv_qrnnd (&wp[0], CNST_LIMB(122), xp[0], CNST_LIMB(123));
  289.   post ();
  290. #endif
  291. #if HAVE_NATIVE_mpn_udiv_qrnnd_r
  292.   pre ("mpn_udiv_qrnnd_r");
  293.   mpn_udiv_qrnnd (CNST_LIMB(122), xp[0], CNST_LIMB(123), &wp[0]);
  294.   post ();
  295. #endif
  296. #if HAVE_NATIVE_mpn_umul_ppmm
  297.   pre ("mpn_umul_ppmm");
  298.   mpn_umul_ppmm (&wp[0], xp[0], yp[0]);
  299.   post ();
  300. #endif
  301. #if HAVE_NATIVE_mpn_umul_ppmm_r
  302.   pre ("mpn_umul_ppmm_r");
  303.   mpn_umul_ppmm_r (&wp[0], xp[0], yp[0]);
  304.   post ();
  305. #endif
  306. #if HAVE_NATIVE_mpn_xor_n
  307.   pre ("mpn_xor_n");
  308.   mpn_xor_n (wp, xp, yp, size);
  309.   post ();
  310. #endif
  311. #if HAVE_NATIVE_mpn_xnor_n
  312.   pre ("mpn_xnor_n");
  313.   mpn_xnor_n (wp, xp, yp, size);
  314.   post ();
  315. #endif
  316. }
  317. int
  318. main (void)
  319. {
  320.   tests_start ();
  321.   check ();
  322.   tests_end ();
  323.   exit (0);
  324. }
  325. #else /* ! WANT_PROFILING_INSTRUMENT */
  326. int
  327. main (void)
  328. {
  329.   exit (0);
  330. }
  331. #endif