/*****************************************************

     fp_benchmark.c
     Z-World, 2000

     Demonstration of computation times for various functions
     (nodebug generates faster code for some tests)
     

     This program will time various functions and print out the timing results.
   Board Clock Speed  18.432001 MHz                                               
empty loop                     2 microseconds                                   
float multiply                23 microseconds                                   
float add                     20 usec                                           
float divide                  46 usec                                           
float square root             53 usec                                           
float sine                   175 usec                                           
float exp                    156 usec                                           
float log                    236 usec                                           
float arccos                 437 usec                                           
float arctan (atan2)         379 usec                                           
empty costatement             12 usec                                           
empty cofunction              53 usec     

******************************************************/

cofunc void nullcof(void)
{
	// empty cofunction for cofunction timing test
}

main()
{
	rundemo();
}

nodebug
rundemo()
{
	unsigned long int	timer, emptyloop, emptycostate;
	unsigned int	j,dif;
	float				x, y, z;

	// compute clock speed
	x=19200.*32.*freq_divider/1000000.; // clock speed in mhz
	printf("\n\n Board Clock Speed %10.6f MHz\n",x);
	
    
	// compute time for an empty loop
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<1000u; j++) {
		// empty loop
	}
	emptyloop = MS_TIMER-timer;				// save this value to adjust later measurements
	printf("empty loop\t\t%8ld microseconds\n", MS_TIMER-timer); // print time in microseconds
	
	  
	// chose some values to use in next few calculations
	x=5.68; y=34567.99; z=-2345.67;

	// time float multiplication
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<500u; j++) {
   	x*y;
		z*x;
	}
	
	printf("float multiply\t\t%8ld microseconds\n", MS_TIMER-timer-emptyloop); // print time in microseconds
  
  
	// time float addition
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<500u; j++) {
		x+y;
		z+x;
	}
	printf("float add\t\t%8ld usec\n", MS_TIMER-timer-emptyloop); // print time in microseconds

	  
	// time float division
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<500u; j++) {
		x/y;
		z/x;
	}
	printf("float divide\t\t%8ld usec\n", MS_TIMER-timer-emptyloop); // print time in microseconds
  
  
	// time sqrt function
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<500u; j++) {
		sqrt(x);
		sqrt(y);
	}
	printf("float square root\t%8ld usec\n", MS_TIMER-timer-emptyloop); // print time in microseconds
  
  
	// time sine function
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<500u; j++) {
		sin(0.34);
		sin(-3.0);
	}
	printf("float sine\t\t%8ld usec\n", MS_TIMER-timer-emptyloop); // print time in microseconds
  
	
	// time exp function
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<500u; j++) {
		exp(5.0);
		exp(0.01);
	}
	printf("float exp\t\t%8ld usec\n", MS_TIMER-timer-emptyloop); // print time in microseconds


	// time log function
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<500u; j++) {
		log(5.0);
		log(0.01);
	}
	printf("float log\t\t%8ld usec\n", MS_TIMER-timer-emptyloop); // print time in microseconds
  
  
	
	// time arccosine function
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<500u; j++) {
		acos(0.3567);
		acos(-0.89);
	}
	printf("float arccos\t\t%8ld usec\n", MS_TIMER-timer-emptyloop); // print time in microseconds
  
  
	// time arctangent function
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<500u; j++) {
		atan2(0.5,-0.3444);
		atan2(0.60888,0.2341);
	}
	printf("float arctan (atan2)\t%8ld usec\n", MS_TIMER-timer-emptyloop); // print time in microseconds


	// time empty costatement
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<1000u; j++) {
		costate{}
	}
	emptycostate = MS_TIMER - timer - emptyloop;			// save this value to adjust next measurement
	printf("empty costatement\t%8ld usec\n", MS_TIMER-timer-emptyloop); // print time in microseconds

	
	// time empty cofunction
	timer = MS_TIMER;   // get current time in milliseconds
	for(j=0; j<1000u; j++) {
		costate {
			waitfordone{ nullcof(); }
		}
	}
	printf("empty cofunction\t%8ld usec\n", MS_TIMER-timer-emptyloop-emptycostate); // print time in microseconds


}  // done with program
