Blame tests/mpn/t-instrument.c

Packit 5c3484
/* Test assembler support for --enable-profiling=instrument.
Packit 5c3484
Packit 5c3484
Copyright 2002, 2003 Free Software Foundation, Inc.
Packit 5c3484
Packit 5c3484
This file is part of the GNU MP Library test suite.
Packit 5c3484
Packit 5c3484
The GNU MP Library test suite is free software; you can redistribute it
Packit 5c3484
and/or modify it under the terms of the GNU General Public License as
Packit 5c3484
published by the Free Software Foundation; either version 3 of the License,
Packit 5c3484
or (at your option) any later version.
Packit 5c3484
Packit 5c3484
The GNU MP Library test suite is distributed in the hope that it will be
Packit 5c3484
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5c3484
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
Packit 5c3484
Public License for more details.
Packit 5c3484
Packit 5c3484
You should have received a copy of the GNU General Public License along with
Packit 5c3484
the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
Packit 5c3484
Packit 5c3484
#include <stdio.h>
Packit 5c3484
#include <stdlib.h>
Packit 5c3484
#include "gmp.h"
Packit 5c3484
#include "gmp-impl.h"
Packit 5c3484
#include "longlong.h"
Packit 5c3484
#include "tests.h"
Packit 5c3484
Packit 5c3484
Packit 5c3484
#if WANT_PROFILING_INSTRUMENT
Packit 5c3484
Packit 5c3484
/* This program exercises each mpn routine that might be implemented in
Packit 5c3484
   assembler.  It ensures the __cyg_profile_func_enter and exit calls have
Packit 5c3484
   come out right, and that in the x86 code "ret_internal" is correctly used
Packit 5c3484
   for PIC setups.  */
Packit 5c3484
Packit 5c3484
Packit 5c3484
/* Changes to enter_seen done by __cyg_profile_func_enter are essentially
Packit 5c3484
   unknown to the optimizer, so must use volatile.  */
