diff --git a/README.md b/README.md index 97d6dd90..908327f4 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ A brief description for `example` | example/blake2b.py | Blake2b hashing algorithm | | example/blake2b_direct.py | Make the hash result returned as a value, not as an output parameter | | example/blake2b_iter.py | A benchmarking example using the blake2b hash function | +| example/blake2b_simd.py | Use SIMD instructions to accelerate the blake2b hash function | | example/fibonacci.py | Fibonacci, which contains loop and recursion | | example/fibonacci_env.py | Call python/native function in wasm | | example/pi.py | Calculate π using the agm algorithm | diff --git a/example/blake2b_simd.py b/example/blake2b_simd.py new file mode 100644 index 00000000..059e5490 --- /dev/null +++ b/example/blake2b_simd.py @@ -0,0 +1,23 @@ +import pywasm + +runtime = pywasm.core.Runtime() +module = runtime.instance_from_file('example/blake2b_simd/bin/blake2b_simd.wasm') +memory = runtime.exported_memory(module, 'memory') + +data = bytearray(b'abc') +data_size = len(data) +data_ptr = runtime.invocate(module, 'alloc', [data_size])[0] +hash_size = 64 +hash_ptr = runtime.invocate(module, 'alloc', [hash_size])[0] +memory.put(data_ptr, data) +runtime.invocate(module, 'blake2b', [data_ptr, data_size, hash_ptr, hash_size]) +hash = memory.get(hash_ptr, hash_size) +print(hash.hex()) +assert hash == bytearray([ + 0xba, 0x80, 0xa5, 0x3f, 0x98, 0x1c, 0x4d, 0x0d, 0x6a, 0x27, 0x97, 0xb6, 0x9f, 0x12, 0xf6, 0xe9, + 0x4c, 0x21, 0x2f, 0x14, 0x68, 0x5a, 0xc4, 0xb7, 0x4b, 0x12, 0xbb, 0x6f, 0xdb, 0xff, 0xa2, 0xd1, + 0x7d, 0x87, 0xc5, 0x39, 0x2a, 0xab, 0x79, 0x2d, 0xc2, 0x52, 0xd5, 0xde, 0x45, 0x33, 0xcc, 0x95, + 0x18, 0xd3, 0x8a, 0xa8, 0xdb, 0xf1, 0x92, 0x5a, 0xb9, 0x23, 0x86, 0xed, 0xd4, 0x00, 0x99, 0x23, +]) +runtime.invocate(module, 'dealloc', [data_ptr, data_size]) +runtime.invocate(module, 'dealloc', [hash_ptr, hash_size]) diff --git a/example/blake2b_simd/.cargo/config.toml b/example/blake2b_simd/.cargo/config.toml new file mode 100644 index 00000000..5bd38ca9 --- /dev/null +++ b/example/blake2b_simd/.cargo/config.toml @@ -0,0 +1,5 @@ +[build] +target = "wasm32-unknown-unknown" + +[target.wasm32-unknown-unknown] +rustflags = ["-C", "target-feature=+simd128"] diff --git a/example/blake2b_simd/.gitignore b/example/blake2b_simd/.gitignore new file mode 100644 index 00000000..ea8c4bf7 --- /dev/null +++ b/example/blake2b_simd/.gitignore @@ -0,0 +1 @@ +/target diff --git a/example/blake2b_simd/Cargo.lock b/example/blake2b_simd/Cargo.lock new file mode 100644 index 00000000..3d1edd22 --- /dev/null +++ b/example/blake2b_simd/Cargo.lock @@ -0,0 +1,16 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "blake2b_simd" +version = "1.0.0" +dependencies = [ + "blake2ya", +] + +[[package]] +name = "blake2ya" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e6144a361a49cc2a282f75205a8e8658dac95e99020acdd7c9831fc4baf01" diff --git a/example/blake2b_simd/Cargo.toml b/example/blake2b_simd/Cargo.toml new file mode 100644 index 00000000..14aa9bf4 --- /dev/null +++ b/example/blake2b_simd/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "blake2b_simd" +version = "1.0.0" +edition = "2024" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +blake2ya = "1.0" diff --git a/example/blake2b_simd/bin/blake2b_simd.wasm b/example/blake2b_simd/bin/blake2b_simd.wasm new file mode 100755 index 00000000..3a102059 Binary files /dev/null and b/example/blake2b_simd/bin/blake2b_simd.wasm differ diff --git a/example/blake2b_simd/bin/blake2b_simd.wat b/example/blake2b_simd/bin/blake2b_simd.wat new file mode 100644 index 00000000..8bb67d3b --- /dev/null +++ b/example/blake2b_simd/bin/blake2b_simd.wat @@ -0,0 +1,11570 @@ +(module $blake2b_simd.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func (param i32 i32) (result i32))) + (type (;2;) (func (param i32 i32 i32) (result i32))) + (type (;3;) (func (param i32) (result i32))) + (type (;4;) (func (param i32 i32 i32 i32))) + (type (;5;) (func (param i32 i32 i32))) + (type (;6;) (func (param i32 i32 i32 i32) (result i32))) + (type (;7;) (func (param i32 i32 i64 i64 i64 i64))) + (type (;8;) (func (param i32 i32 i32 i32 i32))) + (type (;9;) (func (param i32))) + (type (;10;) (func (param i32 i32 i32 i32 i32 i32) (result i32))) + (type (;11;) (func (param i32 i32 i32 i32 i32) (result i32))) + (func $_ZN69_$LT$core..alloc..layout..LayoutError$u20$as$u20$core..fmt..Debug$GT$3fmt17hf22f41cb8f5fdff3E (type 1) (param i32 i32) (result i32) + local.get 1 + i32.const 1048576 + i32.const 11 + call $_ZN4core3fmt9Formatter9write_str17h5f591b7d46bcc7dbE) + (func $alloc (type 3) (param i32) (result i32) + (local i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + block ;; label = @1 + local.get 0 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 1048604 + i32.const 43 + local.get 1 + i32.const 15 + i32.add + i32.const 1048588 + i32.const 1048660 + call $_ZN4core6result13unwrap_failed17h4e312bd8e5eb4431E + unreachable + end + i32.const 0 + i32.load8_u offset=1049977 + drop + local.get 0 + i32.const 1 + call $_RNvCs691rhTbG0Ee_7___rustc12___rust_alloc + local.set 0 + local.get 1 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 0) + (func $alloc_zeroed (type 3) (param i32) (result i32) + (local i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + block ;; label = @1 + local.get 0 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 1048604 + i32.const 43 + local.get 1 + i32.const 15 + i32.add + i32.const 1048588 + i32.const 1048676 + call $_ZN4core6result13unwrap_failed17h4e312bd8e5eb4431E + unreachable + end + i32.const 0 + i32.load8_u offset=1049977 + drop + local.get 0 + i32.const 1 + call $_RNvCs691rhTbG0Ee_7___rustc19___rust_alloc_zeroed + local.set 0 + local.get 1 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 0) + (func $blake2b (type 4) (param i32 i32 i32 i32) + (local i32 v128) + global.get $__stack_pointer + i32.const 624 + i32.sub + local.tee 4 + global.set $__stack_pointer + local.get 4 + i32.const 132 + i32.add + i32.const 0 + i32.store align=2 + local.get 4 + i32.const 116 + i32.add + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + local.tee 5 + v128.store align=2 + local.get 4 + i32.const 100 + i32.add + local.get 5 + v128.store align=2 + local.get 4 + i32.const 84 + i32.add + local.get 5 + v128.store align=2 + local.get 4 + i32.const 68 + i32.add + local.get 5 + v128.store align=2 + local.get 4 + i32.const 20 + i32.add + local.get 5 + v128.store align=2 + local.get 4 + i32.const 36 + i32.add + local.get 5 + v128.store align=2 + local.get 4 + i32.const 52 + i32.add + local.get 5 + v128.store align=2 + local.get 4 + i64.const 0 + i64.store offset=12 align=2 + local.get 4 + i32.const 16842752 + i32.store offset=8 align=2 + local.get 4 + i32.const 8 + i32.add + i32.const 64 + call $_ZN8blake2ya7blake2b7Param2b6digest17h72a2d9ccd477238dE + block ;; label = @1 + i32.const 128 + i32.eqz + br_if 0 (;@1;) + local.get 4 + i32.const 496 + i32.add + local.get 4 + i32.const 8 + i32.add + i32.const 128 + memory.copy + end + local.get 4 + i32.const 136 + i32.add + local.get 4 + i32.const 496 + i32.add + call $_ZN8blake2ya7blake2b7blake2b17h855b19c6cd048e5bE + local.get 4 + i32.const 136 + i32.add + local.get 0 + local.get 1 + call $_ZN8blake2ya7blake2b7Blake2b6update17h6af962144cc2c580E + local.get 4 + i32.const 136 + i32.add + local.get 2 + local.get 3 + call $_ZN8blake2ya7blake2b7Blake2b6digest17h7e289db40c319d9fE + local.get 4 + i32.const 624 + i32.add + global.set $__stack_pointer) + (func $dealloc (type 0) (param i32 i32) + (local i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 2 + global.set $__stack_pointer + block ;; label = @1 + local.get 1 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 1048604 + i32.const 43 + local.get 2 + i32.const 15 + i32.add + i32.const 1048588 + i32.const 1048692 + call $_ZN4core6result13unwrap_failed17h4e312bd8e5eb4431E + unreachable + end + local.get 0 + local.get 1 + i32.const 1 + call $_RNvCs691rhTbG0Ee_7___rustc14___rust_dealloc + local.get 2 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $_RNvCs691rhTbG0Ee_7___rustc12___rust_alloc (type 1) (param i32 i32) (result i32) + (local i32) + local.get 0 + local.get 1 + call $_RNvCs691rhTbG0Ee_7___rustc11___rdl_alloc + local.set 2 + local.get 2 + return) + (func $_RNvCs691rhTbG0Ee_7___rustc14___rust_dealloc (type 5) (param i32 i32 i32) + local.get 0 + local.get 1 + local.get 2 + call $_RNvCs691rhTbG0Ee_7___rustc13___rdl_dealloc + return) + (func $_RNvCs691rhTbG0Ee_7___rustc14___rust_realloc (type 6) (param i32 i32 i32 i32) (result i32) + (local i32) + local.get 0 + local.get 1 + local.get 2 + local.get 3 + call $_RNvCs691rhTbG0Ee_7___rustc13___rdl_realloc + local.set 4 + local.get 4 + return) + (func $_RNvCs691rhTbG0Ee_7___rustc19___rust_alloc_zeroed (type 1) (param i32 i32) (result i32) + (local i32) + local.get 0 + local.get 1 + call $_RNvCs691rhTbG0Ee_7___rustc18___rdl_alloc_zeroed + local.set 2 + local.get 2 + return) + (func $_RNvCs691rhTbG0Ee_7___rustc26___rust_alloc_error_handler (type 0) (param i32 i32) + local.get 0 + local.get 1 + call $_RNvCs691rhTbG0Ee_7___rustc8___rg_oom + return) + (func $_ZN8blake2ya7blake2b6reduce17h592ec0095d14d42bE (type 7) (param i32 i32 i64 i64 i64 i64) + (local i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64) + local.get 0 + local.get 1 + i64.load offset=64 + local.tee 6 + local.get 0 + i64.load offset=32 + local.tee 7 + local.get 0 + i64.load + local.tee 8 + i64.add + local.get 1 + i64.load + local.tee 9 + i64.add + local.tee 10 + local.get 1 + i64.load offset=8 + local.tee 11 + i64.add + local.get 2 + local.get 10 + i64.xor + i64.const 5840696475078001361 + i64.xor + i64.const 32 + i64.rotl + local.tee 12 + i64.const 7640891576956012808 + i64.add + local.tee 13 + local.get 7 + i64.xor + i64.const 40 + i64.rotl + local.tee 14 + i64.add + local.tee 15 + i64.add + local.get 0 + i64.load offset=40 + local.tee 16 + local.get 0 + i64.load offset=8 + local.tee 17 + i64.add + local.get 1 + i64.load offset=16 + local.tee 2 + i64.add + local.tee 18 + local.get 1 + i64.load offset=24 + local.tee 10 + i64.add + local.get 3 + local.get 18 + i64.xor + i64.const -7276294671716946913 + i64.xor + i64.const 32 + i64.rotl + local.tee 3 + i64.const -4942790177534073029 + i64.add + local.tee 18 + local.get 16 + i64.xor + i64.const 40 + i64.rotl + local.tee 19 + i64.add + local.tee 20 + local.get 3 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 18 + i64.add + local.tee 22 + local.get 19 + i64.xor + i64.const 1 + i64.rotl + local.tee 23 + i64.add + local.tee 24 + local.get 1 + i64.load offset=72 + local.tee 3 + i64.add + local.get 24 + local.get 0 + i64.load offset=56 + local.tee 25 + local.get 0 + i64.load offset=24 + local.tee 26 + i64.add + local.get 1 + i64.load offset=48 + local.tee 18 + i64.add + local.tee 27 + local.get 1 + i64.load offset=56 + local.tee 19 + i64.add + local.get 5 + local.get 27 + i64.xor + i64.const 6620516959819538809 + i64.xor + i64.const 32 + i64.rotl + local.tee 5 + i64.const -6534734903238641935 + i64.add + local.tee 28 + local.get 25 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 30 + local.get 5 + i64.xor + i64.const 48 + i64.rotl + local.tee 31 + i64.xor + i64.const 32 + i64.rotl + local.tee 32 + local.get 0 + i64.load offset=48 + local.tee 27 + local.get 0 + i64.load offset=16 + local.tee 33 + i64.add + local.get 1 + i64.load offset=32 + local.tee 5 + i64.add + local.tee 34 + local.get 1 + i64.load offset=40 + local.tee 24 + i64.add + local.get 4 + local.get 34 + i64.xor + i64.const 2270897969802886507 + i64.xor + i64.const 32 + i64.rotl + local.tee 4 + i64.const 4354685564936845355 + i64.add + local.tee 34 + local.get 27 + i64.xor + i64.const 40 + i64.rotl + local.tee 35 + i64.add + local.tee 36 + local.get 4 + i64.xor + i64.const 48 + i64.rotl + local.tee 37 + local.get 34 + i64.add + local.tee 34 + i64.add + local.tee 38 + local.get 23 + i64.xor + i64.const 40 + i64.rotl + local.tee 23 + i64.add + local.tee 39 + local.get 1 + i64.load offset=112 + local.tee 4 + i64.add + local.get 30 + local.get 15 + local.get 12 + i64.xor + i64.const 48 + i64.rotl + local.tee 15 + local.get 13 + i64.add + local.tee 40 + local.get 14 + i64.xor + i64.const 1 + i64.rotl + local.tee 13 + i64.add + local.get 4 + i64.add + local.tee 14 + local.get 1 + i64.load offset=120 + local.tee 12 + i64.add + local.get 14 + local.get 37 + i64.xor + i64.const 32 + i64.rotl + local.tee 14 + local.get 22 + i64.add + local.tee 22 + local.get 13 + i64.xor + i64.const 40 + i64.rotl + local.tee 13 + i64.add + local.tee 30 + local.get 14 + i64.xor + i64.const 48 + i64.rotl + local.tee 37 + local.get 22 + i64.add + local.tee 22 + local.get 13 + i64.xor + i64.const 1 + i64.rotl + local.tee 41 + i64.add + local.tee 42 + local.get 1 + i64.load offset=80 + local.tee 13 + i64.add + local.get 42 + local.get 13 + local.get 20 + i64.add + local.get 34 + local.get 35 + i64.xor + i64.const 1 + i64.rotl + local.tee 20 + i64.add + local.tee 34 + local.get 1 + i64.load offset=88 + local.tee 14 + i64.add + local.get 34 + local.get 15 + i64.xor + i64.const 32 + i64.rotl + local.tee 15 + local.get 31 + local.get 28 + i64.add + local.tee 28 + i64.add + local.tee 31 + local.get 20 + i64.xor + i64.const 40 + i64.rotl + local.tee 34 + i64.add + local.tee 35 + local.get 15 + i64.xor + i64.const 48 + i64.rotl + local.tee 43 + i64.xor + i64.const 32 + i64.rotl + local.tee 42 + local.get 1 + i64.load offset=96 + local.tee 15 + local.get 36 + i64.add + local.get 28 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 29 + local.get 1 + i64.load offset=104 + local.tee 20 + i64.add + local.get 29 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 40 + i64.add + local.tee 29 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 36 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 29 + i64.add + local.tee 29 + i64.add + local.tee 40 + local.get 41 + i64.xor + i64.const 40 + i64.rotl + local.tee 41 + i64.add + local.tee 44 + local.get 42 + i64.xor + i64.const 48 + i64.rotl + local.tee 42 + local.get 40 + i64.add + local.tee 40 + local.get 41 + i64.xor + i64.const 1 + i64.rotl + local.tee 41 + local.get 24 + i64.add + local.get 30 + local.get 20 + i64.add + local.get 29 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 29 + local.get 18 + i64.add + local.get 29 + local.get 39 + local.get 32 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 29 + local.get 43 + local.get 31 + i64.add + local.tee 31 + i64.add + local.tee 32 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 39 + i64.add + local.tee 43 + local.get 10 + i64.add + local.get 43 + local.get 36 + local.get 3 + i64.add + local.get 31 + local.get 34 + i64.xor + i64.const 1 + i64.rotl + local.tee 31 + i64.add + local.tee 34 + local.get 12 + i64.add + local.get 34 + local.get 37 + i64.xor + i64.const 32 + i64.rotl + local.tee 34 + local.get 30 + local.get 38 + i64.add + local.tee 30 + i64.add + local.tee 36 + local.get 31 + i64.xor + i64.const 40 + i64.rotl + local.tee 31 + i64.add + local.tee 37 + local.get 34 + i64.xor + i64.const 48 + i64.rotl + local.tee 34 + i64.xor + i64.const 32 + i64.rotl + local.tee 38 + local.get 35 + local.get 5 + i64.add + local.get 30 + local.get 23 + i64.xor + i64.const 1 + i64.rotl + local.tee 23 + i64.add + local.tee 30 + local.get 6 + i64.add + local.get 21 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 22 + i64.add + local.tee 22 + local.get 23 + i64.xor + i64.const 40 + i64.rotl + local.tee 23 + i64.add + local.tee 30 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 22 + i64.add + local.tee 22 + i64.add + local.tee 35 + local.get 41 + i64.xor + i64.const 40 + i64.rotl + local.tee 41 + i64.add + local.tee 43 + local.get 12 + i64.add + local.get 37 + local.get 14 + i64.add + local.get 39 + local.get 29 + i64.xor + i64.const 48 + i64.rotl + local.tee 29 + local.get 32 + i64.add + local.tee 32 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 37 + local.get 19 + i64.add + local.get 37 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 40 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 39 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 40 + local.get 20 + i64.add + local.get 40 + local.get 44 + local.get 11 + i64.add + local.get 22 + local.get 23 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 15 + i64.add + local.get 29 + local.get 23 + i64.xor + i64.const 32 + i64.rotl + local.tee 23 + local.get 34 + local.get 36 + i64.add + local.tee 29 + i64.add + local.tee 34 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 36 + local.get 23 + i64.xor + i64.const 48 + i64.rotl + local.tee 23 + i64.xor + i64.const 32 + i64.rotl + local.tee 40 + local.get 30 + local.get 9 + i64.add + local.get 29 + local.get 31 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 30 + local.get 2 + i64.add + local.get 30 + local.get 42 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 32 + i64.add + local.tee 31 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 32 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 31 + i64.add + local.tee 31 + i64.add + local.tee 42 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 3 + i64.add + local.get 36 + local.get 14 + i64.add + local.get 43 + local.get 38 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 35 + i64.add + local.tee 35 + local.get 41 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 41 + local.get 6 + i64.add + local.get 41 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 41 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 5 + i64.add + local.get 43 + local.get 39 + local.get 24 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 2 + i64.add + local.get 31 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 31 + local.get 23 + local.get 34 + i64.add + local.tee 23 + i64.add + local.tee 34 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 36 + local.get 31 + i64.xor + i64.const 48 + i64.rotl + local.tee 31 + i64.xor + i64.const 32 + i64.rotl + local.tee 39 + local.get 32 + local.get 15 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 9 + i64.add + local.get 23 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 35 + i64.add + local.tee 23 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 32 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 23 + i64.add + local.tee 23 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 14 + i64.add + local.get 36 + local.get 19 + i64.add + local.get 44 + local.get 40 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 42 + i64.add + local.tee 40 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 42 + local.get 11 + i64.add + local.get 42 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 42 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 4 + i64.add + local.get 44 + local.get 41 + local.get 13 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 4 + i64.add + local.get 23 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 23 + local.get 31 + local.get 34 + i64.add + local.tee 31 + i64.add + local.tee 34 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 36 + local.get 23 + i64.xor + i64.const 48 + i64.rotl + local.tee 23 + i64.xor + i64.const 32 + i64.rotl + local.tee 41 + local.get 32 + local.get 10 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 18 + i64.add + local.get 31 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 40 + i64.add + local.tee 31 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 32 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 31 + i64.add + local.tee 31 + i64.add + local.tee 40 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 12 + i64.add + local.get 36 + local.get 19 + i64.add + local.get 43 + local.get 39 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 35 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 39 + local.get 3 + i64.add + local.get 39 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 39 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 6 + i64.add + local.get 43 + local.get 42 + local.get 20 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 15 + i64.add + local.get 31 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 31 + local.get 23 + local.get 34 + i64.add + local.tee 23 + i64.add + local.tee 34 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 36 + local.get 31 + i64.xor + i64.const 48 + i64.rotl + local.tee 31 + i64.xor + i64.const 32 + i64.rotl + local.tee 42 + local.get 32 + local.get 10 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 11 + i64.add + local.get 23 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 35 + i64.add + local.tee 23 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 32 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 23 + i64.add + local.tee 23 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 13 + i64.add + local.get 36 + local.get 5 + i64.add + local.get 44 + local.get 41 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 40 + i64.add + local.tee 40 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 41 + local.get 9 + i64.add + local.get 41 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 41 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 12 + i64.add + local.get 44 + local.get 39 + local.get 2 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 18 + i64.add + local.get 23 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 23 + local.get 31 + local.get 34 + i64.add + local.tee 31 + i64.add + local.tee 34 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 36 + local.get 23 + i64.xor + i64.const 48 + i64.rotl + local.tee 23 + i64.xor + i64.const 32 + i64.rotl + local.tee 39 + local.get 32 + local.get 24 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 13 + i64.add + local.get 31 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 40 + i64.add + local.tee 31 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 32 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 31 + i64.add + local.tee 31 + i64.add + local.tee 40 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 10 + i64.add + local.get 36 + local.get 3 + i64.add + local.get 43 + local.get 42 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 35 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 42 + local.get 9 + i64.add + local.get 42 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 42 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 20 + i64.add + local.get 43 + local.get 41 + local.get 2 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 5 + i64.add + local.get 31 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 31 + local.get 23 + local.get 34 + i64.add + local.tee 23 + i64.add + local.tee 34 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 36 + local.get 31 + i64.xor + i64.const 48 + i64.rotl + local.tee 31 + i64.xor + i64.const 32 + i64.rotl + local.tee 41 + local.get 32 + local.get 24 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 19 + i64.add + local.get 23 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 35 + i64.add + local.tee 23 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 32 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 23 + i64.add + local.tee 23 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 6 + i64.add + local.get 36 + local.get 18 + i64.add + local.get 44 + local.get 39 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 40 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 40 + local.get 6 + i64.add + local.get 40 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 40 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 10 + i64.add + local.get 44 + local.get 42 + local.get 4 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 11 + i64.add + local.get 23 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 23 + local.get 31 + local.get 34 + i64.add + local.tee 31 + i64.add + local.tee 34 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 36 + local.get 23 + i64.xor + i64.const 48 + i64.rotl + local.tee 23 + i64.xor + i64.const 32 + i64.rotl + local.tee 42 + local.get 32 + local.get 14 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 15 + i64.add + local.get 31 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 39 + i64.add + local.tee 31 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 32 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 31 + i64.add + local.tee 31 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 11 + i64.add + local.get 36 + local.get 2 + i64.add + local.get 43 + local.get 41 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 35 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 41 + local.get 15 + i64.add + local.get 41 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 41 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 3 + i64.add + local.get 43 + local.get 40 + local.get 9 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 14 + i64.add + local.get 31 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 31 + local.get 23 + local.get 34 + i64.add + local.tee 23 + i64.add + local.tee 34 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 36 + local.get 31 + i64.xor + i64.const 48 + i64.rotl + local.tee 31 + i64.xor + i64.const 32 + i64.rotl + local.tee 40 + local.get 32 + local.get 18 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 13 + i64.add + local.get 23 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 35 + i64.add + local.tee 23 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 32 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 23 + i64.add + local.tee 23 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 5 + i64.add + local.get 36 + local.get 12 + i64.add + local.get 44 + local.get 42 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 39 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 42 + local.get 4 + i64.add + local.get 42 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 42 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 13 + i64.add + local.get 44 + local.get 41 + local.get 5 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 20 + i64.add + local.get 23 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 23 + local.get 31 + local.get 34 + i64.add + local.tee 31 + i64.add + local.tee 34 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 36 + local.get 23 + i64.xor + i64.const 48 + i64.rotl + local.tee 23 + i64.xor + i64.const 32 + i64.rotl + local.tee 41 + local.get 32 + local.get 19 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 24 + i64.add + local.get 31 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 39 + i64.add + local.tee 31 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 32 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 31 + i64.add + local.tee 31 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 6 + i64.add + local.get 36 + local.get 15 + i64.add + local.get 43 + local.get 40 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 35 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 40 + local.get 24 + i64.add + local.get 40 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 40 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 14 + i64.add + local.get 43 + local.get 42 + local.get 4 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 20 + i64.add + local.get 31 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 31 + local.get 23 + local.get 34 + i64.add + local.tee 23 + i64.add + local.tee 34 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 36 + local.get 31 + i64.xor + i64.const 48 + i64.rotl + local.tee 31 + i64.xor + i64.const 32 + i64.rotl + local.tee 42 + local.get 32 + local.get 11 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 12 + i64.add + local.get 23 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 35 + i64.add + local.tee 23 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 32 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 23 + i64.add + local.tee 23 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 10 + i64.add + local.get 36 + local.get 3 + i64.add + local.get 44 + local.get 41 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 39 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 41 + local.get 2 + i64.add + local.get 41 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 41 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 3 + i64.add + local.get 44 + local.get 40 + local.get 9 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 19 + i64.add + local.get 23 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 23 + local.get 31 + local.get 34 + i64.add + local.tee 31 + i64.add + local.tee 34 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 36 + local.get 23 + i64.xor + i64.const 48 + i64.rotl + local.tee 23 + i64.xor + i64.const 32 + i64.rotl + local.tee 40 + local.get 32 + local.get 18 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 10 + i64.add + local.get 31 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 39 + i64.add + local.tee 31 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 32 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 31 + i64.add + local.tee 31 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 2 + i64.add + local.get 36 + local.get 20 + i64.add + local.get 43 + local.get 42 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 35 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 42 + local.get 14 + i64.add + local.get 42 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 42 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 13 + i64.add + local.get 43 + local.get 41 + local.get 15 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 11 + i64.add + local.get 31 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 31 + local.get 23 + local.get 34 + i64.add + local.tee 23 + i64.add + local.tee 34 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 36 + local.get 31 + i64.xor + i64.const 48 + i64.rotl + local.tee 31 + i64.xor + i64.const 32 + i64.rotl + local.tee 41 + local.get 32 + local.get 19 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 4 + i64.add + local.get 23 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 35 + i64.add + local.tee 23 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 32 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 23 + i64.add + local.tee 23 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 9 + i64.add + local.get 36 + local.get 6 + i64.add + local.get 44 + local.get 40 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 39 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 40 + local.get 18 + i64.add + local.get 40 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 40 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 6 + i64.add + local.get 44 + local.get 42 + local.get 24 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 9 + i64.add + local.get 23 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 23 + local.get 31 + local.get 34 + i64.add + local.tee 31 + i64.add + local.tee 34 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 36 + local.get 23 + i64.xor + i64.const 48 + i64.rotl + local.tee 23 + i64.xor + i64.const 32 + i64.rotl + local.tee 42 + local.get 32 + local.get 12 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 5 + i64.add + local.get 31 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 39 + i64.add + local.tee 31 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 32 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 31 + i64.add + local.tee 31 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 13 + i64.add + local.get 36 + local.get 18 + i64.add + local.get 43 + local.get 41 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 35 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 41 + local.get 12 + i64.add + local.get 41 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 41 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 24 + i64.add + local.get 43 + local.get 40 + local.get 14 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 10 + i64.add + local.get 31 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 31 + local.get 23 + local.get 34 + i64.add + local.tee 23 + i64.add + local.tee 34 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 36 + local.get 31 + i64.xor + i64.const 48 + i64.rotl + local.tee 31 + i64.xor + i64.const 32 + i64.rotl + local.tee 40 + local.get 32 + local.get 4 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 3 + i64.add + local.get 23 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 35 + i64.add + local.tee 23 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 32 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 23 + i64.add + local.tee 23 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 11 + i64.add + local.get 36 + local.get 11 + i64.add + local.get 44 + local.get 42 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 39 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 42 + local.get 5 + i64.add + local.get 42 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 42 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 24 + i64.add + local.get 44 + local.get 41 + local.get 15 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 2 + i64.add + local.get 23 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 23 + local.get 31 + local.get 34 + i64.add + local.tee 31 + i64.add + local.tee 34 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 36 + local.get 23 + i64.xor + i64.const 48 + i64.rotl + local.tee 23 + i64.xor + i64.const 32 + i64.rotl + local.tee 41 + local.get 32 + local.get 20 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 19 + i64.add + local.get 31 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 39 + i64.add + local.tee 31 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 32 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 31 + i64.add + local.tee 31 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 20 + i64.add + local.get 36 + local.get 13 + i64.add + local.get 43 + local.get 40 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 35 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 40 + local.get 2 + i64.add + local.get 40 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 40 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 9 + i64.add + local.get 43 + local.get 42 + local.get 19 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 18 + i64.add + local.get 31 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 31 + local.get 23 + local.get 34 + i64.add + local.tee 23 + i64.add + local.tee 34 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 36 + local.get 31 + i64.xor + i64.const 48 + i64.rotl + local.tee 31 + i64.xor + i64.const 32 + i64.rotl + local.tee 42 + local.get 32 + local.get 6 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 5 + i64.add + local.get 23 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 35 + i64.add + local.tee 23 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 32 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 23 + i64.add + local.tee 23 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 18 + i64.add + local.get 36 + local.get 10 + i64.add + local.get 44 + local.get 41 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 39 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 41 + local.get 15 + i64.add + local.get 41 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 41 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 37 + i64.add + local.tee 37 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 19 + i64.add + local.get 44 + local.get 40 + local.get 12 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 14 + i64.add + local.get 23 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 23 + local.get 31 + local.get 34 + i64.add + local.tee 31 + i64.add + local.tee 34 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 36 + local.get 23 + i64.xor + i64.const 48 + i64.rotl + local.tee 23 + i64.xor + i64.const 32 + i64.rotl + local.tee 40 + local.get 32 + local.get 3 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 4 + i64.add + local.get 31 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 39 + i64.add + local.tee 31 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 32 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 31 + i64.add + local.tee 31 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 44 + local.get 4 + i64.add + local.get 36 + local.get 9 + i64.add + local.get 43 + local.get 42 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 35 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 42 + local.get 11 + i64.add + local.get 42 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 42 + local.get 30 + i64.xor + i64.const 48 + i64.rotl + local.tee 30 + local.get 37 + i64.add + local.tee 37 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 12 + i64.add + local.get 43 + local.get 41 + local.get 5 + i64.add + local.get 31 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 31 + local.get 24 + i64.add + local.get 31 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 31 + local.get 23 + local.get 34 + i64.add + local.tee 23 + i64.add + local.tee 34 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 36 + local.get 31 + i64.xor + i64.const 48 + i64.rotl + local.tee 31 + i64.xor + i64.const 32 + i64.rotl + local.tee 41 + local.get 32 + local.get 2 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 22 + i64.add + local.tee 23 + local.get 10 + i64.add + local.get 23 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 21 + local.get 35 + i64.add + local.tee 23 + local.get 22 + i64.xor + i64.const 40 + i64.rotl + local.tee 22 + i64.add + local.tee 32 + local.get 21 + i64.xor + i64.const 48 + i64.rotl + local.tee 21 + local.get 23 + i64.add + local.tee 23 + i64.add + local.tee 35 + local.get 38 + i64.xor + i64.const 40 + i64.rotl + local.tee 38 + i64.add + local.tee 43 + local.get 20 + i64.add + local.get 36 + local.get 15 + i64.add + local.get 44 + local.get 40 + i64.xor + i64.const 48 + i64.rotl + local.tee 36 + local.get 39 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 40 + local.get 20 + i64.add + local.get 40 + local.get 21 + i64.xor + i64.const 32 + i64.rotl + local.tee 20 + local.get 37 + i64.add + local.tee 21 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 37 + local.get 20 + i64.xor + i64.const 48 + i64.rotl + local.tee 20 + local.get 21 + i64.add + local.tee 21 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 28 + i64.add + local.tee 40 + local.get 18 + i64.add + local.get 40 + local.get 42 + local.get 6 + i64.add + local.get 23 + local.get 22 + i64.xor + i64.const 1 + i64.rotl + local.tee 18 + i64.add + local.tee 22 + local.get 3 + i64.add + local.get 22 + local.get 36 + i64.xor + i64.const 32 + i64.rotl + local.tee 22 + local.get 31 + local.get 34 + i64.add + local.tee 23 + i64.add + local.tee 31 + local.get 18 + i64.xor + i64.const 40 + i64.rotl + local.tee 18 + i64.add + local.tee 34 + local.get 22 + i64.xor + i64.const 48 + i64.rotl + local.tee 22 + i64.xor + i64.const 32 + i64.rotl + local.tee 36 + local.get 32 + local.get 13 + i64.add + local.get 23 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 23 + i64.add + local.tee 29 + local.get 14 + i64.add + local.get 29 + local.get 30 + i64.xor + i64.const 32 + i64.rotl + local.tee 29 + local.get 39 + i64.add + local.tee 30 + local.get 23 + i64.xor + i64.const 40 + i64.rotl + local.tee 23 + i64.add + local.tee 32 + local.get 29 + i64.xor + i64.const 48 + i64.rotl + local.tee 29 + local.get 30 + i64.add + local.tee 30 + i64.add + local.tee 39 + local.get 28 + i64.xor + i64.const 40 + i64.rotl + local.tee 28 + i64.add + local.tee 40 + local.get 24 + i64.add + local.get 34 + local.get 4 + i64.add + local.get 43 + local.get 41 + i64.xor + i64.const 48 + i64.rotl + local.tee 24 + local.get 35 + i64.add + local.tee 4 + local.get 38 + i64.xor + i64.const 1 + i64.rotl + local.tee 34 + i64.add + local.tee 35 + local.get 13 + i64.add + local.get 35 + local.get 29 + i64.xor + i64.const 32 + i64.rotl + local.tee 13 + local.get 21 + i64.add + local.tee 21 + local.get 34 + i64.xor + i64.const 40 + i64.rotl + local.tee 29 + i64.add + local.tee 34 + local.get 13 + i64.xor + i64.const 48 + i64.rotl + local.tee 13 + local.get 21 + i64.add + local.tee 21 + local.get 29 + i64.xor + i64.const 1 + i64.rotl + local.tee 29 + i64.add + local.tee 35 + local.get 10 + i64.add + local.get 35 + local.get 37 + local.get 3 + i64.add + local.get 30 + local.get 23 + i64.xor + i64.const 1 + i64.rotl + local.tee 10 + i64.add + local.tee 3 + local.get 12 + i64.add + local.get 3 + local.get 24 + i64.xor + i64.const 32 + i64.rotl + local.tee 3 + local.get 22 + local.get 31 + i64.add + local.tee 24 + i64.add + local.tee 12 + local.get 10 + i64.xor + i64.const 40 + i64.rotl + local.tee 10 + i64.add + local.tee 22 + local.get 3 + i64.xor + i64.const 48 + i64.rotl + local.tee 3 + i64.xor + i64.const 32 + i64.rotl + local.tee 23 + local.get 32 + local.get 5 + i64.add + local.get 24 + local.get 18 + i64.xor + i64.const 1 + i64.rotl + local.tee 18 + i64.add + local.tee 5 + local.get 6 + i64.add + local.get 5 + local.get 20 + i64.xor + i64.const 32 + i64.rotl + local.tee 6 + local.get 4 + i64.add + local.tee 5 + local.get 18 + i64.xor + i64.const 40 + i64.rotl + local.tee 18 + i64.add + local.tee 24 + local.get 6 + i64.xor + i64.const 48 + i64.rotl + local.tee 6 + local.get 5 + i64.add + local.tee 5 + i64.add + local.tee 4 + local.get 29 + i64.xor + i64.const 40 + i64.rotl + local.tee 20 + i64.add + local.tee 29 + local.get 26 + i64.xor + local.get 24 + local.get 9 + i64.add + local.get 3 + local.get 12 + i64.add + local.tee 9 + local.get 10 + i64.xor + i64.const 1 + i64.rotl + local.tee 10 + i64.add + local.tee 3 + local.get 2 + i64.add + local.get 3 + local.get 13 + i64.xor + i64.const 32 + i64.rotl + local.tee 2 + local.get 40 + local.get 36 + i64.xor + i64.const 48 + i64.rotl + local.tee 3 + local.get 39 + i64.add + local.tee 24 + i64.add + local.tee 12 + local.get 10 + i64.xor + i64.const 40 + i64.rotl + local.tee 10 + i64.add + local.tee 13 + local.get 2 + i64.xor + i64.const 48 + i64.rotl + local.tee 2 + local.get 12 + i64.add + local.tee 12 + i64.xor + i64.store offset=24 + local.get 0 + local.get 8 + local.get 15 + local.get 34 + local.get 11 + i64.add + local.get 5 + local.get 18 + i64.xor + i64.const 1 + i64.rotl + local.tee 11 + i64.add + local.tee 18 + i64.add + local.get 3 + local.get 18 + i64.xor + i64.const 32 + i64.rotl + local.tee 3 + local.get 9 + i64.add + local.tee 9 + local.get 11 + i64.xor + i64.const 40 + i64.rotl + local.tee 11 + i64.add + local.tee 18 + i64.xor + local.get 19 + local.get 22 + local.get 14 + i64.add + local.get 24 + local.get 28 + i64.xor + i64.const 1 + i64.rotl + local.tee 5 + i64.add + local.tee 24 + i64.add + local.get 24 + local.get 6 + i64.xor + i64.const 32 + i64.rotl + local.tee 6 + local.get 21 + i64.add + local.tee 19 + local.get 5 + i64.xor + i64.const 40 + i64.rotl + local.tee 5 + i64.add + local.tee 24 + local.get 6 + i64.xor + i64.const 48 + i64.rotl + local.tee 6 + local.get 19 + i64.add + local.tee 19 + i64.xor + i64.store + local.get 0 + local.get 33 + local.get 18 + local.get 3 + i64.xor + i64.const 48 + i64.rotl + local.tee 3 + local.get 9 + i64.add + local.tee 9 + i64.xor + local.get 24 + i64.xor + i64.store offset=16 + local.get 0 + local.get 13 + local.get 17 + i64.xor + local.get 29 + local.get 23 + i64.xor + i64.const 48 + i64.rotl + local.tee 18 + local.get 4 + i64.add + local.tee 24 + i64.xor + i64.store offset=8 + local.get 0 + local.get 25 + local.get 19 + local.get 5 + i64.xor + i64.const 1 + i64.rotl + i64.xor + local.get 3 + i64.xor + i64.store offset=56 + local.get 0 + local.get 27 + local.get 12 + local.get 10 + i64.xor + i64.const 1 + i64.rotl + i64.xor + local.get 18 + i64.xor + i64.store offset=48 + local.get 0 + local.get 16 + local.get 9 + local.get 11 + i64.xor + i64.const 1 + i64.rotl + i64.xor + local.get 6 + i64.xor + i64.store offset=40 + local.get 0 + local.get 7 + local.get 24 + local.get 20 + i64.xor + i64.const 1 + i64.rotl + i64.xor + local.get 2 + i64.xor + i64.store offset=32) + (func $_ZN8blake2ya7blake2b7Param2b6digest17h72a2d9ccd477238dE (type 0) (param i32 i32) + block ;; label = @1 + local.get 1 + i32.const -1 + i32.add + i32.const 255 + i32.and + i32.const 64 + i32.lt_u + br_if 0 (;@1;) + i32.const 1048803 + i32.const 35 + i32.const 1048840 + call $_ZN4core9panicking5panic17hcb4f0bfb9f36a348E + unreachable + end + local.get 0 + local.get 1 + i32.store8) + (func $_ZN8blake2ya7blake2b7Blake2b6update17h6af962144cc2c580E (type 5) (param i32 i32 i32) + (local i32 i32 i32 i32 i64 i64 i32 i32 i32) + global.get $__stack_pointer + i32.const 128 + i32.sub + local.tee 3 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 2 + i32.const 128 + local.get 0 + i32.load offset=352 + local.tee 4 + i32.sub + local.tee 5 + i32.le_u + br_if 0 (;@7;) + local.get 4 + br_if 1 (;@6;) + i32.const 0 + local.set 4 + local.get 2 + local.set 6 + br 4 (;@3;) + end + local.get 4 + local.get 2 + i32.add + local.tee 5 + local.get 4 + i32.lt_u + br_if 1 (;@5;) + local.get 5 + i32.const 128 + i32.gt_u + br_if 2 (;@4;) + block ;; label = @7 + local.get 2 + i32.eqz + br_if 0 (;@7;) + local.get 0 + local.get 4 + i32.add + local.get 1 + local.get 2 + memory.copy + end + local.get 0 + i32.load offset=352 + local.get 2 + i32.add + local.set 6 + br 4 (;@2;) + end + block ;; label = @6 + local.get 4 + i32.const 128 + i32.gt_u + br_if 0 (;@6;) + block ;; label = @7 + local.get 5 + i32.eqz + br_if 0 (;@7;) + local.get 0 + local.get 4 + i32.add + local.get 1 + local.get 5 + memory.copy + end + local.get 0 + local.get 0 + i64.load offset=320 + local.tee 7 + i64.const 128 + i64.add + local.tee 8 + i64.store offset=320 + local.get 0 + local.get 0 + i64.load offset=328 + local.get 7 + i64.const -129 + i64.gt_u + i64.extend_i32_u + i64.add + local.tee 7 + i64.store offset=328 + block ;; label = @7 + i32.const 128 + i32.eqz + br_if 0 (;@7;) + local.get 3 + local.get 0 + i32.const 128 + memory.copy + end + local.get 0 + i32.const 256 + i32.add + local.get 3 + local.get 8 + local.get 7 + local.get 0 + i64.load offset=336 + local.get 0 + i64.load offset=344 + call $_ZN8blake2ya7blake2b6reduce17h592ec0095d14d42bE + local.get 2 + i32.const 128 + local.get 0 + i32.load offset=352 + i32.sub + local.tee 4 + i32.sub + local.set 6 + br 3 (;@3;) + end + local.get 4 + i32.const 128 + i32.const 1048920 + call $_ZN4core5slice5index26slice_start_index_len_fail17h026a9215e79c1fdbE + unreachable + end + local.get 4 + local.get 5 + i32.const 1048936 + call $_ZN4core5slice5index22slice_index_order_fail17h87f34a99f306396eE + unreachable + end + local.get 5 + i32.const 128 + i32.const 1048936 + call $_ZN4core5slice5index24slice_end_index_len_fail17hadfbc7e1a15974a1E + unreachable + end + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + local.get 6 + i32.const -1 + i32.add + local.tee 9 + i32.const 128 + i32.lt_u + br_if 0 (;@6;) + local.get 0 + i32.const 256 + i32.add + local.set 10 + local.get 9 + i32.const 7 + i32.shr_u + local.set 5 + local.get 6 + local.get 9 + i32.const -128 + i32.and + i32.sub + local.set 6 + loop ;; label = @7 + local.get 4 + i32.const -129 + i32.gt_u + br_if 2 (;@5;) + local.get 4 + i32.const 128 + i32.add + local.tee 9 + local.get 2 + i32.gt_u + br_if 3 (;@4;) + local.get 1 + local.get 4 + i32.add + local.set 4 + block ;; label = @8 + i32.const 128 + i32.eqz + local.tee 11 + br_if 0 (;@8;) + local.get 0 + local.get 4 + i32.const 128 + memory.copy + end + local.get 0 + local.get 0 + i64.load offset=320 + local.tee 7 + i64.const 128 + i64.add + local.tee 8 + i64.store offset=320 + local.get 0 + local.get 0 + i64.load offset=328 + local.get 7 + i64.const -129 + i64.gt_u + i64.extend_i32_u + i64.add + local.tee 7 + i64.store offset=328 + block ;; label = @8 + local.get 11 + br_if 0 (;@8;) + local.get 3 + local.get 4 + i32.const 128 + memory.copy + end + local.get 10 + local.get 3 + local.get 8 + local.get 7 + local.get 0 + i64.load offset=336 + local.get 0 + i64.load offset=344 + call $_ZN8blake2ya7blake2b6reduce17h592ec0095d14d42bE + local.get 9 + local.set 4 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@7;) + end + block ;; label = @7 + local.get 6 + i32.const 129 + i32.ge_u + br_if 0 (;@7;) + local.get 9 + local.set 4 + br 4 (;@3;) + end + local.get 6 + i32.const 128 + i32.const 1048856 + call $_ZN4core5slice5index24slice_end_index_len_fail17hadfbc7e1a15974a1E + unreachable + end + local.get 4 + local.get 2 + i32.le_u + br_if 2 (;@3;) + local.get 4 + local.get 2 + i32.const 1048888 + call $_ZN4core5slice5index26slice_start_index_len_fail17h026a9215e79c1fdbE + unreachable + end + local.get 4 + local.get 4 + i32.const 128 + i32.add + i32.const 1048904 + call $_ZN4core5slice5index22slice_index_order_fail17h87f34a99f306396eE + unreachable + end + local.get 4 + i32.const 128 + i32.add + local.get 2 + i32.const 1048904 + call $_ZN4core5slice5index24slice_end_index_len_fail17hadfbc7e1a15974a1E + unreachable + end + local.get 6 + local.get 2 + local.get 4 + i32.sub + local.tee 5 + i32.ne + br_if 1 (;@1;) + local.get 6 + i32.eqz + br_if 0 (;@2;) + local.get 0 + local.get 1 + local.get 4 + i32.add + local.get 6 + memory.copy + end + local.get 0 + local.get 6 + i32.store offset=352 + local.get 3 + i32.const 128 + i32.add + global.set $__stack_pointer + return + end + local.get 6 + local.get 5 + i32.const 1048872 + call $_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$15copy_from_slice17len_mismatch_fail17hfc67e42bedcb4f60E + unreachable) + (func $_ZN8blake2ya7blake2b7Blake2b6digest17h7e289db40c319d9fE (type 5) (param i32 i32 i32) + (local i32 i32 i64 i32 i64) + global.get $__stack_pointer + i32.const 128 + i32.sub + local.tee 3 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 0 + i32.load offset=352 + local.tee 4 + i32.const 128 + i32.gt_u + br_if 0 (;@3;) + i64.const 128 + local.set 5 + block ;; label = @4 + local.get 4 + i32.const 128 + i32.eq + br_if 0 (;@4;) + block ;; label = @5 + i32.const 128 + local.get 4 + i32.sub + local.tee 6 + i32.eqz + br_if 0 (;@5;) + local.get 0 + local.get 4 + i32.add + i32.const 0 + local.get 6 + memory.fill + end + local.get 0 + i64.load32_u offset=352 + local.set 5 + end + local.get 0 + i64.const -1 + i64.store offset=336 + local.get 0 + local.get 0 + i64.load offset=320 + local.tee 7 + local.get 5 + i64.add + local.tee 5 + i64.store offset=320 + local.get 0 + local.get 0 + i64.load offset=328 + local.get 5 + local.get 7 + i64.lt_u + i64.extend_i32_u + i64.add + local.tee 7 + i64.store offset=328 + block ;; label = @4 + i32.const 128 + i32.eqz + br_if 0 (;@4;) + local.get 3 + local.get 0 + i32.const 128 + memory.copy + end + local.get 0 + i32.const 256 + i32.add + local.get 3 + local.get 5 + local.get 7 + i64.const -1 + local.get 0 + i64.load offset=344 + call $_ZN8blake2ya7blake2b6reduce17h592ec0095d14d42bE + local.get 3 + i32.const 48 + i32.add + local.get 0 + i32.const 304 + i32.add + v128.load align=1 + v128.store align=8 + local.get 3 + i32.const 32 + i32.add + local.get 0 + i32.const 288 + i32.add + v128.load align=1 + v128.store align=8 + local.get 3 + i32.const 16 + i32.add + local.get 0 + i32.const 272 + i32.add + v128.load align=1 + v128.store align=8 + local.get 3 + local.get 0 + v128.load offset=256 align=1 + v128.store align=8 + local.get 0 + i32.load8_u offset=128 + local.tee 0 + i32.const 65 + i32.ge_u + br_if 1 (;@2;) + local.get 2 + local.get 0 + i32.ne + br_if 2 (;@1;) + block ;; label = @4 + local.get 2 + i32.eqz + br_if 0 (;@4;) + local.get 1 + local.get 3 + local.get 2 + memory.copy + end + local.get 3 + i32.const 128 + i32.add + global.set $__stack_pointer + return + end + local.get 4 + i32.const 128 + i32.const 1048984 + call $_ZN4core5slice5index26slice_start_index_len_fail17h026a9215e79c1fdbE + unreachable + end + local.get 0 + i32.const 64 + i32.const 1048952 + call $_ZN4core5slice5index24slice_end_index_len_fail17hadfbc7e1a15974a1E + unreachable + end + local.get 2 + local.get 0 + i32.const 1048968 + call $_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$15copy_from_slice17len_mismatch_fail17hfc67e42bedcb4f60E + unreachable) + (func $_ZN8blake2ya7blake2b7blake2b17h855b19c6cd048e5bE (type 0) (param i32 i32) + (local i32 i32 v128) + global.get $__stack_pointer + i32.const 496 + i32.sub + local.tee 2 + global.set $__stack_pointer + block ;; label = @1 + i32.const 128 + i32.eqz + local.tee 3 + br_if 0 (;@1;) + local.get 2 + i32.const 8 + i32.add + i32.const 0 + i32.const 128 + memory.fill + end + local.get 2 + i32.const 360 + i32.add + i32.const 0 + i32.store + local.get 2 + i32.const 344 + i32.add + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + local.tee 4 + v128.store align=8 + local.get 2 + local.get 4 + v128.store offset=328 align=8 + block ;; label = @1 + local.get 3 + br_if 0 (;@1;) + local.get 2 + i32.const 8 + i32.add + i32.const 128 + i32.add + local.get 1 + i32.const 128 + memory.copy + end + local.get 2 + local.get 2 + v128.load offset=136 align=8 + v128.const i32x4 0xf3bcc908 0x6a09e667 0x84caa73b 0xbb67ae85 + v128.xor + v128.store offset=264 align=8 + local.get 2 + local.get 2 + v128.load offset=152 align=8 + v128.const i32x4 0xfe94f82b 0x3c6ef372 0x5f1d36f1 0xa54ff53a + v128.xor + v128.store offset=280 align=8 + local.get 2 + local.get 2 + v128.load offset=168 align=8 + v128.const i32x4 0xade682d1 0x510e527f 0x2b3e6c1f 0x9b05688c + v128.xor + v128.store offset=296 align=8 + local.get 2 + local.get 2 + v128.load offset=184 align=8 + v128.const i32x4 0xfb41bd6b 0x1f83d9ab 0x137e2179 0x5be0cd19 + v128.xor + v128.store offset=312 align=8 + block ;; label = @1 + local.get 2 + i64.load8_u offset=137 + i64.const 8 + i64.shl + i64.eqz + br_if 0 (;@1;) + local.get 2 + i32.const 368 + i32.add + i32.const 112 + i32.add + local.get 4 + v128.store align=8 + local.get 2 + i32.const 368 + i32.add + i32.const 96 + i32.add + local.get 4 + v128.store align=8 + local.get 2 + i32.const 368 + i32.add + i32.const 80 + i32.add + local.get 4 + v128.store align=8 + local.get 2 + i32.const 384 + i32.add + local.get 1 + i32.const 80 + i32.add + v128.load align=1 + v128.store align=8 + local.get 2 + i32.const 400 + i32.add + local.get 1 + i32.const 96 + i32.add + v128.load align=1 + v128.store align=8 + local.get 2 + i32.const 416 + i32.add + local.get 1 + i32.const 112 + i32.add + v128.load align=1 + v128.store align=8 + local.get 2 + local.get 4 + v128.store offset=432 align=8 + local.get 2 + local.get 1 + v128.load offset=64 align=1 + v128.store offset=368 align=8 + local.get 2 + i32.const 8 + i32.add + local.get 2 + i32.const 368 + i32.add + i32.const 128 + call $_ZN8blake2ya7blake2b7Blake2b6update17h6af962144cc2c580E + end + block ;; label = @1 + i32.const 360 + i32.eqz + br_if 0 (;@1;) + local.get 0 + local.get 2 + i32.const 8 + i32.add + i32.const 360 + memory.copy + end + local.get 2 + i32.const 496 + i32.add + global.set $__stack_pointer) + (func $_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h7304e3c4160876daE (type 0) (param i32 i32) + local.get 0 + i64.const 7199936582794304877 + i64.store offset=8 + local.get 0 + i64.const -5076933981314334344 + i64.store) + (func $_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17hffe704d8309d203aE (type 0) (param i32 i32) + local.get 0 + i64.const 7305752822554981023 + i64.store offset=8 + local.get 0 + i64.const 3513012367455052835 + i64.store) + (func $_ZN5alloc7raw_vec20RawVecInner$LT$A$GT$7reserve21do_reserve_and_handle17h9d7cabd5071c5a51E (type 8) (param i32 i32 i32 i32 i32) + (local i32 i32 i32 i64 i32) + global.get $__stack_pointer + i32.const 32 + i32.sub + local.tee 5 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 1 + local.get 2 + i32.add + local.tee 2 + local.get 1 + i32.ge_u + br_if 0 (;@3;) + i32.const 0 + local.set 6 + br 1 (;@2;) + end + i32.const 0 + local.set 6 + block ;; label = @3 + local.get 3 + local.get 4 + i32.add + i32.const -1 + i32.add + i32.const 0 + local.get 3 + i32.sub + i32.and + i64.extend_i32_u + local.get 2 + local.get 0 + i32.load + local.tee 1 + i32.const 1 + i32.shl + local.tee 7 + local.get 2 + local.get 7 + i32.gt_u + select + local.tee 2 + i32.const 8 + i32.const 4 + local.get 4 + i32.const 1 + i32.eq + select + local.tee 7 + local.get 2 + local.get 7 + i32.gt_u + select + local.tee 7 + i64.extend_i32_u + i64.mul + local.tee 8 + i64.const 32 + i64.shr_u + i32.wrap_i64 + i32.eqz + br_if 0 (;@3;) + br 1 (;@2;) + end + local.get 8 + i32.wrap_i64 + local.tee 9 + i32.const -2147483648 + local.get 3 + i32.sub + i32.gt_u + br_if 0 (;@2;) + i32.const 0 + local.set 2 + block ;; label = @3 + local.get 1 + i32.eqz + br_if 0 (;@3;) + local.get 5 + local.get 1 + local.get 4 + i32.mul + i32.store offset=28 + local.get 5 + local.get 0 + i32.load offset=4 + i32.store offset=20 + local.get 3 + local.set 2 + end + local.get 5 + local.get 2 + i32.store offset=24 + local.get 5 + i32.const 8 + i32.add + local.get 3 + local.get 9 + local.get 5 + i32.const 20 + i32.add + call $_ZN5alloc7raw_vec11finish_grow17h31fcfb118e0508a4E + local.get 5 + i32.load offset=8 + i32.const 1 + i32.ne + br_if 1 (;@1;) + local.get 5 + i32.load offset=16 + local.set 2 + local.get 5 + i32.load offset=12 + local.set 6 + end + local.get 6 + local.get 2 + i32.const 1049080 + call $_ZN5alloc7raw_vec12handle_error17h57ad9ee517c44fc6E + unreachable + end + local.get 5 + i32.load offset=12 + local.set 3 + local.get 0 + local.get 7 + i32.store + local.get 0 + local.get 3 + i32.store offset=4 + local.get 5 + i32.const 32 + i32.add + global.set $__stack_pointer) + (func $_ZN4core3fmt5Write9write_fmt17hc808c42956869ae8E (type 1) (param i32 i32) (result i32) + local.get 0 + i32.const 1049096 + local.get 1 + call $_ZN4core3fmt5write17h68542eb4423e8992E) + (func $_ZN4core3ptr42drop_in_place$LT$alloc..string..String$GT$17h37d546d4b358ccb9E (type 9) (param i32) + (local i32) + block ;; label = @1 + local.get 0 + i32.load + local.tee 1 + i32.eqz + br_if 0 (;@1;) + local.get 0 + i32.load offset=4 + local.get 1 + i32.const 1 + call $_RNvCs691rhTbG0Ee_7___rustc14___rust_dealloc + end) + (func $_ZN4core3ptr74drop_in_place$LT$core..option..Option$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h5e7c564ca6a856faE (type 0) (param i32 i32) + block ;; label = @1 + local.get 0 + i32.const -2147483648 + i32.or + i32.const -2147483648 + i32.eq + br_if 0 (;@1;) + local.get 1 + local.get 0 + i32.const 1 + call $_RNvCs691rhTbG0Ee_7___rustc14___rust_dealloc + end) + (func $_ZN4core3ptr77drop_in_place$LT$std..panicking..begin_panic_handler..FormatStringPayload$GT$17h328305dd0d118fb6E (type 9) (param i32) + (local i32) + block ;; label = @1 + local.get 0 + i32.load + local.tee 1 + i32.const -2147483648 + i32.or + i32.const -2147483648 + i32.eq + br_if 0 (;@1;) + local.get 0 + i32.load offset=4 + local.get 1 + i32.const 1 + call $_RNvCs691rhTbG0Ee_7___rustc14___rust_dealloc + end) + (func $_ZN4core5panic12PanicPayload6as_str17h3575ee572e511855E (type 0) (param i32 i32) + local.get 0 + i32.const 0 + i32.store) + (func $_ZN58_$LT$alloc..string..String$u20$as$u20$core..fmt..Write$GT$10write_char17h61f319b0423b9825E (type 1) (param i32 i32) (result i32) + (local i32 i32 i32) + local.get 0 + i32.load offset=8 + local.set 2 + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.const 128 + i32.ge_u + br_if 0 (;@2;) + i32.const 1 + local.set 3 + br 1 (;@1;) + end + block ;; label = @2 + local.get 1 + i32.const 2048 + i32.ge_u + br_if 0 (;@2;) + i32.const 2 + local.set 3 + br 1 (;@1;) + end + i32.const 3 + i32.const 4 + local.get 1 + i32.const 65536 + i32.lt_u + select + local.set 3 + end + local.get 2 + local.set 4 + block ;; label = @1 + local.get 3 + local.get 0 + i32.load + local.get 2 + i32.sub + i32.le_u + br_if 0 (;@1;) + local.get 0 + local.get 2 + local.get 3 + i32.const 1 + i32.const 1 + call $_ZN5alloc7raw_vec20RawVecInner$LT$A$GT$7reserve21do_reserve_and_handle17h9d7cabd5071c5a51E + local.get 0 + i32.load offset=8 + local.set 4 + end + local.get 0 + i32.load offset=4 + local.get 4 + i32.add + local.set 4 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 1 + i32.const 128 + i32.lt_u + br_if 0 (;@3;) + local.get 1 + i32.const 2048 + i32.lt_u + br_if 1 (;@2;) + block ;; label = @4 + local.get 1 + i32.const 65536 + i32.lt_u + br_if 0 (;@4;) + local.get 4 + local.get 1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=3 + local.get 4 + local.get 1 + i32.const 18 + i32.shr_u + i32.const 240 + i32.or + i32.store8 + local.get 4 + local.get 1 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=2 + local.get 4 + local.get 1 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=1 + br 3 (;@1;) + end + local.get 4 + local.get 1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=2 + local.get 4 + local.get 1 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + i32.store8 + local.get 4 + local.get 1 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=1 + br 2 (;@1;) + end + local.get 4 + local.get 1 + i32.store8 + br 1 (;@1;) + end + local.get 4 + local.get 1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=1 + local.get 4 + local.get 1 + i32.const 6 + i32.shr_u + i32.const 192 + i32.or + i32.store8 + end + local.get 0 + local.get 3 + local.get 2 + i32.add + i32.store offset=8 + i32.const 0) + (func $_ZN58_$LT$alloc..string..String$u20$as$u20$core..fmt..Write$GT$9write_str17h7850057311a0cef1E (type 2) (param i32 i32 i32) (result i32) + (local i32) + block ;; label = @1 + local.get 2 + local.get 0 + i32.load + local.get 0 + i32.load offset=8 + local.tee 3 + i32.sub + i32.le_u + br_if 0 (;@1;) + local.get 0 + local.get 3 + local.get 2 + i32.const 1 + i32.const 1 + call $_ZN5alloc7raw_vec20RawVecInner$LT$A$GT$7reserve21do_reserve_and_handle17h9d7cabd5071c5a51E + local.get 0 + i32.load offset=8 + local.set 3 + end + block ;; label = @1 + local.get 2 + i32.eqz + br_if 0 (;@1;) + local.get 0 + i32.load offset=4 + local.get 3 + i32.add + local.get 1 + local.get 2 + memory.copy + end + local.get 0 + local.get 3 + local.get 2 + i32.add + i32.store offset=8 + i32.const 0) + (func $_ZN5alloc7raw_vec11finish_grow17h31fcfb118e0508a4E (type 4) (param i32 i32 i32 i32) + (local i32) + block ;; label = @1 + local.get 2 + i32.const 0 + i32.lt_s + br_if 0 (;@1;) + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 3 + i32.load offset=4 + i32.eqz + br_if 0 (;@4;) + block ;; label = @5 + local.get 3 + i32.load offset=8 + local.tee 4 + br_if 0 (;@5;) + block ;; label = @6 + local.get 2 + br_if 0 (;@6;) + local.get 1 + local.set 3 + br 4 (;@2;) + end + i32.const 0 + i32.load8_u offset=1049977 + drop + br 2 (;@3;) + end + local.get 3 + i32.load + local.get 4 + local.get 1 + local.get 2 + call $_RNvCs691rhTbG0Ee_7___rustc14___rust_realloc + local.set 3 + br 2 (;@2;) + end + block ;; label = @4 + local.get 2 + br_if 0 (;@4;) + local.get 1 + local.set 3 + br 2 (;@2;) + end + i32.const 0 + i32.load8_u offset=1049977 + drop + end + local.get 2 + local.get 1 + call $_RNvCs691rhTbG0Ee_7___rustc12___rust_alloc + local.set 3 + end + block ;; label = @2 + local.get 3 + br_if 0 (;@2;) + local.get 0 + local.get 2 + i32.store offset=8 + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + i32.const 1 + i32.store + return + end + local.get 0 + local.get 2 + i32.store offset=8 + local.get 0 + local.get 3 + i32.store offset=4 + local.get 0 + i32.const 0 + i32.store + return + end + local.get 0 + i32.const 0 + i32.store offset=4 + local.get 0 + i32.const 1 + i32.store) + (func $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h724f0d9c050c94c6E (type 0) (param i32 i32) + (local i32 i32 i32 i32) + local.get 0 + i32.load offset=12 + local.set 2 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const 256 + i32.lt_u + br_if 0 (;@4;) + local.get 0 + i32.load offset=24 + local.set 3 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 2 + local.get 0 + i32.ne + br_if 0 (;@7;) + local.get 0 + i32.const 20 + i32.const 16 + local.get 0 + i32.load offset=20 + local.tee 2 + select + i32.add + i32.load + local.tee 1 + br_if 1 (;@6;) + i32.const 0 + local.set 2 + br 2 (;@5;) + end + local.get 0 + i32.load offset=8 + local.tee 1 + local.get 2 + i32.store offset=12 + local.get 2 + local.get 1 + i32.store offset=8 + br 1 (;@5;) + end + local.get 0 + i32.const 20 + i32.add + local.get 0 + i32.const 16 + i32.add + local.get 2 + select + local.set 4 + loop ;; label = @6 + local.get 4 + local.set 5 + local.get 1 + local.tee 2 + i32.const 20 + i32.add + local.get 2 + i32.const 16 + i32.add + local.get 2 + i32.load offset=20 + local.tee 1 + select + local.set 4 + local.get 2 + i32.const 20 + i32.const 16 + local.get 1 + select + i32.add + i32.load + local.tee 1 + br_if 0 (;@6;) + end + local.get 5 + i32.const 0 + i32.store + end + local.get 3 + i32.eqz + br_if 2 (;@2;) + block ;; label = @5 + block ;; label = @6 + local.get 0 + local.get 0 + i32.load offset=28 + i32.const 2 + i32.shl + i32.const 1050000 + i32.add + local.tee 1 + i32.load + i32.eq + br_if 0 (;@6;) + local.get 3 + i32.load offset=16 + local.get 0 + i32.eq + br_if 1 (;@5;) + local.get 3 + local.get 2 + i32.store offset=20 + local.get 2 + br_if 3 (;@3;) + br 4 (;@2;) + end + local.get 1 + local.get 2 + i32.store + local.get 2 + i32.eqz + br_if 4 (;@1;) + br 2 (;@3;) + end + local.get 3 + local.get 2 + i32.store offset=16 + local.get 2 + br_if 1 (;@3;) + br 2 (;@2;) + end + block ;; label = @4 + local.get 2 + local.get 0 + i32.load offset=8 + local.tee 4 + i32.eq + br_if 0 (;@4;) + local.get 4 + local.get 2 + i32.store offset=12 + local.get 2 + local.get 4 + i32.store offset=8 + return + end + i32.const 0 + i32.const 0 + i32.load offset=1050408 + i32.const -2 + local.get 1 + i32.const 3 + i32.shr_u + i32.rotl + i32.and + i32.store offset=1050408 + return + end + local.get 2 + local.get 3 + i32.store offset=24 + block ;; label = @3 + local.get 0 + i32.load offset=16 + local.tee 1 + i32.eqz + br_if 0 (;@3;) + local.get 2 + local.get 1 + i32.store offset=16 + local.get 1 + local.get 2 + i32.store offset=24 + end + local.get 0 + i32.load offset=20 + local.tee 1 + i32.eqz + br_if 0 (;@2;) + local.get 2 + local.get 1 + i32.store offset=20 + local.get 1 + local.get 2 + i32.store offset=24 + return + end + return + end + i32.const 0 + i32.const 0 + i32.load offset=1050412 + i32.const -2 + local.get 0 + i32.load offset=28 + i32.rotl + i32.and + i32.store offset=1050412) + (func $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$13dispose_chunk17hcac66ba809c22ef9E (type 0) (param i32 i32) + (local i32 i32) + local.get 0 + local.get 1 + i32.add + local.set 2 + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=4 + local.tee 3 + i32.const 1 + i32.and + br_if 0 (;@2;) + local.get 3 + i32.const 2 + i32.and + i32.eqz + br_if 1 (;@1;) + local.get 0 + i32.load + local.tee 3 + local.get 1 + i32.add + local.set 1 + block ;; label = @3 + local.get 0 + local.get 3 + i32.sub + local.tee 0 + i32.const 0 + i32.load offset=1050424 + i32.ne + br_if 0 (;@3;) + local.get 2 + i32.load offset=4 + i32.const 3 + i32.and + i32.const 3 + i32.ne + br_if 1 (;@2;) + i32.const 0 + local.get 1 + i32.store offset=1050416 + local.get 2 + local.get 2 + i32.load offset=4 + i32.const -2 + i32.and + i32.store offset=4 + local.get 0 + local.get 1 + i32.const 1 + i32.or + i32.store offset=4 + local.get 2 + local.get 1 + i32.store + br 2 (;@1;) + end + local.get 0 + local.get 3 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h724f0d9c050c94c6E + end + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 2 + i32.load offset=4 + local.tee 3 + i32.const 2 + i32.and + br_if 0 (;@5;) + local.get 2 + i32.const 0 + i32.load offset=1050428 + i32.eq + br_if 2 (;@3;) + local.get 2 + i32.const 0 + i32.load offset=1050424 + i32.eq + br_if 3 (;@2;) + local.get 2 + local.get 3 + i32.const -8 + i32.and + local.tee 3 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h724f0d9c050c94c6E + local.get 0 + local.get 3 + local.get 1 + i32.add + local.tee 1 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + local.get 1 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 0 + i32.load offset=1050424 + i32.ne + br_if 1 (;@4;) + i32.const 0 + local.get 1 + i32.store offset=1050416 + return + end + local.get 2 + local.get 3 + i32.const -2 + i32.and + i32.store offset=4 + local.get 0 + local.get 1 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + local.get 1 + i32.add + local.get 1 + i32.store + end + block ;; label = @4 + local.get 1 + i32.const 256 + i32.lt_u + br_if 0 (;@4;) + local.get 0 + local.get 1 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h36f158d3d0e17661E + return + end + local.get 1 + i32.const 248 + i32.and + i32.const 1050144 + i32.add + local.set 2 + block ;; label = @4 + block ;; label = @5 + i32.const 0 + i32.load offset=1050408 + local.tee 3 + i32.const 1 + local.get 1 + i32.const 3 + i32.shr_u + i32.shl + local.tee 1 + i32.and + br_if 0 (;@5;) + i32.const 0 + local.get 3 + local.get 1 + i32.or + i32.store offset=1050408 + local.get 2 + local.set 1 + br 1 (;@4;) + end + local.get 2 + i32.load offset=8 + local.set 1 + end + local.get 2 + local.get 0 + i32.store offset=8 + local.get 1 + local.get 0 + i32.store offset=12 + local.get 0 + local.get 2 + i32.store offset=12 + local.get 0 + local.get 1 + i32.store offset=8 + return + end + i32.const 0 + local.get 0 + i32.store offset=1050428 + i32.const 0 + i32.const 0 + i32.load offset=1050420 + local.get 1 + i32.add + local.tee 1 + i32.store offset=1050420 + local.get 0 + local.get 1 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + i32.const 0 + i32.load offset=1050424 + i32.ne + br_if 1 (;@1;) + i32.const 0 + i32.const 0 + i32.store offset=1050416 + i32.const 0 + i32.const 0 + i32.store offset=1050424 + return + end + i32.const 0 + local.get 0 + i32.store offset=1050424 + i32.const 0 + i32.const 0 + i32.load offset=1050416 + local.get 1 + i32.add + local.tee 1 + i32.store offset=1050416 + local.get 0 + local.get 1 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + local.get 1 + i32.add + local.get 1 + i32.store + return + end) + (func $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h36f158d3d0e17661E (type 0) (param i32 i32) + (local i32 i32 i32 i32) + i32.const 0 + local.set 2 + block ;; label = @1 + local.get 1 + i32.const 256 + i32.lt_u + br_if 0 (;@1;) + i32.const 31 + local.set 2 + local.get 1 + i32.const 16777215 + i32.gt_u + br_if 0 (;@1;) + local.get 1 + i32.const 6 + local.get 1 + i32.const 8 + i32.shr_u + i32.clz + local.tee 2 + i32.sub + i32.shr_u + i32.const 1 + i32.and + local.get 2 + i32.const 1 + i32.shl + i32.sub + i32.const 62 + i32.add + local.set 2 + end + local.get 0 + i64.const 0 + i64.store offset=16 align=4 + local.get 0 + local.get 2 + i32.store offset=28 + local.get 2 + i32.const 2 + i32.shl + i32.const 1050000 + i32.add + local.set 3 + block ;; label = @1 + i32.const 0 + i32.load offset=1050412 + i32.const 1 + local.get 2 + i32.shl + local.tee 4 + i32.and + br_if 0 (;@1;) + local.get 3 + local.get 0 + i32.store + local.get 0 + local.get 3 + i32.store offset=24 + local.get 0 + local.get 0 + i32.store offset=12 + local.get 0 + local.get 0 + i32.store offset=8 + i32.const 0 + i32.const 0 + i32.load offset=1050412 + local.get 4 + i32.or + i32.store offset=1050412 + return + end + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 3 + i32.load + local.tee 4 + i32.load offset=4 + i32.const -8 + i32.and + local.get 1 + i32.ne + br_if 0 (;@3;) + local.get 4 + local.set 2 + br 1 (;@2;) + end + local.get 1 + i32.const 0 + i32.const 25 + local.get 2 + i32.const 1 + i32.shr_u + i32.sub + local.get 2 + i32.const 31 + i32.eq + select + i32.shl + local.set 3 + loop ;; label = @3 + local.get 4 + local.get 3 + i32.const 29 + i32.shr_u + i32.const 4 + i32.and + i32.add + local.tee 5 + i32.load offset=16 + local.tee 2 + i32.eqz + br_if 2 (;@1;) + local.get 3 + i32.const 1 + i32.shl + local.set 3 + local.get 2 + local.set 4 + local.get 2 + i32.load offset=4 + i32.const -8 + i32.and + local.get 1 + i32.ne + br_if 0 (;@3;) + end + end + local.get 2 + i32.load offset=8 + local.tee 3 + local.get 0 + i32.store offset=12 + local.get 2 + local.get 0 + i32.store offset=8 + local.get 0 + i32.const 0 + i32.store offset=24 + local.get 0 + local.get 2 + i32.store offset=12 + local.get 0 + local.get 3 + i32.store offset=8 + return + end + local.get 5 + i32.const 16 + i32.add + local.get 0 + i32.store + local.get 0 + local.get 4 + i32.store offset=24 + local.get 0 + local.get 0 + i32.store offset=12 + local.get 0 + local.get 0 + i32.store offset=8) + (func $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$4free17hd05ac7097937f97bE (type 9) (param i32) + (local i32 i32 i32 i32 i32) + local.get 0 + i32.const -8 + i32.add + local.tee 1 + local.get 0 + i32.const -4 + i32.add + i32.load + local.tee 2 + i32.const -8 + i32.and + local.tee 0 + i32.add + local.set 3 + block ;; label = @1 + block ;; label = @2 + local.get 2 + i32.const 1 + i32.and + br_if 0 (;@2;) + local.get 2 + i32.const 2 + i32.and + i32.eqz + br_if 1 (;@1;) + local.get 1 + i32.load + local.tee 2 + local.get 0 + i32.add + local.set 0 + block ;; label = @3 + local.get 1 + local.get 2 + i32.sub + local.tee 1 + i32.const 0 + i32.load offset=1050424 + i32.ne + br_if 0 (;@3;) + local.get 3 + i32.load offset=4 + i32.const 3 + i32.and + i32.const 3 + i32.ne + br_if 1 (;@2;) + i32.const 0 + local.get 0 + i32.store offset=1050416 + local.get 3 + local.get 3 + i32.load offset=4 + i32.const -2 + i32.and + i32.store offset=4 + local.get 1 + local.get 0 + i32.const 1 + i32.or + i32.store offset=4 + local.get 3 + local.get 0 + i32.store + return + end + local.get 1 + local.get 2 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h724f0d9c050c94c6E + end + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 3 + i32.load offset=4 + local.tee 2 + i32.const 2 + i32.and + br_if 0 (;@7;) + local.get 3 + i32.const 0 + i32.load offset=1050428 + i32.eq + br_if 2 (;@5;) + local.get 3 + i32.const 0 + i32.load offset=1050424 + i32.eq + br_if 3 (;@4;) + local.get 3 + local.get 2 + i32.const -8 + i32.and + local.tee 2 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h724f0d9c050c94c6E + local.get 1 + local.get 2 + local.get 0 + i32.add + local.tee 0 + i32.const 1 + i32.or + i32.store offset=4 + local.get 1 + local.get 0 + i32.add + local.get 0 + i32.store + local.get 1 + i32.const 0 + i32.load offset=1050424 + i32.ne + br_if 1 (;@6;) + i32.const 0 + local.get 0 + i32.store offset=1050416 + return + end + local.get 3 + local.get 2 + i32.const -2 + i32.and + i32.store offset=4 + local.get 1 + local.get 0 + i32.const 1 + i32.or + i32.store offset=4 + local.get 1 + local.get 0 + i32.add + local.get 0 + i32.store + end + local.get 0 + i32.const 256 + i32.lt_u + br_if 2 (;@3;) + local.get 1 + local.get 0 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h36f158d3d0e17661E + i32.const 0 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1050448 + i32.const -1 + i32.add + local.tee 0 + i32.store offset=1050448 + local.get 0 + br_if 4 (;@1;) + block ;; label = @6 + i32.const 0 + i32.load offset=1050136 + local.tee 0 + i32.eqz + br_if 0 (;@6;) + i32.const 0 + local.set 1 + loop ;; label = @7 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 0 + i32.load offset=8 + local.tee 0 + br_if 0 (;@7;) + end + end + i32.const 0 + local.get 1 + i32.const 4095 + local.get 1 + i32.const 4095 + i32.gt_u + select + i32.store offset=1050448 + return + end + i32.const 0 + local.get 1 + i32.store offset=1050428 + i32.const 0 + i32.const 0 + i32.load offset=1050420 + local.get 0 + i32.add + local.tee 0 + i32.store offset=1050420 + local.get 1 + local.get 0 + i32.const 1 + i32.or + i32.store offset=4 + block ;; label = @5 + local.get 1 + i32.const 0 + i32.load offset=1050424 + i32.ne + br_if 0 (;@5;) + i32.const 0 + i32.const 0 + i32.store offset=1050416 + i32.const 0 + i32.const 0 + i32.store offset=1050424 + end + local.get 0 + i32.const 0 + i32.load offset=1050440 + local.tee 4 + i32.le_u + br_if 3 (;@1;) + i32.const 0 + i32.load offset=1050428 + local.tee 0 + i32.eqz + br_if 3 (;@1;) + i32.const 0 + local.set 2 + i32.const 0 + i32.load offset=1050420 + local.tee 5 + i32.const 41 + i32.lt_u + br_if 2 (;@2;) + i32.const 1050128 + local.set 1 + loop ;; label = @5 + block ;; label = @6 + local.get 1 + i32.load + local.tee 3 + local.get 0 + i32.gt_u + br_if 0 (;@6;) + local.get 0 + local.get 3 + local.get 1 + i32.load offset=4 + i32.add + i32.lt_u + br_if 4 (;@2;) + end + local.get 1 + i32.load offset=8 + local.set 1 + br 0 (;@5;) + end + end + i32.const 0 + local.get 1 + i32.store offset=1050424 + i32.const 0 + i32.const 0 + i32.load offset=1050416 + local.get 0 + i32.add + local.tee 0 + i32.store offset=1050416 + local.get 1 + local.get 0 + i32.const 1 + i32.or + i32.store offset=4 + local.get 1 + local.get 0 + i32.add + local.get 0 + i32.store + return + end + local.get 0 + i32.const 248 + i32.and + i32.const 1050144 + i32.add + local.set 3 + block ;; label = @3 + block ;; label = @4 + i32.const 0 + i32.load offset=1050408 + local.tee 2 + i32.const 1 + local.get 0 + i32.const 3 + i32.shr_u + i32.shl + local.tee 0 + i32.and + br_if 0 (;@4;) + i32.const 0 + local.get 2 + local.get 0 + i32.or + i32.store offset=1050408 + local.get 3 + local.set 0 + br 1 (;@3;) + end + local.get 3 + i32.load offset=8 + local.set 0 + end + local.get 3 + local.get 1 + i32.store offset=8 + local.get 0 + local.get 1 + i32.store offset=12 + local.get 1 + local.get 3 + i32.store offset=12 + local.get 1 + local.get 0 + i32.store offset=8 + return + end + block ;; label = @2 + i32.const 0 + i32.load offset=1050136 + local.tee 1 + i32.eqz + br_if 0 (;@2;) + i32.const 0 + local.set 2 + loop ;; label = @3 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.load offset=8 + local.tee 1 + br_if 0 (;@3;) + end + end + i32.const 0 + local.get 2 + i32.const 4095 + local.get 2 + i32.const 4095 + i32.gt_u + select + i32.store offset=1050448 + local.get 5 + local.get 4 + i32.le_u + br_if 0 (;@1;) + i32.const 0 + i32.const -1 + i32.store offset=1050440 + end) + (func $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$6malloc17h90ff8eedc9c6744dE (type 3) (param i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i64) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + local.get 0 + i32.const 245 + i32.lt_u + br_if 0 (;@8;) + block ;; label = @9 + local.get 0 + i32.const -65588 + i32.le_u + br_if 0 (;@9;) + i32.const 0 + local.set 0 + br 8 (;@1;) + end + local.get 0 + i32.const 11 + i32.add + local.tee 2 + i32.const -8 + i32.and + local.set 3 + i32.const 0 + i32.load offset=1050412 + local.tee 4 + i32.eqz + br_if 4 (;@4;) + i32.const 31 + local.set 5 + block ;; label = @9 + local.get 0 + i32.const 16777204 + i32.gt_u + br_if 0 (;@9;) + local.get 3 + i32.const 6 + local.get 2 + i32.const 8 + i32.shr_u + i32.clz + local.tee 0 + i32.sub + i32.shr_u + i32.const 1 + i32.and + local.get 0 + i32.const 1 + i32.shl + i32.sub + i32.const 62 + i32.add + local.set 5 + end + i32.const 0 + local.get 3 + i32.sub + local.set 2 + block ;; label = @9 + local.get 5 + i32.const 2 + i32.shl + i32.const 1050000 + i32.add + i32.load + local.tee 6 + br_if 0 (;@9;) + i32.const 0 + local.set 0 + i32.const 0 + local.set 7 + br 2 (;@7;) + end + i32.const 0 + local.set 0 + local.get 3 + i32.const 0 + i32.const 25 + local.get 5 + i32.const 1 + i32.shr_u + i32.sub + local.get 5 + i32.const 31 + i32.eq + select + i32.shl + local.set 8 + i32.const 0 + local.set 7 + loop ;; label = @9 + block ;; label = @10 + local.get 6 + local.tee 6 + i32.load offset=4 + i32.const -8 + i32.and + local.tee 9 + local.get 3 + i32.lt_u + br_if 0 (;@10;) + local.get 9 + local.get 3 + i32.sub + local.tee 9 + local.get 2 + i32.ge_u + br_if 0 (;@10;) + local.get 9 + local.set 2 + local.get 6 + local.set 7 + local.get 9 + br_if 0 (;@10;) + i32.const 0 + local.set 2 + local.get 6 + local.set 7 + local.get 6 + local.set 0 + br 4 (;@6;) + end + local.get 6 + i32.load offset=20 + local.tee 9 + local.get 0 + local.get 9 + local.get 6 + local.get 8 + i32.const 29 + i32.shr_u + i32.const 4 + i32.and + i32.add + i32.load offset=16 + local.tee 6 + i32.ne + select + local.get 0 + local.get 9 + select + local.set 0 + local.get 8 + i32.const 1 + i32.shl + local.set 8 + local.get 6 + i32.eqz + br_if 2 (;@7;) + br 0 (;@9;) + end + end + block ;; label = @8 + i32.const 0 + i32.load offset=1050408 + local.tee 6 + i32.const 16 + local.get 0 + i32.const 11 + i32.add + i32.const 504 + i32.and + local.get 0 + i32.const 11 + i32.lt_u + select + local.tee 3 + i32.const 3 + i32.shr_u + local.tee 2 + i32.shr_u + local.tee 0 + i32.const 3 + i32.and + i32.eqz + br_if 0 (;@8;) + block ;; label = @9 + block ;; label = @10 + local.get 0 + i32.const -1 + i32.xor + i32.const 1 + i32.and + local.get 2 + i32.add + local.tee 8 + i32.const 3 + i32.shl + local.tee 3 + i32.const 1050144 + i32.add + local.tee 0 + local.get 3 + i32.const 1050152 + i32.add + i32.load + local.tee 2 + i32.load offset=8 + local.tee 7 + i32.eq + br_if 0 (;@10;) + local.get 7 + local.get 0 + i32.store offset=12 + local.get 0 + local.get 7 + i32.store offset=8 + br 1 (;@9;) + end + i32.const 0 + local.get 6 + i32.const -2 + local.get 8 + i32.rotl + i32.and + i32.store offset=1050408 + end + local.get 2 + i32.const 8 + i32.add + local.set 0 + local.get 2 + local.get 3 + i32.const 3 + i32.or + i32.store offset=4 + local.get 2 + local.get 3 + i32.add + local.tee 3 + local.get 3 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + br 7 (;@1;) + end + local.get 3 + i32.const 0 + i32.load offset=1050416 + i32.le_u + br_if 3 (;@4;) + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + local.get 0 + br_if 0 (;@10;) + i32.const 0 + i32.load offset=1050412 + local.tee 0 + i32.eqz + br_if 6 (;@4;) + local.get 0 + i32.ctz + i32.const 2 + i32.shl + i32.const 1050000 + i32.add + i32.load + local.tee 7 + i32.load offset=4 + i32.const -8 + i32.and + local.get 3 + i32.sub + local.set 2 + local.get 7 + local.set 6 + loop ;; label = @11 + block ;; label = @12 + local.get 7 + i32.load offset=16 + local.tee 0 + br_if 0 (;@12;) + local.get 7 + i32.load offset=20 + local.tee 0 + br_if 0 (;@12;) + local.get 6 + i32.load offset=24 + local.set 5 + block ;; label = @13 + block ;; label = @14 + block ;; label = @15 + local.get 6 + i32.load offset=12 + local.tee 0 + local.get 6 + i32.ne + br_if 0 (;@15;) + local.get 6 + i32.const 20 + i32.const 16 + local.get 6 + i32.load offset=20 + local.tee 0 + select + i32.add + i32.load + local.tee 7 + br_if 1 (;@14;) + i32.const 0 + local.set 0 + br 2 (;@13;) + end + local.get 6 + i32.load offset=8 + local.tee 7 + local.get 0 + i32.store offset=12 + local.get 0 + local.get 7 + i32.store offset=8 + br 1 (;@13;) + end + local.get 6 + i32.const 20 + i32.add + local.get 6 + i32.const 16 + i32.add + local.get 0 + select + local.set 8 + loop ;; label = @14 + local.get 8 + local.set 9 + local.get 7 + local.tee 0 + i32.const 20 + i32.add + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.load offset=20 + local.tee 7 + select + local.set 8 + local.get 0 + i32.const 20 + i32.const 16 + local.get 7 + select + i32.add + i32.load + local.tee 7 + br_if 0 (;@14;) + end + local.get 9 + i32.const 0 + i32.store + end + local.get 5 + i32.eqz + br_if 4 (;@8;) + block ;; label = @13 + block ;; label = @14 + local.get 6 + local.get 6 + i32.load offset=28 + i32.const 2 + i32.shl + i32.const 1050000 + i32.add + local.tee 7 + i32.load + i32.eq + br_if 0 (;@14;) + block ;; label = @15 + local.get 5 + i32.load offset=16 + local.get 6 + i32.eq + br_if 0 (;@15;) + local.get 5 + local.get 0 + i32.store offset=20 + local.get 0 + br_if 2 (;@13;) + br 7 (;@8;) + end + local.get 5 + local.get 0 + i32.store offset=16 + local.get 0 + br_if 1 (;@13;) + br 6 (;@8;) + end + local.get 7 + local.get 0 + i32.store + local.get 0 + i32.eqz + br_if 4 (;@9;) + end + local.get 0 + local.get 5 + i32.store offset=24 + block ;; label = @13 + local.get 6 + i32.load offset=16 + local.tee 7 + i32.eqz + br_if 0 (;@13;) + local.get 0 + local.get 7 + i32.store offset=16 + local.get 7 + local.get 0 + i32.store offset=24 + end + local.get 6 + i32.load offset=20 + local.tee 7 + i32.eqz + br_if 4 (;@8;) + local.get 0 + local.get 7 + i32.store offset=20 + local.get 7 + local.get 0 + i32.store offset=24 + br 4 (;@8;) + end + local.get 0 + i32.load offset=4 + i32.const -8 + i32.and + local.get 3 + i32.sub + local.tee 7 + local.get 2 + local.get 7 + local.get 2 + i32.lt_u + local.tee 7 + select + local.set 2 + local.get 0 + local.get 6 + local.get 7 + select + local.set 6 + local.get 0 + local.set 7 + br 0 (;@11;) + end + end + block ;; label = @10 + block ;; label = @11 + local.get 0 + local.get 2 + i32.shl + i32.const 2 + local.get 2 + i32.shl + local.tee 0 + i32.const 0 + local.get 0 + i32.sub + i32.or + i32.and + i32.ctz + local.tee 9 + i32.const 3 + i32.shl + local.tee 2 + i32.const 1050144 + i32.add + local.tee 7 + local.get 2 + i32.const 1050152 + i32.add + i32.load + local.tee 0 + i32.load offset=8 + local.tee 8 + i32.eq + br_if 0 (;@11;) + local.get 8 + local.get 7 + i32.store offset=12 + local.get 7 + local.get 8 + i32.store offset=8 + br 1 (;@10;) + end + i32.const 0 + local.get 6 + i32.const -2 + local.get 9 + i32.rotl + i32.and + i32.store offset=1050408 + end + local.get 0 + local.get 3 + i32.const 3 + i32.or + i32.store offset=4 + local.get 0 + local.get 3 + i32.add + local.tee 8 + local.get 2 + local.get 3 + i32.sub + local.tee 7 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + local.get 2 + i32.add + local.get 7 + i32.store + block ;; label = @10 + i32.const 0 + i32.load offset=1050416 + local.tee 6 + i32.eqz + br_if 0 (;@10;) + local.get 6 + i32.const -8 + i32.and + i32.const 1050144 + i32.add + local.set 2 + i32.const 0 + i32.load offset=1050424 + local.set 3 + block ;; label = @11 + block ;; label = @12 + i32.const 0 + i32.load offset=1050408 + local.tee 9 + i32.const 1 + local.get 6 + i32.const 3 + i32.shr_u + i32.shl + local.tee 6 + i32.and + br_if 0 (;@12;) + i32.const 0 + local.get 9 + local.get 6 + i32.or + i32.store offset=1050408 + local.get 2 + local.set 6 + br 1 (;@11;) + end + local.get 2 + i32.load offset=8 + local.set 6 + end + local.get 2 + local.get 3 + i32.store offset=8 + local.get 6 + local.get 3 + i32.store offset=12 + local.get 3 + local.get 2 + i32.store offset=12 + local.get 3 + local.get 6 + i32.store offset=8 + end + local.get 0 + i32.const 8 + i32.add + local.set 0 + i32.const 0 + local.get 8 + i32.store offset=1050424 + i32.const 0 + local.get 7 + i32.store offset=1050416 + br 8 (;@1;) + end + i32.const 0 + i32.const 0 + i32.load offset=1050412 + i32.const -2 + local.get 6 + i32.load offset=28 + i32.rotl + i32.and + i32.store offset=1050412 + end + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + local.get 2 + i32.const 16 + i32.lt_u + br_if 0 (;@10;) + local.get 6 + local.get 3 + i32.const 3 + i32.or + i32.store offset=4 + local.get 6 + local.get 3 + i32.add + local.tee 3 + local.get 2 + i32.const 1 + i32.or + i32.store offset=4 + local.get 3 + local.get 2 + i32.add + local.get 2 + i32.store + i32.const 0 + i32.load offset=1050416 + local.tee 8 + i32.eqz + br_if 1 (;@9;) + local.get 8 + i32.const -8 + i32.and + i32.const 1050144 + i32.add + local.set 7 + i32.const 0 + i32.load offset=1050424 + local.set 0 + block ;; label = @11 + block ;; label = @12 + i32.const 0 + i32.load offset=1050408 + local.tee 9 + i32.const 1 + local.get 8 + i32.const 3 + i32.shr_u + i32.shl + local.tee 8 + i32.and + br_if 0 (;@12;) + i32.const 0 + local.get 9 + local.get 8 + i32.or + i32.store offset=1050408 + local.get 7 + local.set 8 + br 1 (;@11;) + end + local.get 7 + i32.load offset=8 + local.set 8 + end + local.get 7 + local.get 0 + i32.store offset=8 + local.get 8 + local.get 0 + i32.store offset=12 + local.get 0 + local.get 7 + i32.store offset=12 + local.get 0 + local.get 8 + i32.store offset=8 + br 1 (;@9;) + end + local.get 6 + local.get 2 + local.get 3 + i32.add + local.tee 0 + i32.const 3 + i32.or + i32.store offset=4 + local.get 6 + local.get 0 + i32.add + local.tee 0 + local.get 0 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + br 1 (;@8;) + end + i32.const 0 + local.get 3 + i32.store offset=1050424 + i32.const 0 + local.get 2 + i32.store offset=1050416 + end + local.get 6 + i32.const 8 + i32.add + local.set 0 + br 6 (;@1;) + end + block ;; label = @7 + local.get 0 + local.get 7 + i32.or + br_if 0 (;@7;) + i32.const 0 + local.set 7 + i32.const 2 + local.get 5 + i32.shl + local.tee 0 + i32.const 0 + local.get 0 + i32.sub + i32.or + local.get 4 + i32.and + local.tee 0 + i32.eqz + br_if 3 (;@4;) + local.get 0 + i32.ctz + i32.const 2 + i32.shl + i32.const 1050000 + i32.add + i32.load + local.set 0 + end + local.get 0 + i32.eqz + br_if 1 (;@5;) + end + loop ;; label = @6 + local.get 0 + local.get 7 + local.get 0 + i32.load offset=4 + i32.const -8 + i32.and + local.tee 6 + local.get 3 + i32.sub + local.tee 9 + local.get 2 + i32.lt_u + local.tee 5 + select + local.set 4 + local.get 6 + local.get 3 + i32.lt_u + local.set 8 + local.get 9 + local.get 2 + local.get 5 + select + local.set 9 + block ;; label = @7 + local.get 0 + i32.load offset=16 + local.tee 6 + br_if 0 (;@7;) + local.get 0 + i32.load offset=20 + local.set 6 + end + local.get 7 + local.get 4 + local.get 8 + select + local.set 7 + local.get 2 + local.get 9 + local.get 8 + select + local.set 2 + local.get 6 + local.set 0 + local.get 6 + br_if 0 (;@6;) + end + end + local.get 7 + i32.eqz + br_if 0 (;@4;) + block ;; label = @5 + i32.const 0 + i32.load offset=1050416 + local.tee 0 + local.get 3 + i32.lt_u + br_if 0 (;@5;) + local.get 2 + local.get 0 + local.get 3 + i32.sub + i32.ge_u + br_if 1 (;@4;) + end + local.get 7 + i32.load offset=24 + local.set 5 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 7 + i32.load offset=12 + local.tee 0 + local.get 7 + i32.ne + br_if 0 (;@7;) + local.get 7 + i32.const 20 + i32.const 16 + local.get 7 + i32.load offset=20 + local.tee 0 + select + i32.add + i32.load + local.tee 6 + br_if 1 (;@6;) + i32.const 0 + local.set 0 + br 2 (;@5;) + end + local.get 7 + i32.load offset=8 + local.tee 6 + local.get 0 + i32.store offset=12 + local.get 0 + local.get 6 + i32.store offset=8 + br 1 (;@5;) + end + local.get 7 + i32.const 20 + i32.add + local.get 7 + i32.const 16 + i32.add + local.get 0 + select + local.set 8 + loop ;; label = @6 + local.get 8 + local.set 9 + local.get 6 + local.tee 0 + i32.const 20 + i32.add + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.load offset=20 + local.tee 6 + select + local.set 8 + local.get 0 + i32.const 20 + i32.const 16 + local.get 6 + select + i32.add + i32.load + local.tee 6 + br_if 0 (;@6;) + end + local.get 9 + i32.const 0 + i32.store + end + local.get 5 + i32.eqz + br_if 2 (;@2;) + block ;; label = @5 + block ;; label = @6 + local.get 7 + local.get 7 + i32.load offset=28 + i32.const 2 + i32.shl + i32.const 1050000 + i32.add + local.tee 6 + i32.load + i32.eq + br_if 0 (;@6;) + block ;; label = @7 + local.get 5 + i32.load offset=16 + local.get 7 + i32.eq + br_if 0 (;@7;) + local.get 5 + local.get 0 + i32.store offset=20 + local.get 0 + br_if 2 (;@5;) + br 5 (;@2;) + end + local.get 5 + local.get 0 + i32.store offset=16 + local.get 0 + br_if 1 (;@5;) + br 4 (;@2;) + end + local.get 6 + local.get 0 + i32.store + local.get 0 + i32.eqz + br_if 2 (;@3;) + end + local.get 0 + local.get 5 + i32.store offset=24 + block ;; label = @5 + local.get 7 + i32.load offset=16 + local.tee 6 + i32.eqz + br_if 0 (;@5;) + local.get 0 + local.get 6 + i32.store offset=16 + local.get 6 + local.get 0 + i32.store offset=24 + end + local.get 7 + i32.load offset=20 + local.tee 6 + i32.eqz + br_if 2 (;@2;) + local.get 0 + local.get 6 + i32.store offset=20 + local.get 6 + local.get 0 + i32.store offset=24 + br 2 (;@2;) + end + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + i32.const 0 + i32.load offset=1050416 + local.tee 0 + local.get 3 + i32.ge_u + br_if 0 (;@9;) + block ;; label = @10 + i32.const 0 + i32.load offset=1050420 + local.tee 0 + local.get 3 + i32.gt_u + br_if 0 (;@10;) + local.get 1 + i32.const 4 + i32.add + i32.const 1050452 + local.get 3 + i32.const 65583 + i32.add + i32.const -65536 + i32.and + call $_ZN61_$LT$dlmalloc..sys..System$u20$as$u20$dlmalloc..Allocator$GT$5alloc17hd536f0311f53ebe2E + block ;; label = @11 + local.get 1 + i32.load offset=4 + local.tee 6 + br_if 0 (;@11;) + i32.const 0 + local.set 0 + br 10 (;@1;) + end + local.get 1 + i32.load offset=12 + local.set 5 + i32.const 0 + i32.const 0 + i32.load offset=1050432 + local.get 1 + i32.load offset=8 + local.tee 9 + i32.add + local.tee 0 + i32.store offset=1050432 + i32.const 0 + local.get 0 + i32.const 0 + i32.load offset=1050436 + local.tee 2 + local.get 0 + local.get 2 + i32.gt_u + select + i32.store offset=1050436 + block ;; label = @11 + block ;; label = @12 + block ;; label = @13 + i32.const 0 + i32.load offset=1050428 + local.tee 2 + i32.eqz + br_if 0 (;@13;) + i32.const 1050128 + local.set 0 + loop ;; label = @14 + local.get 6 + local.get 0 + i32.load + local.tee 7 + local.get 0 + i32.load offset=4 + local.tee 8 + i32.add + i32.eq + br_if 2 (;@12;) + local.get 0 + i32.load offset=8 + local.tee 0 + br_if 0 (;@14;) + br 3 (;@11;) + end + end + block ;; label = @13 + block ;; label = @14 + i32.const 0 + i32.load offset=1050444 + local.tee 0 + i32.eqz + br_if 0 (;@14;) + local.get 6 + local.get 0 + i32.ge_u + br_if 1 (;@13;) + end + i32.const 0 + local.get 6 + i32.store offset=1050444 + end + i32.const 0 + i32.const 4095 + i32.store offset=1050448 + i32.const 0 + local.get 5 + i32.store offset=1050140 + i32.const 0 + local.get 9 + i32.store offset=1050132 + i32.const 0 + local.get 6 + i32.store offset=1050128 + i32.const 0 + i32.const 1050144 + i32.store offset=1050156 + i32.const 0 + i32.const 1050152 + i32.store offset=1050164 + i32.const 0 + i32.const 1050144 + i32.store offset=1050152 + i32.const 0 + i32.const 1050160 + i32.store offset=1050172 + i32.const 0 + i32.const 1050152 + i32.store offset=1050160 + i32.const 0 + i32.const 1050168 + i32.store offset=1050180 + i32.const 0 + i32.const 1050160 + i32.store offset=1050168 + i32.const 0 + i32.const 1050176 + i32.store offset=1050188 + i32.const 0 + i32.const 1050168 + i32.store offset=1050176 + i32.const 0 + i32.const 1050184 + i32.store offset=1050196 + i32.const 0 + i32.const 1050176 + i32.store offset=1050184 + i32.const 0 + i32.const 1050192 + i32.store offset=1050204 + i32.const 0 + i32.const 1050184 + i32.store offset=1050192 + i32.const 0 + i32.const 1050200 + i32.store offset=1050212 + i32.const 0 + i32.const 1050192 + i32.store offset=1050200 + i32.const 0 + i32.const 1050208 + i32.store offset=1050220 + i32.const 0 + i32.const 1050200 + i32.store offset=1050208 + i32.const 0 + i32.const 1050208 + i32.store offset=1050216 + i32.const 0 + i32.const 1050216 + i32.store offset=1050228 + i32.const 0 + i32.const 1050216 + i32.store offset=1050224 + i32.const 0 + i32.const 1050224 + i32.store offset=1050236 + i32.const 0 + i32.const 1050224 + i32.store offset=1050232 + i32.const 0 + i32.const 1050232 + i32.store offset=1050244 + i32.const 0 + i32.const 1050232 + i32.store offset=1050240 + i32.const 0 + i32.const 1050240 + i32.store offset=1050252 + i32.const 0 + i32.const 1050240 + i32.store offset=1050248 + i32.const 0 + i32.const 1050248 + i32.store offset=1050260 + i32.const 0 + i32.const 1050248 + i32.store offset=1050256 + i32.const 0 + i32.const 1050256 + i32.store offset=1050268 + i32.const 0 + i32.const 1050256 + i32.store offset=1050264 + i32.const 0 + i32.const 1050264 + i32.store offset=1050276 + i32.const 0 + i32.const 1050264 + i32.store offset=1050272 + i32.const 0 + i32.const 1050272 + i32.store offset=1050284 + i32.const 0 + i32.const 1050280 + i32.store offset=1050292 + i32.const 0 + i32.const 1050272 + i32.store offset=1050280 + i32.const 0 + i32.const 1050288 + i32.store offset=1050300 + i32.const 0 + i32.const 1050280 + i32.store offset=1050288 + i32.const 0 + i32.const 1050296 + i32.store offset=1050308 + i32.const 0 + i32.const 1050288 + i32.store offset=1050296 + i32.const 0 + i32.const 1050304 + i32.store offset=1050316 + i32.const 0 + i32.const 1050296 + i32.store offset=1050304 + i32.const 0 + i32.const 1050312 + i32.store offset=1050324 + i32.const 0 + i32.const 1050304 + i32.store offset=1050312 + i32.const 0 + i32.const 1050320 + i32.store offset=1050332 + i32.const 0 + i32.const 1050312 + i32.store offset=1050320 + i32.const 0 + i32.const 1050328 + i32.store offset=1050340 + i32.const 0 + i32.const 1050320 + i32.store offset=1050328 + i32.const 0 + i32.const 1050336 + i32.store offset=1050348 + i32.const 0 + i32.const 1050328 + i32.store offset=1050336 + i32.const 0 + i32.const 1050344 + i32.store offset=1050356 + i32.const 0 + i32.const 1050336 + i32.store offset=1050344 + i32.const 0 + i32.const 1050352 + i32.store offset=1050364 + i32.const 0 + i32.const 1050344 + i32.store offset=1050352 + i32.const 0 + i32.const 1050360 + i32.store offset=1050372 + i32.const 0 + i32.const 1050352 + i32.store offset=1050360 + i32.const 0 + i32.const 1050368 + i32.store offset=1050380 + i32.const 0 + i32.const 1050360 + i32.store offset=1050368 + i32.const 0 + i32.const 1050376 + i32.store offset=1050388 + i32.const 0 + i32.const 1050368 + i32.store offset=1050376 + i32.const 0 + i32.const 1050384 + i32.store offset=1050396 + i32.const 0 + i32.const 1050376 + i32.store offset=1050384 + i32.const 0 + i32.const 1050392 + i32.store offset=1050404 + i32.const 0 + i32.const 1050384 + i32.store offset=1050392 + i32.const 0 + local.get 6 + i32.const 15 + i32.add + i32.const -8 + i32.and + local.tee 0 + i32.const -8 + i32.add + local.tee 2 + i32.store offset=1050428 + i32.const 0 + i32.const 1050392 + i32.store offset=1050400 + i32.const 0 + local.get 6 + local.get 0 + i32.sub + local.get 9 + i32.const -40 + i32.add + local.tee 0 + i32.add + i32.const 8 + i32.add + local.tee 7 + i32.store offset=1050420 + local.get 2 + local.get 7 + i32.const 1 + i32.or + i32.store offset=4 + local.get 6 + local.get 0 + i32.add + i32.const 40 + i32.store offset=4 + i32.const 0 + i32.const 2097152 + i32.store offset=1050440 + br 8 (;@4;) + end + local.get 2 + local.get 6 + i32.ge_u + br_if 0 (;@11;) + local.get 7 + local.get 2 + i32.gt_u + br_if 0 (;@11;) + local.get 0 + i32.load offset=12 + local.tee 7 + i32.const 1 + i32.and + br_if 0 (;@11;) + local.get 7 + i32.const 1 + i32.shr_u + local.get 5 + i32.eq + br_if 3 (;@8;) + end + i32.const 0 + i32.const 0 + i32.load offset=1050444 + local.tee 0 + local.get 6 + local.get 0 + local.get 6 + i32.lt_u + select + i32.store offset=1050444 + local.get 6 + local.get 9 + i32.add + local.set 7 + i32.const 1050128 + local.set 0 + block ;; label = @11 + block ;; label = @12 + block ;; label = @13 + loop ;; label = @14 + local.get 0 + i32.load + local.tee 8 + local.get 7 + i32.eq + br_if 1 (;@13;) + local.get 0 + i32.load offset=8 + local.tee 0 + br_if 0 (;@14;) + br 2 (;@12;) + end + end + local.get 0 + i32.load offset=12 + local.tee 7 + i32.const 1 + i32.and + br_if 0 (;@12;) + local.get 7 + i32.const 1 + i32.shr_u + local.get 5 + i32.eq + br_if 1 (;@11;) + end + i32.const 1050128 + local.set 0 + block ;; label = @12 + loop ;; label = @13 + block ;; label = @14 + local.get 0 + i32.load + local.tee 7 + local.get 2 + i32.gt_u + br_if 0 (;@14;) + local.get 2 + local.get 7 + local.get 0 + i32.load offset=4 + i32.add + local.tee 7 + i32.lt_u + br_if 2 (;@12;) + end + local.get 0 + i32.load offset=8 + local.set 0 + br 0 (;@13;) + end + end + i32.const 0 + local.get 6 + i32.const 15 + i32.add + i32.const -8 + i32.and + local.tee 0 + i32.const -8 + i32.add + local.tee 8 + i32.store offset=1050428 + i32.const 0 + local.get 6 + local.get 0 + i32.sub + local.get 9 + i32.const -40 + i32.add + local.tee 0 + i32.add + i32.const 8 + i32.add + local.tee 4 + i32.store offset=1050420 + local.get 8 + local.get 4 + i32.const 1 + i32.or + i32.store offset=4 + local.get 6 + local.get 0 + i32.add + i32.const 40 + i32.store offset=4 + i32.const 0 + i32.const 2097152 + i32.store offset=1050440 + local.get 2 + local.get 7 + i32.const -32 + i32.add + i32.const -8 + i32.and + i32.const -8 + i32.add + local.tee 0 + local.get 0 + local.get 2 + i32.const 16 + i32.add + i32.lt_u + select + local.tee 8 + i32.const 27 + i32.store offset=4 + i32.const 0 + i64.load offset=1050128 align=4 + local.set 10 + local.get 8 + i32.const 16 + i32.add + i32.const 0 + i64.load offset=1050136 align=4 + i64.store align=4 + local.get 8 + local.get 10 + i64.store offset=8 align=4 + i32.const 0 + local.get 5 + i32.store offset=1050140 + i32.const 0 + local.get 9 + i32.store offset=1050132 + i32.const 0 + local.get 6 + i32.store offset=1050128 + i32.const 0 + local.get 8 + i32.const 8 + i32.add + i32.store offset=1050136 + local.get 8 + i32.const 28 + i32.add + local.set 0 + loop ;; label = @12 + local.get 0 + i32.const 7 + i32.store + local.get 0 + i32.const 4 + i32.add + local.tee 0 + local.get 7 + i32.lt_u + br_if 0 (;@12;) + end + local.get 8 + local.get 2 + i32.eq + br_if 7 (;@4;) + local.get 8 + local.get 8 + i32.load offset=4 + i32.const -2 + i32.and + i32.store offset=4 + local.get 2 + local.get 8 + local.get 2 + i32.sub + local.tee 0 + i32.const 1 + i32.or + i32.store offset=4 + local.get 8 + local.get 0 + i32.store + block ;; label = @12 + local.get 0 + i32.const 256 + i32.lt_u + br_if 0 (;@12;) + local.get 2 + local.get 0 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h36f158d3d0e17661E + br 8 (;@4;) + end + local.get 0 + i32.const 248 + i32.and + i32.const 1050144 + i32.add + local.set 7 + block ;; label = @12 + block ;; label = @13 + i32.const 0 + i32.load offset=1050408 + local.tee 6 + i32.const 1 + local.get 0 + i32.const 3 + i32.shr_u + i32.shl + local.tee 0 + i32.and + br_if 0 (;@13;) + i32.const 0 + local.get 6 + local.get 0 + i32.or + i32.store offset=1050408 + local.get 7 + local.set 0 + br 1 (;@12;) + end + local.get 7 + i32.load offset=8 + local.set 0 + end + local.get 7 + local.get 2 + i32.store offset=8 + local.get 0 + local.get 2 + i32.store offset=12 + local.get 2 + local.get 7 + i32.store offset=12 + local.get 2 + local.get 0 + i32.store offset=8 + br 7 (;@4;) + end + local.get 0 + local.get 6 + i32.store + local.get 0 + local.get 0 + i32.load offset=4 + local.get 9 + i32.add + i32.store offset=4 + local.get 6 + i32.const 15 + i32.add + i32.const -8 + i32.and + i32.const -8 + i32.add + local.tee 7 + local.get 3 + i32.const 3 + i32.or + i32.store offset=4 + local.get 8 + i32.const 15 + i32.add + i32.const -8 + i32.and + i32.const -8 + i32.add + local.tee 2 + local.get 7 + local.get 3 + i32.add + local.tee 0 + i32.sub + local.set 3 + local.get 2 + i32.const 0 + i32.load offset=1050428 + i32.eq + br_if 3 (;@7;) + local.get 2 + i32.const 0 + i32.load offset=1050424 + i32.eq + br_if 4 (;@6;) + block ;; label = @11 + local.get 2 + i32.load offset=4 + local.tee 6 + i32.const 3 + i32.and + i32.const 1 + i32.ne + br_if 0 (;@11;) + local.get 2 + local.get 6 + i32.const -8 + i32.and + local.tee 6 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h724f0d9c050c94c6E + local.get 6 + local.get 3 + i32.add + local.set 3 + local.get 2 + local.get 6 + i32.add + local.tee 2 + i32.load offset=4 + local.set 6 + end + local.get 2 + local.get 6 + i32.const -2 + i32.and + i32.store offset=4 + local.get 0 + local.get 3 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + local.get 3 + i32.add + local.get 3 + i32.store + block ;; label = @11 + local.get 3 + i32.const 256 + i32.lt_u + br_if 0 (;@11;) + local.get 0 + local.get 3 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h36f158d3d0e17661E + br 6 (;@5;) + end + local.get 3 + i32.const 248 + i32.and + i32.const 1050144 + i32.add + local.set 2 + block ;; label = @11 + block ;; label = @12 + i32.const 0 + i32.load offset=1050408 + local.tee 6 + i32.const 1 + local.get 3 + i32.const 3 + i32.shr_u + i32.shl + local.tee 3 + i32.and + br_if 0 (;@12;) + i32.const 0 + local.get 6 + local.get 3 + i32.or + i32.store offset=1050408 + local.get 2 + local.set 3 + br 1 (;@11;) + end + local.get 2 + i32.load offset=8 + local.set 3 + end + local.get 2 + local.get 0 + i32.store offset=8 + local.get 3 + local.get 0 + i32.store offset=12 + local.get 0 + local.get 2 + i32.store offset=12 + local.get 0 + local.get 3 + i32.store offset=8 + br 5 (;@5;) + end + i32.const 0 + local.get 0 + local.get 3 + i32.sub + local.tee 2 + i32.store offset=1050420 + i32.const 0 + i32.const 0 + i32.load offset=1050428 + local.tee 0 + local.get 3 + i32.add + local.tee 7 + i32.store offset=1050428 + local.get 7 + local.get 2 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + local.get 3 + i32.const 3 + i32.or + i32.store offset=4 + local.get 0 + i32.const 8 + i32.add + local.set 0 + br 8 (;@1;) + end + i32.const 0 + i32.load offset=1050424 + local.set 2 + block ;; label = @9 + block ;; label = @10 + local.get 0 + local.get 3 + i32.sub + local.tee 7 + i32.const 15 + i32.gt_u + br_if 0 (;@10;) + i32.const 0 + i32.const 0 + i32.store offset=1050424 + i32.const 0 + i32.const 0 + i32.store offset=1050416 + local.get 2 + local.get 0 + i32.const 3 + i32.or + i32.store offset=4 + local.get 2 + local.get 0 + i32.add + local.tee 0 + local.get 0 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + br 1 (;@9;) + end + i32.const 0 + local.get 7 + i32.store offset=1050416 + i32.const 0 + local.get 2 + local.get 3 + i32.add + local.tee 6 + i32.store offset=1050424 + local.get 6 + local.get 7 + i32.const 1 + i32.or + i32.store offset=4 + local.get 2 + local.get 0 + i32.add + local.get 7 + i32.store + local.get 2 + local.get 3 + i32.const 3 + i32.or + i32.store offset=4 + end + local.get 2 + i32.const 8 + i32.add + local.set 0 + br 7 (;@1;) + end + local.get 0 + local.get 8 + local.get 9 + i32.add + i32.store offset=4 + i32.const 0 + i32.const 0 + i32.load offset=1050428 + local.tee 0 + i32.const 15 + i32.add + i32.const -8 + i32.and + local.tee 2 + i32.const -8 + i32.add + local.tee 7 + i32.store offset=1050428 + i32.const 0 + local.get 0 + local.get 2 + i32.sub + i32.const 0 + i32.load offset=1050420 + local.get 9 + i32.add + local.tee 2 + i32.add + i32.const 8 + i32.add + local.tee 6 + i32.store offset=1050420 + local.get 7 + local.get 6 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + local.get 2 + i32.add + i32.const 40 + i32.store offset=4 + i32.const 0 + i32.const 2097152 + i32.store offset=1050440 + br 3 (;@4;) + end + i32.const 0 + local.get 0 + i32.store offset=1050428 + i32.const 0 + i32.const 0 + i32.load offset=1050420 + local.get 3 + i32.add + local.tee 3 + i32.store offset=1050420 + local.get 0 + local.get 3 + i32.const 1 + i32.or + i32.store offset=4 + br 1 (;@5;) + end + i32.const 0 + local.get 0 + i32.store offset=1050424 + i32.const 0 + i32.const 0 + i32.load offset=1050416 + local.get 3 + i32.add + local.tee 3 + i32.store offset=1050416 + local.get 0 + local.get 3 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + local.get 3 + i32.add + local.get 3 + i32.store + end + local.get 7 + i32.const 8 + i32.add + local.set 0 + br 3 (;@1;) + end + i32.const 0 + local.set 0 + i32.const 0 + i32.load offset=1050420 + local.tee 2 + local.get 3 + i32.le_u + br_if 2 (;@1;) + i32.const 0 + local.get 2 + local.get 3 + i32.sub + local.tee 2 + i32.store offset=1050420 + i32.const 0 + i32.const 0 + i32.load offset=1050428 + local.tee 0 + local.get 3 + i32.add + local.tee 7 + i32.store offset=1050428 + local.get 7 + local.get 2 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + local.get 3 + i32.const 3 + i32.or + i32.store offset=4 + local.get 0 + i32.const 8 + i32.add + local.set 0 + br 2 (;@1;) + end + i32.const 0 + i32.const 0 + i32.load offset=1050412 + i32.const -2 + local.get 7 + i32.load offset=28 + i32.rotl + i32.and + i32.store offset=1050412 + end + block ;; label = @2 + block ;; label = @3 + local.get 2 + i32.const 16 + i32.lt_u + br_if 0 (;@3;) + local.get 7 + local.get 3 + i32.const 3 + i32.or + i32.store offset=4 + local.get 7 + local.get 3 + i32.add + local.tee 0 + local.get 2 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + local.get 2 + i32.add + local.get 2 + i32.store + block ;; label = @4 + local.get 2 + i32.const 256 + i32.lt_u + br_if 0 (;@4;) + local.get 0 + local.get 2 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h36f158d3d0e17661E + br 2 (;@2;) + end + local.get 2 + i32.const 248 + i32.and + i32.const 1050144 + i32.add + local.set 3 + block ;; label = @4 + block ;; label = @5 + i32.const 0 + i32.load offset=1050408 + local.tee 6 + i32.const 1 + local.get 2 + i32.const 3 + i32.shr_u + i32.shl + local.tee 2 + i32.and + br_if 0 (;@5;) + i32.const 0 + local.get 6 + local.get 2 + i32.or + i32.store offset=1050408 + local.get 3 + local.set 2 + br 1 (;@4;) + end + local.get 3 + i32.load offset=8 + local.set 2 + end + local.get 3 + local.get 0 + i32.store offset=8 + local.get 2 + local.get 0 + i32.store offset=12 + local.get 0 + local.get 3 + i32.store offset=12 + local.get 0 + local.get 2 + i32.store offset=8 + br 1 (;@2;) + end + local.get 7 + local.get 2 + local.get 3 + i32.add + local.tee 0 + i32.const 3 + i32.or + i32.store offset=4 + local.get 7 + local.get 0 + i32.add + local.tee 0 + local.get 0 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + end + local.get 7 + i32.const 8 + i32.add + local.set 0 + end + local.get 1 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 0) + (func $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$8memalign17h0e39a8832380600bE (type 1) (param i32 i32) (result i32) + (local i32 i32 i32 i32 i32) + i32.const 0 + local.set 2 + block ;; label = @1 + local.get 1 + i32.const -65587 + local.get 0 + i32.const 16 + local.get 0 + i32.const 16 + i32.gt_u + select + local.tee 0 + i32.sub + i32.ge_u + br_if 0 (;@1;) + local.get 0 + i32.const 16 + local.get 1 + i32.const 11 + i32.add + i32.const -8 + i32.and + local.get 1 + i32.const 11 + i32.lt_u + select + local.tee 3 + i32.add + i32.const 12 + i32.add + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$6malloc17h90ff8eedc9c6744dE + local.tee 1 + i32.eqz + br_if 0 (;@1;) + local.get 1 + i32.const -8 + i32.add + local.set 2 + block ;; label = @2 + block ;; label = @3 + local.get 0 + i32.const -1 + i32.add + local.tee 4 + local.get 1 + i32.and + br_if 0 (;@3;) + local.get 2 + local.set 0 + br 1 (;@2;) + end + local.get 1 + i32.const -4 + i32.add + local.tee 5 + i32.load + local.tee 6 + i32.const -8 + i32.and + local.get 4 + local.get 1 + i32.add + i32.const 0 + local.get 0 + i32.sub + i32.and + i32.const -8 + i32.add + local.tee 1 + i32.const 0 + local.get 0 + local.get 1 + local.get 2 + i32.sub + i32.const 16 + i32.gt_u + select + i32.add + local.tee 0 + local.get 2 + i32.sub + local.tee 1 + i32.sub + local.set 4 + block ;; label = @3 + local.get 6 + i32.const 3 + i32.and + i32.eqz + br_if 0 (;@3;) + local.get 0 + local.get 4 + local.get 0 + i32.load offset=4 + i32.const 1 + i32.and + i32.or + i32.const 2 + i32.or + i32.store offset=4 + local.get 0 + local.get 4 + i32.add + local.tee 4 + local.get 4 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + local.get 5 + local.get 1 + local.get 5 + i32.load + i32.const 1 + i32.and + i32.or + i32.const 2 + i32.or + i32.store + local.get 2 + local.get 1 + i32.add + local.tee 4 + local.get 4 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + local.get 2 + local.get 1 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$13dispose_chunk17hcac66ba809c22ef9E + br 1 (;@2;) + end + local.get 2 + i32.load + local.set 2 + local.get 0 + local.get 4 + i32.store offset=4 + local.get 0 + local.get 2 + local.get 1 + i32.add + i32.store + end + block ;; label = @2 + local.get 0 + i32.load offset=4 + local.tee 1 + i32.const 3 + i32.and + i32.eqz + br_if 0 (;@2;) + local.get 1 + i32.const -8 + i32.and + local.tee 2 + local.get 3 + i32.const 16 + i32.add + i32.le_u + br_if 0 (;@2;) + local.get 0 + local.get 3 + local.get 1 + i32.const 1 + i32.and + i32.or + i32.const 2 + i32.or + i32.store offset=4 + local.get 0 + local.get 3 + i32.add + local.tee 1 + local.get 2 + local.get 3 + i32.sub + local.tee 3 + i32.const 3 + i32.or + i32.store offset=4 + local.get 0 + local.get 2 + i32.add + local.tee 2 + local.get 2 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + local.get 1 + local.get 3 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$13dispose_chunk17hcac66ba809c22ef9E + end + local.get 0 + i32.const 8 + i32.add + local.set 2 + end + local.get 2) + (func $_ZN3std3sys9backtrace26__rust_end_short_backtrace17h16ab72765b32282dE (type 9) (param i32) + local.get 0 + call $_ZN3std9panicking19begin_panic_handler28_$u7b$$u7b$closure$u7d$$u7d$17h23ff416a921468b4E + unreachable) + (func $_ZN3std9panicking19begin_panic_handler28_$u7b$$u7b$closure$u7d$$u7d$17h23ff416a921468b4E (type 9) (param i32) + (local i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + local.get 0 + i32.load + local.tee 2 + i32.load offset=12 + local.set 3 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 2 + i32.load offset=4 + br_table 0 (;@4;) 1 (;@3;) 2 (;@2;) + end + local.get 3 + br_if 1 (;@2;) + i32.const 1 + local.set 2 + i32.const 0 + local.set 3 + br 2 (;@1;) + end + local.get 3 + br_if 0 (;@2;) + local.get 2 + i32.load + local.tee 2 + i32.load offset=4 + local.set 3 + local.get 2 + i32.load + local.set 2 + br 1 (;@1;) + end + local.get 1 + i32.const -2147483648 + i32.store + local.get 1 + local.get 0 + i32.store offset=12 + local.get 1 + i32.const 1049440 + local.get 0 + i32.load offset=4 + local.get 0 + i32.load offset=8 + local.tee 0 + i32.load8_u offset=8 + local.get 0 + i32.load8_u offset=9 + call $_ZN3std9panicking20rust_panic_with_hook17hc276d0501ad5b954E + unreachable + end + local.get 1 + local.get 3 + i32.store offset=4 + local.get 1 + local.get 2 + i32.store + local.get 1 + i32.const 1049412 + local.get 0 + i32.load offset=4 + local.get 0 + i32.load offset=8 + local.tee 0 + i32.load8_u offset=8 + local.get 0 + i32.load8_u offset=9 + call $_ZN3std9panicking20rust_panic_with_hook17hc276d0501ad5b954E + unreachable) + (func $_ZN3std5alloc24default_alloc_error_hook17hbd8de71f1732263eE (type 0) (param i32 i32) + (local i32) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 2 + global.set $__stack_pointer + block ;; label = @1 + i32.const 0 + i32.load8_u offset=1049976 + br_if 0 (;@1;) + local.get 2 + i32.const 48 + i32.add + global.set $__stack_pointer + return + end + local.get 2 + i32.const 2 + i32.store offset=12 + local.get 2 + i32.const 1049324 + i32.store offset=8 + local.get 2 + i64.const 1 + i64.store offset=20 align=4 + local.get 2 + local.get 1 + i32.store offset=44 + local.get 2 + i32.const 2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.get 2 + i32.const 44 + i32.add + i64.extend_i32_u + i64.or + i64.store offset=32 + local.get 2 + local.get 2 + i32.const 32 + i32.add + i32.store offset=16 + local.get 2 + i32.const 8 + i32.add + i32.const 1049364 + call $_ZN4core9panicking9panic_fmt17h41cfed79b2ddbf13E + unreachable) + (func $_RNvCs691rhTbG0Ee_7___rustc11___rdl_alloc (type 1) (param i32 i32) (result i32) + block ;; label = @1 + local.get 1 + i32.const 9 + i32.lt_u + br_if 0 (;@1;) + local.get 1 + local.get 0 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$8memalign17h0e39a8832380600bE + return + end + local.get 0 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$6malloc17h90ff8eedc9c6744dE) + (func $_RNvCs691rhTbG0Ee_7___rustc13___rdl_dealloc (type 5) (param i32 i32 i32) + (local i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.const -4 + i32.add + i32.load + local.tee 3 + i32.const -8 + i32.and + local.tee 4 + i32.const 4 + i32.const 8 + local.get 3 + i32.const 3 + i32.and + local.tee 3 + select + local.get 1 + i32.add + i32.lt_u + br_if 0 (;@2;) + block ;; label = @3 + local.get 3 + i32.eqz + br_if 0 (;@3;) + local.get 4 + local.get 1 + i32.const 39 + i32.add + i32.gt_u + br_if 2 (;@1;) + end + local.get 0 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$4free17hd05ac7097937f97bE + return + end + i32.const 1049161 + i32.const 46 + i32.const 1049208 + call $_ZN4core9panicking5panic17hcb4f0bfb9f36a348E + unreachable + end + i32.const 1049224 + i32.const 46 + i32.const 1049272 + call $_ZN4core9panicking5panic17hcb4f0bfb9f36a348E + unreachable) + (func $_RNvCs691rhTbG0Ee_7___rustc13___rdl_realloc (type 6) (param i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 0 + i32.const -4 + i32.add + local.tee 4 + i32.load + local.tee 5 + i32.const -8 + i32.and + local.tee 6 + i32.const 4 + i32.const 8 + local.get 5 + i32.const 3 + i32.and + local.tee 7 + select + local.get 1 + i32.add + i32.lt_u + br_if 0 (;@5;) + local.get 1 + i32.const 39 + i32.add + local.set 8 + block ;; label = @6 + local.get 7 + i32.eqz + br_if 0 (;@6;) + local.get 6 + local.get 8 + i32.gt_u + br_if 2 (;@4;) + end + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + local.get 2 + i32.const 9 + i32.lt_u + br_if 0 (;@8;) + local.get 2 + local.get 3 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$8memalign17h0e39a8832380600bE + local.tee 2 + br_if 1 (;@7;) + i32.const 0 + return + end + i32.const 0 + local.set 2 + local.get 3 + i32.const -65588 + i32.gt_u + br_if 1 (;@6;) + i32.const 16 + local.get 3 + i32.const 11 + i32.add + i32.const -8 + i32.and + local.get 3 + i32.const 11 + i32.lt_u + select + local.set 1 + block ;; label = @8 + block ;; label = @9 + local.get 7 + br_if 0 (;@9;) + local.get 1 + i32.const 256 + i32.lt_u + br_if 1 (;@8;) + local.get 6 + local.get 1 + i32.const 4 + i32.or + i32.lt_u + br_if 1 (;@8;) + local.get 6 + local.get 1 + i32.sub + i32.const 131073 + i32.ge_u + br_if 1 (;@8;) + local.get 0 + return + end + local.get 0 + i32.const -8 + i32.add + local.tee 8 + local.get 6 + i32.add + local.set 7 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + block ;; label = @12 + block ;; label = @13 + local.get 6 + local.get 1 + i32.ge_u + br_if 0 (;@13;) + local.get 7 + i32.const 0 + i32.load offset=1050428 + i32.eq + br_if 4 (;@9;) + local.get 7 + i32.const 0 + i32.load offset=1050424 + i32.eq + br_if 2 (;@11;) + local.get 7 + i32.load offset=4 + local.tee 5 + i32.const 2 + i32.and + br_if 5 (;@8;) + local.get 5 + i32.const -8 + i32.and + local.tee 9 + local.get 6 + i32.add + local.tee 5 + local.get 1 + i32.lt_u + br_if 5 (;@8;) + local.get 7 + local.get 9 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h724f0d9c050c94c6E + local.get 5 + local.get 1 + i32.sub + local.tee 3 + i32.const 16 + i32.lt_u + br_if 1 (;@12;) + local.get 4 + local.get 1 + local.get 4 + i32.load + i32.const 1 + i32.and + i32.or + i32.const 2 + i32.or + i32.store + local.get 8 + local.get 1 + i32.add + local.tee 1 + local.get 3 + i32.const 3 + i32.or + i32.store offset=4 + local.get 8 + local.get 5 + i32.add + local.tee 2 + local.get 2 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + local.get 1 + local.get 3 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$13dispose_chunk17hcac66ba809c22ef9E + local.get 0 + return + end + local.get 6 + local.get 1 + i32.sub + local.tee 3 + i32.const 15 + i32.gt_u + br_if 2 (;@10;) + local.get 0 + return + end + local.get 4 + local.get 5 + local.get 4 + i32.load + i32.const 1 + i32.and + i32.or + i32.const 2 + i32.or + i32.store + local.get 8 + local.get 5 + i32.add + local.tee 1 + local.get 1 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + local.get 0 + return + end + i32.const 0 + i32.load offset=1050416 + local.get 6 + i32.add + local.tee 7 + local.get 1 + i32.lt_u + br_if 2 (;@8;) + block ;; label = @11 + block ;; label = @12 + local.get 7 + local.get 1 + i32.sub + local.tee 3 + i32.const 15 + i32.gt_u + br_if 0 (;@12;) + local.get 4 + local.get 5 + i32.const 1 + i32.and + local.get 7 + i32.or + i32.const 2 + i32.or + i32.store + local.get 8 + local.get 7 + i32.add + local.tee 1 + local.get 1 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + i32.const 0 + local.set 3 + i32.const 0 + local.set 1 + br 1 (;@11;) + end + local.get 4 + local.get 1 + local.get 5 + i32.const 1 + i32.and + i32.or + i32.const 2 + i32.or + i32.store + local.get 8 + local.get 1 + i32.add + local.tee 1 + local.get 3 + i32.const 1 + i32.or + i32.store offset=4 + local.get 8 + local.get 7 + i32.add + local.tee 2 + local.get 3 + i32.store + local.get 2 + local.get 2 + i32.load offset=4 + i32.const -2 + i32.and + i32.store offset=4 + end + i32.const 0 + local.get 1 + i32.store offset=1050424 + i32.const 0 + local.get 3 + i32.store offset=1050416 + local.get 0 + return + end + local.get 4 + local.get 1 + local.get 5 + i32.const 1 + i32.and + i32.or + i32.const 2 + i32.or + i32.store + local.get 8 + local.get 1 + i32.add + local.tee 1 + local.get 3 + i32.const 3 + i32.or + i32.store offset=4 + local.get 7 + local.get 7 + i32.load offset=4 + i32.const 1 + i32.or + i32.store offset=4 + local.get 1 + local.get 3 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$13dispose_chunk17hcac66ba809c22ef9E + local.get 0 + return + end + i32.const 0 + i32.load offset=1050420 + local.get 6 + i32.add + local.tee 7 + local.get 1 + i32.gt_u + br_if 7 (;@1;) + end + local.get 3 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$6malloc17h90ff8eedc9c6744dE + local.tee 1 + i32.eqz + br_if 1 (;@6;) + block ;; label = @8 + local.get 3 + i32.const -4 + i32.const -8 + local.get 4 + i32.load + local.tee 2 + i32.const 3 + i32.and + select + local.get 2 + i32.const -8 + i32.and + i32.add + local.tee 2 + local.get 3 + local.get 2 + i32.lt_u + select + local.tee 3 + i32.eqz + br_if 0 (;@8;) + local.get 1 + local.get 0 + local.get 3 + memory.copy + end + local.get 0 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$4free17hd05ac7097937f97bE + local.get 1 + return + end + block ;; label = @7 + local.get 3 + local.get 1 + local.get 3 + local.get 1 + i32.lt_u + select + local.tee 3 + i32.eqz + br_if 0 (;@7;) + local.get 2 + local.get 0 + local.get 3 + memory.copy + end + local.get 4 + i32.load + local.tee 3 + i32.const -8 + i32.and + local.tee 7 + i32.const 4 + i32.const 8 + local.get 3 + i32.const 3 + i32.and + local.tee 3 + select + local.get 1 + i32.add + i32.lt_u + br_if 3 (;@3;) + block ;; label = @7 + local.get 3 + i32.eqz + br_if 0 (;@7;) + local.get 7 + local.get 8 + i32.gt_u + br_if 5 (;@2;) + end + local.get 0 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$4free17hd05ac7097937f97bE + end + local.get 2 + return + end + i32.const 1049161 + i32.const 46 + i32.const 1049208 + call $_ZN4core9panicking5panic17hcb4f0bfb9f36a348E + unreachable + end + i32.const 1049224 + i32.const 46 + i32.const 1049272 + call $_ZN4core9panicking5panic17hcb4f0bfb9f36a348E + unreachable + end + i32.const 1049161 + i32.const 46 + i32.const 1049208 + call $_ZN4core9panicking5panic17hcb4f0bfb9f36a348E + unreachable + end + i32.const 1049224 + i32.const 46 + i32.const 1049272 + call $_ZN4core9panicking5panic17hcb4f0bfb9f36a348E + unreachable + end + local.get 4 + local.get 1 + local.get 5 + i32.const 1 + i32.and + i32.or + i32.const 2 + i32.or + i32.store + local.get 8 + local.get 1 + i32.add + local.tee 3 + local.get 7 + local.get 1 + i32.sub + local.tee 1 + i32.const 1 + i32.or + i32.store offset=4 + i32.const 0 + local.get 1 + i32.store offset=1050420 + i32.const 0 + local.get 3 + i32.store offset=1050428 + local.get 0) + (func $_RNvCs691rhTbG0Ee_7___rustc18___rdl_alloc_zeroed (type 1) (param i32 i32) (result i32) + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.const 9 + i32.lt_u + br_if 0 (;@2;) + local.get 1 + local.get 0 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$8memalign17h0e39a8832380600bE + local.set 1 + br 1 (;@1;) + end + local.get 0 + call $_ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$6malloc17h90ff8eedc9c6744dE + local.set 1 + end + block ;; label = @1 + local.get 1 + i32.eqz + br_if 0 (;@1;) + local.get 1 + i32.const -4 + i32.add + i32.load8_u + i32.const 3 + i32.and + i32.eqz + br_if 0 (;@1;) + local.get 0 + i32.eqz + br_if 0 (;@1;) + local.get 1 + i32.const 0 + local.get 0 + memory.fill + end + local.get 1) + (func $_ZN3std9panicking11panic_count8increase17h3de8e2b47e9166f9E (type 3) (param i32) (result i32) + (local i32 i32) + i32.const 0 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1049996 + local.tee 2 + i32.const 1 + i32.add + i32.store offset=1049996 + block ;; label = @1 + local.get 2 + i32.const 0 + i32.lt_s + br_if 0 (;@1;) + i32.const 1 + local.set 1 + i32.const 0 + i32.load8_u offset=1050456 + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.store8 offset=1050456 + i32.const 0 + i32.const 0 + i32.load offset=1050452 + i32.const 1 + i32.add + i32.store offset=1050452 + i32.const 2 + local.set 1 + end + local.get 1) + (func $_RNvCs691rhTbG0Ee_7___rustc17rust_begin_unwind (type 9) (param i32) + (local i32 i64) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + local.get 0 + i64.load align=4 + local.set 2 + local.get 1 + local.get 0 + i32.store offset=12 + local.get 1 + local.get 2 + i64.store offset=4 align=4 + local.get 1 + i32.const 4 + i32.add + call $_ZN3std3sys9backtrace26__rust_end_short_backtrace17h16ab72765b32282dE + unreachable) + (func $_ZN102_$LT$std..panicking..begin_panic_handler..FormatStringPayload$u20$as$u20$core..panic..PanicPayload$GT$8take_box17ha7c451ef50e5f856E (type 0) (param i32 i32) + (local i32 i32 i32 i64) + global.get $__stack_pointer + i32.const 64 + i32.sub + local.tee 2 + global.set $__stack_pointer + block ;; label = @1 + local.get 1 + i32.load + i32.const -2147483648 + i32.ne + br_if 0 (;@1;) + local.get 1 + i32.load offset=12 + local.set 3 + local.get 2 + i32.const 28 + i32.add + i32.const 8 + i32.add + local.tee 4 + i32.const 0 + i32.store + local.get 2 + i64.const 4294967296 + i64.store offset=28 align=4 + local.get 2 + i32.const 40 + i32.add + i32.const 8 + i32.add + local.get 3 + i32.load + local.tee 3 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 2 + i32.const 40 + i32.add + i32.const 16 + i32.add + local.get 3 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 2 + local.get 3 + i64.load align=4 + i64.store offset=40 + local.get 2 + i32.const 28 + i32.add + i32.const 1049096 + local.get 2 + i32.const 40 + i32.add + call $_ZN4core3fmt5write17h68542eb4423e8992E + drop + local.get 2 + i32.const 16 + i32.add + i32.const 8 + i32.add + local.get 4 + i32.load + local.tee 3 + i32.store + local.get 2 + local.get 2 + i64.load offset=28 align=4 + local.tee 5 + i64.store offset=16 + local.get 1 + i32.const 8 + i32.add + local.get 3 + i32.store + local.get 1 + local.get 5 + i64.store align=4 + end + local.get 1 + i64.load align=4 + local.set 5 + local.get 1 + i64.const 4294967296 + i64.store align=4 + local.get 2 + i32.const 8 + i32.add + local.tee 3 + local.get 1 + i32.const 8 + i32.add + local.tee 1 + i32.load + i32.store + local.get 1 + i32.const 0 + i32.store + i32.const 0 + i32.load8_u offset=1049977 + drop + local.get 2 + local.get 5 + i64.store + block ;; label = @1 + i32.const 12 + i32.const 4 + call $_RNvCs691rhTbG0Ee_7___rustc12___rust_alloc + local.tee 1 + br_if 0 (;@1;) + i32.const 4 + i32.const 12 + call $_ZN5alloc5alloc18handle_alloc_error17h538ce9133f14f3ccE + unreachable + end + local.get 1 + local.get 2 + i64.load + i64.store align=4 + local.get 1 + i32.const 8 + i32.add + local.get 3 + i32.load + i32.store + local.get 0 + i32.const 1049380 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store + local.get 2 + i32.const 64 + i32.add + global.set $__stack_pointer) + (func $_ZN102_$LT$std..panicking..begin_panic_handler..FormatStringPayload$u20$as$u20$core..panic..PanicPayload$GT$3get17he84c4c3017ddad6dE (type 0) (param i32 i32) + (local i32 i32 i32 i64) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 2 + global.set $__stack_pointer + block ;; label = @1 + local.get 1 + i32.load + i32.const -2147483648 + i32.ne + br_if 0 (;@1;) + local.get 1 + i32.load offset=12 + local.set 3 + local.get 2 + i32.const 12 + i32.add + i32.const 8 + i32.add + local.tee 4 + i32.const 0 + i32.store + local.get 2 + i64.const 4294967296 + i64.store offset=12 align=4 + local.get 2 + i32.const 24 + i32.add + i32.const 8 + i32.add + local.get 3 + i32.load + local.tee 3 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 2 + i32.const 24 + i32.add + i32.const 16 + i32.add + local.get 3 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 2 + local.get 3 + i64.load align=4 + i64.store offset=24 + local.get 2 + i32.const 12 + i32.add + i32.const 1049096 + local.get 2 + i32.const 24 + i32.add + call $_ZN4core3fmt5write17h68542eb4423e8992E + drop + local.get 2 + i32.const 8 + i32.add + local.get 4 + i32.load + local.tee 3 + i32.store + local.get 2 + local.get 2 + i64.load offset=12 align=4 + local.tee 5 + i64.store + local.get 1 + i32.const 8 + i32.add + local.get 3 + i32.store + local.get 1 + local.get 5 + i64.store align=4 + end + local.get 0 + i32.const 1049380 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store + local.get 2 + i32.const 48 + i32.add + global.set $__stack_pointer) + (func $_ZN95_$LT$std..panicking..begin_panic_handler..FormatStringPayload$u20$as$u20$core..fmt..Display$GT$3fmt17h22bfd80d379a9576E (type 1) (param i32 i32) (result i32) + (local i32) + global.get $__stack_pointer + i32.const 32 + i32.sub + local.tee 2 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load + i32.const -2147483648 + i32.eq + br_if 0 (;@2;) + local.get 1 + local.get 0 + i32.load offset=4 + local.get 0 + i32.load offset=8 + call $_ZN4core3fmt9Formatter9write_str17h5f591b7d46bcc7dbE + local.set 0 + br 1 (;@1;) + end + local.get 2 + i32.const 8 + i32.add + i32.const 8 + i32.add + local.get 0 + i32.load offset=12 + i32.load + local.tee 0 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 2 + i32.const 8 + i32.add + i32.const 16 + i32.add + local.get 0 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 2 + local.get 0 + i64.load align=4 + i64.store offset=8 + local.get 1 + i32.load + local.get 1 + i32.load offset=4 + local.get 2 + i32.const 8 + i32.add + call $_ZN4core3fmt5write17h68542eb4423e8992E + local.set 0 + end + local.get 2 + i32.const 32 + i32.add + global.set $__stack_pointer + local.get 0) + (func $_ZN99_$LT$std..panicking..begin_panic_handler..StaticStrPayload$u20$as$u20$core..panic..PanicPayload$GT$8take_box17h89f7fb848e07ab49E (type 0) (param i32 i32) + (local i32 i32) + i32.const 0 + i32.load8_u offset=1049977 + drop + local.get 1 + i32.load offset=4 + local.set 2 + local.get 1 + i32.load + local.set 3 + block ;; label = @1 + i32.const 8 + i32.const 4 + call $_RNvCs691rhTbG0Ee_7___rustc12___rust_alloc + local.tee 1 + br_if 0 (;@1;) + i32.const 4 + i32.const 8 + call $_ZN5alloc5alloc18handle_alloc_error17h538ce9133f14f3ccE + unreachable + end + local.get 1 + local.get 2 + i32.store offset=4 + local.get 1 + local.get 3 + i32.store + local.get 0 + i32.const 1049396 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store) + (func $_ZN99_$LT$std..panicking..begin_panic_handler..StaticStrPayload$u20$as$u20$core..panic..PanicPayload$GT$3get17hf8e628056151d29dE (type 0) (param i32 i32) + local.get 0 + i32.const 1049396 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store) + (func $_ZN99_$LT$std..panicking..begin_panic_handler..StaticStrPayload$u20$as$u20$core..panic..PanicPayload$GT$6as_str17h4b3ad1b286f4163aE (type 0) (param i32 i32) + local.get 0 + local.get 1 + i64.load align=4 + i64.store) + (func $_ZN92_$LT$std..panicking..begin_panic_handler..StaticStrPayload$u20$as$u20$core..fmt..Display$GT$3fmt17h1300d7785d2cb8e7E (type 1) (param i32 i32) (result i32) + local.get 1 + local.get 0 + i32.load + local.get 0 + i32.load offset=4 + call $_ZN4core3fmt9Formatter9write_str17h5f591b7d46bcc7dbE) + (func $_ZN3std9panicking20rust_panic_with_hook17hc276d0501ad5b954E (type 8) (param i32 i32 i32 i32 i32) + (local i32 i32) + global.get $__stack_pointer + i32.const 32 + i32.sub + local.tee 5 + global.set $__stack_pointer + block ;; label = @1 + i32.const 1 + call $_ZN3std9panicking11panic_count8increase17h3de8e2b47e9166f9E + i32.const 255 + i32.and + local.tee 6 + i32.const 2 + i32.eq + br_if 0 (;@1;) + block ;; label = @2 + local.get 6 + i32.const 1 + i32.and + i32.eqz + br_if 0 (;@2;) + local.get 5 + i32.const 8 + i32.add + local.get 0 + local.get 1 + i32.load offset=24 + call_indirect (type 0) + end + i32.const -2147483648 + local.get 5 + call $_ZN4core3ptr74drop_in_place$LT$core..option..Option$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h5e7c564ca6a856faE + unreachable + end + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1049984 + local.tee 6 + i32.const -1 + i32.le_s + br_if 0 (;@2;) + i32.const 0 + local.get 6 + i32.const 1 + i32.add + i32.store offset=1049984 + block ;; label = @3 + block ;; label = @4 + i32.const 0 + i32.load offset=1049988 + i32.eqz + br_if 0 (;@4;) + local.get 5 + local.get 0 + local.get 1 + i32.load offset=20 + call_indirect (type 0) + local.get 5 + local.get 4 + i32.store8 offset=29 + local.get 5 + local.get 3 + i32.store8 offset=28 + local.get 5 + local.get 2 + i32.store offset=24 + local.get 5 + local.get 5 + i64.load + i64.store offset=16 align=4 + i32.const 0 + i32.load offset=1049988 + local.get 5 + i32.const 16 + i32.add + i32.const 0 + i32.load offset=1049992 + i32.load offset=20 + call_indirect (type 0) + br 1 (;@3;) + end + i32.const -2147483648 + local.get 5 + call $_ZN4core3ptr74drop_in_place$LT$core..option..Option$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h5e7c564ca6a856faE + end + i32.const 0 + i32.const 0 + i32.load offset=1049984 + i32.const -1 + i32.add + i32.store offset=1049984 + i32.const 0 + i32.const 0 + i32.store8 offset=1050456 + local.get 3 + i32.eqz + br_if 1 (;@1;) + local.get 0 + local.get 1 + call $_RNvCs691rhTbG0Ee_7___rustc10rust_panic + end + unreachable + end + i32.const -2147483648 + local.get 5 + call $_ZN4core3ptr74drop_in_place$LT$core..option..Option$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h5e7c564ca6a856faE + unreachable) + (func $_RNvCs691rhTbG0Ee_7___rustc10rust_panic (type 0) (param i32 i32) + local.get 0 + local.get 1 + call $_RNvCs691rhTbG0Ee_7___rustc18___rust_start_panic + drop + i32.const -2147483648 + local.get 1 + call $_ZN4core3ptr74drop_in_place$LT$core..option..Option$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h5e7c564ca6a856faE + unreachable) + (func $_RNvCs691rhTbG0Ee_7___rustc8___rg_oom (type 0) (param i32 i32) + (local i32) + local.get 1 + local.get 0 + i32.const 0 + i32.load offset=1049980 + local.tee 2 + i32.const 3 + local.get 2 + select + call_indirect (type 0) + unreachable) + (func $_RNvCs691rhTbG0Ee_7___rustc18___rust_start_panic (type 1) (param i32 i32) (result i32) + unreachable) + (func $_ZN61_$LT$dlmalloc..sys..System$u20$as$u20$dlmalloc..Allocator$GT$5alloc17hd536f0311f53ebe2E (type 5) (param i32 i32 i32) + (local i32) + local.get 2 + i32.const 16 + i32.shr_u + memory.grow + local.set 3 + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + i32.const 0 + local.get 2 + i32.const -65536 + i32.and + local.get 3 + i32.const -1 + i32.eq + local.tee 2 + select + i32.store offset=4 + local.get 0 + i32.const 0 + local.get 3 + i32.const 16 + i32.shl + local.get 2 + select + i32.store) + (func $_ZN5alloc7raw_vec17capacity_overflow17hfc61731a92216a2cE (type 9) (param i32) + (local i32) + global.get $__stack_pointer + i32.const 32 + i32.sub + local.tee 1 + global.set $__stack_pointer + local.get 1 + i32.const 0 + i32.store offset=24 + local.get 1 + i32.const 1 + i32.store offset=12 + local.get 1 + i32.const 1049488 + i32.store offset=8 + local.get 1 + i64.const 4 + i64.store offset=16 align=4 + local.get 1 + i32.const 8 + i32.add + local.get 0 + call $_ZN4core9panicking9panic_fmt17h41cfed79b2ddbf13E + unreachable) + (func $_ZN5alloc7raw_vec12handle_error17h57ad9ee517c44fc6E (type 5) (param i32 i32 i32) + block ;; label = @1 + local.get 0 + i32.eqz + br_if 0 (;@1;) + local.get 0 + local.get 1 + call $_ZN5alloc5alloc18handle_alloc_error17h538ce9133f14f3ccE + unreachable + end + local.get 2 + call $_ZN5alloc7raw_vec17capacity_overflow17hfc61731a92216a2cE + unreachable) + (func $_ZN5alloc5alloc18handle_alloc_error17h538ce9133f14f3ccE (type 0) (param i32 i32) + local.get 1 + local.get 0 + call $_RNvCs691rhTbG0Ee_7___rustc26___rust_alloc_error_handler + unreachable) + (func $_ZN4core5slice5index26slice_start_index_len_fail17h026a9215e79c1fdbE (type 5) (param i32 i32 i32) + local.get 0 + local.get 1 + local.get 2 + call $_ZN4core5slice5index26slice_start_index_len_fail8do_panic7runtime17he2583cd0648d1116E + unreachable) + (func $_ZN4core5slice5index24slice_end_index_len_fail17hadfbc7e1a15974a1E (type 5) (param i32 i32 i32) + local.get 0 + local.get 1 + local.get 2 + call $_ZN4core5slice5index24slice_end_index_len_fail8do_panic7runtime17h911bca498e89ce56E + unreachable) + (func $_ZN4core3fmt9Formatter3pad17h5a5f539bbb272398E (type 2) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=8 + local.tee 3 + i32.const 402653184 + i32.and + i32.eqz + br_if 0 (;@2;) + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 3 + i32.const 268435456 + i32.and + i32.eqz + br_if 0 (;@7;) + local.get 0 + i32.load16_u offset=14 + local.tee 4 + br_if 1 (;@6;) + i32.const 0 + local.set 2 + br 2 (;@5;) + end + block ;; label = @7 + local.get 2 + i32.const 16 + i32.lt_u + br_if 0 (;@7;) + local.get 1 + local.get 2 + call $_ZN4core3str5count14do_count_chars17hfba32584e02717a7E + local.set 5 + br 4 (;@3;) + end + block ;; label = @7 + local.get 2 + br_if 0 (;@7;) + i32.const 0 + local.set 2 + i32.const 0 + local.set 5 + br 4 (;@3;) + end + local.get 2 + i32.const 3 + i32.and + local.set 6 + block ;; label = @7 + block ;; label = @8 + local.get 2 + i32.const 4 + i32.ge_u + br_if 0 (;@8;) + i32.const 0 + local.set 5 + i32.const 0 + local.set 7 + br 1 (;@7;) + end + local.get 2 + i32.const 12 + i32.and + local.set 4 + i32.const 0 + local.set 5 + i32.const 0 + local.set 7 + loop ;; label = @8 + local.get 5 + local.get 1 + local.get 7 + i32.add + local.tee 8 + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 8 + i32.const 1 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 8 + i32.const 2 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 8 + i32.const 3 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.set 5 + local.get 4 + local.get 7 + i32.const 4 + i32.add + local.tee 7 + i32.ne + br_if 0 (;@8;) + end + end + local.get 6 + i32.eqz + br_if 3 (;@3;) + local.get 1 + local.get 7 + i32.add + local.set 8 + loop ;; label = @7 + local.get 5 + local.get 8 + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.set 5 + local.get 8 + i32.const 1 + i32.add + local.set 8 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + br_if 0 (;@7;) + br 4 (;@3;) + end + end + local.get 1 + local.get 2 + i32.add + local.set 6 + i32.const 0 + local.set 2 + local.get 4 + local.set 7 + local.get 1 + local.set 8 + loop ;; label = @6 + local.get 8 + local.tee 5 + local.get 6 + i32.eq + br_if 2 (;@4;) + block ;; label = @7 + block ;; label = @8 + local.get 5 + i32.load8_s + local.tee 8 + i32.const -1 + i32.le_s + br_if 0 (;@8;) + local.get 5 + i32.const 1 + i32.add + local.set 8 + br 1 (;@7;) + end + block ;; label = @8 + local.get 8 + i32.const -32 + i32.ge_u + br_if 0 (;@8;) + local.get 5 + i32.const 2 + i32.add + local.set 8 + br 1 (;@7;) + end + block ;; label = @8 + local.get 8 + i32.const -16 + i32.ge_u + br_if 0 (;@8;) + local.get 5 + i32.const 3 + i32.add + local.set 8 + br 1 (;@7;) + end + local.get 5 + i32.const 4 + i32.add + local.set 8 + end + local.get 8 + local.get 5 + i32.sub + local.get 2 + i32.add + local.set 2 + local.get 7 + i32.const -1 + i32.add + local.tee 7 + br_if 0 (;@6;) + end + end + i32.const 0 + local.set 7 + end + local.get 4 + local.get 7 + i32.sub + local.set 5 + end + local.get 5 + local.get 0 + i32.load16_u offset=12 + local.tee 8 + i32.ge_u + br_if 0 (;@2;) + local.get 8 + local.get 5 + i32.sub + local.set 9 + i32.const 0 + local.set 5 + i32.const 0 + local.set 4 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 3 + i32.const 29 + i32.shr_u + i32.const 3 + i32.and + br_table 2 (;@3;) 0 (;@5;) 1 (;@4;) 2 (;@3;) 2 (;@3;) + end + local.get 9 + local.set 4 + br 1 (;@3;) + end + local.get 9 + i32.const 65534 + i32.and + i32.const 1 + i32.shr_u + local.set 4 + end + local.get 3 + i32.const 2097151 + i32.and + local.set 6 + local.get 0 + i32.load offset=4 + local.set 7 + local.get 0 + i32.load + local.set 0 + block ;; label = @3 + loop ;; label = @4 + local.get 5 + i32.const 65535 + i32.and + local.get 4 + i32.const 65535 + i32.and + i32.ge_u + br_if 1 (;@3;) + i32.const 1 + local.set 8 + local.get 5 + i32.const 1 + i32.add + local.set 5 + local.get 0 + local.get 6 + local.get 7 + i32.load offset=16 + call_indirect (type 1) + br_if 3 (;@1;) + br 0 (;@4;) + end + end + i32.const 1 + local.set 8 + local.get 0 + local.get 1 + local.get 2 + local.get 7 + i32.load offset=12 + call_indirect (type 2) + br_if 1 (;@1;) + i32.const 0 + local.set 5 + local.get 9 + local.get 4 + i32.sub + i32.const 65535 + i32.and + local.set 2 + loop ;; label = @3 + local.get 5 + i32.const 65535 + i32.and + local.tee 4 + local.get 2 + i32.lt_u + local.set 8 + local.get 4 + local.get 2 + i32.ge_u + br_if 2 (;@1;) + local.get 5 + i32.const 1 + i32.add + local.set 5 + local.get 0 + local.get 6 + local.get 7 + i32.load offset=16 + call_indirect (type 1) + br_if 2 (;@1;) + br 0 (;@3;) + end + end + local.get 0 + i32.load + local.get 1 + local.get 2 + local.get 0 + i32.load offset=4 + i32.load offset=12 + call_indirect (type 2) + local.set 8 + end + local.get 8) + (func $_ZN4core9panicking5panic17hcb4f0bfb9f36a348E (type 5) (param i32 i32 i32) + (local i32) + global.get $__stack_pointer + i32.const 32 + i32.sub + local.tee 3 + global.set $__stack_pointer + local.get 3 + i32.const 0 + i32.store offset=16 + local.get 3 + i32.const 1 + i32.store offset=4 + local.get 3 + i64.const 4 + i64.store offset=8 align=4 + local.get 3 + local.get 1 + i32.store offset=28 + local.get 3 + local.get 0 + i32.store offset=24 + local.get 3 + local.get 3 + i32.const 24 + i32.add + i32.store + local.get 3 + local.get 2 + call $_ZN4core9panicking9panic_fmt17h41cfed79b2ddbf13E + unreachable) + (func $_ZN4core9panicking9panic_fmt17h41cfed79b2ddbf13E (type 0) (param i32 i32) + (local i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 2 + global.set $__stack_pointer + local.get 2 + i32.const 1 + i32.store16 offset=12 + local.get 2 + local.get 1 + i32.store offset=8 + local.get 2 + local.get 0 + i32.store offset=4 + local.get 2 + i32.const 4 + i32.add + call $_RNvCs691rhTbG0Ee_7___rustc17rust_begin_unwind + unreachable) + (func $_ZN4core3fmt5write17h68542eb4423e8992E (type 2) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 3 + global.set $__stack_pointer + local.get 3 + local.get 1 + i32.store offset=4 + local.get 3 + local.get 0 + i32.store + local.get 3 + i64.const 3758096416 + i64.store offset=8 align=4 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 2 + i32.load offset=16 + local.tee 4 + i32.eqz + br_if 0 (;@5;) + local.get 2 + i32.load offset=20 + local.tee 1 + br_if 1 (;@4;) + br 2 (;@3;) + end + local.get 2 + i32.load offset=12 + local.tee 0 + i32.eqz + br_if 1 (;@3;) + local.get 2 + i32.load offset=8 + local.tee 1 + local.get 0 + i32.const 3 + i32.shl + i32.add + local.set 5 + local.get 0 + i32.const -1 + i32.add + i32.const 536870911 + i32.and + i32.const 1 + i32.add + local.set 6 + local.get 2 + i32.load + local.set 0 + loop ;; label = @5 + block ;; label = @6 + local.get 0 + i32.const 4 + i32.add + i32.load + local.tee 7 + i32.eqz + br_if 0 (;@6;) + local.get 3 + i32.load + local.get 0 + i32.load + local.get 7 + local.get 3 + i32.load offset=4 + i32.load offset=12 + call_indirect (type 2) + i32.eqz + br_if 0 (;@6;) + i32.const 1 + local.set 1 + br 5 (;@1;) + end + block ;; label = @6 + local.get 1 + i32.load + local.get 3 + local.get 1 + i32.const 4 + i32.add + i32.load + call_indirect (type 1) + i32.eqz + br_if 0 (;@6;) + i32.const 1 + local.set 1 + br 5 (;@1;) + end + local.get 0 + i32.const 8 + i32.add + local.set 0 + local.get 1 + i32.const 8 + i32.add + local.tee 1 + local.get 5 + i32.eq + br_if 3 (;@2;) + br 0 (;@5;) + end + end + local.get 1 + i32.const 24 + i32.mul + local.set 8 + local.get 1 + i32.const -1 + i32.add + i32.const 536870911 + i32.and + i32.const 1 + i32.add + local.set 6 + local.get 2 + i32.load offset=8 + local.set 9 + local.get 2 + i32.load + local.set 0 + i32.const 0 + local.set 7 + loop ;; label = @4 + block ;; label = @5 + local.get 0 + i32.const 4 + i32.add + i32.load + local.tee 1 + i32.eqz + br_if 0 (;@5;) + local.get 3 + i32.load + local.get 0 + i32.load + local.get 1 + local.get 3 + i32.load offset=4 + i32.load offset=12 + call_indirect (type 2) + i32.eqz + br_if 0 (;@5;) + i32.const 1 + local.set 1 + br 4 (;@1;) + end + i32.const 0 + local.set 5 + i32.const 0 + local.set 10 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 4 + local.get 7 + i32.add + local.tee 1 + i32.const 8 + i32.add + i32.load16_u + br_table 0 (;@7;) 1 (;@6;) 2 (;@5;) 0 (;@7;) + end + local.get 1 + i32.const 10 + i32.add + i32.load16_u + local.set 10 + br 1 (;@5;) + end + local.get 9 + local.get 1 + i32.const 12 + i32.add + i32.load + i32.const 3 + i32.shl + i32.add + i32.load16_u offset=4 + local.set 10 + end + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 1 + i32.load16_u + br_table 0 (;@7;) 1 (;@6;) 2 (;@5;) 0 (;@7;) + end + local.get 1 + i32.const 2 + i32.add + i32.load16_u + local.set 5 + br 1 (;@5;) + end + local.get 9 + local.get 1 + i32.const 4 + i32.add + i32.load + i32.const 3 + i32.shl + i32.add + i32.load16_u offset=4 + local.set 5 + end + local.get 3 + local.get 5 + i32.store16 offset=14 + local.get 3 + local.get 10 + i32.store16 offset=12 + local.get 3 + local.get 1 + i32.const 20 + i32.add + i32.load + i32.store offset=8 + block ;; label = @5 + local.get 9 + local.get 1 + i32.const 16 + i32.add + i32.load + i32.const 3 + i32.shl + i32.add + local.tee 1 + i32.load + local.get 3 + local.get 1 + i32.load offset=4 + call_indirect (type 1) + i32.eqz + br_if 0 (;@5;) + i32.const 1 + local.set 1 + br 4 (;@1;) + end + local.get 0 + i32.const 8 + i32.add + local.set 0 + local.get 8 + local.get 7 + i32.const 24 + i32.add + local.tee 7 + i32.eq + br_if 2 (;@2;) + br 0 (;@4;) + end + end + i32.const 0 + local.set 6 + end + block ;; label = @2 + local.get 6 + local.get 2 + i32.load offset=4 + i32.ge_u + br_if 0 (;@2;) + local.get 3 + i32.load + local.get 2 + i32.load + local.get 6 + i32.const 3 + i32.shl + i32.add + local.tee 1 + i32.load + local.get 1 + i32.load offset=4 + local.get 3 + i32.load offset=4 + i32.load offset=12 + call_indirect (type 2) + i32.eqz + br_if 0 (;@2;) + i32.const 1 + local.set 1 + br 1 (;@1;) + end + i32.const 0 + local.set 1 + end + local.get 3 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 1) + (func $_ZN4core3fmt3num3imp21_$LT$impl$u20$u32$GT$4_fmt17habc228f2dba507bcE (type 2) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 3 + global.set $__stack_pointer + i32.const 10 + local.set 4 + local.get 0 + local.set 5 + block ;; label = @1 + local.get 0 + i32.const 1000 + i32.lt_u + br_if 0 (;@1;) + i32.const 10 + local.set 4 + local.get 0 + local.set 6 + loop ;; label = @2 + local.get 3 + i32.const 6 + i32.add + local.get 4 + i32.add + local.tee 7 + i32.const -3 + i32.add + local.get 6 + local.get 6 + i32.const 10000 + i32.div_u + local.tee 5 + i32.const 10000 + i32.mul + i32.sub + local.tee 8 + i32.const 65535 + i32.and + i32.const 100 + i32.div_u + local.tee 9 + i32.const 1 + i32.shl + local.tee 10 + i32.const 1049517 + i32.add + i32.load8_u + i32.store8 + local.get 7 + i32.const -4 + i32.add + local.get 10 + i32.const 1049516 + i32.add + i32.load8_u + i32.store8 + local.get 7 + i32.const -1 + i32.add + local.get 8 + local.get 9 + i32.const 100 + i32.mul + i32.sub + i32.const 65535 + i32.and + i32.const 1 + i32.shl + local.tee 8 + i32.const 1049517 + i32.add + i32.load8_u + i32.store8 + local.get 7 + i32.const -2 + i32.add + local.get 8 + i32.const 1049516 + i32.add + i32.load8_u + i32.store8 + local.get 4 + i32.const -4 + i32.add + local.set 4 + local.get 6 + i32.const 9999999 + i32.gt_u + local.set 7 + local.get 5 + local.set 6 + local.get 7 + br_if 0 (;@2;) + end + end + block ;; label = @1 + block ;; label = @2 + local.get 5 + i32.const 9 + i32.gt_u + br_if 0 (;@2;) + local.get 5 + local.set 6 + br 1 (;@1;) + end + local.get 3 + i32.const 6 + i32.add + local.get 4 + i32.add + i32.const -1 + i32.add + local.get 5 + local.get 5 + i32.const 65535 + i32.and + i32.const 100 + i32.div_u + local.tee 6 + i32.const 100 + i32.mul + i32.sub + i32.const 65535 + i32.and + i32.const 1 + i32.shl + local.tee 7 + i32.const 1049517 + i32.add + i32.load8_u + i32.store8 + local.get 3 + i32.const 6 + i32.add + local.get 4 + i32.const -2 + i32.add + local.tee 4 + i32.add + local.get 7 + i32.const 1049516 + i32.add + i32.load8_u + i32.store8 + end + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.eqz + br_if 0 (;@2;) + local.get 6 + i32.eqz + br_if 1 (;@1;) + end + local.get 3 + i32.const 6 + i32.add + local.get 4 + i32.const -1 + i32.add + local.tee 4 + i32.add + local.get 6 + i32.const 1 + i32.shl + i32.const 30 + i32.and + i32.const 1049517 + i32.add + i32.load8_u + i32.store8 + end + local.get 2 + local.get 1 + i32.const 1 + i32.const 0 + local.get 3 + i32.const 6 + i32.add + local.get 4 + i32.add + i32.const 10 + local.get 4 + i32.sub + call $_ZN4core3fmt9Formatter12pad_integral17hafdfc3db6446f97dE + local.set 6 + local.get 3 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 6) + (func $_ZN4core3fmt9Formatter12pad_integral17hafdfc3db6446f97dE (type 10) (param i32 i32 i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i64) + block ;; label = @1 + block ;; label = @2 + local.get 1 + br_if 0 (;@2;) + local.get 5 + i32.const 1 + i32.add + local.set 6 + local.get 0 + i32.load offset=8 + local.set 7 + i32.const 45 + local.set 8 + br 1 (;@1;) + end + i32.const 43 + i32.const 1114112 + local.get 0 + i32.load offset=8 + local.tee 7 + i32.const 2097152 + i32.and + local.tee 1 + select + local.set 8 + local.get 1 + i32.const 21 + i32.shr_u + local.get 5 + i32.add + local.set 6 + end + block ;; label = @1 + block ;; label = @2 + local.get 7 + i32.const 8388608 + i32.and + br_if 0 (;@2;) + i32.const 0 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + block ;; label = @3 + local.get 3 + i32.const 16 + i32.lt_u + br_if 0 (;@3;) + local.get 2 + local.get 3 + call $_ZN4core3str5count14do_count_chars17hfba32584e02717a7E + local.set 1 + br 1 (;@2;) + end + block ;; label = @3 + local.get 3 + br_if 0 (;@3;) + i32.const 0 + local.set 1 + br 1 (;@2;) + end + local.get 3 + i32.const 3 + i32.and + local.set 9 + block ;; label = @3 + block ;; label = @4 + local.get 3 + i32.const 4 + i32.ge_u + br_if 0 (;@4;) + i32.const 0 + local.set 1 + i32.const 0 + local.set 10 + br 1 (;@3;) + end + local.get 3 + i32.const 12 + i32.and + local.set 11 + i32.const 0 + local.set 1 + i32.const 0 + local.set 10 + loop ;; label = @4 + local.get 1 + local.get 2 + local.get 10 + i32.add + local.tee 12 + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 12 + i32.const 1 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 12 + i32.const 2 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 12 + i32.const 3 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.set 1 + local.get 11 + local.get 10 + i32.const 4 + i32.add + local.tee 10 + i32.ne + br_if 0 (;@4;) + end + end + local.get 9 + i32.eqz + br_if 0 (;@2;) + local.get 2 + local.get 10 + i32.add + local.set 12 + loop ;; label = @3 + local.get 1 + local.get 12 + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.set 1 + local.get 12 + i32.const 1 + i32.add + local.set 12 + local.get 9 + i32.const -1 + i32.add + local.tee 9 + br_if 0 (;@3;) + end + end + local.get 1 + local.get 6 + i32.add + local.set 6 + end + block ;; label = @1 + block ;; label = @2 + local.get 6 + local.get 0 + i32.load16_u offset=12 + local.tee 11 + i32.ge_u + br_if 0 (;@2;) + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 7 + i32.const 16777216 + i32.and + br_if 0 (;@5;) + local.get 11 + local.get 6 + i32.sub + local.set 13 + i32.const 0 + local.set 1 + i32.const 0 + local.set 11 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + local.get 7 + i32.const 29 + i32.shr_u + i32.const 3 + i32.and + br_table 2 (;@6;) 0 (;@8;) 1 (;@7;) 0 (;@8;) 2 (;@6;) + end + local.get 13 + local.set 11 + br 1 (;@6;) + end + local.get 13 + i32.const 65534 + i32.and + i32.const 1 + i32.shr_u + local.set 11 + end + local.get 7 + i32.const 2097151 + i32.and + local.set 6 + local.get 0 + i32.load offset=4 + local.set 9 + local.get 0 + i32.load + local.set 10 + loop ;; label = @6 + local.get 1 + i32.const 65535 + i32.and + local.get 11 + i32.const 65535 + i32.and + i32.ge_u + br_if 2 (;@4;) + i32.const 1 + local.set 12 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 10 + local.get 6 + local.get 9 + i32.load offset=16 + call_indirect (type 1) + i32.eqz + br_if 0 (;@6;) + br 5 (;@1;) + end + end + local.get 0 + local.get 0 + i64.load offset=8 align=4 + local.tee 14 + i32.wrap_i64 + i32.const -1612709888 + i32.and + i32.const 536870960 + i32.or + i32.store offset=8 + i32.const 1 + local.set 12 + local.get 0 + i32.load + local.tee 10 + local.get 0 + i32.load offset=4 + local.tee 9 + local.get 8 + local.get 2 + local.get 3 + call $_ZN4core3fmt9Formatter12pad_integral12write_prefix17h9b7f224add674e2aE + br_if 3 (;@1;) + i32.const 0 + local.set 1 + local.get 11 + local.get 6 + i32.sub + i32.const 65535 + i32.and + local.set 2 + loop ;; label = @5 + local.get 1 + i32.const 65535 + i32.and + local.get 2 + i32.ge_u + br_if 2 (;@3;) + i32.const 1 + local.set 12 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 10 + i32.const 48 + local.get 9 + i32.load offset=16 + call_indirect (type 1) + i32.eqz + br_if 0 (;@5;) + br 4 (;@1;) + end + end + i32.const 1 + local.set 12 + local.get 10 + local.get 9 + local.get 8 + local.get 2 + local.get 3 + call $_ZN4core3fmt9Formatter12pad_integral12write_prefix17h9b7f224add674e2aE + br_if 2 (;@1;) + local.get 10 + local.get 4 + local.get 5 + local.get 9 + i32.load offset=12 + call_indirect (type 2) + br_if 2 (;@1;) + i32.const 0 + local.set 1 + local.get 13 + local.get 11 + i32.sub + i32.const 65535 + i32.and + local.set 0 + loop ;; label = @4 + local.get 1 + i32.const 65535 + i32.and + local.tee 2 + local.get 0 + i32.lt_u + local.set 12 + local.get 2 + local.get 0 + i32.ge_u + br_if 3 (;@1;) + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 10 + local.get 6 + local.get 9 + i32.load offset=16 + call_indirect (type 1) + i32.eqz + br_if 0 (;@4;) + br 3 (;@1;) + end + end + i32.const 1 + local.set 12 + local.get 10 + local.get 4 + local.get 5 + local.get 9 + i32.load offset=12 + call_indirect (type 2) + br_if 1 (;@1;) + local.get 0 + local.get 14 + i64.store offset=8 align=4 + i32.const 0 + return + end + i32.const 1 + local.set 12 + local.get 0 + i32.load + local.tee 1 + local.get 0 + i32.load offset=4 + local.tee 10 + local.get 8 + local.get 2 + local.get 3 + call $_ZN4core3fmt9Formatter12pad_integral12write_prefix17h9b7f224add674e2aE + br_if 0 (;@1;) + local.get 1 + local.get 4 + local.get 5 + local.get 10 + i32.load offset=12 + call_indirect (type 2) + local.set 12 + end + local.get 12) + (func $_ZN4core3str5count14do_count_chars17hfba32584e02717a7E (type 1) (param i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 1 + local.get 0 + i32.const 3 + i32.add + i32.const -4 + i32.and + local.tee 2 + local.get 0 + i32.sub + local.tee 3 + i32.lt_u + br_if 0 (;@2;) + local.get 1 + local.get 3 + i32.sub + local.tee 4 + i32.const 4 + i32.lt_u + br_if 0 (;@2;) + local.get 4 + i32.const 3 + i32.and + local.set 5 + i32.const 0 + local.set 6 + i32.const 0 + local.set 1 + block ;; label = @3 + local.get 2 + local.get 0 + i32.eq + local.tee 7 + br_if 0 (;@3;) + i32.const 0 + local.set 1 + block ;; label = @4 + block ;; label = @5 + local.get 0 + local.get 2 + i32.sub + local.tee 8 + i32.const -4 + i32.le_u + br_if 0 (;@5;) + i32.const 0 + local.set 9 + br 1 (;@4;) + end + i32.const 0 + local.set 9 + loop ;; label = @5 + local.get 1 + local.get 0 + local.get 9 + i32.add + local.tee 2 + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 2 + i32.const 1 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 2 + i32.const 2 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 2 + i32.const 3 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.set 1 + local.get 9 + i32.const 4 + i32.add + local.tee 9 + br_if 0 (;@5;) + end + end + local.get 7 + br_if 0 (;@3;) + local.get 0 + local.get 9 + i32.add + local.set 2 + loop ;; label = @4 + local.get 1 + local.get 2 + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.set 1 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 8 + i32.const 1 + i32.add + local.tee 8 + br_if 0 (;@4;) + end + end + local.get 0 + local.get 3 + i32.add + local.set 0 + block ;; label = @3 + local.get 5 + i32.eqz + br_if 0 (;@3;) + local.get 0 + local.get 4 + i32.const -4 + i32.and + i32.add + local.tee 2 + i32.load8_s + i32.const -65 + i32.gt_s + local.set 6 + local.get 5 + i32.const 1 + i32.eq + br_if 0 (;@3;) + local.get 6 + local.get 2 + i32.load8_s offset=1 + i32.const -65 + i32.gt_s + i32.add + local.set 6 + local.get 5 + i32.const 2 + i32.eq + br_if 0 (;@3;) + local.get 6 + local.get 2 + i32.load8_s offset=2 + i32.const -65 + i32.gt_s + i32.add + local.set 6 + end + local.get 4 + i32.const 2 + i32.shr_u + local.set 8 + local.get 6 + local.get 1 + i32.add + local.set 3 + loop ;; label = @3 + local.get 0 + local.set 4 + local.get 8 + i32.eqz + br_if 2 (;@1;) + local.get 8 + i32.const 192 + local.get 8 + i32.const 192 + i32.lt_u + select + local.tee 6 + i32.const 3 + i32.and + local.set 7 + local.get 6 + i32.const 2 + i32.shl + local.set 5 + i32.const 0 + local.set 2 + block ;; label = @4 + local.get 8 + i32.const 4 + i32.lt_u + br_if 0 (;@4;) + local.get 4 + local.get 5 + i32.const 1008 + i32.and + i32.add + local.set 9 + i32.const 0 + local.set 2 + local.get 4 + local.set 1 + loop ;; label = @5 + local.get 1 + i32.const 12 + i32.add + i32.load + local.tee 0 + i32.const -1 + i32.xor + i32.const 7 + i32.shr_u + local.get 0 + i32.const 6 + i32.shr_u + i32.or + i32.const 16843009 + i32.and + local.get 1 + i32.const 8 + i32.add + i32.load + local.tee 0 + i32.const -1 + i32.xor + i32.const 7 + i32.shr_u + local.get 0 + i32.const 6 + i32.shr_u + i32.or + i32.const 16843009 + i32.and + local.get 1 + i32.const 4 + i32.add + i32.load + local.tee 0 + i32.const -1 + i32.xor + i32.const 7 + i32.shr_u + local.get 0 + i32.const 6 + i32.shr_u + i32.or + i32.const 16843009 + i32.and + local.get 1 + i32.load + local.tee 0 + i32.const -1 + i32.xor + i32.const 7 + i32.shr_u + local.get 0 + i32.const 6 + i32.shr_u + i32.or + i32.const 16843009 + i32.and + local.get 2 + i32.add + i32.add + i32.add + i32.add + local.set 2 + local.get 1 + i32.const 16 + i32.add + local.tee 1 + local.get 9 + i32.ne + br_if 0 (;@5;) + end + end + local.get 8 + local.get 6 + i32.sub + local.set 8 + local.get 4 + local.get 5 + i32.add + local.set 0 + local.get 2 + i32.const 8 + i32.shr_u + i32.const 16711935 + i32.and + local.get 2 + i32.const 16711935 + i32.and + i32.add + i32.const 65537 + i32.mul + i32.const 16 + i32.shr_u + local.get 3 + i32.add + local.set 3 + local.get 7 + i32.eqz + br_if 0 (;@3;) + end + local.get 4 + local.get 6 + i32.const 252 + i32.and + i32.const 2 + i32.shl + i32.add + local.tee 2 + i32.load + local.tee 1 + i32.const -1 + i32.xor + i32.const 7 + i32.shr_u + local.get 1 + i32.const 6 + i32.shr_u + i32.or + i32.const 16843009 + i32.and + local.set 1 + block ;; label = @3 + local.get 7 + i32.const 1 + i32.eq + br_if 0 (;@3;) + local.get 2 + i32.load offset=4 + local.tee 0 + i32.const -1 + i32.xor + i32.const 7 + i32.shr_u + local.get 0 + i32.const 6 + i32.shr_u + i32.or + i32.const 16843009 + i32.and + local.get 1 + i32.add + local.set 1 + local.get 7 + i32.const 2 + i32.eq + br_if 0 (;@3;) + local.get 2 + i32.load offset=8 + local.tee 2 + i32.const -1 + i32.xor + i32.const 7 + i32.shr_u + local.get 2 + i32.const 6 + i32.shr_u + i32.or + i32.const 16843009 + i32.and + local.get 1 + i32.add + local.set 1 + end + local.get 1 + i32.const 8 + i32.shr_u + i32.const 459007 + i32.and + local.get 1 + i32.const 16711935 + i32.and + i32.add + i32.const 65537 + i32.mul + i32.const 16 + i32.shr_u + local.get 3 + i32.add + return + end + block ;; label = @2 + local.get 1 + br_if 0 (;@2;) + i32.const 0 + return + end + local.get 1 + i32.const 3 + i32.and + local.set 9 + block ;; label = @2 + block ;; label = @3 + local.get 1 + i32.const 4 + i32.ge_u + br_if 0 (;@3;) + i32.const 0 + local.set 3 + i32.const 0 + local.set 2 + br 1 (;@2;) + end + local.get 1 + i32.const -4 + i32.and + local.set 8 + i32.const 0 + local.set 3 + i32.const 0 + local.set 2 + loop ;; label = @3 + local.get 3 + local.get 0 + local.get 2 + i32.add + local.tee 1 + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 1 + i32.const 1 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 1 + i32.const 2 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.get 1 + i32.const 3 + i32.add + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.set 3 + local.get 8 + local.get 2 + i32.const 4 + i32.add + local.tee 2 + i32.ne + br_if 0 (;@3;) + end + end + local.get 9 + i32.eqz + br_if 0 (;@1;) + local.get 0 + local.get 2 + i32.add + local.set 1 + loop ;; label = @2 + local.get 3 + local.get 1 + i32.load8_s + i32.const -65 + i32.gt_s + i32.add + local.set 3 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 9 + i32.const -1 + i32.add + local.tee 9 + br_if 0 (;@2;) + end + end + local.get 3) + (func $_ZN4core6result13unwrap_failed17h4e312bd8e5eb4431E (type 8) (param i32 i32 i32 i32 i32) + (local i32) + global.get $__stack_pointer + i32.const 64 + i32.sub + local.tee 5 + global.set $__stack_pointer + local.get 5 + local.get 1 + i32.store offset=12 + local.get 5 + local.get 0 + i32.store offset=8 + local.get 5 + local.get 3 + i32.store offset=20 + local.get 5 + local.get 2 + i32.store offset=16 + local.get 5 + i32.const 2 + i32.store offset=28 + local.get 5 + i32.const 1049500 + i32.store offset=24 + local.get 5 + i64.const 2 + i64.store offset=36 align=4 + local.get 5 + i32.const 19 + i64.extend_i32_u + i64.const 32 + i64.shl + local.get 5 + i32.const 16 + i32.add + i64.extend_i32_u + i64.or + i64.store offset=56 + local.get 5 + i32.const 20 + i64.extend_i32_u + i64.const 32 + i64.shl + local.get 5 + i32.const 8 + i32.add + i64.extend_i32_u + i64.or + i64.store offset=48 + local.get 5 + local.get 5 + i32.const 48 + i32.add + i32.store offset=32 + local.get 5 + i32.const 24 + i32.add + local.get 4 + call $_ZN4core9panicking9panic_fmt17h41cfed79b2ddbf13E + unreachable) + (func $_ZN4core5slice5index22slice_index_order_fail17h87f34a99f306396eE (type 5) (param i32 i32 i32) + local.get 0 + local.get 1 + local.get 2 + call $_ZN4core5slice5index22slice_index_order_fail8do_panic7runtime17h7ba96d6775765185E + unreachable) + (func $_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u32$GT$3fmt17h10d43ed3b5ffe62fE (type 1) (param i32 i32) (result i32) + local.get 0 + i32.load + i32.const 1 + local.get 1 + call $_ZN4core3fmt3num3imp21_$LT$impl$u20$u32$GT$4_fmt17habc228f2dba507bcE) + (func $_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h44818328333068deE (type 1) (param i32 i32) (result i32) + local.get 1 + local.get 0 + i32.load + local.get 0 + i32.load offset=4 + call $_ZN4core3fmt9Formatter3pad17h5a5f539bbb272398E) + (func $_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hb7cc4525d713b4b9E (type 1) (param i32 i32) (result i32) + local.get 0 + i32.load + local.get 1 + local.get 0 + i32.load offset=4 + i32.load offset=12 + call_indirect (type 1)) + (func $_ZN4core3fmt9Formatter12pad_integral12write_prefix17h9b7f224add674e2aE (type 11) (param i32 i32 i32 i32 i32) (result i32) + block ;; label = @1 + local.get 2 + i32.const 1114112 + i32.eq + br_if 0 (;@1;) + local.get 0 + local.get 2 + local.get 1 + i32.load offset=16 + call_indirect (type 1) + i32.eqz + br_if 0 (;@1;) + i32.const 1 + return + end + block ;; label = @1 + local.get 3 + br_if 0 (;@1;) + i32.const 0 + return + end + local.get 0 + local.get 3 + local.get 4 + local.get 1 + i32.load offset=12 + call_indirect (type 2)) + (func $_ZN4core3fmt9Formatter9write_str17h5f591b7d46bcc7dbE (type 2) (param i32 i32 i32) (result i32) + local.get 0 + i32.load + local.get 1 + local.get 2 + local.get 0 + i32.load offset=4 + i32.load offset=12 + call_indirect (type 2)) + (func $_ZN4core5slice5index26slice_start_index_len_fail8do_panic7runtime17he2583cd0648d1116E (type 5) (param i32 i32 i32) + (local i32 i64) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 3 + global.set $__stack_pointer + local.get 3 + local.get 1 + i32.store offset=4 + local.get 3 + local.get 0 + i32.store + local.get 3 + i32.const 2 + i32.store offset=12 + local.get 3 + i32.const 1049768 + i32.store offset=8 + local.get 3 + i64.const 2 + i64.store offset=20 align=4 + local.get 3 + i32.const 2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.tee 4 + local.get 3 + i32.const 4 + i32.add + i64.extend_i32_u + i64.or + i64.store offset=40 + local.get 3 + local.get 4 + local.get 3 + i64.extend_i32_u + i64.or + i64.store offset=32 + local.get 3 + local.get 3 + i32.const 32 + i32.add + i32.store offset=16 + local.get 3 + i32.const 8 + i32.add + local.get 2 + call $_ZN4core9panicking9panic_fmt17h41cfed79b2ddbf13E + unreachable) + (func $_ZN4core5slice5index24slice_end_index_len_fail8do_panic7runtime17h911bca498e89ce56E (type 5) (param i32 i32 i32) + (local i32 i64) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 3 + global.set $__stack_pointer + local.get 3 + local.get 1 + i32.store offset=4 + local.get 3 + local.get 0 + i32.store + local.get 3 + i32.const 2 + i32.store offset=12 + local.get 3 + i32.const 1049800 + i32.store offset=8 + local.get 3 + i64.const 2 + i64.store offset=20 align=4 + local.get 3 + i32.const 2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.tee 4 + local.get 3 + i32.const 4 + i32.add + i64.extend_i32_u + i64.or + i64.store offset=40 + local.get 3 + local.get 4 + local.get 3 + i64.extend_i32_u + i64.or + i64.store offset=32 + local.get 3 + local.get 3 + i32.const 32 + i32.add + i32.store offset=16 + local.get 3 + i32.const 8 + i32.add + local.get 2 + call $_ZN4core9panicking9panic_fmt17h41cfed79b2ddbf13E + unreachable) + (func $_ZN4core5slice5index22slice_index_order_fail8do_panic7runtime17h7ba96d6775765185E (type 5) (param i32 i32 i32) + (local i32 i64) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 3 + global.set $__stack_pointer + local.get 3 + local.get 1 + i32.store offset=4 + local.get 3 + local.get 0 + i32.store + local.get 3 + i32.const 2 + i32.store offset=12 + local.get 3 + i32.const 1049852 + i32.store offset=8 + local.get 3 + i64.const 2 + i64.store offset=20 align=4 + local.get 3 + i32.const 2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.tee 4 + local.get 3 + i32.const 4 + i32.add + i64.extend_i32_u + i64.or + i64.store offset=40 + local.get 3 + local.get 4 + local.get 3 + i64.extend_i32_u + i64.or + i64.store offset=32 + local.get 3 + local.get 3 + i32.const 32 + i32.add + i32.store offset=16 + local.get 3 + i32.const 8 + i32.add + local.get 2 + call $_ZN4core9panicking9panic_fmt17h41cfed79b2ddbf13E + unreachable) + (func $_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$15copy_from_slice17len_mismatch_fail17hfc67e42bedcb4f60E (type 5) (param i32 i32 i32) + local.get 1 + local.get 0 + local.get 2 + call $_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$15copy_from_slice17len_mismatch_fail8do_panic7runtime17h33872926555474c8E + unreachable) + (func $_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$15copy_from_slice17len_mismatch_fail8do_panic7runtime17h33872926555474c8E (type 5) (param i32 i32 i32) + (local i32 i64) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 3 + global.set $__stack_pointer + local.get 3 + local.get 1 + i32.store offset=4 + local.get 3 + local.get 0 + i32.store + local.get 3 + i32.const 3 + i32.store offset=12 + local.get 3 + i32.const 1049952 + i32.store offset=8 + local.get 3 + i64.const 2 + i64.store offset=20 align=4 + local.get 3 + i32.const 2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.tee 4 + local.get 3 + i32.const 4 + i32.add + i64.extend_i32_u + i64.or + i64.store offset=40 + local.get 3 + local.get 4 + local.get 3 + i64.extend_i32_u + i64.or + i64.store offset=32 + local.get 3 + local.get 3 + i32.const 32 + i32.add + i32.store offset=16 + local.get 3 + i32.const 8 + i32.add + local.get 2 + call $_ZN4core9panicking9panic_fmt17h41cfed79b2ddbf13E + unreachable) + (table (;0;) 21 21 funcref) + (memory (;0;) 17) + (global $__stack_pointer (mut i32) (i32.const 1048576)) + (global (;1;) i32 (i32.const 1050457)) + (global (;2;) i32 (i32.const 1050464)) + (export "memory" (memory 0)) + (export "alloc" (func $alloc)) + (export "alloc_zeroed" (func $alloc_zeroed)) + (export "blake2b" (func $blake2b)) + (export "dealloc" (func $dealloc)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (elem (;0;) (i32.const 1) func $_ZN69_$LT$core..alloc..layout..LayoutError$u20$as$u20$core..fmt..Debug$GT$3fmt17hf22f41cb8f5fdff3E $_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u32$GT$3fmt17h10d43ed3b5ffe62fE $_ZN3std5alloc24default_alloc_error_hook17hbd8de71f1732263eE $_ZN4core3ptr42drop_in_place$LT$alloc..string..String$GT$17h37d546d4b358ccb9E $_ZN58_$LT$alloc..string..String$u20$as$u20$core..fmt..Write$GT$9write_str17h7850057311a0cef1E $_ZN58_$LT$alloc..string..String$u20$as$u20$core..fmt..Write$GT$10write_char17h61f319b0423b9825E $_ZN4core3fmt5Write9write_fmt17hc808c42956869ae8E $_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17hffe704d8309d203aE $_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h7304e3c4160876daE $_ZN92_$LT$std..panicking..begin_panic_handler..StaticStrPayload$u20$as$u20$core..fmt..Display$GT$3fmt17h1300d7785d2cb8e7E $_ZN99_$LT$std..panicking..begin_panic_handler..StaticStrPayload$u20$as$u20$core..panic..PanicPayload$GT$8take_box17h89f7fb848e07ab49E $_ZN99_$LT$std..panicking..begin_panic_handler..StaticStrPayload$u20$as$u20$core..panic..PanicPayload$GT$3get17hf8e628056151d29dE $_ZN99_$LT$std..panicking..begin_panic_handler..StaticStrPayload$u20$as$u20$core..panic..PanicPayload$GT$6as_str17h4b3ad1b286f4163aE $_ZN4core3ptr77drop_in_place$LT$std..panicking..begin_panic_handler..FormatStringPayload$GT$17h328305dd0d118fb6E $_ZN95_$LT$std..panicking..begin_panic_handler..FormatStringPayload$u20$as$u20$core..fmt..Display$GT$3fmt17h22bfd80d379a9576E $_ZN102_$LT$std..panicking..begin_panic_handler..FormatStringPayload$u20$as$u20$core..panic..PanicPayload$GT$8take_box17ha7c451ef50e5f856E $_ZN102_$LT$std..panicking..begin_panic_handler..FormatStringPayload$u20$as$u20$core..panic..PanicPayload$GT$3get17he84c4c3017ddad6dE $_ZN4core5panic12PanicPayload6as_str17h3575ee572e511855E $_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hb7cc4525d713b4b9E $_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h44818328333068deE) + (data $.rodata (i32.const 1048576) "LayoutError\00\00\00\00\00\00\00\00\00\01\00\00\00\01\00\00\00called `Result::unwrap()` on an `Err` valuesrc/lib.rs\00\00\00G\00\10\00\0a\00\00\00\03\00\00\008\00\00\00G\00\10\00\0a\00\00\00\09\00\00\008\00\00\00G\00\10\00\0a\00\00\00\1f\00\00\008\00\00\00/home/ubuntu/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/blake2ya-1.0.2/src/blake2b.rsassertion failed: 1 <= n && n <= 64\00\00\84\00\10\00_\00\00\00\e7\00\00\00\09\00\00\00\84\00\10\00_\00\00\00'\01\00\00\0f\00\00\00\84\00\10\00_\00\00\00'\01\00\00\18\00\00\00\84\00\10\00_\00\00\00'\01\00\00-\00\00\00\84\00\10\00_\00\00\00!\01\00\00)\00\00\00\84\00\10\00_\00\00\00\1a\01\00\00\13\00\00\00\84\00\10\00_\00\00\00\14\01\00\00\13\00\00\00\84\00\10\00_\00\00\002\01\00\00\1e\00\00\00\84\00\10\00_\00\00\002\01\00\00\0b\00\00\00\84\00\10\00_\00\00\00-\01\00\00\0f\00\00\00/rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/alloc/src/raw_vec/mod.rs\a8\01\10\00P\00\00\00.\02\00\00\11\00\00\00\04\00\00\00\0c\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00/rust/deps/dlmalloc-0.2.8/src/dlmalloc.rsassertion failed: psize >= size + min_overhead\00 \02\10\00)\00\00\00\ac\04\00\00\09\00\00\00assertion failed: psize <= size + max_overhead\00\00 \02\10\00)\00\00\00\b2\04\00\00\0d\00\00\00memory allocation of bytes failed\00\00\c8\02\10\00\15\00\00\00\dd\02\10\00\0d\00\00\00library/std/src/alloc.rs\fc\02\10\00\18\00\00\00d\01\00\00\09\00\00\00\04\00\00\00\0c\00\00\00\04\00\00\00\08\00\00\00\00\00\00\00\08\00\00\00\04\00\00\00\09\00\00\00\00\00\00\00\08\00\00\00\04\00\00\00\0a\00\00\00\0b\00\00\00\0c\00\00\00\0d\00\00\00\0e\00\00\00\10\00\00\00\04\00\00\00\0f\00\00\00\10\00\00\00\11\00\00\00\12\00\00\00capacity overflow\00\00\00|\03\10\00\11\00\00\00): \00\01\00\00\00\00\00\00\00\99\03\10\00\02\00\00\0000010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899range start index out of range for slice of length t\04\10\00\12\00\00\00\86\04\10\00\22\00\00\00range end index \b8\04\10\00\10\00\00\00\86\04\10\00\22\00\00\00slice index starts at but ends at \00\d8\04\10\00\16\00\00\00\ee\04\10\00\0d\00\00\00copy_from_slice: source slice length () does not match destination slice length (\00\00\00\0c\05\10\00&\00\00\002\05\10\00+\00\00\00\98\03\10\00\01\00\00\00")) diff --git a/example/blake2b_simd/src/lib.rs b/example/blake2b_simd/src/lib.rs new file mode 100644 index 00000000..5825b115 --- /dev/null +++ b/example/blake2b_simd/src/lib.rs @@ -0,0 +1,33 @@ +#[unsafe(no_mangle)] +pub extern "C" fn alloc(size: usize) -> *mut u8 { + let layout = std::alloc::Layout::array::(size).unwrap(); + unsafe { std::alloc::alloc(layout) } +} + +#[unsafe(no_mangle)] +pub extern "C" fn alloc_zeroed(size: usize) -> *mut u8 { + let layout = std::alloc::Layout::array::(size).unwrap(); + unsafe { std::alloc::alloc_zeroed(layout) } +} + +#[unsafe(no_mangle)] +pub extern "C" fn blake2b( + data_ptr: *mut u8, + data_size: usize, + hash_ptr: *mut u8, + hash_size: usize, +) { + let data_buf = unsafe { std::slice::from_raw_parts(data_ptr, data_size) }; + let hash_buf = unsafe { std::slice::from_raw_parts_mut(hash_ptr, hash_size) }; + let mut p = blake2ya::blake2b_params(); + p.digest(64); + let mut h = blake2ya::blake2b(p); + h.update(data_buf); + h.digest(hash_buf); +} + +#[unsafe(no_mangle)] +pub extern "C" fn dealloc(ptr: *mut u8, size: usize) { + let layout = std::alloc::Layout::array::(size).unwrap(); + unsafe { std::alloc::dealloc(ptr, layout) } +} diff --git a/pywasm/__init__.py b/pywasm/__init__.py index aca036b1..4db1e28e 100644 --- a/pywasm/__init__.py +++ b/pywasm/__init__.py @@ -1,5 +1,6 @@ import platform +from . import arith from . import core from . import leb128 from . import log diff --git a/pywasm/arith.py b/pywasm/arith.py new file mode 100644 index 00000000..ce54dee9 --- /dev/null +++ b/pywasm/arith.py @@ -0,0 +1,222 @@ +import ctypes +import math +import struct + + +class I: + def __init__(self, blen: int) -> None: + self.bits_length = blen * 8 + self.byte_length = blen + self.mask = (1 << self.bits_length) - 1 + self.mask_sign = 1 << (self.bits_length - 1) + self.max = (1 << (self.bits_length - 1)) - 1 + self.min = -1 << (self.bits_length - 1) + + def from_bytearray(self, data: bytearray) -> int: + assert len(data) == self.byte_length + return int.from_bytes(data, 'little', signed=True) + + def into_bytearray(self, n: int) -> bytearray: + return bytearray(n.to_bytes(self.byte_length, 'little', signed=True)) + + def fit(self, n: int) -> int: + n = n & self.mask + n = n - ((n & self.mask_sign) << 1) + return n + + def sat(self, n: int) -> int: + return max(min(n, self.max), self.min) + + def add(self, a: int, b: int) -> int: + return self.fit(a + b) + + def add_sat(self, a: int, b: int) -> int: + return self.sat(a + b) + + def sub(self, a: int, b: int) -> int: + return self.fit(a - b) + + def sub_sat(self, a: int, b: int) -> int: + return self.sat(a - b) + + def mul(self, a: int, b: int) -> int: + return self.fit(a * b) + + def div(self, a: int, b: int) -> int: + assert a != self.min or b != -1 + # Python's default division of integers is return the floor (towards negative infinity) with no + # ability to change that. You can read the BDFL's reason why. + # See: https://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html + # But in webassembly, it requires do truncation towards zero. + return a // b if a * b > 0 else (a + (-a % b)) // b + + def rem(self, a: int, b: int) -> int: + return a % b if a * b > 0 else -(-a % b) + + def shl(self, a: int, b: int) -> int: + return self.fit(a << (b & (self.bits_length - 1))) + + def shr(self, a: int, b: int) -> int: + return self.fit(a >> (b & (self.bits_length - 1))) + + +class U: + def __init__(self, blen: int) -> None: + self.bits_length = blen * 8 + self.byte_length = blen + self.mask = (1 << self.bits_length) - 1 + self.mask_sign = 1 << (self.bits_length - 1) + self.max = self.mask + self.min = 0 + + def from_bytearray(self, data: bytearray) -> int: + assert len(data) == self.byte_length + return int.from_bytes(data, 'little', signed=False) + + def into_bytearray(self, n: int) -> bytearray: + return bytearray(n.to_bytes(self.byte_length, 'little', signed=False)) + + def fit(self, n: int) -> int: + return n & self.mask + + def sat(self, n: int) -> int: + return max(min(n, self.max), self.min) + + def add(self, a: int, b: int) -> int: + return self.fit(a + b) + + def add_sat(self, a: int, b: int) -> int: + return self.sat(a + b) + + def sub(self, a: int, b: int) -> int: + return self.fit(a - b) + + def sub_sat(self, a: int, b: int) -> int: + return self.sat(a - b) + + def mul(self, a: int, b: int) -> int: + return self.fit(a * b) + + def div(self, a: int, b: int) -> int: + return a // b + + def rem(self, a: int, b: int) -> int: + return a % b + + def shl(self, a: int, b: int) -> int: + return self.fit(a << (b & (self.bits_length - 1))) + + def shr(self, a: int, b: int) -> int: + return self.fit(a >> (b & (self.bits_length - 1))) + + def rotl(self, a: int, b: int) -> int: + b = b % self.bits_length + return ((a << b) & self.mask) | (a >> (self.bits_length - b)) + + def rotr(self, a: int, b: int) -> int: + b = b % self.bits_length + return (a >> b) | ((a << (self.bits_length - b)) & self.mask) + + def clz(self, a: int) -> int: + b = 0 + for _ in range(self.bits_length): + if a & self.mask_sign != 0: + break + b += 1 + a = a << 1 + return b + + def ctz(self, a: int) -> int: + b = 0 + for _ in range(self.bits_length): + if a & 1 != 0: + break + b += 1 + a = a >> 1 + return b + + def popcnt(self, a: int) -> int: + b = 0 + for _ in range(self.bits_length): + if a & 1 != 0: + b += 1 + a = a >> 1 + return b + + +class F32: + def __init__(self): + pass + + def from_bytearray(self, data: bytearray) -> float: + assert len(data) == 4 + return struct.unpack('f', data)[0] + + def into_bytearray(self, n: float) -> bytearray: + return bytearray(struct.pack('f', n)) + + def fit(self, n: float) -> float: + return ctypes.c_float(n).value + + def div(self, a: float, b: float) -> float: + return self.fit(f64.div(a, b)) + + def min(self, a: float, b: float) -> float: + return self.fit(f64.min(a, b)) + + def max(self, a: float, b: float) -> float: + return self.fit(f64.max(a, b)) + + +class F64: + def __init__(self): + pass + + def from_bytearray(self, data: bytearray) -> float: + assert len(data) == 8 + return struct.unpack('d', data)[0] + + def into_bytearray(self, n: float) -> bytearray: + return bytearray(struct.pack('d', n)) + + def fit(self, n: float) -> float: + return n + + def div(self, a: float, b: float) -> float: + match b: + case 0: + s = +1 if math.copysign(1, a) == math.copysign(1, b) else -1 + c = math.copysign(math.inf, s) + if a == 0 or math.isnan(a): + c = math.copysign(math.nan, s) + case _: + c = a / b + return c + + def min(self, a: float, b: float) -> float: + c = min(a, b) + if math.isnan(a): + c = a + if math.isnan(b): + c = b + return c + + def max(self, a: float, b: float) -> float: + c = max(a, b) + if math.isnan(a): + c = a + if math.isnan(b): + c = b + return c + + +i8 = I(1) +u8 = U(1) +i16 = I(2) +u16 = U(2) +i32 = I(4) +i64 = I(8) +u32 = U(4) +u64 = U(8) +f32 = F32() +f64 = F64() diff --git a/pywasm/core.py b/pywasm/core.py index c4ef88bd..4241b4ef 100644 --- a/pywasm/core.py +++ b/pywasm/core.py @@ -1,6 +1,7 @@ import ctypes import io import math +import pywasm.arith import pywasm.leb128 import pywasm.log import pywasm.opcode @@ -12,7 +13,7 @@ class ValType: # Value types are encoded by a single byte. def __init__(self, data: int) -> typing.Self: - assert data in [0x7f, 0x7e, 0x7d, 0x7c, 0x70, 0x6f] + assert data in [0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x70, 0x6f] self.data = data def __eq__(self, value: typing.Self) -> bool: @@ -27,6 +28,7 @@ def __repr__(self) -> str: 0x7e: 'i64', 0x7d: 'f32', 0x7c: 'f64', + 0x7b: 'v128', 0x70: 'ref.func', 0x6f: 'ref.extern', }[self.data] @@ -47,6 +49,10 @@ def f32(cls) -> typing.Self: def f64(cls) -> typing.Self: return cls(0x7c) + @classmethod + def v128(cls) -> typing.Self: + return cls(0x7b) + @classmethod def ref_func(cls) -> typing.Self: return cls(0x70) @@ -63,7 +69,7 @@ def from_reader(cls, r: typing.BinaryIO) -> typing.Self: class ValInst: # Values are represented by themselves. - blen = 8 + blen = 16 def __init__(self, type: ValType, data: bytearray) -> typing.Self: assert len(data) == self.blen @@ -83,6 +89,8 @@ def __repr__(self) -> str: return f'{self.type} {self.into_f32()}' case 0x7c: return f'{self.type} {self.into_f64()}' + case 0x7b: + return f'{self.type} {self.into_v128().hex()}' case 0x70: body = repr(self.into_ref()) if self.data[4] != 0x00 else 'null' return f'{self.type} {body}' @@ -92,25 +100,19 @@ def __repr__(self) -> str: @classmethod def from_i32(cls, n: int) -> typing.Self: - n = n & 0xffffffff - n = n - ((n & 0x80000000) << 1) - return cls(ValType.i32(), bytearray(struct.pack(' typing.Self: - n = n & 0xffffffffffffffff - n = n - ((n & 0x8000000000000000) << 1) - return cls(ValType.i64(), bytearray(struct.pack(' typing.Self: - n = n & 0xffffffff - return cls(ValType.i32(), bytearray(struct.pack(' typing.Self: - n = n & 0xffffffffffffffff - return cls(ValType.i64(), bytearray(struct.pack(' typing.Self: @@ -133,12 +135,77 @@ def from_f64_u64(cls, n: int) -> typing.Self: o.type = ValType.f64() return o + @classmethod + def from_v128(cls, n: bytearray) -> typing.Self: + assert len(n) == 16 + return cls(ValType.v128(), n + bytearray(cls.blen - 16)) + + @classmethod + def from_v128_i8(cls, n: typing.List[int]) -> typing.Self: + assert len(n) == 16 + data = bytearray().join([pywasm.arith.i8.into_bytearray(e) for e in n]) + bytearray(cls.blen - 16) + return cls(ValType.v128(), data) + + @classmethod + def from_v128_u8(cls, n: typing.List[int]) -> typing.Self: + assert len(n) == 16 + data = bytearray().join([pywasm.arith.u8.into_bytearray(e) for e in n]) + bytearray(cls.blen - 16) + return cls(ValType.v128(), data) + + @classmethod + def from_v128_i16(cls, n: typing.List[int]) -> typing.Self: + assert len(n) == 8 + data = bytearray().join([pywasm.arith.i16.into_bytearray(e) for e in n]) + bytearray(cls.blen - 16) + return cls(ValType.v128(), data) + + @classmethod + def from_v128_u16(cls, n: typing.List[int]) -> typing.Self: + assert len(n) == 8 + data = bytearray().join([pywasm.arith.u16.into_bytearray(e) for e in n]) + bytearray(cls.blen - 16) + return cls(ValType.v128(), data) + + @classmethod + def from_v128_i32(cls, n: typing.List[int]) -> typing.Self: + assert len(n) == 4 + data = bytearray().join([pywasm.arith.i32.into_bytearray(e) for e in n]) + bytearray(cls.blen - 16) + return cls(ValType.v128(), data) + + @classmethod + def from_v128_u32(cls, n: typing.List[int]) -> typing.Self: + assert len(n) == 4 + data = bytearray().join([pywasm.arith.u32.into_bytearray(e) for e in n]) + bytearray(cls.blen - 16) + return cls(ValType.v128(), data) + + @classmethod + def from_v128_i64(cls, n: typing.List[int]) -> typing.Self: + assert len(n) == 2 + data = bytearray().join([pywasm.arith.i64.into_bytearray(e) for e in n]) + bytearray(cls.blen - 16) + return cls(ValType.v128(), data) + + @classmethod + def from_v128_u64(cls, n: typing.List[int]) -> typing.Self: + assert len(n) == 2 + data = bytearray().join([pywasm.arith.u64.into_bytearray(e) for e in n]) + bytearray(cls.blen - 16) + return cls(ValType.v128(), data) + + @classmethod + def from_v128_f32(cls, n: typing.List[float]) -> typing.Self: + assert len(n) == 4 + data = bytearray().join([pywasm.arith.f32.into_bytearray(e) for e in n]) + bytearray(cls.blen - 16) + return cls(ValType.v128(), data) + + @classmethod + def from_v128_f64(cls, n: typing.List[float]) -> typing.Self: + assert len(n) == 2 + data = bytearray().join([pywasm.arith.f64.into_bytearray(e) for e in n]) + bytearray(cls.blen - 16) + return cls(ValType.v128(), data) + @classmethod def from_ref(cls, type: ValType, n: int) -> typing.Self: return cls(type, bytearray(struct.pack(' typing.Self: + def from_all(cls, type: ValType, n: typing.Union[int, float, bytearray]) -> typing.Self: match type.data: case 0x7f: return cls.from_i32(n) @@ -148,6 +215,8 @@ def from_all(cls, type: ValType, n: typing.Union[int, float]) -> typing.Self: return cls.from_f32(n) case 0x7c: return cls.from_f64(n) + case 0x7b: + return cls.from_v128(n) case 0x70: return cls.from_ref(type, n) case 0x6f: @@ -173,11 +242,44 @@ def into_f32(self) -> float: def into_f64(self) -> float: return struct.unpack(' bytearray: + return self.data[:16].copy() + + def into_v128_i8(self) -> typing.List[int]: + return [pywasm.arith.i8.fit(e) for e in self.data] + + def into_v128_u8(self) -> typing.List[int]: + return [pywasm.arith.u8.fit(e) for e in self.data] + + def into_v128_i16(self) -> typing.List[int]: + return [pywasm.arith.i16.from_bytearray(bytearray(self.data[i:i + 2])) for i in range(0, 16, 2)] + + def into_v128_u16(self) -> typing.List[int]: + return [pywasm.arith.u16.from_bytearray(bytearray(self.data[i:i + 2])) for i in range(0, 16, 2)] + + def into_v128_i32(self) -> typing.List[int]: + return [pywasm.arith.i32.from_bytearray(bytearray(self.data[i:i + 4])) for i in range(0, 16, 4)] + + def into_v128_u32(self) -> typing.List[int]: + return [pywasm.arith.u32.from_bytearray(bytearray(self.data[i:i + 4])) for i in range(0, 16, 4)] + + def into_v128_i64(self) -> typing.List[int]: + return [pywasm.arith.i64.from_bytearray(bytearray(self.data[i:i + 8])) for i in range(0, 16, 8)] + + def into_v128_u64(self) -> typing.List[int]: + return [pywasm.arith.u64.from_bytearray(bytearray(self.data[i:i + 8])) for i in range(0, 16, 8)] + + def into_v128_f32(self) -> typing.List[float]: + return [pywasm.arith.f32.from_bytearray(bytearray(self.data[i:i + 4])) for i in range(0, 16, 4)] + + def into_v128_f64(self) -> typing.List[float]: + return [pywasm.arith.f64.from_bytearray(bytearray(self.data[i:i + 8])) for i in range(0, 16, 8)] + def into_ref(self) -> int: assert self.data[4] == 0x01 return self.into_i32() - def into_all(self) -> typing.Union[int, float]: + def into_all(self) -> typing.Union[int, float, bytearray]: match self.type.data: case 0x7f: return self.into_i32() @@ -187,6 +289,8 @@ def into_all(self) -> typing.Union[int, float]: return self.into_f32() case 0x7c: return self.into_f64() + case 0x7b: + return self.into_v128() case 0x70: return self.into_ref() case 0x6f: @@ -223,7 +327,7 @@ def from_reader(cls, r: typing.BinaryIO) -> typing.Self: n = ord(r.read(1)) if n == 0x40: return cls(0x00, 0x40) - if n in [0x7f, 0x7e, 0x7d, 0x7c, 0x70, 0x6f]: + if n in [0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x70, 0x6f]: return cls(0x01, n) r.seek(-1, 1) return cls(0x02, pywasm.leb128.i.decode_reader(r)[0]) @@ -263,6 +367,7 @@ def from_reader(cls, r: typing.BinaryIO) -> typing.Self: if b >= 0xfc: e = pywasm.leb128.u.encode(pywasm.leb128.u.decode_reader(r)[0]) b = int.from_bytes(bytearray([b]) + e) + assert b in pywasm.opcode.name, hex(b) o = Inst(b, []) match o.opcode: case pywasm.opcode.block: @@ -457,6 +562,149 @@ def from_reader(cls, r: typing.BinaryIO) -> typing.Self: o.args.append(pywasm.leb128.u.decode_reader(r)[0]) case pywasm.opcode.table_fill: o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + case pywasm.opcode.v128_load: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 5 + case pywasm.opcode.v128_load8x8_s: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.v128_load8x8_u: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.v128_load16x4_s: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.v128_load16x4_u: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.v128_load32x2_s: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.v128_load32x2_u: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.v128_load8_splat: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 1 + case pywasm.opcode.v128_load16_splat: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 2 + case pywasm.opcode.v128_load32_splat: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 3 + case pywasm.opcode.v128_load64_splat: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.v128_store: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 5 + case pywasm.opcode.v128_const: + o.args.append(bytearray(r.read(16))) + case pywasm.opcode.i8x16_shuffle: + for _ in range(16): + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + for e in o.args: + assert e < 32 + case pywasm.opcode.i8x16_extract_lane_s: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 16 + case pywasm.opcode.i8x16_extract_lane_u: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 16 + case pywasm.opcode.i8x16_replace_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 16 + case pywasm.opcode.i16x8_extract_lane_s: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 8 + case pywasm.opcode.i16x8_extract_lane_u: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 8 + case pywasm.opcode.i16x8_replace_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 8 + case pywasm.opcode.i32x4_extract_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.i32x4_replace_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.i64x2_extract_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 2 + case pywasm.opcode.i64x2_replace_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 2 + case pywasm.opcode.f32x4_extract_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.f32x4_replace_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 4 + case pywasm.opcode.f64x2_extract_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 2 + case pywasm.opcode.f64x2_replace_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[0] < 2 + case pywasm.opcode.v128_load8_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[2] < 16 + case pywasm.opcode.v128_load16_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[2] < 8 + case pywasm.opcode.v128_load32_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[2] < 4 + case pywasm.opcode.v128_load64_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[2] < 2 + case pywasm.opcode.v128_store8_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[2] < 16 + case pywasm.opcode.v128_store16_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[2] < 8 + case pywasm.opcode.v128_store32_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[2] < 4 + case pywasm.opcode.v128_store64_lane: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + assert o.args[2] < 2 + case pywasm.opcode.v128_load32_zero: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + case pywasm.opcode.v128_load64_zero: + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) + o.args.append(pywasm.leb128.u.decode_reader(r)[0]) return o @@ -1674,16 +1922,16 @@ def evaluate(self) -> None: b = self.stack.value.pop().into_u32() tabl.elem[b] = a case pywasm.opcode.i32_load: - a = ValInst.from_i32(struct.unpack(' None: self.stack.value.append(c) case pywasm.opcode.i32_clz: a = self.stack.value.pop().into_u32() - b = 0 - for _ in range(32): - if a & 0x80000000 != 0: - break - b += 1 - a = a << 1 + b = pywasm.arith.u32.clz(a) c = ValInst.from_i32(b) self.stack.value.append(c) case pywasm.opcode.i32_ctz: a = self.stack.value.pop().into_u32() - b = 0 - for _ in range(32): - if a & 0x00000001 != 0: - break - b += 1 - a = a >> 1 + b = pywasm.arith.u32.ctz(a) c = ValInst.from_i32(b) self.stack.value.append(c) case pywasm.opcode.i32_popcnt: a = self.stack.value.pop().into_u32() - b = 0 - for _ in range(32): - if a & 0x00000001 != 0: - b += 1 - a = a >> 1 + b = pywasm.arith.u32.popcnt(a) c = ValInst.from_i32(b) self.stack.value.append(c) case pywasm.opcode.i32_add: b = self.stack.value.pop().into_i32() a = self.stack.value.pop().into_i32() - c = ValInst.from_i32(a + b) + c = ValInst.from_i32(pywasm.arith.i32.add(a, b)) self.stack.value.append(c) case pywasm.opcode.i32_sub: b = self.stack.value.pop().into_i32() a = self.stack.value.pop().into_i32() - c = ValInst.from_i32(a - b) + c = ValInst.from_i32(pywasm.arith.i32.sub(a, b)) self.stack.value.append(c) case pywasm.opcode.i32_mul: b = self.stack.value.pop().into_i32() a = self.stack.value.pop().into_i32() - c = ValInst.from_i32(a * b) + c = ValInst.from_i32(pywasm.arith.i32.mul(a, b)) self.stack.value.append(c) case pywasm.opcode.i32_div_s: b = self.stack.value.pop().into_i32() a = self.stack.value.pop().into_i32() - assert a != -1 << 31 or b != -1 - # Python's default division of integers is return the floor (towards negative infinity) with no - # ability to change that. You can read the BDFL's reason why. - # See: https://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html - # But in webassembly, it requires do truncation towards zero. - c = a // b if a * b > 0 else (a + (-a % b)) // b - d = ValInst.from_i32(c) - self.stack.value.append(d) + c = ValInst.from_i32(pywasm.arith.i32.div(a, b)) + self.stack.value.append(c) case pywasm.opcode.i32_div_u: b = self.stack.value.pop().into_u32() a = self.stack.value.pop().into_u32() - c = ValInst.from_i32(a // b) + c = ValInst.from_u32(pywasm.arith.u32.div(a, b)) self.stack.value.append(c) case pywasm.opcode.i32_rem_s: b = self.stack.value.pop().into_i32() a = self.stack.value.pop().into_i32() - c = a % b if a * b > 0 else -(-a % b) - d = ValInst.from_i32(c) - self.stack.value.append(d) + c = ValInst.from_i32(pywasm.arith.i32.rem(a, b)) + self.stack.value.append(c) case pywasm.opcode.i32_rem_u: b = self.stack.value.pop().into_u32() a = self.stack.value.pop().into_u32() - c = ValInst.from_i32(a % b) + c = ValInst.from_u32(pywasm.arith.u32.rem(a, b)) self.stack.value.append(c) case pywasm.opcode.i32_and: b = self.stack.value.pop().into_i32() @@ -2020,94 +2247,77 @@ def evaluate(self) -> None: case pywasm.opcode.i32_shl: b = self.stack.value.pop().into_i32() a = self.stack.value.pop().into_i32() - c = ValInst.from_i32(a << (b % 0x20)) + c = ValInst.from_i32(pywasm.arith.i32.shl(a, b)) self.stack.value.append(c) case pywasm.opcode.i32_shr_s: b = self.stack.value.pop().into_i32() a = self.stack.value.pop().into_i32() - c = ValInst.from_i32(a >> (b % 0x20)) + c = ValInst.from_i32(pywasm.arith.i32.shr(a, b)) self.stack.value.append(c) case pywasm.opcode.i32_shr_u: b = self.stack.value.pop().into_u32() a = self.stack.value.pop().into_u32() - c = ValInst.from_i32(a >> (b % 0x20)) + c = ValInst.from_u32(pywasm.arith.u32.shr(a, b)) self.stack.value.append(c) case pywasm.opcode.i32_rotl: - b = self.stack.value.pop().into_i32() + b = self.stack.value.pop().into_u32() a = self.stack.value.pop().into_u32() - c = ValInst.from_i32((((a << (b % 0x20)) & 0xffffffff) | (a >> (0x20 - (b % 0x20))))) + c = ValInst.from_u32(pywasm.arith.u32.rotl(a, b)) self.stack.value.append(c) case pywasm.opcode.i32_rotr: - b = self.stack.value.pop().into_i32() + b = self.stack.value.pop().into_u32() a = self.stack.value.pop().into_u32() - c = ValInst.from_i32(((a >> (b % 0x20)) | ((a << (0x20 - (b % 0x20))) & 0xffffffff))) + c = ValInst.from_u32(pywasm.arith.u32.rotr(a, b)) self.stack.value.append(c) case pywasm.opcode.i64_clz: a = self.stack.value.pop().into_u64() - b = 0 - for _ in range(64): - if a & 0x8000000000000000 != 0: - break - b += 1 - a = a << 1 + b = pywasm.arith.u64.clz(a) c = ValInst.from_i64(b) self.stack.value.append(c) case pywasm.opcode.i64_ctz: a = self.stack.value.pop().into_u64() - b = 0 - for _ in range(64): - if a & 0x0000000000000001 != 0: - break - b += 1 - a = a >> 1 + b = pywasm.arith.u64.ctz(a) c = ValInst.from_i64(b) self.stack.value.append(c) case pywasm.opcode.i64_popcnt: a = self.stack.value.pop().into_u64() - b = 0 - for _ in range(64): - if a & 0x0000000000000001 != 0: - b += 1 - a = a >> 1 + b = pywasm.arith.u64.popcnt(a) c = ValInst.from_i64(b) self.stack.value.append(c) case pywasm.opcode.i64_add: b = self.stack.value.pop().into_i64() a = self.stack.value.pop().into_i64() - c = ValInst.from_i64(a + b) + c = ValInst.from_i64(pywasm.arith.i64.add(a, b)) self.stack.value.append(c) case pywasm.opcode.i64_sub: b = self.stack.value.pop().into_i64() a = self.stack.value.pop().into_i64() - c = ValInst.from_i64(a - b) + c = ValInst.from_i64(pywasm.arith.i64.sub(a, b)) self.stack.value.append(c) case pywasm.opcode.i64_mul: b = self.stack.value.pop().into_i64() a = self.stack.value.pop().into_i64() - c = ValInst.from_i64(a * b) + c = ValInst.from_i64(pywasm.arith.i64.mul(a, b)) self.stack.value.append(c) case pywasm.opcode.i64_div_s: b = self.stack.value.pop().into_i64() a = self.stack.value.pop().into_i64() - assert a != -1 << 63 or b != -1 - c = a // b if a * b > 0 else (a + (-a % b)) // b - d = ValInst.from_i64(c) - self.stack.value.append(d) + c = ValInst.from_i64(pywasm.arith.i64.div(a, b)) + self.stack.value.append(c) case pywasm.opcode.i64_div_u: b = self.stack.value.pop().into_u64() a = self.stack.value.pop().into_u64() - c = ValInst.from_i64(a // b) + c = ValInst.from_i64(pywasm.arith.u64.div(a, b)) self.stack.value.append(c) case pywasm.opcode.i64_rem_s: b = self.stack.value.pop().into_i64() a = self.stack.value.pop().into_i64() - c = a % b if a * b > 0 else -(-a % b) - d = ValInst.from_i64(c) - self.stack.value.append(d) + c = ValInst.from_i64(pywasm.arith.i64.rem(a, b)) + self.stack.value.append(c) case pywasm.opcode.i64_rem_u: b = self.stack.value.pop().into_u64() a = self.stack.value.pop().into_u64() - c = ValInst.from_i64(a % b) + c = ValInst.from_u64(pywasm.arith.u64.rem(a, b)) self.stack.value.append(c) case pywasm.opcode.i64_and: b = self.stack.value.pop().into_i64() @@ -2127,27 +2337,27 @@ def evaluate(self) -> None: case pywasm.opcode.i64_shl: b = self.stack.value.pop().into_i64() a = self.stack.value.pop().into_i64() - c = ValInst.from_i64(a << (b % 0x40)) + c = ValInst.from_i64(pywasm.arith.i64.shl(a, b)) self.stack.value.append(c) case pywasm.opcode.i64_shr_s: b = self.stack.value.pop().into_i64() a = self.stack.value.pop().into_i64() - c = ValInst.from_i64(a >> (b % 0x40)) + c = ValInst.from_i64(pywasm.arith.i64.shr(a, b)) self.stack.value.append(c) case pywasm.opcode.i64_shr_u: b = self.stack.value.pop().into_u64() a = self.stack.value.pop().into_u64() - c = ValInst.from_i64(a >> (b % 0x40)) + c = ValInst.from_u64(pywasm.arith.u64.shr(a, b)) self.stack.value.append(c) case pywasm.opcode.i64_rotl: - b = self.stack.value.pop().into_i64() + b = self.stack.value.pop().into_u64() a = self.stack.value.pop().into_u64() - c = ValInst.from_i64((((a << (b % 0x40)) & 0xffffffffffffffff) | (a >> (0x40 - (b % 0x40))))) + c = ValInst.from_u64(pywasm.arith.u64.rotl(a, b)) self.stack.value.append(c) case pywasm.opcode.i64_rotr: - b = self.stack.value.pop().into_i64() + b = self.stack.value.pop().into_u64() a = self.stack.value.pop().into_u64() - c = ValInst.from_i64(((a >> (b % 0x40)) | ((a << (0x40 - (b % 0x40))) & 0xffffffffffffffff))) + c = ValInst.from_u64(pywasm.arith.u64.rotr(a, b)) self.stack.value.append(c) case pywasm.opcode.f32_abs: a = self.stack.value.pop() @@ -2202,34 +2412,19 @@ def evaluate(self) -> None: case pywasm.opcode.f32_div: b = self.stack.value.pop().into_f32() a = self.stack.value.pop().into_f32() - match b: - case 0: - s = +1 if math.copysign(1, a) == math.copysign(1, b) else -1 - c = math.copysign(math.inf, s) - if a == 0 or math.isnan(a): - c = math.copysign(math.nan, s) - case _: - c = a / b + c = pywasm.arith.f32.div(a, b) d = ValInst.from_f32(c) self.stack.value.append(d) case pywasm.opcode.f32_min: b = self.stack.value.pop().into_f32() a = self.stack.value.pop().into_f32() - c = min(a, b) - if math.isnan(a): - c = a - if math.isnan(b): - c = b + c = pywasm.arith.f32.min(a, b) d = ValInst.from_f32(c) self.stack.value.append(d) case pywasm.opcode.f32_max: b = self.stack.value.pop().into_f32() a = self.stack.value.pop().into_f32() - c = max(a, b) - if math.isnan(a): - c = a - if math.isnan(b): - c = b + c = pywasm.arith.f32.max(a, b) d = ValInst.from_f32(c) self.stack.value.append(d) case pywasm.opcode.f32_copysign: @@ -2290,34 +2485,19 @@ def evaluate(self) -> None: case pywasm.opcode.f64_div: b = self.stack.value.pop().into_f64() a = self.stack.value.pop().into_f64() - match b: - case 0: - s = +1 if math.copysign(1, a) == math.copysign(1, b) else -1 - c = math.copysign(math.inf, s) - if a == 0 or math.isnan(a): - c = math.copysign(math.nan, s) - case _: - c = a / b + c = pywasm.arith.f64.div(a, b) d = ValInst.from_f64(c) self.stack.value.append(d) case pywasm.opcode.f64_min: b = self.stack.value.pop().into_f64() a = self.stack.value.pop().into_f64() - c = min(a, b) - if math.isnan(a): - c = a - if math.isnan(b): - c = b + c = pywasm.arith.f64.min(a, b) d = ValInst.from_f64(c) self.stack.value.append(d) case pywasm.opcode.f64_max: b = self.stack.value.pop().into_f64() a = self.stack.value.pop().into_f64() - c = max(a, b) - if math.isnan(a): - c = a - if math.isnan(b): - c = b + c = pywasm.arith.f64.max(a, b) d = ValInst.from_f64(c) self.stack.value.append(d) case pywasm.opcode.f64_copysign: @@ -2327,7 +2507,7 @@ def evaluate(self) -> None: self.stack.value.append(c) case pywasm.opcode.i32_wrap_i64: a = self.stack.value.pop().into_i64() - b = ValInst.from_i32(a) + b = ValInst.from_i32(pywasm.arith.i32.fit(a)) self.stack.value.append(b) case pywasm.opcode.i32_trunc_f32_s: a = self.stack.value.pop().into_f32() @@ -2443,34 +2623,29 @@ def evaluate(self) -> None: self.stack.value.append(b) case pywasm.opcode.i32_extend8_s: a = self.stack.value.pop().into_i32() - b = a & 0xff - c = b - ((b & 0x80) << 1) - d = ValInst.from_i32(c) - self.stack.value.append(d) + b = pywasm.arith.i8.fit(a) + c = ValInst.from_i32(b) + self.stack.value.append(c) case pywasm.opcode.i32_extend16_s: a = self.stack.value.pop().into_i32() - b = a & 0xffff - c = b - ((b & 0x8000) << 1) - d = ValInst.from_i32(c) - self.stack.value.append(d) + b = pywasm.arith.i16.fit(a) + c = ValInst.from_i32(b) + self.stack.value.append(c) case pywasm.opcode.i64_extend8_s: a = self.stack.value.pop().into_i64() - b = a & 0xff - c = b - ((b & 0x80) << 1) - d = ValInst.from_i64(c) - self.stack.value.append(d) + b = pywasm.arith.i8.fit(a) + c = ValInst.from_i64(b) + self.stack.value.append(c) case pywasm.opcode.i64_extend16_s: a = self.stack.value.pop().into_i64() - b = a & 0xffff - c = b - ((b & 0x8000) << 1) - d = ValInst.from_i64(c) - self.stack.value.append(d) + b = pywasm.arith.i16.fit(a) + c = ValInst.from_i64(b) + self.stack.value.append(c) case pywasm.opcode.i64_extend32_s: a = self.stack.value.pop().into_i64() - b = a & 0xffffffff - c = b - ((b & 0x80000000) << 1) - d = ValInst.from_i64(c) - self.stack.value.append(d) + b = pywasm.arith.i32.fit(a) + c = ValInst.from_i64(b) + self.stack.value.append(c) case pywasm.opcode.ref_null: a = ValInst.zero(ValType(instr.args[0])) self.stack.value.append(a) @@ -2488,56 +2663,56 @@ def evaluate(self) -> None: a = self.stack.value.pop().into_f32() if math.isnan(a): a = 0.0 - b = int(max(-0x80000000, min(a, +0x7fffffff))) + b = int(max(pywasm.arith.i32.min, min(a, pywasm.arith.i32.max))) c = ValInst.from_i32(b) self.stack.value.append(c) case pywasm.opcode.i32_trunc_sat_f32_u: a = self.stack.value.pop().into_f32() if math.isnan(a): a = 0.0 - b = int(max(+0x00000000, min(a, +0xffffffff))) + b = int(max(pywasm.arith.u32.min, min(a, pywasm.arith.u32.max))) c = ValInst.from_u32(b) self.stack.value.append(c) case pywasm.opcode.i32_trunc_sat_f64_s: a = self.stack.value.pop().into_f64() if math.isnan(a): a = 0.0 - b = int(max(-0x80000000, min(a, +0x7fffffff))) + b = int(max(pywasm.arith.i32.min, min(a, pywasm.arith.i32.max))) c = ValInst.from_i32(b) self.stack.value.append(c) case pywasm.opcode.i32_trunc_sat_f64_u: a = self.stack.value.pop().into_f64() if math.isnan(a): a = 0.0 - b = int(max(+0x00000000, min(a, +0xffffffff))) + b = int(max(pywasm.arith.u32.min, min(a, pywasm.arith.u32.max))) c = ValInst.from_u32(b) self.stack.value.append(c) case pywasm.opcode.i64_trunc_sat_f32_s: a = self.stack.value.pop().into_f32() if math.isnan(a): a = 0.0 - b = int(max(-0x8000000000000000, min(a, +0x7fffffffffffffff))) + b = int(max(pywasm.arith.i64.min, min(a, pywasm.arith.i64.max))) c = ValInst.from_i64(b) self.stack.value.append(c) case pywasm.opcode.i64_trunc_sat_f32_u: a = self.stack.value.pop().into_f32() if math.isnan(a): a = 0.0 - b = int(max(+0x0000000000000000, min(a, +0xffffffffffffffff))) + b = int(max(pywasm.arith.u64.min, min(a, pywasm.arith.u64.max))) c = ValInst.from_u64(b) self.stack.value.append(c) case pywasm.opcode.i64_trunc_sat_f64_s: a = self.stack.value.pop().into_f64() if math.isnan(a): a = 0.0 - b = int(max(-0x8000000000000000, min(a, +0x7fffffffffffffff))) + b = int(max(pywasm.arith.i64.min, min(a, pywasm.arith.i64.max))) c = ValInst.from_i64(b) self.stack.value.append(c) case pywasm.opcode.i64_trunc_sat_f64_u: a = self.stack.value.pop().into_f64() if math.isnan(a): a = 0.0 - b = int(max(+0x0000000000000000, min(a, +0xffffffffffffffff))) + b = int(max(pywasm.arith.u64.min, min(a, pywasm.arith.u64.max))) c = ValInst.from_u64(b) self.stack.value.append(c) case pywasm.opcode.memory_init: @@ -2616,6 +2791,1318 @@ def evaluate(self) -> None: assert d + n <= len(tabl.elem) for i in range(n): tabl.elem[d+i] = s + case pywasm.opcode.v128_load: + a = ValInst.from_v128(self.evaluate_mem_load(instr.args[1], 16)) + self.stack.value.append(a) + case pywasm.opcode.v128_load8x8_s: + a = self.evaluate_mem_load(instr.args[1], 8) + b = bytearray() + for i in range(8): + n = a[i] + n = n - ((n & 0x80) << 1) + b.extend(bytearray(n.to_bytes(2, 'little', signed=True))) + self.stack.value.append(ValInst.from_v128(b)) + case pywasm.opcode.v128_load8x8_u: + a = self.evaluate_mem_load(instr.args[1], 8) + b = bytearray() + for i in range(8): + n = a[i] + b.extend(bytearray(n.to_bytes(2, 'little'))) + self.stack.value.append(ValInst.from_v128(b)) + case pywasm.opcode.v128_load16x4_s: + a = self.evaluate_mem_load(instr.args[1], 8) + b = bytearray() + for i in range(4): + n = int.from_bytes(a[i*2:i*2+2], 'little') + n = n - ((n & 0x8000) << 1) + b.extend(bytearray(n.to_bytes(4, 'little', signed=True))) + self.stack.value.append(ValInst.from_v128(b)) + case pywasm.opcode.v128_load16x4_u: + a = self.evaluate_mem_load(instr.args[1], 8) + b = bytearray() + for i in range(4): + n = int.from_bytes(a[i*2:i*2+2], 'little') + b.extend(bytearray(n.to_bytes(4, 'little'))) + self.stack.value.append(ValInst.from_v128(b)) + case pywasm.opcode.v128_load32x2_s: + a = self.evaluate_mem_load(instr.args[1], 8) + b = bytearray() + for i in range(2): + n = int.from_bytes(a[i*4:i*4+4], 'little') + n = n - ((n & 0x80000000) << 1) + b.extend(bytearray(n.to_bytes(8, 'little', signed=True))) + self.stack.value.append(ValInst.from_v128(b)) + case pywasm.opcode.v128_load32x2_u: + a = self.evaluate_mem_load(instr.args[1], 8) + b = bytearray() + for i in range(2): + n = int.from_bytes(a[i*4:i*4+4], 'little') + b.extend(bytearray(n.to_bytes(8, 'little'))) + self.stack.value.append(ValInst.from_v128(b)) + case pywasm.opcode.v128_load8_splat: + a = self.evaluate_mem_load(instr.args[1], 1) + self.stack.value.append(ValInst.from_v128(a * 16)) + case pywasm.opcode.v128_load16_splat: + a = self.evaluate_mem_load(instr.args[1], 2) + self.stack.value.append(ValInst.from_v128(a * 8)) + case pywasm.opcode.v128_load32_splat: + a = self.evaluate_mem_load(instr.args[1], 4) + self.stack.value.append(ValInst.from_v128(a * 4)) + case pywasm.opcode.v128_load64_splat: + a = self.evaluate_mem_load(instr.args[1], 8) + self.stack.value.append(ValInst.from_v128(a * 2)) + case pywasm.opcode.v128_store: + self.evaluate_mem_save(instr.args[1], 16) + case pywasm.opcode.v128_const: + a = ValInst.from_v128(instr.args[0]) + self.stack.value.append(a) + case pywasm.opcode.i8x16_shuffle: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = a + b + d = [c[instr.args[i]] for i in range(16)] + e = ValInst.from_v128_i8(d) + self.stack.value.append(e) + case pywasm.opcode.i8x16_swizzle: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_i8() + c = [a[b[i]] if b[i] < 16 else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_splat: + a = self.stack.value.pop().into_i32() + b = ValInst.from_v128_i8([pywasm.arith.i8.fit(a)] * 16) + self.stack.value.append(b) + case pywasm.opcode.i16x8_splat: + a = self.stack.value.pop().into_i32() + b = ValInst.from_v128_i16([pywasm.arith.i16.fit(a)] * 8) + self.stack.value.append(b) + case pywasm.opcode.i32x4_splat: + a = self.stack.value.pop().into_i32() + b = ValInst.from_v128_i32([a] * 4) + self.stack.value.append(b) + case pywasm.opcode.i64x2_splat: + a = self.stack.value.pop().into_i64() + b = ValInst.from_v128_i64([a] * 2) + self.stack.value.append(b) + case pywasm.opcode.f32x4_splat: + a = self.stack.value.pop().data[0:4] + b = ValInst.from_v128(a * 4) + self.stack.value.append(b) + case pywasm.opcode.f64x2_splat: + a = self.stack.value.pop().data[0:8] + b = ValInst.from_v128(a * 2) + self.stack.value.append(b) + case pywasm.opcode.i8x16_extract_lane_s: + a = self.stack.value.pop().into_v128_i8() + b = ValInst.from_i32(a[instr.args[0]]) + self.stack.value.append(b) + case pywasm.opcode.i8x16_extract_lane_u: + a = self.stack.value.pop().into_v128_u8() + b = ValInst.from_i32(a[instr.args[0]]) + self.stack.value.append(b) + case pywasm.opcode.i8x16_replace_lane: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i8() + a[instr.args[0]] = pywasm.arith.i8.fit(b) + c = ValInst.from_v128_i8(a) + self.stack.value.append(c) + case pywasm.opcode.i16x8_extract_lane_s: + a = self.stack.value.pop().into_v128_i16() + b = ValInst.from_i32(a[instr.args[0]]) + self.stack.value.append(b) + case pywasm.opcode.i16x8_extract_lane_u: + a = self.stack.value.pop().into_v128_u16() + b = ValInst.from_i32(a[instr.args[0]]) + self.stack.value.append(b) + case pywasm.opcode.i16x8_replace_lane: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i16() + a[instr.args[0]] = pywasm.arith.i16.fit(b) + c = ValInst.from_v128_i16(a) + self.stack.value.append(c) + case pywasm.opcode.i32x4_extract_lane: + a = self.stack.value.pop().into_v128_i32() + b = ValInst.from_i32(a[instr.args[0]]) + self.stack.value.append(b) + case pywasm.opcode.i32x4_replace_lane: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i32() + a[instr.args[0]] = b + c = ValInst.from_v128_i32(a) + self.stack.value.append(c) + case pywasm.opcode.i64x2_extract_lane: + a = self.stack.value.pop().into_v128_i64() + b = ValInst.from_i64(a[instr.args[0]]) + self.stack.value.append(b) + case pywasm.opcode.i64x2_replace_lane: + b = self.stack.value.pop().into_i64() + a = self.stack.value.pop().into_v128_i64() + a[instr.args[0]] = b + c = ValInst.from_v128_i64(a) + self.stack.value.append(c) + case pywasm.opcode.f32x4_extract_lane: + a = self.stack.value.pop().into_v128() + b = instr.args[0] + c = ValInst(ValType.f32(), a[b * 4: b * 4 + 4] + bytearray(ValInst.blen - 4)) + self.stack.value.append(c) + case pywasm.opcode.f32x4_replace_lane: + b = self.stack.value.pop().into_u32() + a = self.stack.value.pop().into_v128() + c = instr.args[0] + a[c * 4: c * 4 + 4] = pywasm.arith.u32.into_bytearray(b) + d = ValInst(ValType.v128(), a) + self.stack.value.append(d) + case pywasm.opcode.f64x2_extract_lane: + a = self.stack.value.pop().into_v128() + b = instr.args[0] + c = ValInst(ValType.f64(), a[b * 8: b * 8 + 8] + bytearray(ValInst.blen - 8)) + self.stack.value.append(c) + case pywasm.opcode.f64x2_replace_lane: + b = self.stack.value.pop().into_u64() + a = self.stack.value.pop().into_v128() + c = instr.args[0] + a[c * 8: c * 8 + 8] = pywasm.arith.u64.into_bytearray(b) + d = ValInst(ValType.v128(), a) + self.stack.value.append(d) + case pywasm.opcode.i8x16_eq: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [-1 if a[i] == b[i] else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_ne: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [-1 if a[i] != b[i] else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_lt_s: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [-1 if a[i] < b[i] else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_lt_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [-1 if a[i] < b[i] else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_gt_s: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [-1 if a[i] > b[i] else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_gt_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [-1 if a[i] > b[i] else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_le_s: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [-1 if a[i] <= b[i] else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_le_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [-1 if a[i] <= b[i] else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_ge_s: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [-1 if a[i] >= b[i] else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_ge_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [-1 if a[i] >= b[i] else 0 for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_eq: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [-1 if a[i] == b[i] else 0 for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_ne: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [-1 if a[i] != b[i] else 0 for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_lt_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [-1 if a[i] < b[i] else 0 for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_lt_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [-1 if a[i] < b[i] else 0 for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_gt_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [-1 if a[i] > b[i] else 0 for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_gt_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [-1 if a[i] > b[i] else 0 for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_le_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [-1 if a[i] <= b[i] else 0 for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_le_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [-1 if a[i] <= b[i] else 0 for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_ge_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [-1 if a[i] >= b[i] else 0 for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_ge_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [-1 if a[i] >= b[i] else 0 for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_eq: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [-1 if a[i] == b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_ne: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [-1 if a[i] != b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_lt_s: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [-1 if a[i] < b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_lt_u: + b = self.stack.value.pop().into_v128_u32() + a = self.stack.value.pop().into_v128_u32() + c = [-1 if a[i] < b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_gt_s: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [-1 if a[i] > b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_gt_u: + b = self.stack.value.pop().into_v128_u32() + a = self.stack.value.pop().into_v128_u32() + c = [-1 if a[i] > b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_le_s: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [-1 if a[i] <= b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_le_u: + b = self.stack.value.pop().into_v128_u32() + a = self.stack.value.pop().into_v128_u32() + c = [-1 if a[i] <= b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_ge_s: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [-1 if a[i] >= b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_ge_u: + b = self.stack.value.pop().into_v128_u32() + a = self.stack.value.pop().into_v128_u32() + c = [-1 if a[i] >= b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_eq: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [-1 if a[i] == b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_ne: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [-1 if a[i] != b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_lt: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [-1 if a[i] < b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_gt: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [-1 if a[i] > b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_le: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [-1 if a[i] <= b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_ge: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [-1 if a[i] >= b[i] else 0 for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_eq: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [-1 if a[i] == b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_ne: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [-1 if a[i] != b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_lt: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [-1 if a[i] < b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_gt: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [-1 if a[i] > b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_le: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [-1 if a[i] <= b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_ge: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [-1 if a[i] >= b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.v128_not: + a = self.stack.value.pop().into_v128() + b = ValInst.from_v128(bytearray([pywasm.arith.u8.fit(~e) for e in a])) + self.stack.value.append(b) + case pywasm.opcode.v128_and: + b = self.stack.value.pop().into_v128() + a = self.stack.value.pop().into_v128() + c = ValInst.from_v128(bytearray([a[i] & b[i] for i in range(16)])) + self.stack.value.append(c) + case pywasm.opcode.v128_andnot: + b = self.stack.value.pop().into_v128() + a = self.stack.value.pop().into_v128() + c = ValInst.from_v128(bytearray([a[i] & ~b[i] for i in range(16)])) + self.stack.value.append(c) + case pywasm.opcode.v128_or: + b = self.stack.value.pop().into_v128() + a = self.stack.value.pop().into_v128() + c = ValInst.from_v128(bytearray([a[i] | b[i] for i in range(16)])) + self.stack.value.append(c) + case pywasm.opcode.v128_xor: + b = self.stack.value.pop().into_v128() + a = self.stack.value.pop().into_v128() + c = ValInst.from_v128(bytearray([a[i] ^ b[i] for i in range(16)])) + self.stack.value.append(c) + case pywasm.opcode.v128_bitselect: + c = self.stack.value.pop().into_v128() + b = self.stack.value.pop().into_v128() + a = self.stack.value.pop().into_v128() + d = ValInst.from_v128(bytearray([(a[i] & c[i]) | (b[i] & ~c[i]) for i in range(16)])) + self.stack.value.append(d) + case pywasm.opcode.v128_any_true: + a = self.stack.value.pop().into_v128() + b = 1 if any(e != 0 for e in a) else 0 + c = ValInst.from_i32(b) + self.stack.value.append(c) + case pywasm.opcode.v128_load8_lane: + a = self.stack.value.pop().into_v128() + b = self.evaluate_mem_load(instr.args[1], 1) + c = instr.args[2] + a[1 * c: 1 * c + 1] = b + d = ValInst(ValType.v128(), a + bytearray(ValInst.blen - 16)) + self.stack.value.append(d) + case pywasm.opcode.v128_load16_lane: + a = self.stack.value.pop().into_v128() + b = self.evaluate_mem_load(instr.args[1], 2) + c = instr.args[2] + a[2 * c: 2 * c + 2] = b + d = ValInst(ValType.v128(), a + bytearray(ValInst.blen - 16)) + self.stack.value.append(d) + case pywasm.opcode.v128_load32_lane: + a = self.stack.value.pop().into_v128() + b = self.evaluate_mem_load(instr.args[1], 4) + c = instr.args[2] + a[4 * c: 4 * c + 4] = b + d = ValInst(ValType.v128(), a + bytearray(ValInst.blen - 16)) + self.stack.value.append(d) + case pywasm.opcode.v128_load64_lane: + a = self.stack.value.pop().into_v128() + b = self.evaluate_mem_load(instr.args[1], 8) + c = instr.args[2] + a[8 * c: 8 * c + 8] = b + d = ValInst(ValType.v128(), a + bytearray(ValInst.blen - 16)) + self.stack.value.append(d) + case pywasm.opcode.v128_store8_lane: + a = self.stack.value.pop().into_v128() + b = instr.args[2] + a[:1] = a[1 * b: 1 * b + 1] + self.stack.value.append(ValInst.from_v128(a)) + self.evaluate_mem_save(instr.args[1], 1) + case pywasm.opcode.v128_store16_lane: + a = self.stack.value.pop().into_v128() + b = instr.args[2] + a[:2] = a[2 * b: 2 * b + 2] + self.stack.value.append(ValInst.from_v128(a)) + self.evaluate_mem_save(instr.args[1], 2) + case pywasm.opcode.v128_store32_lane: + a = self.stack.value.pop().into_v128() + b = instr.args[2] + a[:4] = a[4 * b: 4 * b + 4] + self.stack.value.append(ValInst.from_v128(a)) + self.evaluate_mem_save(instr.args[1], 4) + case pywasm.opcode.v128_store64_lane: + a = self.stack.value.pop().into_v128() + b = instr.args[2] + a[:8] = a[8 * b: 8 * b + 8] + self.stack.value.append(ValInst.from_v128(a)) + self.evaluate_mem_save(instr.args[1], 8) + case pywasm.opcode.v128_load32_zero: + a = self.evaluate_mem_load(instr.args[1], 4) + b = a + bytearray(ValInst.blen - 4) + c = ValInst.from_v128(b) + self.stack.value.append(c) + case pywasm.opcode.v128_load64_zero: + a = self.evaluate_mem_load(instr.args[1], 8) + b = a + bytearray(ValInst.blen - 8) + c = ValInst.from_v128(b) + self.stack.value.append(c) + case pywasm.opcode.f32x4_demote_f64x2_zero: + a = self.stack.value.pop().into_v128_f64() + b = a + [0.0, 0.0] + c = ValInst.from_v128_f32(b) + self.stack.value.append(c) + case pywasm.opcode.f64x2_promote_low_f32x4: + a = self.stack.value.pop().into_v128_f32() + b = a[:2] + c = ValInst.from_v128_f64(b) + self.stack.value.append(c) + case pywasm.opcode.i8x16_abs: + a = self.stack.value.pop().into_v128_i8() + b = [pywasm.arith.i8.fit(abs(e)) for e in a] + c = ValInst.from_v128_i8(b) + self.stack.value.append(c) + case pywasm.opcode.i8x16_neg: + a = self.stack.value.pop().into_v128_i8() + b = [pywasm.arith.i8.fit(-e) for e in a] + c = ValInst.from_v128_i8(b) + self.stack.value.append(c) + case pywasm.opcode.i8x16_popcnt: + a = self.stack.value.pop().into_v128_u8() + b = [pywasm.arith.u8.popcnt(e) for e in a] + c = ValInst.from_v128_u8(b) + self.stack.value.append(c) + case pywasm.opcode.i8x16_all_true: + a = self.stack.value.pop().into_v128_i8() + b = 1 if all(e != 0 for e in a) else 0 + c = ValInst.from_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i8x16_bitmask: + a = self.stack.value.pop().into_v128_i8() + b = 0 + for i in range(16): + if a[i] < 0: + b |= 1 << i + c = ValInst.from_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i8x16_narrow_i16x8_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = a + b + d = [pywasm.arith.i8.sat(e) for e in c] + e = ValInst.from_v128_i8(d) + self.stack.value.append(e) + case pywasm.opcode.i8x16_narrow_i16x8_u: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = a + b + d = [pywasm.arith.u8.sat(e) for e in c] + e = ValInst.from_v128_u8(d) + self.stack.value.append(e) + case pywasm.opcode.f32x4_ceil: + a = self.stack.value.pop().into_v128_f32() + b = [e if math.isnan(e) or math.isinf(e) else float(math.ceil(e)) for e in a] + c = ValInst.from_v128_f32(b) + self.stack.value.append(c) + case pywasm.opcode.f32x4_floor: + a = self.stack.value.pop().into_v128_f32() + b = [e if math.isnan(e) or math.isinf(e) else float(math.floor(e)) for e in a] + c = ValInst.from_v128_f32(b) + self.stack.value.append(c) + case pywasm.opcode.f32x4_trunc: + a = self.stack.value.pop().into_v128_f32() + b = [e if math.isnan(e) or math.isinf(e) else float(math.trunc(e)) for e in a] + c = ValInst.from_v128_f32(b) + self.stack.value.append(c) + case pywasm.opcode.f32x4_nearest: + a = self.stack.value.pop().into_v128_f32() + b = [e if math.isnan(e) or math.isinf(e) else float(round(e)) for e in a] + c = ValInst.from_v128_f32(b) + self.stack.value.append(c) + case pywasm.opcode.i8x16_shl: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i8() + c = ValInst.from_v128_i8([pywasm.arith.i8.shl(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i8x16_shr_s: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i8() + c = ValInst.from_v128_i8([pywasm.arith.i8.shr(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i8x16_shr_u: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_u8() + c = ValInst.from_v128_u8([pywasm.arith.u8.shr(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i8x16_add: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [pywasm.arith.i8.add(a[i], b[i]) for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_add_sat_s: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [pywasm.arith.i8.add_sat(a[i], b[i]) for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_add_sat_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [pywasm.arith.u8.add_sat(a[i], b[i]) for i in range(16)] + d = ValInst.from_v128_u8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_sub: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [pywasm.arith.i8.sub(a[i], b[i]) for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_sub_sat_s: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [pywasm.arith.i8.sub_sat(a[i], b[i]) for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_sub_sat_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [pywasm.arith.u8.sub_sat(a[i], b[i]) for i in range(16)] + d = ValInst.from_v128_u8(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_ceil: + a = self.stack.value.pop().into_v128_f64() + b = [e if math.isnan(e) or math.isinf(e) else float(math.ceil(e)) for e in a] + c = ValInst.from_v128_f64(b) + self.stack.value.append(c) + case pywasm.opcode.f64x2_floor: + a = self.stack.value.pop().into_v128_f64() + b = [e if math.isnan(e) or math.isinf(e) else float(math.floor(e)) for e in a] + c = ValInst.from_v128_f64(b) + self.stack.value.append(c) + case pywasm.opcode.i8x16_min_s: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [min(a[i], b[i]) for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_min_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [min(a[i], b[i]) for i in range(16)] + d = ValInst.from_v128_u8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_max_s: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [max(a[i], b[i]) for i in range(16)] + d = ValInst.from_v128_i8(c) + self.stack.value.append(d) + case pywasm.opcode.i8x16_max_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [max(a[i], b[i]) for i in range(16)] + d = ValInst.from_v128_u8(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_trunc: + a = self.stack.value.pop().into_v128_f64() + b = [e if math.isnan(e) or math.isinf(e) else float(math.trunc(e)) for e in a] + c = ValInst.from_v128_f64(b) + self.stack.value.append(c) + case pywasm.opcode.i8x16_avgr_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [(a[i] + b[i] + 1) // 2 for i in range(16)] + d = ValInst.from_v128_u8(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_extadd_pairwise_i8x16_s: + a = self.stack.value.pop().into_v128_i8() + b = [a[i] + a[i+1] for i in range(0, 16, 2)] + c = ValInst.from_v128_i16(b) + self.stack.value.append(c) + case pywasm.opcode.i16x8_extadd_pairwise_i8x16_u: + a = self.stack.value.pop().into_v128_u8() + b = [a[i] + a[i+1] for i in range(0, 16, 2)] + c = ValInst.from_v128_u16(b) + self.stack.value.append(c) + case pywasm.opcode.i32x4_extadd_pairwise_i16x8_s: + a = self.stack.value.pop().into_v128_i16() + b = [a[i] + a[i+1] for i in range(0, 8, 2)] + c = ValInst.from_v128_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i32x4_extadd_pairwise_i16x8_u: + a = self.stack.value.pop().into_v128_u16() + b = [a[i] + a[i+1] for i in range(0, 8, 2)] + c = ValInst.from_v128_u32(b) + self.stack.value.append(c) + case pywasm.opcode.i16x8_abs: + a = self.stack.value.pop().into_v128_i16() + b = [pywasm.arith.i16.fit(abs(e)) for e in a] + c = ValInst.from_v128_i16(b) + self.stack.value.append(c) + case pywasm.opcode.i16x8_neg: + a = self.stack.value.pop().into_v128_i16() + b = [pywasm.arith.i16.fit(-e) for e in a] + c = ValInst.from_v128_i16(b) + self.stack.value.append(c) + case pywasm.opcode.i16x8_q15mulr_sat_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [pywasm.arith.i16.sat((a[i] * b[i] + 0x4000) >> 15) for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_all_true: + a = self.stack.value.pop().into_v128_i16() + b = 1 if all(e != 0 for e in a) else 0 + c = ValInst.from_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i16x8_bitmask: + a = self.stack.value.pop().into_v128_i16() + b = 0 + for i in range(8): + if a[i] < 0: + b |= 1 << i + c = ValInst.from_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i16x8_narrow_i32x4_s: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = a + b + d = [pywasm.arith.i16.sat(e) for e in c] + e = ValInst.from_v128_i16(d) + self.stack.value.append(e) + case pywasm.opcode.i16x8_narrow_i32x4_u: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = a + b + d = [pywasm.arith.u16.sat(e) for e in c] + e = ValInst.from_v128_u16(d) + self.stack.value.append(e) + case pywasm.opcode.i16x8_extend_low_i8x16_s: + a = self.stack.value.pop().into_v128_i8()[:8] + b = ValInst.from_v128_i16(a) + self.stack.value.append(b) + case pywasm.opcode.i16x8_extend_high_i8x16_s: + a = self.stack.value.pop().into_v128_i8()[8:] + b = ValInst.from_v128_i16(a) + self.stack.value.append(b) + case pywasm.opcode.i16x8_extend_low_i8x16_u: + a = self.stack.value.pop().into_v128_u8()[:8] + b = ValInst.from_v128_i16(a) + self.stack.value.append(b) + case pywasm.opcode.i16x8_extend_high_i8x16_u: + a = self.stack.value.pop().into_v128_u8()[8:] + b = ValInst.from_v128_i16(a) + self.stack.value.append(b) + case pywasm.opcode.i16x8_shl: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i16() + c = ValInst.from_v128_i16([pywasm.arith.i16.shl(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i16x8_shr_s: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i16() + c = ValInst.from_v128_i16([pywasm.arith.i16.shr(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i16x8_shr_u: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_u16() + c = ValInst.from_v128_u16([pywasm.arith.u16.shr(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i16x8_add: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [pywasm.arith.i16.add(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_add_sat_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [pywasm.arith.i16.add_sat(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_add_sat_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [pywasm.arith.u16.add_sat(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_u16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_sub: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [pywasm.arith.i16.sub(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_sub_sat_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [pywasm.arith.i16.sub_sat(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_sub_sat_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [pywasm.arith.u16.sub_sat(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_u16(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_nearest: + a = self.stack.value.pop().into_v128_f64() + b = [e if math.isnan(e) or math.isinf(e) else float(round(e)) for e in a] + c = ValInst.from_v128_f64(b) + self.stack.value.append(c) + case pywasm.opcode.i16x8_mul: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [pywasm.arith.i16.mul(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_min_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [min(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_min_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [min(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_u16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_max_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [max(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_max_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [max(a[i], b[i]) for i in range(8)] + d = ValInst.from_v128_u16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_avgr_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [(a[i] + b[i] + 1) // 2 for i in range(8)] + d = ValInst.from_v128_u16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_extmul_low_i8x16_s: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [a[i] * b[i] for i in range(8)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_extmul_high_i8x16_s: + b = self.stack.value.pop().into_v128_i8() + a = self.stack.value.pop().into_v128_i8() + c = [a[i] * b[i] for i in range(8, 16)] + d = ValInst.from_v128_i16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_extmul_low_i8x16_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [a[i] * b[i] for i in range(8)] + d = ValInst.from_v128_u16(c) + self.stack.value.append(d) + case pywasm.opcode.i16x8_extmul_high_i8x16_u: + b = self.stack.value.pop().into_v128_u8() + a = self.stack.value.pop().into_v128_u8() + c = [a[i] * b[i] for i in range(8, 16)] + d = ValInst.from_v128_u16(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_abs: + a = self.stack.value.pop().into_v128_i32() + b = [pywasm.arith.i32.fit(abs(e)) for e in a] + c = ValInst.from_v128_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i32x4_neg: + a = self.stack.value.pop().into_v128_i32() + b = [pywasm.arith.i32.fit(-e) for e in a] + c = ValInst.from_v128_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i32x4_all_true: + a = self.stack.value.pop().into_v128_i32() + b = 1 if all(e != 0 for e in a) else 0 + c = ValInst.from_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i32x4_bitmask: + a = self.stack.value.pop().into_v128_i32() + b = 0 + for i in range(4): + if a[i] < 0: + b |= 1 << i + c = ValInst.from_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i32x4_extend_low_i16x8_s: + a = self.stack.value.pop().into_v128_i16()[:4] + b = ValInst.from_v128_i32(a) + self.stack.value.append(b) + case pywasm.opcode.i32x4_extend_high_i16x8_s: + a = self.stack.value.pop().into_v128_i16()[4:] + b = ValInst.from_v128_i32(a) + self.stack.value.append(b) + case pywasm.opcode.i32x4_extend_low_i16x8_u: + a = self.stack.value.pop().into_v128_u16()[:4] + b = ValInst.from_v128_i32(a) + self.stack.value.append(b) + case pywasm.opcode.i32x4_extend_high_i16x8_u: + a = self.stack.value.pop().into_v128_u16()[4:] + b = ValInst.from_v128_i32(a) + self.stack.value.append(b) + case pywasm.opcode.i32x4_shl: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i32() + c = ValInst.from_v128_i32([pywasm.arith.i32.shl(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i32x4_shr_s: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i32() + c = ValInst.from_v128_i32([pywasm.arith.i32.shr(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i32x4_shr_u: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_u32() + c = ValInst.from_v128_u32([pywasm.arith.u32.shr(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i32x4_add: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [pywasm.arith.i32.add(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_sub: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [pywasm.arith.i32.sub(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_mul: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [pywasm.arith.i32.mul(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_min_s: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [min(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_min_u: + b = self.stack.value.pop().into_v128_u32() + a = self.stack.value.pop().into_v128_u32() + c = [min(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_u32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_max_s: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [max(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_max_u: + b = self.stack.value.pop().into_v128_u32() + a = self.stack.value.pop().into_v128_u32() + c = [max(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_u32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_dot_i16x8_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [pywasm.arith.i32.fit(a[i*2] * b[i*2] + a[i*2+1] * b[i*2+1]) for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_extmul_low_i16x8_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [a[i] * b[i] for i in range(4)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_extmul_high_i16x8_s: + b = self.stack.value.pop().into_v128_i16() + a = self.stack.value.pop().into_v128_i16() + c = [a[i] * b[i] for i in range(4, 8)] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_extmul_low_i16x8_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [a[i] * b[i] for i in range(4)] + d = ValInst.from_v128_u32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_extmul_high_i16x8_u: + b = self.stack.value.pop().into_v128_u16() + a = self.stack.value.pop().into_v128_u16() + c = [a[i] * b[i] for i in range(4, 8)] + d = ValInst.from_v128_u32(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_abs: + a = self.stack.value.pop().into_v128_i64() + b = [pywasm.arith.i64.fit(abs(e)) for e in a] + c = ValInst.from_v128_i64(b) + self.stack.value.append(c) + case pywasm.opcode.i64x2_neg: + a = self.stack.value.pop().into_v128_i64() + b = [pywasm.arith.i64.fit(-e) for e in a] + c = ValInst.from_v128_i64(b) + self.stack.value.append(c) + case pywasm.opcode.i64x2_all_true: + a = self.stack.value.pop().into_v128_i64() + b = 1 if all(e != 0 for e in a) else 0 + c = ValInst.from_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i64x2_bitmask: + a = self.stack.value.pop().into_v128_i64() + b = 0 + for i in range(2): + if a[i] < 0: + b |= 1 << i + c = ValInst.from_i32(b) + self.stack.value.append(c) + case pywasm.opcode.i64x2_extend_low_i32x4_s: + a = self.stack.value.pop().into_v128_i32()[:2] + b = ValInst.from_v128_i64(a) + self.stack.value.append(b) + case pywasm.opcode.i64x2_extend_high_i32x4_s: + a = self.stack.value.pop().into_v128_i32()[2:] + b = ValInst.from_v128_i64(a) + self.stack.value.append(b) + case pywasm.opcode.i64x2_extend_low_i32x4_u: + a = self.stack.value.pop().into_v128_u32()[:2] + b = ValInst.from_v128_i64(a) + self.stack.value.append(b) + case pywasm.opcode.i64x2_extend_high_i32x4_u: + a = self.stack.value.pop().into_v128_u32()[2:] + b = ValInst.from_v128_i64(a) + self.stack.value.append(b) + case pywasm.opcode.i64x2_shl: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i64() + c = ValInst.from_v128_i64([pywasm.arith.i64.shl(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i64x2_shr_s: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_i64() + c = ValInst.from_v128_i64([pywasm.arith.i64.shr(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i64x2_shr_u: + b = self.stack.value.pop().into_i32() + a = self.stack.value.pop().into_v128_u64() + c = ValInst.from_v128_u64([pywasm.arith.u64.shr(e, b) for e in a]) + self.stack.value.append(c) + case pywasm.opcode.i64x2_add: + b = self.stack.value.pop().into_v128_i64() + a = self.stack.value.pop().into_v128_i64() + c = [pywasm.arith.i64.add(a[i], b[i]) for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_sub: + b = self.stack.value.pop().into_v128_i64() + a = self.stack.value.pop().into_v128_i64() + c = [pywasm.arith.i64.sub(a[i], b[i]) for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_mul: + b = self.stack.value.pop().into_v128_i64() + a = self.stack.value.pop().into_v128_i64() + c = [pywasm.arith.i64.mul(a[i], b[i]) for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_eq: + b = self.stack.value.pop().into_v128_i64() + a = self.stack.value.pop().into_v128_i64() + c = [-1 if a[i] == b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_ne: + b = self.stack.value.pop().into_v128_i64() + a = self.stack.value.pop().into_v128_i64() + c = [-1 if a[i] != b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_lt_s: + b = self.stack.value.pop().into_v128_i64() + a = self.stack.value.pop().into_v128_i64() + c = [-1 if a[i] < b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_gt_s: + b = self.stack.value.pop().into_v128_i64() + a = self.stack.value.pop().into_v128_i64() + c = [-1 if a[i] > b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_le_s: + b = self.stack.value.pop().into_v128_i64() + a = self.stack.value.pop().into_v128_i64() + c = [-1 if a[i] <= b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_ge_s: + b = self.stack.value.pop().into_v128_i64() + a = self.stack.value.pop().into_v128_i64() + c = [-1 if a[i] >= b[i] else 0 for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_extmul_low_i32x4_s: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [a[i] * b[i] for i in range(2)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_extmul_high_i32x4_s: + b = self.stack.value.pop().into_v128_i32() + a = self.stack.value.pop().into_v128_i32() + c = [a[i] * b[i] for i in range(2, 4)] + d = ValInst.from_v128_i64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_extmul_low_i32x4_u: + b = self.stack.value.pop().into_v128_u32() + a = self.stack.value.pop().into_v128_u32() + c = [a[i] * b[i] for i in range(2)] + d = ValInst.from_v128_u64(c) + self.stack.value.append(d) + case pywasm.opcode.i64x2_extmul_high_i32x4_u: + b = self.stack.value.pop().into_v128_u32() + a = self.stack.value.pop().into_v128_u32() + c = [a[i] * b[i] for i in range(2, 4)] + d = ValInst.from_v128_u64(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_abs: + a = self.stack.value.pop().into_v128_f32() + b = [abs(e) for e in a] + c = ValInst.from_v128_f32(b) + self.stack.value.append(c) + case pywasm.opcode.f32x4_neg: + a = self.stack.value.pop().into_v128_f32() + b = [-e for e in a] + c = ValInst.from_v128_f32(b) + self.stack.value.append(c) + case pywasm.opcode.f32x4_sqrt: + a = self.stack.value.pop().into_v128_f32() + b = [math.sqrt(e) if e >= 0 else math.nan for e in a] + c = ValInst.from_v128_f32(b) + self.stack.value.append(c) + case pywasm.opcode.f32x4_add: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [a[i] + b[i] for i in range(4)] + d = ValInst.from_v128_f32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_sub: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [a[i] - b[i] for i in range(4)] + d = ValInst.from_v128_f32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_mul: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [a[i] * b[i] for i in range(4)] + d = ValInst.from_v128_f32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_div: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [pywasm.arith.f32.div(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_f32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_min: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [pywasm.arith.f32.min(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_f32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_max: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [pywasm.arith.f32.max(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_f32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_pmin: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [min(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_f32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_pmax: + b = self.stack.value.pop().into_v128_f32() + a = self.stack.value.pop().into_v128_f32() + c = [max(a[i], b[i]) for i in range(4)] + d = ValInst.from_v128_f32(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_abs: + a = self.stack.value.pop().into_v128_f64() + b = [abs(e) for e in a] + c = ValInst.from_v128_f64(b) + self.stack.value.append(c) + case pywasm.opcode.f64x2_neg: + a = self.stack.value.pop().into_v128_f64() + b = [-e for e in a] + c = ValInst.from_v128_f64(b) + self.stack.value.append(c) + case pywasm.opcode.f64x2_sqrt: + a = self.stack.value.pop().into_v128_f64() + b = [math.sqrt(e) if e >= 0 else math.nan for e in a] + c = ValInst.from_v128_f64(b) + self.stack.value.append(c) + case pywasm.opcode.f64x2_add: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [a[i] + b[i] for i in range(2)] + d = ValInst.from_v128_f64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_sub: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [a[i] - b[i] for i in range(2)] + d = ValInst.from_v128_f64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_mul: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [a[i] * b[i] for i in range(2)] + d = ValInst.from_v128_f64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_div: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [pywasm.arith.f64.div(a[i], b[i]) for i in range(2)] + d = ValInst.from_v128_f64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_min: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [pywasm.arith.f64.min(a[i], b[i]) for i in range(2)] + d = ValInst.from_v128_f64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_max: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [pywasm.arith.f64.max(a[i], b[i]) for i in range(2)] + d = ValInst.from_v128_f64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_pmin: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [min(a[i], b[i]) for i in range(2)] + d = ValInst.from_v128_f64(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_pmax: + b = self.stack.value.pop().into_v128_f64() + a = self.stack.value.pop().into_v128_f64() + c = [max(a[i], b[i]) for i in range(2)] + d = ValInst.from_v128_f64(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_trunc_sat_f32x4_s: + a = self.stack.value.pop().into_v128_f32() + b = [0 if math.isnan(e) else e for e in a] + c = [int(max(pywasm.arith.i32.min, min(e, pywasm.arith.i32.max))) for e in b] + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_trunc_sat_f32x4_u: + a = self.stack.value.pop().into_v128_f32() + b = [0 if math.isnan(e) else e for e in a] + c = [int(max(pywasm.arith.u32.min, min(e, pywasm.arith.u32.max))) for e in b] + d = ValInst.from_v128_u32(c) + self.stack.value.append(d) + case pywasm.opcode.f32x4_convert_i32x4_s: + a = self.stack.value.pop().into_v128_i32() + b = ValInst.from_v128_f32([float(e) for e in a]) + self.stack.value.append(b) + case pywasm.opcode.f32x4_convert_i32x4_u: + a = self.stack.value.pop().into_v128_u32() + b = ValInst.from_v128_f32([float(e) for e in a]) + self.stack.value.append(b) + case pywasm.opcode.i32x4_trunc_sat_f64x2_s_zero: + a = self.stack.value.pop().into_v128_f64() + b = [0 if math.isnan(e) else e for e in a] + c = [int(max(pywasm.arith.i32.min, min(e, pywasm.arith.i32.max))) for e in b] + c.extend([0, 0]) + d = ValInst.from_v128_i32(c) + self.stack.value.append(d) + case pywasm.opcode.i32x4_trunc_sat_f64x2_u_zero: + a = self.stack.value.pop().into_v128_f64() + b = [0 if math.isnan(e) else e for e in a] + c = [int(max(pywasm.arith.u32.min, min(e, pywasm.arith.u32.max))) for e in b] + c.extend([0, 0]) + d = ValInst.from_v128_u32(c) + self.stack.value.append(d) + case pywasm.opcode.f64x2_convert_low_i32x4_s: + a = self.stack.value.pop().into_v128_i32()[:2] + b = ValInst.from_v128_f64([float(e) for e in a]) + self.stack.value.append(b) + case pywasm.opcode.f64x2_convert_low_i32x4_u: + a = self.stack.value.pop().into_v128_u32()[:2] + b = ValInst.from_v128_f64([float(e) for e in a]) + self.stack.value.append(b) case _: assert 0 diff --git a/pywasm/opcode.py b/pywasm/opcode.py index 29a51eb6..1c8dacd4 100644 --- a/pywasm/opcode.py +++ b/pywasm/opcode.py @@ -201,6 +201,242 @@ table_grow = 0xfc0f table_size = 0xfc10 table_fill = 0xfc11 +v128_load = 0xfd00 +v128_load8x8_s = 0xfd01 +v128_load8x8_u = 0xfd02 +v128_load16x4_s = 0xfd03 +v128_load16x4_u = 0xfd04 +v128_load32x2_s = 0xfd05 +v128_load32x2_u = 0xfd06 +v128_load8_splat = 0xfd07 +v128_load16_splat = 0xfd08 +v128_load32_splat = 0xfd09 +v128_load64_splat = 0xfd0a +v128_store = 0xfd0b +v128_const = 0xfd0c +i8x16_shuffle = 0xfd0d +i8x16_swizzle = 0xfd0e +i8x16_splat = 0xfd0f +i16x8_splat = 0xfd10 +i32x4_splat = 0xfd11 +i64x2_splat = 0xfd12 +f32x4_splat = 0xfd13 +f64x2_splat = 0xfd14 +i8x16_extract_lane_s = 0xfd15 +i8x16_extract_lane_u = 0xfd16 +i8x16_replace_lane = 0xfd17 +i16x8_extract_lane_s = 0xfd18 +i16x8_extract_lane_u = 0xfd19 +i16x8_replace_lane = 0xfd1a +i32x4_extract_lane = 0xfd1b +i32x4_replace_lane = 0xfd1c +i64x2_extract_lane = 0xfd1d +i64x2_replace_lane = 0xfd1e +f32x4_extract_lane = 0xfd1f +f32x4_replace_lane = 0xfd20 +f64x2_extract_lane = 0xfd21 +f64x2_replace_lane = 0xfd22 +i8x16_eq = 0xfd23 +i8x16_ne = 0xfd24 +i8x16_lt_s = 0xfd25 +i8x16_lt_u = 0xfd26 +i8x16_gt_s = 0xfd27 +i8x16_gt_u = 0xfd28 +i8x16_le_s = 0xfd29 +i8x16_le_u = 0xfd2a +i8x16_ge_s = 0xfd2b +i8x16_ge_u = 0xfd2c +i16x8_eq = 0xfd2d +i16x8_ne = 0xfd2e +i16x8_lt_s = 0xfd2f +i16x8_lt_u = 0xfd30 +i16x8_gt_s = 0xfd31 +i16x8_gt_u = 0xfd32 +i16x8_le_s = 0xfd33 +i16x8_le_u = 0xfd34 +i16x8_ge_s = 0xfd35 +i16x8_ge_u = 0xfd36 +i32x4_eq = 0xfd37 +i32x4_ne = 0xfd38 +i32x4_lt_s = 0xfd39 +i32x4_lt_u = 0xfd3a +i32x4_gt_s = 0xfd3b +i32x4_gt_u = 0xfd3c +i32x4_le_s = 0xfd3d +i32x4_le_u = 0xfd3e +i32x4_ge_s = 0xfd3f +i32x4_ge_u = 0xfd40 +f32x4_eq = 0xfd41 +f32x4_ne = 0xfd42 +f32x4_lt = 0xfd43 +f32x4_gt = 0xfd44 +f32x4_le = 0xfd45 +f32x4_ge = 0xfd46 +f64x2_eq = 0xfd47 +f64x2_ne = 0xfd48 +f64x2_lt = 0xfd49 +f64x2_gt = 0xfd4a +f64x2_le = 0xfd4b +f64x2_ge = 0xfd4c +v128_not = 0xfd4d +v128_and = 0xfd4e +v128_andnot = 0xfd4f +v128_or = 0xfd50 +v128_xor = 0xfd51 +v128_bitselect = 0xfd52 +v128_any_true = 0xfd53 +v128_load8_lane = 0xfd54 +v128_load16_lane = 0xfd55 +v128_load32_lane = 0xfd56 +v128_load64_lane = 0xfd57 +v128_store8_lane = 0xfd58 +v128_store16_lane = 0xfd59 +v128_store32_lane = 0xfd5a +v128_store64_lane = 0xfd5b +v128_load32_zero = 0xfd5c +v128_load64_zero = 0xfd5d +f32x4_demote_f64x2_zero = 0xfd5e +f64x2_promote_low_f32x4 = 0xfd5f +i8x16_abs = 0xfd60 +i8x16_neg = 0xfd61 +i8x16_popcnt = 0xfd62 +i8x16_all_true = 0xfd63 +i8x16_bitmask = 0xfd64 +i8x16_narrow_i16x8_s = 0xfd65 +i8x16_narrow_i16x8_u = 0xfd66 +f32x4_ceil = 0xfd67 +f32x4_floor = 0xfd68 +f32x4_trunc = 0xfd69 +f32x4_nearest = 0xfd6a +i8x16_shl = 0xfd6b +i8x16_shr_s = 0xfd6c +i8x16_shr_u = 0xfd6d +i8x16_add = 0xfd6e +i8x16_add_sat_s = 0xfd6f +i8x16_add_sat_u = 0xfd70 +i8x16_sub = 0xfd71 +i8x16_sub_sat_s = 0xfd72 +i8x16_sub_sat_u = 0xfd73 +f64x2_ceil = 0xfd74 +f64x2_floor = 0xfd75 +i8x16_min_s = 0xfd76 +i8x16_min_u = 0xfd77 +i8x16_max_s = 0xfd78 +i8x16_max_u = 0xfd79 +f64x2_trunc = 0xfd7a +i8x16_avgr_u = 0xfd7b +i16x8_extadd_pairwise_i8x16_s = 0xfd7c +i16x8_extadd_pairwise_i8x16_u = 0xfd7d +i32x4_extadd_pairwise_i16x8_s = 0xfd7e +i32x4_extadd_pairwise_i16x8_u = 0xfd7f +i16x8_abs = 0xfd8001 +i16x8_neg = 0xfd8101 +i16x8_q15mulr_sat_s = 0xfd8201 +i16x8_all_true = 0xfd8301 +i16x8_bitmask = 0xfd8401 +i16x8_narrow_i32x4_s = 0xfd8501 +i16x8_narrow_i32x4_u = 0xfd8601 +i16x8_extend_low_i8x16_s = 0xfd8701 +i16x8_extend_high_i8x16_s = 0xfd8801 +i16x8_extend_low_i8x16_u = 0xfd8901 +i16x8_extend_high_i8x16_u = 0xfd8a01 +i16x8_shl = 0xfd8b01 +i16x8_shr_s = 0xfd8c01 +i16x8_shr_u = 0xfd8d01 +i16x8_add = 0xfd8e01 +i16x8_add_sat_s = 0xfd8f01 +i16x8_add_sat_u = 0xfd9001 +i16x8_sub = 0xfd9101 +i16x8_sub_sat_s = 0xfd9201 +i16x8_sub_sat_u = 0xfd9301 +f64x2_nearest = 0xfd9401 +i16x8_mul = 0xfd9501 +i16x8_min_s = 0xfd9601 +i16x8_min_u = 0xfd9701 +i16x8_max_s = 0xfd9801 +i16x8_max_u = 0xfd9901 +i16x8_avgr_u = 0xfd9b01 +i16x8_extmul_low_i8x16_s = 0xfd9c01 +i16x8_extmul_high_i8x16_s = 0xfd9d01 +i16x8_extmul_low_i8x16_u = 0xfd9e01 +i16x8_extmul_high_i8x16_u = 0xfd9f01 +i32x4_abs = 0xfda001 +i32x4_neg = 0xfda101 +i32x4_all_true = 0xfda301 +i32x4_bitmask = 0xfda401 +i32x4_extend_low_i16x8_s = 0xfda701 +i32x4_extend_high_i16x8_s = 0xfda801 +i32x4_extend_low_i16x8_u = 0xfda901 +i32x4_extend_high_i16x8_u = 0xfdaa01 +i32x4_shl = 0xfdab01 +i32x4_shr_s = 0xfdac01 +i32x4_shr_u = 0xfdad01 +i32x4_add = 0xfdae01 +i32x4_sub = 0xfdb101 +i32x4_mul = 0xfdb501 +i32x4_min_s = 0xfdb601 +i32x4_min_u = 0xfdb701 +i32x4_max_s = 0xfdb801 +i32x4_max_u = 0xfdb901 +i32x4_dot_i16x8_s = 0xfdba01 +i32x4_extmul_low_i16x8_s = 0xfdbc01 +i32x4_extmul_high_i16x8_s = 0xfdbd01 +i32x4_extmul_low_i16x8_u = 0xfdbe01 +i32x4_extmul_high_i16x8_u = 0xfdbf01 +i64x2_abs = 0xfdc001 +i64x2_neg = 0xfdc101 +i64x2_all_true = 0xfdc301 +i64x2_bitmask = 0xfdc401 +i64x2_extend_low_i32x4_s = 0xfdc701 +i64x2_extend_high_i32x4_s = 0xfdc801 +i64x2_extend_low_i32x4_u = 0xfdc901 +i64x2_extend_high_i32x4_u = 0xfdca01 +i64x2_shl = 0xfdcb01 +i64x2_shr_s = 0xfdcc01 +i64x2_shr_u = 0xfdcd01 +i64x2_add = 0xfdce01 +i64x2_sub = 0xfdd101 +i64x2_mul = 0xfdd501 +i64x2_eq = 0xfdd601 +i64x2_ne = 0xfdd701 +i64x2_lt_s = 0xfdd801 +i64x2_gt_s = 0xfdd901 +i64x2_le_s = 0xfdda01 +i64x2_ge_s = 0xfddb01 +i64x2_extmul_low_i32x4_s = 0xfddc01 +i64x2_extmul_high_i32x4_s = 0xfddd01 +i64x2_extmul_low_i32x4_u = 0xfdde01 +i64x2_extmul_high_i32x4_u = 0xfddf01 +f32x4_abs = 0xfde001 +f32x4_neg = 0xfde101 +f32x4_sqrt = 0xfde301 +f32x4_add = 0xfde401 +f32x4_sub = 0xfde501 +f32x4_mul = 0xfde601 +f32x4_div = 0xfde701 +f32x4_min = 0xfde801 +f32x4_max = 0xfde901 +f32x4_pmin = 0xfdea01 +f32x4_pmax = 0xfdeb01 +f64x2_abs = 0xfdec01 +f64x2_neg = 0xfded01 +f64x2_sqrt = 0xfdef01 +f64x2_add = 0xfdf001 +f64x2_sub = 0xfdf101 +f64x2_mul = 0xfdf201 +f64x2_div = 0xfdf301 +f64x2_min = 0xfdf401 +f64x2_max = 0xfdf501 +f64x2_pmin = 0xfdf601 +f64x2_pmax = 0xfdf701 +i32x4_trunc_sat_f32x4_s = 0xfdf801 +i32x4_trunc_sat_f32x4_u = 0xfdf901 +f32x4_convert_i32x4_s = 0xfdfa01 +f32x4_convert_i32x4_u = 0xfdfb01 +i32x4_trunc_sat_f64x2_s_zero = 0xfdfc01 +i32x4_trunc_sat_f64x2_u_zero = 0xfdfd01 +f64x2_convert_low_i32x4_s = 0xfdfe01 +f64x2_convert_low_i32x4_u = 0xfdff01 name: typing.Dict[int, str] = {} name[unreachable] = 'unreachable' @@ -404,3 +640,239 @@ name[table_grow] = 'table.grow' name[table_size] = 'table.size' name[table_fill] = 'table.fill' +name[v128_load] = 'v128.load' +name[v128_load8x8_s] = 'v128.load8x8_s' +name[v128_load8x8_u] = 'v128.load8x8_u' +name[v128_load16x4_s] = 'v128.load16x4_s' +name[v128_load16x4_u] = 'v128.load16x4_u' +name[v128_load32x2_s] = 'v128.load32x2_s' +name[v128_load32x2_u] = 'v128.load32x2_u' +name[v128_load8_splat] = 'v128.load8_splat' +name[v128_load16_splat] = 'v128.load16_splat' +name[v128_load32_splat] = 'v128.load32_splat' +name[v128_load64_splat] = 'v128.load64_splat' +name[v128_store] = 'v128.store' +name[v128_const] = 'v128.const' +name[i8x16_shuffle] = 'i8x16.shuffle' +name[i8x16_swizzle] = 'i8x16.swizzle' +name[i8x16_splat] = 'i8x16.splat' +name[i16x8_splat] = 'i16x8.splat' +name[i32x4_splat] = 'i32x4.splat' +name[i64x2_splat] = 'i64x2.splat' +name[f32x4_splat] = 'f32x4.splat' +name[f64x2_splat] = 'f64x2.splat' +name[i8x16_extract_lane_s] = 'i8x16.extract_lane_s' +name[i8x16_extract_lane_u] = 'i8x16.extract_lane_u' +name[i8x16_replace_lane] = 'i8x16.replace_lane' +name[i16x8_extract_lane_s] = 'i16x8.extract_lane_s' +name[i16x8_extract_lane_u] = 'i16x8.extract_lane_u' +name[i16x8_replace_lane] = 'i16x8.replace_lane' +name[i32x4_extract_lane] = 'i32x4.extract_lane' +name[i32x4_replace_lane] = 'i32x4.replace_lane' +name[i64x2_extract_lane] = 'i64x2.extract_lane' +name[i64x2_replace_lane] = 'i64x2.replace_lane' +name[f32x4_extract_lane] = 'f32x4.extract_lane' +name[f32x4_replace_lane] = 'f32x4.replace_lane' +name[f64x2_extract_lane] = 'f64x2.extract_lane' +name[f64x2_replace_lane] = 'f64x2.replace_lane' +name[i8x16_eq] = 'i8x16.eq' +name[i8x16_ne] = 'i8x16.ne' +name[i8x16_lt_s] = 'i8x16.lt_s' +name[i8x16_lt_u] = 'i8x16.lt_u' +name[i8x16_gt_s] = 'i8x16.gt_s' +name[i8x16_gt_u] = 'i8x16.gt_u' +name[i8x16_le_s] = 'i8x16.le_s' +name[i8x16_le_u] = 'i8x16.le_u' +name[i8x16_ge_s] = 'i8x16.ge_s' +name[i8x16_ge_u] = 'i8x16.ge_u' +name[i16x8_eq] = 'i16x8.eq' +name[i16x8_ne] = 'i16x8.ne' +name[i16x8_lt_s] = 'i16x8.lt_s' +name[i16x8_lt_u] = 'i16x8.lt_u' +name[i16x8_gt_s] = 'i16x8.gt_s' +name[i16x8_gt_u] = 'i16x8.gt_u' +name[i16x8_le_s] = 'i16x8.le_s' +name[i16x8_le_u] = 'i16x8.le_u' +name[i16x8_ge_s] = 'i16x8.ge_s' +name[i16x8_ge_u] = 'i16x8.ge_u' +name[i32x4_eq] = 'i32x4.eq' +name[i32x4_ne] = 'i32x4.ne' +name[i32x4_lt_s] = 'i32x4.lt_s' +name[i32x4_lt_u] = 'i32x4.lt_u' +name[i32x4_gt_s] = 'i32x4.gt_s' +name[i32x4_gt_u] = 'i32x4.gt_u' +name[i32x4_le_s] = 'i32x4.le_s' +name[i32x4_le_u] = 'i32x4.le_u' +name[i32x4_ge_s] = 'i32x4.ge_s' +name[i32x4_ge_u] = 'i32x4.ge_u' +name[f32x4_eq] = 'f32x4.eq' +name[f32x4_ne] = 'f32x4.ne' +name[f32x4_lt] = 'f32x4.lt' +name[f32x4_gt] = 'f32x4.gt' +name[f32x4_le] = 'f32x4.le' +name[f32x4_ge] = 'f32x4.ge' +name[f64x2_eq] = 'f64x2.eq' +name[f64x2_ne] = 'f64x2.ne' +name[f64x2_lt] = 'f64x2.lt' +name[f64x2_gt] = 'f64x2.gt' +name[f64x2_le] = 'f64x2.le' +name[f64x2_ge] = 'f64x2.ge' +name[v128_not] = 'v128.not' +name[v128_and] = 'v128.and' +name[v128_andnot] = 'v128.andnot' +name[v128_or] = 'v128.or' +name[v128_xor] = 'v128.xor' +name[v128_bitselect] = 'v128.bitselect' +name[v128_any_true] = 'v128.any_true' +name[v128_load8_lane] = 'v128.load8_lane' +name[v128_load16_lane] = 'v128.load16_lane' +name[v128_load32_lane] = 'v128.load32_lane' +name[v128_load64_lane] = 'v128.load64_lane' +name[v128_store8_lane] = 'v128.store8_lane' +name[v128_store16_lane] = 'v128.store16_lane' +name[v128_store32_lane] = 'v128.store32_lane' +name[v128_store64_lane] = 'v128.store64_lane' +name[v128_load32_zero] = 'v128.load32_zero' +name[v128_load64_zero] = 'v128.load64_zero' +name[f32x4_demote_f64x2_zero] = 'f32x4.demote_f64x2_zero' +name[f64x2_promote_low_f32x4] = 'f64x2.promote_low_f32x4' +name[i8x16_abs] = 'i8x16.abs' +name[i8x16_neg] = 'i8x16.neg' +name[i8x16_popcnt] = 'i8x16.popcnt' +name[i8x16_all_true] = 'i8x16.all_true' +name[i8x16_bitmask] = 'i8x16.bitmask' +name[i8x16_narrow_i16x8_s] = 'i8x16.narrow_i16x8_s' +name[i8x16_narrow_i16x8_u] = 'i8x16.narrow_i16x8_u' +name[f32x4_ceil] = 'f32x4.ceil' +name[f32x4_floor] = 'f32x4.floor' +name[f32x4_trunc] = 'f32x4.trunc' +name[f32x4_nearest] = 'f32x4.nearest' +name[i8x16_shl] = 'i8x16.shl' +name[i8x16_shr_s] = 'i8x16.shr_s' +name[i8x16_shr_u] = 'i8x16.shr_u' +name[i8x16_add] = 'i8x16.add' +name[i8x16_add_sat_s] = 'i8x16.add_sat_s' +name[i8x16_add_sat_u] = 'i8x16.add_sat_u' +name[i8x16_sub] = 'i8x16.sub' +name[i8x16_sub_sat_s] = 'i8x16.sub_sat_s' +name[i8x16_sub_sat_u] = 'i8x16.sub_sat_u' +name[f64x2_ceil] = 'f64x2.ceil' +name[f64x2_floor] = 'f64x2.floor' +name[i8x16_min_s] = 'i8x16.min_s' +name[i8x16_min_u] = 'i8x16.min_u' +name[i8x16_max_s] = 'i8x16.max_s' +name[i8x16_max_u] = 'i8x16.max_u' +name[f64x2_trunc] = 'f64x2.trunc' +name[i8x16_avgr_u] = 'i8x16.avgr_u' +name[i16x8_extadd_pairwise_i8x16_s] = 'i16x8.extadd_pairwise_i8x16_s' +name[i16x8_extadd_pairwise_i8x16_u] = 'i16x8.extadd_pairwise_i8x16_u' +name[i32x4_extadd_pairwise_i16x8_s] = 'i32x4.extadd_pairwise_i16x8_s' +name[i32x4_extadd_pairwise_i16x8_u] = 'i32x4.extadd_pairwise_i16x8_u' +name[i16x8_abs] = 'i16x8.abs' +name[i16x8_neg] = 'i16x8.neg' +name[i16x8_q15mulr_sat_s] = 'i16x8.q15mulr_sat_s' +name[i16x8_all_true] = 'i16x8.all_true' +name[i16x8_bitmask] = 'i16x8.bitmask' +name[i16x8_narrow_i32x4_s] = 'i16x8.narrow_i32x4_s' +name[i16x8_narrow_i32x4_u] = 'i16x8.narrow_i32x4_u' +name[i16x8_extend_low_i8x16_s] = 'i16x8.extend_low_i8x16_s' +name[i16x8_extend_high_i8x16_s] = 'i16x8.extend_high_i8x16_s' +name[i16x8_extend_low_i8x16_u] = 'i16x8.extend_low_i8x16_u' +name[i16x8_extend_high_i8x16_u] = 'i16x8.extend_high_i8x16_u' +name[i16x8_shl] = 'i16x8.shl' +name[i16x8_shr_s] = 'i16x8.shr_s' +name[i16x8_shr_u] = 'i16x8.shr_u' +name[i16x8_add] = 'i16x8.add' +name[i16x8_add_sat_s] = 'i16x8.add_sat_s' +name[i16x8_add_sat_u] = 'i16x8.add_sat_u' +name[i16x8_sub] = 'i16x8.sub' +name[i16x8_sub_sat_s] = 'i16x8.sub_sat_s' +name[i16x8_sub_sat_u] = 'i16x8.sub_sat_u' +name[f64x2_nearest] = 'f64x2.nearest' +name[i16x8_mul] = 'i16x8.mul' +name[i16x8_min_s] = 'i16x8.min_s' +name[i16x8_min_u] = 'i16x8.min_u' +name[i16x8_max_s] = 'i16x8.max_s' +name[i16x8_max_u] = 'i16x8.max_u' +name[i16x8_avgr_u] = 'i16x8.avgr_u' +name[i16x8_extmul_low_i8x16_s] = 'i16x8.extmul_low_i8x16_s' +name[i16x8_extmul_high_i8x16_s] = 'i16x8.extmul_high_i8x16_s' +name[i16x8_extmul_low_i8x16_u] = 'i16x8.extmul_low_i8x16_u' +name[i16x8_extmul_high_i8x16_u] = 'i16x8.extmul_high_i8x16_u' +name[i32x4_abs] = 'i32x4.abs' +name[i32x4_neg] = 'i32x4.neg' +name[i32x4_all_true] = 'i32x4.all_true' +name[i32x4_bitmask] = 'i32x4.bitmask' +name[i32x4_extend_low_i16x8_s] = 'i32x4.extend_low_i16x8_s' +name[i32x4_extend_high_i16x8_s] = 'i32x4.extend_high_i16x8_s' +name[i32x4_extend_low_i16x8_u] = 'i32x4.extend_low_i16x8_u' +name[i32x4_extend_high_i16x8_u] = 'i32x4.extend_high_i16x8_u' +name[i32x4_shl] = 'i32x4.shl' +name[i32x4_shr_s] = 'i32x4.shr_s' +name[i32x4_shr_u] = 'i32x4.shr_u' +name[i32x4_add] = 'i32x4.add' +name[i32x4_sub] = 'i32x4.sub' +name[i32x4_mul] = 'i32x4.mul' +name[i32x4_min_s] = 'i32x4.min_s' +name[i32x4_min_u] = 'i32x4.min_u' +name[i32x4_max_s] = 'i32x4.max_s' +name[i32x4_max_u] = 'i32x4.max_u' +name[i32x4_dot_i16x8_s] = 'i32x4.dot_i16x8_s' +name[i32x4_extmul_low_i16x8_s] = 'i32x4.extmul_low_i16x8_s' +name[i32x4_extmul_high_i16x8_s] = 'i32x4.extmul_high_i16x8_s' +name[i32x4_extmul_low_i16x8_u] = 'i32x4.extmul_low_i16x8_u' +name[i32x4_extmul_high_i16x8_u] = 'i32x4.extmul_high_i16x8_u' +name[i64x2_abs] = 'i64x2.abs' +name[i64x2_neg] = 'i64x2.neg' +name[i64x2_all_true] = 'i64x2.all_true' +name[i64x2_bitmask] = 'i64x2.bitmask' +name[i64x2_extend_low_i32x4_s] = 'i64x2.extend_low_i32x4_s' +name[i64x2_extend_high_i32x4_s] = 'i64x2.extend_high_i32x4_s' +name[i64x2_extend_low_i32x4_u] = 'i64x2.extend_low_i32x4_u' +name[i64x2_extend_high_i32x4_u] = 'i64x2.extend_high_i32x4_u' +name[i64x2_shl] = 'i64x2.shl' +name[i64x2_shr_s] = 'i64x2.shr_s' +name[i64x2_shr_u] = 'i64x2.shr_u' +name[i64x2_add] = 'i64x2.add' +name[i64x2_sub] = 'i64x2.sub' +name[i64x2_mul] = 'i64x2.mul' +name[i64x2_eq] = 'i64x2.eq' +name[i64x2_ne] = 'i64x2.ne' +name[i64x2_lt_s] = 'i64x2.lt_s' +name[i64x2_gt_s] = 'i64x2.gt_s' +name[i64x2_le_s] = 'i64x2.le_s' +name[i64x2_ge_s] = 'i64x2.ge_s' +name[i64x2_extmul_low_i32x4_s] = 'i64x2.extmul_low_i32x4_s' +name[i64x2_extmul_high_i32x4_s] = 'i64x2.extmul_high_i32x4_s' +name[i64x2_extmul_low_i32x4_u] = 'i64x2.extmul_low_i32x4_u' +name[i64x2_extmul_high_i32x4_u] = 'i64x2.extmul_high_i32x4_u' +name[f32x4_abs] = 'f32x4.abs' +name[f32x4_neg] = 'f32x4.neg' +name[f32x4_sqrt] = 'f32x4.sqrt' +name[f32x4_add] = 'f32x4.add' +name[f32x4_sub] = 'f32x4.sub' +name[f32x4_mul] = 'f32x4.mul' +name[f32x4_div] = 'f32x4.div' +name[f32x4_min] = 'f32x4.min' +name[f32x4_max] = 'f32x4.max' +name[f32x4_pmin] = 'f32x4.pmin' +name[f32x4_pmax] = 'f32x4.pmax' +name[f64x2_abs] = 'f64x2.abs' +name[f64x2_neg] = 'f64x2.neg' +name[f64x2_sqrt] = 'f64x2.sqrt' +name[f64x2_add] = 'f64x2.add' +name[f64x2_sub] = 'f64x2.sub' +name[f64x2_mul] = 'f64x2.mul' +name[f64x2_div] = 'f64x2.div' +name[f64x2_min] = 'f64x2.min' +name[f64x2_max] = 'f64x2.max' +name[f64x2_pmin] = 'f64x2.pmin' +name[f64x2_pmax] = 'f64x2.pmax' +name[i32x4_trunc_sat_f32x4_s] = 'i32x4.trunc_sat_f32x4_s' +name[i32x4_trunc_sat_f32x4_u] = 'i32x4.trunc_sat_f32x4_u' +name[f32x4_convert_i32x4_s] = 'f32x4.convert_i32x4_s' +name[f32x4_convert_i32x4_u] = 'f32x4.convert_i32x4_u' +name[i32x4_trunc_sat_f64x2_s_zero] = 'i32x4.trunc_sat_f64x2_s_zero' +name[i32x4_trunc_sat_f64x2_u_zero] = 'i32x4.trunc_sat_f64x2_u_zero' +name[f64x2_convert_low_i32x4_s] = 'f64x2.convert_low_i32x4_s' +name[f64x2_convert_low_i32x4_u] = 'f64x2.convert_low_i32x4_u' diff --git a/script/build_spec.py b/script/build_spec.py index d3472b2f..8ac4a7cd 100644 --- a/script/build_spec.py +++ b/script/build_spec.py @@ -30,3 +30,6 @@ def cd(dst: str) -> typing.Generator[None, typing.Any, None]: with cd('res/spec/test/core'): for e in sorted(glob.glob('*.wast')): call(f'wast2json {e}') +with cd('res/spec/test/core/simd'): + for e in sorted(glob.glob('*.wast')): + call(f'wast2json {e}') diff --git a/test/spec.py b/test/spec.py index 7733c6b7..73924f65 100644 --- a/test/spec.py +++ b/test/spec.py @@ -1,21 +1,20 @@ import glob import json import math +import pathlib import pywasm -import re import typing pywasm.log.lvl = 0 -unittest_regex = 'res/spec/test/core/.*.json' -def valj(j: typing.Dict[str, str]) -> pywasm.ValInst: +def valj(j: typing.Dict) -> pywasm.ValInst: match j['type']: case 'i32': - return pywasm.ValInst.from_i32(int(j['value'])) + return pywasm.ValInst.from_i32(pywasm.arith.i32.fit(int(j['value']))) case 'i64': - return pywasm.ValInst.from_i64(int(j['value'])) + return pywasm.ValInst.from_i64(pywasm.arith.i64.fit(int(j['value']))) case 'f32': match j['value']: case 'nan:canonical': @@ -32,6 +31,24 @@ def valj(j: typing.Dict[str, str]) -> pywasm.ValInst: return pywasm.ValInst.from_f64_u64(0x7ff8000000000001) case _: return pywasm.ValInst.from_f64_u64(int(j['value'])) + case 'v128': + match j['lane_type']: + case 'i8': + return pywasm.ValInst.from_v128_i8([pywasm.arith.i8.fit(int(c)) for c in j['value']]) + case 'i16': + return pywasm.ValInst.from_v128_i16([pywasm.arith.i16.fit(int(c)) for c in j['value']]) + case 'i32': + return pywasm.ValInst.from_v128_i32([pywasm.arith.i32.fit(int(c)) for c in j['value']]) + case 'i64': + return pywasm.ValInst.from_v128_i64([pywasm.arith.i64.fit(int(c)) for c in j['value']]) + case 'f32': + data = [valj({'type': 'f32', 'value': e}).into_u32() for e in j['value']] + return pywasm.ValInst.from_v128_u32(data) + case 'f64': + data = [valj({'type': 'f64', 'value': e}).into_u64() for e in j['value']] + return pywasm.ValInst.from_v128_u64(data) + case _: + assert 0 case 'funcref': match j['value']: case 'null': @@ -63,6 +80,18 @@ def vale(a: pywasm.ValInst, b: pywasm.ValInst) -> bool: if math.isnan(a.into_f64()): return math.isnan(b.into_f64()) return math.isclose(a.into_f64(), b.into_f64(), rel_tol=1e-6) + if a.type == pywasm.core.ValType.v128(): + if a.into_v128() == b.into_v128(): + return True + x = [pywasm.core.ValInst.from_f32(e) for e in a.into_v128_f32()] + y = [pywasm.core.ValInst.from_f32(e) for e in b.into_v128_f32()] + if all([vale(x, y) for x, y in zip(x, y)]): + return True + x = [pywasm.core.ValInst.from_f64(e) for e in a.into_v128_f64()] + y = [pywasm.core.ValInst.from_f64(e) for e in b.into_v128_f64()] + if all([vale(x, y) for x, y in zip(x, y)]): + return True + return False if a.type == pywasm.core.ValType.ref_func(): return a.into_i64() == b.into_i64() if a.type == pywasm.core.ValType.ref_extern(): @@ -115,11 +144,12 @@ def host(runtime: pywasm.core.Runtime) -> typing.Dict[str, typing.Dict[str, pywa } -for name in sorted(glob.glob('res/spec/test/core/*.json')): - if not re.match(unittest_regex, name): - continue - with open(name) as f: - suit = json.load(f)['commands'] +all_test = [ + *sorted(glob.glob('res/spec/test/core/*.json')), + *sorted(glob.glob('res/spec/test/core/simd/*.json')) +] +for desc in all_test: + suit = json.loads(pathlib.Path(desc).read_text())['commands'] runtime = pywasm.Runtime() cmodule: pywasm.ModuleInst lmodule: pywasm.ModuleInst @@ -208,8 +238,9 @@ def host(runtime: pywasm.core.Runtime) -> typing.Dict[str, typing.Dict[str, pywa case _: assert 0 case 'assert_uninstantiable': + name = pathlib.Path(desc).parent.joinpath(elem['filename']) try: - lmodule = runtime.instance_from_file(f'res/spec/test/core/{elem['filename']}') + lmodule = runtime.instance_from_file(name) except: runtime.machine.stack.frame.clear() runtime.machine.stack.label.clear() @@ -217,8 +248,9 @@ def host(runtime: pywasm.core.Runtime) -> typing.Dict[str, typing.Dict[str, pywa else: assert 0 case 'assert_unlinkable': + name = pathlib.Path(desc).parent.joinpath(elem['filename']) try: - lmodule = runtime.instance_from_file(f'res/spec/test/core/{elem['filename']}') + lmodule = runtime.instance_from_file(name) except: runtime.machine.stack.frame.clear() runtime.machine.stack.label.clear() @@ -226,7 +258,8 @@ def host(runtime: pywasm.core.Runtime) -> typing.Dict[str, typing.Dict[str, pywa else: assert 0 case 'module': - lmodule = runtime.instance_from_file(f'res/spec/test/core/{elem['filename']}') + name = pathlib.Path(desc).parent.joinpath(elem['filename']) + lmodule = runtime.instance_from_file(name) if 'name' in elem: mmodule[elem['name']] = lmodule case 'register':