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