xref: /aosp_15_r20/cts/hostsidetests/sustainedperf/dhrystone/Drystone-2.1.sh (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1*b7c941bbSAndroid Build Coastguard Worker#! /bin/sh
2*b7c941bbSAndroid Build Coastguard Worker# This is a shell archive, meaning:
3*b7c941bbSAndroid Build Coastguard Worker# 1. Remove everything above the #! /bin/sh line.
4*b7c941bbSAndroid Build Coastguard Worker# 2. Save the resulting text in a file.
5*b7c941bbSAndroid Build Coastguard Worker# 3. Execute the file with /bin/sh (not csh) to create:
6*b7c941bbSAndroid Build Coastguard Worker#        Rationale
7*b7c941bbSAndroid Build Coastguard Worker#        dhry.h
8*b7c941bbSAndroid Build Coastguard Worker#        dhry_1.c
9*b7c941bbSAndroid Build Coastguard Worker#        dhry_2.c
10*b7c941bbSAndroid Build Coastguard Worker# This archive created: Wed Jul  6 16:50:06 1988
11*b7c941bbSAndroid Build Coastguard Workerexport PATH; PATH=/bin:/usr/bin:$PATH
12*b7c941bbSAndroid Build Coastguard Workerif test -f 'Rationale'
13*b7c941bbSAndroid Build Coastguard Workerthen
14*b7c941bbSAndroid Build Coastguard Worker        echo shar: "will not over-write existing file 'Rationale'"
15*b7c941bbSAndroid Build Coastguard Workerelse
16*b7c941bbSAndroid Build Coastguard Workersed 's/^X//' << \SHAR_EOF > 'Rationale'
17*b7c941bbSAndroid Build Coastguard WorkerXDhrystone Benchmark: Rationale for Version 2 and Measurement Rules
18*b7c941bbSAndroid Build Coastguard WorkerX
19*b7c941bbSAndroid Build Coastguard WorkerX                 Reinhold P. Weicker
20*b7c941bbSAndroid Build Coastguard WorkerX                 Siemens AG, E STE 35
21*b7c941bbSAndroid Build Coastguard WorkerX                 Postfach 3240
22*b7c941bbSAndroid Build Coastguard WorkerX                 D-8520 Erlangen
23*b7c941bbSAndroid Build Coastguard WorkerX                 Germany (West)
24*b7c941bbSAndroid Build Coastguard WorkerX
25*b7c941bbSAndroid Build Coastguard WorkerX
26*b7c941bbSAndroid Build Coastguard WorkerX
27*b7c941bbSAndroid Build Coastguard WorkerX
28*b7c941bbSAndroid Build Coastguard WorkerXThe Dhrystone benchmark program [1] has become a popular benchmark  for
29*b7c941bbSAndroid Build Coastguard WorkerXCPU/compiler  performance  measurement,  in  particular  in the area of
30*b7c941bbSAndroid Build Coastguard WorkerXminicomputers, workstations, PC's and  microprocesors.   It  apparently
31*b7c941bbSAndroid Build Coastguard WorkerXsatisfies a need for an easy-to-use integer benchmark; it gives a first
32*b7c941bbSAndroid Build Coastguard WorkerXperformance indication which  is  more  meaningful  than  MIPS  numbers
33*b7c941bbSAndroid Build Coastguard WorkerXwhich,  in  their  literal  meaning  (million instructions per second),
34*b7c941bbSAndroid Build Coastguard WorkerXcannot be used across different instruction sets (e.g. RISC vs.  CISC).
35*b7c941bbSAndroid Build Coastguard WorkerXWith  the  increasing  use  of  the  benchmark,  it  seems necessary to
36*b7c941bbSAndroid Build Coastguard WorkerXreconsider the benchmark and to check whether it can still fulfill this
37*b7c941bbSAndroid Build Coastguard WorkerXfunction.   Version  2  of  Dhrystone  is  the  result  of  such  a re-
38*b7c941bbSAndroid Build Coastguard WorkerXevaluation, it has been made for two reasons:
39*b7c941bbSAndroid Build Coastguard WorkerX
40*b7c941bbSAndroid Build Coastguard WorkerXo Dhrystone has been published in Ada [1], and Versions in Ada,  Pascal
41*b7c941bbSAndroid Build Coastguard WorkerX  and  C  have  been  distributed  by Reinhold Weicker via floppy disk.
42*b7c941bbSAndroid Build Coastguard WorkerX  However, the version that was used most often  for  benchmarking  has
43*b7c941bbSAndroid Build Coastguard WorkerX  been  the version made by Rick Richardson by another translation from
44*b7c941bbSAndroid Build Coastguard WorkerX  the Ada version into the C programming language, this  has  been  the
45*b7c941bbSAndroid Build Coastguard WorkerX  version distributed via the UNIX network Usenet [2].
46*b7c941bbSAndroid Build Coastguard WorkerX
47*b7c941bbSAndroid Build Coastguard WorkerX  There is an obvious need for a common C version of Dhrystone, since C
48*b7c941bbSAndroid Build Coastguard WorkerX  is  at  present  the most popular system programming language for the
49*b7c941bbSAndroid Build Coastguard WorkerX  class of systems (microcomputers, minicomputers, workstations)  where
50*b7c941bbSAndroid Build Coastguard WorkerX  Dhrystone  is  used  most.  There should be, as far as possible, only
51*b7c941bbSAndroid Build Coastguard WorkerX  one C version of Dhrystone such that results can be compared  without
52*b7c941bbSAndroid Build Coastguard WorkerX  restrictions.  In  the  past,  the  C  versions  distributed  by Rick
53*b7c941bbSAndroid Build Coastguard WorkerX  Richardson (Version 1.1) and by Reinhold Weicker  had  small  (though
54*b7c941bbSAndroid Build Coastguard WorkerX  not significant) differences.
55*b7c941bbSAndroid Build Coastguard WorkerX
56*b7c941bbSAndroid Build Coastguard WorkerX  Together with the new C version, the Ada  and  Pascal  versions  have
57*b7c941bbSAndroid Build Coastguard WorkerX  been updated as well.
58*b7c941bbSAndroid Build Coastguard WorkerX
59*b7c941bbSAndroid Build Coastguard WorkerXo As far as it is possible without changes to the Dhrystone statistics,
60*b7c941bbSAndroid Build Coastguard WorkerX  optimizing  compilers  should  be prevented from removing significant
61*b7c941bbSAndroid Build Coastguard WorkerX  statements.  It has turned out in the past that optimizing  compilers
62*b7c941bbSAndroid Build Coastguard WorkerX  suppressed  code  generation  for  too many statements (by "dead code
63*b7c941bbSAndroid Build Coastguard WorkerX  removal" or "dead variable  elimination").   This  has  lead  to  the
64*b7c941bbSAndroid Build Coastguard WorkerX  danger  that  benchmarking results obtained by a naive application of
65*b7c941bbSAndroid Build Coastguard WorkerX  Dhrystone - without inspection of the code that was generated - could
66*b7c941bbSAndroid Build Coastguard WorkerX  become meaningless.
67*b7c941bbSAndroid Build Coastguard WorkerX
68*b7c941bbSAndroid Build Coastguard WorkerXThe overall policiy for version 2 has been  that  the  distribution  of
69*b7c941bbSAndroid Build Coastguard WorkerXstatements,  operand types and operand locality described in [1] should
70*b7c941bbSAndroid Build Coastguard WorkerXremain  unchanged  as  much  as  possible.   (Very  few  changes   were
71*b7c941bbSAndroid Build Coastguard WorkerXnecessary;  their  impact  should  be  negligible.)  Also, the order of
72*b7c941bbSAndroid Build Coastguard WorkerXstatements should  remain  unchanged.  Although  I  am  aware  of  some
73*b7c941bbSAndroid Build Coastguard WorkerXcritical  remarks on the benchmark - I agree with several of them - and
74*b7c941bbSAndroid Build Coastguard WorkerXknow some suggestions for improvement, I  didn't  want  to  change  the
75*b7c941bbSAndroid Build Coastguard WorkerXbenchmark  into  something  different  from  what  has  become known as
76*b7c941bbSAndroid Build Coastguard WorkerX"Dhrystone"; the confusion generated by such a  change  would  probably
77*b7c941bbSAndroid Build Coastguard WorkerXoutweight  the  benefits. If I were to write a new benchmark program, I
78*b7c941bbSAndroid Build Coastguard WorkerXwouldn't give it the name "Dhrystone" since this  denotes  the  program
79*b7c941bbSAndroid Build Coastguard WorkerXpublished in [1].  However, I do recognize the need for a larger number
80*b7c941bbSAndroid Build Coastguard WorkerXof representative programs that can be used as benchmarks; users should
81*b7c941bbSAndroid Build Coastguard WorkerXalways be encouraged to use more than just one benchmark.
82*b7c941bbSAndroid Build Coastguard WorkerX
83*b7c941bbSAndroid Build Coastguard WorkerXThe  new  versions  (version  2.1  for  C,  Pascal  and  Ada)  will  be
84*b7c941bbSAndroid Build Coastguard WorkerXdistributed  as  widely as possible.  (Version 2.1 differs from version
85*b7c941bbSAndroid Build Coastguard WorkerX2.0 distributed via the UNIX Network Usenet in March 1988 only in a few
86*b7c941bbSAndroid Build Coastguard WorkerXcorrections  for  minor  deficiencies  found  by users of version 2.0.)
87*b7c941bbSAndroid Build Coastguard WorkerXReaders who want to use the benchmark for their  own  measurements  can
88*b7c941bbSAndroid Build Coastguard WorkerXobtain  a copy in machine-readable form on floppy disk (MS-DOS or XENIX
89*b7c941bbSAndroid Build Coastguard WorkerXformat) from the author.
90*b7c941bbSAndroid Build Coastguard WorkerX
91*b7c941bbSAndroid Build Coastguard WorkerX
92*b7c941bbSAndroid Build Coastguard WorkerXIn general, version 2 follows - in the parts that are  significant  for
93*b7c941bbSAndroid Build Coastguard WorkerXperformance  measurement,  i.e.   within  the  measurement  loop  - the
94*b7c941bbSAndroid Build Coastguard WorkerXpublished (Ada) version and  the  C  versions  previously  distributed.
95*b7c941bbSAndroid Build Coastguard WorkerXWhere  the  versions  distributed  by  Rick Richardson [2] and Reinhold
96*b7c941bbSAndroid Build Coastguard WorkerXWeicker have been different, it  follows  the  version  distributed  by
97*b7c941bbSAndroid Build Coastguard WorkerXReinhold  Weicker.  (However,  the  differences have been so small that
98*b7c941bbSAndroid Build Coastguard WorkerXtheir impact on execution time in all likelihood has been  negligible.)
99*b7c941bbSAndroid Build Coastguard WorkerXThe  initialization  and  UNIX  instrumentation  part  - which had been
100*b7c941bbSAndroid Build Coastguard WorkerXomitted in [1] - follows mostly  the  ideas  of  Rick  Richardson  [2].
101*b7c941bbSAndroid Build Coastguard WorkerXHowever,  any changes in the initialization part and in the printing of
102*b7c941bbSAndroid Build Coastguard WorkerXthe result have no impact on performance  measurement  since  they  are
103*b7c941bbSAndroid Build Coastguard WorkerXoutside  the  measaurement  loop.   As a concession to older compilers,
104*b7c941bbSAndroid Build Coastguard WorkerXnames have been made unique within the first 8  characters  for  the  C
105*b7c941bbSAndroid Build Coastguard WorkerXversion.
106*b7c941bbSAndroid Build Coastguard WorkerX
107*b7c941bbSAndroid Build Coastguard WorkerXThe original publication of Dhrystone did not  contain  any  statements
108*b7c941bbSAndroid Build Coastguard WorkerXfor  time  measurement  since  they  are  necessarily system-dependent.
109*b7c941bbSAndroid Build Coastguard WorkerXHowever, it turned out that it is not enough just to inclose  the  main
110*b7c941bbSAndroid Build Coastguard WorkerXprocedure of Dhrystone in a loop and to measure the execution time.  If
111*b7c941bbSAndroid Build Coastguard WorkerXthe variables that are computed are not  used  somehow,  there  is  the
112*b7c941bbSAndroid Build Coastguard WorkerXdanger  that  the  compiler  considers  them  as  "dead  variables" and
113*b7c941bbSAndroid Build Coastguard WorkerXsuppresses code generation for a part of the statements.  Therefore  in
114*b7c941bbSAndroid Build Coastguard WorkerXversion  2  all  variables  of  "main"  are  printed  at the end of the
115*b7c941bbSAndroid Build Coastguard WorkerXprogram. This  also  permits  some  plausibility  control  for  correct
116*b7c941bbSAndroid Build Coastguard WorkerXexecution of the benchmark.
117*b7c941bbSAndroid Build Coastguard WorkerX
118*b7c941bbSAndroid Build Coastguard WorkerXAt several places in the benchmark, code has been added,  but  only  in
119*b7c941bbSAndroid Build Coastguard WorkerXbranches  that  are  not  executed.  The  intention  is that optimizing
120*b7c941bbSAndroid Build Coastguard WorkerXcompilers should be prevented from moving code out of  the  measurement
121*b7c941bbSAndroid Build Coastguard WorkerXloop,  or  from  removing code altogether. Statements that are executed
122*b7c941bbSAndroid Build Coastguard WorkerXhave been changed in very few places only.  In these  cases,  only  the
123*b7c941bbSAndroid Build Coastguard WorkerXrole  of  some operands has been changed, and it was made sure that the
124*b7c941bbSAndroid Build Coastguard WorkerXnumbers  defining  the  "Dhrystone   distribution"   (distribution   of
125*b7c941bbSAndroid Build Coastguard WorkerXstatements, operand types and locality) still hold as much as possible.
126*b7c941bbSAndroid Build Coastguard WorkerXExcept for sophisticated  optimizing  compilers,  execution  times  for
127*b7c941bbSAndroid Build Coastguard WorkerXversion 2.1 should be the same as for previous versions.
128*b7c941bbSAndroid Build Coastguard WorkerX
129*b7c941bbSAndroid Build Coastguard WorkerXBecause of the self-imposed limitation that the order and  distribution
130*b7c941bbSAndroid Build Coastguard WorkerXof the executed statements should not be changed, there are still cases
131*b7c941bbSAndroid Build Coastguard WorkerXwhere optimizing compilers may not generate code for  some  statements.
132*b7c941bbSAndroid Build Coastguard WorkerXTo   a   certain  degree,  this  is  unavoidable  for  small  synthetic
133*b7c941bbSAndroid Build Coastguard WorkerXbenchmarks.  Users of the benchmark are advised to check code  listings
134*b7c941bbSAndroid Build Coastguard WorkerXwhether code is generated for all statements of Dhrystone.
135*b7c941bbSAndroid Build Coastguard WorkerX
136*b7c941bbSAndroid Build Coastguard WorkerXContrary to the suggestion in the published paper and  its  realization
137*b7c941bbSAndroid Build Coastguard WorkerXin  the  versions  previously  distributed, no attempt has been made to
138*b7c941bbSAndroid Build Coastguard WorkerXsubtract the time for the measurement loop overhead. (This  calculation
139*b7c941bbSAndroid Build Coastguard WorkerXhas  proven  difficult  to implement in a correct way, and its omission
140*b7c941bbSAndroid Build Coastguard WorkerXmakes the program simpler.) However, since the loop check is  now  part
141*b7c941bbSAndroid Build Coastguard WorkerXof  the benchmark, this does have an impact - though a very minor one -
142*b7c941bbSAndroid Build Coastguard WorkerXon the  distribution  statistics  which  have  been  updated  for  this
143*b7c941bbSAndroid Build Coastguard WorkerXversion.
144*b7c941bbSAndroid Build Coastguard WorkerX
145*b7c941bbSAndroid Build Coastguard WorkerX
146*b7c941bbSAndroid Build Coastguard WorkerXIn this section, all changes are described that affect the  measurement
147*b7c941bbSAndroid Build Coastguard WorkerXloop and that are not just renamings of variables. All remarks refer to
148*b7c941bbSAndroid Build Coastguard WorkerXthe C version; the other language versions have been updated similarly.
149*b7c941bbSAndroid Build Coastguard WorkerX
150*b7c941bbSAndroid Build Coastguard WorkerXIn addition to adding the measurement loop and the printout statements,
151*b7c941bbSAndroid Build Coastguard WorkerXchanges have been made at the following places:
152*b7c941bbSAndroid Build Coastguard WorkerX
153*b7c941bbSAndroid Build Coastguard WorkerXo In procedure "main", three statements have been  added  in  the  non-
154*b7c941bbSAndroid Build Coastguard WorkerX  executed "then" part of the statement
155*b7c941bbSAndroid Build Coastguard WorkerX    if (Enum_Loc == Func_1 (Ch_Index, 'C'))
156*b7c941bbSAndroid Build Coastguard WorkerX  they are
157*b7c941bbSAndroid Build Coastguard WorkerX    strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING");
158*b7c941bbSAndroid Build Coastguard WorkerX    Int_2_Loc = Run_Index;
159*b7c941bbSAndroid Build Coastguard WorkerX    Int_Glob = Run_Index;
160*b7c941bbSAndroid Build Coastguard WorkerX  The string assignment prevents movement of the  preceding  assignment
161*b7c941bbSAndroid Build Coastguard WorkerX  to  Str_2_Loc  (5'th statement of "main") out of the measurement loop
162*b7c941bbSAndroid Build Coastguard WorkerX  (This probably will not happen for the C version, but it  did  happen
163*b7c941bbSAndroid Build Coastguard WorkerX  with  another  language  and  compiler.)  The assignment to Int_2_Loc
164*b7c941bbSAndroid Build Coastguard WorkerX  prevents value propagation  for  Int_2_Loc,  and  the  assignment  to
165*b7c941bbSAndroid Build Coastguard WorkerX  Int_Glob  makes  the  value  of  Int_Glob possibly dependent from the
166*b7c941bbSAndroid Build Coastguard WorkerX  value of Run_Index.
167*b7c941bbSAndroid Build Coastguard WorkerX
168*b7c941bbSAndroid Build Coastguard WorkerXo In the three arithmetic computations at the end  of  the  measurement
169*b7c941bbSAndroid Build Coastguard WorkerX  loop  in  "main  ", the role of some variables has been exchanged, to
170*b7c941bbSAndroid Build Coastguard WorkerX  prevent the division from just cancelling out the  multiplication  as
171*b7c941bbSAndroid Build Coastguard WorkerX  it  was in [1].  A very smart compiler might have recognized this and
172*b7c941bbSAndroid Build Coastguard WorkerX  suppressed code generation for the division.
173*b7c941bbSAndroid Build Coastguard WorkerX
174*b7c941bbSAndroid Build Coastguard WorkerXo For Proc_2, no code has been changed, but the values  of  the  actual
175*b7c941bbSAndroid Build Coastguard WorkerX  parameter have changed due to changes in "main".
176*b7c941bbSAndroid Build Coastguard WorkerX
177*b7c941bbSAndroid Build Coastguard WorkerXo In Proc_4, the second assignment has been changed from
178*b7c941bbSAndroid Build Coastguard WorkerX    Bool_Loc = Bool_Loc | Bool_Glob;
179*b7c941bbSAndroid Build Coastguard WorkerX  to
180*b7c941bbSAndroid Build Coastguard WorkerX    Bool_Glob = Bool_Loc | Bool_Glob;
181*b7c941bbSAndroid Build Coastguard WorkerX  It now assigns a value to  a  global  variable  instead  of  a  local
182*b7c941bbSAndroid Build Coastguard WorkerX  variable (Bool_Loc); Bool_Loc would be a "dead variable" which is not
183*b7c941bbSAndroid Build Coastguard WorkerX  used afterwards.
184*b7c941bbSAndroid Build Coastguard WorkerX
185*b7c941bbSAndroid Build Coastguard WorkerXo In Func_1, the statement
186*b7c941bbSAndroid Build Coastguard WorkerX    Ch_1_Glob = Ch_1_Loc;
187*b7c941bbSAndroid Build Coastguard WorkerX  was added in the non-executed "else" part of the "if"  statement,  to
188*b7c941bbSAndroid Build Coastguard WorkerX  prevent  the  suppression  of  code  generation for the assignment to
189*b7c941bbSAndroid Build Coastguard WorkerX  Ch_1_Loc.
190*b7c941bbSAndroid Build Coastguard WorkerX
191*b7c941bbSAndroid Build Coastguard WorkerXo In Func_2, the second character comparison statement has been changed
192*b7c941bbSAndroid Build Coastguard WorkerX  to
193*b7c941bbSAndroid Build Coastguard WorkerX    if (Ch_Loc == 'R')
194*b7c941bbSAndroid Build Coastguard WorkerX  ('R' instead of 'X') because a comparison with 'X' is implied in  the
195*b7c941bbSAndroid Build Coastguard WorkerX  preceding "if" statement.
196*b7c941bbSAndroid Build Coastguard WorkerX
197*b7c941bbSAndroid Build Coastguard WorkerX  Also in Func_2, the statement
198*b7c941bbSAndroid Build Coastguard WorkerX    Int_Glob = Int_Loc;
199*b7c941bbSAndroid Build Coastguard WorkerX  has been added in the non-executed part of the last  "if"  statement,
200*b7c941bbSAndroid Build Coastguard WorkerX  in order to prevent Int_Loc from becoming a dead variable.
201*b7c941bbSAndroid Build Coastguard WorkerX
202*b7c941bbSAndroid Build Coastguard WorkerXo In Func_3, a non-executed "else" part has  been  added  to  the  "if"
203*b7c941bbSAndroid Build Coastguard WorkerX  statement.   While  the  program  would not be incorrect without this
204*b7c941bbSAndroid Build Coastguard WorkerX  "else" part, it is considered bad programming practice if a  function
205*b7c941bbSAndroid Build Coastguard WorkerX  can be left without a return value.
206*b7c941bbSAndroid Build Coastguard WorkerX
207*b7c941bbSAndroid Build Coastguard WorkerX  To compensate for this change, the (non-executed) "else" part in  the
208*b7c941bbSAndroid Build Coastguard WorkerX  "if" statement of Proc_3 was removed.
209*b7c941bbSAndroid Build Coastguard WorkerX
210*b7c941bbSAndroid Build Coastguard WorkerXThe distribution statistics have been changed only by the  addition  of
211*b7c941bbSAndroid Build Coastguard WorkerXthe  measurement  loop  iteration (1 additional statement, 4 additional
212*b7c941bbSAndroid Build Coastguard WorkerXlocal integer operands) and  by  the  change  in  Proc_4  (one  operand
213*b7c941bbSAndroid Build Coastguard WorkerXchanged  from  local  to  global).  The  distribution statistics in the
214*b7c941bbSAndroid Build Coastguard WorkerXcomment headers have been updated accordingly.
215*b7c941bbSAndroid Build Coastguard WorkerX
216*b7c941bbSAndroid Build Coastguard WorkerX
217*b7c941bbSAndroid Build Coastguard WorkerXThe string operations (string assignment and  string  comparison)  have
218*b7c941bbSAndroid Build Coastguard WorkerXnot  been  changed,  to  keep  the program consistent with the original
219*b7c941bbSAndroid Build Coastguard WorkerXversion.
220*b7c941bbSAndroid Build Coastguard WorkerX
221*b7c941bbSAndroid Build Coastguard WorkerXThere has been some  concern  that  the  string  operations  are  over-
222*b7c941bbSAndroid Build Coastguard WorkerXrepresented  in  the  program,  and that execution time is dominated by
223*b7c941bbSAndroid Build Coastguard WorkerXthese  operations.   This  was  true  in  particular  when   optimizing
224*b7c941bbSAndroid Build Coastguard WorkerXcompilers  removed  too much code in the main part of the program, this
225*b7c941bbSAndroid Build Coastguard WorkerXshould have been mitigated in version 2.
226*b7c941bbSAndroid Build Coastguard WorkerX
227*b7c941bbSAndroid Build Coastguard WorkerXIt should be noted that this is a language-dependent issue:   Dhrystone
228*b7c941bbSAndroid Build Coastguard WorkerXwas  first published in Ada, and with Ada or Pascal semantics, the time
229*b7c941bbSAndroid Build Coastguard WorkerXspent in the string operations is,  at  least  in  all  implementations
230*b7c941bbSAndroid Build Coastguard WorkerXknown  to  me, considerably smaller.  In Ada and Pascal, assignment and
231*b7c941bbSAndroid Build Coastguard WorkerXcomparison of strings are operators defined in the  language,  and  the
232*b7c941bbSAndroid Build Coastguard WorkerXupper  bounds of the strings occuring in Dhrystone are part of the type
233*b7c941bbSAndroid Build Coastguard WorkerXinformation known at compilation time.   The  compilers  can  therefore
234*b7c941bbSAndroid Build Coastguard WorkerXgenerate efficient inline code.  In C, string assignemt and comparisons
235*b7c941bbSAndroid Build Coastguard WorkerXare not part  of  the  language,  so  the  string  operations  must  be
236*b7c941bbSAndroid Build Coastguard WorkerXexpressed  in  terms  of the C library functions "strcpy" and "strcmp".
237*b7c941bbSAndroid Build Coastguard WorkerX(ANSI  C  allows  an  implementation  to  use  inline  code  for  these
238*b7c941bbSAndroid Build Coastguard WorkerXfunctions.)   In addition to the overhead caused by additional function
239*b7c941bbSAndroid Build Coastguard WorkerXcalls, these functions are defined for  null-terminated  strings  where
240*b7c941bbSAndroid Build Coastguard WorkerXthe  length  of  the  strings  is  not  known  at compilation time; the
241*b7c941bbSAndroid Build Coastguard WorkerXfunction has to check every byte for  the  termination  condition  (the
242*b7c941bbSAndroid Build Coastguard WorkerXnull byte).
243*b7c941bbSAndroid Build Coastguard WorkerX
244*b7c941bbSAndroid Build Coastguard WorkerXObviously, a C library which includes efficiently  coded  "strcpy"  and
245*b7c941bbSAndroid Build Coastguard WorkerX"strcmp"  functions  helps to obtain good Dhrystone results. However, I
246*b7c941bbSAndroid Build Coastguard WorkerXdon't think that this is unfair since string functions do  occur  quite
247*b7c941bbSAndroid Build Coastguard WorkerXfrequently  in real programs (editors, command interpreters, etc.).  If
248*b7c941bbSAndroid Build Coastguard WorkerXthe strings functions are  implemented  efficiently,  this  helps  real
249*b7c941bbSAndroid Build Coastguard WorkerXprograms as well as benchmark programs.
250*b7c941bbSAndroid Build Coastguard WorkerX
251*b7c941bbSAndroid Build Coastguard WorkerXI admit that the string comparison in Dhrystone terminates later (after
252*b7c941bbSAndroid Build Coastguard WorkerXscanning  20 characters) than most string comparisons in real programs.
253*b7c941bbSAndroid Build Coastguard WorkerXFor consistency with  the  original  benchmark,  I  didn't  change  the
254*b7c941bbSAndroid Build Coastguard WorkerXprogram despite this weakness.
255*b7c941bbSAndroid Build Coastguard WorkerX
256*b7c941bbSAndroid Build Coastguard WorkerX
257*b7c941bbSAndroid Build Coastguard WorkerXWhen Dhrystone is used, the following "ground rules" apply:
258*b7c941bbSAndroid Build Coastguard WorkerX
259*b7c941bbSAndroid Build Coastguard WorkerXo Separate compilation (Ada and C versions)
260*b7c941bbSAndroid Build Coastguard WorkerX
261*b7c941bbSAndroid Build Coastguard WorkerX  As  mentioned  in  [1],  Dhrystone  was  written  to  reflect  actual
262*b7c941bbSAndroid Build Coastguard WorkerX  programming  practice  in  systems  programming.   The  division into
263*b7c941bbSAndroid Build Coastguard WorkerX  several compilation units (5 in the Ada version, 2 in the C  version)
264*b7c941bbSAndroid Build Coastguard WorkerX  is  intended, as is the distribution of inter-module and intra-module
265*b7c941bbSAndroid Build Coastguard WorkerX  subprogram  calls.   Although  on  many  systems  there  will  be  no
266*b7c941bbSAndroid Build Coastguard WorkerX  difference  in  execution  time  to  a  Dhrystone  version  where all
267*b7c941bbSAndroid Build Coastguard WorkerX  compilation units are merged into one file, the rule is that separate
268*b7c941bbSAndroid Build Coastguard WorkerX  compilation  should  be used.  The intention is that real programming
269*b7c941bbSAndroid Build Coastguard WorkerX  practice, where programs consist of  several  independently  compiled
270*b7c941bbSAndroid Build Coastguard WorkerX  units, should be reflected.  This also has implies that the compiler,
271*b7c941bbSAndroid Build Coastguard WorkerX  while compiling one  unit,  has  no  information  about  the  use  of
272*b7c941bbSAndroid Build Coastguard WorkerX  variables,  register  allocation  etc.  occuring in other compilation
273*b7c941bbSAndroid Build Coastguard WorkerX  units.  Although in real life  compilation  units  will  probably  be
274*b7c941bbSAndroid Build Coastguard WorkerX  larger,  the  intention is that these effects of separate compilation
275*b7c941bbSAndroid Build Coastguard WorkerX  are modeled in Dhrystone.
276*b7c941bbSAndroid Build Coastguard WorkerX
277*b7c941bbSAndroid Build Coastguard WorkerX  A few  language  systems  have  post-linkage  optimization  available
278*b7c941bbSAndroid Build Coastguard WorkerX  (e.g.,  final  register allocation is performed after linkage).  This
279*b7c941bbSAndroid Build Coastguard WorkerX  is a borderline case: Post-linkage optimization  involves  additional
280*b7c941bbSAndroid Build Coastguard WorkerX  program  preparation time (although not as much as compilation in one
281*b7c941bbSAndroid Build Coastguard WorkerX  unit) which may prevent its general use in practical programming.   I
282*b7c941bbSAndroid Build Coastguard WorkerX  think that since it defeats the intentions given above, it should not
283*b7c941bbSAndroid Build Coastguard WorkerX  be used for Dhrystone.
284*b7c941bbSAndroid Build Coastguard WorkerX
285*b7c941bbSAndroid Build Coastguard WorkerX  Unfortunately, ISO/ANSI Pascal does not contain language features for
286*b7c941bbSAndroid Build Coastguard WorkerX  separate  compilation.   Although  most  commercial  Pascal compilers
287*b7c941bbSAndroid Build Coastguard WorkerX  provide separate compilation in  some  way,  we  cannot  use  it  for
288*b7c941bbSAndroid Build Coastguard WorkerX  Dhrystone  since such a version would not be portable.  Therefore, no
289*b7c941bbSAndroid Build Coastguard WorkerX  attempt has been made  to  provide  a  Pascal  version  with  several
290*b7c941bbSAndroid Build Coastguard WorkerX  compilation units.
291*b7c941bbSAndroid Build Coastguard WorkerX
292*b7c941bbSAndroid Build Coastguard WorkerXo No procedure merging
293*b7c941bbSAndroid Build Coastguard WorkerX
294*b7c941bbSAndroid Build Coastguard WorkerX  Although  Dhrystone  contains  some  very  short   procedures   where
295*b7c941bbSAndroid Build Coastguard WorkerX  execution  would  benefit  from  procedure  merging  (inlining, macro
296*b7c941bbSAndroid Build Coastguard WorkerX  expansion of procedures), procedure merging is not to be  used.   The
297*b7c941bbSAndroid Build Coastguard WorkerX  reason is that the percentage of procedure and function calls is part
298*b7c941bbSAndroid Build Coastguard WorkerX  of the "Dhrystone distribution" of statements contained in [1].  This
299*b7c941bbSAndroid Build Coastguard WorkerX  restriction  does  not hold for the string functions of the C version
300*b7c941bbSAndroid Build Coastguard WorkerX  since ANSI C allows an implementation to use inline  code  for  these
301*b7c941bbSAndroid Build Coastguard WorkerX  functions.
302*b7c941bbSAndroid Build Coastguard WorkerX
303*b7c941bbSAndroid Build Coastguard WorkerX
304*b7c941bbSAndroid Build Coastguard WorkerX
305*b7c941bbSAndroid Build Coastguard WorkerXo Other optimizations are allowed, but they should be indicated
306*b7c941bbSAndroid Build Coastguard WorkerX
307*b7c941bbSAndroid Build Coastguard WorkerX  It is  often  hard  to  draw  an  exact  line  between  "normal  code
308*b7c941bbSAndroid Build Coastguard WorkerX  generation"  and  "optimization" in compilers: Some compilers perform
309*b7c941bbSAndroid Build Coastguard WorkerX  operations by default that are invoked in other compilers  only  when
310*b7c941bbSAndroid Build Coastguard WorkerX  optimization  is explicitly requested.  Also, we cannot avoid that in
311*b7c941bbSAndroid Build Coastguard WorkerX  benchmarking people try to achieve  results  that  look  as  good  as
312*b7c941bbSAndroid Build Coastguard WorkerX  possible.   Therefore,  optimizations  performed by compilers - other
313*b7c941bbSAndroid Build Coastguard WorkerX  than those listed above - are not forbidden when Dhrystone  execution
314*b7c941bbSAndroid Build Coastguard WorkerX  times  are measured.  Dhrystone is not intended to be non-optimizable
315*b7c941bbSAndroid Build Coastguard WorkerX  but is intended to be similarly optimizable as normal programs.   For
316*b7c941bbSAndroid Build Coastguard WorkerX  example,  there  are  several  places  in Dhrystone where performance
317*b7c941bbSAndroid Build Coastguard WorkerX  benefits from optimizations like  common  subexpression  elimination,
318*b7c941bbSAndroid Build Coastguard WorkerX  value propagation etc., but normal programs usually also benefit from
319*b7c941bbSAndroid Build Coastguard WorkerX  these optimizations.  Therefore, no effort was made  to  artificially
320*b7c941bbSAndroid Build Coastguard WorkerX  prevent  such  optimizations.   However,  measurement  reports should
321*b7c941bbSAndroid Build Coastguard WorkerX  indicate which compiler  optimization  levels  have  been  used,  and
322*b7c941bbSAndroid Build Coastguard WorkerX  reporting  results with different levels of compiler optimization for
323*b7c941bbSAndroid Build Coastguard WorkerX  the same hardware is encouraged.
324*b7c941bbSAndroid Build Coastguard WorkerX
325*b7c941bbSAndroid Build Coastguard WorkerXo Default results are those without "register" declarations (C version)
326*b7c941bbSAndroid Build Coastguard WorkerX
327*b7c941bbSAndroid Build Coastguard WorkerX  When Dhrystone results are quoted without  additional  qualification,
328*b7c941bbSAndroid Build Coastguard WorkerX  they  should  be  understood  as  results obtained without use of the
329*b7c941bbSAndroid Build Coastguard WorkerX  "register" attribute. Good compilers should be able to make good  use
330*b7c941bbSAndroid Build Coastguard WorkerX  of  registers  even  without  explicit register declarations ([3], p.
331*b7c941bbSAndroid Build Coastguard WorkerX  193).
332*b7c941bbSAndroid Build Coastguard WorkerX
333*b7c941bbSAndroid Build Coastguard WorkerXOf  course,  for  experimental  purposes,  post-linkage   optimization,
334*b7c941bbSAndroid Build Coastguard WorkerXprocedure  merging  and/or  compilation  in  one  unit  can  be done to
335*b7c941bbSAndroid Build Coastguard WorkerXdetermine their effects.  However,  Dhrystone  numbers  obtained  under
336*b7c941bbSAndroid Build Coastguard WorkerXthese   conditions  should  be  explicitly  marked  as  such;  "normal"
337*b7c941bbSAndroid Build Coastguard WorkerXDhrystone results should be understood as  results  obtained  following
338*b7c941bbSAndroid Build Coastguard WorkerXthe ground rules listed above.
339*b7c941bbSAndroid Build Coastguard WorkerX
340*b7c941bbSAndroid Build Coastguard WorkerXIn any case, for serious performance evaluation, users are  advised  to
341*b7c941bbSAndroid Build Coastguard WorkerXask  for  code listings and to check them carefully.  In this way, when
342*b7c941bbSAndroid Build Coastguard WorkerXresults for different systems  are  compared,  the  reader  can  get  a
343*b7c941bbSAndroid Build Coastguard WorkerXfeeling how much performance difference is due to compiler optimization
344*b7c941bbSAndroid Build Coastguard WorkerXand how much is due to hardware speed.
345*b7c941bbSAndroid Build Coastguard WorkerX
346*b7c941bbSAndroid Build Coastguard WorkerX
347*b7c941bbSAndroid Build Coastguard WorkerXThe C version 2.1 of Dhrystone has been developed in  cooperation  with
348*b7c941bbSAndroid Build Coastguard WorkerXRick Richardson (Tinton Falls, NJ), it incorporates many ideas from the
349*b7c941bbSAndroid Build Coastguard WorkerX"Version 1.1" distributed previously  by  him  over  the  UNIX  network
350*b7c941bbSAndroid Build Coastguard WorkerXUsenet.  Through  his  activity with Usenet, Rick Richardson has made a
351*b7c941bbSAndroid Build Coastguard WorkerXvery valuable contribution to the dissemination of  the  benchmark.   I
352*b7c941bbSAndroid Build Coastguard WorkerXalso  thank  Chaim  Benedelac  (National  Semiconductor),  David Ditzel
353*b7c941bbSAndroid Build Coastguard WorkerX(SUN), Earl Killian and John  Mashey  (MIPS),  Alan  Smith  and  Rafael
354*b7c941bbSAndroid Build Coastguard WorkerXSaavedra-Barrera  (UC  at  Berkeley)  for  their  help with comments on
355*b7c941bbSAndroid Build Coastguard WorkerXearlier versions of the benchmark.
356*b7c941bbSAndroid Build Coastguard WorkerX
357*b7c941bbSAndroid Build Coastguard WorkerX
358*b7c941bbSAndroid Build Coastguard WorkerX[1]
359*b7c941bbSAndroid Build Coastguard WorkerX   Reinhold P. Weicker:  Dhrystone:  A  Synthetic  Systems  Programming
360*b7c941bbSAndroid Build Coastguard WorkerX   Benchmark.
361*b7c941bbSAndroid Build Coastguard WorkerX   Communications of the ACM 27, 10 (Oct. 1984), 1013-1030
362*b7c941bbSAndroid Build Coastguard WorkerX
363*b7c941bbSAndroid Build Coastguard WorkerX[2]
364*b7c941bbSAndroid Build Coastguard WorkerX   Rick Richardson: Dhrystone 1.1 Benchmark Summary (and Program Text)
365*b7c941bbSAndroid Build Coastguard WorkerX   Informal Distribution via "Usenet", Last Version Known to me:  Sept.
366*b7c941bbSAndroid Build Coastguard WorkerX   21, 1987
367*b7c941bbSAndroid Build Coastguard WorkerX
368*b7c941bbSAndroid Build Coastguard WorkerX[3]
369*b7c941bbSAndroid Build Coastguard WorkerX   Brian W.  Kernighan  and  Dennis  M.  Ritchie:   The  C  Programming
370*b7c941bbSAndroid Build Coastguard WorkerX   Language.
371*b7c941bbSAndroid Build Coastguard WorkerX   Prentice-Hall, Englewood Cliffs (NJ) 1978
372*b7c941bbSAndroid Build Coastguard WorkerX
373*b7c941bbSAndroid Build Coastguard WorkerX
374*b7c941bbSAndroid Build Coastguard WorkerX
375*b7c941bbSAndroid Build Coastguard WorkerX
376*b7c941bbSAndroid Build Coastguard WorkerX
377*b7c941bbSAndroid Build Coastguard WorkerSHAR_EOF
378*b7c941bbSAndroid Build Coastguard Workerfi
379*b7c941bbSAndroid Build Coastguard Workerif test -f 'dhry.h'
380*b7c941bbSAndroid Build Coastguard Workerthen
381*b7c941bbSAndroid Build Coastguard Worker        echo shar: "will not over-write existing file 'dhry.h'"
382*b7c941bbSAndroid Build Coastguard Workerelse
383*b7c941bbSAndroid Build Coastguard Workersed 's/^X//' << \SHAR_EOF > 'dhry.h'
384*b7c941bbSAndroid Build Coastguard WorkerX/*
385*b7c941bbSAndroid Build Coastguard WorkerX ****************************************************************************
386*b7c941bbSAndroid Build Coastguard WorkerX *
387*b7c941bbSAndroid Build Coastguard WorkerX *                   "DHRYSTONE" Benchmark Program
388*b7c941bbSAndroid Build Coastguard WorkerX *                   -----------------------------
389*b7c941bbSAndroid Build Coastguard WorkerX *
390*b7c941bbSAndroid Build Coastguard WorkerX *  Version:    C, Version 2.1
391*b7c941bbSAndroid Build Coastguard WorkerX *
392*b7c941bbSAndroid Build Coastguard WorkerX *  File:       dhry.h (part 1 of 3)
393*b7c941bbSAndroid Build Coastguard WorkerX *
394*b7c941bbSAndroid Build Coastguard WorkerX *  Date:       May 17, 1988
395*b7c941bbSAndroid Build Coastguard WorkerX *
396*b7c941bbSAndroid Build Coastguard WorkerX *  Author:     Reinhold P. Weicker
397*b7c941bbSAndroid Build Coastguard WorkerX *                      Siemens AG, E STE 35
398*b7c941bbSAndroid Build Coastguard WorkerX *                      Postfach 3240
399*b7c941bbSAndroid Build Coastguard WorkerX *                      8520 Erlangen
400*b7c941bbSAndroid Build Coastguard WorkerX *                      Germany (West)
401*b7c941bbSAndroid Build Coastguard WorkerX *                              Phone:  [xxx-49]-9131-7-20330
402*b7c941bbSAndroid Build Coastguard WorkerX *                                      (8-17 Central European Time)
403*b7c941bbSAndroid Build Coastguard WorkerX *                              Usenet: ..!mcvax!unido!estevax!weicker
404*b7c941bbSAndroid Build Coastguard WorkerX *
405*b7c941bbSAndroid Build Coastguard WorkerX *              Original Version (in Ada) published in
406*b7c941bbSAndroid Build Coastguard WorkerX *              "Communications of the ACM" vol. 27., no. 10 (Oct. 1984),
407*b7c941bbSAndroid Build Coastguard WorkerX *              pp. 1013 - 1030, together with the statistics
408*b7c941bbSAndroid Build Coastguard WorkerX *              on which the distribution of statements etc. is based.
409*b7c941bbSAndroid Build Coastguard WorkerX *
410*b7c941bbSAndroid Build Coastguard WorkerX *              In this C version, the following C library functions are used:
411*b7c941bbSAndroid Build Coastguard WorkerX *              - strcpy, strcmp (inside the measurement loop)
412*b7c941bbSAndroid Build Coastguard WorkerX *              - printf, scanf (outside the measurement loop)
413*b7c941bbSAndroid Build Coastguard WorkerX *              In addition, Berkeley UNIX system calls "times ()" or "time ()"
414*b7c941bbSAndroid Build Coastguard WorkerX *              are used for execution time measurement. For measurements
415*b7c941bbSAndroid Build Coastguard WorkerX *              on other systems, these calls have to be changed.
416*b7c941bbSAndroid Build Coastguard WorkerX *
417*b7c941bbSAndroid Build Coastguard WorkerX *  Collection of Results:
418*b7c941bbSAndroid Build Coastguard WorkerX *              Reinhold Weicker (address see above) and
419*b7c941bbSAndroid Build Coastguard WorkerX *
420*b7c941bbSAndroid Build Coastguard WorkerX *              Rick Richardson
421*b7c941bbSAndroid Build Coastguard WorkerX *              PC Research. Inc.
422*b7c941bbSAndroid Build Coastguard WorkerX *              94 Apple Orchard Drive
423*b7c941bbSAndroid Build Coastguard WorkerX *              Tinton Falls, NJ 07724
424*b7c941bbSAndroid Build Coastguard WorkerX *                      Phone:  (201) 389-8963 (9-17 EST)
425*b7c941bbSAndroid Build Coastguard WorkerX *                      Usenet: ...!uunet!pcrat!rick
426*b7c941bbSAndroid Build Coastguard WorkerX *
427*b7c941bbSAndroid Build Coastguard WorkerX *      Please send results to Rick Richardson and/or Reinhold Weicker.
428*b7c941bbSAndroid Build Coastguard WorkerX *      Complete information should be given on hardware and software used.
429*b7c941bbSAndroid Build Coastguard WorkerX *      Hardware information includes: Machine type, CPU, type and size
430*b7c941bbSAndroid Build Coastguard WorkerX *      of caches; for microprocessors: clock frequency, memory speed
431*b7c941bbSAndroid Build Coastguard WorkerX *      (number of wait states).
432*b7c941bbSAndroid Build Coastguard WorkerX *      Software information includes: Compiler (and runtime library)
433*b7c941bbSAndroid Build Coastguard WorkerX *      manufacturer and version, compilation switches, OS version.
434*b7c941bbSAndroid Build Coastguard WorkerX *      The Operating System version may give an indication about the
435*b7c941bbSAndroid Build Coastguard WorkerX *      compiler; Dhrystone itself performs no OS calls in the measurement loop.
436*b7c941bbSAndroid Build Coastguard WorkerX *
437*b7c941bbSAndroid Build Coastguard WorkerX *      The complete output generated by the program should be mailed
438*b7c941bbSAndroid Build Coastguard WorkerX *      such that at least some checks for correctness can be made.
439*b7c941bbSAndroid Build Coastguard WorkerX *
440*b7c941bbSAndroid Build Coastguard WorkerX ***************************************************************************
441*b7c941bbSAndroid Build Coastguard WorkerX *
442*b7c941bbSAndroid Build Coastguard WorkerX *  History:    This version C/2.1 has been made for two reasons:
443*b7c941bbSAndroid Build Coastguard WorkerX *
444*b7c941bbSAndroid Build Coastguard WorkerX *              1) There is an obvious need for a common C version of
445*b7c941bbSAndroid Build Coastguard WorkerX *              Dhrystone, since C is at present the most popular system
446*b7c941bbSAndroid Build Coastguard WorkerX *              programming language for the class of processors
447*b7c941bbSAndroid Build Coastguard WorkerX *              (microcomputers, minicomputers) where Dhrystone is used most.
448*b7c941bbSAndroid Build Coastguard WorkerX *              There should be, as far as possible, only one C version of
449*b7c941bbSAndroid Build Coastguard WorkerX *              Dhrystone such that results can be compared without
450*b7c941bbSAndroid Build Coastguard WorkerX *              restrictions. In the past, the C versions distributed
451*b7c941bbSAndroid Build Coastguard WorkerX *              by Rick Richardson (Version 1.1) and by Reinhold Weicker
452*b7c941bbSAndroid Build Coastguard WorkerX *              had small (though not significant) differences.
453*b7c941bbSAndroid Build Coastguard WorkerX *
454*b7c941bbSAndroid Build Coastguard WorkerX *              2) As far as it is possible without changes to the Dhrystone
455*b7c941bbSAndroid Build Coastguard WorkerX *              statistics, optimizing compilers should be prevented from
456*b7c941bbSAndroid Build Coastguard WorkerX *              removing significant statements.
457*b7c941bbSAndroid Build Coastguard WorkerX *
458*b7c941bbSAndroid Build Coastguard WorkerX *              This C version has been developed in cooperation with
459*b7c941bbSAndroid Build Coastguard WorkerX *              Rick Richardson (Tinton Falls, NJ), it incorporates many
460*b7c941bbSAndroid Build Coastguard WorkerX *              ideas from the "Version 1.1" distributed previously by
461*b7c941bbSAndroid Build Coastguard WorkerX *              him over the UNIX network Usenet.
462*b7c941bbSAndroid Build Coastguard WorkerX *              I also thank Chaim Benedelac (National Semiconductor),
463*b7c941bbSAndroid Build Coastguard WorkerX *              David Ditzel (SUN), Earl Killian and John Mashey (MIPS),
464*b7c941bbSAndroid Build Coastguard WorkerX *              Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley)
465*b7c941bbSAndroid Build Coastguard WorkerX *              for their help with comments on earlier versions of the
466*b7c941bbSAndroid Build Coastguard WorkerX *              benchmark.
467*b7c941bbSAndroid Build Coastguard WorkerX *
468*b7c941bbSAndroid Build Coastguard WorkerX *  Changes:    In the initialization part, this version follows mostly
469*b7c941bbSAndroid Build Coastguard WorkerX *              Rick Richardson's version distributed via Usenet, not the
470*b7c941bbSAndroid Build Coastguard WorkerX *              version distributed earlier via floppy disk by Reinhold Weicker.
471*b7c941bbSAndroid Build Coastguard WorkerX *              As a concession to older compilers, names have been made
472*b7c941bbSAndroid Build Coastguard WorkerX *              unique within the first 8 characters.
473*b7c941bbSAndroid Build Coastguard WorkerX *              Inside the measurement loop, this version follows the
474*b7c941bbSAndroid Build Coastguard WorkerX *              version previously distributed by Reinhold Weicker.
475*b7c941bbSAndroid Build Coastguard WorkerX *
476*b7c941bbSAndroid Build Coastguard WorkerX *              At several places in the benchmark, code has been added,
477*b7c941bbSAndroid Build Coastguard WorkerX *              but within the measurement loop only in branches that
478*b7c941bbSAndroid Build Coastguard WorkerX *              are not executed. The intention is that optimizing compilers
479*b7c941bbSAndroid Build Coastguard WorkerX *              should be prevented from moving code out of the measurement
480*b7c941bbSAndroid Build Coastguard WorkerX *              loop, or from removing code altogether. Since the statements
481*b7c941bbSAndroid Build Coastguard WorkerX *              that are executed within the measurement loop have NOT been
482*b7c941bbSAndroid Build Coastguard WorkerX *              changed, the numbers defining the "Dhrystone distribution"
483*b7c941bbSAndroid Build Coastguard WorkerX *              (distribution of statements, operand types and locality)
484*b7c941bbSAndroid Build Coastguard WorkerX *              still hold. Except for sophisticated optimizing compilers,
485*b7c941bbSAndroid Build Coastguard WorkerX *              execution times for this version should be the same as
486*b7c941bbSAndroid Build Coastguard WorkerX *              for previous versions.
487*b7c941bbSAndroid Build Coastguard WorkerX *
488*b7c941bbSAndroid Build Coastguard WorkerX *              Since it has proven difficult to subtract the time for the
489*b7c941bbSAndroid Build Coastguard WorkerX *              measurement loop overhead in a correct way, the loop check
490*b7c941bbSAndroid Build Coastguard WorkerX *              has been made a part of the benchmark. This does have
491*b7c941bbSAndroid Build Coastguard WorkerX *              an impact - though a very minor one - on the distribution
492*b7c941bbSAndroid Build Coastguard WorkerX *              statistics which have been updated for this version.
493*b7c941bbSAndroid Build Coastguard WorkerX *
494*b7c941bbSAndroid Build Coastguard WorkerX *              All changes within the measurement loop are described
495*b7c941bbSAndroid Build Coastguard WorkerX *              and discussed in the companion paper "Rationale for
496*b7c941bbSAndroid Build Coastguard WorkerX *              Dhrystone version 2".
497*b7c941bbSAndroid Build Coastguard WorkerX *
498*b7c941bbSAndroid Build Coastguard WorkerX *              Because of the self-imposed limitation that the order and
499*b7c941bbSAndroid Build Coastguard WorkerX *              distribution of the executed statements should not be
500*b7c941bbSAndroid Build Coastguard WorkerX *              changed, there are still cases where optimizing compilers
501*b7c941bbSAndroid Build Coastguard WorkerX *              may not generate code for some statements. To a certain
502*b7c941bbSAndroid Build Coastguard WorkerX *              degree, this is unavoidable for small synthetic benchmarks.
503*b7c941bbSAndroid Build Coastguard WorkerX *              Users of the benchmark are advised to check code listings
504*b7c941bbSAndroid Build Coastguard WorkerX *              whether code is generated for all statements of Dhrystone.
505*b7c941bbSAndroid Build Coastguard WorkerX *
506*b7c941bbSAndroid Build Coastguard WorkerX *              Version 2.1 is identical to version 2.0 distributed via
507*b7c941bbSAndroid Build Coastguard WorkerX *              the UNIX network Usenet in March 1988 except that it corrects
508*b7c941bbSAndroid Build Coastguard WorkerX *              some minor deficiencies that were found by users of version 2.0.
509*b7c941bbSAndroid Build Coastguard WorkerX *              The following corrections have been made in the C version:
510*b7c941bbSAndroid Build Coastguard WorkerX *              - The assignment to Number_Of_Runs was changed
511*b7c941bbSAndroid Build Coastguard WorkerX *              - The constant Too_Small_Time was changed
512*b7c941bbSAndroid Build Coastguard WorkerX *              - An "else" part was added to the "if" statement in Func_3;
513*b7c941bbSAndroid Build Coastguard WorkerX *                for compensation, an "else" part was removed in Proc_3
514*b7c941bbSAndroid Build Coastguard WorkerX *              - Shorter file names are used
515*b7c941bbSAndroid Build Coastguard WorkerX *
516*b7c941bbSAndroid Build Coastguard WorkerX ***************************************************************************
517*b7c941bbSAndroid Build Coastguard WorkerX *
518*b7c941bbSAndroid Build Coastguard WorkerX * Defines:     The following "Defines" are possible:
519*b7c941bbSAndroid Build Coastguard WorkerX *              -DREG=register          (default: Not defined)
520*b7c941bbSAndroid Build Coastguard WorkerX *                      As an approximation to what an average C programmer
521*b7c941bbSAndroid Build Coastguard WorkerX *                      might do, the "register" storage class is applied
522*b7c941bbSAndroid Build Coastguard WorkerX *                      (if enabled by -DREG=register)
523*b7c941bbSAndroid Build Coastguard WorkerX *                      - for local variables, if they are used (dynamically)
524*b7c941bbSAndroid Build Coastguard WorkerX *                        five or more times
525*b7c941bbSAndroid Build Coastguard WorkerX *                      - for parameters if they are used (dynamically)
526*b7c941bbSAndroid Build Coastguard WorkerX *                        six or more times
527*b7c941bbSAndroid Build Coastguard WorkerX *                      Note that an optimal "register" strategy is
528*b7c941bbSAndroid Build Coastguard WorkerX *                      compiler-dependent, and that "register" declarations
529*b7c941bbSAndroid Build Coastguard WorkerX *                      do not necessarily lead to faster execution.
530*b7c941bbSAndroid Build Coastguard WorkerX *              -DNOSTRUCTASSIGN        (default: Not defined)
531*b7c941bbSAndroid Build Coastguard WorkerX *                      Define if the C compiler does not support
532*b7c941bbSAndroid Build Coastguard WorkerX *                      assignment of structures.
533*b7c941bbSAndroid Build Coastguard WorkerX *              -DNOENUMS               (default: Not defined)
534*b7c941bbSAndroid Build Coastguard WorkerX *                      Define if the C compiler does not support
535*b7c941bbSAndroid Build Coastguard WorkerX *                      enumeration types.
536*b7c941bbSAndroid Build Coastguard WorkerX *              -DTIMES                 (default)
537*b7c941bbSAndroid Build Coastguard WorkerX *              -DTIME
538*b7c941bbSAndroid Build Coastguard WorkerX *                      The "times" function of UNIX (returning process times)
539*b7c941bbSAndroid Build Coastguard WorkerX *                      or the "time" function (returning wallclock time)
540*b7c941bbSAndroid Build Coastguard WorkerX *                      is used for measurement.
541*b7c941bbSAndroid Build Coastguard WorkerX *                      For single user machines, "time ()" is adequate. For
542*b7c941bbSAndroid Build Coastguard WorkerX *                      multi-user machines where you cannot get single-user
543*b7c941bbSAndroid Build Coastguard WorkerX *                      access, use the "times ()" function. If you have
544*b7c941bbSAndroid Build Coastguard WorkerX *                      neither, use a stopwatch in the dead of night.
545*b7c941bbSAndroid Build Coastguard WorkerX *                      "printf"s are provided marking the points "Start Timer"
546*b7c941bbSAndroid Build Coastguard WorkerX *                      and "Stop Timer". DO NOT use the UNIX "time(1)"
547*b7c941bbSAndroid Build Coastguard WorkerX *                      command, as this will measure the total time to
548*b7c941bbSAndroid Build Coastguard WorkerX *                      run this program, which will (erroneously) include
549*b7c941bbSAndroid Build Coastguard WorkerX *                      the time to allocate storage (malloc) and to perform
550*b7c941bbSAndroid Build Coastguard WorkerX *                      the initialization.
551*b7c941bbSAndroid Build Coastguard WorkerX *              -DHZ=nnn
552*b7c941bbSAndroid Build Coastguard WorkerX *                      In Berkeley UNIX, the function "times" returns process
553*b7c941bbSAndroid Build Coastguard WorkerX *                      time in 1/HZ seconds, with HZ = 60 for most systems.
554*b7c941bbSAndroid Build Coastguard WorkerX *                      CHECK YOUR SYSTEM DESCRIPTION BEFORE YOU JUST APPLY
555*b7c941bbSAndroid Build Coastguard WorkerX *                      A VALUE.
556*b7c941bbSAndroid Build Coastguard WorkerX *
557*b7c941bbSAndroid Build Coastguard WorkerX ***************************************************************************
558*b7c941bbSAndroid Build Coastguard WorkerX *
559*b7c941bbSAndroid Build Coastguard WorkerX *  Compilation model and measurement (IMPORTANT):
560*b7c941bbSAndroid Build Coastguard WorkerX *
561*b7c941bbSAndroid Build Coastguard WorkerX *  This C version of Dhrystone consists of three files:
562*b7c941bbSAndroid Build Coastguard WorkerX *  - dhry.h (this file, containing global definitions and comments)
563*b7c941bbSAndroid Build Coastguard WorkerX *  - dhry_1.c (containing the code corresponding to Ada package Pack_1)
564*b7c941bbSAndroid Build Coastguard WorkerX *  - dhry_2.c (containing the code corresponding to Ada package Pack_2)
565*b7c941bbSAndroid Build Coastguard WorkerX *
566*b7c941bbSAndroid Build Coastguard WorkerX *  The following "ground rules" apply for measurements:
567*b7c941bbSAndroid Build Coastguard WorkerX *  - Separate compilation
568*b7c941bbSAndroid Build Coastguard WorkerX *  - No procedure merging
569*b7c941bbSAndroid Build Coastguard WorkerX *  - Otherwise, compiler optimizations are allowed but should be indicated
570*b7c941bbSAndroid Build Coastguard WorkerX *  - Default results are those without register declarations
571*b7c941bbSAndroid Build Coastguard WorkerX *  See the companion paper "Rationale for Dhrystone Version 2" for a more
572*b7c941bbSAndroid Build Coastguard WorkerX *  detailed discussion of these ground rules.
573*b7c941bbSAndroid Build Coastguard WorkerX *
574*b7c941bbSAndroid Build Coastguard WorkerX *  For 16-Bit processors (e.g. 80186, 80286), times for all compilation
575*b7c941bbSAndroid Build Coastguard WorkerX *  models ("small", "medium", "large" etc.) should be given if possible,
576*b7c941bbSAndroid Build Coastguard WorkerX *  together with a definition of these models for the compiler system used.
577*b7c941bbSAndroid Build Coastguard WorkerX *
578*b7c941bbSAndroid Build Coastguard WorkerX **************************************************************************
579*b7c941bbSAndroid Build Coastguard WorkerX *
580*b7c941bbSAndroid Build Coastguard WorkerX *  Dhrystone (C version) statistics:
581*b7c941bbSAndroid Build Coastguard WorkerX *
582*b7c941bbSAndroid Build Coastguard WorkerX *  [Comment from the first distribution, updated for version 2.
583*b7c941bbSAndroid Build Coastguard WorkerX *   Note that because of language differences, the numbers are slightly
584*b7c941bbSAndroid Build Coastguard WorkerX *   different from the Ada version.]
585*b7c941bbSAndroid Build Coastguard WorkerX *
586*b7c941bbSAndroid Build Coastguard WorkerX *  The following program contains statements of a high level programming
587*b7c941bbSAndroid Build Coastguard WorkerX *  language (here: C) in a distribution considered representative:
588*b7c941bbSAndroid Build Coastguard WorkerX *
589*b7c941bbSAndroid Build Coastguard WorkerX *    assignments                  52 (51.0 %)
590*b7c941bbSAndroid Build Coastguard WorkerX *    control statements           33 (32.4 %)
591*b7c941bbSAndroid Build Coastguard WorkerX *    procedure, function calls    17 (16.7 %)
592*b7c941bbSAndroid Build Coastguard WorkerX *
593*b7c941bbSAndroid Build Coastguard WorkerX *  103 statements are dynamically executed. The program is balanced with
594*b7c941bbSAndroid Build Coastguard WorkerX *  respect to the three aspects:
595*b7c941bbSAndroid Build Coastguard WorkerX *
596*b7c941bbSAndroid Build Coastguard WorkerX *    - statement type
597*b7c941bbSAndroid Build Coastguard WorkerX *    - operand type
598*b7c941bbSAndroid Build Coastguard WorkerX *    - operand locality
599*b7c941bbSAndroid Build Coastguard WorkerX *         operand global, local, parameter, or constant.
600*b7c941bbSAndroid Build Coastguard WorkerX *
601*b7c941bbSAndroid Build Coastguard WorkerX *  The combination of these three aspects is balanced only approximately.
602*b7c941bbSAndroid Build Coastguard WorkerX *
603*b7c941bbSAndroid Build Coastguard WorkerX *  1. Statement Type:
604*b7c941bbSAndroid Build Coastguard WorkerX *  -----------------             number
605*b7c941bbSAndroid Build Coastguard WorkerX *
606*b7c941bbSAndroid Build Coastguard WorkerX *     V1 = V2                     9
607*b7c941bbSAndroid Build Coastguard WorkerX *       (incl. V1 = F(..)
608*b7c941bbSAndroid Build Coastguard WorkerX *     V = Constant               12
609*b7c941bbSAndroid Build Coastguard WorkerX *     Assignment,                 7
610*b7c941bbSAndroid Build Coastguard WorkerX *       with array element
611*b7c941bbSAndroid Build Coastguard WorkerX *     Assignment,                 6
612*b7c941bbSAndroid Build Coastguard WorkerX *       with record component
613*b7c941bbSAndroid Build Coastguard WorkerX *                                --
614*b7c941bbSAndroid Build Coastguard WorkerX *                                34       34
615*b7c941bbSAndroid Build Coastguard WorkerX *
616*b7c941bbSAndroid Build Coastguard WorkerX *     X = Y +|-|"&&"|"|" Z        5
617*b7c941bbSAndroid Build Coastguard WorkerX *     X = Y +|-|"==" Constant     6
618*b7c941bbSAndroid Build Coastguard WorkerX *     X = X +|- 1                 3
619*b7c941bbSAndroid Build Coastguard WorkerX *     X = Y *|/ Z                 2
620*b7c941bbSAndroid Build Coastguard WorkerX *     X = Expression,             1
621*b7c941bbSAndroid Build Coastguard WorkerX *           two operators
622*b7c941bbSAndroid Build Coastguard WorkerX *     X = Expression,             1
623*b7c941bbSAndroid Build Coastguard WorkerX *           three operators
624*b7c941bbSAndroid Build Coastguard WorkerX *                                --
625*b7c941bbSAndroid Build Coastguard WorkerX *                                18       18
626*b7c941bbSAndroid Build Coastguard WorkerX *
627*b7c941bbSAndroid Build Coastguard WorkerX *     if ....                    14
628*b7c941bbSAndroid Build Coastguard WorkerX *       with "else"      7
629*b7c941bbSAndroid Build Coastguard WorkerX *       without "else"   7
630*b7c941bbSAndroid Build Coastguard WorkerX *           executed        3
631*b7c941bbSAndroid Build Coastguard WorkerX *           not executed    4
632*b7c941bbSAndroid Build Coastguard WorkerX *     for ...                     7  |  counted every time
633*b7c941bbSAndroid Build Coastguard WorkerX *     while ...                   4  |  the loop condition
634*b7c941bbSAndroid Build Coastguard WorkerX *     do ... while                1  |  is evaluated
635*b7c941bbSAndroid Build Coastguard WorkerX *     switch ...                  1
636*b7c941bbSAndroid Build Coastguard WorkerX *     break                       1
637*b7c941bbSAndroid Build Coastguard WorkerX *     declaration with            1
638*b7c941bbSAndroid Build Coastguard WorkerX *       initialization
639*b7c941bbSAndroid Build Coastguard WorkerX *                                --
640*b7c941bbSAndroid Build Coastguard WorkerX *                                34       34
641*b7c941bbSAndroid Build Coastguard WorkerX *
642*b7c941bbSAndroid Build Coastguard WorkerX *     P (...)  procedure call    11
643*b7c941bbSAndroid Build Coastguard WorkerX *       user procedure      10
644*b7c941bbSAndroid Build Coastguard WorkerX *       library procedure    1
645*b7c941bbSAndroid Build Coastguard WorkerX *     X = F (...)
646*b7c941bbSAndroid Build Coastguard WorkerX *             function  call      6
647*b7c941bbSAndroid Build Coastguard WorkerX *       user function        5
648*b7c941bbSAndroid Build Coastguard WorkerX *       library function     1
649*b7c941bbSAndroid Build Coastguard WorkerX *                                --
650*b7c941bbSAndroid Build Coastguard WorkerX *                                17       17
651*b7c941bbSAndroid Build Coastguard WorkerX *                                        ---
652*b7c941bbSAndroid Build Coastguard WorkerX *                                        103
653*b7c941bbSAndroid Build Coastguard WorkerX *
654*b7c941bbSAndroid Build Coastguard WorkerX *    The average number of parameters in procedure or function calls
655*b7c941bbSAndroid Build Coastguard WorkerX *    is 1.82 (not counting the function values as implicit parameters).
656*b7c941bbSAndroid Build Coastguard WorkerX *
657*b7c941bbSAndroid Build Coastguard WorkerX *
658*b7c941bbSAndroid Build Coastguard WorkerX *  2. Operators
659*b7c941bbSAndroid Build Coastguard WorkerX *  ------------
660*b7c941bbSAndroid Build Coastguard WorkerX *                          number    approximate
661*b7c941bbSAndroid Build Coastguard WorkerX *                                    percentage
662*b7c941bbSAndroid Build Coastguard WorkerX *
663*b7c941bbSAndroid Build Coastguard WorkerX *    Arithmetic             32          50.8
664*b7c941bbSAndroid Build Coastguard WorkerX *
665*b7c941bbSAndroid Build Coastguard WorkerX *       +                     21          33.3
666*b7c941bbSAndroid Build Coastguard WorkerX *       -                      7          11.1
667*b7c941bbSAndroid Build Coastguard WorkerX *       *                      3           4.8
668*b7c941bbSAndroid Build Coastguard WorkerX *       / (int div)            1           1.6
669*b7c941bbSAndroid Build Coastguard WorkerX *
670*b7c941bbSAndroid Build Coastguard WorkerX *    Comparison             27           42.8
671*b7c941bbSAndroid Build Coastguard WorkerX *
672*b7c941bbSAndroid Build Coastguard WorkerX *       ==                     9           14.3
673*b7c941bbSAndroid Build Coastguard WorkerX *       /=                     4            6.3
674*b7c941bbSAndroid Build Coastguard WorkerX *       >                      1            1.6
675*b7c941bbSAndroid Build Coastguard WorkerX *       <                      3            4.8
676*b7c941bbSAndroid Build Coastguard WorkerX *       >=                     1            1.6
677*b7c941bbSAndroid Build Coastguard WorkerX *       <=                     9           14.3
678*b7c941bbSAndroid Build Coastguard WorkerX *
679*b7c941bbSAndroid Build Coastguard WorkerX *    Logic                   4            6.3
680*b7c941bbSAndroid Build Coastguard WorkerX *
681*b7c941bbSAndroid Build Coastguard WorkerX *       && (AND-THEN)          1            1.6
682*b7c941bbSAndroid Build Coastguard WorkerX *       |  (OR)                1            1.6
683*b7c941bbSAndroid Build Coastguard WorkerX *       !  (NOT)               2            3.2
684*b7c941bbSAndroid Build Coastguard WorkerX *
685*b7c941bbSAndroid Build Coastguard WorkerX *                           --          -----
686*b7c941bbSAndroid Build Coastguard WorkerX *                           63          100.1
687*b7c941bbSAndroid Build Coastguard WorkerX *
688*b7c941bbSAndroid Build Coastguard WorkerX *
689*b7c941bbSAndroid Build Coastguard WorkerX *  3. Operand Type (counted once per operand reference):
690*b7c941bbSAndroid Build Coastguard WorkerX *  ---------------
691*b7c941bbSAndroid Build Coastguard WorkerX *                          number    approximate
692*b7c941bbSAndroid Build Coastguard WorkerX *                                    percentage
693*b7c941bbSAndroid Build Coastguard WorkerX *
694*b7c941bbSAndroid Build Coastguard WorkerX *     Integer               175        72.3 %
695*b7c941bbSAndroid Build Coastguard WorkerX *     Character              45        18.6 %
696*b7c941bbSAndroid Build Coastguard WorkerX *     Pointer                12         5.0 %
697*b7c941bbSAndroid Build Coastguard WorkerX *     String30                6         2.5 %
698*b7c941bbSAndroid Build Coastguard WorkerX *     Array                   2         0.8 %
699*b7c941bbSAndroid Build Coastguard WorkerX *     Record                  2         0.8 %
700*b7c941bbSAndroid Build Coastguard WorkerX *                           ---       -------
701*b7c941bbSAndroid Build Coastguard WorkerX *                           242       100.0 %
702*b7c941bbSAndroid Build Coastguard WorkerX *
703*b7c941bbSAndroid Build Coastguard WorkerX *  When there is an access path leading to the final operand (e.g. a record
704*b7c941bbSAndroid Build Coastguard WorkerX *  component), only the final data type on the access path is counted.
705*b7c941bbSAndroid Build Coastguard WorkerX *
706*b7c941bbSAndroid Build Coastguard WorkerX *
707*b7c941bbSAndroid Build Coastguard WorkerX *  4. Operand Locality:
708*b7c941bbSAndroid Build Coastguard WorkerX *  -------------------
709*b7c941bbSAndroid Build Coastguard WorkerX *                                number    approximate
710*b7c941bbSAndroid Build Coastguard WorkerX *                                          percentage
711*b7c941bbSAndroid Build Coastguard WorkerX *
712*b7c941bbSAndroid Build Coastguard WorkerX *     local variable              114        47.1 %
713*b7c941bbSAndroid Build Coastguard WorkerX *     global variable              22         9.1 %
714*b7c941bbSAndroid Build Coastguard WorkerX *     parameter                    45        18.6 %
715*b7c941bbSAndroid Build Coastguard WorkerX *        value                        23         9.5 %
716*b7c941bbSAndroid Build Coastguard WorkerX *        reference                    22         9.1 %
717*b7c941bbSAndroid Build Coastguard WorkerX *     function result               6         2.5 %
718*b7c941bbSAndroid Build Coastguard WorkerX *     constant                     55        22.7 %
719*b7c941bbSAndroid Build Coastguard WorkerX *                                 ---       -------
720*b7c941bbSAndroid Build Coastguard WorkerX *                                 242       100.0 %
721*b7c941bbSAndroid Build Coastguard WorkerX *
722*b7c941bbSAndroid Build Coastguard WorkerX *
723*b7c941bbSAndroid Build Coastguard WorkerX *  The program does not compute anything meaningful, but it is syntactically
724*b7c941bbSAndroid Build Coastguard WorkerX *  and semantically correct. All variables have a value assigned to them
725*b7c941bbSAndroid Build Coastguard WorkerX *  before they are used as a source operand.
726*b7c941bbSAndroid Build Coastguard WorkerX *
727*b7c941bbSAndroid Build Coastguard WorkerX *  There has been no explicit effort to account for the effects of a
728*b7c941bbSAndroid Build Coastguard WorkerX *  cache, or to balance the use of long or short displacements for code or
729*b7c941bbSAndroid Build Coastguard WorkerX *  data.
730*b7c941bbSAndroid Build Coastguard WorkerX *
731*b7c941bbSAndroid Build Coastguard WorkerX ***************************************************************************
732*b7c941bbSAndroid Build Coastguard WorkerX */
733*b7c941bbSAndroid Build Coastguard WorkerX
734*b7c941bbSAndroid Build Coastguard WorkerX/* Compiler and system dependent definitions: */
735*b7c941bbSAndroid Build Coastguard WorkerX
736*b7c941bbSAndroid Build Coastguard WorkerX#ifndef TIME
737*b7c941bbSAndroid Build Coastguard WorkerX#ifndef TIMES
738*b7c941bbSAndroid Build Coastguard WorkerX#define TIMES
739*b7c941bbSAndroid Build Coastguard WorkerX#endif
740*b7c941bbSAndroid Build Coastguard WorkerX#endif
741*b7c941bbSAndroid Build Coastguard WorkerX                /* Use times(2) time function unless    */
742*b7c941bbSAndroid Build Coastguard WorkerX                /* explicitly defined otherwise         */
743*b7c941bbSAndroid Build Coastguard WorkerX
744*b7c941bbSAndroid Build Coastguard WorkerX#ifdef MSC_CLOCK
745*b7c941bbSAndroid Build Coastguard WorkerX#undef HZ
746*b7c941bbSAndroid Build Coastguard WorkerX#undef TIMES
747*b7c941bbSAndroid Build Coastguard WorkerX#include <time.h>
748*b7c941bbSAndroid Build Coastguard WorkerX#define HZ        CLK_TCK
749*b7c941bbSAndroid Build Coastguard WorkerX#endif
750*b7c941bbSAndroid Build Coastguard WorkerX                /* Use Microsoft C hi-res clock */
751*b7c941bbSAndroid Build Coastguard WorkerX
752*b7c941bbSAndroid Build Coastguard WorkerX#ifdef TIMES
753*b7c941bbSAndroid Build Coastguard WorkerX#include <sys/types.h>
754*b7c941bbSAndroid Build Coastguard WorkerX#include <sys/times.h>
755*b7c941bbSAndroid Build Coastguard WorkerX                /* for "times" */
756*b7c941bbSAndroid Build Coastguard WorkerX#endif
757*b7c941bbSAndroid Build Coastguard WorkerX
758*b7c941bbSAndroid Build Coastguard WorkerX#define Mic_secs_Per_Second     1000000.0
759*b7c941bbSAndroid Build Coastguard WorkerX                /* Berkeley UNIX C returns process times in seconds/HZ */
760*b7c941bbSAndroid Build Coastguard WorkerX
761*b7c941bbSAndroid Build Coastguard WorkerX#ifdef  NOSTRUCTASSIGN
762*b7c941bbSAndroid Build Coastguard WorkerX#define structassign(d, s)      memcpy(&(d), &(s), sizeof(d))
763*b7c941bbSAndroid Build Coastguard WorkerX#else
764*b7c941bbSAndroid Build Coastguard WorkerX#define structassign(d, s)      d = s
765*b7c941bbSAndroid Build Coastguard WorkerX#endif
766*b7c941bbSAndroid Build Coastguard WorkerX
767*b7c941bbSAndroid Build Coastguard WorkerX#ifdef  NOENUM
768*b7c941bbSAndroid Build Coastguard WorkerX#define Ident_1 0
769*b7c941bbSAndroid Build Coastguard WorkerX#define Ident_2 1
770*b7c941bbSAndroid Build Coastguard WorkerX#define Ident_3 2
771*b7c941bbSAndroid Build Coastguard WorkerX#define Ident_4 3
772*b7c941bbSAndroid Build Coastguard WorkerX#define Ident_5 4
773*b7c941bbSAndroid Build Coastguard WorkerX  typedef int   Enumeration;
774*b7c941bbSAndroid Build Coastguard WorkerX#else
775*b7c941bbSAndroid Build Coastguard WorkerX  typedef       enum    {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5}
776*b7c941bbSAndroid Build Coastguard WorkerX                Enumeration;
777*b7c941bbSAndroid Build Coastguard WorkerX#endif
778*b7c941bbSAndroid Build Coastguard WorkerX        /* for boolean and enumeration types in Ada, Pascal */
779*b7c941bbSAndroid Build Coastguard WorkerX
780*b7c941bbSAndroid Build Coastguard WorkerX/* General definitions: */
781*b7c941bbSAndroid Build Coastguard WorkerX
782*b7c941bbSAndroid Build Coastguard WorkerX#include <stdio.h>
783*b7c941bbSAndroid Build Coastguard WorkerX                /* for strcpy, strcmp */
784*b7c941bbSAndroid Build Coastguard WorkerX
785*b7c941bbSAndroid Build Coastguard WorkerX#define Null 0
786*b7c941bbSAndroid Build Coastguard WorkerX                /* Value of a Null pointer */
787*b7c941bbSAndroid Build Coastguard WorkerX#define true  1
788*b7c941bbSAndroid Build Coastguard WorkerX#define false 0
789*b7c941bbSAndroid Build Coastguard WorkerX
790*b7c941bbSAndroid Build Coastguard WorkerXtypedef int     One_Thirty;
791*b7c941bbSAndroid Build Coastguard WorkerXtypedef int     One_Fifty;
792*b7c941bbSAndroid Build Coastguard WorkerXtypedef char    Capital_Letter;
793*b7c941bbSAndroid Build Coastguard WorkerXtypedef int     Boolean;
794*b7c941bbSAndroid Build Coastguard WorkerXtypedef char    Str_30 [31];
795*b7c941bbSAndroid Build Coastguard WorkerXtypedef int     Arr_1_Dim [50];
796*b7c941bbSAndroid Build Coastguard WorkerXtypedef int     Arr_2_Dim [50] [50];
797*b7c941bbSAndroid Build Coastguard WorkerX
798*b7c941bbSAndroid Build Coastguard WorkerXtypedef struct record
799*b7c941bbSAndroid Build Coastguard WorkerX    {
800*b7c941bbSAndroid Build Coastguard WorkerX    struct record *Ptr_Comp;
801*b7c941bbSAndroid Build Coastguard WorkerX    Enumeration    Discr;
802*b7c941bbSAndroid Build Coastguard WorkerX    union {
803*b7c941bbSAndroid Build Coastguard WorkerX          struct {
804*b7c941bbSAndroid Build Coastguard WorkerX                  Enumeration Enum_Comp;
805*b7c941bbSAndroid Build Coastguard WorkerX                  int         Int_Comp;
806*b7c941bbSAndroid Build Coastguard WorkerX                  char        Str_Comp [31];
807*b7c941bbSAndroid Build Coastguard WorkerX                  } var_1;
808*b7c941bbSAndroid Build Coastguard WorkerX          struct {
809*b7c941bbSAndroid Build Coastguard WorkerX                  Enumeration E_Comp_2;
810*b7c941bbSAndroid Build Coastguard WorkerX                  char        Str_2_Comp [31];
811*b7c941bbSAndroid Build Coastguard WorkerX                  } var_2;
812*b7c941bbSAndroid Build Coastguard WorkerX          struct {
813*b7c941bbSAndroid Build Coastguard WorkerX                  char        Ch_1_Comp;
814*b7c941bbSAndroid Build Coastguard WorkerX                  char        Ch_2_Comp;
815*b7c941bbSAndroid Build Coastguard WorkerX                  } var_3;
816*b7c941bbSAndroid Build Coastguard WorkerX          } variant;
817*b7c941bbSAndroid Build Coastguard WorkerX      } Rec_Type, *Rec_Pointer;
818*b7c941bbSAndroid Build Coastguard WorkerX
819*b7c941bbSAndroid Build Coastguard WorkerX
820*b7c941bbSAndroid Build Coastguard WorkerSHAR_EOF
821*b7c941bbSAndroid Build Coastguard Workerfi
822*b7c941bbSAndroid Build Coastguard Workerif test -f 'dhry_1.c'
823*b7c941bbSAndroid Build Coastguard Workerthen
824*b7c941bbSAndroid Build Coastguard Worker        echo shar: "will not over-write existing file 'dhry_1.c'"
825*b7c941bbSAndroid Build Coastguard Workerelse
826*b7c941bbSAndroid Build Coastguard Workersed 's/^X//' << \SHAR_EOF > 'dhry_1.c'
827*b7c941bbSAndroid Build Coastguard WorkerX/*
828*b7c941bbSAndroid Build Coastguard WorkerX ****************************************************************************
829*b7c941bbSAndroid Build Coastguard WorkerX *
830*b7c941bbSAndroid Build Coastguard WorkerX *                   "DHRYSTONE" Benchmark Program
831*b7c941bbSAndroid Build Coastguard WorkerX *                   -----------------------------
832*b7c941bbSAndroid Build Coastguard WorkerX *
833*b7c941bbSAndroid Build Coastguard WorkerX *  Version:    C, Version 2.1
834*b7c941bbSAndroid Build Coastguard WorkerX *
835*b7c941bbSAndroid Build Coastguard WorkerX *  File:       dhry_1.c (part 2 of 3)
836*b7c941bbSAndroid Build Coastguard WorkerX *
837*b7c941bbSAndroid Build Coastguard WorkerX *  Date:       May 17, 1988
838*b7c941bbSAndroid Build Coastguard WorkerX *
839*b7c941bbSAndroid Build Coastguard WorkerX *  Author:     Reinhold P. Weicker
840*b7c941bbSAndroid Build Coastguard WorkerX *
841*b7c941bbSAndroid Build Coastguard WorkerX ****************************************************************************
842*b7c941bbSAndroid Build Coastguard WorkerX */
843*b7c941bbSAndroid Build Coastguard WorkerX
844*b7c941bbSAndroid Build Coastguard WorkerX#include "dhry.h"
845*b7c941bbSAndroid Build Coastguard WorkerX
846*b7c941bbSAndroid Build Coastguard WorkerX/* Global Variables: */
847*b7c941bbSAndroid Build Coastguard WorkerX
848*b7c941bbSAndroid Build Coastguard WorkerXRec_Pointer     Ptr_Glob,
849*b7c941bbSAndroid Build Coastguard WorkerX                Next_Ptr_Glob;
850*b7c941bbSAndroid Build Coastguard WorkerXint             Int_Glob;
851*b7c941bbSAndroid Build Coastguard WorkerXBoolean         Bool_Glob;
852*b7c941bbSAndroid Build Coastguard WorkerXchar            Ch_1_Glob,
853*b7c941bbSAndroid Build Coastguard WorkerX                Ch_2_Glob;
854*b7c941bbSAndroid Build Coastguard WorkerXint             Arr_1_Glob [50];
855*b7c941bbSAndroid Build Coastguard WorkerXint             Arr_2_Glob [50] [50];
856*b7c941bbSAndroid Build Coastguard WorkerX
857*b7c941bbSAndroid Build Coastguard WorkerXextern char     *malloc ();
858*b7c941bbSAndroid Build Coastguard WorkerXEnumeration     Func_1 ();
859*b7c941bbSAndroid Build Coastguard WorkerX  /* forward declaration necessary since Enumeration may not simply be int */
860*b7c941bbSAndroid Build Coastguard WorkerX
861*b7c941bbSAndroid Build Coastguard WorkerX#ifndef REG
862*b7c941bbSAndroid Build Coastguard WorkerX        Boolean Reg = false;
863*b7c941bbSAndroid Build Coastguard WorkerX#define REG
864*b7c941bbSAndroid Build Coastguard WorkerX        /* REG becomes defined as empty */
865*b7c941bbSAndroid Build Coastguard WorkerX        /* i.e. no register variables   */
866*b7c941bbSAndroid Build Coastguard WorkerX#else
867*b7c941bbSAndroid Build Coastguard WorkerX        Boolean Reg = true;
868*b7c941bbSAndroid Build Coastguard WorkerX#endif
869*b7c941bbSAndroid Build Coastguard WorkerX
870*b7c941bbSAndroid Build Coastguard WorkerX/* variables for time measurement: */
871*b7c941bbSAndroid Build Coastguard WorkerX
872*b7c941bbSAndroid Build Coastguard WorkerX#ifdef TIMES
873*b7c941bbSAndroid Build Coastguard WorkerXstruct tms      time_info;
874*b7c941bbSAndroid Build Coastguard WorkerXextern  int     times ();
875*b7c941bbSAndroid Build Coastguard WorkerX                /* see library function "times" */
876*b7c941bbSAndroid Build Coastguard WorkerX#define Too_Small_Time (2*HZ)
877*b7c941bbSAndroid Build Coastguard WorkerX                /* Measurements should last at least about 2 seconds */
878*b7c941bbSAndroid Build Coastguard WorkerX#endif
879*b7c941bbSAndroid Build Coastguard WorkerX#ifdef TIME
880*b7c941bbSAndroid Build Coastguard WorkerXextern long     time();
881*b7c941bbSAndroid Build Coastguard WorkerX                /* see library function "time"  */
882*b7c941bbSAndroid Build Coastguard WorkerX#define Too_Small_Time 2
883*b7c941bbSAndroid Build Coastguard WorkerX                /* Measurements should last at least 2 seconds */
884*b7c941bbSAndroid Build Coastguard WorkerX#endif
885*b7c941bbSAndroid Build Coastguard WorkerX#ifdef MSC_CLOCK
886*b7c941bbSAndroid Build Coastguard WorkerXextern clock_t        clock();
887*b7c941bbSAndroid Build Coastguard WorkerX#define Too_Small_Time (2*HZ)
888*b7c941bbSAndroid Build Coastguard WorkerX#endif
889*b7c941bbSAndroid Build Coastguard WorkerX
890*b7c941bbSAndroid Build Coastguard WorkerXlong            Begin_Time,
891*b7c941bbSAndroid Build Coastguard WorkerX                End_Time,
892*b7c941bbSAndroid Build Coastguard WorkerX                User_Time;
893*b7c941bbSAndroid Build Coastguard WorkerXfloat           Microseconds,
894*b7c941bbSAndroid Build Coastguard WorkerX                Dhrystones_Per_Second;
895*b7c941bbSAndroid Build Coastguard WorkerX
896*b7c941bbSAndroid Build Coastguard WorkerX/* end of variables for time measurement */
897*b7c941bbSAndroid Build Coastguard WorkerX
898*b7c941bbSAndroid Build Coastguard WorkerX
899*b7c941bbSAndroid Build Coastguard WorkerXmain ()
900*b7c941bbSAndroid Build Coastguard WorkerX/*****/
901*b7c941bbSAndroid Build Coastguard WorkerX
902*b7c941bbSAndroid Build Coastguard WorkerX  /* main program, corresponds to procedures        */
903*b7c941bbSAndroid Build Coastguard WorkerX  /* Main and Proc_0 in the Ada version             */
904*b7c941bbSAndroid Build Coastguard WorkerX{
905*b7c941bbSAndroid Build Coastguard WorkerX        One_Fifty       Int_1_Loc;
906*b7c941bbSAndroid Build Coastguard WorkerX  REG   One_Fifty       Int_2_Loc;
907*b7c941bbSAndroid Build Coastguard WorkerX        One_Fifty       Int_3_Loc;
908*b7c941bbSAndroid Build Coastguard WorkerX  REG   char            Ch_Index;
909*b7c941bbSAndroid Build Coastguard WorkerX        Enumeration     Enum_Loc;
910*b7c941bbSAndroid Build Coastguard WorkerX        Str_30          Str_1_Loc;
911*b7c941bbSAndroid Build Coastguard WorkerX        Str_30          Str_2_Loc;
912*b7c941bbSAndroid Build Coastguard WorkerX  REG   int             Run_Index;
913*b7c941bbSAndroid Build Coastguard WorkerX  REG   int             Number_Of_Runs;
914*b7c941bbSAndroid Build Coastguard WorkerX
915*b7c941bbSAndroid Build Coastguard WorkerX  /* Initializations */
916*b7c941bbSAndroid Build Coastguard WorkerX
917*b7c941bbSAndroid Build Coastguard WorkerX  Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
918*b7c941bbSAndroid Build Coastguard WorkerX  Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
919*b7c941bbSAndroid Build Coastguard WorkerX
920*b7c941bbSAndroid Build Coastguard WorkerX  Ptr_Glob->Ptr_Comp                    = Next_Ptr_Glob;
921*b7c941bbSAndroid Build Coastguard WorkerX  Ptr_Glob->Discr                       = Ident_1;
922*b7c941bbSAndroid Build Coastguard WorkerX  Ptr_Glob->variant.var_1.Enum_Comp     = Ident_3;
923*b7c941bbSAndroid Build Coastguard WorkerX  Ptr_Glob->variant.var_1.Int_Comp      = 40;
924*b7c941bbSAndroid Build Coastguard WorkerX  strcpy (Ptr_Glob->variant.var_1.Str_Comp,
925*b7c941bbSAndroid Build Coastguard WorkerX          "DHRYSTONE PROGRAM, SOME STRING");
926*b7c941bbSAndroid Build Coastguard WorkerX  strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING");
927*b7c941bbSAndroid Build Coastguard WorkerX
928*b7c941bbSAndroid Build Coastguard WorkerX  Arr_2_Glob [8][7] = 10;
929*b7c941bbSAndroid Build Coastguard WorkerX        /* Was missing in published program. Without this statement,    */
930*b7c941bbSAndroid Build Coastguard WorkerX        /* Arr_2_Glob [8][7] would have an undefined value.             */
931*b7c941bbSAndroid Build Coastguard WorkerX        /* Warning: With 16-Bit processors and Number_Of_Runs > 32000,  */
932*b7c941bbSAndroid Build Coastguard WorkerX        /* overflow may occur for this array element.                   */
933*b7c941bbSAndroid Build Coastguard WorkerX
934*b7c941bbSAndroid Build Coastguard WorkerX  printf ("\n");
935*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n");
936*b7c941bbSAndroid Build Coastguard WorkerX  printf ("\n");
937*b7c941bbSAndroid Build Coastguard WorkerX  if (Reg)
938*b7c941bbSAndroid Build Coastguard WorkerX  {
939*b7c941bbSAndroid Build Coastguard WorkerX    printf ("Program compiled with 'register' attribute\n");
940*b7c941bbSAndroid Build Coastguard WorkerX    printf ("\n");
941*b7c941bbSAndroid Build Coastguard WorkerX  }
942*b7c941bbSAndroid Build Coastguard WorkerX  else
943*b7c941bbSAndroid Build Coastguard WorkerX  {
944*b7c941bbSAndroid Build Coastguard WorkerX    printf ("Program compiled without 'register' attribute\n");
945*b7c941bbSAndroid Build Coastguard WorkerX    printf ("\n");
946*b7c941bbSAndroid Build Coastguard WorkerX  }
947*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Please give the number of runs through the benchmark: ");
948*b7c941bbSAndroid Build Coastguard WorkerX  {
949*b7c941bbSAndroid Build Coastguard WorkerX    int n;
950*b7c941bbSAndroid Build Coastguard WorkerX    scanf ("%d", &n);
951*b7c941bbSAndroid Build Coastguard WorkerX    Number_Of_Runs = n;
952*b7c941bbSAndroid Build Coastguard WorkerX  }
953*b7c941bbSAndroid Build Coastguard WorkerX  printf ("\n");
954*b7c941bbSAndroid Build Coastguard WorkerX
955*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs);
956*b7c941bbSAndroid Build Coastguard WorkerX
957*b7c941bbSAndroid Build Coastguard WorkerX  /***************/
958*b7c941bbSAndroid Build Coastguard WorkerX  /* Start timer */
959*b7c941bbSAndroid Build Coastguard WorkerX  /***************/
960*b7c941bbSAndroid Build Coastguard WorkerX
961*b7c941bbSAndroid Build Coastguard WorkerX#ifdef TIMES
962*b7c941bbSAndroid Build Coastguard WorkerX  times (&time_info);
963*b7c941bbSAndroid Build Coastguard WorkerX  Begin_Time = (long) time_info.tms_utime;
964*b7c941bbSAndroid Build Coastguard WorkerX#endif
965*b7c941bbSAndroid Build Coastguard WorkerX#ifdef TIME
966*b7c941bbSAndroid Build Coastguard WorkerX  Begin_Time = time ( (long *) 0);
967*b7c941bbSAndroid Build Coastguard WorkerX#endif
968*b7c941bbSAndroid Build Coastguard WorkerX#ifdef MSC_CLOCK
969*b7c941bbSAndroid Build Coastguard WorkerX  Begin_Time = clock();
970*b7c941bbSAndroid Build Coastguard WorkerX#endif
971*b7c941bbSAndroid Build Coastguard WorkerX
972*b7c941bbSAndroid Build Coastguard WorkerX  for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index)
973*b7c941bbSAndroid Build Coastguard WorkerX  {
974*b7c941bbSAndroid Build Coastguard WorkerX
975*b7c941bbSAndroid Build Coastguard WorkerX    Proc_5();
976*b7c941bbSAndroid Build Coastguard WorkerX    Proc_4();
977*b7c941bbSAndroid Build Coastguard WorkerX      /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */
978*b7c941bbSAndroid Build Coastguard WorkerX    Int_1_Loc = 2;
979*b7c941bbSAndroid Build Coastguard WorkerX    Int_2_Loc = 3;
980*b7c941bbSAndroid Build Coastguard WorkerX    strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING");
981*b7c941bbSAndroid Build Coastguard WorkerX    Enum_Loc = Ident_2;
982*b7c941bbSAndroid Build Coastguard WorkerX    Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc);
983*b7c941bbSAndroid Build Coastguard WorkerX      /* Bool_Glob == 1 */
984*b7c941bbSAndroid Build Coastguard WorkerX    while (Int_1_Loc < Int_2_Loc)  /* loop body executed once */
985*b7c941bbSAndroid Build Coastguard WorkerX    {
986*b7c941bbSAndroid Build Coastguard WorkerX      Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc;
987*b7c941bbSAndroid Build Coastguard WorkerX        /* Int_3_Loc == 7 */
988*b7c941bbSAndroid Build Coastguard WorkerX      Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc);
989*b7c941bbSAndroid Build Coastguard WorkerX        /* Int_3_Loc == 7 */
990*b7c941bbSAndroid Build Coastguard WorkerX      Int_1_Loc += 1;
991*b7c941bbSAndroid Build Coastguard WorkerX    } /* while */
992*b7c941bbSAndroid Build Coastguard WorkerX      /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
993*b7c941bbSAndroid Build Coastguard WorkerX    Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc);
994*b7c941bbSAndroid Build Coastguard WorkerX      /* Int_Glob == 5 */
995*b7c941bbSAndroid Build Coastguard WorkerX    Proc_1 (Ptr_Glob);
996*b7c941bbSAndroid Build Coastguard WorkerX    for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index)
997*b7c941bbSAndroid Build Coastguard WorkerX                             /* loop body executed twice */
998*b7c941bbSAndroid Build Coastguard WorkerX    {
999*b7c941bbSAndroid Build Coastguard WorkerX      if (Enum_Loc == Func_1 (Ch_Index, 'C'))
1000*b7c941bbSAndroid Build Coastguard WorkerX          /* then, not executed */
1001*b7c941bbSAndroid Build Coastguard WorkerX        {
1002*b7c941bbSAndroid Build Coastguard WorkerX        Proc_6 (Ident_1, &Enum_Loc);
1003*b7c941bbSAndroid Build Coastguard WorkerX        strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING");
1004*b7c941bbSAndroid Build Coastguard WorkerX        Int_2_Loc = Run_Index;
1005*b7c941bbSAndroid Build Coastguard WorkerX        Int_Glob = Run_Index;
1006*b7c941bbSAndroid Build Coastguard WorkerX        }
1007*b7c941bbSAndroid Build Coastguard WorkerX    }
1008*b7c941bbSAndroid Build Coastguard WorkerX      /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
1009*b7c941bbSAndroid Build Coastguard WorkerX    Int_2_Loc = Int_2_Loc * Int_1_Loc;
1010*b7c941bbSAndroid Build Coastguard WorkerX    Int_1_Loc = Int_2_Loc / Int_3_Loc;
1011*b7c941bbSAndroid Build Coastguard WorkerX    Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc;
1012*b7c941bbSAndroid Build Coastguard WorkerX      /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */
1013*b7c941bbSAndroid Build Coastguard WorkerX    Proc_2 (&Int_1_Loc);
1014*b7c941bbSAndroid Build Coastguard WorkerX      /* Int_1_Loc == 5 */
1015*b7c941bbSAndroid Build Coastguard WorkerX
1016*b7c941bbSAndroid Build Coastguard WorkerX  } /* loop "for Run_Index" */
1017*b7c941bbSAndroid Build Coastguard WorkerX
1018*b7c941bbSAndroid Build Coastguard WorkerX  /**************/
1019*b7c941bbSAndroid Build Coastguard WorkerX  /* Stop timer */
1020*b7c941bbSAndroid Build Coastguard WorkerX  /**************/
1021*b7c941bbSAndroid Build Coastguard WorkerX
1022*b7c941bbSAndroid Build Coastguard WorkerX#ifdef TIMES
1023*b7c941bbSAndroid Build Coastguard WorkerX  times (&time_info);
1024*b7c941bbSAndroid Build Coastguard WorkerX  End_Time = (long) time_info.tms_utime;
1025*b7c941bbSAndroid Build Coastguard WorkerX#endif
1026*b7c941bbSAndroid Build Coastguard WorkerX#ifdef TIME
1027*b7c941bbSAndroid Build Coastguard WorkerX  End_Time = time ( (long *) 0);
1028*b7c941bbSAndroid Build Coastguard WorkerX#endif
1029*b7c941bbSAndroid Build Coastguard WorkerX#ifdef MSC_CLOCK
1030*b7c941bbSAndroid Build Coastguard WorkerX  End_Time = clock();
1031*b7c941bbSAndroid Build Coastguard WorkerX#endif
1032*b7c941bbSAndroid Build Coastguard WorkerX
1033*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Execution ends\n");
1034*b7c941bbSAndroid Build Coastguard WorkerX  printf ("\n");
1035*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Final values of the variables used in the benchmark:\n");
1036*b7c941bbSAndroid Build Coastguard WorkerX  printf ("\n");
1037*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Int_Glob:            %d\n", Int_Glob);
1038*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 5);
1039*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Bool_Glob:           %d\n", Bool_Glob);
1040*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 1);
1041*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Ch_1_Glob:           %c\n", Ch_1_Glob);
1042*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %c\n", 'A');
1043*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Ch_2_Glob:           %c\n", Ch_2_Glob);
1044*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %c\n", 'B');
1045*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Arr_1_Glob[8]:       %d\n", Arr_1_Glob[8]);
1046*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 7);
1047*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Arr_2_Glob[8][7]:    %d\n", Arr_2_Glob[8][7]);
1048*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   Number_Of_Runs + 10\n");
1049*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Ptr_Glob->\n");
1050*b7c941bbSAndroid Build Coastguard WorkerX  printf ("  Ptr_Comp:          %d\n", (int) Ptr_Glob->Ptr_Comp);
1051*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   (implementation-dependent)\n");
1052*b7c941bbSAndroid Build Coastguard WorkerX  printf ("  Discr:             %d\n", Ptr_Glob->Discr);
1053*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 0);
1054*b7c941bbSAndroid Build Coastguard WorkerX  printf ("  Enum_Comp:         %d\n", Ptr_Glob->variant.var_1.Enum_Comp);
1055*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 2);
1056*b7c941bbSAndroid Build Coastguard WorkerX  printf ("  Int_Comp:          %d\n", Ptr_Glob->variant.var_1.Int_Comp);
1057*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 17);
1058*b7c941bbSAndroid Build Coastguard WorkerX  printf ("  Str_Comp:          %s\n", Ptr_Glob->variant.var_1.Str_Comp);
1059*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   DHRYSTONE PROGRAM, SOME STRING\n");
1060*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Next_Ptr_Glob->\n");
1061*b7c941bbSAndroid Build Coastguard WorkerX  printf ("  Ptr_Comp:          %d\n", (int) Next_Ptr_Glob->Ptr_Comp);
1062*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   (implementation-dependent), same as above\n");
1063*b7c941bbSAndroid Build Coastguard WorkerX  printf ("  Discr:             %d\n", Next_Ptr_Glob->Discr);
1064*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 0);
1065*b7c941bbSAndroid Build Coastguard WorkerX  printf ("  Enum_Comp:         %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp);
1066*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 1);
1067*b7c941bbSAndroid Build Coastguard WorkerX  printf ("  Int_Comp:          %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp);
1068*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 18);
1069*b7c941bbSAndroid Build Coastguard WorkerX  printf ("  Str_Comp:          %s\n",
1070*b7c941bbSAndroid Build Coastguard WorkerX                                Next_Ptr_Glob->variant.var_1.Str_Comp);
1071*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   DHRYSTONE PROGRAM, SOME STRING\n");
1072*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Int_1_Loc:           %d\n", Int_1_Loc);
1073*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 5);
1074*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Int_2_Loc:           %d\n", Int_2_Loc);
1075*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 13);
1076*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Int_3_Loc:           %d\n", Int_3_Loc);
1077*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 7);
1078*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Enum_Loc:            %d\n", Enum_Loc);
1079*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   %d\n", 1);
1080*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Str_1_Loc:           %s\n", Str_1_Loc);
1081*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   DHRYSTONE PROGRAM, 1'ST STRING\n");
1082*b7c941bbSAndroid Build Coastguard WorkerX  printf ("Str_2_Loc:           %s\n", Str_2_Loc);
1083*b7c941bbSAndroid Build Coastguard WorkerX  printf ("        should be:   DHRYSTONE PROGRAM, 2'ND STRING\n");
1084*b7c941bbSAndroid Build Coastguard WorkerX  printf ("\n");
1085*b7c941bbSAndroid Build Coastguard WorkerX
1086*b7c941bbSAndroid Build Coastguard WorkerX  User_Time = End_Time - Begin_Time;
1087*b7c941bbSAndroid Build Coastguard WorkerX
1088*b7c941bbSAndroid Build Coastguard WorkerX  if (User_Time < Too_Small_Time)
1089*b7c941bbSAndroid Build Coastguard WorkerX  {
1090*b7c941bbSAndroid Build Coastguard WorkerX    printf ("Measured time too small to obtain meaningful results\n");
1091*b7c941bbSAndroid Build Coastguard WorkerX    printf ("Please increase number of runs\n");
1092*b7c941bbSAndroid Build Coastguard WorkerX    printf ("\n");
1093*b7c941bbSAndroid Build Coastguard WorkerX  }
1094*b7c941bbSAndroid Build Coastguard WorkerX  else
1095*b7c941bbSAndroid Build Coastguard WorkerX  {
1096*b7c941bbSAndroid Build Coastguard WorkerX#ifdef TIME
1097*b7c941bbSAndroid Build Coastguard WorkerX    Microseconds = (float) User_Time * Mic_secs_Per_Second
1098*b7c941bbSAndroid Build Coastguard WorkerX                        / (float) Number_Of_Runs;
1099*b7c941bbSAndroid Build Coastguard WorkerX    Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time;
1100*b7c941bbSAndroid Build Coastguard WorkerX#else
1101*b7c941bbSAndroid Build Coastguard WorkerX    Microseconds = (float) User_Time * Mic_secs_Per_Second
1102*b7c941bbSAndroid Build Coastguard WorkerX                        / ((float) HZ * ((float) Number_Of_Runs));
1103*b7c941bbSAndroid Build Coastguard WorkerX    Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs)
1104*b7c941bbSAndroid Build Coastguard WorkerX                        / (float) User_Time;
1105*b7c941bbSAndroid Build Coastguard WorkerX#endif
1106*b7c941bbSAndroid Build Coastguard WorkerX    printf ("Microseconds for one run through Dhrystone: ");
1107*b7c941bbSAndroid Build Coastguard WorkerX    printf ("%6.1f \n", Microseconds);
1108*b7c941bbSAndroid Build Coastguard WorkerX    printf ("Dhrystones per Second:                      ");
1109*b7c941bbSAndroid Build Coastguard WorkerX    printf ("%6.1f \n", Dhrystones_Per_Second);
1110*b7c941bbSAndroid Build Coastguard WorkerX    printf ("\n");
1111*b7c941bbSAndroid Build Coastguard WorkerX  }
1112*b7c941bbSAndroid Build Coastguard WorkerX
1113*b7c941bbSAndroid Build Coastguard WorkerX}
1114*b7c941bbSAndroid Build Coastguard WorkerX
1115*b7c941bbSAndroid Build Coastguard WorkerX
1116*b7c941bbSAndroid Build Coastguard WorkerXProc_1 (Ptr_Val_Par)
1117*b7c941bbSAndroid Build Coastguard WorkerX/******************/
1118*b7c941bbSAndroid Build Coastguard WorkerX
1119*b7c941bbSAndroid Build Coastguard WorkerXREG Rec_Pointer Ptr_Val_Par;
1120*b7c941bbSAndroid Build Coastguard WorkerX    /* executed once */
1121*b7c941bbSAndroid Build Coastguard WorkerX{
1122*b7c941bbSAndroid Build Coastguard WorkerX  REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp;
1123*b7c941bbSAndroid Build Coastguard WorkerX                                        /* == Ptr_Glob_Next */
1124*b7c941bbSAndroid Build Coastguard WorkerX  /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp,    */
1125*b7c941bbSAndroid Build Coastguard WorkerX  /* corresponds to "rename" in Ada, "with" in Pascal           */
1126*b7c941bbSAndroid Build Coastguard WorkerX
1127*b7c941bbSAndroid Build Coastguard WorkerX  structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob);
1128*b7c941bbSAndroid Build Coastguard WorkerX  Ptr_Val_Par->variant.var_1.Int_Comp = 5;
1129*b7c941bbSAndroid Build Coastguard WorkerX  Next_Record->variant.var_1.Int_Comp
1130*b7c941bbSAndroid Build Coastguard WorkerX        = Ptr_Val_Par->variant.var_1.Int_Comp;
1131*b7c941bbSAndroid Build Coastguard WorkerX  Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp;
1132*b7c941bbSAndroid Build Coastguard WorkerX  Proc_3 (&Next_Record->Ptr_Comp);
1133*b7c941bbSAndroid Build Coastguard WorkerX    /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp
1134*b7c941bbSAndroid Build Coastguard WorkerX                        == Ptr_Glob->Ptr_Comp */
1135*b7c941bbSAndroid Build Coastguard WorkerX  if (Next_Record->Discr == Ident_1)
1136*b7c941bbSAndroid Build Coastguard WorkerX    /* then, executed */
1137*b7c941bbSAndroid Build Coastguard WorkerX  {
1138*b7c941bbSAndroid Build Coastguard WorkerX    Next_Record->variant.var_1.Int_Comp = 6;
1139*b7c941bbSAndroid Build Coastguard WorkerX    Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp,
1140*b7c941bbSAndroid Build Coastguard WorkerX           &Next_Record->variant.var_1.Enum_Comp);
1141*b7c941bbSAndroid Build Coastguard WorkerX    Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp;
1142*b7c941bbSAndroid Build Coastguard WorkerX    Proc_7 (Next_Record->variant.var_1.Int_Comp, 10,
1143*b7c941bbSAndroid Build Coastguard WorkerX           &Next_Record->variant.var_1.Int_Comp);
1144*b7c941bbSAndroid Build Coastguard WorkerX  }
1145*b7c941bbSAndroid Build Coastguard WorkerX  else /* not executed */
1146*b7c941bbSAndroid Build Coastguard WorkerX    structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp);
1147*b7c941bbSAndroid Build Coastguard WorkerX} /* Proc_1 */
1148*b7c941bbSAndroid Build Coastguard WorkerX
1149*b7c941bbSAndroid Build Coastguard WorkerX
1150*b7c941bbSAndroid Build Coastguard WorkerXProc_2 (Int_Par_Ref)
1151*b7c941bbSAndroid Build Coastguard WorkerX/******************/
1152*b7c941bbSAndroid Build Coastguard WorkerX    /* executed once */
1153*b7c941bbSAndroid Build Coastguard WorkerX    /* *Int_Par_Ref == 1, becomes 4 */
1154*b7c941bbSAndroid Build Coastguard WorkerX
1155*b7c941bbSAndroid Build Coastguard WorkerXOne_Fifty   *Int_Par_Ref;
1156*b7c941bbSAndroid Build Coastguard WorkerX{
1157*b7c941bbSAndroid Build Coastguard WorkerX  One_Fifty  Int_Loc;
1158*b7c941bbSAndroid Build Coastguard WorkerX  Enumeration   Enum_Loc;
1159*b7c941bbSAndroid Build Coastguard WorkerX
1160*b7c941bbSAndroid Build Coastguard WorkerX  Int_Loc = *Int_Par_Ref + 10;
1161*b7c941bbSAndroid Build Coastguard WorkerX  do /* executed once */
1162*b7c941bbSAndroid Build Coastguard WorkerX    if (Ch_1_Glob == 'A')
1163*b7c941bbSAndroid Build Coastguard WorkerX      /* then, executed */
1164*b7c941bbSAndroid Build Coastguard WorkerX    {
1165*b7c941bbSAndroid Build Coastguard WorkerX      Int_Loc -= 1;
1166*b7c941bbSAndroid Build Coastguard WorkerX      *Int_Par_Ref = Int_Loc - Int_Glob;
1167*b7c941bbSAndroid Build Coastguard WorkerX      Enum_Loc = Ident_1;
1168*b7c941bbSAndroid Build Coastguard WorkerX    } /* if */
1169*b7c941bbSAndroid Build Coastguard WorkerX  while (Enum_Loc != Ident_1); /* true */
1170*b7c941bbSAndroid Build Coastguard WorkerX} /* Proc_2 */
1171*b7c941bbSAndroid Build Coastguard WorkerX
1172*b7c941bbSAndroid Build Coastguard WorkerX
1173*b7c941bbSAndroid Build Coastguard WorkerXProc_3 (Ptr_Ref_Par)
1174*b7c941bbSAndroid Build Coastguard WorkerX/******************/
1175*b7c941bbSAndroid Build Coastguard WorkerX    /* executed once */
1176*b7c941bbSAndroid Build Coastguard WorkerX    /* Ptr_Ref_Par becomes Ptr_Glob */
1177*b7c941bbSAndroid Build Coastguard WorkerX
1178*b7c941bbSAndroid Build Coastguard WorkerXRec_Pointer *Ptr_Ref_Par;
1179*b7c941bbSAndroid Build Coastguard WorkerX
1180*b7c941bbSAndroid Build Coastguard WorkerX{
1181*b7c941bbSAndroid Build Coastguard WorkerX  if (Ptr_Glob != Null)
1182*b7c941bbSAndroid Build Coastguard WorkerX    /* then, executed */
1183*b7c941bbSAndroid Build Coastguard WorkerX    *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp;
1184*b7c941bbSAndroid Build Coastguard WorkerX  Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp);
1185*b7c941bbSAndroid Build Coastguard WorkerX} /* Proc_3 */
1186*b7c941bbSAndroid Build Coastguard WorkerX
1187*b7c941bbSAndroid Build Coastguard WorkerX
1188*b7c941bbSAndroid Build Coastguard WorkerXProc_4 () /* without parameters */
1189*b7c941bbSAndroid Build Coastguard WorkerX/*******/
1190*b7c941bbSAndroid Build Coastguard WorkerX    /* executed once */
1191*b7c941bbSAndroid Build Coastguard WorkerX{
1192*b7c941bbSAndroid Build Coastguard WorkerX  Boolean Bool_Loc;
1193*b7c941bbSAndroid Build Coastguard WorkerX
1194*b7c941bbSAndroid Build Coastguard WorkerX  Bool_Loc = Ch_1_Glob == 'A';
1195*b7c941bbSAndroid Build Coastguard WorkerX  Bool_Glob = Bool_Loc | Bool_Glob;
1196*b7c941bbSAndroid Build Coastguard WorkerX  Ch_2_Glob = 'B';
1197*b7c941bbSAndroid Build Coastguard WorkerX} /* Proc_4 */
1198*b7c941bbSAndroid Build Coastguard WorkerX
1199*b7c941bbSAndroid Build Coastguard WorkerX
1200*b7c941bbSAndroid Build Coastguard WorkerXProc_5 () /* without parameters */
1201*b7c941bbSAndroid Build Coastguard WorkerX/*******/
1202*b7c941bbSAndroid Build Coastguard WorkerX    /* executed once */
1203*b7c941bbSAndroid Build Coastguard WorkerX{
1204*b7c941bbSAndroid Build Coastguard WorkerX  Ch_1_Glob = 'A';
1205*b7c941bbSAndroid Build Coastguard WorkerX  Bool_Glob = false;
1206*b7c941bbSAndroid Build Coastguard WorkerX} /* Proc_5 */
1207*b7c941bbSAndroid Build Coastguard WorkerX
1208*b7c941bbSAndroid Build Coastguard WorkerX
1209*b7c941bbSAndroid Build Coastguard WorkerX        /* Procedure for the assignment of structures,          */
1210*b7c941bbSAndroid Build Coastguard WorkerX        /* if the C compiler doesn't support this feature       */
1211*b7c941bbSAndroid Build Coastguard WorkerX#ifdef  NOSTRUCTASSIGN
1212*b7c941bbSAndroid Build Coastguard WorkerXmemcpy (d, s, l)
1213*b7c941bbSAndroid Build Coastguard WorkerXregister char   *d;
1214*b7c941bbSAndroid Build Coastguard WorkerXregister char   *s;
1215*b7c941bbSAndroid Build Coastguard WorkerXregister int    l;
1216*b7c941bbSAndroid Build Coastguard WorkerX{
1217*b7c941bbSAndroid Build Coastguard WorkerX        while (l--) *d++ = *s++;
1218*b7c941bbSAndroid Build Coastguard WorkerX}
1219*b7c941bbSAndroid Build Coastguard WorkerX#endif
1220*b7c941bbSAndroid Build Coastguard WorkerX
1221*b7c941bbSAndroid Build Coastguard WorkerX
1222*b7c941bbSAndroid Build Coastguard WorkerSHAR_EOF
1223*b7c941bbSAndroid Build Coastguard Workerfi
1224*b7c941bbSAndroid Build Coastguard Workerif test -f 'dhry_2.c'
1225*b7c941bbSAndroid Build Coastguard Workerthen
1226*b7c941bbSAndroid Build Coastguard Worker        echo shar: "will not over-write existing file 'dhry_2.c'"
1227*b7c941bbSAndroid Build Coastguard Workerelse
1228*b7c941bbSAndroid Build Coastguard Workersed 's/^X//' << \SHAR_EOF > 'dhry_2.c'
1229*b7c941bbSAndroid Build Coastguard WorkerX/*
1230*b7c941bbSAndroid Build Coastguard WorkerX ****************************************************************************
1231*b7c941bbSAndroid Build Coastguard WorkerX *
1232*b7c941bbSAndroid Build Coastguard WorkerX *                   "DHRYSTONE" Benchmark Program
1233*b7c941bbSAndroid Build Coastguard WorkerX *                   -----------------------------
1234*b7c941bbSAndroid Build Coastguard WorkerX *
1235*b7c941bbSAndroid Build Coastguard WorkerX *  Version:    C, Version 2.1
1236*b7c941bbSAndroid Build Coastguard WorkerX *
1237*b7c941bbSAndroid Build Coastguard WorkerX *  File:       dhry_2.c (part 3 of 3)
1238*b7c941bbSAndroid Build Coastguard WorkerX *
1239*b7c941bbSAndroid Build Coastguard WorkerX *  Date:       May 17, 1988
1240*b7c941bbSAndroid Build Coastguard WorkerX *
1241*b7c941bbSAndroid Build Coastguard WorkerX *  Author:     Reinhold P. Weicker
1242*b7c941bbSAndroid Build Coastguard WorkerX *
1243*b7c941bbSAndroid Build Coastguard WorkerX ****************************************************************************
1244*b7c941bbSAndroid Build Coastguard WorkerX */
1245*b7c941bbSAndroid Build Coastguard WorkerX
1246*b7c941bbSAndroid Build Coastguard WorkerX#include "dhry.h"
1247*b7c941bbSAndroid Build Coastguard WorkerX
1248*b7c941bbSAndroid Build Coastguard WorkerX#ifndef REG
1249*b7c941bbSAndroid Build Coastguard WorkerX#define REG
1250*b7c941bbSAndroid Build Coastguard WorkerX        /* REG becomes defined as empty */
1251*b7c941bbSAndroid Build Coastguard WorkerX        /* i.e. no register variables   */
1252*b7c941bbSAndroid Build Coastguard WorkerX#endif
1253*b7c941bbSAndroid Build Coastguard WorkerX
1254*b7c941bbSAndroid Build Coastguard WorkerXextern  int     Int_Glob;
1255*b7c941bbSAndroid Build Coastguard WorkerXextern  char    Ch_1_Glob;
1256*b7c941bbSAndroid Build Coastguard WorkerX
1257*b7c941bbSAndroid Build Coastguard WorkerX
1258*b7c941bbSAndroid Build Coastguard WorkerXProc_6 (Enum_Val_Par, Enum_Ref_Par)
1259*b7c941bbSAndroid Build Coastguard WorkerX/*********************************/
1260*b7c941bbSAndroid Build Coastguard WorkerX    /* executed once */
1261*b7c941bbSAndroid Build Coastguard WorkerX    /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */
1262*b7c941bbSAndroid Build Coastguard WorkerX
1263*b7c941bbSAndroid Build Coastguard WorkerXEnumeration  Enum_Val_Par;
1264*b7c941bbSAndroid Build Coastguard WorkerXEnumeration *Enum_Ref_Par;
1265*b7c941bbSAndroid Build Coastguard WorkerX{
1266*b7c941bbSAndroid Build Coastguard WorkerX  *Enum_Ref_Par = Enum_Val_Par;
1267*b7c941bbSAndroid Build Coastguard WorkerX  if (! Func_3 (Enum_Val_Par))
1268*b7c941bbSAndroid Build Coastguard WorkerX    /* then, not executed */
1269*b7c941bbSAndroid Build Coastguard WorkerX    *Enum_Ref_Par = Ident_4;
1270*b7c941bbSAndroid Build Coastguard WorkerX  switch (Enum_Val_Par)
1271*b7c941bbSAndroid Build Coastguard WorkerX  {
1272*b7c941bbSAndroid Build Coastguard WorkerX    case Ident_1:
1273*b7c941bbSAndroid Build Coastguard WorkerX      *Enum_Ref_Par = Ident_1;
1274*b7c941bbSAndroid Build Coastguard WorkerX      break;
1275*b7c941bbSAndroid Build Coastguard WorkerX    case Ident_2:
1276*b7c941bbSAndroid Build Coastguard WorkerX      if (Int_Glob > 100)
1277*b7c941bbSAndroid Build Coastguard WorkerX        /* then */
1278*b7c941bbSAndroid Build Coastguard WorkerX      *Enum_Ref_Par = Ident_1;
1279*b7c941bbSAndroid Build Coastguard WorkerX      else *Enum_Ref_Par = Ident_4;
1280*b7c941bbSAndroid Build Coastguard WorkerX      break;
1281*b7c941bbSAndroid Build Coastguard WorkerX    case Ident_3: /* executed */
1282*b7c941bbSAndroid Build Coastguard WorkerX      *Enum_Ref_Par = Ident_2;
1283*b7c941bbSAndroid Build Coastguard WorkerX      break;
1284*b7c941bbSAndroid Build Coastguard WorkerX    case Ident_4: break;
1285*b7c941bbSAndroid Build Coastguard WorkerX    case Ident_5:
1286*b7c941bbSAndroid Build Coastguard WorkerX      *Enum_Ref_Par = Ident_3;
1287*b7c941bbSAndroid Build Coastguard WorkerX      break;
1288*b7c941bbSAndroid Build Coastguard WorkerX  } /* switch */
1289*b7c941bbSAndroid Build Coastguard WorkerX} /* Proc_6 */
1290*b7c941bbSAndroid Build Coastguard WorkerX
1291*b7c941bbSAndroid Build Coastguard WorkerX
1292*b7c941bbSAndroid Build Coastguard WorkerXProc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref)
1293*b7c941bbSAndroid Build Coastguard WorkerX/**********************************************/
1294*b7c941bbSAndroid Build Coastguard WorkerX    /* executed three times                                      */
1295*b7c941bbSAndroid Build Coastguard WorkerX    /* first call:      Int_1_Par_Val == 2, Int_2_Par_Val == 3,  */
1296*b7c941bbSAndroid Build Coastguard WorkerX    /*                  Int_Par_Ref becomes 7                    */
1297*b7c941bbSAndroid Build Coastguard WorkerX    /* second call:     Int_1_Par_Val == 10, Int_2_Par_Val == 5, */
1298*b7c941bbSAndroid Build Coastguard WorkerX    /*                  Int_Par_Ref becomes 17                   */
1299*b7c941bbSAndroid Build Coastguard WorkerX    /* third call:      Int_1_Par_Val == 6, Int_2_Par_Val == 10, */
1300*b7c941bbSAndroid Build Coastguard WorkerX    /*                  Int_Par_Ref becomes 18                   */
1301*b7c941bbSAndroid Build Coastguard WorkerXOne_Fifty       Int_1_Par_Val;
1302*b7c941bbSAndroid Build Coastguard WorkerXOne_Fifty       Int_2_Par_Val;
1303*b7c941bbSAndroid Build Coastguard WorkerXOne_Fifty      *Int_Par_Ref;
1304*b7c941bbSAndroid Build Coastguard WorkerX{
1305*b7c941bbSAndroid Build Coastguard WorkerX  One_Fifty Int_Loc;
1306*b7c941bbSAndroid Build Coastguard WorkerX
1307*b7c941bbSAndroid Build Coastguard WorkerX  Int_Loc = Int_1_Par_Val + 2;
1308*b7c941bbSAndroid Build Coastguard WorkerX  *Int_Par_Ref = Int_2_Par_Val + Int_Loc;
1309*b7c941bbSAndroid Build Coastguard WorkerX} /* Proc_7 */
1310*b7c941bbSAndroid Build Coastguard WorkerX
1311*b7c941bbSAndroid Build Coastguard WorkerX
1312*b7c941bbSAndroid Build Coastguard WorkerXProc_8 (Arr_1_Par_Ref, Arr_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val)
1313*b7c941bbSAndroid Build Coastguard WorkerX/*********************************************************************/
1314*b7c941bbSAndroid Build Coastguard WorkerX    /* executed once      */
1315*b7c941bbSAndroid Build Coastguard WorkerX    /* Int_Par_Val_1 == 3 */
1316*b7c941bbSAndroid Build Coastguard WorkerX    /* Int_Par_Val_2 == 7 */
1317*b7c941bbSAndroid Build Coastguard WorkerXArr_1_Dim       Arr_1_Par_Ref;
1318*b7c941bbSAndroid Build Coastguard WorkerXArr_2_Dim       Arr_2_Par_Ref;
1319*b7c941bbSAndroid Build Coastguard WorkerXint             Int_1_Par_Val;
1320*b7c941bbSAndroid Build Coastguard WorkerXint             Int_2_Par_Val;
1321*b7c941bbSAndroid Build Coastguard WorkerX{
1322*b7c941bbSAndroid Build Coastguard WorkerX  REG One_Fifty Int_Index;
1323*b7c941bbSAndroid Build Coastguard WorkerX  REG One_Fifty Int_Loc;
1324*b7c941bbSAndroid Build Coastguard WorkerX
1325*b7c941bbSAndroid Build Coastguard WorkerX  Int_Loc = Int_1_Par_Val + 5;
1326*b7c941bbSAndroid Build Coastguard WorkerX  Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val;
1327*b7c941bbSAndroid Build Coastguard WorkerX  Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc];
1328*b7c941bbSAndroid Build Coastguard WorkerX  Arr_1_Par_Ref [Int_Loc+30] = Int_Loc;
1329*b7c941bbSAndroid Build Coastguard WorkerX  for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index)
1330*b7c941bbSAndroid Build Coastguard WorkerX    Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc;
1331*b7c941bbSAndroid Build Coastguard WorkerX  Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1;
1332*b7c941bbSAndroid Build Coastguard WorkerX  Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc];
1333*b7c941bbSAndroid Build Coastguard WorkerX  Int_Glob = 5;
1334*b7c941bbSAndroid Build Coastguard WorkerX} /* Proc_8 */
1335*b7c941bbSAndroid Build Coastguard WorkerX
1336*b7c941bbSAndroid Build Coastguard WorkerX
1337*b7c941bbSAndroid Build Coastguard WorkerXEnumeration Func_1 (Ch_1_Par_Val, Ch_2_Par_Val)
1338*b7c941bbSAndroid Build Coastguard WorkerX/*************************************************/
1339*b7c941bbSAndroid Build Coastguard WorkerX    /* executed three times                                         */
1340*b7c941bbSAndroid Build Coastguard WorkerX    /* first call:      Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R'    */
1341*b7c941bbSAndroid Build Coastguard WorkerX    /* second call:     Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C'    */
1342*b7c941bbSAndroid Build Coastguard WorkerX    /* third call:      Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C'    */
1343*b7c941bbSAndroid Build Coastguard WorkerX
1344*b7c941bbSAndroid Build Coastguard WorkerXCapital_Letter   Ch_1_Par_Val;
1345*b7c941bbSAndroid Build Coastguard WorkerXCapital_Letter   Ch_2_Par_Val;
1346*b7c941bbSAndroid Build Coastguard WorkerX{
1347*b7c941bbSAndroid Build Coastguard WorkerX  Capital_Letter        Ch_1_Loc;
1348*b7c941bbSAndroid Build Coastguard WorkerX  Capital_Letter        Ch_2_Loc;
1349*b7c941bbSAndroid Build Coastguard WorkerX
1350*b7c941bbSAndroid Build Coastguard WorkerX  Ch_1_Loc = Ch_1_Par_Val;
1351*b7c941bbSAndroid Build Coastguard WorkerX  Ch_2_Loc = Ch_1_Loc;
1352*b7c941bbSAndroid Build Coastguard WorkerX  if (Ch_2_Loc != Ch_2_Par_Val)
1353*b7c941bbSAndroid Build Coastguard WorkerX    /* then, executed */
1354*b7c941bbSAndroid Build Coastguard WorkerX    return (Ident_1);
1355*b7c941bbSAndroid Build Coastguard WorkerX  else  /* not executed */
1356*b7c941bbSAndroid Build Coastguard WorkerX  {
1357*b7c941bbSAndroid Build Coastguard WorkerX    Ch_1_Glob = Ch_1_Loc;
1358*b7c941bbSAndroid Build Coastguard WorkerX    return (Ident_2);
1359*b7c941bbSAndroid Build Coastguard WorkerX   }
1360*b7c941bbSAndroid Build Coastguard WorkerX} /* Func_1 */
1361*b7c941bbSAndroid Build Coastguard WorkerX
1362*b7c941bbSAndroid Build Coastguard WorkerX
1363*b7c941bbSAndroid Build Coastguard WorkerXBoolean Func_2 (Str_1_Par_Ref, Str_2_Par_Ref)
1364*b7c941bbSAndroid Build Coastguard WorkerX/*************************************************/
1365*b7c941bbSAndroid Build Coastguard WorkerX    /* executed once */
1366*b7c941bbSAndroid Build Coastguard WorkerX    /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */
1367*b7c941bbSAndroid Build Coastguard WorkerX    /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */
1368*b7c941bbSAndroid Build Coastguard WorkerX
1369*b7c941bbSAndroid Build Coastguard WorkerXStr_30  Str_1_Par_Ref;
1370*b7c941bbSAndroid Build Coastguard WorkerXStr_30  Str_2_Par_Ref;
1371*b7c941bbSAndroid Build Coastguard WorkerX{
1372*b7c941bbSAndroid Build Coastguard WorkerX  REG One_Thirty        Int_Loc;
1373*b7c941bbSAndroid Build Coastguard WorkerX      Capital_Letter    Ch_Loc;
1374*b7c941bbSAndroid Build Coastguard WorkerX
1375*b7c941bbSAndroid Build Coastguard WorkerX  Int_Loc = 2;
1376*b7c941bbSAndroid Build Coastguard WorkerX  while (Int_Loc <= 2) /* loop body executed once */
1377*b7c941bbSAndroid Build Coastguard WorkerX    if (Func_1 (Str_1_Par_Ref[Int_Loc],
1378*b7c941bbSAndroid Build Coastguard WorkerX                Str_2_Par_Ref[Int_Loc+1]) == Ident_1)
1379*b7c941bbSAndroid Build Coastguard WorkerX      /* then, executed */
1380*b7c941bbSAndroid Build Coastguard WorkerX    {
1381*b7c941bbSAndroid Build Coastguard WorkerX      Ch_Loc = 'A';
1382*b7c941bbSAndroid Build Coastguard WorkerX      Int_Loc += 1;
1383*b7c941bbSAndroid Build Coastguard WorkerX    } /* if, while */
1384*b7c941bbSAndroid Build Coastguard WorkerX  if (Ch_Loc >= 'W' && Ch_Loc < 'Z')
1385*b7c941bbSAndroid Build Coastguard WorkerX    /* then, not executed */
1386*b7c941bbSAndroid Build Coastguard WorkerX    Int_Loc = 7;
1387*b7c941bbSAndroid Build Coastguard WorkerX  if (Ch_Loc == 'R')
1388*b7c941bbSAndroid Build Coastguard WorkerX    /* then, not executed */
1389*b7c941bbSAndroid Build Coastguard WorkerX    return (true);
1390*b7c941bbSAndroid Build Coastguard WorkerX  else /* executed */
1391*b7c941bbSAndroid Build Coastguard WorkerX  {
1392*b7c941bbSAndroid Build Coastguard WorkerX    if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0)
1393*b7c941bbSAndroid Build Coastguard WorkerX      /* then, not executed */
1394*b7c941bbSAndroid Build Coastguard WorkerX    {
1395*b7c941bbSAndroid Build Coastguard WorkerX      Int_Loc += 7;
1396*b7c941bbSAndroid Build Coastguard WorkerX      Int_Glob = Int_Loc;
1397*b7c941bbSAndroid Build Coastguard WorkerX      return (true);
1398*b7c941bbSAndroid Build Coastguard WorkerX    }
1399*b7c941bbSAndroid Build Coastguard WorkerX    else /* executed */
1400*b7c941bbSAndroid Build Coastguard WorkerX      return (false);
1401*b7c941bbSAndroid Build Coastguard WorkerX  } /* if Ch_Loc */
1402*b7c941bbSAndroid Build Coastguard WorkerX} /* Func_2 */
1403*b7c941bbSAndroid Build Coastguard WorkerX
1404*b7c941bbSAndroid Build Coastguard WorkerX
1405*b7c941bbSAndroid Build Coastguard WorkerXBoolean Func_3 (Enum_Par_Val)
1406*b7c941bbSAndroid Build Coastguard WorkerX/***************************/
1407*b7c941bbSAndroid Build Coastguard WorkerX    /* executed once        */
1408*b7c941bbSAndroid Build Coastguard WorkerX    /* Enum_Par_Val == Ident_3 */
1409*b7c941bbSAndroid Build Coastguard WorkerXEnumeration Enum_Par_Val;
1410*b7c941bbSAndroid Build Coastguard WorkerX{
1411*b7c941bbSAndroid Build Coastguard WorkerX  Enumeration Enum_Loc;
1412*b7c941bbSAndroid Build Coastguard WorkerX
1413*b7c941bbSAndroid Build Coastguard WorkerX  Enum_Loc = Enum_Par_Val;
1414*b7c941bbSAndroid Build Coastguard WorkerX  if (Enum_Loc == Ident_3)
1415*b7c941bbSAndroid Build Coastguard WorkerX    /* then, executed */
1416*b7c941bbSAndroid Build Coastguard WorkerX    return (true);
1417*b7c941bbSAndroid Build Coastguard WorkerX  else /* not executed */
1418*b7c941bbSAndroid Build Coastguard WorkerX    return (false);
1419*b7c941bbSAndroid Build Coastguard WorkerX} /* Func_3 */
1420*b7c941bbSAndroid Build Coastguard WorkerX
1421*b7c941bbSAndroid Build Coastguard WorkerSHAR_EOF
1422*b7c941bbSAndroid Build Coastguard Workerfi
1423*b7c941bbSAndroid Build Coastguard Workerexit 0
1424*b7c941bbSAndroid Build Coastguard Worker#        End of shell archive
1425