diff options
author | vincents <vincents@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2008-01-02 15:18:25 +0000 |
---|---|---|
committer | vincents <vincents@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2008-01-02 15:18:25 +0000 |
commit | 9a4a5c9138e306bd0fea32caa8080c71bcafe1ba (patch) | |
tree | f1b606024d6f713af8a1261d5b15347325aa1131 /tests/bench | |
parent | 0fbd2716c09d6624572d9a6ecccae8491c6191c6 (diff) | |
download | fpc-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.pp | 75 |
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. |