Hi.

A table from 'TI Competitive Benchmark': slaa205b.pdf (July 2006).
Whetstone Code Size (in bytes) and Cycle Counts.
IAR C Compiler used (4.12A for AVR), full optimization.

MCU           Code size  Cycles
------------  ---------  ------
MSP430FG4619       6544  107040
 MSP430F149        6524  109837
PIC24FJ128GA       4605  108619
     8051          8723  291836
   H8/300H         4656  205910
   MaxQ20          5392  158945
ARM7TDMI/Thumb    10532   60444
    HCS12          7370  787635
   ATmega8         4694  270991

avr-gcc 4.1.2 & avr-libc CVS HEAD (Jan 2008) gives:
MCU           Code size  Cycles  Optimization
------------  ---------  ------  ------------
   ATmega8         4020   88563  -Os -morder1
   ATmega8         4030   88565  -Os
   ATmega8         5310   71743  -O3 -morder1
   ATmega8         5332   71751  -O3

The dummy functions are added to prevent GCC optimization.

I am not sure in TI's accuracy. Results for both MSP430-es
are practicaly equal, despite the fact thar FG4619 has
considerable enhanced core. Also run time for ATmega8 is
too big.  Can everbody to make any measurements with
IAR compiler?

Source in attachment.

Regards,
Dmitry.
/***************************************************************************
*
*   Name    : Whetstone
*   Purpose : Benchmark the Whetstone code. The code focuses on scientific
*      functions such as sine, cosine, exponents and logarithm on
*      fixed and floating point numbers.
*
***************************************************************************/
/* List of changes (since TI slaa205b.pdf):
    - void type of PA(), P0(), P3()
    - dummy functions to prevent optimization
    - float (not double) variants of math funcions and constants (this
    is no matter for AVR)
 */

#include <math.h>

#ifdef	__AVR__
# define atanf(x) atan(x)
# define cosf(x)  cos(x)
# define expf(x)  exp(x)
# define logf(x)  log(x)
# define sinf(x)  sin(x)
# define sqrtf(x) sqrt(x)
#endif

/* Extern functions. To prevent compiler's optimization.	*/
void dummy1 (float);
void dummy2 (float, float);

void PA (float E[5]);
void P0 (void);
void P3 (float *X, float *Y, float *Z);

float T, T1, T2, E1[5];
int J, K, L;
float X1, X2, X3, X4;
long ptime, time0;

