/* CHANGE: This doesn't appear to be valid C! Proc_3 (Ptr_Ref_Par) // ****************** // executed once // Ptr_Ref_Par becomes Ptr_Glob Rec_Pointer *Ptr_Ref_Par; */ void Proc_3 (Rec_Pointer *Ptr_Ref_Par) { if (Ptr_Glob != Null) /* then, executed */ *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; Proc_7 (10, Int_Glob, &Ptr_Glob->variant.Int_Comp); } /* Proc_3 */
void Proc_3(DS_DATA& dd, Rec_Pointer *Ptr_Ref_Par) { if (Ptr_Glob != NULL) /* then, executed */ *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); }
void Proc_1 (REG Rec_Pointer Ptr_Val_Par) /******************/ /* executed once */ { REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; /* == Ptr_Glob_Next */ /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ /* corresponds to "rename" in Ada, "with" in Pascal */ structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); Ptr_Val_Par->variant.var_1.Int_Comp = 5; Next_Record->variant.var_1.Int_Comp = Ptr_Val_Par->variant.var_1.Int_Comp; Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; Proc_3 (&Next_Record->Ptr_Comp); /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp == Ptr_Glob->Ptr_Comp */ if (Next_Record->Discr == Ident_1) /* then, executed */ { Next_Record->variant.var_1.Int_Comp = 6; Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, &Next_Record->variant.var_1.Enum_Comp); Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, &Next_Record->variant.var_1.Int_Comp); } else /* not executed */ structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); } /* Proc_1 */
void Proc_3 (Rec_Pointer *Ptr_Ref_Par) /******************/ /* executed once */ /* Ptr_Ref_Par becomes Ptr_Glob */ { if (Ptr_Glob != Null) *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); } /* Proc_3 */
//#LIS# Start LIS Modification //Proc_3 (Ptr_Ref_Par) Proc_3() /******************/ /* executed once */ /* Ptr_Ref_Par becomes Ptr_Glob */ //Rec_Pointer *Ptr_Ref_Par; // this has been made global //#LIS# End LIS Modification { if (Ptr_Glob != Null) /* then, executed */ *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; //#LIS# Start LIS Modification //Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); Int_1_Par_Val_Proc7 = 10; Int_2_Par_Val_Proc7 = Int_Glob; Int_Par_Ref_Proc7 = &Ptr_Glob->variant.var_1.Int_Comp; Proc_7(); //#LIS# End LIS Modification } /* Proc_3 */
main () /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; /* Initializations */ init_platform(); #ifdef NO_MALLOC Next_Ptr_Glob = (Rec_Pointer) &tmp_var1; Ptr_Glob = (Rec_Pointer) &tmp_var2; #else Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); #endif Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "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. */ printf ("\n"); printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); printf ("\n"); if (Reg) { printf ("Program compiled with 'register' attribute\n"); printf ("\n"); } else { printf ("Program compiled without 'register' attribute\n"); printf ("\n"); } { printf("Number_Of_Runs set to 400"); Number_Of_Runs = 400; } printf ("\n"); printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); /***************/ /* Start timer */ /***************/ #if 0 #ifdef TIMES times (&time_info); Begin_Time = (long) time_info.tms_utime; #endif #ifdef TIME Begin_Time = time ( (long *) 0); #endif #endif for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ #if 0 #ifdef TIMES times (&time_info); End_Time = (long) time_info.tms_utime; #endif #ifdef TIME End_Time = time ( (long *) 0); #endif #endif printf ("Execution ends\n"); printf ("\n"); printf ("Final values of the variables used in the benchmark:\n"); printf ("\n"); printf ("Int_Glob: %d\n", Int_Glob); printf (" should be: %d\n", 5); printf ("Bool_Glob: %d\n", Bool_Glob); printf (" should be: %d\n", 1); printf ("Ch_1_Glob: %c\n", Ch_1_Glob); printf (" should be: %c\n", 'A'); printf ("Ch_2_Glob: %c\n", Ch_2_Glob); printf (" should be: %c\n", 'B'); printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); printf (" should be: %d\n", 7); printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); printf (" should be: Number_Of_Runs + 10\n"); printf ("Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent)\n"); printf (" Discr: %d\n", Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 2); printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 17); printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Next_Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent), same as above\n"); printf (" Discr: %d\n", Next_Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 1); printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 18); printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Int_1_Loc: %d\n", Int_1_Loc); printf (" should be: %d\n", 5); printf ("Int_2_Loc: %d\n", Int_2_Loc); printf (" should be: %d\n", 13); printf ("Int_3_Loc: %d\n", Int_3_Loc); printf (" should be: %d\n", 7); printf ("Enum_Loc: %d\n", Enum_Loc); printf (" should be: %d\n", 1); printf ("Str_1_Loc: %s\n", Str_1_Loc); printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); printf ("Str_2_Loc: %s\n", Str_2_Loc); printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); printf ("\n"); #if 0 #ifdef USE_FSL_TIMER /* Begin_Time & End_Time are in clock ticks scaled by FSL_PRESCALE */ if (End_Time > Begin_Time) User_Time = End_Time - Begin_Time; else User_Time = Begin_Time - End_Time; printf("begin: %ld, end: %ld\n", Begin_Time, End_Time); printf("# of cycles : %ld\n", User_Time * FSL_PRESCALE); /* calculate and print dmips/mhz */ float dmips_per_mhz = ((float)Number_Of_Runs/1757 * (FREQ_HZ/100))/(float)(User_Time * FSL_PRESCALE); /* we expect dmips_per_mhz = 0.92 for MicroBlaze, or less if fewer options are enabled * since we can't print out float's using xil_printf, print it out as an integer * after multiplying by 100 */ printf("DMIPS/Mhz : %d/100\n", (int)(dmips_per_mhz * 100)); printf("Proc Frequency : %d Hz\n", FREQ_HZ); printf("DMIPS : %d\n", (int)(dmips_per_mhz * FREQ_HZ/1000000)); #else User_Time = End_Time - Begin_Time; if (User_Time < Too_Small_Time) { printf ("Measured time too small to obtain meaningful results\n"); printf ("Please increase number of runs\n"); printf ("\n"); } else { #ifdef XIL_TIME printf("# of ticks = %ld\n", User_Time); printf("begin: %ld, end: %ld\n", Begin_Time, End_Time); #else #ifdef TIME Microseconds = (float) User_Time * Mic_secs_Per_Second / (float) Number_Of_Runs; Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time; #else Microseconds = (float) User_Time * Mic_secs_Per_Second / ((float) HZ * ((float) Number_Of_Runs)); Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs) / (float) User_Time; #endif #endif #if 0 printf ("Microseconds for one run through Dhrystone: "); printf ("%6.1f \n", Microseconds); printf ("Dhrystones per Second: "); printf ("%6.1f \n", Dhrystones_Per_Second); printf ("\n"); #else printf("Completed\n"); #endif } #endif #else #endif cleanup_platform(); }
int dhrystone( double& Vax_Mips, double& int_loops, double& int_time, double min_cpu_time ){ One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; unsigned long Loops; DS_DATA dd; double startclock, endclock; double benchtime; double Dhrystones_Per_Second; register unsigned long Run_Index; Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "DHRYSTONE PROGRAM, SOME STRING"); strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); Arr_2_Glob [8][7] = 10; Loops = 16000; // determines runtime // This must be small enough that, on the slowest CPU, // one loop completes within 10 seconds. benchmark_wait_to_start(BM_TYPE_INT); boinc_calling_thread_cpu_time(startclock); int bigloops = 0; do { for (Run_Index = 0; Run_Index < Loops; ++Run_Index) { Proc_5(dd); Proc_4(dd); Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (dd, Str_1_Loc, Str_2_Loc); while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); Int_1_Loc += 1; } /* while */ Proc_8 (dd, Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); Proc_1 (dd, Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) { if (Enum_Loc == Func_1 (dd, Ch_Index, 'C')) { Proc_6 (dd, Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; Proc_2 (dd, &Int_1_Loc); } bigloops++; } while (!benchmark_time_to_stop(BM_TYPE_INT)); Loops *= bigloops; boinc_calling_thread_cpu_time(endclock); benchtime = endclock - startclock; int_time = benchtime; if (benchtime < min_cpu_time) return -1; //printf ("%12.0f runs %6.2f seconds \n",(double) Loops, benchtime); Dhrystones_Per_Second = (double) Loops / benchtime; Vax_Mips = Dhrystones_Per_Second / 1757.0; int_loops = Loops; #if 0 printf ("Dhrystones per Second: "); printf ("%10.0lf \n", Dhrystones_Per_Second); printf ("VAX MIPS rating = "); printf ("%12.2lf \n",Vax_Mips); #endif free(Next_Ptr_Glob); free(Ptr_Glob); return 0; }
int hello_world (int argc, char *argv[]) /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { app_startup(argv); One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; printf("start app\n"); /* Arguments */ if (argc > 2) { printf ("Usage: %s [number of loops]\n", argv[0]); return 1; } if (argc == 2) { return 1; // Number_Of_Runs = atoi (argv[1]); } else { Number_Of_Runs = NUMBER_OF_RUNS; } if (Number_Of_Runs <= 0) { Number_Of_Runs = NUMBER_OF_RUNS; } /* Initializations */ Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "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. */ printf ("\n"); printf ("Dhrystone Benchmark, Version %s\n", Version); if (Reg) { printf ("Program compiled with 'register' attribute\n"); } else { printf ("Program compiled without 'register' attribute\n"); } printf ("Using %s, HZ=%d\n", CLOCK_TYPE, HZ); printf ("\n"); Done = false; while (!Done) { printf ("Trying %d runs through Dhrystone:\n", Number_Of_Runs); /***************/ /* Start timer */ /***************/ //Start_Timer(); for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ //Stop_Timer(); User_Time = End_Time - Begin_Time; /* if (User_Time < Too_Small_Time) { printf ("Measured time too small to obtain meaningful results\n"); Number_Of_Runs = Number_Of_Runs * 10; printf ("\n"); } else Done = true;*/ Done = true; } printf ("Final values of the variables used in the benchmark:\n"); printf ("\n"); printf ("Int_Glob: %d\n", Int_Glob); printf (" should be: %d\n", 5); printf ("Bool_Glob: %d\n", Bool_Glob); printf (" should be: %d\n", 1); printf ("Ch_1_Glob: %c\n", Ch_1_Glob); printf (" should be: %c\n", 'A'); printf ("Ch_2_Glob: %c\n", Ch_2_Glob); printf (" should be: %c\n", 'B'); printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); printf (" should be: %d\n", 7); printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); printf (" should be: Number_Of_Runs + 10\n"); printf ("Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent)\n"); printf (" Discr: %d\n", Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 2); printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 17); printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Next_Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent), same as above\n"); printf (" Discr: %d\n", Next_Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 1); printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 18); printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Int_1_Loc: %d\n", Int_1_Loc); printf (" should be: %d\n", 5); printf ("Int_2_Loc: %d\n", Int_2_Loc); printf (" should be: %d\n", 13); printf ("Int_3_Loc: %d\n", Int_3_Loc); printf (" should be: %d\n", 7); printf ("Enum_Loc: %d\n", Enum_Loc); printf (" should be: %d\n", 1); printf ("Str_1_Loc: %s\n", Str_1_Loc); printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); printf ("Str_2_Loc: %s\n", Str_2_Loc); printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); printf ("\n"); /* Microseconds = (float) User_Time * Mic_secs_Per_Second / ((float) HZ * ((float) Number_Of_Runs)); Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs) / (float) User_Time; printf ("Microseconds for one run through Dhrystone: "); printf ("%10.1f \n", Microseconds); printf ("Dhrystones per Second: "); printf ("%10.0f \n", Dhrystones_Per_Second); printf ("\n");*/ return 0; }
main () /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; /* Initializations */ Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "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. */ Number_Of_Runs = SCALE_FACTOR; for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ }
void main (int argc, char *argv[]) /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { double dtime(); One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; int endit, count = 10; FILE *Ap; char general[9][80] = {" "}; /* Initializations */ if (argc > 1) { switch (argv[1][0]) { case 'N': getinput = 0; break; case 'n': getinput = 0; break; } } if ((Ap = fopen("Dhry.txt","a+")) == NULL) { printf("Can not open Dhry.txt\n\n"); printf("Press any key\n"); exit(1); } /*********************************************************************** * Change for compiler and optimisation used * ***********************************************************************/ Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "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. */ printf ("\n"); printf ("Dhrystone Benchmark, Version 2.1 (Language: C or C++)\n"); printf ("\n"); if (getinput == 0) { printf ("No run time input data\n\n"); } else { printf ("With run time input data\n\n"); } printf ("Compiler %s\n", compiler); printf ("Optimisation %s\n", options); #ifdef ROPT printf ("Register option selected\n\n"); #else printf ("Register option not selected\n\n"); strcpy(Reg_Define, "Register option Not selected."); #endif /* if (Reg) { printf ("Program compiled with 'register' attribute\n"); printf ("\n"); } else { printf ("Program compiled without 'register' attribute\n"); printf ("\n"); } printf ("Please give the number of runs through the benchmark: "); { int n; scanf ("%d", &n); Number_Of_Runs = n; } printf ("\n"); printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); */ Number_Of_Runs = 5000; do { Number_Of_Runs = Number_Of_Runs * 2; count = count - 1; Arr_2_Glob [8][7] = 10; /***************/ /* Start timer */ /***************/ Begin_Time = dtime(); for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ End_Time = dtime(); User_Time = End_Time - Begin_Time; printf ("%12.0f runs %6.2f seconds \n",(double) Number_Of_Runs, User_Time); if (User_Time > 5) { count = 0; } else { if (User_Time < 0.1) { Number_Of_Runs = Number_Of_Runs * 5; } } } /* calibrate/run do while */ while (count >0); printf ("\n"); printf ("Final values (* implementation-dependent):\n"); printf ("\n"); printf ("Int_Glob: "); if (Int_Glob == 5) printf ("O.K. "); else printf ("WRONG "); printf ("%d ", Int_Glob); printf ("Bool_Glob: "); if (Bool_Glob == 1) printf ("O.K. "); else printf ("WRONG "); printf ("%d\n", Bool_Glob); printf ("Ch_1_Glob: "); if (Ch_1_Glob == 'A') printf ("O.K. "); else printf ("WRONG "); printf ("%c ", Ch_1_Glob); printf ("Ch_2_Glob: "); if (Ch_2_Glob == 'B') printf ("O.K. "); else printf ("WRONG "); printf ("%c\n", Ch_2_Glob); printf ("Arr_1_Glob[8]: "); if (Arr_1_Glob[8] == 7) printf ("O.K. "); else printf ("WRONG "); printf ("%d ", Arr_1_Glob[8]); printf ("Arr_2_Glob8/7: "); if (Arr_2_Glob[8][7] == Number_Of_Runs + 10) printf ("O.K. "); else printf ("WRONG "); printf ("%10d\n", Arr_2_Glob[8][7]); printf ("Ptr_Glob-> "); printf (" Ptr_Comp: * %d\n", (int) Ptr_Glob->Ptr_Comp); printf (" Discr: "); if (Ptr_Glob->Discr == 0) printf ("O.K. "); else printf ("WRONG "); printf ("%d ", Ptr_Glob->Discr); printf ("Enum_Comp: "); if (Ptr_Glob->variant.var_1.Enum_Comp == 2) printf ("O.K. "); else printf ("WRONG "); printf ("%d\n", Ptr_Glob->variant.var_1.Enum_Comp); printf (" Int_Comp: "); if (Ptr_Glob->variant.var_1.Int_Comp == 17) printf ("O.K. "); else printf ("WRONG "); printf ("%d ", Ptr_Glob->variant.var_1.Int_Comp); printf ("Str_Comp: "); if (strcmp(Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING") == 0) printf ("O.K. "); else printf ("WRONG "); printf ("%s\n", Ptr_Glob->variant.var_1.Str_Comp); printf ("Next_Ptr_Glob-> "); printf (" Ptr_Comp: * %d", (int) Next_Ptr_Glob->Ptr_Comp); printf (" same as above\n"); printf (" Discr: "); if (Next_Ptr_Glob->Discr == 0) printf ("O.K. "); else printf ("WRONG "); printf ("%d ", Next_Ptr_Glob->Discr); printf ("Enum_Comp: "); if (Next_Ptr_Glob->variant.var_1.Enum_Comp == 1) printf ("O.K. "); else printf ("WRONG "); printf ("%d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); printf (" Int_Comp: "); if (Next_Ptr_Glob->variant.var_1.Int_Comp == 18) printf ("O.K. "); else printf ("WRONG "); printf ("%d ", Next_Ptr_Glob->variant.var_1.Int_Comp); printf ("Str_Comp: "); if (strcmp(Next_Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING") == 0) printf ("O.K. "); else printf ("WRONG "); printf ("%s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); printf ("Int_1_Loc: "); if (Int_1_Loc == 5) printf ("O.K. "); else printf ("WRONG "); printf ("%d ", Int_1_Loc); printf ("Int_2_Loc: "); if (Int_2_Loc == 13) printf ("O.K. "); else printf ("WRONG "); printf ("%d\n", Int_2_Loc); printf ("Int_3_Loc: "); if (Int_3_Loc == 7) printf ("O.K. "); else printf ("WRONG "); printf ("%d ", Int_3_Loc); printf ("Enum_Loc: "); if (Enum_Loc == 1) printf ("O.K. "); else printf ("WRONG "); printf ("%d\n", Enum_Loc); printf ("Str_1_Loc: "); if (strcmp(Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING") == 0) printf ("O.K. "); else printf ("WRONG "); printf ("%s\n", Str_1_Loc); printf ("Str_2_Loc: "); if (strcmp(Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING") == 0) printf ("O.K. "); else printf ("WRONG "); printf ("%s\n", Str_2_Loc); printf ("\n"); if (User_Time < Too_Small_Time) { printf ("Measured time too small to obtain meaningful results\n"); printf ("Please increase number of runs\n"); printf ("\n"); } else { Microseconds = User_Time * Mic_secs_Per_Second / (double) Number_Of_Runs; Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time; Vax_Mips = Dhrystones_Per_Second / 1757.0; printf ("Microseconds for one run through Dhrystone: "); printf ("%12.2lf \n", Microseconds); printf ("Dhrystones per Second: "); printf ("%10.0lf \n", Dhrystones_Per_Second); printf ("VAX MIPS rating = "); printf ("%12.2lf \n",Vax_Mips); printf ("\n"); /************************************************************************ * Type details of hardware, software etc. * ************************************************************************/ if (getinput == 1) { printf ("Enter the following which will be added with results to file DHRY.TXT\n"); printf ("When submitting a number of results you need only provide details once\n"); printf ("but a cross reference such as an abbreviated CPU type would be useful.\n"); printf ("You can kill (exit or close) the program now and no data will be added.\n\n"); printf ("PC Supplier/model ? "); gets(general[1]); printf ("CPU chip ? "); gets(general[2]); printf ("Clock MHz ? "); gets(general[3]); printf ("Cache size ? "); gets(general[4]); printf ("Chipset & H/W options ? "); gets(general[5]); printf ("OS/DOS version ? "); gets(general[6]); printf ("Your name ? "); gets(general[7]); printf ("Company/Location ? "); gets(general[8]); printf ("E-mail address ? "); gets(general[0]); } /************************************************************************ * Add results to output file Dhry.txt * ************************************************************************/ fprintf (Ap, "-------------------- -----------------------------------" "\n"); fprintf (Ap, "Dhrystone Benchmark Version 2.1 (Language: C++)\n\n"); fprintf (Ap, "PC model %s\n", general[1]); fprintf (Ap, "CPU %s\n", general[2]); fprintf (Ap, "Clock MHz %s\n", general[3]); fprintf (Ap, "Cache %s\n", general[4]); fprintf (Ap, "Options %s\n", general[5]); fprintf (Ap, "OS/DOS %s\n", general[6]); fprintf (Ap, "Compiler %s\n", compiler); fprintf (Ap, "OptLevel %s\n", options); fprintf (Ap, "Run by %s\n", general[7]); fprintf (Ap, "From %s\n", general[8]); fprintf (Ap, "Mail %s\n\n", general[0]); fprintf (Ap, "Final values (* implementation-dependent):\n"); fprintf (Ap, "\n"); fprintf (Ap, "Int_Glob: "); if (Int_Glob == 5) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Int_Glob); fprintf (Ap, "Bool_Glob: "); if (Bool_Glob == 1) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Bool_Glob); fprintf (Ap, "Ch_1_Glob: "); if (Ch_1_Glob == 'A') fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%c\n", Ch_1_Glob); fprintf (Ap, "Ch_2_Glob: "); if (Ch_2_Glob == 'B') fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%c\n", Ch_2_Glob); fprintf (Ap, "Arr_1_Glob[8]: "); if (Arr_1_Glob[8] == 7) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Arr_1_Glob[8]); fprintf (Ap, "Arr_2_Glob8/7: "); if (Arr_2_Glob[8][7] == Number_Of_Runs + 10) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%10d\n", Arr_2_Glob[8][7]); fprintf (Ap, "Ptr_Glob-> \n"); fprintf (Ap, " Ptr_Comp: * %d\n", (int) Ptr_Glob->Ptr_Comp); fprintf (Ap, " Discr: "); if (Ptr_Glob->Discr == 0) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Ptr_Glob->Discr); fprintf (Ap, " Enum_Comp: "); if (Ptr_Glob->variant.var_1.Enum_Comp == 2) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Ptr_Glob->variant.var_1.Enum_Comp); fprintf (Ap, " Int_Comp: "); if (Ptr_Glob->variant.var_1.Int_Comp == 17) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Ptr_Glob->variant.var_1.Int_Comp); fprintf (Ap, " Str_Comp: "); if (strcmp(Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING") == 0) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%s\n", Ptr_Glob->variant.var_1.Str_Comp); fprintf (Ap, "Next_Ptr_Glob-> \n"); fprintf (Ap, " Ptr_Comp: * %d", (int) Next_Ptr_Glob->Ptr_Comp); fprintf (Ap, " same as above\n"); fprintf (Ap, " Discr: "); if (Next_Ptr_Glob->Discr == 0) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Next_Ptr_Glob->Discr); fprintf (Ap, " Enum_Comp: "); if (Next_Ptr_Glob->variant.var_1.Enum_Comp == 1) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); fprintf (Ap, " Int_Comp: "); if (Next_Ptr_Glob->variant.var_1.Int_Comp == 18) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); fprintf (Ap, " Str_Comp: "); if (strcmp(Next_Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING") == 0) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); fprintf (Ap, "Int_1_Loc: "); if (Int_1_Loc == 5) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Int_1_Loc); fprintf (Ap, "Int_2_Loc: "); if (Int_2_Loc == 13) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Int_2_Loc); fprintf (Ap, "Int_3_Loc: "); if (Int_3_Loc == 7) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Int_3_Loc); fprintf (Ap, "Enum_Loc: "); if (Enum_Loc == 1) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%d\n", Enum_Loc); fprintf (Ap, "Str_1_Loc: "); if (strcmp(Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING") == 0) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%s\n", Str_1_Loc); fprintf (Ap, "Str_2_Loc: "); if (strcmp(Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING") == 0) fprintf (Ap, "O.K. "); else fprintf (Ap, "WRONG "); fprintf (Ap, "%s\n", Str_2_Loc); fprintf (Ap, "\n"); fprintf(Ap,"%s\n",Reg_Define); fprintf (Ap, "\n"); fprintf(Ap,"Microseconds 1 loop: %12.2lf\n",Microseconds); fprintf(Ap,"Dhrystones / second: %10.0lf\n",Dhrystones_Per_Second); fprintf(Ap,"VAX MIPS rating: %12.2lf\n\n",Vax_Mips); fclose(Ap); } printf ("\n"); printf ("A new results file will have been created in the same directory as the\n"); printf (".EXE files if one did not already exist. If you made a mistake on input, \n"); printf ("you can use a text editor to correct it, delete the results or copy \n"); printf ("them to a different file name. If you intend to run multiple tests you\n"); printf ("you may wish to rename DHRY.TXT with a more informative title.\n\n"); printf ("Please submit feedback and results files as a posting in Section 12\n"); printf ("or to [email protected]\n\n"); if (getinput == 1) { printf("Press any key to exit\n"); printf ("\nIf this is displayed you must close the window in the normal way\n"); } }
int main () /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { One_Fifty Int_1_Loc; One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; int Run_Index; int Number_Of_Runs = NRUNS; /* Initializations */ Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "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. */ printf ("\n"); printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); printf ("\n"); while (Number_Of_Runs == 0) { int n; printf ("Please give the number of runs through the benchmark: "); if (scanf ("%d", &n) != 1) { printf ("Wrong number!\n"); continue; } Number_Of_Runs = n; printf ("\n"); } printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); /***************/ /* Start timer */ /***************/ gettimeofday(&time_info, 0); Begin_Time = time_info.tv_sec * 1000000L + time_info.tv_usec; for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ gettimeofday(&time_info, 0); End_Time = time_info.tv_sec * 1000000L + time_info.tv_usec; printf ("Execution ends\n"); printf ("\n"); printf ("Final values of the variables used in the benchmark:\n"); printf ("\n"); printf ("Int_Glob: %d\n", Int_Glob); printf (" should be: %d\n", 5); printf ("Bool_Glob: %d\n", Bool_Glob); printf (" should be: %d\n", 1); printf ("Ch_1_Glob: %c\n", Ch_1_Glob); printf (" should be: %c\n", 'A'); printf ("Ch_2_Glob: %c\n", Ch_2_Glob); printf (" should be: %c\n", 'B'); printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); printf (" should be: %d\n", 7); printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); printf (" should be: Number_Of_Runs + 10\n"); printf ("Ptr_Glob->\n"); printf (" Ptr_Comp: %p\n", Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent)\n"); printf (" Discr: %d\n", Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 2); printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 17); printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Next_Ptr_Glob->\n"); printf (" Ptr_Comp: %p\n", Next_Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent), same as above\n"); printf (" Discr: %d\n", Next_Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 1); printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 18); printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Int_1_Loc: %d\n", Int_1_Loc); printf (" should be: %d\n", 5); printf ("Int_2_Loc: %d\n", Int_2_Loc); printf (" should be: %d\n", 13); printf ("Int_3_Loc: %d\n", Int_3_Loc); printf (" should be: %d\n", 7); printf ("Enum_Loc: %d\n", Enum_Loc); printf (" should be: %d\n", 1); printf ("Str_1_Loc: %s\n", Str_1_Loc); printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); printf ("Str_2_Loc: %s\n", Str_2_Loc); printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); printf ("\n"); User_Time = End_Time - Begin_Time; /* Measurements should last at least 2 seconds */ if (User_Time < 2000000) { printf ("Measured time too small to obtain meaningful results\n"); printf ("Please increase number of runs\n"); printf ("\n"); } else { Microseconds = (float) User_Time / (float) Number_Of_Runs; Dhrystones_Per_Second = (float) Number_Of_Runs * 1000000 / (float) User_Time; printf ("Nanoseconds for one run through Dhrystone: %-7.1f \n", Microseconds * 1000); printf (" Million Dhrystones per Second: %-7.3f \n", Dhrystones_Per_Second / 1000000); printf (" DMIPS: %-7.1f \n", Dhrystones_Per_Second / DHRYSTONES_PER_DMIPS); printf ("\n"); } return 0; }
void dhry_main (int iterations) /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; /* Initializations */ Number_Of_Runs = iterations; Next_Ptr_Glob = (Rec_Pointer) dhry_malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) dhry_malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; Ptr_Glob->variant.var_1.Int_Comp = 40; dhry_strcpy (Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING"); dhry_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. */ dhry_prints ("\n"); dhry_prints ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); dhry_prints ("\n"); if (Reg) { dhry_prints ("Program compiled with 'register' attribute\n"); dhry_prints ("\n"); } else { dhry_prints ("Program compiled without 'register' attribute\n"); dhry_prints ("\n"); } dhry_prints ("Execution starts, "); dhry_printi (Number_Of_Runs); dhry_prints (" runs through Dhrystone\n"); /***************/ /* Start timer */ /***************/ Begin_Time = dhry_timestamp(); for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; dhry_strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); dhry_strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = dhry_sdiv32(Int_2_Loc, Int_3_Loc); Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ End_Time = dhry_timestamp(); dhry_prints ("Execution ends\n"); dhry_prints ("\n"); dhry_prints ("Final values of the variables used in the benchmark:\n"); dhry_prints ("\n"); dhry_prints ("Int_Glob: "); dhry_printi (Int_Glob); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (5); dhry_prints ("\n"); dhry_prints ("Bool_Glob: "); dhry_printi (Bool_Glob); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (1); dhry_prints ("\n"); dhry_prints ("Ch_1_Glob: "); dhry_printc (Ch_1_Glob); dhry_prints ("\n"); dhry_prints (" should be: A\n"); dhry_prints ("Ch_2_Glob: "); dhry_printc (Ch_2_Glob); dhry_prints ("\n"); dhry_prints (" should be: B\n"); dhry_prints ("Arr_1_Glob[8]: "); dhry_printi (Arr_1_Glob[8]); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (7); dhry_prints ("\n"); dhry_prints ("Arr_2_Glob[8][7]: "); dhry_printi (Arr_2_Glob[8][7]); dhry_prints ("\n"); dhry_prints (" should be: Number_Of_Runs + 10\n"); dhry_prints ("Ptr_Glob->\n"); dhry_prints (" Ptr_Comp: "); dhry_printi ((int) Ptr_Glob->Ptr_Comp); dhry_prints ("\n"); dhry_prints (" should be: (implementation-dependent)\n"); dhry_prints (" Discr: "); dhry_printi (Ptr_Glob->Discr); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (0); dhry_prints ("\n"); dhry_prints (" Enum_Comp: "); dhry_printi (Ptr_Glob->variant.var_1.Enum_Comp); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (2); dhry_prints ("\n"); dhry_prints (" Int_Comp: "); dhry_printi (Ptr_Glob->variant.var_1.Int_Comp); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (17); dhry_prints ("\n"); dhry_prints (" Str_Comp: "); dhry_prints (Ptr_Glob->variant.var_1.Str_Comp); dhry_prints ("\n"); dhry_prints (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); dhry_prints ("Next_Ptr_Glob->\n"); dhry_prints (" Ptr_Comp: "); dhry_printi ((int) Next_Ptr_Glob->Ptr_Comp); dhry_prints ("\n"); dhry_prints (" should be: (implementation-dependent), same as above\n"); dhry_prints (" Discr: "); dhry_printi (Next_Ptr_Glob->Discr); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (0); dhry_prints ("\n"); dhry_prints (" Enum_Comp: "); dhry_printi (Next_Ptr_Glob->variant.var_1.Enum_Comp); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (1); dhry_prints ("\n"); dhry_prints (" Int_Comp: "); dhry_printi (Next_Ptr_Glob->variant.var_1.Int_Comp); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (18); dhry_prints ("\n"); dhry_prints (" Str_Comp: "); dhry_prints (Next_Ptr_Glob->variant.var_1.Str_Comp); dhry_prints ("\n"); dhry_prints (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); dhry_prints ("Int_1_Loc: "); dhry_printi (Int_1_Loc); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (5); dhry_prints ("\n"); dhry_prints ("Int_2_Loc: "); dhry_printi (Int_2_Loc); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (13); dhry_prints ("\n"); dhry_prints ("Int_3_Loc: "); dhry_printi (Int_3_Loc); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (7); dhry_prints ("\n"); dhry_prints ("Enum_Loc: "); dhry_printi (Enum_Loc); dhry_prints ("\n"); dhry_prints (" should be: "); dhry_printi (1); dhry_prints ("\n"); dhry_prints ("Str_1_Loc: "); dhry_prints (Str_1_Loc); dhry_prints ("\n"); dhry_prints (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); dhry_prints ("Str_2_Loc: "); dhry_prints (Str_2_Loc); dhry_prints ("\n"); dhry_prints (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); dhry_prints ("\n"); User_Time = End_Time - Begin_Time; if (User_Time < Too_Small_Time) { dhry_prints ("Measured time too small to obtain meaningful results\n"); dhry_prints ("Please increase number of runs\n"); dhry_prints ("\n"); } else { Microseconds = dhry_to_microsecs(User_Time); Dhrystones_Per_Second = dhry_iter_per_sec(User_Time, Number_Of_Runs); dhry_prints ("Microseconds for one run through Dhrystone: "); dhry_printi (Microseconds); dhry_prints (" \n"); dhry_prints ("Dhrystones per Second: "); dhry_printi (Dhrystones_Per_Second); dhry_prints (" \n"); dhry_prints ("Dhrystones MIPS: "); dhry_printi (arm_sdiv32(Dhrystones_Per_Second, 1757)); dhry_prints (" \n"); dhry_prints ("\n"); } }
main () /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; Rec_Type sp1, sp2; /* Initializations */ Next_Ptr_Glob = (Rec_Pointer) &sp1; Ptr_Glob = (Rec_Pointer) &sp2; Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "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. */ ee_printf ("\n"); ee_printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); ee_printf ("\n"); if (Reg) { ee_printf ("Program compiled with 'register' attribute\n"); ee_printf ("\n"); } else { ee_printf ("Program compiled without 'register' attribute\n"); ee_printf ("\n"); } Number_Of_Runs = *(int *)SM_ITER_PORT; ee_printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); /***************/ /* Start timer */ /***************/ Begin_Time = *(long *)SM_TIME_PORT; for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ End_Time = *(long *)SM_TIME_PORT; ee_printf ("Execution ends\n"); ee_printf ("\n"); ee_printf ("Final values of the variables used in the benchmark:\n"); ee_printf ("\n"); ee_printf ("Int_Glob: %d\n", Int_Glob); ee_printf (" should be: %d\n", 5); ee_printf ("Bool_Glob: %d\n", Bool_Glob); ee_printf (" should be: %d\n", 1); ee_printf ("Ch_1_Glob: %c\n", Ch_1_Glob); ee_printf (" should be: %c\n", 'A'); ee_printf ("Ch_2_Glob: %c\n", Ch_2_Glob); ee_printf (" should be: %c\n", 'B'); ee_printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); ee_printf (" should be: %d\n", 7); ee_printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); ee_printf (" should be: Number_Of_Runs + 10\n"); ee_printf ("Ptr_Glob->\n"); ee_printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); ee_printf (" should be: (implementation-dependent)\n"); ee_printf (" Discr: %d\n", Ptr_Glob->Discr); ee_printf (" should be: %d\n", 0); ee_printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); ee_printf (" should be: %d\n", 2); ee_printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); ee_printf (" should be: %d\n", 17); ee_printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); ee_printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); ee_printf ("Next_Ptr_Glob->\n"); ee_printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); ee_printf (" should be: (implementation-dependent), same as above\n"); ee_printf (" Discr: %d\n", Next_Ptr_Glob->Discr); ee_printf (" should be: %d\n", 0); ee_printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); ee_printf (" should be: %d\n", 1); ee_printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); ee_printf (" should be: %d\n", 18); ee_printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); ee_printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); ee_printf ("Int_1_Loc: %d\n", Int_1_Loc); ee_printf (" should be: %d\n", 5); ee_printf ("Int_2_Loc: %d\n", Int_2_Loc); ee_printf (" should be: %d\n", 13); ee_printf ("Int_3_Loc: %d\n", Int_3_Loc); ee_printf (" should be: %d\n", 7); ee_printf ("Enum_Loc: %d\n", Enum_Loc); ee_printf (" should be: %d\n", 1); ee_printf ("Str_1_Loc: %s\n", Str_1_Loc); ee_printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); ee_printf ("Str_2_Loc: %s\n", Str_2_Loc); ee_printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); ee_printf ("\n"); User_Time = End_Time - Begin_Time; #define Too_Small_Time 0 if (User_Time < Too_Small_Time) { ee_printf ("Measured time too small to obtain meaningful results\n"); ee_printf ("Please increase number of runs\n"); ee_printf ("\n"); } else { #if 0 Microseconds = (float)User_Time/CLOCKS_PER_US; Dhrystones_Per_Second = (float) Number_Of_Runs / ((float)Microseconds / 1000000.0); #endif ee_printf ("Number of Runs: %d\n", Number_Of_Runs); ee_printf ("User Time: %ld\n", User_Time); #if 0 ee_printf ("Microseconds for one run through Dhrystone: "); ee_printf ("%6.1f \n", Microseconds); ee_printf ("Dhrystones per Second: "); ee_printf ("%6.1f \n", Dhrystones_Per_Second); ee_printf ("\n"); #endif } }
//#LIS# Start LIS Modification //Proc_1 (Ptr_Val_Par) Proc_1 () //### no parameters, as only global variables are used /******************/ //REG Rec_Pointer Ptr_Val_Par; //###equivalent to Ptr_Glob /* executed once */ //#LIS# End LIS Modification { //#LIS# Start LIS Modification //REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; Next_Record = Ptr_Glob->Ptr_Comp; //#LIS# End LIS Modification /* == Ptr_Glob_Next */ /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ /* corresponds to "rename" in Ada, "with" in Pascal */ //#LIS# Start LIS Modification //structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); structassign (*Ptr_Glob->Ptr_Comp, *Ptr_Glob); //#LIS# End LIS Modification //#LIS# Start LIS Modification //Ptr_Val_Par->variant.var_1.Int_Comp = 5; Ptr_Glob->variant.var_1.Int_Comp = 5; //#LIS# End LIS Modification //#LIS# Start LIS Modification //Next_Record->variant.var_1.Int_Comp = Ptr_Val_Par->variant.var_1.Int_Comp; Next_Record->variant.var_1.Int_Comp = Ptr_Glob->variant.var_1.Int_Comp; //#LIS# End LIS Modification //#LIS# Start LIS Modification //Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; //#LIS# End LIS Modification //#LIS# Start LIS Modification //Proc_3 (&Next_Record->Ptr_Comp); Ptr_Ref_Par = &Next_Record->Ptr_Comp; Proc_3(); //#LIS# End LIS Modification /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp == Ptr_Glob->Ptr_Comp */ if (Next_Record->Discr == Ident_1) /* then, executed */ { Next_Record->variant.var_1.Int_Comp = 6; //#LIS# Start LIS Modification /* Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, &Next_Record->variant.var_1.Enum_Comp); */ /*Proc_6 (Ptr_Glob->variant.var_1.Enum_Comp, &Next_Record->variant.var_1.Enum_Comp); */ Enum_Val_Par = Ptr_Glob->variant.var_1.Enum_Comp; Enum_Ref_Par = &Next_Record->variant.var_1.Enum_Comp; Proc_6(); //#LIS# End LIS Modification Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; //#LIS# Start LIS Modification /*Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, &Next_Record->variant.var_1.Int_Comp);*/ Int_1_Par_Val_Proc7 = Next_Record->variant.var_1.Int_Comp; Int_2_Par_Val_Proc7 = 10; Int_Par_Ref_Proc7 = &Next_Record->variant.var_1.Int_Comp; Proc_7(); //#LIS# End LIS Modification } else /* not executed */ //#LIS# Start LIS Modification //structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); structassign (*Ptr_Glob, *Ptr_Glob->Ptr_Comp); //#LIS# End LIS Modification } /* Proc_1 */
int main () /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc=0; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; Rec_Type x, y; /* Initializations */ Next_Ptr_Glob = (Rec_Pointer) &x; Ptr_Glob = (Rec_Pointer) &y; Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "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. */ /* Initalize Data and Instruction Cache */ printf (" %c", '\n'); printf ("Dhrystone Benchmark, Version 2.1 (Language: C)%c", '\n'); printf (" %c", '\n'); if (Reg) { printf ("Program compiled with 'register' attribute%c", '\n'); printf (" %c", '\n'); } else { printf ("Program compiled without 'register' attribute%c", '\n'); printf (" %c", '\n'); } printf ("Please give the number of runs through the benchmark:%c", ' '); { int n; /* scanf ("%d", &n); */ n = NUM_RUNS; Number_Of_Runs = n; } printf (" %c", '\n'); printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Ireport(1); Ireport(Run_Index); Proc_5(); Ireport(2); Proc_4(); Ireport(3); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Ireport(0x31); Ireport((unsigned long)Str_1_Loc); Ireport((unsigned long)Str_2_Loc); Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ Ireport(4); while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ Ireport(5); /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ #if DBG printf("a) Int_1_Loc: %x\n", Int_1_Loc); printf("a) Int_2_Loc: %x\n", Int_2_Loc); printf("a) Int_3_Loc: %x\n\n", Int_3_Loc); #endif Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ #if DBG printf("b) Int_1_Loc: %x\n", Int_1_Loc); printf("b) Int_2_Loc: %x\n", Int_2_Loc); printf("b) Int_3_Loc: %x\n\n", Int_3_Loc); #endif Ireport(6); Proc_1 (Ptr_Glob); #if DBG printf("c) Int_1_Loc: %x\n", Int_1_Loc); printf("c) Int_2_Loc: %x\n", Int_2_Loc); printf("c) Int_3_Loc: %x\n\n", Int_3_Loc); #endif Ireport(7); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; #if DBG printf("d) Int_1_Loc: %x\n", Int_1_Loc); printf("d) Int_2_Loc: %x\n", Int_2_Loc); printf("d) Int_3_Loc: %x\n\n", Int_3_Loc); #endif } } Ireport(8); /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ #if DBG printf("e) Int_1_Loc: %x\n", Int_1_Loc); printf("e) Int_2_Loc: %x\n", Int_2_Loc); printf("e) Int_3_Loc: %x\n", Int_3_Loc); printf("e) Ch_1_Glob: %c\n\n", Ch_1_Glob); #endif Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); Ireport(9); /* Int_1_Loc == 5 */ #if DBG printf("f) Int_1_Loc: %x\n", Int_1_Loc); printf("f) Int_2_Loc: %x\n", Int_2_Loc); printf("f) Int_3_Loc: %x\n\n", Int_3_Loc); #endif } /* loop "for Run_Index" */ printf ("Execution ends%c", '\n'); printf (" %c", '\n'); printf ("Final values of the variables used in the benchmark:%c", '\n'); printf (" %c", '\n'); printf ("Int_Glob: %d\n", Int_Glob); printf (" should be: %d\n", 5); printf ("Bool_Glob: %d\n", Bool_Glob); printf (" should be: %d\n", 1); printf ("Ch_1_Glob: %c\n", Ch_1_Glob); printf (" should be: %c\n", 'A'); printf ("Ch_2_Glob: %c\n", Ch_2_Glob); printf (" should be: %c\n", 'B'); printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); printf (" should be: %d\n", 7); printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); printf (" should be: Number_Of_Runs + 10%c", '\n'); printf ("Ptr_Glob->%c", '\n'); // printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent)%c", '\n'); printf (" Discr: %d\n", Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 2); printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 17); printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING%c", '\n'); printf ("Next_Ptr_Glob->%c", '\n'); // printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent), same as above%c", '\n'); printf (" Discr: %d\n", Next_Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 1); printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 18); printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING%c", '\n'); printf ("Int_1_Loc: %d\n", Int_1_Loc); printf (" should be: %d\n", 5); printf ("Int_2_Loc: %d\n", Int_2_Loc); printf (" should be: %d\n", 13); printf ("Int_3_Loc: %d\n", Int_3_Loc); printf (" should be: %d\n", 7); printf ("Enum_Loc: %d\n", Enum_Loc); printf (" should be: %d\n", 1); printf ("Str_1_Loc: %s\n", Str_1_Loc); printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING%c", '\n'); printf ("Str_2_Loc: %s\n", Str_2_Loc); printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING%c", '\n'); User_Time = End_Time - Begin_Time; /* microseconds */ printf("Begin Time = %d\n",Begin_Time); printf("End Time = %d\n",End_Time); if (User_Time < Too_Small_Time) { printf ("Measured time too small to obtain meaningful results%c", '\n'); printf ("Please increase number of runs%c", '\n'); printf (" %c", '\n'); } else { #if DLX || OR1K User_Time /= DLX_FREQ; #if DLX printf("DLX%c", ' '); #else #if OR1K printf("OR1K%c", ' '); #else printf("Unknown CPU%c", '\n'); #endif #endif printf("at %u MHz ", DLX_FREQ); if (PROC_6) printf("(+PROC_6) "); printf(" %c", '\n'); #endif Microseconds = User_Time / Number_Of_Runs; Dhrystones_Per_Second = Number_Of_Runs * 1000 / User_Time; printf ("Microseconds for one run through Dhrystone:%c", ' '); printf ("%d us / %d runs\n", User_Time,Number_Of_Runs); printf ("Dhrystones per Second: %c", ' '); printf ("%d \n", Dhrystones_Per_Second); } //report (0xdeaddead); return 0; }
int main (void) #endif // __ECOS__ /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { #ifndef __ECOS__ double dtime(); #endif // __ECOS__ One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; #ifdef __ECOS__ CYG_TEST_INIT(); #ifdef CYG_HAL_I386_LINUX CYG_TEST_NA("Only runs on hardware..."); #else if (cyg_test_is_simulator) CYG_TEST_NA("Only runs on hardware..."); #endif #else // __ECOS__ FILE *Ap; /* Initializations */ if ((Ap = fopen("dhry.res","a+")) == NULL) { printf("Can not open dhry.res\n\n"); exit(1); } #endif // __ECOS__ Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "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. */ printf ("\n"); printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); printf ("\n"); /* if (Reg) { printf ("Program compiled with 'register' attribute\n"); printf ("\n"); } else { printf ("Program compiled without 'register' attribute\n"); printf ("\n"); } */ #ifdef __ECOS__ Number_Of_Runs = PASSES; #else // __ECOS__ printf ("Please give the number of runs through the benchmark: "); { int n; scanf ("%d", &n); Number_Of_Runs = n; } printf ("\n"); #endif // __ECOS__ printf ("Execution starts, %d runs through Dhrystone\n",Number_Of_Runs); /***************/ /* Start timer */ /***************/ Begin_Time = dtime(); for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ End_Time = dtime(); printf ("Execution ends\n"); printf ("\n"); printf ("Final values of the variables used in the benchmark:\n"); printf ("\n"); printf ("Int_Glob: %d\n", Int_Glob); printf (" should be: %d\n", 5); printf ("Bool_Glob: %d\n", Bool_Glob); printf (" should be: %d\n", 1); printf ("Ch_1_Glob: %c\n", Ch_1_Glob); printf (" should be: %c\n", 'A'); printf ("Ch_2_Glob: %c\n", Ch_2_Glob); printf (" should be: %c\n", 'B'); printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); printf (" should be: %d\n", 7); printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); printf (" should be: Number_Of_Runs + 10\n"); printf ("Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent)\n"); printf (" Discr: %d\n", Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 2); printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 17); printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Next_Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent), same as above\n"); printf (" Discr: %d\n", Next_Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 1); printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 18); printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Int_1_Loc: %d\n", Int_1_Loc); printf (" should be: %d\n", 5); printf ("Int_2_Loc: %d\n", Int_2_Loc); printf (" should be: %d\n", 13); printf ("Int_3_Loc: %d\n", Int_3_Loc); printf (" should be: %d\n", 7); printf ("Enum_Loc: %d\n", Enum_Loc); printf (" should be: %d\n", 1); printf ("Str_1_Loc: %s\n", Str_1_Loc); printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); printf ("Str_2_Loc: %s\n", Str_2_Loc); printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); printf ("\n"); User_Time = End_Time - Begin_Time; if (User_Time < Too_Small_Time) { printf ("Measured time too small to obtain meaningful results\n"); printf ("Please increase number of runs\n"); printf ("\n"); } else { Microseconds = User_Time * Mic_secs_Per_Second / (double) Number_Of_Runs; Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time; Vax_Mips = Dhrystones_Per_Second / 1757.0; #ifdef ROPT printf ("Register option selected? YES\n"); #else printf ("Register option selected? NO\n"); #ifndef __ECOS__ strcpy(Reg_Define, "Register option not selected."); #endif // __ECOS__ #endif printf ("Microseconds for one run through Dhrystone: "); #ifdef __ECOS__ printf ("%7.1f \n", Microseconds); printf ("Dhrystones per Second: "); printf ("%10.1f \n", Dhrystones_Per_Second); printf ("VAX MIPS rating = %10.3f \n",Vax_Mips); printf ("\n"); #else // __ECOS__ printf ("%7.1lf \n", Microseconds); printf ("Dhrystones per Second: "); printf ("%10.1lf \n", Dhrystones_Per_Second); printf ("VAX MIPS rating = %10.3lf \n",Vax_Mips); printf ("\n"); fprintf(Ap,"\n"); fprintf(Ap,"Dhrystone Benchmark, Version 2.1 (Language: C)\n"); fprintf(Ap,"%s\n",Reg_Define); fprintf(Ap,"Microseconds for one loop: %7.1lf\n",Microseconds); fprintf(Ap,"Dhrystones per second: %10.1lf\n",Dhrystones_Per_Second); fprintf(Ap,"VAX MIPS rating: %10.3lf\n",Vax_Mips); fclose(Ap); #endif // __ECOS__ } #ifdef __ECOS__ CYG_TEST_PASS_FINISH("Dhrystone test"); #endif // __ECOS__ }
int main (int argc, char **argv) /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; /* Initializations */ Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "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. */ printf ("\n"); printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); printf ("\n"); if (Reg) { printf ("Program compiled with 'register' attribute\n"); printf ("\n"); } else { printf ("Program compiled without 'register' attribute\n"); printf ("\n"); } if (argc == 2) Number_Of_Runs = atoi (argv[1]); else { printf ("Please give the number of runs through the benchmark: "); fflush (stdout); { int n; scanf ("%d", &n); Number_Of_Runs = n; } printf ("\n"); } printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); /***************/ /* Start timer */ /***************/ #ifdef TIMES times (&time_info); Begin_Time = (long) time_info.tms_utime; #endif #ifdef TIME Begin_Time = time ((long *) 0); #endif for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5 (); Proc_4 (); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = !Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ #ifdef TIMES times (&time_info); End_Time = (long) time_info.tms_utime; #endif #ifdef TIME End_Time = time ((long *) 0); #endif printf ("Execution ends\n"); printf ("\n"); printf ("Final values of the variables used in the benchmark:\n"); printf ("\n"); printf ("Int_Glob: %d\n", Int_Glob); printf (" should be: %d\n", 5); printf ("Bool_Glob: %d\n", Bool_Glob); printf (" should be: %d\n", 1); printf ("Ch_1_Glob: %c\n", Ch_1_Glob); printf (" should be: %c\n", 'A'); printf ("Ch_2_Glob: %c\n", Ch_2_Glob); printf (" should be: %c\n", 'B'); printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); printf (" should be: %d\n", 7); printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); printf (" should be: Number_Of_Runs + 10\n"); printf ("Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent)\n"); printf (" Discr: %d\n", Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 2); printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 17); printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Next_Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent), same as above\n"); printf (" Discr: %d\n", Next_Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 1); printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 18); printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Int_1_Loc: %d\n", Int_1_Loc); printf (" should be: %d\n", 5); printf ("Int_2_Loc: %d\n", Int_2_Loc); printf (" should be: %d\n", 13); printf ("Int_3_Loc: %d\n", Int_3_Loc); printf (" should be: %d\n", 7); printf ("Enum_Loc: %d\n", Enum_Loc); printf (" should be: %d\n", 1); printf ("Str_1_Loc: %s\n", Str_1_Loc); printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); printf ("Str_2_Loc: %s\n", Str_2_Loc); printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); printf ("\n"); User_Time = End_Time - Begin_Time; if (User_Time < Too_Small_Time) { printf ("Measured time too small to obtain meaningful results\n"); printf ("Please increase number of runs\n"); printf ("\n"); } else { #ifdef TIME Microseconds = (float) User_Time *Mic_secs_Per_Second / (float) Number_Of_Runs; Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time; #else Microseconds = (float) User_Time *Mic_secs_Per_Second / ((float) HZ * ((float) Number_Of_Runs)); Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs) / (float) User_Time; #endif printf ("Microseconds for one run through Dhrystone: "); printf ("%6.1f \n", Microseconds); printf ("Dhrystones per Second: "); printf ("%6.1f \n", Dhrystones_Per_Second); } exit (0); }
int main () /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { /* CHANGE: We no longer use the code itself for timing. double dtime(); */ /* CHANGE: We need a strcpy function in MuddCLib. Since we don't pull string literal data out of object files, we have to put them on the stack. */ /* "DHRYSTONE PROGRAM, SOME STRING" */ char some_string[32] = {'D', 'H', 'R', 'Y', 'S', 'T', 'O', 'N', 'E', ' ', 'P', 'R', 'O', 'G', 'R', 'A', 'M', ',', ' ', 'S', 'O', 'M', 'E', ' ', 'S', 'T', 'R', 'I', 'N', 'G', '\0'}; /* "DHRYSTONE PROGRAM, 1'ST STRING" */ char first_string[32] = {'D', 'H', 'R', 'Y', 'S', 'T', 'O', 'N', 'E', ' ', 'P', 'R', 'O', 'G', 'R', 'A', 'M', ',', ' ', '1', '\'', 'S', 'T', ' ', 'S', 'T', 'R', 'I', 'N', 'G', '\0'}; /* Before we count down, we need to define the strings that will be used in the tests. "DHRYSTONE PROGRAM, 2'ND STRING" */ char second_string[32] = {'D', 'H', 'R', 'Y', 'S', 'T', 'O', 'N', 'E', ' ', 'P', 'R', 'O', 'G', 'R', 'A', 'M', ',', ' ', '2', '\'', 'N', 'D', ' ', 'S', 'T', 'R', 'I', 'N', 'G', '\0'}; /* "DHRYSTONE PROGRAM, 3'RD STRING" */ char third_string[32] = {'D', 'H', 'R', 'Y', 'S', 'T', 'O', 'N', 'E', ' ', 'P', 'R', 'O', 'G', 'R', 'A', 'M', ',', ' ', '3', '\'', 'R', 'D', ' ', 'S', 'T', 'R', 'I', 'N', 'G', '\0'}; /* Now some strings for LCD printing: */ char str_empty[1] = {'\0'}; char str_title[16] = {'D', 'h', 'r', 'y', 's', 't', 'o', 'n', 'e', ' ', 'v', '2', '.', '1', '\0'}; char str_starting[18] = {'S', 't', 'a', 'r', 't', 'i', 'n', 'g', ' ', 'i', 'n', ' ', '4', '.', '.', '.', '\0'}; char str_running[9] = {'R', 'u', 'n', 'n', 'i', 'n', 'g', '\0'}; char str_done[7] = {'D', 'o', 'n', 'e', '!', '\0'}; char str_success[9] = {'S', 'u', 'c', 'c', 'e', 's', 's', '\0'}; char str_failure[9] = {'F', 'a', 'i', 'l', 'u', 'r', 'e', '\0'}; One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs = NUMBER_OF_RUNS; // Number of runs is 10,000 int i; int testsSucceeded; /* We'll hard-code 100,000 runs in for now and see how that does. */ /* Initializations */ /* CHANGE: We're never using sde!! #if !#system(sde) FILE *Ap; if ((Ap = fopen("dhry.res","a+")) == NULL) { printf("Can not open dhry.res\n\n"); exit(1); } #endif */ /* CHANGE: We don't have a malloc function. Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); */ Next_Ptr_Glob = &Next_Rec_Glob; Ptr_Glob = &Rec_Glob; Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; Ptr_Glob->variant.Enum_Comp = Ident_3; Ptr_Glob->variant.Int_Comp = 40; strcpy (Ptr_Glob->variant.Str_Comp, some_string); strcpy (Str_1_Loc, first_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. */ /* CHANGE: No printing necessary! printf ("\n"); printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); printf ("\n");*/ /* if (Reg) { printf ("Program compiled with 'register' attribute\n"); printf ("\n"); } else { printf ("Program compiled without 'register' attribute\n"); printf ("\n"); } */ /* CHANGE: We'll never run this on sde and we set the number of runs at the beginning of main, so we don't need to read it! #if #system(sde) // Call a non-inlineable function to prevent loop unrolling // from knowing the number of loops. Number_Of_Runs = number_of_runs (); #else printf ("Please give the number of runs through the benchmark: "); { int n; scanf ("%d", &n); Number_Of_Runs = n; } printf ("\n"); #endif */ /* CHANGE: Instead of printing that execution starts here, we'll flash some LEDs. printf ("Execution starts, %d runs through Dhrystone\n",Number_Of_Runs); */ /* Initialize the LCD. */ initLCD(); sendInst( L_disp ); /* The LEDs count down one at a time, then flash to indicate the beginning of tests. */ setLED(0x8); dispMessage(str_title, str_starting); delay1000clock(200); setLED(0x4); move(0x4C); dispChar( '3' ); delay1000clock(200); setLED(0x2); move(0x4C); dispChar( '2' ); delay1000clock(200); setLED(0x1); move(0x4C); dispChar( '1' ); delay1000clock(200); setLED(0xF); move(0x4C); dispChar( '0' ); delay1000clock(50); dispMessage(str_running, str_empty); setLED(0x0); /***************/ /* Start timer */ /***************/ /* CHANGE: No more internal timing. Begin_Time = dtime(); */ for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, second_string); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, third_string); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ setLED(0xF); /* Flash the LEDs to indicate the end of the tests. */ for(i = 0; i < 3; ++i) { setLED(0xF); delay1000clock(100); setLED(0x0); delay1000clock(100); } /* Check all of the results, and display pass or fail on the LEDs. */ /* Assume tests succeeded and challenge. */ testsSucceeded = (Int_Glob == 5) && (Bool_Glob == 1) && (Ch_1_Glob == 'A') && (Ch_2_Glob == 'B') && (Arr_1_Glob[8] == 7) && (Arr_2_Glob[8][7] == Number_Of_Runs + 10) && ((int)Ptr_Glob->Ptr_Comp == (int)Next_Ptr_Glob->Ptr_Comp) && (Ptr_Glob->Discr == 0) && (Ptr_Glob->variant.Enum_Comp == 2) && (Ptr_Glob->variant.Int_Comp == 17) && !strcmp(Ptr_Glob->variant.Str_Comp, some_string) && // strcmp returns 0 if they're the same! (Next_Ptr_Glob->Discr == 0) && (Next_Ptr_Glob->variant.Enum_Comp == 1) && (Next_Ptr_Glob->variant.Int_Comp == 18) && !strcmp(Next_Ptr_Glob->variant.Str_Comp, some_string) && (Int_1_Loc == 5) && (Int_2_Loc == 13) && (Int_3_Loc == 7) && (Enum_Loc == 1) && !strcmp(Str_1_Loc, first_string) && !strcmp(Str_2_Loc, second_string); if(testsSucceeded) { dispMessage(str_done, str_success); /* LEDs show fireworks */ while(1) { setLED(0x2); delay1000clock(100); setLED(0x5); delay1000clock(100); setLED(0x8); delay1000clock(100); setLED(0x0); delay1000clock(500); setLED(0x4); delay1000clock(100); setLED(0xA); delay1000clock(100); setLED(0x1); delay1000clock(100); setLED(0x0); delay1000clock(700); } } else { dispMessage(str_done, str_failure); /* LEDs flash quickly */ while(1) { setLED(0xF); delay1000clock(50); setLED(0x0); delay1000clock(50); } } /* CHANGE: We don't print any of the data, but we'll validate it and flash the LEDs accordingly. End_Time = dtime(); printf ("Execution ends\n"); printf ("\n"); printf ("Final values of the variables used in the benchmark:\n"); printf ("\n"); printf ("Int_Glob: %d\n", Int_Glob); printf (" should be: %d\n", 5); printf ("Bool_Glob: %d\n", Bool_Glob); printf (" should be: %d\n", 1); printf ("Ch_1_Glob: %c\n", Ch_1_Glob); printf (" should be: %c\n", 'A'); printf ("Ch_2_Glob: %c\n", Ch_2_Glob); printf (" should be: %c\n", 'B'); printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); printf (" should be: %d\n", 7); printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); printf (" should be: Number_Of_Runs + 10\n"); printf ("Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent)\n"); printf (" Discr: %d\n", Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Ptr_Glob->variant.Enum_Comp); printf (" should be: %d\n", 2); printf (" Int_Comp: %d\n", Ptr_Glob->variant.Int_Comp); printf (" should be: %d\n", 17); printf (" Str_Comp: %s\n", Ptr_Glob->variant.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Next_Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent), same as above\n"); printf (" Discr: %d\n", Next_Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.Enum_Comp); printf (" should be: %d\n", 1); printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.Int_Comp); printf (" should be: %d\n", 18); printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Int_1_Loc: %d\n", Int_1_Loc); printf (" should be: %d\n", 5); printf ("Int_2_Loc: %d\n", Int_2_Loc); printf (" should be: %d\n", 13); printf ("Int_3_Loc: %d\n", Int_3_Loc); printf (" should be: %d\n", 7); printf ("Enum_Loc: %d\n", Enum_Loc); printf (" should be: %d\n", 1); printf ("Str_1_Loc: %s\n", Str_1_Loc); printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); printf ("Str_2_Loc: %s\n", Str_2_Loc); printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); printf ("\n"); User_Time = End_Time - Begin_Time; if (User_Time < Too_Small_Time) { printf ("Measured time too small to obtain meaningful results\n"); printf ("Please increase number of runs\n"); printf ("\n"); } else { Microseconds = User_Time * Mic_secs_Per_Second / (double) Number_Of_Runs; Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time; Vax_Mips = Dhrystones_Per_Second / 1757.0; */ /* CHANGE: All of these data will be recorded by a human datataker and a stopwatch. #ifdef ROPT printf ("Register option selected? YES\n"); #else printf ("Register option selected? NO\n"); // XXX bug in dhrystone - writes beyond end of Reg_Define XXX // strcpy(Reg_Define, "Register option not selected."); #endif printf ("Microseconds for one run through Dhrystone: "); printf ("%7.1lf \n", Microseconds); printf ("Dhrystones per Second: "); printf ("%10.1lf \n", Dhrystones_Per_Second); printf ("VAX MIPS rating = %10.3lf \n",Vax_Mips); printf ("\n"); #if !#system(sde) fprintf(Ap,"\n"); fprintf(Ap,"Dhrystone Benchmark, Version 2.1 (Language: C)\n"); #ifdef ROPT fprintf(Ap,"%s\n",Reg_Define); #else fprintf (Ap,"Register option not selected.\n"); #endif fprintf(Ap,"Microseconds for one loop: %7.1lf\n",Microseconds); fprintf(Ap,"Dhrystones per second: %10.1lf\n",Dhrystones_Per_Second); fprintf(Ap,"VAX MIPS rating: %10.3lf\n",Vax_Mips); fclose(Ap); #endif } */ return (0); } /* End of main() */
void dhry_test(void) /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; /* Initializations */ Next_Ptr_Glob = (Rec_Pointer) rt_malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) rt_malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; Ptr_Glob->variant.var_1.Int_Comp = 40; rt_strncpy (Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING", sizeof(Ptr_Glob->variant.var_1.Str_Comp)); rt_strncpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING", sizeof(Str_1_Loc)); 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. */ printf ("\n"); printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); printf ("\n"); if (Reg) { printf ("Program compiled with 'register' attribute\n"); printf ("\n"); } else { printf ("Program compiled without 'register' attribute\n"); printf ("\n"); } printf ("Please give the number of runs through the benchmark: "); Number_Of_Runs = NUMBER_OF_RUNS; printf ("%d\n", Number_Of_Runs); printf ("\n"); printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); /***************/ /* Start timer */ /***************/ // Add your timer initializing code here Begin_Time = rt_tick_get(); /* get start tick */ for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; rt_strncpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING", sizeof(Str_2_Loc)); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); rt_strncpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING", sizeof(Str_2_Loc)); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ End_Time = rt_tick_get(); // Get end tick printf ("Execution ends\n"); printf ("\n"); printf ("Final values of the variables used in the benchmark:\n"); printf ("\n"); printf ("Int_Glob: %d\n", Int_Glob); printf (" should be: %d\n", 5); printf ("Bool_Glob: %d\n", Bool_Glob); printf (" should be: %d\n", 1); printf ("Ch_1_Glob: %c\n", Ch_1_Glob); printf (" should be: %c\n", 'A'); printf ("Ch_2_Glob: %c\n", Ch_2_Glob); printf (" should be: %c\n", 'B'); printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); printf (" should be: %d\n", 7); printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); printf (" should be: Number_Of_Runs + 10\n"); printf ("Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent)\n"); printf (" Discr: %d\n", Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 2); printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 17); printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Next_Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent), same as above\n"); printf (" Discr: %d\n", Next_Ptr_Glob->Discr); printf (" should be: %d\n", 0); printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); printf (" should be: %d\n", 1); printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); printf (" should be: %d\n", 18); printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Int_1_Loc: %d\n", Int_1_Loc); printf (" should be: %d\n", 5); printf ("Int_2_Loc: %d\n", Int_2_Loc); printf (" should be: %d\n", 13); printf ("Int_3_Loc: %d\n", Int_3_Loc); printf (" should be: %d\n", 7); printf ("Enum_Loc: %d\n", Enum_Loc); printf (" should be: %d\n", 1); printf ("Str_1_Loc: %s\n", Str_1_Loc); printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); printf ("Str_2_Loc: %s\n", Str_2_Loc); printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); printf ("\n"); User_Time = (End_Time - Begin_Time) / RT_TICK_PER_SECOND; Microseconds = (float) User_Time * Mic_secs_Per_Second / (float) Number_Of_Runs; Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time; printf ("Microseconds for one run through Dhrystone: "); printf ("%6d \n", (int)Microseconds); printf ("Dhrystones per Second: "); printf ("%6d \n", (int)Dhrystones_Per_Second); printf ("Dhrystones MIPS: "); printf ("%6d \n", (int)(Dhrystones_Per_Second / 1757.0)); printf ("\n"); }
int dhry ( int Number_Of_Runs ) /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; /* Initializations */ Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; Ptr_Glob->Discr = Ident_1; 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, "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. */ printf ("\n"); printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); printf ("\n"); if (Reg) { printf ("Program compiled with 'register' attribute\n"); printf ("\n"); } else { printf ("Program compiled without 'register' attribute\n"); printf ("\n"); } printf ("\n"); printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); /***************/ /* Start timer */ /***************/ #ifdef TIMES times (&time_info); Begin_Time = (long) time_info.tms_utime; #endif #ifdef TIME Begin_Time = time ( (long *) 0); #endif for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; Int_Glob = Run_Index; } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ } /* loop "for Run_Index" */ /**************/ /* Stop timer */ /**************/ #ifdef TIMES times (&time_info); End_Time = (long) time_info.tms_utime; #endif #ifdef TIME End_Time = time ( (long *) 0); #endif assert(Int_Glob == 5); assert(Bool_Glob); assert(Ch_1_Glob == 'A'); assert(Ch_2_Glob == 'B'); assert(Arr_1_Glob[8] == 7); assert(Arr_2_Glob[8][7] == Number_Of_Runs + 10); assert(Ptr_Glob->Discr == 0); assert(Ptr_Glob->variant.var_1.Enum_Comp == 2); assert(Ptr_Glob->variant.var_1.Int_Comp == 17); assert(!strcmp(Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING")); assert((int) Ptr_Glob->Ptr_Comp == (int) Next_Ptr_Glob->Ptr_Comp); assert(Next_Ptr_Glob->Discr == 0); assert(Next_Ptr_Glob->variant.var_1.Enum_Comp == 1); assert(Next_Ptr_Glob->variant.var_1.Int_Comp == 18); assert(!strcmp(Next_Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING")); assert(Int_1_Loc == 5); assert(Int_2_Loc == 13); assert(Int_3_Loc == 7); assert(Enum_Loc == 1); assert(!strcmp(Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING")); assert(!strcmp(Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING")); User_Time = End_Time - Begin_Time; return User_Time; }