koreth@panarthea.ebay.sun.com (Steven Grimm) (12/22/89)
Submitted-by: rosenkra@hall.cray.com (Bill Rosenkranz) Posting-number: Volume 3, Issue 13 Archive-name: dhrystone this is a port of the dhrystone bm, v2.0, i found on the MIPS BBS. when run on my mega4, compiled with alcyon 4.14, it ran at about 719. see the file OUT.ST for the results of that run. -bill net: rosenkra@hall.cray.com CIS: 71460,17 --------cut here--------------cut here----------------cut here--------------- # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by hall!rosenkra on Tue Dec 5 23:34:28 CST 1989 # Contents: MANIFEST Makefile README OUT.ST config.h dhry_glo.h dhry_p1.c # dhry_p2.c echo x - MANIFEST sed 's/^@//' > "MANIFEST" <<'@//E*O*F MANIFEST//' total 66 -rw-r--r-- 1 rosenkra 550 Dec 5 23:30 MANIFEST -rw-r--r-- 1 rosenkra 935 Dec 5 23:22 Makefile -rw-r--r-- 1 rosenkra 1773 Dec 5 23:22 OUT.ST -rw-r--r-- 1 rosenkra 16178 Dec 5 23:22 README -rw-r--r-- 1 rosenkra 235 Dec 5 23:30 README.ST -rw-r--r-- 1 rosenkra 712 Dec 5 23:22 config.h -rw-r--r-- 1 rosenkra 2189 Dec 5 23:22 dhry_glo.h -rw-r--r-- 1 rosenkra 10993 Dec 5 23:22 dhry_p1.c -rw-r--r-- 1 rosenkra 4456 Dec 5 23:22 dhry_p2.c @//E*O*F MANIFEST// chmod u=rw,g=r,o=r MANIFEST echo x - Makefile sed 's/^@//' > "Makefile" <<'@//E*O*F Makefile//' # makefile for Dhrystone v2.0 for atariST (alcyon) # # first edit config.h for your system/compiler... # UUENCODE = c:\bin\uue.ttp TARGET = dhry.ttp ARCFILE = dhry20st.arc SHARFILE = dhry20st.shr UUFILE = dhry.uue SRCS = config.h dhry_glo.h dhry_p1.c dhry_p2.c OTHERS = readme makefile DISTFILES = $(OTHERS) $(SRCS) OBJS = dhry_p1.o dhry_p2.o LIBS = -llibc LDFLAGS = -s -new CFLAGS = -new # main target... # $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LIBS) # to run it... # run: $(TARGET) $(TARGET) 30000 clean: rm $(OBJS) errs clobber: clean rm $(TARGET) arc: $(ARC) a $(ARCFILE) $(DISTFILES) @echo done making $(ARCFILE) uue: $(UUENCODE) $(TARGET) @echo done making $(UUFILE) shar: $(SHAR) $(DISTFILES) >$(SHARFILE) @echo done making $(SHARFILE) # dependencies... # dhry_glo.h: config.h $(TOUCH) dhry_glo.h dhry_p1.o: dhry_glo.h dhry_p1.c dhry_p2.o: dhry_glo.h dhry_p2.c @//E*O*F Makefile// chmod u=rw,g=r,o=r Makefile echo x - README sed 's/^@//' > "README" <<'@//E*O*F README//' /* NOTE: edit config.h first for your system!!! */ /* **************************************************************************** * * "DHRYSTONE" Benchmark Program * ----------------------------- * * Version: C, Version 2.0 * * Date: March 3, 1988 * * Author: Reinhold P. Weicker * Siemens AG, E STE 35 * Postfach 3240 * 8520 Erlangen * Germany (West) * Phone: [xxx-49]-9131-7-20330 * (8-17 Central European Time) * Usenet: ..!mcvax!unido!estevax!weicker * * Original Version (in Ada) published in * "Communications of the ACM" vol. 27., no. 10 (Oct. 1984), * pp. 1013 - 1030, together with the statistics * on which the distribution of statements etc. is based. * * In this C version, the following C library functions are used: * - strcpy, strcmp (inside the measurement loop) * - printf, scanf (outside the measurement loop) * In addition, UNIX system calls "times ()" or "time ()" * are used for execution time measurement. For measurements * on other systems, these calls have to be changed. * * Collection of Results: * Reinhold Weicker (address see above) and * * Rick Richardson * PC Research. Inc. * 94 Apple Orchard Drive * Tinton Falls, NJ 07724 * Phone: (201) 834-1378 (9-17 EST) * Usenet: ...!seismo!uunet!pcrat!rick * * Please send results to Reinhold Weicker and/or Rick Richardson. * Complete information should be given on hardware and software used. * Hardware information includes: Machine type, CPU, type and size * of caches; for microprocessors: clock frequency, memory speed * (number of wait states). * Software information includes: Compiler (and runtime library) * manufacturer and version, compilation switches, OS version. * The Operating System version may give an indication about the * compiler; Dhrystone itself performs no OS calls in the measurement loop. * * The complete output generated by the program should be mailed * such that at least some checks for correctness can be made. */ /* *************************************************************************** * * History: This version C/2.0 has been made for two reasons: * * 1) There is an obvious need for a common C version of * Dhrystone, since C is at present the most popular system * programming language for the class of processors * (microcomputers, minicomputers) where Dhrystone is used most. * There should be, as far as possible, only one C version of * Dhrystone such that results can be compared without * restrictions. In the past, the C versions distributed * by Rick Richardson (Version 1.1) and by Reinhold Weicker * had small (though not significant) differences. * * 2) As far as it is possible without changes to the Dhrystone * statistics, optimizing compilers should be prevented from * removing significant statements. * * This C version has been developed in cooperation with * Rick Richardson (Tinton Falls, NJ), it incorporates many * ideas from the "Version 1.1" distributed previously by * him over the UNIX network Usenet. * I also thank Chaim Benedelac (National Semiconductor), * David Ditzel (SUN), Earl Killian and John Mashey (MIPS), * Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley) * for their help with comments on earlier versions of the * benchmark. * * Changes: In the initialization part, this version follows mostly * Rick Richardson's version distributed via Usenet, not the * version distributed earlier via floppy disk by Reinhold Weicker. * As a concession to older compilers, names have been made * unique within the first 8 characters. * Inside the measurement loop, this version follows the * version previously distributed by Reinhold Weicker. * * At several places in the benchmark, code has been added, * but within the measurement loop only in branches that * are not executed. The intention is that optimizing compilers * should be prevented from moving code out of the measurement * loop, or from removing code altogether. Since the statements * that are executed within the measurement loop have NOT been * changed, the numbers defining the "Dhrystone distribution" * (distribution of statements, operand types and locality) * still hold. Except for sophisticated optimizing compilers, * execution times for this version should be the same as * for previous versions. * * Since it has proven difficult to subtract the time for the * measurement loop overhead in a correct way, the loop check * has been made a part of the benchmark. This does have * an impact - though a very minor one - on the distribution * statistics which have been updated for this version. * * All changes within the measurement loop are described * and discussed in the companion paper "Rationale for * Dhrystone version 2". * * Because of the self-imposed limitation that the order and * distribution of the executed statements should not be * changed, there are still cases where optimizing compilers * may not generate code for some statements. To a certain * degree, this is unavoidable for small synthetic benchmarks. * Users of the benchmark are advised to check code listings * whether code is generated for all statements of Dhrystone. */ /* *************************************************************************** * * Defines: The following "Defines" are possible: * -DREG=register (default: Not defined) * As an approximation to what an average C programmer * might do, the "register" storage class is applied * (if enabled by -DREG=register) * - for local variables, if they are used (dynamically) * five or more times * - for parameters if they are used (dynamically) * six or more times * Note that an optimal "register" strategy is * compiler-dependent, and that "register" declarations * do not necessarily lead to faster execution. * -DNOSTRUCTASSIGN (default: Not defined) * Define if the C compiler does not support * assignment of structures. * -DNOENUMS (default: Not defined) * Define if the C compiler does not support * enumeration types. * -DTIMES (default) * -DTIME * The "times" function of UNIX (returning process times) * or the "time" function (returning wallclock time) * is used for measurement. * For single user machines, "time ()" is adequate. For * multi-user machines where you cannot get single-user * access, use the "times ()" function. If you have * neither, use a stopwatch in the dead of night. * "printf"s are provided marking the points "Start Timer" * and "Stop Timer". DO NOT use the UNIX "time(1)" * command, as this will measure the total time to * run this program, which will (erroneously) include * the time to allocate storage (malloc) and to perform * the initialization. * -DHZ=nnn (default: 60) * The function "times" returns process times in * 1/HZ seconds, with HZ = 60 for most systems. * CHECK YOUR SYSTEM DESCRIPTION BEFORE YOU JUST APPLY * THE DEFAULT VALUE. */ /* *************************************************************************** * * Compilation model and measurement (IMPORTANT): * * This C version of Dhrystone consists of three files: * - dhry_global.h (this file, containing global definitions and comments) * - dhry_pack_1.c (containing the code corresponding to Ada package Pack_1) * - dhry_pack_2.c (containing the code corresponding to Ada package Pack_2) * * The following "ground rules" apply for measurements: * - Separate compilation * - No procedure merging * - Otherwise, compiler optimizations are allowed but should be indicated * - Default results are those without register declarations * See the companion paper "Rationale for Dhrystone Version 2" for a more * detailed discussion of these ground rules. * * For 16-Bit processors (e.g. 80186, 80286), times for all compilation * models ("small", "medium", "large" etc.) should be given if possible, * together with a definition of these models for the compiler system used. */ /* ************************************************************************** * * Dhrystone (C version) statistics: * * [Comment from the first distribution, updated for version 2. * Note that because of language differences, the numbers are slightly * different from the Ada version.] * * The following program contains statements of a high level programming * language (here: C) in a distribution considered representative: * * assignments 52 (51.0 %) * control statements 33 (32.4 %) * procedure, function calls 17 (16.7 %) * * 103 statements are dynamically executed. The program is balanced with * respect to the three aspects: * * - statement type * - operand type * - operand locality * operand global, local, parameter, or constant. * * The combination of these three aspects is balanced only approximately. * * 1. Statement Type: * ----------------- number * * V1 = V2 9 * (incl. V1 = F(..) * V = Constant 12 * Assignment, 7 * with array element * Assignment, 6 * with record component * -- * 34 34 * * X = Y +|-|"&&"|"|" Z 5 * X = Y +|-|"==" Constant 6 * X = X +|- 1 3 * X = Y *|/ Z 2 * X = Expression, 1 * two operators * X = Expression, 1 * three operators * -- * 18 18 * * if .... 14 * with "else" 7 * without "else" 7 * executed 3 * not executed 4 * for ... 7 | counted every time * while ... 4 | the loop condition * do ... while 1 | is evaluated * switch ... 1 * break 1 * declaration with 1 * initialization * -- * 34 34 * * P (...) procedure call 11 * user procedure 10 * library procedure 1 * X = F (...) * function call 6 * user function 5 * library function 1 * -- * 17 17 * --- * 103 * * The average number of parameters in procedure or function calls * is 1.82 (not counting the function values as implicit parameters). * * * 2. Operators * ------------ * number approximate * percentage * * Arithmetic 32 50.8 * * + 21 33.3 * - 7 11.1 * * 3 4.8 * / (int div) 1 1.6 * * Comparison 27 42.8 * * == 9 14.3 * /= 4 6.3 * > 1 1.6 * < 3 4.8 * >= 1 1.6 * <= 9 14.3 * * Logic 4 6.3 * * && (AND-THEN) 1 1.6 * | (OR) 1 1.6 * ! (NOT) 2 3.2 * * -- ----- * 63 100.1 * * * 3. Operand Type (counted once per operand reference): * --------------- * number approximate * percentage * * Integer 175 72.3 % * Character 45 18.6 % * Pointer 12 5.0 % * String30 6 2.5 % * Array 2 0.8 % * Record 2 0.8 % * --- ------- * 242 100.0 % * * When there is an access path leading to the final operand (e.g. a record * component), only the final data type on the access path is counted. * * * 4. Operand Locality: * ------------------- * number approximate * percentage * * local variable 114 47.1 % * global variable 22 9.1 % * parameter 45 18.6 % * value 23 9.5 % * reference 22 9.1 % * function result 6 2.5 % * constant 55 22.7 % * --- ------- * 242 100.0 % * * * The program does not compute anything meaningful, but it is syntactically * and semantically correct. All variables have a value assigned to them * before they are used as a source operand. * * There has been no explicit effort to account for the effects of a * cache, or to balance the use of long or short displacements for code or * data. * *************************************************************************** */ @//E*O*F README// chmod u=rw,g=r,o=r README echo x - OUT.ST sed 's/^@//' > "OUT.ST" <<'@//E*O*F OUT.ST//' dhry.ttp 30000 Dhrystone Benchmark, Version 2.0 (Language: C) System: Atari MegsST 4 (TOS, 8 Mhz) Compiler: DRI/Alcyon 4.14 Program compiled with 'register' attribute Execution starts, 30000 runs through Dhrystone Execution ends Final values of the variables used in the benchmark: Int_Glob: 5 should be: 5 Bool_Glob: 1 should be: 1 Ch_1_Glob: A should be: A Ch_2_Glob: B should be: B Ar_1_Glob[8]: 7 should be: 7 Ar_2_Glob[8][7]: 30010 should be: Number_Of_Runs + 10 Ptr_Glob-> Ptr_Comp: 22250 should be: (implementation-dependent) Discr: 0 should be: 0 Enum_Comp: 2 should be: 2 Int_Comp: 17 should be: 17 Str_Comp: DHRYSTONE PROGRAM, SOME STRING should be: DHRYSTONE PROGRAM, SOME STRING Next_Ptr_Glob-> Ptr_Comp: 22250 should be: (implementation-dependent), same as above Discr: 0 should be: 0 Enum_Comp: 1 should be: 1 Int_Comp: 18 should be: 18 Str_Comp: DHRYSTONE PROGRAM, SOME STRING should be: DHRYSTONE PROGRAM, SOME STRING Int_1_Loc: 5 should be: 5 Int_2_Loc: 13 should be: 13 Int_3_Loc: 7 should be: 7 Enum_Loc: 1 should be: 1 Str_1_Loc: DHRYSTONE PROGRAM, 1'ST STRING should be: DHRYSTONE PROGRAM, 1'ST STRING Str_2_Loc: DHRYSTONE PROGRAM, 2'ND STRING should be: DHRYSTONE PROGRAM, 2'ND STRING Microseconds for one run through Dhrystone: 1449.9 Dhrystones per Second: 719.2 @//E*O*F OUT.ST// chmod u=rw,g=r,o=r OUT.ST echo x - config.h sed 's/^@//' > "config.h" <<'@//E*O*F config.h//' /* * config.h - configuration for Dhrystone 2.0 * * choices: * -DREG=register * -DNOSTRUCTASSIGN * -DNOENUMS * -DTIMES * -DTIME * -DHZ=nnn */ /* * atariST (TOS, dri/alcyon 4.14) * * int is 16 bits here. so max times thru is < 32k times. * */ #define ALCYON #define SYSTYPE "Atari MegsST 4 (TOS 1.2, 8 Mhz 68000)" #define COMPTYPE "DRI/Alcyon 4.14 (16-bit ints)" #define REG register #define TIME #define NOENUM /* * BSD * #define SYSTYPE "BSD Unix" #define COMPTYPE "pcc" #define REG register #define TIME */ /* * SYSV * #define SYSTYPE "System V.3 Unix" #define COMPTYPE "pcc" #define REG register #define TIME */ @//E*O*F config.h// chmod u=rw,g=r,o=r config.h echo x - dhry_glo.h sed 's/^@//' > "dhry_glo.h" <<'@//E*O*F dhry_glo.h//' #include "config.h" /* **************************************************************************** * * "DHRYSTONE" Benchmark Program * ----------------------------- * * Version: C, Version 2.0 * * File: dhry_glo.h (part 1 of 3) * * Date: March 3, 1988 * * Author: Reinhold P. Weicker * **************************************************************************** */ /* * Compiler and system dependent definitions: */ #ifndef TIME #ifndef TIMES /* Use "times" function for measurement */ #define TIMES /* unless explicitly defined otherwise */ #endif #endif #ifndef HZ #define HZ 60 /* Use HZ = 60 for "times" function */ #endif /* unless explicitly defined otherwise */ #ifdef TIMES #include <sys/types.h> #include <sys/times.h> /* for "times" */ #endif #define Usec_Per_Second 1000000.0/* UNIX C returns process times in seconds/HZ */ #ifdef NOSTRUCTASSIGN #define str_asgn(d,s) memcpy(&(d), &(s), sizeof(d)) #else #define str_asgn(d,s) d = s #endif /* * for boolean and enumeration types in Ada, Pascal */ #ifdef NOENUM #define Ident_1 0 #define Ident_2 1 #define Ident_3 2 #define Ident_4 3 #define Ident_5 4 #define Enumeration int #else typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5} Enumeration; #endif /* * General definitions: */ #include <stdio.h> /* for strcpy, strcmp */ #define Null 0 /* Value of a Null pointer */ #define true 1 #define false 0 #define One_Thirty int #define One_Fifty int #define Capital_Letter char #define Boolean int #define Str_30 char #define Array int #define Rec_Type struct record #define Rec_Pointer struct recort struct record { struct record *Ptr_Comp; Enumeration Discr; union { struct { Enumeration Enum_Comp; int Int_Comp; char Str_Comp[31]; } var_1; struct { Enumeration E_Comp_2; char Str_2_Comp[31]; } var_2; struct { char Ch_1_Comp; char Ch_2_Comp; } var_3; } variant; }; @//E*O*F dhry_glo.h// chmod u=rw,g=r,o=r dhry_glo.h echo x - dhry_p1.c sed 's/^@//' > "dhry_p1.c" <<'@//E*O*F dhry_p1.c//' /* **************************************************************************** * * "DHRYSTONE" Benchmark Program * ----------------------------- * * Version: C, Version 2.0 * * File: dhry_pack_1.c (part 2 of 3) * * Date: March 3, 1988 * * Author: Reinhold P. Weicker * **************************************************************************** */ #include "dhry_glo.h" /* * Global Variables: */ Rec_Pointer *Ptr_Glob, *Next_Ptr_Glob; int Int_Glob; Boolean Bool_Glob; char Ch_1_Glob, Ch_2_Glob; int Ar_1_Glob[50]; int Ar_2_Glob[50][50]; char System_Type[80]; char Compiler_Type[80]; /* * forward declaration necessary since Enumeration may not simply be int */ extern char *malloc (); Enumeration Func_1 (); #ifndef REG Boolean Reg = false; /* REG becomes defined as empty */ #define REG /* i.e. no register variables */ #else Boolean Reg = true; #endif /* * variables for time measurement: */ #ifdef TIMES struct tms time_info; extern int times (); /* see library function "times" */ #endif #ifdef TIME extern long time (); /* see library function "time" */ #endif #define Too_Small_Time 2 /* Measurements should last at least 2 seconds */ long Begin_Time, End_Time, User_Time; float Microseconds, Dhrystones_Per_Second; main (argc, argv) 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[31]; Str_30 Str_2_Loc[31]; REG int Run_Index; REG int Number_Of_Runs; long dum = 0L; /* * 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"); strcpy (System_Type, SYSTYPE); strcpy (Compiler_Type, COMPTYPE); /* * Was missing in published program. Without this * initialization, Ar_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. */ Ar_2_Glob[8][7] = 10; printf ("\n"); printf ("Dhrystone Benchmark, Version 2.0 (Language: C)\n"); printf ("\n"); printf ("System: %s\n", System_Type); printf ("Compiler: %s\n", Compiler_Type); printf ("\n"); if (Reg) { printf ("Program compiled with 'register' attribute\n"); } else { printf ("Program compiled without 'register' attribute\n"); } printf ("\n"); { int n; if (argc > 1) { n = atoi (argv[1]); } else { #ifdef ALCYON /* * stupid alcyon scanf(3) is bad */ n = 5000; #else printf ("Please give the number of runs through the benchmark: "); scanf ("%d", &n); #endif } 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 dum = (long) 0; Begin_Time = time (&dum); #endif for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { /* * Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ Proc_5 (); Proc_4 (); Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; /* * Bool_Glob == 1 */ Bool_Glob = !Func_2 (Str_1_Loc, Str_2_Loc); while (Int_1_Loc < Int_2_Loc)/* loop body executed once */ { /* * Int_3_Loc == 7 */ 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; } /* * Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ Proc_8 (Ar_1_Glob, Ar_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 */ } /* * Stop timer */ #ifdef TIMES times (&time_info); End_Time = (long) time_info.tms_utime; #endif #ifdef TIME dum = (long) 0; End_Time = time (&dum); #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 ("Ar_1_Glob[8]: %d\n", Ar_1_Glob[8]); printf (" should be: %d\n", 7); printf ("Ar_2_Glob[8][7]: %d\n", Ar_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 * Usec_Per_Second / (float) Number_Of_Runs; Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time; #else Microseconds = (float) User_Time * Usec_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); printf ("\n"); } exit (0); } Proc_1 (Ptr_Val_Par) /* executed once */ REG Rec_Pointer *Ptr_Val_Par; { /* * Local variable, initialized with Ptr_Val_Par->Ptr_Comp, * corresponds to "rename" in Ada, "with" in Pascal */ REG Rec_Pointer *Next_Record = Ptr_Val_Par->Ptr_Comp; /* == Ptr_Glob_Next */ str_asgn (*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 */ str_asgn (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); } Proc_2 (Int_Par_Ref) /* executed once */ One_Fifty *Int_Par_Ref; /* *Int_Par_Ref == 1, becomes 4 */ { One_Fifty Int_Loc; Enumeration Enum_Loc; Int_Loc = *Int_Par_Ref + 10; do { /* * executed once */ if (Ch_1_Glob == 'A') { /* * then, executed */ Int_Loc -= 1; *Int_Par_Ref = Int_Loc - Int_Glob; Enum_Loc = Ident_1; } } while (Enum_Loc != Ident_1); /* true */ } Proc_3 (Ptr_Ref_Par) /* executed once */ Rec_Pointer **Ptr_Ref_Par; /* Ptr_Ref_Par becomes Ptr_Glob */ { if (Ptr_Glob != Null) /* * then, executed */ *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; else /* * not executed */ Int_Glob = 100; Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); } Proc_4 () /* executed once */ { Boolean Bool_Loc; Bool_Loc = Ch_1_Glob == 'A'; Bool_Glob = Bool_Loc | Bool_Glob; Ch_2_Glob = 'B'; } Proc_5 () /* executed once */ { Ch_1_Glob = 'A'; Bool_Glob = false; } #ifdef NOSTRUCTASSIGN /* * Procedure for the assignment of structures, * if the C compiler doesn't support this feature */ memcpy (d, s, l) register char *d; register char *s; register int l; { while (l--) *d++ = *s++; } #endif @//E*O*F dhry_p1.c// chmod u=rw,g=r,o=r dhry_p1.c echo x - dhry_p2.c sed 's/^@//' > "dhry_p2.c" <<'@//E*O*F dhry_p2.c//' /* **************************************************************************** * * "DHRYSTONE" Benchmark Program * ----------------------------- * * Version: C, Version 2.0 * * File: dhry_pack_2.c (part 3 of 3) * * Date: March 3, 1988 * * Author: Reinhold P. Weicker * **************************************************************************** */ #include "dhry_glo.h" #ifndef REG #define REG /* REG becomes defined as empty */ #endif /* i.e. no register variables */ extern int Int_Glob; extern char Ch_1_Glob; Proc_6 (Enum_Val_Par, Enum_Ref_Par) /* executed once */ Enumeration Enum_Val_Par; /* Enum_Val_Par == Ident_3 */ Enumeration *Enum_Ref_Par; /* Enum_Ref_Par becomes Ident_2 */ { *Enum_Ref_Par = Enum_Val_Par; if (!Func_3 (Enum_Val_Par)) /* * then, not executed */ *Enum_Ref_Par = Ident_4; switch (Enum_Val_Par) { case Ident_1: *Enum_Ref_Par = Ident_1; break; case Ident_2: if (Int_Glob > 100) *Enum_Ref_Par = Ident_1; else *Enum_Ref_Par = Ident_4; break; case Ident_3: /* executed */ *Enum_Ref_Par = Ident_2; break; case Ident_4: break; case Ident_5: *Enum_Ref_Par = Ident_3; break; } } Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref) /* executed three times */ One_Fifty Int_1_Par_Val; One_Fifty Int_2_Par_Val; One_Fifty *Int_Par_Ref; /* * first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, * Int_Par_Ref becomes 7 * second call: Int_1_Par_Val == 10, Int_2_Par_Val == 5, * Int_Par_Ref becomes 17 * third call: Int_1_Par_Val == 6, Int_2_Par_Val == 10, * Int_Par_Ref becomes 18 */ { One_Fifty Int_Loc; Int_Loc = Int_1_Par_Val + 2; *Int_Par_Ref = Int_2_Par_Val + Int_Loc; } Proc_8 (Ar_1_Par_Ref, Ar_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val)/* executed once */ Array Ar_1_Par_Ref[]; Array Ar_2_Par_Ref[][50]; int Int_1_Par_Val; /* Int_Par_Val_1 == 3 */ int Int_2_Par_Val; /* Int_Par_Val_2 == 7 */ { REG One_Fifty Int_Index; REG One_Fifty Int_Loc; Int_Loc = Int_1_Par_Val + 5; Ar_1_Par_Ref[Int_Loc] = Int_2_Par_Val; Ar_1_Par_Ref[Int_Loc + 1] = Ar_1_Par_Ref[Int_Loc]; Ar_1_Par_Ref[Int_Loc + 30] = Int_Loc; for (Int_Index = Int_Loc; Int_Index <= Int_Loc + 1; ++Int_Index) Ar_2_Par_Ref[Int_Loc][Int_Index] = Int_Loc; Ar_2_Par_Ref[Int_Loc][Int_Loc - 1] += 1; Ar_2_Par_Ref[Int_Loc + 20][Int_Loc] = Ar_1_Par_Ref[Int_Loc]; Int_Glob = 5; } Enumeration Func_1 (Ch_1_Par_Val, Ch_2_Par_Val) /* executed three times */ /* * first call: Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R' * second call: Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C' * third call: Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C' */ Capital_Letter Ch_1_Par_Val; Capital_Letter Ch_2_Par_Val; { Capital_Letter Ch_1_Loc; Capital_Letter Ch_2_Loc; Ch_1_Loc = Ch_1_Par_Val; Ch_2_Loc = Ch_1_Loc; if (Ch_2_Loc != Ch_2_Par_Val) /* * then, executed */ return (Ident_1); else /* not executed */ { Ch_1_Glob = Ch_1_Loc; return (Ident_2); } } Boolean Func_2 (Str_1_Par_Ref, Str_2_Par_Ref) /* executed once */ /* * Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" * Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */ char Str_1_Par_Ref[31]; char Str_2_Par_Ref[31]; { REG One_Thirty Int_Loc; Capital_Letter Ch_Loc; Int_Loc = 2; while (Int_Loc <= 2) /* loop body executed once */ if (Func_1 (Str_1_Par_Ref[Int_Loc], Str_2_Par_Ref[Int_Loc + 1]) == Ident_1) { /* * then, executed */ Ch_Loc = 'A'; Int_Loc += 1; } if (Ch_Loc >= 'W' && Ch_Loc < 'Z') /* * then, not executed */ Int_Loc = 7; if (Ch_Loc == 'R') /* * then, not executed */ return (true); else { /* * executed */ if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0) { /* * then, not executed */ Int_Loc += 7; Int_Glob = Int_Loc; return (true); } else /* * executed */ return (false); } } Boolean Func_3 (Enum_Par_Val) /* executed once */ Enumeration Enum_Par_Val; /* Enum_Par_Val == Ident_3 */ { Enumeration Enum_Loc; Enum_Loc = Enum_Par_Val; if (Enum_Loc == Ident_3) /* * then, executed */ return (true); } @//E*O*F dhry_p2.c// chmod u=rw,g=r,o=r dhry_p2.c echo Inspecting for damage in transit... temp=/tmp/shar$$; dtemp=/tmp/.shar$$ trap "rm -f $temp $dtemp; exit" 0 1 2 3 15 cat > $temp <<\!!! 10 74 496 MANIFEST 56 126 935 Makefile 344 1908 16178 README 65 192 1773 OUT.ST 43 107 712 config.h 107 260 2189 dhry_glo.h 447 1294 10993 dhry_p1.c 196 535 4456 dhry_p2.c 1268 4496 37732 total !!! wc MANIFEST Makefile README OUT.ST config.h dhry_glo.h dhry_p1.c dhry_p2.c | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp if [ -s $dtemp ] then echo "Ouch [diff of wc output]:" ; cat $dtemp else echo "No problems found." fi exit 0