void main (void)
{
    int LOOP, I, II, JJ, N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11;
    float X, Y, Z;
    T = .499975;
    T1 = 0.50025;
    T2 = 2.0;
    LOOP = 1;
    II = 1;

    for (JJ = 1; JJ <= II; JJ++) {
	N1 = 0;
	N2 = 2 * LOOP;
	N3 = 2 * LOOP;
	N4 = 2 * LOOP;
	N5 = 0;
	N6 = 2 * LOOP;
	N7 = 2 * LOOP;
	N8 = 2 * LOOP;
	N9 = 2 * LOOP;
	N10 = 0;
	N11 = 2 * LOOP;

	/* Module 1: Simple identifiers */
	X1 = 1.0;
	X2 = -1.0;
	X3 = -1.0;
	X4 = -1.0;
	if (N1 != 0) {
	    for (I = 1; I <= N1; I++) {
		X1 = (X1 + X2 + X3 - X4) * T;
		X2 = (X1 + X2 - X3 + X4) * T;
		X3 = (X1 - X2 + X3 + X4) * T;
		X4 = (-X1 + X2 + X3 + X4) * T;
	    }
	}

	/* Module 2: Array elements */
	E1[1] = 1.0;
	E1[2] = -1.0;
	E1[3] = -1.0;
	E1[4] = -1.0;
	if (N2 != 0) {
	    for (I = 1; I <= N2; I++) {
		E1[1] = (E1[1] + E1[2] + E1[3] - E1[4]) * T;
		E1[2] = (E1[1] + E1[2] - E1[3] + E1[4]) * T;
		E1[3] = (E1[1] - E1[2] + E1[3] + E1[4]) * T;
		E1[4] = (-E1[1] + E1[2] + E1[3] + E1[4]) * T;
	    }
	}

	/* Module 3: Array as parameter */
	if (N3 != 0) {
	    for (I = 1; I <= N3; I++) {
		PA (E1);
	    }
	}

	/* Module 4: Conditional jumps */
	J = 1;
	if (N4 != 0) {
	    for (I = 1; I <= N4; I++) {
		if (J == 1)
		    goto L51;
		J = 3;
		goto L52;
	      L51:
		J = 2;
	      L52:
		if (J > 2)
		    goto L53;
		J = 1;
		goto L54;
	      L53:
		J = 0;
	      L54:
		if (J < 1)
		    goto L55;
		J = 0;
		goto L60;
	      L55:
		J = 1;
	      L60: ;
	    }
	}

	/* Module 5: Integer arithmetic */
	J = 1;
	K = 2;
	L = 3;
	if (N6 != 0) {				/* ??? Where is N5?	*/
	    for (I = 1; I <= N6; I++) {
		J = J * (K - J) * (L - K);
		K = L * K - (L - J) * K;
		L = (L - K) * (K + J);
		E1[L - 1] = J + K + L;
		E1[K - 1] = J * K * L;
	    }
	}

	/* Module 6: Trigonometric functions */
	X = 0.5;
	Y = 0.5;
	if (N7 != 0) {
	    for (I = 1; I <= N7; I++) {
		X = T * atanf (T2 * sinf (X) * cosf (X) /
			      (cosf (X + Y) + cosf (X - Y) - 1.0f));
		Y = T * atanf (T2 * sinf (Y) * cosf (Y) /
			      (cosf (X + Y) + cosf (X - Y) - 1.0f));
	    }
	}
	dummy2 (X, Y);

	/* Module 7: Procedure calls */
	X = 1.0;
	Y = 1.0;
	Z = 1.0;
	if (N8 != 0) {
	    for (I = 1; I <= N8; I++) {
		P3 (&X, &Y, &Z);
	    }
	}

	/* Module 8: Array references */
	J = 1;
	K = 2;
	L = 3;
	E1[1] = 1.0;
	E1[2] = 2.0;
	E1[3] = 3.0;
	if (N9 != 0) {
	    for (I = 1; I <= N9; I++) {
		P0 ();
	    }
	}

	/* Module 9: Integer arithmetic */
	J = 2;
	K = 3;
	if (N10 != 0) {			/* TI skips this strange test.	*/
	    for (I = 1; I <= N10; I++) {
		J = J + K;
		K = J + K;
		J = K - J;
		K = K - J - J;
	    }
	}

	/* Module 10: Standard functions */
	X = 0.75;
	if (N11 != 0) {
	    for (I = 1; I <= N11; I++) {
		X = sqrtf (expf (logf (X) / T1));
	    }
	}
	dummy1 (X);
    }
}

void PA (float E[5])
{
    int J1;
    J1 = 0;
  L10:
    E[1] = (E[1] + E[2] + E[3] - E[4]) * T;
    E[2] = (E[1] + E[2] - E[3] + E[4]) * T;
    E[3] = (E[1] - E[2] + E[3] + E[4]) * T;
    E[4] = (-E[1] + E[2] + E[3] + E[4]) / T2;
    J1 = J1 + 1;
    if ((J1 - 6) < 0)
	goto L10;
    return;
}

void P0 ()
{
    E1[J] = E1[K];
    E1[K] = E1[L];
    E1[L] = E1[J];
    return;
}

void P3 (float *X, float *Y, float *Z)
{
    float Y1;
    X1 = *X;
    Y1 = *Y;
    X1 = T * (X1 + Y1);
    Y1 = T * (X1 + Y1);
    *Z = (X1 + Y1) / T2;
    return;
}
_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to