summaryrefslogtreecommitdiff
path: root/tests/bench
diff options
context:
space:
mode:
authorvincents <vincents@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-01-02 15:18:25 +0000
committervincents <vincents@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-01-02 15:18:25 +0000
commit9a4a5c9138e306bd0fea32caa8080c71bcafe1ba (patch)
treef1b606024d6f713af8a1261d5b15347325aa1131 /tests/bench
parent0fbd2716c09d6624572d9a6ecccae8491c6191c6 (diff)
downloadfpc-9a4a5c9138e306bd0fea32caa8080c71bcafe1ba.tar.gz
improved version of mandelbrot benchmark, uses now sse2 exclusively.
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@9615 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'tests/bench')
-rw-r--r--tests/bench/shootout/src/mandelbrot.pp75
1 files changed, 40 insertions, 35 deletions
diff --git a/tests/bench/shootout/src/mandelbrot.pp b/tests/bench/shootout/src/mandelbrot.pp
index 18c4461d99..fad0682055 100644
--- a/tests/bench/shootout/src/mandelbrot.pp
+++ b/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.