OSR entry: delay outer-loop compilation when at inner-loop
[WebKit-https.git] / JSTests / microbenchmarks / mandelbrot.js
1 const max_s = 255;
2 const hysterisis = 3;
3
4 function mandelbrot(x, y, w, h, scene_i, scene_z, X, Y, iterations) {
5     const max_z = 2.0;
6     
7     for (let i = X; i; --i)
8         for (let j = Y; j; --j) {
9             let real = x + (i - 1) / (1.0 * (X - 1) * w);
10             let imag = y + (j - 1) / (1.0 * (Y - 1) * h);
11             let z_real = 0.0;
12             let z_imag = 0.0;
13             
14             let it = iterations;
15             while (--it && Math.sqrt(z_real**2 + z_imag**2) < max_z) {
16                 const next_real = z_real**2 - z_imag**2 + real;
17                 const next_imag = 2 * (z_real * z_imag) + imag;
18                 z_real = next_real;
19                 z_imag = next_imag;
20             }
21             
22             const idx = (j - 1) * X + (i - 1);
23             const new_i = max_s * it / (1.0 * iterations);
24             scene_i[idx] = ((scene_i[idx] + new_i * hysterisis) / (hysterisis + 1)) | 0;
25             const new_z = max_s * Math.min(max_z, Math.sqrt(z_real**2 + z_imag**2)) / max_z;
26             scene_z[idx] = ((scene_z[idx] + new_z * hysterisis) / (hysterisis + 1)) | 0;
27         }
28 }
29
30 const shades = ['█', '▉', '▊', '▋', '▌', '▍', '▎', '▏', '▓', '▒', '░'];
31 const shade = i => shades[Math.round((i * (shades.length - 1)) / max_s)];
32
33 function printable(scene_i, scene_z, X, Y) {
34     let s = "";
35     for (let i = 0; i < X; ++i) {
36         for (let j = 0; j < Y; ++j) {
37             const idx = j * X + i;
38             s += shade((scene_i[idx] + scene_z[idx]) / 2);
39             if (j == Y - 1)
40                 s += '\n';
41         }
42     }
43     return s;
44 }
45
46 const width = 80, height = 80;
47 let scene_i = Array.of(width * height).fill(0);
48 let scene_z = Array.of(width * height).fill(0);
49
50 for (let i = 1; i < 64; ++i) {
51     mandelbrot(-0.5, -0.5, 0.5, 0.5, scene_i, scene_z, width, height, i);
52 }
53
54 const result = printable(scene_i, scene_z, width, height);
55
56 let seen = false;
57 for (let i = 0; i < result.length; ++i)
58     if (result[i] === shades[0])
59         seen = true;
60
61 if (!seen)
62     throw new Error(`Unexpected mandelbrot:\n${result}`);