Browse Source

improved version of mandelbrot benchmark, uses now sse2 exclusively.

git-svn-id: trunk@9615 -
Vincent Snijders 17 years ago
parent
commit
4958973566
1 changed files with 40 additions and 35 deletions
  1. 40 35
      tests/bench/shootout/src/mandelbrot.pp

+ 40 - 35
tests/bench/shootout/src/mandelbrot.pp

@@ -9,59 +9,64 @@ program mandelbrot;
 
 {$FPUTYPE SSE2}{$I-}
 
-var n, x, y, bits,bit: Longint;
-    Cx, Cy: double;
+var n: longint;
+    TextBuf: array[0..$FFF] of byte;
+    OutFile: PText;
+    
 
-procedure CalculatePoint; nostackframe;
-const
-  Limit: double =4.0;
-  zero: double = 0.0;
+procedure run;
 var
-  i: longint;
-  OutOfLimit: boolean;
-  Cr, Ci, Zr, Zi, Ti, Tr: Double;
-  
-begin
-  Cr := Cx; Ci := Cy;
-  Zr := zero;  Zi := zero; Tr := zero; Ti := zero;
-  i := 0;
-  repeat
-    Zi := 2*Zr*Zi + Ci;
-    Zr := Tr - Ti + Cr;
-    Ti := Zi * Zi;
-    Tr := Zr * Zr;
-    inc(i);
-    OutOfLimit := (Tr + Ti>=limit);
-  until OutOfLimit or (i=50);
+  Cy, Step: double;
+  x, y, bits,bit: Longint;
+  function CalculatePoint(Cx, Cy: double): boolean; nostackframe; inline;
+  const
+    Limit = 4;
+  var
+    i: longint;
+    Zr, Zi, Ti, Tr: Double;
 
-  if OutOfLimit then
-    bits := bits xor bit;
-end;
+  begin
+    Zr := 0;  Zi := 0; Tr := 0; Ti := 0;
+    for i := 1 to 50 do begin
+      Zi := 2*Zr*Zi + Cy;
+      Zr := Tr - Ti + Cx;
+      Ti := Zi * Zi;
+      Tr := Zr * Zr;
+      if (Tr + Ti>=limit) then exit(true);
+    end;
 
-{$FPUTYPE X87}
+    CalculatePoint := false;
+  end;
 
 begin
-  Val(ParamStr(1), n);
-  writeln('P4');
-  writeln(n,' ',n);
+  Step := 2/n;
   for y := 0 to n-1 do
   begin
-    Cy := y * 2 / n - 1;
+    Cy := y * Step - 1;
     bits := 255;  bit := 128;
     for x := 0 to n-1 do
     begin
-      Cx := x * 2 / n  - 1.5;
-
-      CalculatePoint;
+      if CalculatePoint(x * Step  - 1.5, Cy) then
+        bits := bits xor bit;
 
       if bit > 1 then
         bit := bit shr 1
       else
       begin
-        write(chr(bits));
+        write(OutFile^, chr(bits));
         bits := 255;  bit := 128;
       end;
     end;
-    if bit < 128 then write(chr(bits xor((bit shl 1)-1)));
+    if bit < 128 then write(OutFile^, chr(bits xor((bit shl 1)-1)));
   end;
+end;
+
+begin
+  OutFile := @Output;
+  SetTextBuf(OutFile^, TextBuf);
+
+  Val(ParamStr(1), n);
+  writeln(OutFile^, 'P4');
+  writeln(OutFile^, n,' ',n);
+  run;
 end.