1 /*
2 ****************************************************************************
3 *
4 * "DHRYSTONE" Benchmark Program
5 * -----------------------------
6 *
7 * Version: C, Version 2.1
8 *
9 * File: dhry_1.c (part 2 of 3)
10 *
11 * Date: May 17, 1988
12 *
13 * Author: Reinhold P. Weicker
14 *
15 ****************************************************************************
16 */
17
18 #include "dhry.h"
19
20 /* Global Variables: */
21
22 Rec_Pointer Ptr_Glob,
23 Next_Ptr_Glob;
24 int Int_Glob;
25 Boolean Bool_Glob;
26 char Ch_1_Glob,
27 Ch_2_Glob;
28 int Arr_1_Glob [50];
29 int Arr_2_Glob [50] [50];
30
31 extern char *malloc ();
32 Enumeration Func_1 ();
33 /* forward declaration necessary since Enumeration may not simply be int */
34
35 #ifndef REG
36 Boolean Reg = false;
37 #define REG
38 /* REG becomes defined as empty */
39 /* i.e. no register variables */
40 #else
41 Boolean Reg = true;
42 #endif
43
44 /* variables for time measurement: */
45
46 #ifdef TIMES
47 struct tms time_info;
48 extern int times ();
49 /* see library function "times" */
50 #define Too_Small_Time (2*HZ)
51 /* Measurements should last at least about 2 seconds */
52 #endif
53 #ifdef TIME
54 extern long time();
55 /* see library function "time" */
56 #define Too_Small_Time 2
57 /* Measurements should last at least 2 seconds */
58 #endif
59 #ifdef MSC_CLOCK
60 extern clock_t clock();
61 #define Too_Small_Time (2*HZ)
62 #endif
63
64 long Begin_Time,
65 End_Time,
66 User_Time;
67 float Microseconds,
68 Dhrystones_Per_Second;
69
70 /* end of variables for time measurement */
71
72
main()73 main ()
74 /*****/
75
76 /* main program, corresponds to procedures */
77 /* Main and Proc_0 in the Ada version */
78 {
79 One_Fifty Int_1_Loc;
80 REG One_Fifty Int_2_Loc;
81 One_Fifty Int_3_Loc;
82 REG char Ch_Index;
83 Enumeration Enum_Loc;
84 Str_30 Str_1_Loc;
85 Str_30 Str_2_Loc;
86 REG int Run_Index;
87 REG int Number_Of_Runs;
88
89 /* Initializations */
90
91 Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
92 Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
93
94 Ptr_Glob->Ptr_Comp = Next_Ptr_Glob;
95 Ptr_Glob->Discr = Ident_1;
96 Ptr_Glob->variant.var_1.Enum_Comp = Ident_3;
97 Ptr_Glob->variant.var_1.Int_Comp = 40;
98 strcpy (Ptr_Glob->variant.var_1.Str_Comp,
99 "DHRYSTONE PROGRAM, SOME STRING");
100 strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING");
101
102 Arr_2_Glob [8][7] = 10;
103 /* Was missing in published program. Without this statement, */
104 /* Arr_2_Glob [8][7] would have an undefined value. */
105 /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */
106 /* overflow may occur for this array element. */
107 int n;
108 scanf ("%d", &n);
109 Number_Of_Runs = n;
110
111
112 /***************/
113 /* Start timer */
114 /***************/
115
116 #ifdef TIMES
117 times (&time_info);
118 Begin_Time = (long) time_info.tms_utime;
119 #endif
120 #ifdef TIME
121 Begin_Time = time ( (long *) 0);
122 #endif
123 #ifdef MSC_CLOCK
124 Begin_Time = clock();
125 #endif
126
127 for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index)
128 {
129
130 Proc_5();
131 Proc_4();
132 /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */
133 Int_1_Loc = 2;
134 Int_2_Loc = 3;
135 strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING");
136 Enum_Loc = Ident_2;
137 Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc);
138 /* Bool_Glob == 1 */
139 while (Int_1_Loc < Int_2_Loc) /* loop body executed once */
140 {
141 Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc;
142 /* Int_3_Loc == 7 */
143 Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc);
144 /* Int_3_Loc == 7 */
145 Int_1_Loc += 1;
146 } /* while */
147 /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
148 Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc);
149 /* Int_Glob == 5 */
150 Proc_1 (Ptr_Glob);
151 for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index)
152 /* loop body executed twice */
153 {
154 if (Enum_Loc == Func_1 (Ch_Index, 'C'))
155 /* then, not executed */
156 {
157 Proc_6 (Ident_1, &Enum_Loc);
158 strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING");
159 Int_2_Loc = Run_Index;
160 Int_Glob = Run_Index;
161 }
162 }
163 /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
164 Int_2_Loc = Int_2_Loc * Int_1_Loc;
165 Int_1_Loc = Int_2_Loc / Int_3_Loc;
166 Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc;
167 /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */
168 Proc_2 (&Int_1_Loc);
169 /* Int_1_Loc == 5 */
170
171 } /* loop "for Run_Index" */
172
173 /**************/
174 /* Stop timer */
175 /**************/
176
177 #ifdef TIMES
178 times (&time_info);
179 End_Time = (long) time_info.tms_utime;
180 #endif
181 #ifdef TIME
182 End_Time = time ( (long *) 0);
183 #endif
184 #ifdef MSC_CLOCK
185 End_Time = clock();
186 #endif
187 User_Time = End_Time - Begin_Time;
188
189 if (User_Time < Too_Small_Time)
190 {
191 printf ("Measured time too small to obtain meaningful results\n");
192 printf ("Please increase number of runs\n");
193 printf ("\n");
194 }
195 else
196 {
197 #ifdef TIME
198 Microseconds = (float) User_Time * Mic_secs_Per_Second
199 / (float) Number_Of_Runs;
200 Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time;
201 #else
202 Microseconds = (float) User_Time * Mic_secs_Per_Second
203 / ((float) HZ * ((float) Number_Of_Runs));
204 Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs)
205 / (float) User_Time;
206 #endif
207 printf ("%6.1f \n", Dhrystones_Per_Second);
208 }
209
210 }
211
212
Proc_1(Ptr_Val_Par)213 Proc_1 (Ptr_Val_Par)
214 /******************/
215
216 REG Rec_Pointer Ptr_Val_Par;
217 /* executed once */
218 {
219 REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp;
220 /* == Ptr_Glob_Next */
221 /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */
222 /* corresponds to "rename" in Ada, "with" in Pascal */
223
224 structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob);
225 Ptr_Val_Par->variant.var_1.Int_Comp = 5;
226 Next_Record->variant.var_1.Int_Comp
227 = Ptr_Val_Par->variant.var_1.Int_Comp;
228 Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp;
229 Proc_3 (&Next_Record->Ptr_Comp);
230 /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp
231 == Ptr_Glob->Ptr_Comp */
232 if (Next_Record->Discr == Ident_1)
233 /* then, executed */
234 {
235 Next_Record->variant.var_1.Int_Comp = 6;
236 Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp,
237 &Next_Record->variant.var_1.Enum_Comp);
238 Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp;
239 Proc_7 (Next_Record->variant.var_1.Int_Comp, 10,
240 &Next_Record->variant.var_1.Int_Comp);
241 }
242 else /* not executed */
243 structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp);
244 return 0; } /* Proc_1 */
245
246
Proc_2(Int_Par_Ref)247 Proc_2 (Int_Par_Ref)
248 /******************/
249 /* executed once */
250 /* *Int_Par_Ref == 1, becomes 4 */
251
252 One_Fifty *Int_Par_Ref;
253 {
254 One_Fifty Int_Loc;
255 Enumeration Enum_Loc;
256
257 Int_Loc = *Int_Par_Ref + 10;
258 do /* executed once */
259 if (Ch_1_Glob == 'A')
260 /* then, executed */
261 {
262 Int_Loc -= 1;
263 *Int_Par_Ref = Int_Loc - Int_Glob;
264 Enum_Loc = Ident_1;
265 } /* if */
266 while (Enum_Loc != Ident_1); /* true */
267 return 0; } /* Proc_2 */
268
269
Proc_3(Ptr_Ref_Par)270 Proc_3 (Ptr_Ref_Par)
271 /******************/
272 /* executed once */
273 /* Ptr_Ref_Par becomes Ptr_Glob */
274
275 Rec_Pointer *Ptr_Ref_Par;
276
277 {
278 if (Ptr_Glob != Null)
279 /* then, executed */
280 *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp;
281 Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp);
282 return 0; } /* Proc_3 */
283
284
Proc_4()285 Proc_4 () /* without parameters */
286 /*******/
287 /* executed once */
288 {
289 Boolean Bool_Loc;
290
291 Bool_Loc = Ch_1_Glob == 'A';
292 Bool_Glob = Bool_Loc | Bool_Glob;
293 Ch_2_Glob = 'B';
294 return 0; } /* Proc_4 */
295
296
Proc_5()297 Proc_5 () /* without parameters */
298 /*******/
299 /* executed once */
300 {
301 Ch_1_Glob = 'A';
302 Bool_Glob = false;
303 return 0; } /* Proc_5 */
304
305
306 /* Procedure for the assignment of structures, */
307 /* if the C compiler doesn't support this feature */
308 #ifdef NOSTRUCTASSIGN
memcpy(d,s,l)309 memcpy (d, s, l)
310 register char *d;
311 register char *s;
312 register int l;
313 {
314 while (l--) *d++ = *s++;
315 }
316 #endif
317
318
319