X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=support%2Ftests%2Fdhrystone%2Fdhry.c;h=52cdb647b2335ecafc98ccf7e4cab59906b8eaa9;hb=12a13c467cb444adb9317ffca8f4899f5076de3f;hp=e17c6f6bab4341c33b23bec06c431ef2c3587f75;hpb=4e79b2da27fb08fb0952fc1cc0dc0b5f1fa0b623;p=fw%2Fsdcc diff --git a/support/tests/dhrystone/dhry.c b/support/tests/dhrystone/dhry.c index e17c6f6b..52cdb647 100644 --- a/support/tests/dhrystone/dhry.c +++ b/support/tests/dhrystone/dhry.c @@ -18,7 +18,11 @@ * The comment at the start of Func_1 about the input being H, R on the first call is wrong - Func_1 is first called from Func_2 where the input is R, Y. The test still succeeds. - + + References: + * http://www.netlib.org/performance/html/dhry.intro.html + * http://www.netlib.org/performance/html/dhry.data.col0.html + I couldnt find a copyright in the original - the most relevent part follows: @@ -35,14 +39,42 @@ ...!uunet!pcrat!dry2 (results only) */ +#define NOENUM 1 +#define NOSTRUCTASSIGN 1 +#define REG + #include "dhry.h" +#include +/** For printf */ +#include + +#if defined(SDCC_ds390) +#include +#define clock() ClockTicks() +#define CLOCKS_PER_SEC 1000 +#define memcpy(d,s,l) memcpyx(d,s,l) + +#elif defined(__z80) || defined(__gbz80) +unsigned int _clock(void); + +#define clock _clock +#define CLOCKS_PER_SEC 100 + +#else +/** For clock() */ +#include +#include +#endif + +/** Set to one to print more messages about expected values etc. + */ +#define DEBUG 0 -/* Temporary definitions. Remove soon :) */ -#if SDCC -void *memcpy(void *dest, const char *src, int wLen); +#if DEBUG +#define DPRINTF(_a) printf _a +#else +#define DPRINTF(_a) #endif -char *strcpy(char *dest, const char *src); -int strcmp(const char *s1, const char *s2); Rec_Pointer Ptr_Glob, Next_Ptr_Glob; @@ -56,6 +88,10 @@ int Arr_2_Glob [50] [50]; /* Used instead of malloc() */ static Rec_Type _r[2]; +void mark(void) +{ +} + void Proc_1 (REG Rec_Pointer Ptr_Val_Par); void Proc_2 (One_Fifty *Int_Par_Ref); void Proc_5 (void); @@ -69,20 +105,9 @@ Enumeration Func_1 (Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val); Boolean Func_2 (char *Str_1_Par_Ref, char *Str_2_Par_Ref); Boolean Func_3 (Enumeration Enum_Par_Val); -void printf(const char *format, ...); -void exit(int val); -unsigned _clock(void); - -/*#define DPRINTF(_a) printf _a*/ -#define DPRINTF(_a) - unsigned getsp(void); -#if SDCC -int _main(void) -#else int main(void) -#endif { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; @@ -93,7 +118,7 @@ int main(void) Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; - unsigned endTime; + unsigned long runTime; printf("[dhry]\n"); @@ -105,21 +130,31 @@ int main(void) Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; Ptr_Glob->variant.var_1.Int_Comp = 40; - strcpy (Ptr_Glob->variant.var_1.Str_Comp, + strcpy(Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING"); strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); Arr_2_Glob [8][7] = 10; + /* Was missing in published program. Without this statement, */ /* Arr_2_Glob [8][7] would have an undefined value. */ /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */ /* overflow may occur for this array element. */ + /* 32766 is the highest value for a 16 bitter */ +#if DEBUG + Number_Of_Runs = 3000; +#else Number_Of_Runs = 32766; +#endif + + runTime = clock(); /* Main test loop */ for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { DPRINTF(("Run_Index = %d\n", Run_Index)); + if (!(Run_Index & 1023)) + printf("Loops: %u\r\n", Run_Index); Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ @@ -149,7 +184,7 @@ int main(void) Int_1_Loc, Int_2_Loc, Int_3_Loc)); DPRINTF(("Proc_8\n")); - Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); + Proc_8 (Arr_1_Glob, (int *)Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ DPRINTF(("Int_Glob %d == 5\n", Int_Glob)); DPRINTF(("Proc_1\n")); @@ -187,8 +222,9 @@ int main(void) printf("Run_Index = %d\n", Run_Index); - endTime = _clock(); + runTime = clock() - runTime; +#if 1 printf ("Execution ends\n"); printf ("\n"); printf ("Final values of the variables used in the benchmark:\n"); @@ -203,7 +239,9 @@ int main(void) printf (" should be: %c\n", 'B'); printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); printf (" should be: %d\n", (int)7); +#if 1 printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); +#endif printf (" should be: Number_Of_Runs + 10\n"); printf ("Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); @@ -236,14 +274,24 @@ int main(void) printf (" should be: %d\n", (int)7); printf ("Enum_Loc: %d\n", Enum_Loc); printf (" should be: %d\n", (int)1); - printf ("Str_1_Loc: %s\n", Str_1_Loc); + printf ("Str_1_Loc: %s\n", (char _generic *)Str_1_Loc); printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); - printf ("Str_2_Loc: %s\n", Str_2_Loc); + printf ("Str_2_Loc: %s\n", (char _generic *)Str_2_Loc); printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); printf ("\n"); - - printf("Time: %u ticks\n", endTime); - printf("Dhrystones/tick = %u\n", Number_Of_Runs / (endTime/100)); +#endif +#if 1 + printf("Number of runs: %u. runTime: %u.\n", Number_Of_Runs, (unsigned)runTime); + mark(); + printf("Dhrystones/s = %u\n", (unsigned)((unsigned long)Number_Of_Runs / (runTime/CLOCKS_PER_SEC))); + printf("MIPS = d/s/1757 = (sigh, need floats...)\n"); +#endif +#ifdef PRINT_T_STATES + _printTStates(); +#endif +#if 1 + printf("Time: %lu ticks\n", runTime); +#endif } void Proc_1 (REG Rec_Pointer Ptr_Val_Par) @@ -289,17 +337,17 @@ void Proc_2 (One_Fifty *Int_Par_Ref) Int_Loc = *Int_Par_Ref + 10; do { - DPRINTF(("1\n")); + DPRINTF(("1")); /* executed once */ if (Ch_1_Glob == 'A') /* then, executed */ { - DPRINTF(("2\n")); + DPRINTF(("2")); Int_Loc -= 1; *Int_Par_Ref = Int_Loc - Int_Glob; Enum_Loc = Ident_1; } /* if */ - DPRINTF(("3\n")); + DPRINTF(("3")); } while (Enum_Loc != Ident_1); /* true */ DPRINTF(("Proc_2 done.\n")); } /* Proc_2 */ @@ -384,8 +432,8 @@ Enumeration Func_1 (Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val) Capital_Letter Ch_2_Loc; DPRINTF(("-> Func_1\n")); - DPRINTF((" Inputs: Ch_1_Par_Val '%c' == { H, A, B }\n", (char)Ch_1_Par_Val)); - DPRINTF((" Ch_2_Par_Val '%c' == { R, C, C }\n", (char)Ch_2_Par_Val)); + DPRINTF((" Inputs: Ch_1_Par_Val '%c' == { R, A, B }\n", (char)Ch_1_Par_Val)); + DPRINTF((" Ch_2_Par_Val '%c' == { Y, C, C }\n", (char)Ch_2_Par_Val)); Ch_1_Loc = Ch_1_Par_Val; Ch_2_Loc = Ch_1_Loc; @@ -442,7 +490,7 @@ void Proc_8 (int *Arr_1_Par_Ref, int *Arr_2_Par_Ref, DPRINTF(("-> Proc_8\n")); Int_Loc = Int_1_Par_Val + 5; Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val; - DPRINTF(("Int_Loc %d == 8\n", Int_Loc)); + DPRINTF(("Int_Loc %d == 8 Int_2_Par_Val %d == 7\n", Int_Loc, Int_2_Par_Val)); Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc]; Arr_1_Par_Ref [Int_Loc+30] = Int_Loc; @@ -451,6 +499,7 @@ void Proc_8 (int *Arr_1_Par_Ref, int *Arr_2_Par_Ref, Arr_2_Par_Ref [Int_Loc * 50 + Int_Loc-1] += 1; Arr_2_Par_Ref [(Int_Loc+20 *50) + Int_Loc] = Arr_1_Par_Ref [Int_Loc]; Int_Glob = 5; + DPRINTF(("Arr_1_Glob[8] %d == 7\n", Arr_1_Par_Ref[8])); } /*********************************************************************/ @@ -473,17 +522,8 @@ Boolean Func_2 (char *Str_1_Par_Ref, char *Str_2_Par_Ref) Int_Loc = 2; while (Int_Loc <= 2) { -#if BROKEN_SDCC - char a, b; - DPRINTF((" 2.1 Runs once Int_Loc %u = 2.\n", (unsigned)Int_Loc)); - /* loop body executed once */ - a = Str_1_Par_Ref[Int_Loc]; - b = Str_2_Par_Ref[Int_Loc+1]; - if (Func_1 (a, b) == Ident_1) -#else if (Func_1 (Str_1_Par_Ref[Int_Loc], Str_2_Par_Ref[Int_Loc+1]) == Ident_1) -#endif /* then, executed */ { DPRINTF((" 2.3 Then OK.\n")); @@ -523,3 +563,4 @@ Boolean Func_2 (char *Str_1_Par_Ref, char *Str_2_Par_Ref) } } /* if Ch_Loc */ } /* Func_2 */ +