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