Bug 1915045 Ensure decode tasks are scheduled on BufferingState::Enter() r=media...
[gecko.git] / js / xpconnect / tests / unit / test_wasm_tailcalls_profiler.js
blob64f29b9510e01b0d11d84f3f22dc68a93e043ef1
1 Services.prefs.setBoolPref("javascript.options.wasm_tail_calls", true);
2 registerCleanupFunction(() => {
3   Services.prefs.clearUserPref("javascript.options.wasm_tail_calls");
4 });
6 // The tests runs code in tight loop with the profiler enabled. It is testing
7 // behavoir of MacroAssembler::wasmCollapseFrameXXXX methods.
8 // It is not guarantee 100% hit since the profiler probes stacks every 1ms,
9 // but it will happen often enough.
10 add_task(async () => {
11   await Services.profiler.StartProfiler(10, 1, ["js"], ["GeckoMain"]);
12   Assert.ok(Services.profiler.IsActive());
14 /* Wasm module that is tested:
15 (module
16     (func $f (param i64 i64 i64 i64 i64 i64 i64 i64 i64)
17         local.get 0
18         i64.eqz
19         br_if 0
20         local.get 0
21         return_call $g
22     )
23     (func $g (param i64)
24         local.get 0
25         i64.const 1
26         i64.sub
27         i64.const 2
28         i64.const 6
29         i64.const 3
30         i64.const 4
31         i64.const 1
32         i64.const 2
33         i64.const 6
34         i64.const 3
35         return_call $f
36     )
37     (func (export "run")
38         i64.const 0x100000
39         call $g
40     )
44   const b = new Uint8Array([
45     0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x14, 0x03, 0x60,
46     0x09, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x00, 0x60,
47     0x01, 0x7e, 0x00, 0x60, 0x00, 0x00, 0x03, 0x04, 0x03, 0x00, 0x01, 0x02,
48     0x07, 0x07, 0x01, 0x03, 0x72, 0x75, 0x6e, 0x00, 0x02, 0x0a, 0x31, 0x03,
49     0x0b, 0x00, 0x20, 0x00, 0x50, 0x0d, 0x00, 0x20, 0x00, 0x12, 0x01, 0x0b,
50     0x19, 0x00, 0x20, 0x00, 0x42, 0x01, 0x7d, 0x42, 0x02, 0x42, 0x06, 0x42,
51     0x03, 0x42, 0x04, 0x42, 0x01, 0x42, 0x02, 0x42, 0x06, 0x42, 0x03, 0x12,
52     0x00, 0x0b, 0x09, 0x00, 0x42, 0x80, 0x80, 0xc0, 0x00, 0x10, 0x01, 0x0b
53   ]);
54   const ins = new WebAssembly.Instance(new WebAssembly.Module(b));
55   for (var i = 0; i < 100; i++) {
56     ins.exports.run();
57   }
58   
59   Assert.ok(true, "Done");
60   await Services.profiler.StopProfiler();
61 });
63 add_task(async () => {
64   await Services.profiler.StartProfiler(10, 1, ["js"], ["GeckoMain"]);
65   Assert.ok(Services.profiler.IsActive());
67 /* Wasm modules that are tested:
68 (module (func (export "t")))
70 (module
71     (import "" "t" (func $g))
72     (table $t 1 1 funcref)
74     (func $f (return_call_indirect $t (i32.const 0)))  
75     (func (export "run") (param i64)
76      loop
77        local.get 0
78        i64.eqz
79        br_if 1
80        call $f
81        local.get 0
82        i64.const 1
83        i64.sub
84        local.set 0
85        br 0
86      end
87     )
88     (elem (i32.const 0) $g)
91   const b0 = new Uint8Array([
92     0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60,
93     0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x07, 0x05, 0x01, 0x01, 0x74, 0x00,
94     0x00, 0x0a, 0x04, 0x01, 0x02, 0x00, 0x0b  
95   ]);
96   const ins0 = new WebAssembly.Instance(new WebAssembly.Module(b0));
97   const b = new Uint8Array([
98     0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x60,
99     0x00, 0x00, 0x60, 0x01, 0x7e, 0x00, 0x02, 0x06, 0x01, 0x00, 0x01, 0x74,
100     0x00, 0x00, 0x03, 0x03, 0x02, 0x00, 0x01, 0x04, 0x05, 0x01, 0x70, 0x01,
101     0x01, 0x01, 0x07, 0x07, 0x01, 0x03, 0x72, 0x75, 0x6e, 0x00, 0x02, 0x09,
102     0x07, 0x01, 0x00, 0x41, 0x00, 0x0b, 0x01, 0x00, 0x0a, 0x1f, 0x02, 0x07,
103     0x00, 0x41, 0x00, 0x13, 0x00, 0x00, 0x0b, 0x15, 0x00, 0x03, 0x40, 0x20,
104     0x00, 0x50, 0x0d, 0x01, 0x10, 0x01, 0x20, 0x00, 0x42, 0x01, 0x7d, 0x21,
105     0x00, 0x0c, 0x00, 0x0b, 0x0b
106   ]);
107   const ins = new WebAssembly.Instance(new WebAssembly.Module(b), {"": {t: ins0.exports.t,},});
108   for (var i = 0; i < 100; i++) {
109     ins.exports.run(0x100000n);
110   }
112   Assert.ok(true, "Done");
113   await Services.profiler.StopProfiler();
117  * All the tests are implemented with add_task, this starts them automatically.
118  */
119 function run_test() {
120   do_get_profile();
121   run_next_test();