/*----------------------------------------------------------------------------*/

/*
 * Performance-Monitoring Counters Library, for Intel/AMD Processors and Linux
 * Author:  Don Heller, dheller@scl.ameslab.gov
 * Last revised:  19 January 2001
 */

/*----------------------------------------------------------------------------*/

/* measure this code by direct access */

int pmc_main(int argc, char * argv[]);

#define TRIALS 10

/*----------------------------------------------------------------------------*/

#include <pmc_lib.h>

/*----------------------------------------------------------------------------*/

int main(int argc, char * argv[])
{
  int status = RABBIT_NO_STATUS;
  pmc_control_t Ctl = pmc_control_null;

  int Argc = argc;
  char ** Argv = argv;

  int i,j,k, out, t;
  pmc_data_t t0, t1;

  /* initialize internal data structures, read command-line arguments */

  if (pmc_getargs(stderr, argv[0], &Argc, &Argv, &Ctl) == FALSE)
    { exit(RABBIT_FAILURE); }

  /* remove the pmc options from the command line */

  t = argc - (Argc + 1);
  for (i = 1; i <= Argc; i++)
    { argv[i] = argv[t + i]; }
  argc = Argc + 1;

  if (pmc_open(0) == FALSE)		/* open /dev/pmc */
    { exit(RABBIT_FAILURE); }

  /* for (out = 0; out < Ctl.num_counters; out++) { ... } */

  for (i = 0, out = 0; i < Ctl.event_pairs; i++) {
    for (j = 0; j < Ctl.replication; j++, out++) {
      pmc_select(&Ctl.counters[out]);
      for (k = 0; k < TRIALS; k++) {
	pmc_read(&t0);

	    status = pmc_main(argc, argv);

	pmc_read(&t1);
	pmc_accumulate(&Ctl.counters[out],&t1,&t0);
      }
    }
  }

  pmc_close();				/* close /dev/pmc */

  pmc_print_results(argc, argv, &Ctl);	/* ignore the return value */

  exit(status);
}

/*----------------------------------------------------------------------------*/
