home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / test / benchpfc.src < prev    next >
Encoding:
Text File  |  1988-05-03  |  79.4 KB  |  3,150 lines

  1. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. --whetpasa.pas
  3. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4. PROGRAM Whetpasa(Input, Output, Whetpasa);
  5.   VAR Whetpasa: TEXT;
  6.  
  7.   { Filename: WHETPASA.PAS }
  8.  
  9.   { PASCAL version of Whetstone Benchmark Program.               }
  10.   {        (With stubbed MATH lib NO CHECK)                      }
  11.   { Reference: "Computer Journal," February 1976, pages 43-49,   }
  12.   {            for description of benchmark and ALGOL60 version. }
  13.   { Note: Procedure POUT is omitted.                             }
  14.  
  15.   PROCEDURE Whetstone(I, NumOfCycles: INTEGER;
  16.                       VAR StartTime, StopTime: INTEGER);
  17.  
  18.     TYPE VECTOR = ARRAY[1..4] OF REAL;
  19.  
  20.     VAR
  21.       X1,X2,X3,X4,X,Y,Z,T,T1,T2: REAL;
  22.       E1: VECTOR;
  23.       J,K,L,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11: INTEGER;
  24.       CycleNumber: INTEGER;
  25.  
  26.   {Uncomment following function to run benchmark with math library stubbed off}
  27.  
  28.       FUNCTION MYSTUB(X: REAL): REAL; 
  29.         BEGIN                         
  30.           MYSTUB:= 1.0;              
  31.         END;                         
  32.  
  33.       PROCEDURE PA(VAR E: VECTOR);
  34.         LABEL 1;
  35.         VAR J: INTEGER;
  36.         BEGIN
  37.           J:= 0;
  38.           1:
  39.           E[1]:= (E[1]+E[2]+E[3]-E[4])*T;
  40.           E[2]:= (E[1]+E[2]-E[3]+E[4])*T;
  41.           E[3]:= (E[1]-E[2]+E[3]+E[4])*T;
  42.           E[4]:= (-E[1]+E[2]+E[3]+E[4])/T2;
  43.           J:= J+1;
  44.           IF J < 6 THEN
  45.              GOTO 1;
  46.         END; { PA }
  47.  
  48.       PROCEDURE P0;
  49.         BEGIN
  50.           E1[J]:= E1[K];
  51.           E1[K]:= E1[L];
  52.           E1[L]:= E1[J];
  53.         END; { P0 }
  54.  
  55.       PROCEDURE P3(X, Y: REAL; VAR Z: REAL);
  56.         BEGIN
  57.           X:= T*(X+Y);
  58.           Y:= T*(X+Y);
  59.           Z:= (X+Y)/T2;
  60.         END; { P3 }
  61.  
  62.     BEGIN { Whetstone }
  63.       { Initialize constants }
  64.       T:= 0.499975;
  65.       T1:= 0.50025;
  66.       T2:= 2.0;
  67.  
  68.       { Compute execution frequencies for benchmark modules }
  69.       N1:= 0;    { Module 1 not executed }
  70.       N2:= 12*I;
  71.       N3:= 14*I;
  72.       N4:= 345*I;
  73.       N5:= 0;    { Module 5 not executed }
  74.       N6:= 210*I;
  75.       N7:= 32*I;
  76.       N8:= 899*I;
  77.       N9:= 616*I;
  78.       N10:= 0;   { Module 10 not executed }
  79.       N11:= 93*I;
  80.  
  81.       StartTime:= CLOCK; { Get current CPU time in milliseconds }
  82.  
  83.       FOR CycleNumber:= 1 TO NumOfCycles DO
  84.         BEGIN { Main loop }
  85.           { Module 1: simple identifiers }
  86.           X1:= 1.0;
  87.           X2:= -1.0;
  88.           X3:= -1.0;
  89.           X4:= -1.0;
  90.           FOR I:= 1 TO N1 DO
  91.             BEGIN
  92.               X1:= (X1+X2+X3-X4)*T;
  93.               X2:= (X1+X2-X3+X4)*T;
  94.               X3:= (X1-X2+X3+X4)*T;
  95.               X4:= (-X1+X2+X3+X4)*T;
  96.             END; { Module 1 }
  97.  
  98.           { Module 2: array elements }
  99.           E1[1]:= 1.0;
  100.           E1[2]:= -1.0;
  101.           E1[3]:= -1.0;
  102.           E1[4]:= -1.0;
  103.           FOR I:= 1 TO N2 DO
  104.             BEGIN
  105.               E1[1]:= (E1[1]+E1[2]+E1[3]-E1[4])*T;
  106.               E1[2]:= (E1[1]+E1[2]-E1[3]+E1[4])*T;
  107.               E1[3]:= (E1[1]-E1[2]+E1[3]+E1[4])*T;
  108.               E1[4]:= (-E1[1]+E1[2]+E1[3]+E1[4])*T;
  109.             END; { Module 2 }
  110.  
  111.           { Module 3: array as parameter }
  112.           FOR I:= 1 TO N3 DO
  113.             PA(E1);
  114.           { End Module 3 }
  115.  
  116.           { Module 4: conditional jumps }
  117.           J:= 1;
  118.           FOR I:= 1 TO N4 DO
  119.             BEGIN
  120.               IF J = 1 THEN
  121.                  J:= 2
  122.               ELSE
  123.                  J:= 3;
  124.               IF J > 2 THEN
  125.                  J:= 0
  126.               ELSE
  127.                  J:= 1;
  128.               IF J < 1 THEN
  129.                  J:= 1
  130.               ELSE
  131.                  J:= 0;
  132.             END; { Module 4 }
  133.  
  134.           { Module 5: omitted }
  135.  
  136.           { Module 6: integer arithmetic }
  137.           J:= 1;
  138.           K:= 2;
  139.           L:= 3;
  140.           FOR I:= 1 TO N6 DO
  141.             BEGIN
  142.               J:= J*(K-J)*(L-K);
  143.               K:= L*K-(L-J)*K;
  144.               L:= (L-K)*(K+J);
  145.               E1[L-1]:= J+K+L;
  146.               E1[K-1]:= J*K*L;
  147.             END; { Module 6 }
  148.  
  149.           { Module 7: trigonometric functions }
  150.           X:= 0.5;
  151.           Y:= 0.5;
  152.           FOR I:= 1 TO N7 DO
  153.            BEGIN
  154.     { Comment out next 2 lines to run benchmark with math library stubbed off }
  155.     {      X:= T*ARCTAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0));            }
  156.     {      Y:= T*ARCTAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0));            }
  157.  
  158.     { Uncomment next 2 lines to run benchmark with math library stubbed off }
  159.           X:= T*MYSTUB(T2*MYSTUB(X)*MYSTUB(X)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));
  160.           Y:= T*MYSTUB(T2*MYSTUB(Y)*MYSTUB(Y)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));
  161.            END; { Module 7 }
  162.  
  163.           { Module 8: procedure calls }
  164.           X:= 1.0;
  165.           Y:= 1.0;
  166.           Z:= 1.0;
  167.           FOR I:= 1 TO N8 DO
  168.             P3(X,Y,Z);
  169.           { End Module 8 }
  170.  
  171.           { Module 9: array references }
  172.           J:= 1;
  173.           K:= 2;
  174.           L:= 3;
  175.           E1[1]:= 1.0;
  176.           E1[2]:= 2.0;
  177.           E1[3]:= 3.0;
  178.           FOR I:= 1 TO N9 DO
  179.             P0;
  180.           { End Module 9 }
  181.  
  182.           { Module 10: integer arithmetic }
  183.           J:= 2;
  184.           K:= 3;
  185.           FOR I:= 1 TO N10 DO
  186.             BEGIN
  187.               J:= J+K;
  188.               K:= J+K;
  189.               J:= K-J;
  190.               K:= K-J-J;
  191.             END; { Module 10 }
  192.  
  193.           { Module 11: standard functions }
  194.           X:= 0.75;
  195.           FOR I:= 1 TO N11 DO
  196.     { Comment out next line to run benchmark with math library stubbed off }
  197.     {       X:= SQRT(EXP(LN(X)/T1));                                       }
  198.  
  199.     { Uncomment next line to run benchmark with library stubbed off }
  200.             X:= MYSTUB(MYSTUB(MYSTUB(X)/T1)); 
  201.           { End Module 11 }
  202.         END; { Main loop }
  203.  
  204.       StopTime:= CLOCK; { Get current CPU time in milliseconds }
  205.  
  206.     END; { Whetstone }
  207.  
  208.  
  209.  
  210.   PROCEDURE ComputeKWIPS;
  211.     VAR
  212.       NumOfRuns, NumOfCycles, StartTime, StopTime,
  213.       IntRating, ElapsedTime, RunNumber, I: INTEGER;
  214.       MeanTime, MeanRating, Rating: REAL;
  215.  
  216.     BEGIN
  217.       REWRITE(Whetpasa);
  218.       WRITELN(Whetpasa,' PASCAL Whetstone benchmark(with stubbed MATH lib no check)');
  219.       WRITELN(Whetpasa);
  220.       WRITELN; WRITELN(' PASCAL Whetstone benchmark(with stubbed MATH lib no check)');
  221.       WRITELN;
  222.  
  223.       MeanTime:= 0.0;
  224.       MeanRating:= 0.0;
  225.       NumOfCycles:= 10;
  226.       NumOfRuns:= 5;
  227.       I:= 10;
  228.  
  229.       FOR RunNumber:= 1 TO NumOfRuns DO
  230.         BEGIN { Main loop }
  231.           Whetstone(I, NumOfCycles, StartTime, StopTime);
  232.  
  233.           WRITELN; WRITELN(' Whetstone CPU start time: ',StartTime:8,
  234.                            ' milliseconds');
  235.           WRITELN(Whetpasa); WRITELN(Whetpasa,' Whetstone CPU start time: ',
  236.                                      StartTime:8,' milliseconds');
  237.  
  238.           WRITELN; WRITELN(' Whetstone CPU stop time: ',StopTime:8,
  239.                            ' milliseconds');
  240.           WRITELN(Whetpasa); WRITELN(Whetpasa,' Whetstone CPU stop time: ',
  241.                                      StopTime:8,' milliseconds');
  242.  
  243.           ElapsedTime:= StopTime - StartTime;
  244.           WRITELN; WRITELN(' Elapsed CPU time for ',NumOfCycles:3,' cycles: ',
  245.                            ElapsedTime:8,' milliseconds');
  246.           WRITELN(Whetpasa); WRITELN(Whetpasa,' Elapsed CPU time for ',
  247.                       NumOfCycles:3,' cycles: ',ElapsedTime:8,' milliseconds');
  248.  
  249.       { Sum time in milliseconds per cycle }
  250.       MeanTime:= MeanTime + (ElapsedTime/NumOfCycles);
  251.  
  252.           Rating:= (1000.0*1000.0*NumOfCycles)/ElapsedTime;
  253.  
  254.       { Sum Whetstone rating }
  255.           MeanRating:= MeanRating + Rating;
  256.           IntRating:= ROUND(Rating);
  257.           WRITELN;WRITELN(' Whetstone rating: ',IntRating:5,' KWIPS');WRITELN;
  258.           WRITELN(Whetpasa);WRITELN(Whetpasa,' Whetstone rating: ',IntRating:5,
  259.                                     ' KWIPS');WRITELN(Whetpasa);
  260.  
  261.           NumOfCycles:= NumOfCycles + 10;
  262.         END; { Main loop }
  263.  
  264.         MeanTime:= MeanTime/NumOfRuns;
  265.         WRITELN; WRITELN(' Average time per cycle: ',MeanTime:11:2,
  266.                          ' milliseconds');
  267.         WRITELN(Whetpasa); WRITELN(Whetpasa,' Average time per cycle: ',
  268.                                    MeanTime:11:2,' milliseconds');
  269.  
  270.         MeanRating:= MeanRating/NumOfRuns;
  271.         IntRating:= ROUND(MeanRating);
  272.         WRITELN; WRITELN(' Average Whetstone rating: ',IntRating:5,' KWIPS');
  273.         WRITELN(Whetpasa); WRITELN(Whetpasa,' Average Whetstone rating: ',
  274.                                    IntRating:5,' KWIPS');
  275.         CLOSE(Whetpasa);
  276.  
  277.     END; { ComputeKWIPS }
  278.  
  279.   BEGIN { Mainline }
  280.     ComputeKWIPS;
  281.   END. { Mainline }
  282. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  283. --whetpasb.pas
  284. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  285. PROGRAM Whetpasb(Input, Output, Whetpasb);
  286.   VAR Whetpasb: TEXT;
  287.  
  288.   { Filename: WHETPASB.PAS }
  289.  
  290.   { PASCAL version of Whetstone Benchmark Program.               }
  291.   {        (with stubbed MATH lib with check)                    }
  292.   { Reference: "Computer Journal," February 1976, pages 43-49,   }
  293.   {            for description of benchmark and ALGOL60 version. }
  294.   { Note: Procedure POUT is omitted.                             }
  295.  
  296.   PROCEDURE Whetstone(I, NumOfCycles: INTEGER;
  297.                       VAR StartTime, StopTime: INTEGER);
  298.  
  299.     TYPE VECTOR = ARRAY[1..4] OF REAL;
  300.  
  301.     VAR
  302.       X1,X2,X3,X4,X,Y,Z,T,T1,T2: REAL;
  303.       E1: VECTOR;
  304.       J,K,L,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11: INTEGER;
  305.       CycleNumber: INTEGER;
  306.  
  307.   {Uncomment following function to run benchmark with math library stubbed off}
  308.  
  309.       FUNCTION MYSTUB(X: REAL): REAL; 
  310.         BEGIN              
  311.           MYSTUB:= 1.0;
  312.         END;
  313.  
  314.       PROCEDURE PA(VAR E: VECTOR);
  315.         LABEL 1;
  316.         VAR J: INTEGER;
  317.         BEGIN
  318.           J:= 0;
  319.           1:
  320.           E[1]:= (E[1]+E[2]+E[3]-E[4])*T;
  321.           E[2]:= (E[1]+E[2]-E[3]+E[4])*T;
  322.           E[3]:= (E[1]-E[2]+E[3]+E[4])*T;
  323.           E[4]:= (-E[1]+E[2]+E[3]+E[4])/T2;
  324.           J:= J+1;
  325.           IF J < 6 THEN
  326.              GOTO 1;
  327.         END; { PA }
  328.  
  329.       PROCEDURE P0;
  330.         BEGIN
  331.           E1[J]:= E1[K];
  332.           E1[K]:= E1[L];
  333.           E1[L]:= E1[J];
  334.         END; { P0 }
  335.  
  336.       PROCEDURE P3(X, Y: REAL; VAR Z: REAL);
  337.         BEGIN
  338.           X:= T*(X+Y);
  339.           Y:= T*(X+Y);
  340.           Z:= (X+Y)/T2;
  341.         END; { P3 }
  342.  
  343.     BEGIN { Whetstone }
  344.       { Initialize constants }
  345.       T:= 0.499975;
  346.       T1:= 0.50025;
  347.       T2:= 2.0;
  348.  
  349.       { Compute execution frequencies for benchmark modules }
  350.       N1:= 0;    { Module 1 not executed }
  351.       N2:= 12*I;
  352.       N3:= 14*I;
  353.       N4:= 345*I;
  354.       N5:= 0;    { Module 5 not executed }
  355.       N6:= 210*I;
  356.       N7:= 32*I;
  357.       N8:= 899*I;
  358.       N9:= 616*I;
  359.       N10:= 0;   { Module 10 not executed }
  360.       N11:= 93*I;
  361.  
  362.       StartTime:= CLOCK; { Get current CPU time in milliseconds }
  363.  
  364.       FOR CycleNumber:= 1 TO NumOfCycles DO
  365.         BEGIN { Main loop }
  366.           { Module 1: simple identifiers }
  367.           X1:= 1.0;
  368.           X2:= -1.0;
  369.           X3:= -1.0;
  370.           X4:= -1.0;
  371.           FOR I:= 1 TO N1 DO
  372.             BEGIN
  373.               X1:= (X1+X2+X3-X4)*T;
  374.               X2:= (X1+X2-X3+X4)*T;
  375.               X3:= (X1-X2+X3+X4)*T;
  376.               X4:= (-X1+X2+X3+X4)*T;
  377.             END; { Module 1 }
  378.  
  379.           { Module 2: array elements }
  380.           E1[1]:= 1.0;
  381.           E1[2]:= -1.0;
  382.           E1[3]:= -1.0;
  383.           E1[4]:= -1.0;
  384.           FOR I:= 1 TO N2 DO
  385.             BEGIN
  386.               E1[1]:= (E1[1]+E1[2]+E1[3]-E1[4])*T;
  387.               E1[2]:= (E1[1]+E1[2]-E1[3]+E1[4])*T;
  388.               E1[3]:= (E1[1]-E1[2]+E1[3]+E1[4])*T;
  389.               E1[4]:= (-E1[1]+E1[2]+E1[3]+E1[4])*T;
  390.             END; { Module 2 }
  391.  
  392.           { Module 3: array as parameter }
  393.           FOR I:= 1 TO N3 DO
  394.             PA(E1);
  395.           { End Module 3 }
  396.  
  397.           { Module 4: conditional jumps }
  398.           J:= 1;
  399.           FOR I:= 1 TO N4 DO
  400.             BEGIN
  401.               IF J = 1 THEN
  402.                  J:= 2
  403.               ELSE
  404.                  J:= 3;
  405.               IF J > 2 THEN
  406.                  J:= 0
  407.               ELSE
  408.                  J:= 1;
  409.               IF J < 1 THEN
  410.                  J:= 1
  411.               ELSE
  412.                  J:= 0;
  413.             END; { Module 4 }
  414.  
  415.           { Module 5: omitted }
  416.  
  417.           { Module 6: integer arithmetic }
  418.           J:= 1;
  419.           K:= 2;
  420.           L:= 3;
  421.           FOR I:= 1 TO N6 DO
  422.             BEGIN
  423.               J:= J*(K-J)*(L-K);
  424.               K:= L*K-(L-J)*K;
  425.               L:= (L-K)*(K+J);
  426.               E1[L-1]:= J+K+L;
  427.               E1[K-1]:= J*K*L;
  428.             END; { Module 6 }
  429.  
  430.           { Module 7: trigonometric functions }
  431.           X:= 0.5;
  432.           Y:= 0.5;
  433.           FOR I:= 1 TO N7 DO
  434.            BEGIN
  435.     { Comment out next 2 lines to run benchmark with math library stubbed off }
  436.     {      X:= T*ARCTAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0));            }
  437.     {      Y:= T*ARCTAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0));            }
  438.  
  439.     { Uncomment next 2 lines to run benchmark with math library stubbed off }
  440.            X:= T*MYSTUB(T2*MYSTUB(X)*MYSTUB(X)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));
  441.            Y:= T*MYSTUB(T2*MYSTUB(Y)*MYSTUB(Y)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));
  442.            END; { Module 7 }
  443.  
  444.           { Module 8: procedure calls }
  445.           X:= 1.0;
  446.           Y:= 1.0;
  447.           Z:= 1.0;
  448.           FOR I:= 1 TO N8 DO
  449.             P3(X,Y,Z);
  450.           { End Module 8 }
  451.  
  452.           { Module 9: array references }
  453.           J:= 1;
  454.           K:= 2;
  455.           L:= 3;
  456.           E1[1]:= 1.0;
  457.           E1[2]:= 2.0;
  458.           E1[3]:= 3.0;
  459.           FOR I:= 1 TO N9 DO
  460.             P0;
  461.           { End Module 9 }
  462.  
  463.           { Module 10: integer arithmetic }
  464.           J:= 2;
  465.           K:= 3;
  466.           FOR I:= 1 TO N10 DO
  467.             BEGIN
  468.               J:= J+K;
  469.               K:= J+K;
  470.               J:= K-J;
  471.               K:= K-J-J;
  472.             END; { Module 10 }
  473.  
  474.           { Module 11: standard functions }
  475.           X:= 0.75;
  476.           FOR I:= 1 TO N11 DO
  477.     { Comment out next line to run benchmark with math library stubbed off }
  478.             {X:= SQRT(EXP(LN(X)/T1));                                      }
  479.  
  480.     { Uncomment next line to run benchmark with library stubbed off }
  481.             X:= MYSTUB(MYSTUB(MYSTUB(X)/T1)); 
  482.           { End Module 11 }
  483.         END; { Main loop }
  484.  
  485.       StopTime:= CLOCK; { Get current CPU time in milliseconds }
  486.  
  487.     END; { Whetstone }
  488.  
  489.  
  490.  
  491.   PROCEDURE ComputeKWIPS;
  492.     VAR
  493.       NumOfRuns, NumOfCycles, StartTime, StopTime,
  494.       IntRating, ElapsedTime, RunNumber, I: INTEGER;
  495.       MeanTime, MeanRating, Rating: REAL;
  496.  
  497.     BEGIN
  498.       REWRITE(Whetpasb);
  499.       WRITELN(Whetpasb,' PASCAL Whetstone benchmark(with stubbed MATH lib with check)');
  500.       WRITELN(Whetpasb);
  501.       WRITELN; WRITELN(' PASCAL Whetstone benchmark(with stubbed MATH lib with check)');
  502.       WRITELN;
  503.  
  504.       MeanTime:= 0.0;
  505.       MeanRating:= 0.0;
  506.       NumOfCycles:= 10;
  507.       NumOfRuns:= 5;
  508.       I:= 10;
  509.  
  510.       FOR RunNumber:= 1 TO NumOfRuns DO
  511.         BEGIN { Main loop }
  512.           Whetstone(I, NumOfCycles, StartTime, StopTime);
  513.  
  514.           WRITELN; WRITELN(' Whetstone CPU start time: ',StartTime:8,
  515.                            ' milliseconds');
  516.           WRITELN(Whetpasb); WRITELN(Whetpasb,' Whetstone CPU start time: ',
  517.                                      StartTime:8,' milliseconds');
  518.  
  519.           WRITELN; WRITELN(' Whetstone CPU stop time: ',StopTime:8,
  520.                            ' milliseconds');
  521.           WRITELN(Whetpasb); WRITELN(Whetpasb,' Whetstone CPU stop time: ',
  522.                                      StopTime:8,' milliseconds');
  523.  
  524.           ElapsedTime:= StopTime - StartTime;
  525.           WRITELN; WRITELN(' Elapsed CPU time for ',NumOfCycles:3,' cycles: ',
  526.                            ElapsedTime:8,' milliseconds');
  527.           WRITELN(Whetpasb); WRITELN(Whetpasb,' Elapsed CPU time for ',
  528.                       NumOfCycles:3,' cycles: ',ElapsedTime:8,' milliseconds');
  529.  
  530.       { Sum time in milliseconds per cycle }
  531.       MeanTime:= MeanTime + (ElapsedTime/NumOfCycles);
  532.  
  533.           Rating:= (1000.0*1000.0*NumOfCycles)/ElapsedTime;
  534.  
  535.       { Sum Whetstone rating }
  536.           MeanRating:= MeanRating + Rating;
  537.           IntRating:= ROUND(Rating);
  538.           WRITELN;WRITELN(' Whetstone rating: ',IntRating:5,' KWIPS');WRITELN;
  539.           WRITELN(Whetpasb);WRITELN(Whetpasb,' Whetstone rating: ',IntRating:5,
  540.                                     ' KWIPS');WRITELN(Whetpasb);
  541.  
  542.           NumOfCycles:= NumOfCycles + 10;
  543.         END; { Main loop }
  544.  
  545.         MeanTime:= MeanTime/NumOfRuns;
  546.         WRITELN; WRITELN(' Average time per cycle: ',MeanTime:11:2,
  547.                          ' milliseconds');
  548.         WRITELN(Whetpasb); WRITELN(Whetpasb,' Average time per cycle: ',
  549.                                    MeanTime:11:2,' milliseconds');
  550.  
  551.         MeanRating:= MeanRating/NumOfRuns;
  552.         IntRating:= ROUND(MeanRating);
  553.         WRITELN; WRITELN(' Average Whetstone rating: ',IntRating:5,' KWIPS');
  554.         WRITELN(Whetpasb); WRITELN(Whetpasb,' Average Whetstone rating: ',
  555.                                    IntRating:5,' KWIPS');
  556.         CLOSE(Whetpasb);
  557.  
  558.     END; { ComputeKWIPS }
  559.  
  560.   BEGIN { Mainline }
  561.     ComputeKWIPS;
  562.   END. { Mainline }
  563. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  564. --whetpasc.pas
  565. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  566. PROGRAM Whetpasc(Input, Output, Whetpasc);
  567.   VAR Whetpasc: TEXT;
  568.  
  569.   { Filename: Whetpasc.PAS }
  570.  
  571.   { PASCAL version of Whetstone Benchmark Program.               }
  572.   {        (with MATH lib no check)                              }
  573.   { Reference: "Computer Journal," February 1976, pages 43-49,   }
  574.   {            for description of benchmark and ALGOL60 version. }
  575.   { Note: Procedure POUT is omitted.                             }
  576.  
  577.   PROCEDURE Whetstone(I, NumOfCycles: INTEGER;
  578.                       VAR StartTime, StopTime: INTEGER);
  579.  
  580.     TYPE VECTOR = ARRAY[1..4] OF REAL;
  581.  
  582.     VAR
  583.       X1,X2,X3,X4,X,Y,Z,T,T1,T2: REAL;
  584.       E1: VECTOR;
  585.       J,K,L,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11: INTEGER;
  586.       CycleNumber: INTEGER;
  587.  
  588.   {Uncomment following function to run benchmark with math library stubbed off}
  589.  
  590.     { FUNCTION MYSTUB(X: REAL): REAL; }
  591.     {   BEGIN                         }
  592.     {     MYSTUB:= 1.0;               }
  593.     {   END;                          }
  594.  
  595.       PROCEDURE PA(VAR E: VECTOR);
  596.         LABEL 1;
  597.         VAR J: INTEGER;
  598.         BEGIN
  599.           J:= 0;
  600.           1:
  601.           E[1]:= (E[1]+E[2]+E[3]-E[4])*T;
  602.           E[2]:= (E[1]+E[2]-E[3]+E[4])*T;
  603.           E[3]:= (E[1]-E[2]+E[3]+E[4])*T;
  604.           E[4]:= (-E[1]+E[2]+E[3]+E[4])/T2;
  605.           J:= J+1;
  606.           IF J < 6 THEN
  607.              GOTO 1;
  608.         END; { PA }
  609.  
  610.       PROCEDURE P0;
  611.         BEGIN
  612.           E1[J]:= E1[K];
  613.           E1[K]:= E1[L];
  614.           E1[L]:= E1[J];
  615.         END; { P0 }
  616.  
  617.       PROCEDURE P3(X, Y: REAL; VAR Z: REAL);
  618.         BEGIN
  619.           X:= T*(X+Y);
  620.           Y:= T*(X+Y);
  621.           Z:= (X+Y)/T2;
  622.         END; { P3 }
  623.  
  624.     BEGIN { Whetstone }
  625.       { Initialize constants }
  626.       T:= 0.499975;
  627.       T1:= 0.50025;
  628.       T2:= 2.0;
  629.  
  630.       { Compute execution frequencies for benchmark modules }
  631.       N1:= 0;    { Module 1 not executed }
  632.       N2:= 12*I;
  633.       N3:= 14*I;
  634.       N4:= 345*I;
  635.       N5:= 0;    { Module 5 not executed }
  636.       N6:= 210*I;
  637.       N7:= 32*I;
  638.       N8:= 899*I;
  639.       N9:= 616*I;
  640.       N10:= 0;   { Module 10 not executed }
  641.       N11:= 93*I;
  642.  
  643.       StartTime:= CLOCK; { Get current CPU time in milliseconds }
  644.  
  645.       FOR CycleNumber:= 1 TO NumOfCycles DO
  646.         BEGIN { Main loop }
  647.           { Module 1: simple identifiers }
  648.           X1:= 1.0;
  649.           X2:= -1.0;
  650.           X3:= -1.0;
  651.           X4:= -1.0;
  652.           FOR I:= 1 TO N1 DO
  653.             BEGIN
  654.               X1:= (X1+X2+X3-X4)*T;
  655.               X2:= (X1+X2-X3+X4)*T;
  656.               X3:= (X1-X2+X3+X4)*T;
  657.               X4:= (-X1+X2+X3+X4)*T;
  658.             END; { Module 1 }
  659.  
  660.           { Module 2: array elements }
  661.           E1[1]:= 1.0;
  662.           E1[2]:= -1.0;
  663.           E1[3]:= -1.0;
  664.           E1[4]:= -1.0;
  665.           FOR I:= 1 TO N2 DO
  666.             BEGIN
  667.               E1[1]:= (E1[1]+E1[2]+E1[3]-E1[4])*T;
  668.               E1[2]:= (E1[1]+E1[2]-E1[3]+E1[4])*T;
  669.               E1[3]:= (E1[1]-E1[2]+E1[3]+E1[4])*T;
  670.               E1[4]:= (-E1[1]+E1[2]+E1[3]+E1[4])*T;
  671.             END; { Module 2 }
  672.  
  673.           { Module 3: array as parameter }
  674.           FOR I:= 1 TO N3 DO
  675.             PA(E1);
  676.           { End Module 3 }
  677.  
  678.           { Module 4: conditional jumps }
  679.           J:= 1;
  680.           FOR I:= 1 TO N4 DO
  681.             BEGIN
  682.               IF J = 1 THEN
  683.                  J:= 2
  684.               ELSE
  685.                  J:= 3;
  686.               IF J > 2 THEN
  687.                  J:= 0
  688.               ELSE
  689.                  J:= 1;
  690.               IF J < 1 THEN
  691.                  J:= 1
  692.               ELSE
  693.                  J:= 0;
  694.             END; { Module 4 }
  695.  
  696.           { Module 5: omitted }
  697.  
  698.           { Module 6: integer arithmetic }
  699.           J:= 1;
  700.           K:= 2;
  701.           L:= 3;
  702.           FOR I:= 1 TO N6 DO
  703.             BEGIN
  704.               J:= J*(K-J)*(L-K);
  705.               K:= L*K-(L-J)*K;
  706.               L:= (L-K)*(K+J);
  707.               E1[L-1]:= J+K+L;
  708.               E1[K-1]:= J*K*L;
  709.             END; { Module 6 }
  710.  
  711.           { Module 7: trigonometric functions }
  712.           X:= 0.5;
  713.           Y:= 0.5;
  714.           FOR I:= 1 TO N7 DO
  715.            BEGIN
  716.     { Comment out next 2 lines to run benchmark with math library stubbed off }
  717.            X:= T*ARCTAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0));
  718.            Y:= T*ARCTAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0));
  719.  
  720.     { Uncomment next 2 lines to run benchmark with math library stubbed off }
  721.           {X:= T*MYSTUB(T2*MYSTUB(X)*MYSTUB(X)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));}
  722.           {Y:= T*MYSTUB(T2*MYSTUB(Y)*MYSTUB(Y)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));}
  723.            END; { Module 7 }
  724.  
  725.           { Module 8: procedure calls }
  726.           X:= 1.0;
  727.           Y:= 1.0;
  728.           Z:= 1.0;
  729.           FOR I:= 1 TO N8 DO
  730.             P3(X,Y,Z);
  731.           { End Module 8 }
  732.  
  733.           { Module 9: array references }
  734.           J:= 1;
  735.           K:= 2;
  736.           L:= 3;
  737.           E1[1]:= 1.0;
  738.           E1[2]:= 2.0;
  739.           E1[3]:= 3.0;
  740.           FOR I:= 1 TO N9 DO
  741.             P0;
  742.           { End Module 9 }
  743.  
  744.           { Module 10: integer arithmetic }
  745.           J:= 2;
  746.           K:= 3;
  747.           FOR I:= 1 TO N10 DO
  748.             BEGIN
  749.               J:= J+K;
  750.               K:= J+K;
  751.               J:= K-J;
  752.               K:= K-J-J;
  753.             END; { Module 10 }
  754.  
  755.           { Module 11: standard functions }
  756.           X:= 0.75;
  757.           FOR I:= 1 TO N11 DO
  758.     { Comment out next line to run benchmark with math library stubbed off }
  759.             X:= SQRT(EXP(LN(X)/T1));
  760.  
  761.     { Uncomment next line to run benchmark with library stubbed off }
  762.           { X:= MYSTUB(MYSTUB(MYSTUB(X)/T1)); }
  763.           { End Module 11 }
  764.         END; { Main loop }
  765.  
  766.       StopTime:= CLOCK; { Get current CPU time in milliseconds }
  767.  
  768.     END; { Whetstone }
  769.  
  770.  
  771.  
  772.   PROCEDURE ComputeKWIPS;
  773.     VAR
  774.       NumOfRuns, NumOfCycles, StartTime, StopTime,
  775.       IntRating, ElapsedTime, RunNumber, I: INTEGER;
  776.       MeanTime, MeanRating, Rating: REAL;
  777.  
  778.     BEGIN
  779.       REWRITE(Whetpasc);
  780.       WRITELN(Whetpasc,' PASCAL Whetstone benchmark(with MATH lib NOCHECK)');
  781.       WRITELN(Whetpasc);
  782.       WRITELN; WRITELN(' PASCAL Whetstone benchmark(with MATH lib NOCHECK)');
  783.       WRITELN;
  784.  
  785.       MeanTime:= 0.0;
  786.       MeanRating:= 0.0;
  787.       NumOfCycles:= 10;
  788.       NumOfRuns:= 5;
  789.       I:= 10;
  790.  
  791.       FOR RunNumber:= 1 TO NumOfRuns DO
  792.         BEGIN { Main loop }
  793.           Whetstone(I, NumOfCycles, StartTime, StopTime);
  794.  
  795.           WRITELN; WRITELN(' Whetstone CPU start time: ',StartTime:8,
  796.                            ' milliseconds');
  797.           WRITELN(Whetpasc); WRITELN(Whetpasc,' Whetstone CPU start time: ',
  798.                                      StartTime:8,' milliseconds');
  799.  
  800.           WRITELN; WRITELN(' Whetstone CPU stop time: ',StopTime:8,
  801.                            ' milliseconds');
  802.           WRITELN(Whetpasc); WRITELN(Whetpasc,' Whetstone CPU stop time: ',
  803.                                      StopTime:8,' milliseconds');
  804.  
  805.           ElapsedTime:= StopTime - StartTime;
  806.           WRITELN; WRITELN(' Elapsed CPU time for ',NumOfCycles:3,' cycles: ',
  807.                            ElapsedTime:8,' milliseconds');
  808.           WRITELN(Whetpasc); WRITELN(Whetpasc,' Elapsed CPU time for ',
  809.                       NumOfCycles:3,' cycles: ',ElapsedTime:8,' milliseconds');
  810.  
  811.       { Sum time in milliseconds per cycle }
  812.       MeanTime:= MeanTime + (ElapsedTime/NumOfCycles);
  813.  
  814.           Rating:= (1000.0*1000.0*NumOfCycles)/ElapsedTime;
  815.  
  816.       { Sum Whetstone rating }
  817.           MeanRating:= MeanRating + Rating;
  818.           IntRating:= ROUND(Rating);
  819.           WRITELN;WRITELN(' Whetstone rating: ',IntRating:5,' KWIPS');WRITELN;
  820.           WRITELN(Whetpasc);WRITELN(Whetpasc,' Whetstone rating: ',IntRating:5,
  821.                                     ' KWIPS');WRITELN(Whetpasc);
  822.  
  823.           NumOfCycles:= NumOfCycles + 10;
  824.         END; { Main loop }
  825.  
  826.         MeanTime:= MeanTime/NumOfRuns;
  827.         WRITELN; WRITELN(' Average time per cycle: ',MeanTime:11:2,
  828.                          ' milliseconds');
  829.         WRITELN(Whetpasc); WRITELN(Whetpasc,' Average time per cycle: ',
  830.                                    MeanTime:11:2,' milliseconds');
  831.  
  832.         MeanRating:= MeanRating/NumOfRuns;
  833.         IntRating:= ROUND(MeanRating);
  834.         WRITELN; WRITELN(' Average Whetstone rating: ',IntRating:5,' KWIPS');
  835.         WRITELN(Whetpasc); WRITELN(Whetpasc,' Average Whetstone rating: ',
  836.                                    IntRating:5,' KWIPS');
  837.         CLOSE(Whetpasc);
  838.  
  839.     END; { ComputeKWIPS }
  840.  
  841.   BEGIN { Mainline }
  842.     ComputeKWIPS;
  843.   END. { Mainline }
  844. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  845. --whetpasd.pas
  846. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  847. PROGRAM Whetpasd(Input, Output, Whetpasd);
  848.   VAR Whetpasd: TEXT;
  849.  
  850.   { Filename: Whetpasd.PAS }
  851.  
  852.   { PASCAL version of Whetstone Benchmark Program.               }
  853.   {        (with MATH lib with CHECK)                            }
  854.   { Reference: "Computer Journal," February 1976, pages 43-49,   }
  855.   {            for description of benchmark and ALGOL60 version. }
  856.   { Note: Procedure POUT is omitted.                             }
  857.  
  858.   PROCEDURE Whetstone(I, NumOfCycles: INTEGER;
  859.                       VAR StartTime, StopTime: INTEGER);
  860.  
  861.     TYPE VECTOR = ARRAY[1..4] OF REAL;
  862.  
  863.     VAR
  864.       X1,X2,X3,X4,X,Y,Z,T,T1,T2: REAL;
  865.       E1: VECTOR;
  866.       J,K,L,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11: INTEGER;
  867.       CycleNumber: INTEGER;
  868.  
  869.   {Uncomment following function to run benchmark with math library stubbed off}
  870.  
  871.     { FUNCTION MYSTUB(X: REAL): REAL; }
  872.     {   BEGIN                         }
  873.     {     MYSTUB:= 1.0;               }
  874.     {   END;                          }
  875.  
  876.       PROCEDURE PA(VAR E: VECTOR);
  877.         LABEL 1;
  878.         VAR J: INTEGER;
  879.         BEGIN
  880.           J:= 0;
  881.           1:
  882.           E[1]:= (E[1]+E[2]+E[3]-E[4])*T;
  883.           E[2]:= (E[1]+E[2]-E[3]+E[4])*T;
  884.           E[3]:= (E[1]-E[2]+E[3]+E[4])*T;
  885.           E[4]:= (-E[1]+E[2]+E[3]+E[4])/T2;
  886.           J:= J+1;
  887.           IF J < 6 THEN
  888.              GOTO 1;
  889.         END; { PA }
  890.  
  891.       PROCEDURE P0;
  892.         BEGIN
  893.           E1[J]:= E1[K];
  894.           E1[K]:= E1[L];
  895.           E1[L]:= E1[J];
  896.         END; { P0 }
  897.  
  898.       PROCEDURE P3(X, Y: REAL; VAR Z: REAL);
  899.         BEGIN
  900.           X:= T*(X+Y);
  901.           Y:= T*(X+Y);
  902.           Z:= (X+Y)/T2;
  903.         END; { P3 }
  904.  
  905.     BEGIN { Whetstone }
  906.       { Initialize constants }
  907.       T:= 0.499975;
  908.       T1:= 0.50025;
  909.       T2:= 2.0;
  910.  
  911.       { Compute execution frequencies for benchmark modules }
  912.       N1:= 0;    { Module 1 not executed }
  913.       N2:= 12*I;
  914.       N3:= 14*I;
  915.       N4:= 345*I;
  916.       N5:= 0;    { Module 5 not executed }
  917.       N6:= 210*I;
  918.       N7:= 32*I;
  919.       N8:= 899*I;
  920.       N9:= 616*I;
  921.       N10:= 0;   { Module 10 not executed }
  922.       N11:= 93*I;
  923.  
  924.       StartTime:= CLOCK; { Get current CPU time in milliseconds }
  925.  
  926.       FOR CycleNumber:= 1 TO NumOfCycles DO
  927.         BEGIN { Main loop }
  928.           { Module 1: simple identifiers }
  929.           X1:= 1.0;
  930.           X2:= -1.0;
  931.           X3:= -1.0;
  932.           X4:= -1.0;
  933.           FOR I:= 1 TO N1 DO
  934.             BEGIN
  935.               X1:= (X1+X2+X3-X4)*T;
  936.               X2:= (X1+X2-X3+X4)*T;
  937.               X3:= (X1-X2+X3+X4)*T;
  938.               X4:= (-X1+X2+X3+X4)*T;
  939.             END; { Module 1 }
  940.  
  941.           { Module 2: array elements }
  942.           E1[1]:= 1.0;
  943.           E1[2]:= -1.0;
  944.           E1[3]:= -1.0;
  945.           E1[4]:= -1.0;
  946.           FOR I:= 1 TO N2 DO
  947.             BEGIN
  948.               E1[1]:= (E1[1]+E1[2]+E1[3]-E1[4])*T;
  949.               E1[2]:= (E1[1]+E1[2]-E1[3]+E1[4])*T;
  950.               E1[3]:= (E1[1]-E1[2]+E1[3]+E1[4])*T;
  951.               E1[4]:= (-E1[1]+E1[2]+E1[3]+E1[4])*T;
  952.             END; { Module 2 }
  953.  
  954.           { Module 3: array as parameter }
  955.           FOR I:= 1 TO N3 DO
  956.             PA(E1);
  957.           { End Module 3 }
  958.  
  959.           { Module 4: conditional jumps }
  960.           J:= 1;
  961.           FOR I:= 1 TO N4 DO
  962.             BEGIN
  963.               IF J = 1 THEN
  964.                  J:= 2
  965.               ELSE
  966.                  J:= 3;
  967.               IF J > 2 THEN
  968.                  J:= 0
  969.               ELSE
  970.                  J:= 1;
  971.               IF J < 1 THEN
  972.                  J:= 1
  973.               ELSE
  974.                  J:= 0;
  975.             END; { Module 4 }
  976.  
  977.           { Module 5: omitted }
  978.  
  979.           { Module 6: integer arithmetic }
  980.           J:= 1;
  981.           K:= 2;
  982.           L:= 3;
  983.           FOR I:= 1 TO N6 DO
  984.             BEGIN
  985.               J:= J*(K-J)*(L-K);
  986.               K:= L*K-(L-J)*K;
  987.               L:= (L-K)*(K+J);
  988.               E1[L-1]:= J+K+L;
  989.               E1[K-1]:= J*K*L;
  990.             END; { Module 6 }
  991.  
  992.           { Module 7: trigonometric functions }
  993.           X:= 0.5;
  994.           Y:= 0.5;
  995.           FOR I:= 1 TO N7 DO
  996.            BEGIN
  997.     { Comment out next 2 lines to run benchmark with math library stubbed off }
  998.            X:= T*ARCTAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0));
  999.            Y:= T*ARCTAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0));
  1000.  
  1001.     { Uncomment next 2 lines to run benchmark with math library stubbed off }
  1002.           {X:= T*MYSTUB(T2*MYSTUB(X)*MYSTUB(X)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));}
  1003.           {Y:= T*MYSTUB(T2*MYSTUB(Y)*MYSTUB(Y)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));}
  1004.            END; { Module 7 }
  1005.  
  1006.           { Module 8: procedure calls }
  1007.           X:= 1.0;
  1008.           Y:= 1.0;
  1009.           Z:= 1.0;
  1010.           FOR I:= 1 TO N8 DO
  1011.             P3(X,Y,Z);
  1012.           { End Module 8 }
  1013.  
  1014.           { Module 9: array references }
  1015.           J:= 1;
  1016.           K:= 2;
  1017.           L:= 3;
  1018.           E1[1]:= 1.0;
  1019.           E1[2]:= 2.0;
  1020.           E1[3]:= 3.0;
  1021.           FOR I:= 1 TO N9 DO
  1022.             P0;
  1023.           { End Module 9 }
  1024.  
  1025.           { Module 10: integer arithmetic }
  1026.           J:= 2;
  1027.           K:= 3;
  1028.           FOR I:= 1 TO N10 DO
  1029.             BEGIN
  1030.               J:= J+K;
  1031.               K:= J+K;
  1032.               J:= K-J;
  1033.               K:= K-J-J;
  1034.             END; { Module 10 }
  1035.  
  1036.           { Module 11: standard functions }
  1037.           X:= 0.75;
  1038.           FOR I:= 1 TO N11 DO
  1039.     { Comment out next line to run benchmark with math library stubbed off }
  1040.             X:= SQRT(EXP(LN(X)/T1));
  1041.  
  1042.     { Uncomment next line to run benchmark with library stubbed off }
  1043.           { X:= MYSTUB(MYSTUB(MYSTUB(X)/T1)); }
  1044.           { End Module 11 }
  1045.         END; { Main loop }
  1046.  
  1047.       StopTime:= CLOCK; { Get current CPU time in milliseconds }
  1048.  
  1049.     END; { Whetstone }
  1050.  
  1051.  
  1052.  
  1053.   PROCEDURE ComputeKWIPS;
  1054.     VAR
  1055.       NumOfRuns, NumOfCycles, StartTime, StopTime,
  1056.       IntRating, ElapsedTime, RunNumber, I: INTEGER;
  1057.       MeanTime, MeanRating, Rating: REAL;
  1058.  
  1059.     BEGIN
  1060.       REWRITE(Whetpasd);
  1061.       WRITELN(Whetpasd,' PASCAL Whetstone benchmark(with MATH lib with CHECK)');
  1062.       WRITELN(Whetpasd);
  1063.       WRITELN; WRITELN(' PASCAL Whetstone benchmark(with MATH lib with CHECK)');
  1064.       WRITELN;
  1065.  
  1066.       MeanTime:= 0.0;
  1067.       MeanRating:= 0.0;
  1068.       NumOfCycles:= 10;
  1069.       NumOfRuns:= 5;
  1070.       I:= 10;
  1071.  
  1072.       FOR RunNumber:= 1 TO NumOfRuns DO
  1073.         BEGIN { Main loop }
  1074.           Whetstone(I, NumOfCycles, StartTime, StopTime);
  1075.  
  1076.           WRITELN; WRITELN(' Whetstone CPU start time: ',StartTime:8,
  1077.                            ' milliseconds');
  1078.           WRITELN(Whetpasd); WRITELN(Whetpasd,' Whetstone CPU start time: ',
  1079.                                      StartTime:8,' milliseconds');
  1080.  
  1081.           WRITELN; WRITELN(' Whetstone CPU stop time: ',StopTime:8,
  1082.                            ' milliseconds');
  1083.           WRITELN(Whetpasd); WRITELN(Whetpasd,' Whetstone CPU stop time: ',
  1084.                                      StopTime:8,' milliseconds');
  1085.  
  1086.           ElapsedTime:= StopTime - StartTime;
  1087.           WRITELN; WRITELN(' Elapsed CPU time for ',NumOfCycles:3,' cycles: ',
  1088.                            ElapsedTime:8,' milliseconds');
  1089.           WRITELN(Whetpasd); WRITELN(Whetpasd,' Elapsed CPU time for ',
  1090.                       NumOfCycles:3,' cycles: ',ElapsedTime:8,' milliseconds');
  1091.  
  1092.       { Sum time in milliseconds per cycle }
  1093.       MeanTime:= MeanTime + (ElapsedTime/NumOfCycles);
  1094.  
  1095.           Rating:= (1000.0*1000.0*NumOfCycles)/ElapsedTime;
  1096.  
  1097.       { Sum Whetstone rating }
  1098.           MeanRating:= MeanRating + Rating;
  1099.           IntRating:= ROUND(Rating);
  1100.           WRITELN;WRITELN(' Whetstone rating: ',IntRating:5,' KWIPS');WRITELN;
  1101.           WRITELN(Whetpasd);WRITELN(Whetpasd,' Whetstone rating: ',IntRating:5,
  1102.                                     ' KWIPS');WRITELN(Whetpasd);
  1103.  
  1104.           NumOfCycles:= NumOfCycles + 10;
  1105.         END; { Main loop }
  1106.  
  1107.         MeanTime:= MeanTime/NumOfRuns;
  1108.         WRITELN; WRITELN(' Average time per cycle: ',MeanTime:11:2,
  1109.                          ' milliseconds');
  1110.         WRITELN(Whetpasd); WRITELN(Whetpasd,' Average time per cycle: ',
  1111.                                    MeanTime:11:2,' milliseconds');
  1112.  
  1113.         MeanRating:= MeanRating/NumOfRuns;
  1114.         IntRating:= ROUND(MeanRating);
  1115.         WRITELN; WRITELN(' Average Whetstone rating: ',IntRating:5,' KWIPS');
  1116.         WRITELN(Whetpasd); WRITELN(Whetpasd,' Average Whetstone rating: ',
  1117.                                    IntRating:5,' KWIPS');
  1118.         CLOSE(Whetpasd);
  1119.  
  1120.     END; { ComputeKWIPS }
  1121.  
  1122.   BEGIN { Mainline }
  1123.     ComputeKWIPS;
  1124.   END. { Mainline }
  1125. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1126. --whetfora.for
  1127. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1128. C   FILENAME: WHETFORA.FOR
  1129. C
  1130.       PROGRAM WHETFORA
  1131. C
  1132. C   FORTRAN77 VERSION OF WHETSTONE BENCHMARK PROGRAM.
  1133. C             (WITH STUBBED LIB WITH NOCHECK)
  1134. C   REFERENCE: "COMPUTER JOURNAL," FEBRUARY 1976, PAGES 43-49,
  1135. C              FOR DESCRIPTION OF BENCHMARK AND ALGOL60 VERSION.
  1136. C   NOTE: PROCEDURE POUT IS OMITTED.
  1137. C
  1138. C   MAINLINE
  1139. C
  1140.     CALL COMPUT
  1141.       END
  1142. C
  1143. C   UNCOMMENT FOLLOWING FUNCTION TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1144. C
  1145.       REAL FUNCTION MYSTUB(X)
  1146.      REAL X
  1147.     MYSTUB=1.0
  1148.       RETURN
  1149.       END
  1150. C
  1151. C
  1152. C
  1153.       SUBROUTINE PA(E)
  1154.     COMMON/BENCH1/ T,T2
  1155.     REAL E(4),T,T2
  1156.     INTEGER J
  1157.     J=0
  1158.     1    CONTINUE
  1159.       E(1)=(E(1)+E(2)+E(3)-E(4))*T
  1160.       E(2)=(E(1)+E(2)-E(3)+E(4))*T
  1161.       E(3)=(E(1)-E(2)+E(3)+E(4))*T
  1162.       E(4)=(-E(1)+E(2)+E(3)+E(4))/T2
  1163.       J=J+1
  1164.       IF(J.LT.6)GOTO 1
  1165.       RETURN
  1166.       END
  1167. C
  1168. C
  1169. C
  1170.       SUBROUTINE P0
  1171.     COMMON/BENCH2/ E1(4),J,K,L
  1172.     REAL E1
  1173.     INTEGER J,K,L
  1174.     E1(J)=E1(K)
  1175.     E1(K)=E1(L)
  1176.     E1(L)=E1(J)
  1177.       RETURN
  1178.       END
  1179. C
  1180. C
  1181. C
  1182.       SUBROUTINE P3(X,Y,Z)
  1183.     COMMON/BENCH1/ T,T2
  1184.     REAL X,Y,Z,T,T2
  1185.     X=T*(X+Y)
  1186.     Y=T*(X+Y)
  1187.     Z=(X+Y)/T2
  1188.       RETURN
  1189.       END
  1190. C
  1191. C
  1192. C
  1193.       SUBROUTINE WHET(I, KCYCLE, TSTART, TSTOP)
  1194.     REAL X1,X2,X3,X4,X,Y,Z,T,T1,T2,E1,TSTART,TSTOP,MYSTUB
  1195.     INTEGER I,J,K,L,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,LCOUNT,KCYCLE
  1196. C
  1197.     COMMON/BENCH1/ T,T2
  1198.     COMMON/BENCH2/ E1(4),J,K,L
  1199. C
  1200. C   INITIALIZE CONSTANTS
  1201.     T=0.499975
  1202.      T1=0.50025
  1203.     T2=2.0
  1204. C   COMPUTE EXECUTION FREQUENCIES FOR THE BENCHMARK MODULES
  1205.     N1=0
  1206.     N2=12*I
  1207.     N3=14*I
  1208.     N4=345*I
  1209.     N5=0
  1210.     N6=210*I
  1211.     N7=32*I
  1212.     N8=899*I
  1213.     N9=616*I
  1214.     N10=0
  1215.     N11=93*I
  1216. C
  1217. C   GET WHETSTONE START TIME FROM OPERATING SYSTEM
  1218. C
  1219.     TSTART=SECNDS(0.0)
  1220. C
  1221.     DO 1000 LCOUNT=1, KCYCLE
  1222. C
  1223. C   MODULE 1: SIMPLE IDENTIFIERS
  1224. C
  1225.       X1=1.0
  1226.       X2=-1.0
  1227.       X3=-1.0
  1228.       X4=-1.0
  1229.       DO 1 I=1,N1
  1230.         X1=(X1+X2+X3-X4)*T
  1231.         X2=(X1+X2-X3+X4)*T
  1232.         X3=(X1-X2+X3+X4)*T
  1233.         X4=(-X1+X2+X3+X4)*T
  1234.     1      CONTINUE
  1235. C
  1236. C   MODULE 2: ARRAY ELEMENTS
  1237. C
  1238.       E1(1)=1.0
  1239.       E1(2)=-1.0
  1240.       E1(3)=-1.0
  1241.       E1(4)=-1.0
  1242.       DO 2 I=1,N2
  1243.         E1(1)=(E1(1)+E1(2)+E1(3)-E1(4))*T
  1244.         E1(2)=(E1(1)+E1(2)-E1(3)+E1(4))*T
  1245.         E1(3)=(E1(1)-E1(2)+E1(3)+E1(4))*T
  1246.         E1(4)=(-E1(1)+E1(2)+E1(3)+E1(4))*T
  1247.     2      CONTINUE
  1248. C
  1249. C   MODULE 3: ARRAY AS PARAMETER
  1250. C
  1251.       DO 3 I=1,N3
  1252.         CALL PA(E1)
  1253.     3      CONTINUE
  1254. C
  1255. C   MODULE 4: CONDITIONAL JUMPS
  1256. C
  1257.       J=1
  1258.       DO 4 I=1,N4
  1259.         IF(J.EQ.1)THEN
  1260.           J=2
  1261.         ELSE
  1262.           J=3
  1263.         END IF
  1264.         IF(J.GT.2)THEN
  1265.           J=0
  1266.         ELSE
  1267.           J=1
  1268.         END IF
  1269.         IF(J.LT.1)THEN
  1270.           J=1
  1271.         ELSE
  1272.           J=0
  1273.         END IF
  1274.     4      CONTINUE
  1275. C
  1276. C   MODULE 5: OMITTED
  1277. C
  1278. C   MODULE 6: INTEGER ARITHMETIC
  1279. C
  1280.       J=1
  1281.       K=2
  1282.       L=3
  1283.       DO 6 I=1,N6
  1284.         J=J*(K-J)*(L-K)
  1285.         K=L*K-(L-J)*K
  1286.         L=(L-K)*(K+J)
  1287.         E1(L-1)=J+K+L
  1288.         E1(K-1)=J*K*L
  1289.     6      CONTINUE
  1290. C
  1291. C   MODULE 7: TRIGONOMETRIC FUNCTIONS
  1292. C
  1293.       X=0.5
  1294.       Y=0.5
  1295.       DO 7 I=1,N7
  1296. C   COMMENT OUT NEXT 2 LINES TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1297. C        X=T*ATAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0))
  1298. C        Y=T*ATAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0))
  1299. C
  1300. C   UNCOMMENT NEXT 2 LINES TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1301.         X=T*MYSTUB(T2*MYSTUB(X)*MYSTUB(X)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0))
  1302.         Y=T*MYSTUB(T2*MYSTUB(Y)*MYSTUB(Y)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0))
  1303.     7      CONTINUE
  1304. C
  1305. C   MODULE 8: PROCEDURE CALLS
  1306. C
  1307.       X=1.0
  1308.       Y=1.0
  1309.       Z=1.0
  1310.       DO 8 I=1,N8
  1311.         CALL P3(X,Y,Z)
  1312.     8      CONTINUE
  1313. C
  1314. C   MODULE 9: ARRAY REFERENCES
  1315. C
  1316.       J=1
  1317.       K=2
  1318.       L=3
  1319.       E1(1)=1.0
  1320.       E1(2)=2.0
  1321.       E1(3)=3.0
  1322.       DO 9 I=1,N9
  1323.         CALL P0
  1324.     9      CONTINUE
  1325. C
  1326. C   MODULE 10: INTEGER ARITHMETIC
  1327. C
  1328.       J=2
  1329.       K=3
  1330.       DO 10 I=1,N10
  1331.         J=J+K
  1332.         K=J+K
  1333.         J=K-J
  1334.         K=K-J-J
  1335.    10      CONTINUE
  1336. C
  1337. C   MODULE 11: STANDARD FUNCTIONS
  1338. C
  1339.       X=0.75
  1340.       DO 11 I=1,N11
  1341. C   COMMENT OUT NEXT LINE TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1342. C        X=SQRT(EXP(ALOG(X)/T1))
  1343. C
  1344. C   UNCOMMENT NEXT LINE TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1345.         X=MYSTUB(MYSTUB(MYSTUB(X)/T1))
  1346.    11      CONTINUE
  1347. C
  1348.  1000    CONTINUE
  1349. C
  1350. C   GET WHETSTONE STOP TIME FROM OPERATING SYSTEM
  1351. C
  1352.     TSTOP=SECNDS(0.0)
  1353.       RETURN
  1354.       END
  1355. C
  1356. C
  1357. C
  1358.       SUBROUTINE COMPUT
  1359.     REAL AVTIME,AVRATE,RATE,TSTART,TSTOP,DELTAT
  1360.     INTEGER NRUNS,LCOUNT,IRATE,KCYCLE,I
  1361. C
  1362.     OPEN(UNIT=21,FILE='WHETFORA.DAT',STATUS='NEW')
  1363.     WRITE(21,10)
  1364.     WRITE(6,10)
  1365.    10    FORMAT(1X,'FORTRAN77 Whetstone benchmark stubbed NOCHECK',/)
  1366. C
  1367.     AVTIME=0.0
  1368.     AVRATE=0.0
  1369.     KCYCLE=10
  1370.     NRUNS=5
  1371. C
  1372.     DO 1000 LCOUNT=1, NRUNS
  1373.       I=10
  1374.       CALL WHET(I, KCYCLE, TSTART, TSTOP)
  1375. C
  1376.       WRITE(6,20)TSTART
  1377.       WRITE(21,20)TSTART
  1378.    20      FORMAT(1X,'Whetstone start time: ',F8.2,' seconds')
  1379. C
  1380.       WRITE(6,30)TSTOP
  1381.       WRITE(21,30)TSTOP
  1382.    30      FORMAT(1X,'Whetstone stop time: ',F8.2,' seconds')
  1383. C
  1384. C   COMPUTE AND WRITE THE ELAPSED TIME
  1385. C
  1386.       DELTAT=TSTOP-TSTART
  1387.       WRITE(6,40)KCYCLE, DELTAT
  1388.       WRITE(21,40)KCYCLE, DELTAT
  1389.    40      FORMAT(1X,'Elapsed time for ',I3,' cycles: ',F8.2,' seconds')
  1390. C
  1391. C   SUM TIME IN MILLISECONDS PER CYCLE
  1392.       AVTIME=AVTIME + (DELTAT*1000.0)/FLOAT(KCYCLE)
  1393. C
  1394. C   CALCULATE WHETSTONE RATING BASED ON TIME FOR NUMBER OF CYCLES JUST EXECUTED
  1395. C
  1396.       RATE=(1000.0*FLOAT(KCYCLE))/DELTAT
  1397. C   SUM WHETSTONE RATING
  1398.       AVRATE=AVRATE + RATE
  1399.       IRATE=NINT(RATE)
  1400.       WRITE(6,50)IRATE
  1401.       WRITE(21,50)IRATE
  1402.    50      FORMAT(1X,'Whetstone rating: ',I5,' KWIPS',/)
  1403. C      
  1404.       KCYCLE=KCYCLE+10
  1405.  1000    CONTINUE
  1406. C
  1407. C   COMPUTE AVERAGE TIME IN MILLISECONDS PER CYCLE AND WRITE
  1408. C
  1409.     AVTIME=AVTIME/FLOAT(NRUNS)
  1410.     WRITE(6,60)AVTIME
  1411.     WRITE(21,60)AVTIME
  1412.    60    FORMAT(1X,'Average time per cycle: ',F8.2,' milliseconds')
  1413. C
  1414. C   CALCULATE AVERAGE WHETSTONE RATING AND WRITE 
  1415. C
  1416.     AVRATE=AVRATE/FLOAT(NRUNS)
  1417.     IRATE=NINT(AVRATE)
  1418.     WRITE(6,70)IRATE
  1419.     WRITE(21,70)IRATE
  1420.    70    FORMAT (1X,'Average Whetstone rating: ',I5,' KWIPS')
  1421.     CLOSE(UNIT=21,STATUS='KEEP')
  1422. C
  1423.       RETURN
  1424.       END
  1425. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1426. --whetforb.for
  1427. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1428. C   FILENAME: WHETFORB.FOR
  1429. C
  1430.       PROGRAM WHETFORB
  1431. C
  1432. C   FORTRAN77 VERSION OF WHETSTONE BENCHMARK PROGRAM.
  1433. C             (WITH STUBBED MATH LIB WITH CHECK)
  1434. C   REFERENCE: "COMPUTER JOURNAL," FEBRUARY 1976, PAGES 43-49,
  1435. C              FOR DESCRIPTION OF BENCHMARK AND ALGOL60 VERSION.
  1436. C   NOTE: PROCEDURE POUT IS OMITTED.
  1437. C
  1438. C   MAINLINE
  1439. C
  1440.     CALL COMPUT
  1441.       END
  1442. C
  1443. C   UNCOMMENT FOLLOWING FUNCTION TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1444. C
  1445.       REAL FUNCTION MYSTUB(X)
  1446.     REAL X
  1447.     MYSTUB=1.0
  1448.       RETURN
  1449.       END
  1450. C
  1451. C
  1452. C
  1453.       SUBROUTINE PA(E)
  1454.     COMMON/BENCH1/ T,T2
  1455.     REAL E(4),T,T2
  1456.     INTEGER J
  1457.     J=0
  1458.     1    CONTINUE
  1459.       E(1)=(E(1)+E(2)+E(3)-E(4))*T
  1460.       E(2)=(E(1)+E(2)-E(3)+E(4))*T
  1461.       E(3)=(E(1)-E(2)+E(3)+E(4))*T
  1462.       E(4)=(-E(1)+E(2)+E(3)+E(4))/T2
  1463.       J=J+1
  1464.       IF(J.LT.6)GOTO 1
  1465.       RETURN
  1466.       END
  1467. C
  1468. C
  1469. C
  1470.       SUBROUTINE P0
  1471.     COMMON/BENCH2/ E1(4),J,K,L
  1472.     REAL E1
  1473.     INTEGER J,K,L
  1474.     E1(J)=E1(K)
  1475.     E1(K)=E1(L)
  1476.     E1(L)=E1(J)
  1477.       RETURN
  1478.       END
  1479. C
  1480. C
  1481. C
  1482.       SUBROUTINE P3(X,Y,Z)
  1483.     COMMON/BENCH1/ T,T2
  1484.     REAL X,Y,Z,T,T2
  1485.     X=T*(X+Y)
  1486.     Y=T*(X+Y)
  1487.     Z=(X+Y)/T2
  1488.       RETURN
  1489.       END
  1490. C
  1491. C
  1492. C
  1493.       SUBROUTINE WHET(I, KCYCLE, TSTART, TSTOP)
  1494.     REAL X1,X2,X3,X4,X,Y,Z,T,T1,T2,E1,TSTART,TSTOP,MYSTUB
  1495.     INTEGER I,J,K,L,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,LCOUNT,KCYCLE
  1496. C
  1497.     COMMON/BENCH1/ T,T2
  1498.     COMMON/BENCH2/ E1(4),J,K,L
  1499. C
  1500. C   INITIALIZE CONSTANTS
  1501.     T=0.499975
  1502.      T1=0.50025
  1503.     T2=2.0
  1504. C   COMPUTE EXECUTION FREQUENCIES FOR THE BENCHMARK MODULES
  1505.     N1=0
  1506.     N2=12*I
  1507.     N3=14*I
  1508.     N4=345*I
  1509.     N5=0
  1510.     N6=210*I
  1511.     N7=32*I
  1512.     N8=899*I
  1513.     N9=616*I
  1514.     N10=0
  1515.     N11=93*I
  1516. C
  1517. C   GET WHETSTONE START TIME FROM OPERATING SYSTEM
  1518. C
  1519.     TSTART=SECNDS(0.0)
  1520. C
  1521.     DO 1000 LCOUNT=1, KCYCLE
  1522. C
  1523. C   MODULE 1: SIMPLE IDENTIFIERS
  1524. C
  1525.       X1=1.0
  1526.       X2=-1.0
  1527.       X3=-1.0
  1528.       X4=-1.0
  1529.       DO 1 I=1,N1
  1530.         X1=(X1+X2+X3-X4)*T
  1531.         X2=(X1+X2-X3+X4)*T
  1532.         X3=(X1-X2+X3+X4)*T
  1533.         X4=(-X1+X2+X3+X4)*T
  1534.     1      CONTINUE
  1535. C
  1536. C   MODULE 2: ARRAY ELEMENTS
  1537. C
  1538.       E1(1)=1.0
  1539.       E1(2)=-1.0
  1540.       E1(3)=-1.0
  1541.       E1(4)=-1.0
  1542.       DO 2 I=1,N2
  1543.         E1(1)=(E1(1)+E1(2)+E1(3)-E1(4))*T
  1544.         E1(2)=(E1(1)+E1(2)-E1(3)+E1(4))*T
  1545.         E1(3)=(E1(1)-E1(2)+E1(3)+E1(4))*T
  1546.         E1(4)=(-E1(1)+E1(2)+E1(3)+E1(4))*T
  1547.     2      CONTINUE
  1548. C
  1549. C   MODULE 3: ARRAY AS PARAMETER
  1550. C
  1551.       DO 3 I=1,N3
  1552.         CALL PA(E1)
  1553.     3      CONTINUE
  1554. C
  1555. C   MODULE 4: CONDITIONAL JUMPS
  1556. C
  1557.       J=1
  1558.       DO 4 I=1,N4
  1559.         IF(J.EQ.1)THEN
  1560.           J=2
  1561.         ELSE
  1562.           J=3
  1563.         END IF
  1564.         IF(J.GT.2)THEN
  1565.           J=0
  1566.         ELSE
  1567.           J=1
  1568.         END IF
  1569.         IF(J.LT.1)THEN
  1570.           J=1
  1571.         ELSE
  1572.           J=0
  1573.         END IF
  1574.     4      CONTINUE
  1575. C
  1576. C   MODULE 5: OMITTED
  1577. C
  1578. C   MODULE 6: INTEGER ARITHMETIC
  1579. C
  1580.       J=1
  1581.       K=2
  1582.       L=3
  1583.       DO 6 I=1,N6
  1584.         J=J*(K-J)*(L-K)
  1585.         K=L*K-(L-J)*K
  1586.         L=(L-K)*(K+J)
  1587.         E1(L-1)=J+K+L
  1588.         E1(K-1)=J*K*L
  1589.     6      CONTINUE
  1590. C
  1591. C   MODULE 7: TRIGONOMETRIC FUNCTIONS
  1592. C
  1593.       X=0.5
  1594.       Y=0.5
  1595.       DO 7 I=1,N7
  1596. C   COMMENT OUT NEXT 2 LINES TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1597. C        X=T*ATAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0))
  1598. C        Y=T*ATAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0))
  1599. C
  1600. C   UNCOMMENT NEXT 2 LINES TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1601.         X=T*MYSTUB(T2*MYSTUB(X)*MYSTUB(X)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0))
  1602.         Y=T*MYSTUB(T2*MYSTUB(Y)*MYSTUB(Y)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0))
  1603.     7      CONTINUE
  1604. C
  1605. C   MODULE 8: PROCEDURE CALLS
  1606. C
  1607.       X=1.0
  1608.       Y=1.0
  1609.       Z=1.0
  1610.       DO 8 I=1,N8
  1611.         CALL P3(X,Y,Z)
  1612.     8      CONTINUE
  1613. C
  1614. C   MODULE 9: ARRAY REFERENCES
  1615. C
  1616.       J=1
  1617.       K=2
  1618.       L=3
  1619.       E1(1)=1.0
  1620.       E1(2)=2.0
  1621.       E1(3)=3.0
  1622.       DO 9 I=1,N9
  1623.         CALL P0
  1624.     9      CONTINUE
  1625. C
  1626. C   MODULE 10: INTEGER ARITHMETIC
  1627. C
  1628.       J=2
  1629.       K=3
  1630.       DO 10 I=1,N10
  1631.         J=J+K
  1632.         K=J+K
  1633.         J=K-J
  1634.         K=K-J-J
  1635.    10      CONTINUE
  1636. C
  1637. C   MODULE 11: STANDARD FUNCTIONS
  1638. C
  1639.       X=0.75
  1640.       DO 11 I=1,N11
  1641. C   COMMENT OUT NEXT LINE TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1642. C        X=SQRT(EXP(ALOG(X)/T1))
  1643. C
  1644. C   UNCOMMENT NEXT LINE TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1645.         X=MYSTUB(MYSTUB(MYSTUB(X)/T1))
  1646.    11      CONTINUE
  1647. C
  1648.  1000    CONTINUE
  1649. C
  1650. C   GET WHETSTONE STOP TIME FROM OPERATING SYSTEM
  1651. C
  1652.     TSTOP=SECNDS(0.0)
  1653.       RETURN
  1654.       END
  1655. C
  1656. C
  1657. C
  1658.       SUBROUTINE COMPUT
  1659.     REAL AVTIME,AVRATE,RATE,TSTART,TSTOP,DELTAT
  1660.     INTEGER NRUNS,LCOUNT,IRATE,KCYCLE,I
  1661. C
  1662.     OPEN(UNIT=21,FILE='WHETFORB.DAT',STATUS='NEW')
  1663.     WRITE(21,10)
  1664.     WRITE(6,10)
  1665.    10    FORMAT(1X,'FORTRAN77 Whetstone benchmark(stubbed CHECK)',/)
  1666. C
  1667.     AVTIME=0.0
  1668.     AVRATE=0.0
  1669.     KCYCLE=10
  1670.     NRUNS=5
  1671. C
  1672.     DO 1000 LCOUNT=1, NRUNS
  1673.       I=10
  1674.       CALL WHET(I, KCYCLE, TSTART, TSTOP)
  1675. C
  1676.       WRITE(6,20)TSTART
  1677.       WRITE(21,20)TSTART
  1678.    20      FORMAT(1X,'Whetstone start time: ',F8.2,' seconds')
  1679. C
  1680.       WRITE(6,30)TSTOP
  1681.       WRITE(21,30)TSTOP
  1682.    30      FORMAT(1X,'Whetstone stop time: ',F8.2,' seconds')
  1683. C
  1684. C   COMPUTE AND WRITE THE ELAPSED TIME
  1685. C
  1686.       DELTAT=TSTOP-TSTART
  1687.       WRITE(6,40)KCYCLE, DELTAT
  1688.       WRITE(21,40)KCYCLE, DELTAT
  1689.    40      FORMAT(1X,'Elapsed time for ',I3,' cycles: ',F8.2,' seconds')
  1690. C
  1691. C   SUM TIME IN MILLISECONDS PER CYCLE
  1692.       AVTIME=AVTIME + (DELTAT*1000.0)/FLOAT(KCYCLE)
  1693. C
  1694. C   CALCULATE WHETSTONE RATING BASED ON TIME FOR NUMBER OF CYCLES JUST EXECUTED
  1695. C
  1696.       RATE=(1000.0*FLOAT(KCYCLE))/DELTAT
  1697. C   SUM WHETSTONE RATING
  1698.       AVRATE=AVRATE + RATE
  1699.       IRATE=NINT(RATE)
  1700.       WRITE(6,50)IRATE
  1701.       WRITE(21,50)IRATE
  1702.    50      FORMAT(1X,'Whetstone rating: ',I5,' KWIPS',/)
  1703. C      
  1704.       KCYCLE=KCYCLE+10
  1705.  1000    CONTINUE
  1706. C
  1707. C   COMPUTE AVERAGE TIME IN MILLISECONDS PER CYCLE AND WRITE
  1708. C
  1709.     AVTIME=AVTIME/FLOAT(NRUNS)
  1710.     WRITE(6,60)AVTIME
  1711.     WRITE(21,60)AVTIME
  1712.    60    FORMAT(1X,'Average time per cycle: ',F8.2,' milliseconds')
  1713. C
  1714. C   CALCULATE AVERAGE WHETSTONE RATING AND WRITE 
  1715. C
  1716.     AVRATE=AVRATE/FLOAT(NRUNS)
  1717.     IRATE=NINT(AVRATE)
  1718.     WRITE(6,70)IRATE
  1719.     WRITE(21,70)IRATE
  1720.    70    FORMAT (1X,'Average Whetstone rating: ',I5,' KWIPS')
  1721.     CLOSE(UNIT=21,STATUS='KEEP')
  1722. C
  1723.       RETURN
  1724.       END
  1725. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1726. --whetforc.for
  1727. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1728. C   FILENAME: WHETFORC.FOR
  1729. C
  1730.       PROGRAM WHETFORC
  1731. C
  1732. C   FORTRAN77 VERSION OF WHETSTONE BENCHMARK PROGRAM.
  1733. C             (WITH MATH LIB WITH NOCHECK)
  1734. C   REFERENCE: "COMPUTER JOURNAL," FEBRUARY 1976, PAGES 43-49,
  1735. C              FOR DESCRIPTION OF BENCHMARK AND ALGOL60 VERSION.
  1736. C   NOTE: PROCEDURE POUT IS OMITTED.
  1737. C
  1738. C   MAINLINE
  1739. C
  1740.     CALL COMPUT
  1741.       END
  1742. C
  1743. C   UNCOMMENT FOLLOWING FUNCTION TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1744. C
  1745. C     REAL FUNCTION MYSTUB(X)
  1746. C    REAL X
  1747. C    MYSTUB=1.0
  1748. C     RETURN
  1749. C     END
  1750. C
  1751. C
  1752. C
  1753.       SUBROUTINE PA(E)
  1754.     COMMON/BENCH1/ T,T2
  1755.     REAL E(4),T,T2
  1756.     INTEGER J
  1757.     J=0
  1758.     1    CONTINUE
  1759.       E(1)=(E(1)+E(2)+E(3)-E(4))*T
  1760.       E(2)=(E(1)+E(2)-E(3)+E(4))*T
  1761.       E(3)=(E(1)-E(2)+E(3)+E(4))*T
  1762.       E(4)=(-E(1)+E(2)+E(3)+E(4))/T2
  1763.       J=J+1
  1764.       IF(J.LT.6)GOTO 1
  1765.       RETURN
  1766.       END
  1767. C
  1768. C
  1769. C
  1770.       SUBROUTINE P0
  1771.     COMMON/BENCH2/ E1(4),J,K,L
  1772.     REAL E1
  1773.     INTEGER J,K,L
  1774.     E1(J)=E1(K)
  1775.     E1(K)=E1(L)
  1776.     E1(L)=E1(J)
  1777.       RETURN
  1778.       END
  1779. C
  1780. C
  1781. C
  1782.       SUBROUTINE P3(X,Y,Z)
  1783.     COMMON/BENCH1/ T,T2
  1784.     REAL X,Y,Z,T,T2
  1785.     X=T*(X+Y)
  1786.     Y=T*(X+Y)
  1787.     Z=(X+Y)/T2
  1788.       RETURN
  1789.       END
  1790. C
  1791. C
  1792. C
  1793.       SUBROUTINE WHET(I, KCYCLE, TSTART, TSTOP)
  1794.     REAL X1,X2,X3,X4,X,Y,Z,T,T1,T2,E1,TSTART,TSTOP,MYSTUB
  1795.     INTEGER I,J,K,L,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,LCOUNT,KCYCLE
  1796. C
  1797.     COMMON/BENCH1/ T,T2
  1798.     COMMON/BENCH2/ E1(4),J,K,L
  1799. C
  1800. C   INITIALIZE CONSTANTS
  1801.     T=0.499975
  1802.      T1=0.50025
  1803.     T2=2.0
  1804. C   COMPUTE EXECUTION FREQUENCIES FOR THE BENCHMARK MODULES
  1805.     N1=0
  1806.     N2=12*I
  1807.     N3=14*I
  1808.     N4=345*I
  1809.     N5=0
  1810.     N6=210*I
  1811.     N7=32*I
  1812.     N8=899*I
  1813.     N9=616*I
  1814.     N10=0
  1815.     N11=93*I
  1816. C
  1817. C   GET WHETSTONE START TIME FROM OPERATING SYSTEM
  1818. C
  1819.     TSTART=SECNDS(0.0)
  1820. C
  1821.     DO 1000 LCOUNT=1, KCYCLE
  1822. C
  1823. C   MODULE 1: SIMPLE IDENTIFIERS
  1824. C
  1825.       X1=1.0
  1826.       X2=-1.0
  1827.       X3=-1.0
  1828.       X4=-1.0
  1829.       DO 1 I=1,N1
  1830.         X1=(X1+X2+X3-X4)*T
  1831.         X2=(X1+X2-X3+X4)*T
  1832.         X3=(X1-X2+X3+X4)*T
  1833.         X4=(-X1+X2+X3+X4)*T
  1834.     1      CONTINUE
  1835. C
  1836. C   MODULE 2: ARRAY ELEMENTS
  1837. C
  1838.       E1(1)=1.0
  1839.       E1(2)=-1.0
  1840.       E1(3)=-1.0
  1841.       E1(4)=-1.0
  1842.       DO 2 I=1,N2
  1843.         E1(1)=(E1(1)+E1(2)+E1(3)-E1(4))*T
  1844.         E1(2)=(E1(1)+E1(2)-E1(3)+E1(4))*T
  1845.         E1(3)=(E1(1)-E1(2)+E1(3)+E1(4))*T
  1846.         E1(4)=(-E1(1)+E1(2)+E1(3)+E1(4))*T
  1847.     2      CONTINUE
  1848. C
  1849. C   MODULE 3: ARRAY AS PARAMETER
  1850. C
  1851.       DO 3 I=1,N3
  1852.         CALL PA(E1)
  1853.     3      CONTINUE
  1854. C
  1855. C   MODULE 4: CONDITIONAL JUMPS
  1856. C
  1857.       J=1
  1858.       DO 4 I=1,N4
  1859.         IF(J.EQ.1)THEN
  1860.           J=2
  1861.         ELSE
  1862.           J=3
  1863.         END IF
  1864.         IF(J.GT.2)THEN
  1865.           J=0
  1866.         ELSE
  1867.           J=1
  1868.         END IF
  1869.         IF(J.LT.1)THEN
  1870.           J=1
  1871.         ELSE
  1872.           J=0
  1873.         END IF
  1874.     4      CONTINUE
  1875. C
  1876. C   MODULE 5: OMITTED
  1877. C
  1878. C   MODULE 6: INTEGER ARITHMETIC
  1879. C
  1880.       J=1
  1881.       K=2
  1882.       L=3
  1883.       DO 6 I=1,N6
  1884.         J=J*(K-J)*(L-K)
  1885.         K=L*K-(L-J)*K
  1886.         L=(L-K)*(K+J)
  1887.         E1(L-1)=J+K+L
  1888.         E1(K-1)=J*K*L
  1889.     6      CONTINUE
  1890. C
  1891. C   MODULE 7: TRIGONOMETRIC FUNCTIONS
  1892. C
  1893.       X=0.5
  1894.       Y=0.5
  1895.       DO 7 I=1,N7
  1896. C   COMMENT OUT NEXT 2 LINES TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1897.         X=T*ATAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0))
  1898.         Y=T*ATAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0))
  1899. C
  1900. C   UNCOMMENT NEXT 2 LINES TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1901. C        X=T*MYSTUB(T2*MYSTUB(X)*MYSTUB(X)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0))
  1902. C        Y=T*MYSTUB(T2*MYSTUB(Y)*MYSTUB(Y)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0))
  1903.     7      CONTINUE
  1904. C
  1905. C   MODULE 8: PROCEDURE CALLS
  1906. C
  1907.       X=1.0
  1908.       Y=1.0
  1909.       Z=1.0
  1910.       DO 8 I=1,N8
  1911.         CALL P3(X,Y,Z)
  1912.     8      CONTINUE
  1913. C
  1914. C   MODULE 9: ARRAY REFERENCES
  1915. C
  1916.       J=1
  1917.       K=2
  1918.       L=3
  1919.       E1(1)=1.0
  1920.       E1(2)=2.0
  1921.       E1(3)=3.0
  1922.       DO 9 I=1,N9
  1923.         CALL P0
  1924.     9      CONTINUE
  1925. C
  1926. C   MODULE 10: INTEGER ARITHMETIC
  1927. C
  1928.       J=2
  1929.       K=3
  1930.       DO 10 I=1,N10
  1931.         J=J+K
  1932.         K=J+K
  1933.         J=K-J
  1934.         K=K-J-J
  1935.    10      CONTINUE
  1936. C
  1937. C   MODULE 11: STANDARD FUNCTIONS
  1938. C
  1939.       X=0.75
  1940.       DO 11 I=1,N11
  1941. C   COMMENT OUT NEXT LINE TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1942.         X=SQRT(EXP(ALOG(X)/T1))
  1943. C
  1944. C   UNCOMMENT NEXT LINE TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  1945. C        X=MYSTUB(MYSTUB(MYSTUB(X)/T1))
  1946.    11      CONTINUE
  1947. C
  1948.  1000    CONTINUE
  1949. C
  1950. C   GET WHETSTONE STOP TIME FROM OPERATING SYSTEM
  1951. C
  1952.     TSTOP=SECNDS(0.0)
  1953.       RETURN
  1954.       END
  1955. C
  1956. C
  1957. C
  1958.       SUBROUTINE COMPUT
  1959.     REAL AVTIME,AVRATE,RATE,TSTART,TSTOP,DELTAT
  1960.     INTEGER NRUNS,LCOUNT,IRATE,KCYCLE,I
  1961. C
  1962.     OPEN(UNIT=21,FILE='WHETFORC.DAT',STATUS='NEW')
  1963.     WRITE(21,10)
  1964.     WRITE(6,10)
  1965.    10    FORMAT(1X,'FORTRAN77 Whetstone benchmark(MATH NOCHECK)',/)
  1966. C
  1967.     AVTIME=0.0
  1968.     AVRATE=0.0
  1969.     KCYCLE=10
  1970.     NRUNS=5
  1971. C
  1972.     DO 1000 LCOUNT=1, NRUNS
  1973.       I=10
  1974.       CALL WHET(I, KCYCLE, TSTART, TSTOP)
  1975. C
  1976.       WRITE(6,20)TSTART
  1977.       WRITE(21,20)TSTART
  1978.    20      FORMAT(1X,'Whetstone start time: ',F8.2,' seconds')
  1979. C
  1980.       WRITE(6,30)TSTOP
  1981.       WRITE(21,30)TSTOP
  1982.    30      FORMAT(1X,'Whetstone stop time: ',F8.2,' seconds')
  1983. C
  1984. C   COMPUTE AND WRITE THE ELAPSED TIME
  1985. C
  1986.       DELTAT=TSTOP-TSTART
  1987.       WRITE(6,40)KCYCLE, DELTAT
  1988.       WRITE(21,40)KCYCLE, DELTAT
  1989.    40      FORMAT(1X,'Elapsed time for ',I3,' cycles: ',F8.2,' seconds')
  1990. C
  1991. C   SUM TIME IN MILLISECONDS PER CYCLE
  1992.       AVTIME=AVTIME + (DELTAT*1000.0)/FLOAT(KCYCLE)
  1993. C
  1994. C   CALCULATE WHETSTONE RATING BASED ON TIME FOR NUMBER OF CYCLES JUST EXECUTED
  1995. C
  1996.       RATE=(1000.0*FLOAT(KCYCLE))/DELTAT
  1997. C   SUM WHETSTONE RATING
  1998.       AVRATE=AVRATE + RATE
  1999.       IRATE=NINT(RATE)
  2000.       WRITE(6,50)IRATE
  2001.       WRITE(21,50)IRATE
  2002.    50      FORMAT(1X,'Whetstone rating: ',I5,' KWIPS',/)
  2003. C      
  2004.       KCYCLE=KCYCLE+10
  2005.  1000    CONTINUE
  2006. C
  2007. C   COMPUTE AVERAGE TIME IN MILLISECONDS PER CYCLE AND WRITE
  2008. C
  2009.     AVTIME=AVTIME/FLOAT(NRUNS)
  2010.     WRITE(6,60)AVTIME
  2011.     WRITE(21,60)AVTIME
  2012.    60    FORMAT(1X,'Average time per cycle: ',F8.2,' milliseconds')
  2013. C
  2014. C   CALCULATE AVERAGE WHETSTONE RATING AND WRITE 
  2015. C
  2016.     AVRATE=AVRATE/FLOAT(NRUNS)
  2017.     IRATE=NINT(AVRATE)
  2018.     WRITE(6,70)IRATE
  2019.     WRITE(21,70)IRATE
  2020.    70    FORMAT (1X,'Average Whetstone rating: ',I5,' KWIPS')
  2021.     CLOSE(UNIT=21,STATUS='KEEP')
  2022. C
  2023.       RETURN
  2024.       END
  2025. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2026. --whetford.for
  2027. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2028. C   FILENAME: WHETFORD.FOR
  2029. C
  2030.       PROGRAM WHETFORD
  2031. C
  2032. C   FORTRAN77 VERSION OF WHETSTONE BENCHMARK PROGRAM.
  2033. C             (WITH MATH WITH CHECK)
  2034. C   REFERENCE: "COMPUTER JOURNAL," FEBRUARY 1976, PAGES 43-49,
  2035. C              FOR DESCRIPTION OF BENCHMARK AND ALGOL60 VERSION.
  2036. C   NOTE: PROCEDURE POUT IS OMITTED.
  2037. C
  2038. C   MAINLINE
  2039. C
  2040.     CALL COMPUT
  2041.       END
  2042. C
  2043. C   UNCOMMENT FOLLOWING FUNCTION TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  2044. C
  2045. C     REAL FUNCTION MYSTUB(X)
  2046. C    REAL X
  2047. C    MYSTUB=1.0
  2048. C     RETURN
  2049. C     END
  2050. C
  2051. C
  2052. C
  2053.       SUBROUTINE PA(E)
  2054.     COMMON/BENCH1/ T,T2
  2055.     REAL E(4),T,T2
  2056.     INTEGER J
  2057.     J=0
  2058.     1    CONTINUE
  2059.       E(1)=(E(1)+E(2)+E(3)-E(4))*T
  2060.       E(2)=(E(1)+E(2)-E(3)+E(4))*T
  2061.       E(3)=(E(1)-E(2)+E(3)+E(4))*T
  2062.       E(4)=(-E(1)+E(2)+E(3)+E(4))/T2
  2063.       J=J+1
  2064.       IF(J.LT.6)GOTO 1
  2065.       RETURN
  2066.       END
  2067. C
  2068. C
  2069. C
  2070.       SUBROUTINE P0
  2071.     COMMON/BENCH2/ E1(4),J,K,L
  2072.     REAL E1
  2073.     INTEGER J,K,L
  2074.     E1(J)=E1(K)
  2075.     E1(K)=E1(L)
  2076.     E1(L)=E1(J)
  2077.       RETURN
  2078.       END
  2079. C
  2080. C
  2081. C
  2082.       SUBROUTINE P3(X,Y,Z)
  2083.     COMMON/BENCH1/ T,T2
  2084.     REAL X,Y,Z,T,T2
  2085.     X=T*(X+Y)
  2086.     Y=T*(X+Y)
  2087.     Z=(X+Y)/T2
  2088.       RETURN
  2089.       END
  2090. C
  2091. C
  2092. C
  2093.       SUBROUTINE WHET(I, KCYCLE, TSTART, TSTOP)
  2094.     REAL X1,X2,X3,X4,X,Y,Z,T,T1,T2,E1,TSTART,TSTOP,MYSTUB
  2095.     INTEGER I,J,K,L,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,LCOUNT,KCYCLE
  2096. C
  2097.     COMMON/BENCH1/ T,T2
  2098.     COMMON/BENCH2/ E1(4),J,K,L
  2099. C
  2100. C   INITIALIZE CONSTANTS
  2101.     T=0.499975
  2102.      T1=0.50025
  2103.     T2=2.0
  2104. C   COMPUTE EXECUTION FREQUENCIES FOR THE BENCHMARK MODULES
  2105.     N1=0
  2106.     N2=12*I
  2107.     N3=14*I
  2108.     N4=345*I
  2109.     N5=0
  2110.     N6=210*I
  2111.     N7=32*I
  2112.     N8=899*I
  2113.     N9=616*I
  2114.     N10=0
  2115.     N11=93*I
  2116. C
  2117. C   GET WHETSTONE START TIME FROM OPERATING SYSTEM
  2118. C
  2119.     TSTART=SECNDS(0.0)
  2120. C
  2121.     DO 1000 LCOUNT=1, KCYCLE
  2122. C
  2123. C   MODULE 1: SIMPLE IDENTIFIERS
  2124. C
  2125.       X1=1.0
  2126.       X2=-1.0
  2127.       X3=-1.0
  2128.       X4=-1.0
  2129.       DO 1 I=1,N1
  2130.         X1=(X1+X2+X3-X4)*T
  2131.         X2=(X1+X2-X3+X4)*T
  2132.         X3=(X1-X2+X3+X4)*T
  2133.         X4=(-X1+X2+X3+X4)*T
  2134.     1      CONTINUE
  2135. C
  2136. C   MODULE 2: ARRAY ELEMENTS
  2137. C
  2138.       E1(1)=1.0
  2139.       E1(2)=-1.0
  2140.       E1(3)=-1.0
  2141.       E1(4)=-1.0
  2142.       DO 2 I=1,N2
  2143.         E1(1)=(E1(1)+E1(2)+E1(3)-E1(4))*T
  2144.         E1(2)=(E1(1)+E1(2)-E1(3)+E1(4))*T
  2145.         E1(3)=(E1(1)-E1(2)+E1(3)+E1(4))*T
  2146.         E1(4)=(-E1(1)+E1(2)+E1(3)+E1(4))*T
  2147.     2      CONTINUE
  2148. C
  2149. C   MODULE 3: ARRAY AS PARAMETER
  2150. C
  2151.       DO 3 I=1,N3
  2152.         CALL PA(E1)
  2153.     3      CONTINUE
  2154. C
  2155. C   MODULE 4: CONDITIONAL JUMPS
  2156. C
  2157.       J=1
  2158.       DO 4 I=1,N4
  2159.         IF(J.EQ.1)THEN
  2160.           J=2
  2161.         ELSE
  2162.           J=3
  2163.         END IF
  2164.         IF(J.GT.2)THEN
  2165.           J=0
  2166.         ELSE
  2167.           J=1
  2168.         END IF
  2169.         IF(J.LT.1)THEN
  2170.           J=1
  2171.         ELSE
  2172.           J=0
  2173.         END IF
  2174.     4      CONTINUE
  2175. C
  2176. C   MODULE 5: OMITTED
  2177. C
  2178. C   MODULE 6: INTEGER ARITHMETIC
  2179. C
  2180.       J=1
  2181.       K=2
  2182.       L=3
  2183.       DO 6 I=1,N6
  2184.         J=J*(K-J)*(L-K)
  2185.         K=L*K-(L-J)*K
  2186.         L=(L-K)*(K+J)
  2187.         E1(L-1)=J+K+L
  2188.         E1(K-1)=J*K*L
  2189.     6      CONTINUE
  2190. C
  2191. C   MODULE 7: TRIGONOMETRIC FUNCTIONS
  2192. C
  2193.       X=0.5
  2194.       Y=0.5
  2195.       DO 7 I=1,N7
  2196. C   COMMENT OUT NEXT 2 LINES TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  2197.         X=T*ATAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0))
  2198.         Y=T*ATAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0))
  2199. C
  2200. C   UNCOMMENT NEXT 2 LINES TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  2201. C        X=T*MYSTUB(T2*MYSTUB(X)*MYSTUB(X)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0))
  2202. C        Y=T*MYSTUB(T2*MYSTUB(Y)*MYSTUB(Y)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0))
  2203.     7      CONTINUE
  2204. C
  2205. C   MODULE 8: PROCEDURE CALLS
  2206. C
  2207.       X=1.0
  2208.       Y=1.0
  2209.       Z=1.0
  2210.       DO 8 I=1,N8
  2211.         CALL P3(X,Y,Z)
  2212.     8      CONTINUE
  2213. C
  2214. C   MODULE 9: ARRAY REFERENCES
  2215. C
  2216.       J=1
  2217.       K=2
  2218.       L=3
  2219.       E1(1)=1.0
  2220.       E1(2)=2.0
  2221.       E1(3)=3.0
  2222.       DO 9 I=1,N9
  2223.         CALL P0
  2224.     9      CONTINUE
  2225. C
  2226. C   MODULE 10: INTEGER ARITHMETIC
  2227. C
  2228.       J=2
  2229.       K=3
  2230.       DO 10 I=1,N10
  2231.         J=J+K
  2232.         K=J+K
  2233.         J=K-J
  2234.         K=K-J-J
  2235.    10      CONTINUE
  2236. C
  2237. C   MODULE 11: STANDARD FUNCTIONS
  2238. C
  2239.       X=0.75
  2240.       DO 11 I=1,N11
  2241. C   COMMENT OUT NEXT LINE TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  2242.         X=SQRT(EXP(ALOG(X)/T1))
  2243. C
  2244. C   UNCOMMENT NEXT LINE TO RUN BENCHMARK WITH MATH LIBRARY STUBBED OFF
  2245. C        X=MYSTUB(MYSTUB(MYSTUB(X)/T1))
  2246.    11      CONTINUE
  2247. C
  2248.  1000    CONTINUE
  2249. C
  2250. C   GET WHETSTONE STOP TIME FROM OPERATING SYSTEM
  2251. C
  2252.     TSTOP=SECNDS(0.0)
  2253.       RETURN
  2254.       END
  2255. C
  2256. C
  2257. C
  2258.       SUBROUTINE COMPUT
  2259.     REAL AVTIME,AVRATE,RATE,TSTART,TSTOP,DELTAT
  2260.     INTEGER NRUNS,LCOUNT,IRATE,KCYCLE,I
  2261. C
  2262.     OPEN(UNIT=21,FILE='WHETFORD.DAT',STATUS='NEW')
  2263.     WRITE(21,10)
  2264.     WRITE(6,10)
  2265.    10    FORMAT(1X,'FORTRAN77 Whetstone benchmark(MATH CHECK)',/)
  2266. C
  2267.     AVTIME=0.0
  2268.     AVRATE=0.0
  2269.     KCYCLE=10
  2270.     NRUNS=5
  2271. C
  2272.     DO 1000 LCOUNT=1, NRUNS
  2273.       I=10
  2274.       CALL WHET(I, KCYCLE, TSTART, TSTOP)
  2275. C
  2276.       WRITE(6,20)TSTART
  2277.       WRITE(21,20)TSTART
  2278.    20      FORMAT(1X,'Whetstone start time: ',F8.2,' seconds')
  2279. C
  2280.       WRITE(6,30)TSTOP
  2281.       WRITE(21,30)TSTOP
  2282.    30      FORMAT(1X,'Whetstone stop time: ',F8.2,' seconds')
  2283. C
  2284. C   COMPUTE AND WRITE THE ELAPSED TIME
  2285. C
  2286.       DELTAT=TSTOP-TSTART
  2287.       WRITE(6,40)KCYCLE, DELTAT
  2288.       WRITE(21,40)KCYCLE, DELTAT
  2289.    40      FORMAT(1X,'Elapsed time for ',I3,' cycles: ',F8.2,' seconds')
  2290. C
  2291. C   SUM TIME IN MILLISECONDS PER CYCLE
  2292.       AVTIME=AVTIME + (DELTAT*1000.0)/FLOAT(KCYCLE)
  2293. C
  2294. C   CALCULATE WHETSTONE RATING BASED ON TIME FOR NUMBER OF CYCLES JUST EXECUTED
  2295. C
  2296.       RATE=(1000.0*FLOAT(KCYCLE))/DELTAT
  2297. C   SUM WHETSTONE RATING
  2298.       AVRATE=AVRATE + RATE
  2299.       IRATE=NINT(RATE)
  2300.       WRITE(6,50)IRATE
  2301.       WRITE(21,50)IRATE
  2302.    50      FORMAT(1X,'Whetstone rating: ',I5,' KWIPS',/)
  2303. C      
  2304.       KCYCLE=KCYCLE+10
  2305.  1000    CONTINUE
  2306. C
  2307. C   COMPUTE AVERAGE TIME IN MILLISECONDS PER CYCLE AND WRITE
  2308. C
  2309.     AVTIME=AVTIME/FLOAT(NRUNS)
  2310.     WRITE(6,60)AVTIME
  2311.     WRITE(21,60)AVTIME
  2312.    60    FORMAT(1X,'Average time per cycle: ',F8.2,' milliseconds')
  2313. C
  2314. C   CALCULATE AVERAGE WHETSTONE RATING AND WRITE 
  2315. C
  2316.     AVRATE=AVRATE/FLOAT(NRUNS)
  2317.     IRATE=NINT(AVRATE)
  2318.     WRITE(6,70)IRATE
  2319.     WRITE(21,70)IRATE
  2320.    70    FORMAT (1X,'Average Whetstone rating: ',I5,' KWIPS')
  2321.     CLOSE(UNIT=21,STATUS='KEEP')
  2322. C
  2323.       RETURN
  2324.       END
  2325. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2326. --whetca.c
  2327. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2328. /* Filename: WHETCA.C */
  2329.  
  2330. main()
  2331.  
  2332.   {
  2333.     /* C version of Whetstone Benchmark Program (with stubbed MATH lib) */
  2334.     /* Reference: "Computer Journal", February 1976, pages 43-49,       */
  2335.     /*            for description of benchmark and ALGOL60 version.     */
  2336.     /* Note     : Procedure POUT is omitted.                            */
  2337.  
  2338.     COMPUT();
  2339.   }
  2340. /*                                               */
  2341. /* Uncomment following function to run Benchmark */
  2342. /* with MATH library stubbed off                 */
  2343. /*                                               */
  2344.  
  2345. float MYSTUB(X)                                
  2346.  
  2347. float X;
  2348.  
  2349.   {
  2350.          return(1.0);
  2351.   }
  2352.  
  2353. PA(E)
  2354.  
  2355.   float E[4];
  2356.  
  2357.   {
  2358.     int J;
  2359.     extern float T,T2;
  2360.  
  2361.     J=0;
  2362.  
  2363. ONE:E[0]=(E[0]+E[1]+E[2]-E[3])*T;
  2364.     E[1]=(E[0]+E[1]-E[2]+E[3])*T;
  2365.     E[2]=(E[0]-E[1]+E[2]+E[3])*T;
  2366.     E[3]=(-E[0]+E[1]+E[2]+E[3])/T2;
  2367.  
  2368.     J=J+1;
  2369.  
  2370.     if (J<6) goto ONE;
  2371.  
  2372.   }
  2373.  
  2374. P0()
  2375.  
  2376.   {
  2377.     extern float E1[4];
  2378.     extern int J,K,L;
  2379.  
  2380.     E1[J]=E1[K];
  2381.     E1[K]=E1[L];
  2382.     E1[L]=E1[J];
  2383.  
  2384.   }
  2385.  
  2386. P3(X,Y,Z)
  2387.  
  2388.   float X,Y,Z;
  2389.  
  2390.   {
  2391.  
  2392.     extern float T,T2;
  2393.     
  2394.     X=T*(X+Y);
  2395.     Y=T*(X+Y);
  2396.     Z=(X+Y)/T2;
  2397.  
  2398.   }
  2399.  
  2400. #include timeb
  2401.  
  2402. WHET(I,KCYCLE,TSTART,TSTOP)
  2403.  
  2404.    double *TSTART,*TSTOP;
  2405.    int I,KCYCLE;
  2406.   {
  2407.     float X1,X2,X3,X4,X,Y,Z,T1;
  2408.     int   N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,LCOUNT;
  2409.  
  2410.     extern float T,T2,E1[4];
  2411.     extern int J,K,L;
  2412.  
  2413.     struct timeb *TIME_POINTER;/* timeb structure has the members            */
  2414.                                /* time_t  (gives time in seconds)            */
  2415.                                /* unsigned short millitm ( in milliseconds)  */
  2416.                                /* short time zone        (0)                 */
  2417.                                /* short dstflag          (0)                 */
  2418.    
  2419.     /*                    */
  2420.     /*  Initialize Constants            */
  2421.     /*                    */
  2422.  
  2423.     T=0.499975;
  2424.     T1=0.50025;
  2425.     T2=2.0;
  2426.  
  2427.     /*                          */
  2428.     /* Compute Execution Frequencies    */
  2429.     /* for the Benchmark Modules        */
  2430.    
  2431.     N1=0;
  2432.     N2=12*I;
  2433.     N3=14*I;
  2434.     N4=345*I;
  2435.     N5=0;
  2436.     N6=210*I;
  2437.     N7=32*I;
  2438.     N8=899*I;
  2439.     N9=616*I;
  2440.     N10=0;
  2441.     N11=93*I;
  2442.    
  2443.     /*                    */
  2444.     /*  Get Whetstone Start Time from   */
  2445.     /*          Operating System        */
  2446.     /*                                  */
  2447.  
  2448.     ftime(&TIME_POINTER);
  2449.  
  2450.     *TSTART=TIME_POINTER.time+TIME_POINTER.millitm/1000.0;
  2451.  
  2452.     for (LCOUNT=1;LCOUNT<=KCYCLE;LCOUNT++)
  2453.       {
  2454.          /*                              */
  2455.          /* Module 1: Simple Identifiers */
  2456.          /*                              */
  2457.  
  2458.          X1=1.0;
  2459.          X2=-1.0;
  2460.          X3=-1.0;
  2461.          X4=-1.0;
  2462.          for (I=1;I<=N1;I++)
  2463.            {
  2464.               X1=(X1+X2+X3-X4)*T;
  2465.               X2=(X1+X2-X3+X4)*T;
  2466.               X3=(X1-X2+X3+X4)*T;
  2467.               X4=(-X1+X2+X3+X4)*T;
  2468.            }
  2469.  
  2470.          /*                               */
  2471.          /*    Module 2: Array Elements   */
  2472.          /*       Note : Arrary Subscripts*/
  2473.          /*              in C begin       */
  2474.          /*              with 0.          */
  2475.  
  2476.          E1[0]=1.0;
  2477.          E1[1]=-1.0;
  2478.          E1[2]=-1.0;
  2479.          E1[3]=-1.0;
  2480.          
  2481.          for (I=1;I<=N2;I++)
  2482.            {
  2483.               E1[0]=(E1[0]+E1[1]+E1[2]-E1[3])*T;
  2484.               E1[1]=(E1[0]+E1[1]-E1[2]+E1[3])*T;
  2485.               E1[2]=(E1[0]-E1[1]+E1[2]+E1[3])*T;
  2486.               E1[3]=(-E1[0]+E1[1]+E1[2]+E1[3])*T;
  2487.  
  2488.            }
  2489.  
  2490.          /*                                */
  2491.          /*  Module 3: Array as Parameter  */
  2492.          /*                                */
  2493.  
  2494.          for (I=1;I<=N3;I++)
  2495.            {
  2496.              PA(E1);
  2497.            }
  2498.  
  2499.          /*                                */
  2500.          /*  Module 4: Conditional Jumps   */
  2501.          /*                                */
  2502.  
  2503.          J=1;
  2504.          
  2505.          for (I=1;I<=N4;I++)
  2506.            {
  2507.              if (J==1)
  2508.                J=2;
  2509.              else
  2510.                J=3;
  2511.              if (J>2)
  2512.                J=0;
  2513.              else
  2514.                J=1;
  2515.              if (J<1)
  2516.                J=1;
  2517.              else
  2518.                J=0;
  2519.             }
  2520.  
  2521.           /*                                */
  2522.           /*       Module 5 Omitted         */
  2523.           /*                                */
  2524.  
  2525.           /*                                */
  2526.           /*  Module 6: Integer Arithmetic  */
  2527.           /*                                */
  2528.  
  2529.           J=1;
  2530.           K=2;
  2531.           L=3;
  2532.  
  2533.           for (I=1;I<=N6;I++)
  2534.             {
  2535.               J=J*(K-J)*(L-K);
  2536.               K=L*K-(L-J)*K;
  2537.               L=(L-K)*(K+J);
  2538.               E1[L-1]=J+K+L;
  2539.               E1[K-1]=J*K*L;
  2540.             }
  2541.  
  2542.            /*                                     */
  2543.            /*  Module 7: Trigonometric Functions  */
  2544.            /*                                     */
  2545.  
  2546.            X=0.5;
  2547.            Y=0.5;
  2548.            
  2549.            for (I=1;I<=N7;I++)
  2550.              {
  2551.                /*                                 */
  2552.                /* Comment Out Next 2 Lines to Run */
  2553.                /*   Benchmark With Math Library   */
  2554.                /*          Stubbed Off            */
  2555.  
  2556.                /*X=T*ATAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0));*/
  2557.                /*Y=T*ATAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0));*/
  2558.  
  2559.                /*   Uncomment Next 2 Line to Run  */
  2560.                /*   Benchmark With Math Library   */
  2561.                /*          Stubbed Off            */
  2562.  
  2563.                X=T*MYSTUB(T2*MYSTUB(X)*MYSTUB(X)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));
  2564.                Y=T*MYSTUB(T2*MYSTUB(Y)*MYSTUB(Y)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));
  2565.  
  2566.               }
  2567.               
  2568.             /*                                    */
  2569.             /*     Module 8: Procedure Calls      */
  2570.             /*                                    */
  2571.  
  2572.             X=1.0;
  2573.             Y=1.0;
  2574.             Z=1.0;
  2575.              
  2576.             for (I=1;I<=N8;I++)
  2577.               {
  2578.                 P3(X,Y,Z);
  2579.               }
  2580.  
  2581.             /*                                     */
  2582.             /*     Module 9: Array References      */
  2583.             /*                                     */
  2584.  
  2585.             J=0;
  2586.             K=1;
  2587.             L=2;
  2588.  
  2589.             E1[0]=1.0;
  2590.             E1[1]=2.0;
  2591.             E1[2]=3.0;
  2592.    
  2593.             for (I=1;I<=N9;I++)
  2594.               {
  2595.                 P0();
  2596.               }
  2597.  
  2598.             /*                                      */
  2599.             /*     Module 10: Integer Arithmetic    */
  2600.             /*                                      */
  2601.  
  2602.             J=2;
  2603.             K=3;
  2604.  
  2605.             for (I=1;I<=N10;I++)
  2606.               {
  2607.                 J=J+K;
  2608.                 K=J+K;
  2609.                 J=K-J;
  2610.                 K=K-J-J;
  2611.               }
  2612.       
  2613.              /*                                      */
  2614.              /*     Module 11: Standard Functions    */
  2615.              /*                                      */
  2616.  
  2617.              X=0.75;
  2618.            
  2619.              for (I=1;I<=N11;I++)
  2620.                {
  2621.  
  2622.                  /*                                 */
  2623.                  /* Comment Out Next   Line  to Run */
  2624.                  /*   Benchmark With Math Library   */
  2625.                  /*          Stubbed Off            */
  2626.  
  2627.                  /*X=SQRT(EXP(LOG(X)/T1));          */
  2628.                  
  2629.                  /*   Uncomment Next   Line to Run  */
  2630.                  /*   Benchmark With Math Library   */
  2631.                  /*          Stubbed Off            */
  2632.             
  2633.                  X=MYSTUB(MYSTUB(MYSTUB(X)/T1));
  2634.                }
  2635.       }
  2636.    
  2637.     /*                                        */
  2638.     /*  Get Whetstone Stop Time from Operating  */
  2639.     /*                        */
  2640.  
  2641.     ftime(&TIME_POINTER);
  2642.     *TSTOP=TIME_POINTER.time+TIME_POINTER.millitm/1000.0;
  2643.  
  2644.   }
  2645.   
  2646. #include stdio            /* standard I/O library*/
  2647.  
  2648. COMPUT()
  2649.     {
  2650.      float AVTIME,AVRATE,RATE;
  2651.      double TSTART,TSTOP;
  2652.      float DELTAT;
  2653.      int NRUNS,LCOUNT,IRATE,KCYCLE,I;
  2654.  
  2655.      int FILE_NAME;
  2656.  
  2657.      FILE *FP;
  2658.  
  2659.      FILE_NAME=creat("WHETCA.DAT");
  2660.  
  2661.      FP=fdopen(FILE_NAME,"rw");
  2662.  
  2663.      fprintf(FP,"C Whetstone Benchmark (with stubbed MATH lib)\n");
  2664.      printf("C Whetstone Benchmark (with stubbed MATH lib)\n");
  2665.     
  2666.      AVTIME = 0.0;
  2667.      AVRATE = 0.0;
  2668.      KCYCLE =10;
  2669.      NRUNS  = 5;
  2670.      I = 10;
  2671.  
  2672.      for ( LCOUNT=1; LCOUNT <= NRUNS; LCOUNT++)
  2673.        {
  2674.           WHET(I,KCYCLE,&TSTART,&TSTOP);
  2675.     
  2676.           printf("\nWhetstone start time: %8.2f Seconds",TSTART);       
  2677.           fprintf(FP,"\nWhetstone start time: %8.2f Seconds",TSTART);       
  2678.  
  2679.           printf("\nWhetstone stop time: %8.2f Seconds",TSTOP);       
  2680.           fprintf(FP,"\nWhetstone stop time: %8.2f Seconds",TSTOP);       
  2681.  
  2682.           /*                      */
  2683.           /*  Compute and Write the Elapsed Time  */
  2684.           /*                      */
  2685.           /*                                      */
  2686.           DELTAT = TSTOP - TSTART;
  2687.  
  2688.           printf("\nElapsed time for %3d cycles %8.2f seconds",KCYCLE,DELTAT);
  2689.           fprintf(FP,"\nElapsed time for %3d cycles %8.2f seconds",KCYCLE,
  2690.                      DELTAT);
  2691.           
  2692.           /*  Sum Time in Milliseconds per Cycle */
  2693.  
  2694.           AVTIME=AVTIME+(DELTAT*1000.0)/KCYCLE;
  2695.  
  2696.           /*                      */
  2697.           /*  Calculate Whetstone Rating Based on */
  2698.           /*  Time for Number of Cycles Just      */
  2699.           /*  Executed                   */
  2700.  
  2701.           RATE = (1000.0*KCYCLE)/DELTAT;
  2702.  
  2703.           /* Sum Whetstone Rating                 */
  2704.  
  2705.           AVRATE = AVRATE + RATE;
  2706.           IRATE  = RATE;
  2707.           
  2708.           printf("\nWhetstone rating: %5d KWIPS\n",IRATE);
  2709.           fprintf(FP,"\nWhetstone rating: %5d KWIPS\n",IRATE);
  2710.  
  2711.           KCYCLE=KCYCLE+10;
  2712.  
  2713.        }
  2714.      
  2715.      /*                        */
  2716.      /*  Compute Average Time in Milliseconds      */
  2717.      /*  Per Cycle and Write                       */
  2718.      /*                                            */
  2719.  
  2720.      AVTIME = AVTIME/NRUNS;
  2721.  
  2722.      printf("\nAverage Time Per Cycle: %8.2f Milliseconds",AVTIME);
  2723.      fprintf(FP,"\nAverage Time Per Cycle: %8.2f Milliseconds",AVTIME);
  2724.    
  2725.      /*                                  */
  2726.      /* Calculate Average Whetstone Rating and Write  */
  2727.      /*                           */
  2728.  
  2729.      AVRATE = AVRATE/NRUNS;
  2730.      IRATE  = AVRATE;
  2731.  
  2732.      printf("\nAverage Whetstone rating: %5d KWIPS",IRATE);
  2733.      fprintf(FP,"\nAverage Whetstone rating: %5d KWIPS",IRATE);
  2734.  
  2735.      fclose(FP);            
  2736.     }     
  2737. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2738. --whetcb.c
  2739. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2740. /* Filename: WHETCB.C */
  2741.  
  2742. main()
  2743.  
  2744.   {
  2745.     /* C version of Whetstone Benchmark Program (with MATH lib)    */
  2746.     /* Reference: "Computer Journal", February 1976, pages 43-49,  */
  2747.     /*            for description of benchmark and ALGOL60 version.*/
  2748.     /* Note     : Procedure POUT is omitted.                       */
  2749.  
  2750.     COMPUT();
  2751.   }
  2752. /*                                               */
  2753. /* Uncomment following function to run Benchmark */
  2754. /* with MATH library stubbed off                 */
  2755. /*                                               */
  2756.  
  2757. /*float MYSTUB(X)                                */          
  2758.  
  2759. /*float X;                                       */
  2760.  
  2761. /* {                                             */
  2762. /*         return(1.0);                          */
  2763. /*  }                                            */  
  2764.  
  2765. PA(E)
  2766.  
  2767.   float E[4];
  2768.  
  2769.   {
  2770.     int J;
  2771.     extern float T,T2;
  2772.  
  2773.     J=0;
  2774.  
  2775. ONE:E[0]=(E[0]+E[1]+E[2]-E[3])*T;
  2776.     E[1]=(E[0]+E[1]-E[2]+E[3])*T;
  2777.     E[2]=(E[0]-E[1]+E[2]+E[3])*T;
  2778.     E[3]=(-E[0]+E[1]+E[2]+E[3])/T2;
  2779.  
  2780.     J=J+1;
  2781.  
  2782.     if (J<6) goto ONE;
  2783.  
  2784.   }
  2785.  
  2786. P0()
  2787.  
  2788.   {
  2789.     extern float E1[4];
  2790.     extern int J,K,L;
  2791.  
  2792.     E1[J]=E1[K];
  2793.     E1[K]=E1[L];
  2794.     E1[L]=E1[J];
  2795.  
  2796.   }
  2797.  
  2798. P3(X,Y,Z)
  2799.  
  2800.   float X,Y,Z;
  2801.  
  2802.   {
  2803.  
  2804.     extern float T,T2;
  2805.     
  2806.     X=T*(X+Y);
  2807.     Y=T*(X+Y);
  2808.     Z=(X+Y)/T2;
  2809.  
  2810.   }
  2811.  
  2812. #include timeb
  2813.  
  2814. WHET(I,KCYCLE,TSTART,TSTOP)
  2815.  
  2816.    double *TSTART,*TSTOP;
  2817.    int I,KCYCLE;
  2818.   {
  2819.     float X1,X2,X3,X4,X,Y,Z,T1;
  2820.     int   N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,LCOUNT;
  2821.  
  2822.     extern float T,T2,E1[4];
  2823.     extern int J,K,L;
  2824.  
  2825.     struct timeb *TIME_POINTER;/* timeb structure has the members            */
  2826.                                /* time_t  (gives time in seconds)            */
  2827.                                /* unsigned short millitm ( in milliseconds)  */
  2828.                                /* short time zone        (0)                 */
  2829.                                /* short dstflag          (0)                 */
  2830.    
  2831.     /*                    */
  2832.     /*  Initialize Constants            */
  2833.     /*                    */
  2834.  
  2835.     T=0.499975;
  2836.     T1=0.50025;
  2837.     T2=2.0;
  2838.  
  2839.     /*                          */
  2840.     /* Compute Execution Frequencies    */
  2841.     /* for the Benchmark Modules        */
  2842.    
  2843.     N1=0;
  2844.     N2=12*I;
  2845.     N3=14*I;
  2846.     N4=345*I;
  2847.     N5=0;
  2848.     N6=210*I;
  2849.     N7=32*I;
  2850.     N8=899*I;
  2851.     N9=616*I;
  2852.     N10=0;
  2853.     N11=93*I;
  2854.    
  2855.     /*                    */
  2856.     /*  Get Whetstone Start Time from   */
  2857.     /*          Operating System        */
  2858.     /*                                  */
  2859.  
  2860.     ftime(&TIME_POINTER);
  2861.  
  2862.     *TSTART=TIME_POINTER.time+TIME_POINTER.millitm/1000.0;
  2863.  
  2864.     for (LCOUNT=1;LCOUNT<=KCYCLE;LCOUNT++)
  2865.       {
  2866.          /*                              */
  2867.          /* Module 1: Simple Identifiers */
  2868.          /*                              */
  2869.  
  2870.          X1=1.0;
  2871.          X2=-1.0;
  2872.          X3=-1.0;
  2873.          X4=-1.0;
  2874.          for (I=1;I<=N1;I++)
  2875.            {
  2876.               X1=(X1+X2+X3-X4)*T;
  2877.               X2=(X1+X2-X3+X4)*T;
  2878.               X3=(X1-X2+X3+X4)*T;
  2879.               X4=(-X1+X2+X3+X4)*T;
  2880.            }
  2881.  
  2882.          /*                               */
  2883.          /*    Module 2: Array Elements   */
  2884.          /*       Note : Arrary Subscripts*/
  2885.          /*              in C begin       */
  2886.          /*              with 0.          */
  2887.  
  2888.          E1[0]=1.0;
  2889.          E1[1]=-1.0;
  2890.          E1[2]=-1.0;
  2891.          E1[3]=-1.0;
  2892.          
  2893.          for (I=1;I<=N2;I++)
  2894.            {
  2895.               E1[0]=(E1[0]+E1[1]+E1[2]-E1[3])*T;
  2896.               E1[1]=(E1[0]+E1[1]-E1[2]+E1[3])*T;
  2897.               E1[2]=(E1[0]-E1[1]+E1[2]+E1[3])*T;
  2898.               E1[3]=(-E1[0]+E1[1]+E1[2]+E1[3])*T;
  2899.  
  2900.            }
  2901.  
  2902.          /*                                */
  2903.          /*  Module 3: Array as Parameter  */
  2904.          /*                                */
  2905.  
  2906.          for (I=1;I<=N3;I++)
  2907.            {
  2908.              PA(E1);
  2909.            }
  2910.  
  2911.          /*                                */
  2912.          /*  Module 4: Conditional Jumps   */
  2913.          /*                                */
  2914.  
  2915.          J=1;
  2916.          
  2917.          for (I=1;I<=N4;I++)
  2918.            {
  2919.              if (J==1)
  2920.                J=2;
  2921.              else
  2922.                J=3;
  2923.              if (J>2)
  2924.                J=0;
  2925.              else
  2926.                J=1;
  2927.              if (J<1)
  2928.                J=1;
  2929.              else
  2930.                J=0;
  2931.             }
  2932.  
  2933.           /*                                */
  2934.           /*       Module 5 Omitted         */
  2935.           /*                                */
  2936.  
  2937.           /*                                */
  2938.           /*  Module 6: Integer Arithmetic  */
  2939.           /*                                */
  2940.  
  2941.           J=1;
  2942.           K=2;
  2943.           L=3;
  2944.  
  2945.           for (I=1;I<=N6;I++)
  2946.             {
  2947.               J=J*(K-J)*(L-K);
  2948.               K=L*K-(L-J)*K;
  2949.               L=(L-K)*(K+J);
  2950.               E1[L-1]=J+K+L;
  2951.               E1[K-1]=J*K*L;
  2952.             }
  2953.  
  2954.            /*                                     */
  2955.            /*  Module 7: Trigonometric Functions  */
  2956.            /*                                     */
  2957.  
  2958.            X=0.5;
  2959.            Y=0.5;
  2960.            
  2961.            for (I=1;I<=N7;I++)
  2962.              {
  2963.                /*                                 */
  2964.                /* Comment Out Next 2 Lines to Run */
  2965.                /*   Benchmark With Math Library   */
  2966.                /*          Stubbed Off            */
  2967.  
  2968.                X=T*ATAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0));
  2969.                Y=T*ATAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0));
  2970.  
  2971.                /*   Uncomment Next 2 Line to Run  */
  2972.                /*   Benchmark With Math Library   */
  2973.                /*          Stubbed Off            */
  2974.  
  2975.                /*X=T*MYSTUB(T2*MYSTUB(X)*MYSTUB(X)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));*/
  2976.                /*Y=T*MYSTUB(T2*MYSTUB(Y)*MYSTUB(Y)/(MYSTUB(X+Y)+MYSTUB(X-Y)-1.0));*/
  2977.  
  2978.               }
  2979.               
  2980.             /*                                    */
  2981.             /*     Module 8: Procedure Calls      */
  2982.             /*                                    */
  2983.  
  2984.             X=1.0;
  2985.             Y=1.0;
  2986.             Z=1.0;
  2987.              
  2988.             for (I=1;I<=N8;I++)
  2989.               {
  2990.                 P3(X,Y,Z);
  2991.               }
  2992.  
  2993.             /*                                     */
  2994.             /*     Module 9: Array References      */
  2995.             /*                                     */
  2996.  
  2997.             J=0;
  2998.             K=1;
  2999.             L=2;
  3000.  
  3001.             E1[0]=1.0;
  3002.             E1[1]=2.0;
  3003.             E1[2]=3.0;
  3004.    
  3005.             for (I=1;I<=N9;I++)
  3006.               {
  3007.                 P0();
  3008.               }
  3009.  
  3010.             /*                                      */
  3011.             /*     Module 10: Integer Arithmetic    */
  3012.             /*                                      */
  3013.  
  3014.             J=2;
  3015.             K=3;
  3016.  
  3017.             for (I=1;I<=N10;I++)
  3018.               {
  3019.                 J=J+K;
  3020.                 K=J+K;
  3021.                 J=K-J;
  3022.                 K=K-J-J;
  3023.               }
  3024.       
  3025.              /*                                      */
  3026.              /*     Module 11: Standard Functions    */
  3027.              /*                                      */
  3028.  
  3029.              X=0.75;
  3030.            
  3031.              for (I=1;I<=N11;I++)
  3032.                {
  3033.  
  3034.                  /*                                 */
  3035.                  /* Comment Out Next   Line  to Run */
  3036.                  /*   Benchmark With Math Library   */
  3037.                  /*          Stubbed Off            */
  3038.  
  3039.                  X=SQRT(EXP(LOG(X)/T1));
  3040.                  
  3041.                  /*   Uncomment Next   Line to Run  */
  3042.                  /*   Benchmark With Math Library   */
  3043.                  /*          Stubbed Off            */
  3044.             
  3045.                  /*X=MYSTUB(MYSTUB(MYSTUB(X)/T1));  */
  3046.                }
  3047.       }
  3048.    
  3049.     /*                                        */
  3050.     /*  Get Whetstone Stop Time from Operating  */
  3051.     /*                        */
  3052.  
  3053.     ftime(&TIME_POINTER);
  3054.     *TSTOP=TIME_POINTER.time+TIME_POINTER.millitm/1000.0;
  3055.  
  3056.   }
  3057.   
  3058. #include stdio            /* standard I/O library*/
  3059.  
  3060. COMPUT()
  3061.     {
  3062.      float AVTIME,AVRATE,RATE;
  3063.      double TSTART,TSTOP;
  3064.      float DELTAT;
  3065.      int NRUNS,LCOUNT,IRATE,KCYCLE,I;
  3066.  
  3067.      int FILE_NAME;
  3068.  
  3069.      FILE *FP;
  3070.  
  3071.      FILE_NAME=creat("WHETCB.DAT");
  3072.  
  3073.      FP=fdopen(FILE_NAME,"rw");
  3074.  
  3075.      fprintf(FP,"C Whetstone Benchmark (with MATH lib)\n");
  3076.      printf("C Whetstone Benchmark (with MATH lib)\n");
  3077.     
  3078.      AVTIME = 0.0;
  3079.      AVRATE = 0.0;
  3080.      KCYCLE =10;
  3081.      NRUNS  = 5;
  3082.      I = 10;
  3083.  
  3084.      for ( LCOUNT=1; LCOUNT <= NRUNS; LCOUNT++)
  3085.        {
  3086.           WHET(I,KCYCLE,&TSTART,&TSTOP);
  3087.     
  3088.           printf("\nWhetstone start time: %8.2f Seconds",TSTART);       
  3089.           fprintf(FP,"\nWhetstone start time: %8.2f Seconds",TSTART);       
  3090.  
  3091.           printf("\nWhetstone stop time: %8.2f Seconds",TSTOP);       
  3092.           fprintf(FP,"\nWhetstone stop time: %8.2f Seconds",TSTOP);       
  3093.  
  3094.           /*                      */
  3095.           /*  Compute and Write the Elapsed Time  */
  3096.           /*                      */
  3097.           /*                                      */
  3098.           DELTAT = TSTOP - TSTART;
  3099.  
  3100.           printf("\nElapsed time for %3d cycles %8.2f seconds",KCYCLE,DELTAT);
  3101.           fprintf(FP,"\nElapsed time for %3d cycles %8.2f seconds",KCYCLE,
  3102.                      DELTAT);
  3103.           
  3104.           /*  Sum Time in Milliseconds per Cycle */
  3105.  
  3106.           AVTIME=AVTIME+(DELTAT*1000.0)/KCYCLE;
  3107.  
  3108.           /*                      */
  3109.           /*  Calculate Whetstone Rating Based on */
  3110.           /*  Time for Number of Cycles Just      */
  3111.           /*  Executed                   */
  3112.  
  3113.           RATE = (1000.0*KCYCLE)/DELTAT;
  3114.  
  3115.           /* Sum Whetstone Rating                 */
  3116.  
  3117.           AVRATE = AVRATE + RATE;
  3118.           IRATE  = RATE;
  3119.           
  3120.           printf("\nWhetstone rating: %5d KWIPS\n",IRATE);
  3121.           fprintf(FP,"\nWhetstone rating: %5d KWIPS\n",IRATE);
  3122.  
  3123.           KCYCLE=KCYCLE+10;
  3124.  
  3125.        }
  3126.      
  3127.      /*                        */
  3128.      /*  Compute Average Time in Milliseconds      */
  3129.      /*  Per Cycle and Write                       */
  3130.      /*                                            */
  3131.  
  3132.      AVTIME = AVTIME/NRUNS;
  3133.  
  3134.      printf("\nAverage Time Per Cycle: %8.2f Milliseconds",AVTIME);
  3135.      fprintf(FP,"\nAverage Time Per Cycle: %8.2f Milliseconds",AVTIME);
  3136.    
  3137.      /*                                  */
  3138.      /* Calculate Average Whetstone Rating and Write  */
  3139.      /*                           */
  3140.  
  3141.      AVRATE = AVRATE/NRUNS;
  3142.      IRATE  = AVRATE;
  3143.  
  3144.      printf("\nAverage Whetstone rating: %5d KWIPS",IRATE);
  3145.      fprintf(FP,"\nAverage Whetstone rating: %5d KWIPS",IRATE);
  3146.  
  3147.      fclose(FP);            
  3148.     }     
  3149.  
  3150.