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