First compilable version (with NOSTRUCTASSIGN)
This commit is contained in:
commit
e4b6a30c0f
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*.dat
|
||||
result.log
|
29
cpuidc64.shot
Normal file
29
cpuidc64.shot
Normal file
@ -0,0 +1,29 @@
|
||||
#include "cpuidh.head"
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
string timeday;
|
||||
float theseSecs = 0.0;
|
||||
float startSecs = 0.0;
|
||||
float secs;
|
||||
int millisecs;
|
||||
|
||||
void local_time() {
|
||||
timeday = asctime();
|
||||
}
|
||||
|
||||
void getSecs() {
|
||||
theseSecs = GetTickCount() / 1000.0f;
|
||||
}
|
||||
|
||||
void start_time() {
|
||||
getSecs();
|
||||
startSecs = theseSecs;
|
||||
}
|
||||
|
||||
void end_time() {
|
||||
getSecs();
|
||||
secs = theseSecs - startSecs;
|
||||
millisecs = (int) (1000.0 * secs);
|
||||
}
|
||||
|
11
cpuidh.head
Normal file
11
cpuidh.head
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef CPUID_H
|
||||
#define CPUID_H
|
||||
extern string timeday;
|
||||
extern float theseSecs;
|
||||
extern float startSecs;
|
||||
extern float secs;
|
||||
|
||||
void start_time();
|
||||
void end_time();
|
||||
void local_time();
|
||||
#endif // CPUID_H
|
364
dhry.h
Normal file
364
dhry.h
Normal file
@ -0,0 +1,364 @@
|
||||
/*
|
||||
**************************************************************************
|
||||
* DHRYSTONE 2.1 BENCHMARK PC VERSION
|
||||
**************************************************************************
|
||||
*
|
||||
* "DHRYSTONE" Benchmark Program
|
||||
* -----------------------------
|
||||
*
|
||||
* Version: C, Version 2.1
|
||||
*
|
||||
* File: dhry.h (part 1 of 3)
|
||||
*
|
||||
* Date: May 25, 1988
|
||||
*
|
||||
* Author: Reinhold P. Weicker
|
||||
* Siemens AG, AUT E 51
|
||||
* Postfach 3220
|
||||
* 8520 Erlangen
|
||||
* Germany (West)
|
||||
* Phone: [+49]-9131-7-20330
|
||||
* (8-17 Central European Time)
|
||||
* Usenet: ..!mcsun!unido!estevax!weicker
|
||||
*
|
||||
* Original Version (in Ada) published in
|
||||
* "Communications of the ACM" vol. 27., no. 10 (Oct. 1984),
|
||||
* pp. 1013 - 1030, together with the statistics
|
||||
* on which the distribution of statements etc. is based.
|
||||
*
|
||||
* In this C version, the following C library functions are used:
|
||||
* - strcpy, strcmp (inside the measurement loop)
|
||||
* - printf, scanf (outside the measurement loop)
|
||||
* In addition, Berkeley UNIX system calls "times ()" or "time ()"
|
||||
* are used for execution time measurement. For measurements
|
||||
* on other systems, these calls have to be changed.
|
||||
*
|
||||
* Collection of Results:
|
||||
* Reinhold Weicker (address see above) and
|
||||
*
|
||||
* Rick Richardson
|
||||
* PC Research. Inc.
|
||||
* 94 Apple Orchard Drive
|
||||
* Tinton Falls, NJ 07724
|
||||
* Phone: (201) 389-8963 (9-17 EST)
|
||||
* Usenet: ...!uunet!pcrat!rick
|
||||
*
|
||||
* Please send results to Rick Richardson and/or Reinhold Weicker.
|
||||
* Complete information should be given on hardware and software used.
|
||||
* Hardware information includes: Machine type, CPU, type and size
|
||||
* of caches; for microprocessors: clock frequency, memory speed
|
||||
* (number of wait states).
|
||||
* Software information includes: Compiler (and runtime library)
|
||||
* manufacturer and version, compilation switches, OS version.
|
||||
* The Operating System version may give an indication about the
|
||||
* compiler; Dhrystone itself performs no OS calls in the measurement
|
||||
* loop.
|
||||
*
|
||||
* The complete output generated by the program should be mailed
|
||||
* such that at least some checks for correctness can be made.
|
||||
*
|
||||
**************************************************************************
|
||||
*
|
||||
* This version has changes made by Roy Longbottom to conform to a common
|
||||
* format for a series of standard benchmarks for PCs:
|
||||
*
|
||||
* Running time greater than 5 seconds due to inaccuracy of the PC clock.
|
||||
*
|
||||
* Automatic adjustment of run time, no manually inserted parameters.
|
||||
*
|
||||
* Initial display of calibration times to confirm linearity.
|
||||
*
|
||||
* Display of results within one screen (or at a slow speed as the test
|
||||
* progresses) so that it can be seen to have run successfully.
|
||||
*
|
||||
* Facilities to type in details of system used etc.
|
||||
*
|
||||
* All results and details appended to a results file.
|
||||
*
|
||||
*
|
||||
* Roy Longbottom
|
||||
* 101323.2241@compuserve.com
|
||||
*
|
||||
**************************************************************************
|
||||
*
|
||||
* For details of history, changes, other defines, benchmark construction
|
||||
* statistics see official versions from ftp.nosc.mil/pub/aburto where
|
||||
* the latest table of results (dhry.tbl) are available. See also
|
||||
* netlib@ornl.gov
|
||||
*
|
||||
**************************************************************************
|
||||
*
|
||||
* Defines: The following "Defines" are possible:
|
||||
* -DREG=register (default: Not defined)
|
||||
* As an approximation to what an average C programmer
|
||||
* might do, the "register" storage class is applied
|
||||
* (if enabled by -DREG=register)
|
||||
* - for local variables, if they are used (dynamically)
|
||||
* five or more times
|
||||
* - for parameters if they are used (dynamically)
|
||||
* six or more times
|
||||
* Note that an optimal "register" strategy is
|
||||
* compiler-dependent, and that "register" declarations
|
||||
* do not necessarily lead to faster execution.
|
||||
* -DNOSTRUCTASSIGN (default: Not defined)
|
||||
* Define if the C compiler does not support
|
||||
* assignment of structures.
|
||||
* -DNOENUMS (default: Not defined)
|
||||
* Define if the C compiler does not support
|
||||
* enumeration types.
|
||||
***************************************************************************
|
||||
*
|
||||
* Compilation model and measurement (IMPORTANT):
|
||||
*
|
||||
* This C version of Dhrystone consists of three files:
|
||||
* - dhry.h (this file, containing global definitions and comments)
|
||||
* - dhry_1.c (containing the code corresponding to Ada package Pack_1)
|
||||
* - dhry_2.c (containing the code corresponding to Ada package Pack_2)
|
||||
*
|
||||
* The following "ground rules" apply for measurements:
|
||||
* - Separate compilation
|
||||
* - No procedure merging
|
||||
* - Otherwise, compiler optimizations are allowed but should be indicated
|
||||
* - Default results are those without register declarations
|
||||
* See the companion paper "Rationale for Dhrystone Version 2" for a more
|
||||
* detailed discussion of these ground rules.
|
||||
*
|
||||
* For 16-Bit processors (e.g. 80186, 80286), times for all compilation
|
||||
* models ("small", "medium", "large" etc.) should be given if possible,
|
||||
* together with a definition of these models for the compiler system used.
|
||||
*
|
||||
**************************************************************************
|
||||
* Examples of Pentium Results
|
||||
*
|
||||
* Dhrystone Benchmark Version 2.1 (Language: C)
|
||||
*
|
||||
* Month run 4/1996
|
||||
* PC model Escom
|
||||
* CPU Pentium
|
||||
* Clock MHz 100
|
||||
* Cache 256K
|
||||
* Options Neptune chipset
|
||||
* OS/DOS Windows 95
|
||||
* Compiler Watcom C/ C++ 10.5 Win386
|
||||
* OptLevel -otexan -zp8 -fp5 -5r
|
||||
* Run by Roy Longbottom
|
||||
* From UK
|
||||
* Mail 101323.2241@compuserve.com
|
||||
*
|
||||
* Final values (* implementation-dependent):
|
||||
*
|
||||
* Int_Glob: O.K. 5
|
||||
* Bool_Glob: O.K. 1
|
||||
* Ch_1_Glob: O.K. A
|
||||
* Ch_2_Glob: O.K. B
|
||||
* Arr_1_Glob[8]: O.K. 7
|
||||
* Arr_2_Glob8/7: O.K. 1600010
|
||||
* Ptr_Glob->
|
||||
* Ptr_Comp: * 98008
|
||||
* Discr: O.K. 0
|
||||
* Enum_Comp: O.K. 2
|
||||
* Int_Comp: O.K. 17
|
||||
* Str_Comp: O.K. DHRYSTONE PROGRAM, SOME STRING
|
||||
* Next_Ptr_Glob->
|
||||
* Ptr_Comp: * 98008 same as above
|
||||
* Discr: O.K. 0
|
||||
* Enum_Comp: O.K. 1
|
||||
* Int_Comp: O.K. 18
|
||||
* Str_Comp: O.K. DHRYSTONE PROGRAM, SOME STRING
|
||||
* Int_1_Loc: O.K. 5
|
||||
* Int_2_Loc: O.K. 13
|
||||
* Int_3_Loc: O.K. 7
|
||||
* Enum_Loc: O.K. 1
|
||||
* Str_1_Loc: O.K. DHRYSTONE PROGRAM, 1'ST STRING
|
||||
* Str_2_Loc: O.K. DHRYSTONE PROGRAM, 2'ND STRING
|
||||
*
|
||||
* Register option Selected.
|
||||
*
|
||||
* Microseconds 1 loop: 4.53
|
||||
* Dhrystones / second: 220690
|
||||
* VAX MIPS rating: 125.61
|
||||
*
|
||||
*
|
||||
* Dhrystone Benchmark Version 2.1 (Language: C)
|
||||
*
|
||||
* Month run 4/1996
|
||||
* PC model Escom
|
||||
* CPU Pentium
|
||||
* Clock MHz 100
|
||||
* Cache 256K
|
||||
* Options Neptune chipset
|
||||
* OS/DOS Windows 95
|
||||
* Compiler Watcom C/ C++ 10.5 Win386
|
||||
* OptLevel No optimisation
|
||||
* Run by Roy Longbottom
|
||||
* From UK
|
||||
* Mail 101323.2241@compuserve.com
|
||||
*
|
||||
* Final values (* implementation-dependent):
|
||||
*
|
||||
* Int_Glob: O.K. 5
|
||||
* Bool_Glob: O.K. 1
|
||||
* Ch_1_Glob: O.K. A
|
||||
* Ch_2_Glob: O.K. B
|
||||
* Arr_1_Glob[8]: O.K. 7
|
||||
* Arr_2_Glob8/7: O.K. 320010
|
||||
* Ptr_Glob->
|
||||
* Ptr_Comp: * 98004
|
||||
* Discr: O.K. 0
|
||||
* Enum_Comp: O.K. 2
|
||||
* Int_Comp: O.K. 17
|
||||
* Str_Comp: O.K. DHRYSTONE PROGRAM, SOME STRING
|
||||
* Next_Ptr_Glob->
|
||||
* Ptr_Comp: * 98004 same as above
|
||||
* Discr: O.K. 0
|
||||
* Enum_Comp: O.K. 1
|
||||
* Int_Comp: O.K. 18
|
||||
* Str_Comp: O.K. DHRYSTONE PROGRAM, SOME STRING
|
||||
* Int_1_Loc: O.K. 5
|
||||
* Int_2_Loc: O.K. 13
|
||||
* Int_3_Loc: O.K. 7
|
||||
* Enum_Loc: O.K. 1
|
||||
* Str_1_Loc: O.K. DHRYSTONE PROGRAM, 1'ST STRING
|
||||
* Str_2_Loc: O.K. DHRYSTONE PROGRAM, 2'ND STRING
|
||||
*
|
||||
* Register option Not selected.
|
||||
*
|
||||
* Microseconds 1 loop: 20.06
|
||||
* Dhrystones / second: 49844
|
||||
* VAX MIPS rating: 28.37
|
||||
*
|
||||
**************************************************************************
|
||||
*/
|
||||
#ifndef DHRY_H
|
||||
#define DHRY_H
|
||||
|
||||
/* Compiler and system dependent definitions: */
|
||||
#ifdef __HSHOT__
|
||||
typedef float double;
|
||||
typedef int char : 8;
|
||||
#else // __HSHOT__
|
||||
|
||||
#ifndef TIME
|
||||
#define TIMES
|
||||
#endif
|
||||
/* Use times(2) time function unless */
|
||||
/* explicitly defined otherwise */
|
||||
|
||||
#ifdef TIMES
|
||||
/* #include <sys/types.h>
|
||||
#include <sys/times.h> */
|
||||
/* for "times" */
|
||||
#endif
|
||||
#endif // __HSHOT__
|
||||
|
||||
#define Mic_secs_Per_Second 1000000.0
|
||||
/* Berkeley UNIX C returns process times in seconds/HZ */
|
||||
|
||||
#ifdef NOSTRUCTASSIGN
|
||||
#define structassign(d, s) memcpy(&(d), &(s), sizeof(d))
|
||||
#else
|
||||
#define structassign(d, s) d = s
|
||||
#endif
|
||||
|
||||
#ifdef NOENUM
|
||||
#define Ident_1 0
|
||||
#define Ident_2 1
|
||||
#define Ident_3 2
|
||||
#define Ident_4 3
|
||||
#define Ident_5 4
|
||||
typedef int Enumeration;
|
||||
#else
|
||||
#ifdef __HSHOT__
|
||||
enum Enumeration {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5};
|
||||
#else
|
||||
typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5}
|
||||
Enumeration;
|
||||
#endif
|
||||
#endif
|
||||
/* for boolean and enumeration types in Ada, Pascal */
|
||||
|
||||
/* General definitions: */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
/* for strcpy, strcmp */
|
||||
#ifdef __HSHOT__
|
||||
#include <memory.h> // malloc
|
||||
#endif
|
||||
|
||||
#define Null 0
|
||||
/* Value of a Null pointer */
|
||||
#define true 1
|
||||
#define false 0
|
||||
|
||||
typedef int One_Thirty;
|
||||
typedef int One_Fifty;
|
||||
typedef char Capital_Letter;
|
||||
typedef int Boolean;
|
||||
typedef int Arr_1_Dim [50];
|
||||
typedef int Arr_2_Dim [50] [50];
|
||||
|
||||
#ifdef __HSHOT__
|
||||
typedef string Str_30;
|
||||
#define strcpy( x, y ) (x) = (y)
|
||||
|
||||
struct Struct_1 {
|
||||
Enumeration Enum_Comp;
|
||||
int Int_Comp;
|
||||
string Str_Comp;
|
||||
};
|
||||
|
||||
struct Struct_2 {
|
||||
Enumeration E_Comp_2;
|
||||
string Str_2_Comp;
|
||||
};
|
||||
|
||||
struct Struct_3 {
|
||||
char Ch_1_Comp;
|
||||
char Ch_2_Comp;
|
||||
};
|
||||
|
||||
union Union {
|
||||
Struct_1 var_1;
|
||||
Struct_2 var_2;
|
||||
Struct_3 var_3;
|
||||
};
|
||||
|
||||
struct record
|
||||
{
|
||||
record *Ptr_Comp;
|
||||
Enumeration Discr;
|
||||
Union variant;
|
||||
};
|
||||
|
||||
typedef record Rec_Type;
|
||||
typedef Rec_Type *Rec_Pointer;
|
||||
#else
|
||||
typedef char Str_30 [31];
|
||||
|
||||
typedef struct record
|
||||
{
|
||||
struct record *Ptr_Comp;
|
||||
Enumeration Discr;
|
||||
union {
|
||||
struct {
|
||||
Enumeration Enum_Comp;
|
||||
int Int_Comp;
|
||||
char Str_Comp [31];
|
||||
} var_1;
|
||||
struct {
|
||||
Enumeration E_Comp_2;
|
||||
char Str_2_Comp [31];
|
||||
} var_2;
|
||||
struct {
|
||||
char Ch_1_Comp;
|
||||
char Ch_2_Comp;
|
||||
} var_3;
|
||||
} variant;
|
||||
} Rec_Type, *Rec_Pointer;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // DHRY_H
|
17
dhry.hsproj
Normal file
17
dhry.hsproj
Normal file
@ -0,0 +1,17 @@
|
||||
|
||||
#target "hsproj.dat"
|
||||
|
||||
#define NDEBUG
|
||||
#pragma optimize( "pdb", none )
|
||||
#pragma optimize( "a", on )
|
||||
#pragma optimize( "g", on )
|
||||
|
||||
#define __HSHOT__
|
||||
#define NOSTRUCTASSIGN
|
||||
|
||||
#directory "../backend"
|
||||
#directory "../public"
|
||||
|
||||
#source "cpuidc64.shot"
|
||||
#source "dhry_1.c"
|
||||
#source "dhry_2.c"
|
505
dhry_1.c
Normal file
505
dhry_1.c
Normal file
@ -0,0 +1,505 @@
|
||||
/*
|
||||
* Compile Linux Intel
|
||||
* cc dhry_1.c dhry_2.c cpuidc.c -lm -lrt -O3 -o dhrystoneIL
|
||||
*
|
||||
* Cross Compile on Linux Intel for ARM
|
||||
* ~/toolchain/raspbian-toolchain-gcc-4.7.2-linux32/bin/arm-linux-gnueabihf-gcc dhry_1.c dhry_2.c cpuidc.c -lm -lrt -O3 -march=armv6 -o dhrystonePiA6
|
||||
*
|
||||
* Compile on Raspberry Pi
|
||||
* gcc dhry_1.c dhry_2.c cpuidc.c -lm -lrt -O3 -march=armv6 -o dhrystonePiA6
|
||||
* #define options "Opt 3 32 Bit"
|
||||
* gcc dhry_1.c dhry_2.c cpuidc.c -lm -lrt -O3 -mcpu=cortex-a7 -o dhrystonePiA7
|
||||
* #define options "A7 32 Bit"
|
||||
*************************************************************************
|
||||
*
|
||||
* "DHRYSTONE" Benchmark Program
|
||||
* -----------------------------
|
||||
*
|
||||
* Version: C, Version 2.1
|
||||
*
|
||||
* File: dhry_1.c (part 2 of 3)
|
||||
*
|
||||
* Date: May 25, 1988
|
||||
*
|
||||
* Author: Reinhold P. Weicker
|
||||
*
|
||||
*************************************************************************
|
||||
*
|
||||
* #define options not used
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "dhry.h"
|
||||
#ifdef __HSHOT__
|
||||
#include "cpuidh.head"
|
||||
#else
|
||||
#include "cpuidh.h"
|
||||
#endif
|
||||
|
||||
#ifdef CNNT
|
||||
# define options "Non-optimised"
|
||||
# define opt "0"
|
||||
#else
|
||||
# ifndef options
|
||||
# define options "Optimised"
|
||||
# endif
|
||||
# define opt ""
|
||||
#endif
|
||||
|
||||
|
||||
/* Global Variables: */
|
||||
|
||||
Rec_Pointer Ptr_Glob,
|
||||
Next_Ptr_Glob;
|
||||
int Int_Glob;
|
||||
Boolean Bool_Glob;
|
||||
char Ch_1_Glob,
|
||||
Ch_2_Glob;
|
||||
int Arr_1_Glob[50];
|
||||
int Arr_2_Glob[50][50];
|
||||
|
||||
#ifdef __HSHOT__
|
||||
string Reg_Define = "Register option Selected.";
|
||||
#else
|
||||
char Reg_Define[40] = "Register option Selected.";
|
||||
#endif
|
||||
|
||||
|
||||
Enumeration Func_1(Capital_Letter Ch_1_Par_Val,
|
||||
Capital_Letter Ch_2_Par_Val);
|
||||
/*
|
||||
forward declaration necessary since Enumeration may not simply be int
|
||||
*/
|
||||
|
||||
#ifndef ROPT
|
||||
#define REG
|
||||
/* REG becomes defined as empty */
|
||||
/* i.e. no register variables */
|
||||
#else
|
||||
#define REG register
|
||||
#endif
|
||||
|
||||
void Proc_1(REG Rec_Pointer Ptr_Val_Par);
|
||||
|
||||
void Proc_2(One_Fifty *Int_Par_Ref);
|
||||
|
||||
void Proc_3(Rec_Pointer *Ptr_Ref_Par);
|
||||
|
||||
void Proc_4();
|
||||
|
||||
void Proc_5();
|
||||
|
||||
void Proc_6(Enumeration Enum_Val_Par, Enumeration *Enum_Ref_Par);
|
||||
|
||||
void Proc_7(One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val,
|
||||
One_Fifty *Int_Par_Ref);
|
||||
|
||||
void Proc_8(Arr_1_Dim Arr_1_Par_Ref, Arr_2_Dim Arr_2_Par_Ref,
|
||||
int Int_1_Par_Val, int Int_2_Par_Val);
|
||||
|
||||
Boolean Func_2(Str_30 Str_1_Par_Ref, Str_30 Str_2_Par_Ref);
|
||||
|
||||
|
||||
/* variables for time measurement: */
|
||||
|
||||
#define Too_Small_Time 2
|
||||
/* Measurements should last at least 2 seconds */
|
||||
|
||||
double User_Time;
|
||||
|
||||
double Microseconds,
|
||||
Dhrystones_Per_Second,
|
||||
Vax_Mips;
|
||||
|
||||
/* end of variables for time measurement */
|
||||
|
||||
|
||||
#ifdef __HSHOT__
|
||||
void main( void )
|
||||
#else
|
||||
int main(int argc, char *argv[])
|
||||
#endif
|
||||
/*****/
|
||||
|
||||
/* main program, corresponds to procedures */
|
||||
/* Main and Proc_0 in the Ada version */
|
||||
{
|
||||
|
||||
One_Fifty Int_1_Loc;
|
||||
REG One_Fifty Int_2_Loc;
|
||||
One_Fifty Int_3_Loc;
|
||||
REG char Ch_Index;
|
||||
Enumeration Enum_Loc;
|
||||
Str_30 Str_1_Loc;
|
||||
Str_30 Str_2_Loc;
|
||||
REG int Run_Index;
|
||||
REG int Number_Of_Runs;
|
||||
int endit, count = 10;
|
||||
int errors = 0;
|
||||
int i;
|
||||
int nopause = 1;
|
||||
|
||||
/***********************************************************************
|
||||
* Change for compiler and optimisation used *
|
||||
***********************************************************************/
|
||||
|
||||
Next_Ptr_Glob = (Rec_Pointer) malloc(sizeof(Rec_Type));
|
||||
Ptr_Glob = (Rec_Pointer) malloc(sizeof(Rec_Type));
|
||||
|
||||
Ptr_Glob->Ptr_Comp = Next_Ptr_Glob;
|
||||
Ptr_Glob->Discr = Ident_1;
|
||||
Ptr_Glob->variant.var_1.Enum_Comp = Ident_3;
|
||||
Ptr_Glob->variant.var_1.Int_Comp = 40;
|
||||
strcpy(Ptr_Glob->variant.var_1.Str_Comp,
|
||||
"DHRYSTONE PROGRAM, SOME STRING");
|
||||
strcpy(Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING");
|
||||
|
||||
Arr_2_Glob[8][7] = 10;
|
||||
/* Was missing in published program. Without this statement, */
|
||||
/* Arr_2_Glob [8][7] would have an undefined value. */
|
||||
/* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */
|
||||
/* overflow may occur for this array element. */
|
||||
#ifdef __HSHOT__
|
||||
printf("Dhrystone Benchmark, Version 2.1 (Language: HeadShot)\n");
|
||||
#else
|
||||
printf("Dhrystone Benchmark, Version 2.1 (Language: C or C++)\n");
|
||||
#endif
|
||||
printf("\n");
|
||||
|
||||
printf("Optimisation %s\n", options);
|
||||
#ifdef ROPT
|
||||
printf ("Register option selected\n\n");
|
||||
#else
|
||||
printf("Register option not selected\n\n");
|
||||
strcpy(Reg_Define, "Register option Not selected.");
|
||||
#endif
|
||||
|
||||
|
||||
Number_Of_Runs = 5000;
|
||||
|
||||
do {
|
||||
|
||||
Number_Of_Runs = Number_Of_Runs * 2;
|
||||
count = count - 1;
|
||||
Arr_2_Glob[8][7] = 10;
|
||||
|
||||
/***************/
|
||||
/* Start timer */
|
||||
/***************/
|
||||
|
||||
start_time();
|
||||
|
||||
for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) {
|
||||
Proc_5();
|
||||
Proc_4();
|
||||
/* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */
|
||||
Int_1_Loc = 2;
|
||||
Int_2_Loc = 3;
|
||||
strcpy(Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING");
|
||||
Enum_Loc = Ident_2;
|
||||
Bool_Glob = !Func_2(Str_1_Loc, Str_2_Loc);
|
||||
/* Bool_Glob == 1 */
|
||||
while (Int_1_Loc < Int_2_Loc) /* loop body executed once */
|
||||
{
|
||||
Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc;
|
||||
/* Int_3_Loc == 7 */
|
||||
Proc_7(Int_1_Loc, Int_2_Loc, &Int_3_Loc);
|
||||
/* Int_3_Loc == 7 */
|
||||
Int_1_Loc += 1;
|
||||
} /* while */
|
||||
/* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
|
||||
Proc_8(Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc);
|
||||
/* Int_Glob == 5 */
|
||||
Proc_1(Ptr_Glob);
|
||||
for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index)
|
||||
/* loop body executed twice */
|
||||
{
|
||||
if (Enum_Loc == Func_1(Ch_Index, 'C'))
|
||||
/* then, not executed */
|
||||
{
|
||||
Proc_6(Ident_1, &Enum_Loc);
|
||||
strcpy(Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING");
|
||||
Int_2_Loc = Run_Index;
|
||||
Int_Glob = Run_Index;
|
||||
}
|
||||
}
|
||||
/* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
|
||||
Int_2_Loc = Int_2_Loc * Int_1_Loc;
|
||||
Int_1_Loc = Int_2_Loc / Int_3_Loc;
|
||||
Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc;
|
||||
/* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */
|
||||
Proc_2(&Int_1_Loc);
|
||||
/* Int_1_Loc == 5 */
|
||||
|
||||
} /* loop "for Run_Index" */
|
||||
|
||||
/**************/
|
||||
/* Stop timer */
|
||||
/**************/
|
||||
|
||||
end_time();
|
||||
User_Time = secs;
|
||||
|
||||
printf("%12.0f runs %6.2f seconds \n", (double) Number_Of_Runs, User_Time);
|
||||
if (User_Time > 2) {
|
||||
count = 0;
|
||||
} else {
|
||||
if (User_Time < 0.05) {
|
||||
Number_Of_Runs = Number_Of_Runs * 5;
|
||||
}
|
||||
}
|
||||
} /* calibrate/run do while */
|
||||
while (count > 0);
|
||||
|
||||
printf("\n");
|
||||
printf("Final values (* implementation-dependent):\n");
|
||||
printf("\n");
|
||||
printf("Int_Glob: ");
|
||||
if (Int_Glob == 5) printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d ", Int_Glob);
|
||||
|
||||
printf("Bool_Glob: ");
|
||||
if (Bool_Glob == 1) printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d\n", Bool_Glob);
|
||||
|
||||
printf("Ch_1_Glob: ");
|
||||
if (Ch_1_Glob == 'A') printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%c ", Ch_1_Glob);
|
||||
|
||||
printf("Ch_2_Glob: ");
|
||||
if (Ch_2_Glob == 'B') printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%c\n", Ch_2_Glob);
|
||||
|
||||
printf("Arr_1_Glob[8]: ");
|
||||
if (Arr_1_Glob[8] == 7) printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d ", Arr_1_Glob[8]);
|
||||
|
||||
printf("Arr_2_Glob8/7: ");
|
||||
if (Arr_2_Glob[8][7] == Number_Of_Runs + 10)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%10d\n", Arr_2_Glob[8][7]);
|
||||
|
||||
printf("Ptr_Glob-> ");
|
||||
printf(" Ptr_Comp: * %p\n", (void *) Ptr_Glob->Ptr_Comp);
|
||||
|
||||
printf(" Discr: ");
|
||||
if (Ptr_Glob->Discr == 0) printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d ", Ptr_Glob->Discr);
|
||||
|
||||
printf("Enum_Comp: ");
|
||||
if (Ptr_Glob->variant.var_1.Enum_Comp == 2)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d\n", Ptr_Glob->variant.var_1.Enum_Comp);
|
||||
|
||||
printf(" Int_Comp: ");
|
||||
if (Ptr_Glob->variant.var_1.Int_Comp == 17) printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d ", Ptr_Glob->variant.var_1.Int_Comp);
|
||||
|
||||
printf("Str_Comp: ");
|
||||
if (strcmp(Ptr_Glob->variant.var_1.Str_Comp,
|
||||
"DHRYSTONE PROGRAM, SOME STRING") == 0)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%s\n", Ptr_Glob->variant.var_1.Str_Comp);
|
||||
|
||||
printf("Next_Ptr_Glob-> ");
|
||||
printf(" Ptr_Comp: * %p", (void *) Next_Ptr_Glob->Ptr_Comp);
|
||||
printf(" same as above\n");
|
||||
|
||||
printf(" Discr: ");
|
||||
if (Next_Ptr_Glob->Discr == 0)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d ", Next_Ptr_Glob->Discr);
|
||||
|
||||
printf("Enum_Comp: ");
|
||||
if (Next_Ptr_Glob->variant.var_1.Enum_Comp == 1)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp);
|
||||
|
||||
printf(" Int_Comp: ");
|
||||
if (Next_Ptr_Glob->variant.var_1.Int_Comp == 18)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d ", Next_Ptr_Glob->variant.var_1.Int_Comp);
|
||||
|
||||
printf("Str_Comp: ");
|
||||
if (strcmp(Next_Ptr_Glob->variant.var_1.Str_Comp,
|
||||
"DHRYSTONE PROGRAM, SOME STRING") == 0)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%s\n", Next_Ptr_Glob->variant.var_1.Str_Comp);
|
||||
|
||||
printf("Int_1_Loc: ");
|
||||
if (Int_1_Loc == 5)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d ", Int_1_Loc);
|
||||
|
||||
printf("Int_2_Loc: ");
|
||||
if (Int_2_Loc == 13)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d\n", Int_2_Loc);
|
||||
|
||||
printf("Int_3_Loc: ");
|
||||
if (Int_3_Loc == 7)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d ", Int_3_Loc);
|
||||
|
||||
printf("Enum_Loc: ");
|
||||
if (Enum_Loc == 1)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%d \n", Enum_Loc);
|
||||
|
||||
|
||||
printf("Str_1_Loc: ");
|
||||
if (strcmp(Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING") == 0)
|
||||
printf("O.K. ");
|
||||
|
||||
else printf("WRONG ");
|
||||
printf("%s\n", Str_1_Loc);
|
||||
|
||||
printf("Str_2_Loc: ");
|
||||
if (strcmp(Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING") == 0)
|
||||
printf("O.K. ");
|
||||
else printf("WRONG ");
|
||||
printf("%s\n", Str_2_Loc);
|
||||
|
||||
|
||||
printf("\n");
|
||||
|
||||
|
||||
if (User_Time < Too_Small_Time) {
|
||||
printf("Measured time too small to obtain meaningful results\n");
|
||||
printf("Please increase number of runs\n");
|
||||
printf("\n");
|
||||
} else {
|
||||
Microseconds = User_Time * Mic_secs_Per_Second
|
||||
/ (double) Number_Of_Runs;
|
||||
Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time;
|
||||
Vax_Mips = Dhrystones_Per_Second / 1757.0;
|
||||
|
||||
printf("Nanoseconds one Dhrystone run: %12.2lf\n", Microseconds * 1000);
|
||||
printf("Dhrystones per Second: %12.0lf\n", Dhrystones_Per_Second);
|
||||
printf("VAX MIPS rating = %12.2lf\n", Vax_Mips);
|
||||
printf("\n");
|
||||
local_time();
|
||||
}
|
||||
}
|
||||
|
||||
void Proc_1(REG Rec_Pointer Ptr_Val_Par)
|
||||
/******************/
|
||||
|
||||
/* executed once */
|
||||
{
|
||||
REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp;
|
||||
/* == Ptr_Glob_Next */
|
||||
/* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */
|
||||
/* corresponds to "rename" in Ada, "with" in Pascal */
|
||||
|
||||
structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob);
|
||||
Ptr_Val_Par->variant.var_1.Int_Comp = 5;
|
||||
Next_Record->variant.var_1.Int_Comp
|
||||
= Ptr_Val_Par->variant.var_1.Int_Comp;
|
||||
Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp;
|
||||
Proc_3(&Next_Record->Ptr_Comp);
|
||||
/* Ptr_Val_Par->Ptr_Comp->Ptr_Comp
|
||||
== Ptr_Glob->Ptr_Comp */
|
||||
if (Next_Record->Discr == Ident_1)
|
||||
/* then, executed */
|
||||
{
|
||||
Next_Record->variant.var_1.Int_Comp = 6;
|
||||
Proc_6(Ptr_Val_Par->variant.var_1.Enum_Comp,
|
||||
&Next_Record->variant.var_1.Enum_Comp);
|
||||
Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp;
|
||||
Proc_7(Next_Record->variant.var_1.Int_Comp, 10,
|
||||
&Next_Record->variant.var_1.Int_Comp);
|
||||
} else /* not executed */
|
||||
structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp);
|
||||
} /* Proc_1 */
|
||||
|
||||
|
||||
void Proc_2(One_Fifty *Int_Par_Ref)
|
||||
/******************/
|
||||
/* executed once */
|
||||
/* *Int_Par_Ref == 1, becomes 4 */
|
||||
|
||||
{
|
||||
One_Fifty Int_Loc;
|
||||
Enumeration Enum_Loc;
|
||||
|
||||
Int_Loc = *Int_Par_Ref + 10;
|
||||
do /* executed once */
|
||||
if (Ch_1_Glob == 'A')
|
||||
/* then, executed */
|
||||
{
|
||||
Int_Loc -= 1;
|
||||
*Int_Par_Ref = Int_Loc - Int_Glob;
|
||||
Enum_Loc = Ident_1;
|
||||
} /* if */
|
||||
while (Enum_Loc != Ident_1); /* true */
|
||||
} /* Proc_2 */
|
||||
|
||||
|
||||
void Proc_3(Rec_Pointer *Ptr_Ref_Par)
|
||||
/******************/
|
||||
/* executed once */
|
||||
/* Ptr_Ref_Par becomes Ptr_Glob */
|
||||
|
||||
{
|
||||
if (Ptr_Glob != Null)
|
||||
/* then, executed */
|
||||
*Ptr_Ref_Par = Ptr_Glob->Ptr_Comp;
|
||||
Proc_7(10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp);
|
||||
} /* Proc_3 */
|
||||
|
||||
|
||||
void Proc_4() /* without parameters */
|
||||
/*******/
|
||||
/* executed once */
|
||||
{
|
||||
Boolean Bool_Loc;
|
||||
|
||||
Bool_Loc = Ch_1_Glob == 'A';
|
||||
Bool_Glob = Bool_Loc | Bool_Glob;
|
||||
Ch_2_Glob = 'B';
|
||||
} /* Proc_4 */
|
||||
|
||||
|
||||
void Proc_5() /* without parameters */
|
||||
/*******/
|
||||
/* executed once */
|
||||
{
|
||||
Ch_1_Glob = 'A';
|
||||
Bool_Glob = false;
|
||||
} /* Proc_5 */
|
||||
|
||||
|
||||
#ifndef __HSHOT__
|
||||
/* Procedure for the assignment of structures, */
|
||||
/* if the C compiler doesn't support this feature */
|
||||
#ifdef NOSTRUCTASSIGN
|
||||
memcpy (d, s, l)
|
||||
register char *d;
|
||||
register char *s;
|
||||
register int l;
|
||||
{
|
||||
while (l--) *d++ = *s++;
|
||||
}
|
||||
#endif
|
||||
#endif // __HSHOT__
|
185
dhry_2.c
Normal file
185
dhry_2.c
Normal file
@ -0,0 +1,185 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
*
|
||||
* "DHRYSTONE" Benchmark Program
|
||||
* -----------------------------
|
||||
*
|
||||
* Version: C, Version 2.1
|
||||
*
|
||||
* File: dhry_2.c (part 3 of 3)
|
||||
*
|
||||
* Date: May 25, 1988
|
||||
*
|
||||
* Author: Reinhold P. Weicker
|
||||
*
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
#include "dhry.h"
|
||||
|
||||
#ifndef REG
|
||||
#define REG
|
||||
/* REG becomes defined as empty */
|
||||
/* i.e. no register variables */
|
||||
#else
|
||||
#define REG register
|
||||
#endif
|
||||
|
||||
extern int Int_Glob;
|
||||
extern char Ch_1_Glob;
|
||||
|
||||
Boolean Func_3(Enumeration Enum_Par_Val);
|
||||
|
||||
void Proc_6(Enumeration Enum_Val_Par, Enumeration *Enum_Ref_Par)
|
||||
/*********************************/
|
||||
/* executed once */
|
||||
/* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */
|
||||
|
||||
{
|
||||
*Enum_Ref_Par = Enum_Val_Par;
|
||||
if (!Func_3(Enum_Val_Par))
|
||||
/* then, not executed */
|
||||
*Enum_Ref_Par = Ident_4;
|
||||
switch (Enum_Val_Par) {
|
||||
case Ident_1:
|
||||
*Enum_Ref_Par = Ident_1;
|
||||
break;
|
||||
case Ident_2:
|
||||
if (Int_Glob > 100)
|
||||
/* then */
|
||||
*Enum_Ref_Par = Ident_1;
|
||||
else *Enum_Ref_Par = Ident_4;
|
||||
break;
|
||||
case Ident_3: /* executed */
|
||||
*Enum_Ref_Par = Ident_2;
|
||||
break;
|
||||
case Ident_4:
|
||||
break;
|
||||
case Ident_5:
|
||||
*Enum_Ref_Par = Ident_3;
|
||||
break;
|
||||
} /* switch */
|
||||
} /* Proc_6 */
|
||||
|
||||
|
||||
void Proc_7(One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val,
|
||||
One_Fifty *Int_Par_Ref)
|
||||
/**********************************************/
|
||||
/* executed three times */
|
||||
/* first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, */
|
||||
/* Int_Par_Ref becomes 7 */
|
||||
/* second call: Int_1_Par_Val == 10, Int_2_Par_Val == 5, */
|
||||
/* Int_Par_Ref becomes 17 */
|
||||
/* third call: Int_1_Par_Val == 6, Int_2_Par_Val == 10, */
|
||||
/* Int_Par_Ref becomes 18 */
|
||||
|
||||
{
|
||||
One_Fifty Int_Loc;
|
||||
|
||||
Int_Loc = Int_1_Par_Val + 2;
|
||||
*Int_Par_Ref = Int_2_Par_Val + Int_Loc;
|
||||
} /* Proc_7 */
|
||||
|
||||
|
||||
void Proc_8(Arr_1_Dim Arr_1_Par_Ref, Arr_2_Dim Arr_2_Par_Ref,
|
||||
int Int_1_Par_Val, int Int_2_Par_Val)
|
||||
/*********************************************************************/
|
||||
/* executed once */
|
||||
/* Int_Par_Val_1 == 3 */
|
||||
/* Int_Par_Val_2 == 7 */
|
||||
|
||||
{
|
||||
REG One_Fifty Int_Index;
|
||||
REG One_Fifty Int_Loc;
|
||||
|
||||
Int_Loc = Int_1_Par_Val + 5;
|
||||
Arr_1_Par_Ref[Int_Loc] = Int_2_Par_Val;
|
||||
Arr_1_Par_Ref[Int_Loc + 1] = Arr_1_Par_Ref[Int_Loc];
|
||||
Arr_1_Par_Ref[Int_Loc + 30] = Int_Loc;
|
||||
for (Int_Index = Int_Loc; Int_Index <= Int_Loc + 1; ++Int_Index)
|
||||
Arr_2_Par_Ref[Int_Loc][Int_Index] = Int_Loc;
|
||||
Arr_2_Par_Ref[Int_Loc][Int_Loc - 1] += 1;
|
||||
Arr_2_Par_Ref[Int_Loc + 20][Int_Loc] = Arr_1_Par_Ref[Int_Loc];
|
||||
Int_Glob = 5;
|
||||
} /* Proc_8 */
|
||||
|
||||
|
||||
Enumeration Func_1(Capital_Letter Ch_1_Par_Val,
|
||||
Capital_Letter Ch_2_Par_Val)
|
||||
/*************************************************/
|
||||
/* executed three times */
|
||||
/* first call: Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R' */
|
||||
/* second call: Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C' */
|
||||
/* third call: Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C' */
|
||||
|
||||
{
|
||||
Capital_Letter Ch_1_Loc;
|
||||
Capital_Letter Ch_2_Loc;
|
||||
|
||||
Ch_1_Loc = Ch_1_Par_Val;
|
||||
Ch_2_Loc = Ch_1_Loc;
|
||||
if (Ch_2_Loc != Ch_2_Par_Val)
|
||||
/* then, executed */
|
||||
return (Ident_1);
|
||||
else /* not executed */
|
||||
{
|
||||
Ch_1_Glob = Ch_1_Loc;
|
||||
return (Ident_2);
|
||||
}
|
||||
} /* Func_1 */
|
||||
|
||||
|
||||
Boolean Func_2(Str_30 Str_1_Par_Ref, Str_30 Str_2_Par_Ref)
|
||||
/*************************************************/
|
||||
/* executed once */
|
||||
/* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */
|
||||
/* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */
|
||||
|
||||
{
|
||||
REG One_Thirty Int_Loc;
|
||||
Capital_Letter Ch_Loc;
|
||||
|
||||
Int_Loc = 2;
|
||||
while (Int_Loc <= 2) /* loop body executed once */
|
||||
if (Func_1(Str_1_Par_Ref[Int_Loc],
|
||||
Str_2_Par_Ref[Int_Loc + 1]) == Ident_1)
|
||||
/* then, executed */
|
||||
{
|
||||
Ch_Loc = 'A';
|
||||
Int_Loc += 1;
|
||||
} /* if, while */
|
||||
if (Ch_Loc >= 'W' && Ch_Loc < 'Z')
|
||||
/* then, not executed */
|
||||
Int_Loc = 7;
|
||||
if (Ch_Loc == 'R')
|
||||
/* then, not executed */
|
||||
return (true);
|
||||
else /* executed */
|
||||
{
|
||||
if (strcmp(Str_1_Par_Ref, Str_2_Par_Ref) > 0)
|
||||
/* then, not executed */
|
||||
{
|
||||
Int_Loc += 7;
|
||||
Int_Glob = Int_Loc;
|
||||
return (true);
|
||||
} else /* executed */
|
||||
return (false);
|
||||
} /* if Ch_Loc */
|
||||
} /* Func_2 */
|
||||
|
||||
|
||||
Boolean Func_3(Enumeration Enum_Par_Val)
|
||||
/***************************/
|
||||
/* executed once */
|
||||
/* Enum_Par_Val == Ident_3 */
|
||||
|
||||
{
|
||||
Enumeration Enum_Loc;
|
||||
|
||||
Enum_Loc = Enum_Par_Val;
|
||||
if (Enum_Loc == Ident_3)
|
||||
/* then, executed */
|
||||
return (true);
|
||||
else /* not executed */
|
||||
return (false);
|
||||
} /* Func_3 */
|
Loading…
Reference in New Issue
Block a user