Packit 5c3484
volatile int  enter_seen;
Packit 5c3484
Packit 5c3484
/* Dummy used to stop various calls going dead. */
Packit 5c3484
unsigned long  notdead;
Packit 5c3484
Packit 5c3484
const char     *name = "<none>";
Packit 5c3484
int  old_ncall;
Packit 5c3484
Packit 5c3484
struct {
Packit 5c3484
  void  *this_fn;
Packit 5c3484
  void  *call_site;
Packit 5c3484
} call[100];
Packit 5c3484
int  ncall;
Packit 5c3484
Packit 5c3484
Packit 5c3484
void __cyg_profile_func_enter (void *, void *)
Packit 5c3484
  __attribute__ ((no_instrument_function));
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
__cyg_profile_func_enter (void *this_fn, void *call_site)
Packit 5c3484
{
Packit 5c3484
#if 0
Packit 5c3484
  printf ("%24s %p %p\n", name, this_fn, call_site);
Packit 5c3484
#endif
Packit 5c3484
  ASSERT_ALWAYS (ncall >= 0);
Packit 5c3484
  ASSERT_ALWAYS (ncall <= numberof (call));
Packit 5c3484
Packit 5c3484
  if (ncall >= numberof (call))
Packit 5c3484
    {
Packit 5c3484
      printf ("__cyg_profile_func_enter: oops, call stack full, from %s\n", name);
Packit 5c3484
      abort ();
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  enter_seen = 1;
Packit 5c3484
  call[ncall].this_fn = this_fn;
Packit 5c3484
  call[ncall].call_site = call_site;
Packit 5c3484
  ncall++;
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
void __cyg_profile_func_exit (void *, void *)
Packit 5c3484
  __attribute__ ((no_instrument_function));
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
__cyg_profile_func_exit  (void *this_fn, void *call_site)
Packit 5c3484
{
Packit 5c3484
  ASSERT_ALWAYS (ncall >= 0);
Packit 5c3484
  ASSERT_ALWAYS (ncall <= numberof (call));
Packit 5c3484
Packit 5c3484
  if (ncall == 0)
Packit 5c3484
    {
Packit 5c3484
      printf ("__cyg_profile_func_exit: call stack empty, from %s\n", name);
Packit 5c3484
      abort ();
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  ncall--;
Packit 5c3484
  if (this_fn != call[ncall].this_fn || call_site != call[ncall].call_site)
Packit 5c3484
    {
Packit 5c3484
      printf ("__cyg_profile_func_exit: unbalanced this_fn/call_site from %s\n", name);
Packit 5c3484
      printf ("  this_fn got  %p\n", this_fn);
Packit 5c3484
      printf ("          want %p\n", call[ncall].this_fn);
Packit 5c3484
      printf ("  call_site got  %p\n", call_site);
Packit 5c3484
      printf ("            want %p\n", call[ncall].call_site);
Packit 5c3484
      abort ();
Packit 5c3484
    }
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
pre (const char *str)
Packit 5c3484
{
Packit 5c3484
  name = str;
Packit 5c3484
  enter_seen = 0;
Packit 5c3484
  old_ncall = ncall;
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
post (void)
Packit 5c3484
{
Packit 5c3484
  if (! enter_seen)
Packit 5c3484
    {
Packit 5c3484
      printf ("did not reach __cyg_profile_func_enter from %s\n", name);
Packit 5c3484
      abort ();
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  if (ncall != old_ncall)
Packit 5c3484
    {
Packit 5c3484
      printf ("unbalance enter/exit calls from %s\n", name);
Packit 5c3484
      printf ("  ncall     %d\n", ncall);
Packit 5c3484
      printf ("  old_ncall %d\n", old_ncall);
Packit 5c3484
      abort ();
Packit 5c3484
    }
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
check (void)
Packit 5c3484
{
Packit 5c3484
  mp_limb_t  wp[100], xp[100], yp[100];
Packit 5c3484
  mp_size_t  size = 100;
Packit 5c3484
Packit 5c3484
  refmpn_zero (xp, size);
Packit 5c3484
  refmpn_zero (yp, size);
Packit 5c3484
  refmpn_zero (wp, size);
Packit 5c3484
Packit 5c3484
  pre ("mpn_add_n");
Packit 5c3484
  mpn_add_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_add_nc
Packit 5c3484
  pre ("mpn_add_nc");
Packit 5c3484
  mpn_add_nc (wp, xp, yp, size, CNST_LIMB(0));
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_addlsh1_n
Packit 5c3484
  pre ("mpn_addlsh1_n");
Packit 5c3484
  mpn_addlsh1_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_and_n
Packit 5c3484
  pre ("mpn_and_n");
Packit 5c3484
  mpn_and_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_andn_n
Packit 5c3484
  pre ("mpn_andn_n");
Packit 5c3484
  mpn_andn_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
  pre ("mpn_addmul_1");
Packit 5c3484
  mpn_addmul_1 (wp, xp, size, yp[0]);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_addmul_1c
Packit 5c3484
  pre ("mpn_addmul_1c");
Packit 5c3484
  mpn_addmul_1c (wp, xp, size, yp[0], CNST_LIMB(0));
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_com
Packit 5c3484
  pre ("mpn_com");
Packit 5c3484
  mpn_com (wp, xp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_copyd
Packit 5c3484
  pre ("mpn_copyd");
Packit 5c3484
  mpn_copyd (wp, xp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_copyi
Packit 5c3484
  pre ("mpn_copyi");
Packit 5c3484
  mpn_copyi (wp, xp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
  pre ("mpn_divexact_1");
Packit 5c3484
  mpn_divexact_1 (wp, xp, size, CNST_LIMB(123));
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
  pre ("mpn_divexact_by3c");
Packit 5c3484
  mpn_divexact_by3c (wp, xp, size, CNST_LIMB(0));
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
  pre ("mpn_divrem_1");
Packit 5c3484
  mpn_divrem_1 (wp, (mp_size_t) 0, xp, size, CNST_LIMB(123));
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_divrem_1c
Packit 5c3484
  pre ("mpn_divrem_1c");
Packit 5c3484
  mpn_divrem_1c (wp, (mp_size_t) 0, xp, size, CNST_LIMB(123), CNST_LIMB(122));
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
  pre ("mpn_gcd_1");
Packit 5c3484
  xp[0] |= 1;
Packit 5c3484
  notdead += (unsigned long) mpn_gcd_1 (xp, size, CNST_LIMB(123));
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
  pre ("mpn_hamdist");
Packit 5c3484
  notdead += mpn_hamdist (xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_ior_n
Packit 5c3484
  pre ("mpn_ior_n");
Packit 5c3484
  mpn_ior_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_iorn_n
Packit 5c3484
  pre ("mpn_iorn_n");
Packit 5c3484
  mpn_iorn_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
  pre ("mpn_lshift");
Packit 5c3484
  mpn_lshift (wp, xp, size, 1);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
  pre ("mpn_mod_1");
Packit 5c3484
  notdead += mpn_mod_1 (xp, size, CNST_LIMB(123));
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_mod_1c
Packit 5c3484
  pre ("mpn_mod_1c");
Packit 5c3484
  notdead += mpn_mod_1c (xp, size, CNST_LIMB(123), CNST_LIMB(122));
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if GMP_NUMB_BITS % 4 == 0
Packit 5c3484
  pre ("mpn_mod_34lsub1");
Packit 5c3484
  notdead += mpn_mod_34lsub1 (xp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
  pre ("mpn_modexact_1_odd");
Packit 5c3484
  notdead += mpn_modexact_1_odd (xp, size, CNST_LIMB(123));
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
  pre ("mpn_modexact_1c_odd");
Packit 5c3484
  notdead += mpn_modexact_1c_odd (xp, size, CNST_LIMB(123), CNST_LIMB(456));
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
  pre ("mpn_mul_1");
Packit 5c3484
  mpn_mul_1 (wp, xp, size, yp[0]);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_mul_1c
Packit 5c3484
  pre ("mpn_mul_1c");
Packit 5c3484
  mpn_mul_1c (wp, xp, size, yp[0], CNST_LIMB(0));
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_mul_2
Packit 5c3484
  pre ("mpn_mul_2");
Packit 5c3484
  mpn_mul_2 (wp, xp, size-1, yp);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
  pre ("mpn_mul_basecase");
Packit 5c3484
  mpn_mul_basecase (wp, xp, (mp_size_t) 3, yp, (mp_size_t) 3);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_nand_n
Packit 5c3484
  pre ("mpn_nand_n");
Packit 5c3484
  mpn_nand_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_nior_n
Packit 5c3484
  pre ("mpn_nior_n");
Packit 5c3484
  mpn_nior_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
  pre ("mpn_popcount");
Packit 5c3484
  notdead += mpn_popcount (xp, size);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
  pre ("mpn_preinv_mod_1");
Packit 5c3484
  notdead += mpn_preinv_mod_1 (xp, size, GMP_NUMB_MAX,
Packit 5c3484
                               refmpn_invert_limb (GMP_NUMB_MAX));
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
#if USE_PREINV_DIVREM_1 || HAVE_NATIVE_mpn_preinv_divrem_1
Packit 5c3484
  pre ("mpn_preinv_divrem_1");
Packit 5c3484
  mpn_preinv_divrem_1 (wp, (mp_size_t) 0, xp, size, GMP_NUMB_MAX,
Packit 5c3484
                       refmpn_invert_limb (GMP_NUMB_MAX), 0);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_rsh1add_n
Packit 5c3484
  pre ("mpn_rsh1add_n");
Packit 5c3484
  mpn_rsh1add_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_rsh1sub_n
Packit 5c3484
  pre ("mpn_rsh1sub_n");
Packit 5c3484
  mpn_rsh1sub_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
  pre ("mpn_rshift");
Packit 5c3484
  mpn_rshift (wp, xp, size, 1);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
  pre ("mpn_sqr_basecase");
Packit 5c3484
  mpn_sqr_basecase (wp, xp, (mp_size_t) 3);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
  pre ("mpn_submul_1");
Packit 5c3484
  mpn_submul_1 (wp, xp, size, yp[0]);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_submul_1c
Packit 5c3484
  pre ("mpn_submul_1c");
Packit 5c3484
  mpn_submul_1c (wp, xp, size, yp[0], CNST_LIMB(0));
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
  pre ("mpn_sub_n");
Packit 5c3484
  mpn_sub_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_sub_nc
Packit 5c3484
  pre ("mpn_sub_nc");
Packit 5c3484
  mpn_sub_nc (wp, xp, yp, size, CNST_LIMB(0));
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_sublsh1_n
Packit 5c3484
  pre ("mpn_sublsh1_n");
Packit 5c3484
  mpn_sublsh1_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_udiv_qrnnd
Packit 5c3484
  pre ("mpn_udiv_qrnnd");
Packit 5c3484
  mpn_udiv_qrnnd (&wp[0], CNST_LIMB(122), xp[0], CNST_LIMB(123));
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_udiv_qrnnd_r
Packit 5c3484
  pre ("mpn_udiv_qrnnd_r");
Packit 5c3484
  mpn_udiv_qrnnd (CNST_LIMB(122), xp[0], CNST_LIMB(123), &wp[0]);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_umul_ppmm
Packit 5c3484
  pre ("mpn_umul_ppmm");
Packit 5c3484
  mpn_umul_ppmm (&wp[0], xp[0], yp[0]);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_umul_ppmm_r
Packit 5c3484
  pre ("mpn_umul_ppmm_r");
Packit 5c3484
  mpn_umul_ppmm_r (&wp[0], xp[0], yp[0]);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_xor_n
Packit 5c3484
  pre ("mpn_xor_n");
Packit 5c3484
  mpn_xor_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if HAVE_NATIVE_mpn_xnor_n
Packit 5c3484
  pre ("mpn_xnor_n");
Packit 5c3484
  mpn_xnor_n (wp, xp, yp, size);
Packit 5c3484
  post ();
Packit 5c3484
#endif
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
Packit 5c3484
int
Packit 5c3484
main (void)
Packit 5c3484
{
Packit 5c3484
  tests_start ();
Packit 5c3484
Packit 5c3484
  check ();
Packit 5c3484
Packit 5c3484
  tests_end ();
Packit 5c3484
  exit (0);
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
Packit 5c3484
#else /* ! WANT_PROFILING_INSTRUMENT */
Packit 5c3484
Packit 5c3484
int
Packit 5c3484
main (void)
Packit 5c3484
{
Packit 5c3484
  exit (0);
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
#endif