From fbab6d07427694d55c36bf23087296e0ae3a7a08 Mon Sep 17 00:00:00 2001 From: jay-tux Date: Wed, 2 Oct 2024 12:11:01 +0200 Subject: [PATCH 1/7] Support for select SIMD instructions: (dim).splat, (dim).extract_lane, (dim).replace_lane --- src/Interpreter/instructions.cpp | 129 +++++++++++++++++++++++++++++++ src/Interpreter/instructions.h | 6 ++ src/Interpreter/interpreter.cpp | 50 +++++++++++- src/Interpreter/interpreter.h | 1 + src/WARDuino.h | 2 + src/WARDuino/WARDuino.cpp | 45 ++++++++++- src/WARDuino/internals.h | 9 +++ tutorials/wat/main/simd.wat | 87 +++++++++++++++++++++ 8 files changed, 326 insertions(+), 3 deletions(-) create mode 100644 tutorials/wat/main/simd.wat diff --git a/src/Interpreter/instructions.cpp b/src/Interpreter/instructions.cpp index 06886d17..41e4fbd2 100644 --- a/src/Interpreter/instructions.cpp +++ b/src/Interpreter/instructions.cpp @@ -1265,3 +1265,132 @@ bool i_instr_callback(Module *m, uint8_t opcode) { // TODO return true; } + +/** + * [0xfd] 0x0f...0x14 SIMD splat operations + */ +bool i_instr_simd_splat(Module* m, uint8_t opcode) { + auto &raw_top = m->stack[m->sp]; + auto &top = raw_top.value; + + switch(opcode) { + case 0x0f: { // i8x16.splat + const int8_t val = top.int32; + for(auto &i : top.simd.i8x16) i = val; + break; + } + + case 0x10: { // i16x8.splat + const int16_t val = top.int32; + for(auto &i : top.simd.i16x8) i = val; + break; + } + + case 0x11: { // i32x4.splat + const int32_t val = top.int32; + for(auto &i : top.simd.i32x4) i = val; + break; + } + + case 0x12: { // i64x2.splat + const int64_t val = top.int64; + for(auto &i : top.simd.i64x2) i = val; + break; + } + + case 0x13: { // f32x4.splat + const float val = top.f32; + for(auto &i : top.simd.f32x4) i = val; + break; + } + + case 0x14: { // f64x2.splat + const double val = top.f64; + for(auto &i : top.simd.f64x2) i = val; + break; + } + } + + raw_top.value_type = V128; + return true; +} + +bool i_instr_simd_extract(Module* m, uint8_t opcode){ + // inner helper to check if lane is within bounds, then execute the operation + auto &raw_top = m->stack[m->sp]; + const uint8_t lane = *m->pc_ptr; + m->pc_ptr++; + + // expect the compiler to inline the lambda - see + // https://stackoverflow.com/questions/13722426/why-can-lambdas-be-better-optimized-by-the-compiler-than-plain-functions/13722515#13722515 + auto lane_handler = [&raw_top, lane](const int max, I *in, O &out, const uint8_t type) { + if(lane > max) { + sprintf(exception, "lane index out of bounds (%d > %d)", lane, max); + return false; + } + + out = in[lane]; + raw_top.value_type = type; + + return true; + }; + + switch(opcode) { // TODO: we ignore the _s and _u for now... + case 0x15: // i8x16.extract_lane_s + case 0x16: // i8x16.extract_lane_u + return lane_handler(15, raw_top.value.simd.i8x16, raw_top.value.uint32, I32); + + case 0x18: // i16x8.extract_lane_s + case 0x19: // i16x8.extract_lane_u + return lane_handler(8, raw_top.value.simd.i16x8, raw_top.value.uint32, I32); + + case 0x1b: // i32x4.extract_lane + return lane_handler(4, raw_top.value.simd.i32x4, raw_top.value.uint32, I32); + + case 0x1d: // i64x2.extract_lane + return lane_handler(2, raw_top.value.simd.i64x2, raw_top.value.uint64, I64); + + case 0x1f: // f32x4.extract_lane + return lane_handler(4, raw_top.value.simd.f32x4, raw_top.value.uint32, F32); + + case 0x21: // f64x2.extract_lane + return lane_handler(2, raw_top.value.simd.f64x2, raw_top.value.uint64, F64); + } + + return false; +} + +bool i_instr_simd_replace(Module *m, uint8_t opcode) { + auto &v128 = m->stack[m->sp - 1]; + auto &update = m->stack[m->sp].value; + const uint8_t lane = *m->pc_ptr; + m->pc_ptr++; + m->sp -= 1; + + auto lane_handler = [&v128, lane](const int max, O *out, O replace) { + if(lane > max) { + sprintf(exception, "lane index out of bounds (%d > %d)", lane, max); + return false; + } + + out[lane] = replace; + return true; + }; + + switch(opcode) { + case 0x17: // i8x16.replace_lane + return lane_handler(15, v128.value.simd.i8x16, static_cast(update.uint32)); + case 0x1a: // i16x8.replace_lane + return lane_handler(8, v128.value.simd.i16x8, static_cast(update.uint32)); + case 0x1c: // i32x4.replace_lane + return lane_handler(4, v128.value.simd.i32x4, static_cast(update.uint32)); + case 0x1e: // i64x2.replace_lane + return lane_handler(2, v128.value.simd.i64x2, static_cast(update.uint64)); + case 0x20: // f32x4.replace_lane + return lane_handler(4, v128.value.simd.f32x4, update.f32); + case 0x22: // f64x2.replace_lane + return lane_handler(2, v128.value.simd.f64x2, update.f64); + } + + return false; +} diff --git a/src/Interpreter/instructions.h b/src/Interpreter/instructions.h index 54a80f1b..5caf3bce 100644 --- a/src/Interpreter/instructions.h +++ b/src/Interpreter/instructions.h @@ -73,3 +73,9 @@ bool i_instr_binary_f64(Module *m, uint8_t opcode); bool i_instr_conversion(Module *m, uint8_t opcode); bool i_instr_callback(Module *m, uint8_t opcode); + +bool i_instr_simd_splat(Module *m, uint8_t opcode); + +bool i_instr_simd_extract(Module *m, uint8_t opcode); + +bool i_instr_simd_replace(Module *m, uint8_t opcode); \ No newline at end of file diff --git a/src/Interpreter/interpreter.cpp b/src/Interpreter/interpreter.cpp index e3f368ae..82b63b69 100644 --- a/src/Interpreter/interpreter.cpp +++ b/src/Interpreter/interpreter.cpp @@ -427,6 +427,11 @@ bool Interpreter::interpret(Module *m, bool waiting) { case 0xe0 ... 0xe3: success &= i_instr_callback(m, opcode); continue; + + case 0xfd: + success &= interpret_simd(m); + continue; + default: sprintf(exception, "unrecognized opcode 0x%x", opcode); if (m->options.return_exception) { @@ -455,12 +460,55 @@ bool Interpreter::interpret(Module *m, bool waiting) { if (!success && m->options.return_exception) { m->exception = strdup(exception); } else if (!success) { - FATAL("%s\n", exception); + FATAL("%s (0x%x)\n", exception, opcode); } return success; } +bool Interpreter::interpret_simd(Module *m) { + // this function should only be called from Interpreter::interpret + // and should only be called when the opcode is 0xfd + // -> at this point, the PC is pointing to the (first byte of) the actual + // opcode + + // TODO: technically the 2nd byte (and onwards) of the multi-byte SIMD + // opcodes are LEB-encoded u32's and could have multiple + // representations. However, we only support the shortest possible + // encodings; see https://webassembly.github.io/spec/core/appendix/index-instructions.html + + const auto opcode = *m->pc_ptr; + m->pc_ptr++; + switch(opcode) { + case 0x0f ... 0x14: + return i_instr_simd_splat(m, opcode); + + case 0x15: // interspersed with (dim).extract_lane + case 0x16: + case 0x18: + case 0x19: + case 0x1b: + case 0x1d: + case 0x1f: + case 0x21: + return i_instr_simd_extract(m, opcode); + + case 0x17: + case 0x1a: + case 0x1c: + case 0x1e: + case 0x20: + case 0x22: + return i_instr_simd_replace(m, opcode); + + default: { + sprintf(exception, "unrecognized SIMD opcode 0x%x (0x%x 0x%x)", opcode, 0xfd, opcode); + return false; + } + } +} + + void Interpreter::report_overflow(Module *m, uint8_t *maddr) { dbg_warn("memory start: %p, memory end: %p, maddr: %p\n", m->memory.bytes, m->memory.bytes + m->memory.pages * (uint32_t)PAGE_SIZE, maddr); diff --git a/src/Interpreter/interpreter.h b/src/Interpreter/interpreter.h index d11260d3..7afa7966 100644 --- a/src/Interpreter/interpreter.h +++ b/src/Interpreter/interpreter.h @@ -55,5 +55,6 @@ class Interpreter { static void report_overflow(Module *m, uint8_t *maddr); protected: + bool interpret_simd(Module *m); private: }; diff --git a/src/WARDuino.h b/src/WARDuino.h index 8d04d160..ec67f362 100644 --- a/src/WARDuino.h +++ b/src/WARDuino.h @@ -28,6 +28,8 @@ #define F32 0x7d // -0x03 #define F64 0x7c // -0x04 +#define V128 0x7b // according to the spec? TODO + #define I32_8 0x7b // -0x05 #define I32_16 0x7a // -0x06 #define I64_8 0x79 // -0x07 diff --git a/src/WARDuino/WARDuino.cpp b/src/WARDuino/WARDuino.cpp index 215821c0..a08cc6e5 100644 --- a/src/WARDuino/WARDuino.cpp +++ b/src/WARDuino/WARDuino.cpp @@ -53,9 +53,9 @@ bool resolvesym(char *filename, char *symbol, uint8_t external_kind, void **val, // char exception[4096]; // Static definition of block_types -uint32_t block_type_results[4][1] = {{I32}, {I64}, {F32}, {F64}}; +uint32_t block_type_results[5][1] = {{I32}, {I64}, {F32}, {F64}, {V128}}; -Type block_types[5]; +Type block_types[6]; void initTypes() { block_types[0].form = BLOCK; @@ -140,6 +140,44 @@ void parse_memory_type(Module *m, uint8_t **pos) { } } +void skip_immediates_simd(uint8_t **pos) { + uint8_t simd_opcode = **pos; + *pos += 1; // skip opcode + switch(simd_opcode) { + case 0x00 ... 0x0b: // v128.loadXXX, v128.store + read_LEB_32(pos); + break; + case 0x0c: // v128.const + // TODO: figure out how in the 9 hells i128's are stored in wasm + break; + case 0x0d: // i8x16.shuffle + *pos += 1; + break; + case 0x0e ... 0x14: // i8x16.swizzle, dim.splat + break; + case 0x15 ... 0x22: // dim.extract_lane, dim.replace_lane + *pos += 1; + break; + case 0x23 ... 0x53: // relational operators + break; + case 0x54 ... 0x5b: // v128.loadX_lane, v128.storeX_lane + read_LEB_32(pos); + *pos += 1; + break; + case 0x5c ... 0x5d: // v128.loadX_zero + read_LEB_32(pos); + break; + case 0x5e ... 0x7f: // math-like functionality, extensions, ... + break; + case 0x80 ... 0xff: { + uint8_t second_opcode = **pos; + assert(second_opcode == 0x01 && "3-byte SIMD instructions should have 0x01 as their 3rd byte."); + *pos++; + break; + } + } +} + void skip_immediates(uint8_t **pos) { uint32_t count, opcode = **pos; *pos = *pos + 1; @@ -190,6 +228,9 @@ void skip_immediates(uint8_t **pos) { } read_LEB_32(pos); // default target break; + case 0xfd: + skip_immediates_simd(pos); + break; default: // no immediates break; } diff --git a/src/WARDuino/internals.h b/src/WARDuino/internals.h index d0f6b263..6c183e46 100644 --- a/src/WARDuino/internals.h +++ b/src/WARDuino/internals.h @@ -54,6 +54,15 @@ typedef struct StackValue { int64_t int64; float f32; double f64; + + union { // TODO: temporary solution for SIMD types + int8_t i8x16[16]; + int16_t i16x8[8]; + int32_t i32x4[4]; + int64_t i64x2[2]; + float f32x4[4]; + double f64x2[2]; + } simd; } value; } StackValue; diff --git a/tutorials/wat/main/simd.wat b/tutorials/wat/main/simd.wat new file mode 100644 index 00000000..ba74cbc7 --- /dev/null +++ b/tutorials/wat/main/simd.wat @@ -0,0 +1,87 @@ +(module + (import "env" "print_int" (func $print.int (type $i32->void))) + (type $void->void (func)) + (type $i32->void (func (param i32))) +;; (type $void->v128 (func (result v128))) + +;; (func $build (type $void->v128) +;; (i32.const 0) +;; i16x8.splat +;; i32.const 1 +;; i16x8.replace_lane 0 +;; i32.const 2 +;; i16x8.replace_lane 1 +;; i32.const 3 +;; i16x8.replace_lane 2 +;; i32.const 4 +;; i16x8.replace_lane 3 +;; i32.const 5 +;; i16x8.replace_lane 4 +;; i32.const 6 +;; i16x8.replace_lane 5 +;; i32.const 7 +;; i16x8.replace_lane 6 +;; i32.const 8 +;; i16x8.replace_lane 7 +;; ) + + (func $run (type $void->void) + (i32.const 123456) + i32x4.splat + i32x4.extract_lane 0 + call $print.int + +;; call $build +;; local.set $temp + +;; local.get $temp + i32.const 0 + i16x8.splat + i16x8.extract_lane_s 0 + call $print.int + +;; local.get $temp + i32.const 0 + i16x8.splat + i16x8.extract_lane_s 1 + call $print.int + +;; local.get $temp + i32.const 0 + i16x8.splat + i16x8.extract_lane_s 2 + call $print.int + +;; local.get $temp + i32.const 0 + i16x8.splat + i16x8.extract_lane_s 3 + call $print.int + +;; local.get $temp + i32.const 0 + i16x8.splat + i16x8.extract_lane_s 4 + call $print.int + +;; local.get $temp + i32.const 0 + i16x8.splat + i16x8.extract_lane_s 5 + call $print.int + +;; local.get $temp + i32.const 0 + i16x8.splat + i16x8.extract_lane_s 6 + call $print.int + +;; local.get $temp + i32.const 0 + i16x8.splat + i16x8.extract_lane_s 7 + call $print.int + ) + + (export "main" (func $run)) +) \ No newline at end of file From 419a94462dde407f050480acdbca79c411db17dc Mon Sep 17 00:00:00 2001 From: jay-tux Date: Thu, 3 Oct 2024 09:01:48 +0200 Subject: [PATCH 2/7] Working on spec-tests for SIMD --- .gitignore | 1 + platforms/CLI-Emulator/main.cpp | 6 ++ tests/latch/core/simd_splat_0.asserts.wast | 107 ++++++++++++++++++ tests/latch/core/simd_splat_0.wast | 8 ++ tests/latch/core/simd_splat_1.asserts.wast | 5 + tests/latch/core/simd_splat_1.wast | 17 +++ tests/latch/core/simd_splat_2.asserts.wast | 51 +++++++++ tests/latch/core/simd_splat_2.wast | 119 +++++++++++++++++++++ tutorials/wat/main/simd.wat | 76 +------------ tutorials/wat/main/simd2.wat | 52 +++++++++ 10 files changed, 367 insertions(+), 75 deletions(-) create mode 100644 tests/latch/core/simd_splat_0.asserts.wast create mode 100644 tests/latch/core/simd_splat_0.wast create mode 100644 tests/latch/core/simd_splat_1.asserts.wast create mode 100644 tests/latch/core/simd_splat_1.wast create mode 100644 tests/latch/core/simd_splat_2.asserts.wast create mode 100644 tests/latch/core/simd_splat_2.wast create mode 100644 tutorials/wat/main/simd2.wat diff --git a/.gitignore b/.gitignore index 0e6a6834..167de90c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .idea/ .vscode/ +.cache/ .ccls *.bin diff --git a/platforms/CLI-Emulator/main.cpp b/platforms/CLI-Emulator/main.cpp index 24261d85..7a041a49 100644 --- a/platforms/CLI-Emulator/main.cpp +++ b/platforms/CLI-Emulator/main.cpp @@ -406,6 +406,12 @@ int main(int argc, const char *argv[]) { } else { wac->run_module(m); } + + if(m->exception) { + fprintf(stderr, "wdcli: exception: %s\n", m->exception); + return 1; + } + wac->unload_module(m); wac->debugger->stop(); diff --git a/tests/latch/core/simd_splat_0.asserts.wast b/tests/latch/core/simd_splat_0.asserts.wast new file mode 100644 index 00000000..711716a1 --- /dev/null +++ b/tests/latch/core/simd_splat_0.asserts.wast @@ -0,0 +1,107 @@ +(assert_return (invoke "i8x16.splat" (i32.const 0)) (v128.const i8x16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)) +(assert_return (invoke "i8x16.splat" (i32.const 5)) (v128.const i8x16 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5)) +(assert_return (invoke "i8x16.splat" (i32.const -5)) (v128.const i8x16 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5)) +(assert_return (invoke "i8x16.splat" (i32.const 257)) (v128.const i8x16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)) +(assert_return (invoke "i8x16.splat" (i32.const 0xff)) (v128.const i8x16 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1)) +(assert_return (invoke "i8x16.splat" (i32.const -128)) (v128.const i8x16 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128)) +(assert_return (invoke "i8x16.splat" (i32.const 127)) (v128.const i8x16 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127)) +(assert_return (invoke "i8x16.splat" (i32.const -129)) (v128.const i8x16 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127)) +(assert_return (invoke "i8x16.splat" (i32.const 128)) (v128.const i8x16 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128)) +(assert_return (invoke "i8x16.splat" (i32.const 0xff7f)) (v128.const i8x16 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f)) +(assert_return (invoke "i8x16.splat" (i32.const 0x80)) (v128.const i8x16 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80)) +(assert_return (invoke "i8x16.splat" (i32.const 0xAB)) (v128.const i32x4 0xABABABAB 0xABABABAB 0xABABABAB 0xABABABAB)) + +(assert_return (invoke "i16x8.splat" (i32.const 0)) (v128.const i16x8 0 0 0 0 0 0 0 0)) +(assert_return (invoke "i16x8.splat" (i32.const 5)) (v128.const i16x8 5 5 5 5 5 5 5 5)) +(assert_return (invoke "i16x8.splat" (i32.const -5)) (v128.const i16x8 -5 -5 -5 -5 -5 -5 -5 -5)) +(assert_return (invoke "i16x8.splat" (i32.const 65537)) (v128.const i16x8 1 1 1 1 1 1 1 1)) +(assert_return (invoke "i16x8.splat" (i32.const 0xffff)) (v128.const i16x8 -1 -1 -1 -1 -1 -1 -1 -1)) +(assert_return (invoke "i16x8.splat" (i32.const -32768)) (v128.const i16x8 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768)) +(assert_return (invoke "i16x8.splat" (i32.const 32767)) (v128.const i16x8 32767 32767 32767 32767 32767 32767 32767 32767)) +(assert_return (invoke "i16x8.splat" (i32.const -32769)) (v128.const i16x8 32767 32767 32767 32767 32767 32767 32767 32767)) +(assert_return (invoke "i16x8.splat" (i32.const 32768)) (v128.const i16x8 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768)) +(assert_return (invoke "i16x8.splat" (i32.const 0xffff7fff)) (v128.const i16x8 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff)) +(assert_return (invoke "i16x8.splat" (i32.const 0x8000)) (v128.const i16x8 0x8000 0x8000 0x8000 0x8000 0x8000 0x8000 0x8000 0x8000)) +(assert_return (invoke "i16x8.splat" (i32.const 0xABCD)) (v128.const i32x4 0xABCDABCD 0xABCDABCD 0xABCDABCD 0xABCDABCD)) +(assert_return (invoke "i16x8.splat" (i32.const 012345)) (v128.const i16x8 012_345 012_345 012_345 012_345 012_345 012_345 012_345 012_345)) +(assert_return (invoke "i16x8.splat" (i32.const 0x01234)) (v128.const i16x8 0x0_1234 0x0_1234 0x0_1234 0x0_1234 0x0_1234 0x0_1234 0x0_1234 0x0_1234)) + +(assert_return (invoke "i32x4.splat" (i32.const 0)) (v128.const i32x4 0 0 0 0)) +(assert_return (invoke "i32x4.splat" (i32.const 5)) (v128.const i32x4 5 5 5 5)) +(assert_return (invoke "i32x4.splat" (i32.const -5)) (v128.const i32x4 -5 -5 -5 -5)) +(assert_return (invoke "i32x4.splat" (i32.const 0xffffffff)) (v128.const i32x4 -1 -1 -1 -1)) +(assert_return (invoke "i32x4.splat" (i32.const 4294967295)) (v128.const i32x4 -1 -1 -1 -1)) +(assert_return (invoke "i32x4.splat" (i32.const -2147483648)) (v128.const i32x4 0x80000000 0x80000000 0x80000000 0x80000000)) +(assert_return (invoke "i32x4.splat" (i32.const 2147483647)) (v128.const i32x4 0x7fffffff 0x7fffffff 0x7fffffff 0x7fffffff)) +(assert_return (invoke "i32x4.splat" (i32.const 2147483648)) (v128.const i32x4 0x80000000 0x80000000 0x80000000 0x80000000)) +(assert_return (invoke "i32x4.splat" (i32.const 01234567890)) (v128.const i32x4 012_3456_7890 012_3456_7890 012_3456_7890 012_3456_7890)) +(assert_return (invoke "i32x4.splat" (i32.const 0x012345678)) (v128.const i32x4 0x0_1234_5678 0x0_1234_5678 0x0_1234_5678 0x0_1234_5678)) + +(assert_return (invoke "f32x4.splat" (f32.const 0.0)) (v128.const f32x4 0.0 0.0 0.0 0.0)) +(assert_return (invoke "f32x4.splat" (f32.const 1.1)) (v128.const f32x4 1.1 1.1 1.1 1.1)) +(assert_return (invoke "f32x4.splat" (f32.const -1.1)) (v128.const f32x4 -1.1 -1.1 -1.1 -1.1)) +(assert_return (invoke "f32x4.splat" (f32.const 1e38)) (v128.const f32x4 1e38 1e38 1e38 1e38)) +(assert_return (invoke "f32x4.splat" (f32.const -1e38)) (v128.const f32x4 -1e38 -1e38 -1e38 -1e38)) +(assert_return (invoke "f32x4.splat" (f32.const 0x1.fffffep127)) (v128.const f32x4 0x1.fffffep127 0x1.fffffep127 0x1.fffffep127 0x1.fffffep127)) +(assert_return (invoke "f32x4.splat" (f32.const -0x1.fffffep127)) (v128.const f32x4 -0x1.fffffep127 -0x1.fffffep127 -0x1.fffffep127 -0x1.fffffep127)) +(assert_return (invoke "f32x4.splat" (f32.const 0x1p127)) (v128.const f32x4 0x1p127 0x1p127 0x1p127 0x1p127)) +(assert_return (invoke "f32x4.splat" (f32.const -0x1p127)) (v128.const f32x4 -0x1p127 -0x1p127 -0x1p127 -0x1p127)) +(assert_return (invoke "f32x4.splat" (f32.const inf)) (v128.const f32x4 inf inf inf inf)) +(assert_return (invoke "f32x4.splat" (f32.const -inf)) (v128.const f32x4 -inf -inf -inf -inf)) +(assert_return (invoke "f32x4.splat" (f32.const nan)) (v128.const f32x4 nan nan nan nan)) +(assert_return (invoke "f32x4.splat" (f32.const nan:0x1)) (v128.const f32x4 nan:0x1 nan:0x1 nan:0x1 nan:0x1)) +(assert_return (invoke "f32x4.splat" (f32.const nan:0x7f_ffff)) (v128.const f32x4 nan:0x7f_ffff nan:0x7f_ffff nan:0x7f_ffff nan:0x7f_ffff)) +(assert_return (invoke "f32x4.splat" (f32.const 0123456789)) (v128.const f32x4 0123456789 0123456789 0123456789 0123456789)) +(assert_return (invoke "f32x4.splat" (f32.const 0123456789.)) (v128.const f32x4 0123456789. 0123456789. 0123456789. 0123456789.)) +(assert_return (invoke "f32x4.splat" (f32.const 0x0123456789ABCDEF)) (v128.const f32x4 0x0123456789ABCDEF 0x0123456789ABCDEF 0x0123456789ABCDEF 0x0123456789ABCDEF)) +(assert_return (invoke "f32x4.splat" (f32.const 0x0123456789ABCDEF.)) (v128.const f32x4 0x0123456789ABCDEF. 0x0123456789ABCDEF. 0x0123456789ABCDEF. 0x0123456789ABCDEF.)) +(assert_return (invoke "f32x4.splat" (f32.const 0123456789e019)) (v128.const f32x4 0123456789e019 0123456789e019 0123456789e019 0123456789e019)) +(assert_return (invoke "f32x4.splat" (f32.const 0123456789.e+019)) (v128.const f32x4 0123456789.e+019 0123456789.e+019 0123456789.e+019 0123456789.e+019)) +(assert_return (invoke "f32x4.splat" (f32.const 0x0123456789ABCDEFp019)) (v128.const f32x4 0x0123456789ABCDEFp019 0x0123456789ABCDEFp019 0x0123456789ABCDEFp019 0x0123456789ABCDEFp019)) +(assert_return (invoke "f32x4.splat" (f32.const 0x0123456789ABCDEF.p-019)) (v128.const f32x4 0x0123456789ABCDEF.p-019 0x0123456789ABCDEF.p-019 0x0123456789ABCDEF.p-019 0x0123456789ABCDEF.p-019)) + +(assert_return (invoke "i64x2.splat" (i64.const 0)) (v128.const i64x2 0 0)) +(assert_return (invoke "i64x2.splat" (i64.const -0)) (v128.const i64x2 0 0)) +(assert_return (invoke "i64x2.splat" (i64.const 1)) (v128.const i64x2 1 1)) +(assert_return (invoke "i64x2.splat" (i64.const -1)) (v128.const i64x2 -1 -1)) +(assert_return (invoke "i64x2.splat" (i64.const -9223372036854775808)) (v128.const i64x2 -9223372036854775808 -9223372036854775808)) +(assert_return (invoke "i64x2.splat" (i64.const -9223372036854775808)) (v128.const i64x2 9223372036854775808 9223372036854775808)) +(assert_return (invoke "i64x2.splat" (i64.const 9223372036854775807)) (v128.const i64x2 9223372036854775807 9223372036854775807)) +(assert_return (invoke "i64x2.splat" (i64.const 18446744073709551615)) (v128.const i64x2 -1 -1)) +(assert_return (invoke "i64x2.splat" (i64.const 0x7fffffffffffffff)) (v128.const i64x2 0x7fffffffffffffff 0x7fffffffffffffff)) +(assert_return (invoke "i64x2.splat" (i64.const 0xffffffffffffffff)) (v128.const i64x2 -1 -1)) +(assert_return (invoke "i64x2.splat" (i64.const -0x8000000000000000)) (v128.const i64x2 -0x8000000000000000 -0x8000000000000000)) +(assert_return (invoke "i64x2.splat" (i64.const -0x8000000000000000)) (v128.const i64x2 0x8000000000000000 0x8000000000000000)) +(assert_return (invoke "i64x2.splat" (i64.const 01234567890123456789)) (v128.const i64x2 01_234_567_890_123_456_789 01_234_567_890_123_456_789)) +(assert_return (invoke "i64x2.splat" (i64.const 0x01234567890ABcdef)) (v128.const i64x2 0x0_1234_5678_90AB_cdef 0x0_1234_5678_90AB_cdef)) + +(assert_return (invoke "f64x2.splat" (f64.const 0.0)) (v128.const f64x2 0.0 0.0)) +(assert_return (invoke "f64x2.splat" (f64.const -0.0)) (v128.const f64x2 -0.0 -0.0)) +(assert_return (invoke "f64x2.splat" (f64.const 1.1)) (v128.const f64x2 1.1 1.1)) +(assert_return (invoke "f64x2.splat" (f64.const -1.1)) (v128.const f64x2 -1.1 -1.1)) +(assert_return (invoke "f64x2.splat" (f64.const 0x0.0000000000001p-1022)) (v128.const f64x2 0x0.0000000000001p-1022 0x0.0000000000001p-1022)) +(assert_return (invoke "f64x2.splat" (f64.const -0x0.0000000000001p-1022)) (v128.const f64x2 -0x0.0000000000001p-1022 -0x0.0000000000001p-1022)) +(assert_return (invoke "f64x2.splat" (f64.const 0x1p-1022)) (v128.const f64x2 0x1p-1022 0x1p-1022)) +(assert_return (invoke "f64x2.splat" (f64.const -0x1p-1022)) (v128.const f64x2 -0x1p-1022 -0x1p-1022)) +(assert_return (invoke "f64x2.splat" (f64.const 0x1p-1)) (v128.const f64x2 0x1p-1 0x1p-1)) +(assert_return (invoke "f64x2.splat" (f64.const -0x1p-1)) (v128.const f64x2 -0x1p-1 -0x1p-1)) +(assert_return (invoke "f64x2.splat" (f64.const 0x1p+0)) (v128.const f64x2 0x1p+0 0x1p+0)) +(assert_return (invoke "f64x2.splat" (f64.const -0x1p+0)) (v128.const f64x2 -0x1p+0 -0x1p+0)) +(assert_return (invoke "f64x2.splat" (f64.const 0x1.921fb54442d18p+2)) (v128.const f64x2 0x1.921fb54442d18p+2 0x1.921fb54442d18p+2)) +(assert_return (invoke "f64x2.splat" (f64.const -0x1.921fb54442d18p+2)) (v128.const f64x2 -0x1.921fb54442d18p+2 -0x1.921fb54442d18p+2)) +(assert_return (invoke "f64x2.splat" (f64.const 0x1.fffffffffffffp+1023)) (v128.const f64x2 0x1.fffffffffffffp+1023 0x1.fffffffffffffp+1023)) +(assert_return (invoke "f64x2.splat" (f64.const -0x1.fffffffffffffp+1023)) (v128.const f64x2 -0x1.fffffffffffffp+1023 -0x1.fffffffffffffp+1023)) +(assert_return (invoke "f64x2.splat" (f64.const inf)) (v128.const f64x2 inf inf)) +(assert_return (invoke "f64x2.splat" (f64.const -inf)) (v128.const f64x2 -inf -inf)) +(assert_return (invoke "f64x2.splat" (f64.const nan)) (v128.const f64x2 nan nan)) +(assert_return (invoke "f64x2.splat" (f64.const -nan)) (v128.const f64x2 -nan -nan)) +(assert_return (invoke "f64x2.splat" (f64.const nan:0x4000000000000)) (v128.const f64x2 nan:0x4000000000000 nan:0x4000000000000)) +(assert_return (invoke "f64x2.splat" (f64.const -nan:0x4000000000000)) (v128.const f64x2 -nan:0x4000000000000 -nan:0x4000000000000)) +(assert_return (invoke "f64x2.splat" (f64.const 0123456789)) (v128.const f64x2 0123456789 0123456789)) +(assert_return (invoke "f64x2.splat" (f64.const 0123456789.)) (v128.const f64x2 0123456789. 0123456789.)) +(assert_return (invoke "f64x2.splat" (f64.const 0x0123456789ABCDEFabcdef)) (v128.const f64x2 0x0123456789ABCDEFabcdef 0x0123456789ABCDEFabcdef)) +(assert_return (invoke "f64x2.splat" (f64.const 0x0123456789ABCDEFabcdef.)) (v128.const f64x2 0x0123456789ABCDEFabcdef. 0x0123456789ABCDEFabcdef.)) +(assert_return (invoke "f64x2.splat" (f64.const 0123456789e019)) (v128.const f64x2 0123456789e019 0123456789e019)) +(assert_return (invoke "f64x2.splat" (f64.const 0123456789e+019)) (v128.const f64x2 0123456789e+019 0123456789e+019)) +(assert_return (invoke "f64x2.splat" (f64.const 0x0123456789ABCDEFabcdef.p019)) (v128.const f64x2 0x0123456789ABCDEFabcdef.p019 0x0123456789ABCDEFabcdef.p019)) +(assert_return (invoke "f64x2.splat" (f64.const 0x0123456789ABCDEFabcdef.p-019)) (v128.const f64x2 0x0123456789ABCDEFabcdef.p-019 0x0123456789ABCDEFabcdef.p-019)) \ No newline at end of file diff --git a/tests/latch/core/simd_splat_0.wast b/tests/latch/core/simd_splat_0.wast new file mode 100644 index 00000000..39b3b563 --- /dev/null +++ b/tests/latch/core/simd_splat_0.wast @@ -0,0 +1,8 @@ +(module + (func (export "i8x16.splat") (param i32) (result v128) (i8x16.splat (local.get 0))) + (func (export "i16x8.splat") (param i32) (result v128) (i16x8.splat (local.get 0))) + (func (export "i32x4.splat") (param i32) (result v128) (i32x4.splat (local.get 0))) + (func (export "f32x4.splat") (param f32) (result v128) (f32x4.splat (local.get 0))) + (func (export "i64x2.splat") (param i64) (result v128) (i64x2.splat (local.get 0))) + (func (export "f64x2.splat") (param f64) (result v128) (f64x2.splat (local.get 0))) +) \ No newline at end of file diff --git a/tests/latch/core/simd_splat_1.asserts.wast b/tests/latch/core/simd_splat_1.asserts.wast new file mode 100644 index 00000000..3d892695 --- /dev/null +++ b/tests/latch/core/simd_splat_1.asserts.wast @@ -0,0 +1,5 @@ +(assert_return (invoke "as-v128_store-operand-1" (i32.const 1)) (v128.const i8x16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)) +(assert_return (invoke "as-v128_store-operand-2" (i32.const 256)) (v128.const i16x8 0x100 0x100 0x100 0x100 0x100 0x100 0x100 0x100)) +(assert_return (invoke "as-v128_store-operand-3" (i32.const 0xffffffff)) (v128.const i32x4 -1 -1 -1 -1)) +(assert_return (invoke "as-v128_store-operand-4" (i64.const 1)) (v128.const i64x2 1 1)) +(assert_return (invoke "as-v128_store-operand-5" (f64.const -0x1p+0)) (v128.const f64x2 -0x1p+0 -0x1p+0)) \ No newline at end of file diff --git a/tests/latch/core/simd_splat_1.wast b/tests/latch/core/simd_splat_1.wast new file mode 100644 index 00000000..bc6be2e8 --- /dev/null +++ b/tests/latch/core/simd_splat_1.wast @@ -0,0 +1,17 @@ +(module (memory 1) + (func (export "as-v128_store-operand-1") (param i32) (result v128) + (v128.store (i32.const 0) (i8x16.splat (local.get 0))) + (v128.load (i32.const 0))) + (func (export "as-v128_store-operand-2") (param i32) (result v128) + (v128.store (i32.const 0) (i16x8.splat (local.get 0))) + (v128.load (i32.const 0))) + (func (export "as-v128_store-operand-3") (param i32) (result v128) + (v128.store (i32.const 0) (i32x4.splat (local.get 0))) + (v128.load (i32.const 0))) + (func (export "as-v128_store-operand-4") (param i64) (result v128) + (v128.store (i32.const 0) (i64x2.splat (local.get 0))) + (v128.load (i32.const 0))) + (func (export "as-v128_store-operand-5") (param f64) (result v128) + (v128.store (i32.const 0) (f64x2.splat (local.get 0))) + (v128.load (i32.const 0))) +) \ No newline at end of file diff --git a/tests/latch/core/simd_splat_2.asserts.wast b/tests/latch/core/simd_splat_2.asserts.wast new file mode 100644 index 00000000..6e7f0fe3 --- /dev/null +++ b/tests/latch/core/simd_splat_2.asserts.wast @@ -0,0 +1,51 @@ +(assert_return (invoke "as-i8x16_extract_lane_s-operand-first" (i32.const 42)) (i32.const 42)) +(assert_return (invoke "as-i8x16_extract_lane_s-operand-last" (i32.const -42)) (i32.const -42)) +(assert_return (invoke "as-i16x8_extract_lane_s-operand-first" (i32.const 0xffff7fff)) (i32.const 32767)) +(assert_return (invoke "as-i16x8_extract_lane_s-operand-last" (i32.const 0x8000)) (i32.const -32768)) +(assert_return (invoke "as-i32x4_extract_lane_s-operand-first" (i32.const 0x7fffffff)) (i32.const 2147483647)) +(assert_return (invoke "as-i32x4_extract_lane_s-operand-last" (i32.const 0x80000000)) (i32.const -2147483648)) +(assert_return (invoke "as-f32x4_extract_lane_s-operand-first" (f32.const 1.5)) (f32.const 1.5)) +(assert_return (invoke "as-f32x4_extract_lane_s-operand-last" (f32.const -0.25)) (f32.const -0.25)) +(assert_return (invoke "as-v8x16_swizzle-operands" (i32.const 1) (i32.const -1)) (v128.const i8x16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)) +(assert_return (invoke "as-i64x2_extract_lane-operand-last" (i64.const -42)) (i64.const -42)) +(assert_return (invoke "as-i64x2_extract_lane-operand-first" (i64.const 42)) (i64.const 42)) +(assert_return (invoke "as-f64x2_extract_lane-operand-first" (f64.const 1.5)) (f64.const 1.5)) +(assert_return (invoke "as-f64x2_extract_lane-operand-last" (f64.const -0x1p+0)) (f64.const -0x1p+0)) + +(assert_return (invoke "as-i8x16_add_sub-operands" (i32.const 3) (i32.const 2) (i32.const 1)) (v128.const i8x16 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4)) +(assert_return (invoke "as-i16x8_add_sub_mul-operands" (i32.const 257) (i32.const 128) (i32.const 16) (i32.const 16)) (v128.const i16x8 129 129 129 129 129 129 129 129)) +(assert_return (invoke "as-i32x4_add_sub_mul-operands" (i32.const 65535) (i32.const 65537) (i32.const 256) (i32.const 256)) (v128.const i32x4 0x10000 0x10000 0x10000 0x10000)) +(assert_return (invoke "as-i64x2_add_sub_mul-operands" (i64.const 0x7fffffff) (i64.const 0x1_0000_0001) (i64.const 65536) (i64.const 65536)) (v128.const i64x2 0x8000_0000 0x8000_0000)) +(assert_return (invoke "as-f64x2_add_sub_mul-operands" (f64.const 0x1p-1) (f64.const 0.75) (f64.const 0x1p-1) (f64.const 0.5)) (v128.const f64x2 0x1p+0 0x1p+0)) + +(assert_return (invoke "as-i8x16_add_sat_s-operands" (i32.const 0x7f) (i32.const 1)) (v128.const i8x16 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f)) +(assert_return (invoke "as-i16x8_add_sat_s-operands" (i32.const 0x7fff) (i32.const 1)) (v128.const i16x8 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff)) +(assert_return (invoke "as-i8x16_sub_sat_u-operands" (i32.const 0x7f) (i32.const 0xff)) (v128.const i8x16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)) +(assert_return (invoke "as-i16x8_sub_sat_u-operands" (i32.const 0x7fff) (i32.const 0xffff)) (v128.const i16x8 0 0 0 0 0 0 0 0)) + +(assert_return (invoke "as-i8x16_shr_s-operand" (i32.const 0xf0) (i32.const 3)) (v128.const i8x16 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2)) +(assert_return (invoke "as-i16x8_shr_s-operand" (i32.const 0x100) (i32.const 4)) (v128.const i16x8 16 16 16 16 16 16 16 16)) +(assert_return (invoke "as-i32x4_shr_s-operand" (i32.const -1) (i32.const 16)) (v128.const i32x4 -1 -1 -1 -1)) + +(assert_return (invoke "as-v128_and-operands" (i32.const 0x11) (i32.const 0xff)) (v128.const i8x16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17)) +(assert_return (invoke "as-v128_or-operands" (i32.const 0) (i32.const 0xffff)) (v128.const i16x8 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff)) +(assert_return (invoke "as-v128_xor-operands" (i32.const 0xf0f0f0f0) (i32.const 0xffffffff)) (v128.const i32x4 0xf0f0f0f 0xf0f0f0f 0xf0f0f0f 0xf0f0f0f)) + +(assert_return (invoke "as-i8x16_all_true-operand" (i32.const 0)) (i32.const 0)) +(assert_return (invoke "as-i16x8_all_true-operand" (i32.const 0xffff)) (i32.const 1)) +(assert_return (invoke "as-i32x4_all_true-operand1" (i32.const 0xf0f0f0f0)) (i32.const 1)) +(assert_return (invoke "as-i32x4_all_true-operand2" (i64.const -1)) (i32.const 1)) + +(assert_return (invoke "as-i8x16_eq-operands" (i32.const 1) (i32.const 2)) (v128.const i8x16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)) +(assert_return (invoke "as-i16x8_eq-operands" (i32.const -1) (i32.const 65535)) (v128.const i16x8 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff)) +(assert_return (invoke "as-i32x4_eq-operands1" (i32.const -1) (i32.const 0xffffffff)) (v128.const i32x4 0xffffffff 0xffffffff 0xffffffff 0xffffffff)) +(assert_return (invoke "as-f32x4_eq-operands" (f32.const +0.0) (f32.const -0.0)) (v128.const i32x4 0xffffffff 0xffffffff 0xffffffff 0xffffffff)) +(assert_return (invoke "as-i32x4_eq-operands2" (i64.const 1) (i64.const 2)) (v128.const i64x2 0xffffffff00000000 0xffffffff00000000)) +(assert_return (invoke "as-f64x2_eq-operands" (f64.const +0.0) (f64.const -0.0)) (v128.const i64x2 -1 -1)) + +(assert_return (invoke "as-f32x4_abs-operand" (f32.const -1.125)) (v128.const f32x4 1.125 1.125 1.125 1.125)) +(assert_return (invoke "as-f32x4_min-operands" (f32.const 0.25) (f32.const 1e-38)) (v128.const f32x4 1e-38 1e-38 1e-38 1e-38)) +(assert_return (invoke "as-f32x4_div-operands" (f32.const 1.0) (f32.const 8.0)) (v128.const f32x4 0.125 0.125 0.125 0.125)) + +(assert_return (invoke "as-f32x4_convert_s_i32x4-operand" (i32.const 12345)) (v128.const f32x4 12345.0 12345.0 12345.0 12345.0)) +(assert_return (invoke "as-i32x4_trunc_s_f32x4_sat-operand" (f32.const 1.1)) (v128.const i32x4 1 1 1 1)) diff --git a/tests/latch/core/simd_splat_2.wast b/tests/latch/core/simd_splat_2.wast new file mode 100644 index 00000000..819ef5c0 --- /dev/null +++ b/tests/latch/core/simd_splat_2.wast @@ -0,0 +1,119 @@ +(module + ;; Accessing lane + (func (export "as-i8x16_extract_lane_s-operand-first") (param i32) (result i32) + (i8x16.extract_lane_s 0 (i8x16.splat (local.get 0)))) + (func (export "as-i8x16_extract_lane_s-operand-last") (param i32) (result i32) + (i8x16.extract_lane_s 15 (i8x16.splat (local.get 0)))) + (func (export "as-i16x8_extract_lane_s-operand-first") (param i32) (result i32) + (i16x8.extract_lane_s 0 (i16x8.splat (local.get 0)))) + (func (export "as-i16x8_extract_lane_s-operand-last") (param i32) (result i32) + (i16x8.extract_lane_s 7 (i16x8.splat (local.get 0)))) + (func (export "as-i32x4_extract_lane_s-operand-first") (param i32) (result i32) + (i32x4.extract_lane 0 (i32x4.splat (local.get 0)))) + (func (export "as-i32x4_extract_lane_s-operand-last") (param i32) (result i32) + (i32x4.extract_lane 3 (i32x4.splat (local.get 0)))) + (func (export "as-f32x4_extract_lane_s-operand-first") (param f32) (result f32) + (f32x4.extract_lane 0 (f32x4.splat (local.get 0)))) + (func (export "as-f32x4_extract_lane_s-operand-last") (param f32) (result f32) + (f32x4.extract_lane 3 (f32x4.splat (local.get 0)))) + (func (export "as-v8x16_swizzle-operands") (param i32) (param i32) (result v128) + (i8x16.swizzle (i8x16.splat (local.get 0)) (i8x16.splat (local.get 1)))) + (func (export "as-i64x2_extract_lane-operand-first") (param i64) (result i64) + (i64x2.extract_lane 0 (i64x2.splat (local.get 0)))) + (func (export "as-i64x2_extract_lane-operand-last") (param i64) (result i64) + (i64x2.extract_lane 1 (i64x2.splat (local.get 0)))) + (func (export "as-f64x2_extract_lane-operand-first") (param f64) (result f64) + (f64x2.extract_lane 0 (f64x2.splat (local.get 0)))) + (func (export "as-f64x2_extract_lane-operand-last") (param f64) (result f64) + (f64x2.extract_lane 1 (f64x2.splat (local.get 0)))) + + ;; Integer arithmetic + (func (export "as-i8x16_add_sub-operands") (param i32 i32 i32) (result v128) + (i8x16.add (i8x16.splat (local.get 0)) + (i8x16.sub (i8x16.splat (local.get 1)) (i8x16.splat (local.get 2))))) + (func (export "as-i16x8_add_sub_mul-operands") (param i32 i32 i32 i32) (result v128) + (i16x8.add (i16x8.splat (local.get 0)) + (i16x8.sub (i16x8.splat (local.get 1)) + (i16x8.mul (i16x8.splat (local.get 2)) (i16x8.splat (local.get 3)))))) + (func (export "as-i32x4_add_sub_mul-operands") (param i32 i32 i32 i32) (result v128) + (i32x4.add (i32x4.splat (local.get 0)) + (i32x4.sub (i32x4.splat (local.get 1)) + (i32x4.mul (i32x4.splat (local.get 2)) (i32x4.splat (local.get 3)))))) + + (func (export "as-i64x2_add_sub_mul-operands") (param i64 i64 i64 i64) (result v128) + (i64x2.add (i64x2.splat (local.get 0)) + (i64x2.sub (i64x2.splat (local.get 1)) + (i64x2.mul (i64x2.splat (local.get 2)) (i64x2.splat (local.get 3)))))) + (func (export "as-f64x2_add_sub_mul-operands") (param f64 f64 f64 f64) (result v128) + (f64x2.add (f64x2.splat (local.get 0)) + (f64x2.sub (f64x2.splat (local.get 1)) + (f64x2.mul (f64x2.splat (local.get 2)) (f64x2.splat (local.get 3)))))) + + ;; Saturating integer arithmetic + (func (export "as-i8x16_add_sat_s-operands") (param i32 i32) (result v128) + (i8x16.add_sat_s (i8x16.splat (local.get 0)) (i8x16.splat (local.get 1)))) + (func (export "as-i16x8_add_sat_s-operands") (param i32 i32) (result v128) + (i16x8.add_sat_s (i16x8.splat (local.get 0)) (i16x8.splat (local.get 1)))) + (func (export "as-i8x16_sub_sat_u-operands") (param i32 i32) (result v128) + (i8x16.sub_sat_u (i8x16.splat (local.get 0)) (i8x16.splat (local.get 1)))) + (func (export "as-i16x8_sub_sat_u-operands") (param i32 i32) (result v128) + (i16x8.sub_sat_u (i16x8.splat (local.get 0)) (i16x8.splat (local.get 1)))) + + ;; Bit shifts + (func (export "as-i8x16_shr_s-operand") (param i32 i32) (result v128) + (i8x16.shr_s (i8x16.splat (local.get 0)) (local.get 1))) + (func (export "as-i16x8_shr_s-operand") (param i32 i32) (result v128) + (i16x8.shr_s (i16x8.splat (local.get 0)) (local.get 1))) + (func (export "as-i32x4_shr_s-operand") (param i32 i32) (result v128) + (i32x4.shr_s (i32x4.splat (local.get 0)) (local.get 1))) + + ;; Bitwise operantions + (func (export "as-v128_and-operands") (param i32 i32) (result v128) + (v128.and (i8x16.splat (local.get 0)) (i8x16.splat (local.get 1)))) + (func (export "as-v128_or-operands") (param i32 i32) (result v128) + (v128.or (i16x8.splat (local.get 0)) (i16x8.splat (local.get 1)))) + (func (export "as-v128_xor-operands") (param i32 i32) (result v128) + (v128.xor (i32x4.splat (local.get 0)) (i32x4.splat (local.get 1)))) + + ;; Boolean horizontal reductions + (func (export "as-i8x16_all_true-operand") (param i32) (result i32) + (i8x16.all_true (i8x16.splat (local.get 0)))) + (func (export "as-i16x8_all_true-operand") (param i32) (result i32) + (i16x8.all_true (i16x8.splat (local.get 0)))) + (func (export "as-i32x4_all_true-operand1") (param i32) (result i32) + (i32x4.all_true (i32x4.splat (local.get 0)))) + (func (export "as-i32x4_all_true-operand2") (param i64) (result i32) + (i32x4.all_true (i64x2.splat (local.get 0)))) + + ;; Comparisons + (func (export "as-i8x16_eq-operands") (param i32 i32) (result v128) + (i8x16.eq (i8x16.splat (local.get 0)) (i8x16.splat (local.get 1)))) + (func (export "as-i16x8_eq-operands") (param i32 i32) (result v128) + (i16x8.eq (i16x8.splat (local.get 0)) (i16x8.splat (local.get 1)))) + (func (export "as-i32x4_eq-operands1") (param i32 i32) (result v128) + (i32x4.eq (i32x4.splat (local.get 0)) (i32x4.splat (local.get 1)))) + (func (export "as-i32x4_eq-operands2") (param i64 i64) (result v128) + (i32x4.eq (i64x2.splat (local.get 0)) (i64x2.splat (local.get 1)))) + (func (export "as-f32x4_eq-operands") (param f32 f32) (result v128) + (f32x4.eq (f32x4.splat (local.get 0)) (f32x4.splat (local.get 1)))) + (func (export "as-f64x2_eq-operands") (param f64 f64) (result v128) + (f64x2.eq (f64x2.splat (local.get 0)) (f64x2.splat (local.get 1)))) + + ;; Floating-point sign bit operations + (func (export "as-f32x4_abs-operand") (param f32) (result v128) + (f32x4.abs (f32x4.splat (local.get 0)))) + + ;; Floating-point min + (func (export "as-f32x4_min-operands") (param f32 f32) (result v128) + (f32x4.min (f32x4.splat (local.get 0)) (f32x4.splat (local.get 1)))) + + ;; Floating-point arithmetic + (func (export "as-f32x4_div-operands") (param f32 f32) (result v128) + (f32x4.div (f32x4.splat (local.get 0)) (f32x4.splat (local.get 1)))) + + ;; Conversions + (func (export "as-f32x4_convert_s_i32x4-operand") (param i32) (result v128) + (f32x4.convert_i32x4_s (i32x4.splat (local.get 0)))) + (func (export "as-i32x4_trunc_s_f32x4_sat-operand") (param f32) (result v128) + (i32x4.trunc_sat_f32x4_s (f32x4.splat (local.get 0)))) +) \ No newline at end of file diff --git a/tutorials/wat/main/simd.wat b/tutorials/wat/main/simd.wat index ba74cbc7..d39cf55e 100644 --- a/tutorials/wat/main/simd.wat +++ b/tutorials/wat/main/simd.wat @@ -2,85 +2,11 @@ (import "env" "print_int" (func $print.int (type $i32->void))) (type $void->void (func)) (type $i32->void (func (param i32))) -;; (type $void->v128 (func (result v128))) - -;; (func $build (type $void->v128) -;; (i32.const 0) -;; i16x8.splat -;; i32.const 1 -;; i16x8.replace_lane 0 -;; i32.const 2 -;; i16x8.replace_lane 1 -;; i32.const 3 -;; i16x8.replace_lane 2 -;; i32.const 4 -;; i16x8.replace_lane 3 -;; i32.const 5 -;; i16x8.replace_lane 4 -;; i32.const 6 -;; i16x8.replace_lane 5 -;; i32.const 7 -;; i16x8.replace_lane 6 -;; i32.const 8 -;; i16x8.replace_lane 7 -;; ) (func $run (type $void->void) - (i32.const 123456) - i32x4.splat + v128.const i32x4 1 2 3 4 i32x4.extract_lane 0 call $print.int - -;; call $build -;; local.set $temp - -;; local.get $temp - i32.const 0 - i16x8.splat - i16x8.extract_lane_s 0 - call $print.int - -;; local.get $temp - i32.const 0 - i16x8.splat - i16x8.extract_lane_s 1 - call $print.int - -;; local.get $temp - i32.const 0 - i16x8.splat - i16x8.extract_lane_s 2 - call $print.int - -;; local.get $temp - i32.const 0 - i16x8.splat - i16x8.extract_lane_s 3 - call $print.int - -;; local.get $temp - i32.const 0 - i16x8.splat - i16x8.extract_lane_s 4 - call $print.int - -;; local.get $temp - i32.const 0 - i16x8.splat - i16x8.extract_lane_s 5 - call $print.int - -;; local.get $temp - i32.const 0 - i16x8.splat - i16x8.extract_lane_s 6 - call $print.int - -;; local.get $temp - i32.const 0 - i16x8.splat - i16x8.extract_lane_s 7 - call $print.int ) (export "main" (func $run)) diff --git a/tutorials/wat/main/simd2.wat b/tutorials/wat/main/simd2.wat new file mode 100644 index 00000000..2657e701 --- /dev/null +++ b/tutorials/wat/main/simd2.wat @@ -0,0 +1,52 @@ +(module + (import "env" "print_int" (func $print.int (type $i32->void))) + (type $void->void (func)) + (type $i32->void (func (param i32))) + (type $void->v128 (func (result v128))) + + (memory 1) + + (func $build (type $void->v128) + (i32.const 0) + i16x8.splat + i32.const 1 + i16x8.replace_lane 0 + i32.const 2 + i16x8.replace_lane 1 + i32.const 3 + i16x8.replace_lane 2 + i32.const 4 + i16x8.replace_lane 3 + i32.const 5 + i16x8.replace_lane 4 + i32.const 6 + i16x8.replace_lane 5 + i32.const 7 + i16x8.replace_lane 6 + i32.const 8 + i16x8.replace_lane 7 + ) + + (func $run (type $void->void) + (i32.const 123456) + i32x4.splat + i32x4.extract_lane 0 + call $print.int + + call $build + i16x8.extract_lane_s 0 + call $print.int + + call $build + i16x8.extract_lane_s 1 + call $print.int + + call $build + i16x8.extract_lane_s 2 + call $print.int + + (v128.store (i32.const 0) (i8x16.splat (i32.const 0))) + ) + + (export "main" (func $run)) +) \ No newline at end of file From a7cea4ea1b7e692d8e7d76f114811c6323c4c961 Mon Sep 17 00:00:00 2001 From: jay-tux Date: Thu, 3 Oct 2024 11:27:28 +0200 Subject: [PATCH 3/7] Add support for v128.const, v128.load, v128.store --- src/Interpreter/instructions.cpp | 88 ++++++++++++++++++++++++++++++++ src/Interpreter/instructions.h | 8 ++- src/Interpreter/interpreter.cpp | 5 ++ src/WARDuino/WARDuino.cpp | 2 +- tutorials/wat/main/simd.wat | 35 ++++++++++++- 5 files changed, 134 insertions(+), 4 deletions(-) diff --git a/src/Interpreter/instructions.cpp b/src/Interpreter/instructions.cpp index 41e4fbd2..1674042c 100644 --- a/src/Interpreter/instructions.cpp +++ b/src/Interpreter/instructions.cpp @@ -1394,3 +1394,91 @@ bool i_instr_simd_replace(Module *m, uint8_t opcode) { return false; } + +inline bool verify_endian() { + static bool _ = [] { + int n = 1; + if(*reinterpret_cast(&n) == 1) { + // little endian + return true; + } + + FATAL("v128.const only supported on little-endian systems"); + return false; + }(); + return _; +} + +bool i_instr_simd_const(Module* m){ + verify_endian(); + + const uint8_t *data = m->pc_ptr; + m->pc_ptr += 16; // skip immediate 16-byte data + + m->sp++; + auto &v = m->stack[m->sp].value.simd; + std::memcpy(&v, data, 16); + return true; +} + +bool i_instr_simd_store(Module* m){ + auto &sv = m->stack[m->sp--]; + StackValue sv2; + sv2.value_type = I64; + sv2.value.uint64 = sv.value.simd.i64x2[1]; + + const uint32_t flags = read_LEB_32(&m->pc_ptr); + const uint32_t offset = read_LEB_32(&m->pc_ptr); + + uint32_t ptr = m->stack[m->sp--].value.uint32; + + if(flags != 2 && TRACE) { + dbg_info( + " - unaligned store - flags: 0x%x, offset: 0x%x, addr: 0x%x, val: %s\n", + flags, offset, ptr, value_repr(&sv) + ); + } + + if(offset + ptr < ptr && !m->options.disable_memory_bounds) { + Interpreter::report_overflow(m, m->memory.bytes + offset + ptr); + } + + ptr += offset; + + // store in 2 consecutive locations + return m->warduino->interpreter->store(m, I64, ptr, sv) && + m->warduino->interpreter->store(m, I64, ptr + 8, sv2); +} + +bool i_instr_simd_load(Module* m) { + const uint32_t flags = read_LEB_32(&m->pc_ptr); + const uint32_t offset = read_LEB_32(&m->pc_ptr); + uint32_t ptr = m->stack[m->sp--].value.uint32; + if(flags != 2 && TRACE) { + dbg_info( + " - unaligned load - flags: 0x%x, offset: 0x%x, addr: 0x%x, val: %s\n", + flags, offset, ptr + ); + } + + if(offset + ptr < ptr && !m->options.disable_memory_bounds) { + Interpreter::report_overflow(m, m->memory.bytes + offset + ptr); + } + + ptr += offset; + + // load from 2 consecutive locations + bool success = m->warduino->interpreter->load(m, I64, ptr, offset); + const auto i64_0 = m->stack[m->sp].value.int64; + m->sp--; // make sure we overwrite the previous load + success &= m->warduino->interpreter->load(m, I64, ptr + 8, offset); + const auto i64_1 = m->stack[m->sp].value.int64; + + // reconstruct v128 + auto & [value_type, value] = m->stack[m->sp]; + value_type = V128; + value.simd.i64x2[0] = i64_0; + value.simd.i64x2[1] = i64_1; + + return success; +} diff --git a/src/Interpreter/instructions.h b/src/Interpreter/instructions.h index 5caf3bce..9d4732de 100644 --- a/src/Interpreter/instructions.h +++ b/src/Interpreter/instructions.h @@ -78,4 +78,10 @@ bool i_instr_simd_splat(Module *m, uint8_t opcode); bool i_instr_simd_extract(Module *m, uint8_t opcode); -bool i_instr_simd_replace(Module *m, uint8_t opcode); \ No newline at end of file +bool i_instr_simd_replace(Module *m, uint8_t opcode); + +bool i_instr_simd_const(Module *m); + +bool i_instr_simd_store(Module *m); + +bool i_instr_simd_load(Module *m); \ No newline at end of file diff --git a/src/Interpreter/interpreter.cpp b/src/Interpreter/interpreter.cpp index 82b63b69..d54855ac 100644 --- a/src/Interpreter/interpreter.cpp +++ b/src/Interpreter/interpreter.cpp @@ -480,6 +480,11 @@ bool Interpreter::interpret_simd(Module *m) { const auto opcode = *m->pc_ptr; m->pc_ptr++; switch(opcode) { + case 0x00: return i_instr_simd_load(m); + + case 0x0b: return i_instr_simd_store(m); + case 0x0c: return i_instr_simd_const(m); + case 0x0f ... 0x14: return i_instr_simd_splat(m, opcode); diff --git a/src/WARDuino/WARDuino.cpp b/src/WARDuino/WARDuino.cpp index a08cc6e5..504cb69e 100644 --- a/src/WARDuino/WARDuino.cpp +++ b/src/WARDuino/WARDuino.cpp @@ -148,7 +148,7 @@ void skip_immediates_simd(uint8_t **pos) { read_LEB_32(pos); break; case 0x0c: // v128.const - // TODO: figure out how in the 9 hells i128's are stored in wasm + *pos += 16; // v128 consts are straight 16-byte blocks break; case 0x0d: // i8x16.shuffle *pos += 1; diff --git a/tutorials/wat/main/simd.wat b/tutorials/wat/main/simd.wat index d39cf55e..ea3c96a9 100644 --- a/tutorials/wat/main/simd.wat +++ b/tutorials/wat/main/simd.wat @@ -2,10 +2,41 @@ (import "env" "print_int" (func $print.int (type $i32->void))) (type $void->void (func)) (type $i32->void (func (param i32))) + (memory 1) (func $run (type $void->void) - v128.const i32x4 1 2 3 4 - i32x4.extract_lane 0 + (v128.store (i32.const 0) (v128.const i16x8 1 2 3 4 5 6 7 8)) + + (v128.load (i32.const 0)) + i16x8.extract_lane_s 0 + call $print.int + + (v128.load (i32.const 0)) + i16x8.extract_lane_s 1 + call $print.int + + (v128.load (i32.const 0)) + i16x8.extract_lane_s 2 + call $print.int + + (v128.load (i32.const 0)) + i16x8.extract_lane_s 3 + call $print.int + + (v128.load (i32.const 0)) + i16x8.extract_lane_s 4 + call $print.int + + (v128.load (i32.const 0)) + i16x8.extract_lane_s 5 + call $print.int + + (v128.load (i32.const 0)) + i16x8.extract_lane_s 6 + call $print.int + + (v128.load (i32.const 0)) + i16x8.extract_lane_s 7 call $print.int ) From ce287be2ce63ad513204fd34b2924173a9bc5ecd Mon Sep 17 00:00:00 2001 From: jay-tux Date: Fri, 4 Oct 2024 14:55:13 +0200 Subject: [PATCH 4/7] Add support to print out v128 values --- src/Debug/debugger.cpp | 6 +++ src/Interpreter/instructions.cpp | 15 +++--- src/Utils/util.cpp | 5 ++ tests/latch/latch-0.3.0.tgz | Bin 56161 -> 56365 bytes tests/latch/package-lock.json | 11 ++--- tests/latch/src/spec.test.ts | 1 - tests/latch/src/util/spec.util.ts | 73 ++++++++++++++++++++++++++++++ tutorials/wat/main/simd.wat | 2 +- 8 files changed, 97 insertions(+), 16 deletions(-) diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index 0e1aa087..7abbfcb0 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -361,6 +361,12 @@ void Debugger::printValue(StackValue *v, uint32_t idx, bool end = false) const { snprintf(buff, 255, R"("type":"F64","value":"%)" PRIx64 "\"", v->value.uint64); break; + case V128: + // we'll just use hex-strings + // 64-bit = 8 bytes = 16 nibbles = 16 hex-characters + snprintf(buff, 255, R"("type":"V128","value":"%016lx%016lx")", + v->value.simd.i64x2[0], v->value.simd.i64x2[1]); + break; default: snprintf(buff, 255, R"("type":"%02x","value":"%)" PRIx64 "\"", v->value_type, v->value.uint64); diff --git a/src/Interpreter/instructions.cpp b/src/Interpreter/instructions.cpp index 1674042c..84136591 100644 --- a/src/Interpreter/instructions.cpp +++ b/src/Interpreter/instructions.cpp @@ -1336,25 +1336,25 @@ bool i_instr_simd_extract(Module* m, uint8_t opcode){ }; switch(opcode) { // TODO: we ignore the _s and _u for now... - case 0x15: // i8x16.extract_lane_s + case 0x15: // i8x16.extract_lane_s case 0x16: // i8x16.extract_lane_u return lane_handler(15, raw_top.value.simd.i8x16, raw_top.value.uint32, I32); - case 0x18: // i16x8.extract_lane_s + case 0x18: // i16x8.extract_lane_s case 0x19: // i16x8.extract_lane_u - return lane_handler(8, raw_top.value.simd.i16x8, raw_top.value.uint32, I32); + return lane_handler(7, raw_top.value.simd.i16x8, raw_top.value.uint32, I32); case 0x1b: // i32x4.extract_lane - return lane_handler(4, raw_top.value.simd.i32x4, raw_top.value.uint32, I32); + return lane_handler(3, raw_top.value.simd.i32x4, raw_top.value.uint32, I32); case 0x1d: // i64x2.extract_lane - return lane_handler(2, raw_top.value.simd.i64x2, raw_top.value.uint64, I64); + return lane_handler(1, raw_top.value.simd.i64x2, raw_top.value.uint64, I64); case 0x1f: // f32x4.extract_lane - return lane_handler(4, raw_top.value.simd.f32x4, raw_top.value.uint32, F32); + return lane_handler(3, raw_top.value.simd.f32x4, raw_top.value.uint32, F32); case 0x21: // f64x2.extract_lane - return lane_handler(2, raw_top.value.simd.f64x2, raw_top.value.uint64, F64); + return lane_handler(1, raw_top.value.simd.f64x2, raw_top.value.uint64, F64); } return false; @@ -1418,6 +1418,7 @@ bool i_instr_simd_const(Module* m){ m->sp++; auto &v = m->stack[m->sp].value.simd; std::memcpy(&v, data, 16); + m->stack[m->sp].value_type = V128; return true; } diff --git a/src/Utils/util.cpp b/src/Utils/util.cpp index 7455bb3f..789ee7df 100644 --- a/src/Utils/util.cpp +++ b/src/Utils/util.cpp @@ -110,6 +110,11 @@ StackValue *readWasmArgs(Type function, uint8_t *data) { data += sizeof(double); break; } + case V128: { + memcpy(&args[i].value.simd, data, 16 * sizeof(decltype(args[i].value.simd))); + data += sizeof(decltype(args[i].value.simd)); + break; + } default: { FATAL("no argument of type %" SCNu8 "\n", args[i].value_type); } diff --git a/tests/latch/latch-0.3.0.tgz b/tests/latch/latch-0.3.0.tgz index b916137f2fdb9a160b13da05774101fe06c17cec..fcbcfaf1f4d226d86d19c71909c5ad2677ba992c 100644 GIT binary patch literal 56365 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 z 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 16 elems; pad 2 +// 16b -> 8 elems, pad 4 +// 32b -> 4 elems, pad 8 +// 64b -> 2 elems, pad 16 +// -> 128 / b elems; pad b / 4 + +function parseV128(type: string, args: string[]): string | undefined { + const int_lambda = (bit_width: number, mask: bigint): string|undefined => { + const elems = 128 / bit_width; + const pad_len = bit_width / 4; + + if(args.length !== elems) return undefined; + return args + .map(str => str.replace(/_/gi, '')) // WASM allows _ in numbers, TS doesn't like those + .map(str => { + let start_idx = 0; + let sign = 1; + if(str.startsWith('-')) { sign = -1; start_idx = 1; } + else if(str.startsWith('+')) { start_idx = 1; } + return BigInt(sign) * BigInt(str.slice(start_idx)) + }) // parse to (big)-int + .map(num => num & mask) // ensure correct bit width + .map(num => num.toString(16).padStart(pad_len, '0')) // convert to hex + .reduce((acc, val) => acc + val, ''); // concat + }; + + const float_lambda = (bit_width: number, mask: bigint, flt2bigint: (flt: number, ab: ArrayBuffer) => bigint): string|undefined => { + const elems = 128 / bit_width; + const pad_len = bit_width / 4; + + if(args.length !== elems) return undefined; + return args + .map(str => str.replace(/_/gi, '')) // WASM allows _ in numbers, TS doesn't like those + .map(str => parseFloat(str)) // parse to float ~ might not accept all floats + .map(flt => { + const buf = new ArrayBuffer(bit_width / 8); + return flt2bigint(flt, buf) & mask; + }) + .map(num => num.toString(16).padStart(pad_len, '0')) // convert to hex + .reduce((acc, str) => acc + str, ''); // concat + }; + + const flt32_lambda = (flt: number, ab: ArrayBuffer) => { + const fltBuffer = new Float32Array(ab); + fltBuffer[0] = flt; + const intBuffer = new Int32Array(ab); + return BigInt(intBuffer[0]); + }; + + const flt64_lambda = (flt: number, ab: ArrayBuffer) => { + const fltBuffer = new Float64Array(ab); + fltBuffer[0] = flt; + const intBuffer = new BigInt64Array(ab); + return intBuffer[0]; + }; + + switch(type) { + case 'i8x16': return int_lambda(8, 0x00000000000000ffn); + case 'i16x8': return int_lambda(16, 0x000000000000ffffn); + case 'i32x4': return int_lambda(32, 0x00000000ffffffffn); + case 'i64x2': return int_lambda(64, 0xffffffffffffffffn); + + case 'f32x4': return float_lambda(32, 0x00000000ffffffffn, flt32_lambda); + case 'f64x2': return float_lambda(64, 0xffffffffffffffffn, flt64_lambda); + + default: return undefined; + } +} + export function parseResult(input: string): WASM.Value | undefined { let cursor = 0; let delta: number = consume(input, cursor, /\(/d); @@ -22,6 +91,9 @@ export function parseResult(input: string): WASM.Value | undefined { delta = consume(input, cursor, /^[^)]*/d); if (type === WASM.Type.f32 || type === WASM.Type.f64) { value = parseHexFloat(input.slice(cursor, cursor + delta)); + } else if(type === WASM.Type.v128) { + const slice = input.slice(cursor, cursor + delta).split(' ').filter(x => x.trim() !== ''); // [dim, arg1, ...] + value = parseV128(slice[0], slice.slice(1)); } else { value = parseInteger(input.slice(cursor, cursor + delta)); } @@ -46,6 +118,7 @@ export function parseArguments(input: string, index: Cursor): WASM.Value[] { delta = consume(input, cursor, /^[^.)]*/d); const type: WASM.Type = WASM.typing.get(input.slice(cursor + delta - 3, cursor + delta)) ?? WASM.Type.i64; + // console.log(`arg #${args.length}.type: ${input.slice(cursor + delta - 3, cursor + delta)}`); cursor += delta + consume(input, cursor + delta, /^[^)]*const /d); delta = consume(input, cursor, /^[^)]*/d); diff --git a/tutorials/wat/main/simd.wat b/tutorials/wat/main/simd.wat index ea3c96a9..d81dfd24 100644 --- a/tutorials/wat/main/simd.wat +++ b/tutorials/wat/main/simd.wat @@ -5,7 +5,7 @@ (memory 1) (func $run (type $void->void) - (v128.store (i32.const 0) (v128.const i16x8 1 2 3 4 5 6 7 8)) + (v128.store (i32.const 0) (v128.const i16x8 -1 2 -3 4 -5 6 -7 8)) (v128.load (i32.const 0)) i16x8.extract_lane_s 0 From 4f4dc5e5e526f1d63d29ecb1c8533bb87be5d144 Mon Sep 17 00:00:00 2001 From: jay-tux Date: Tue, 8 Oct 2024 13:30:07 +0200 Subject: [PATCH 5/7] SIMD spec tests (splat_0 and splat_1) succeed --- src/Debug/debugger.cpp | 3 + src/Utils/util.cpp | 14 ++-- tests/latch/latch-0.3.0.tgz | Bin 56365 -> 58886 bytes tests/latch/package-lock.json | 8 +-- tests/latch/src/util/spec.util.ts | 107 ++++++++++++++++-------------- tutorials/wat/main/simd.wat | 35 +--------- 6 files changed, 78 insertions(+), 89 deletions(-) diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index 7abbfcb0..3aa00bfb 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -572,6 +572,9 @@ void Debugger::dumpLocals(Module *m) const { snprintf(_value_str, 255, R"("type":"F64","value":%.7f)", v->value.f64); break; + case V128: + snprintf(_value_str, 255, R"("type":"V128","value":"%016lx%016lx")", + v->value.simd.i64x2[0], v->value.simd.i64x2[1]); default: snprintf(_value_str, 255, R"("type":"%02x","value":"%)" PRIx64 "\"", diff --git a/src/Utils/util.cpp b/src/Utils/util.cpp index 789ee7df..305064fb 100644 --- a/src/Utils/util.cpp +++ b/src/Utils/util.cpp @@ -61,9 +61,11 @@ uint64_t read_LEB_(uint8_t **pos, uint32_t maxbits, bool sign) { FATAL("Unsigned LEB at byte %p overflow", (void *)startpos); } } + if (sign && (shift < maxbits) && (byte & 0x40u)) { // Sign extend by highest bits set 1 except last shift bits - result |= UINT64_MAX << shift; + const auto old = result; + result |= (~0ul) << shift; } return result; } @@ -92,26 +94,30 @@ StackValue *readWasmArgs(Type function, uint8_t *data) { switch (args[i].value_type) { case I32: { - args[i].value.int32 = read_LEB_signed(&data, 32); + args[i].value.uint32 = read_LEB_signed(&data, 32); break; } case F32: { memcpy(&args[i].value.f32, data, sizeof(float)); // todo read ieee 754 + printf("Received F32 %f (%02x%02x%02x%02x)", args[i].value.f32, data[0], data[1], data[2], data[3]); data += sizeof(float); break; } case I64: { - args[i].value.int64 = read_LEB_signed(&data, 64); + args[i].value.uint64 = read_LEB_signed(&data, 64); break; } case F64: { memcpy(&args[i].value.f64, data, sizeof(double)); + printf("Received F64 %lf (%02x%02x%02x%02x%02x%02x%02x%02x)", + args[i].value.f64, data[0], data[1], data[2], data[3], + data[4], data[5], data[6], data[7]); data += sizeof(double); break; } case V128: { - memcpy(&args[i].value.simd, data, 16 * sizeof(decltype(args[i].value.simd))); + memcpy(&args[i].value.simd, data, sizeof(decltype(args[i].value.simd))); data += sizeof(decltype(args[i].value.simd)); break; } diff --git a/tests/latch/latch-0.3.0.tgz b/tests/latch/latch-0.3.0.tgz index fcbcfaf1f4d226d86d19c71909c5ad2677ba992c..f6d591b9e40959e992b9cb40f4b26d9bd522189c 100644 GIT binary patch literal 58886 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 16 elems; pad 2 -// 16b -> 8 elems, pad 4 -// 32b -> 4 elems, pad 8 -// 64b -> 2 elems, pad 16 -// -> 128 / b elems; pad b / 4 +function float32HexStr(x: number): string { + const ab = new ArrayBuffer(4); + const fb = new Float32Array(ab); + fb[0] = x; + const ui8 = new Uint8Array(ab); + let res = ''; + for (let i = 3; i >= 0; i--) { + res += ui8[i].toString(16).padStart(2, '0'); + } + return res; +} + +function float64HexStr(x: number): string { + const ab = new ArrayBuffer(8); + const fb = new Float64Array(ab); + fb[0] = x; + const ui8 = new Uint8Array(ab); + let res = ''; + for (let i = 7; i >= 0; i--) { + res += ui8[i].toString(16).padStart(2, '0'); + } + return res; +} + +function parseWasmFloat32(str: string) { + const strBuf = str.replace(/_/gi, ''); // remove those damned underscores + + const flt = parseHexFloat(strBuf); + const res = float32HexStr(flt); + return res; +} + +function parseWasmFloat64(str: string): string|undefined { + const strBuf = str.replace(/_/gi, ''); // remove those damned underscores + + // just use hexFloat - it works for 64-bit floats + const flt = parseHexFloat(strBuf); + const res = float64HexStr(flt); + return res; +} function parseV128(type: string, args: string[]): string | undefined { const int_lambda = (bit_width: number, mask: bigint): string|undefined => { @@ -17,7 +52,7 @@ function parseV128(type: string, args: string[]): string | undefined { const pad_len = bit_width / 4; if(args.length !== elems) return undefined; - return args + const res = args .map(str => str.replace(/_/gi, '')) // WASM allows _ in numbers, TS doesn't like those .map(str => { let start_idx = 0; @@ -29,37 +64,15 @@ function parseV128(type: string, args: string[]): string | undefined { .map(num => num & mask) // ensure correct bit width .map(num => num.toString(16).padStart(pad_len, '0')) // convert to hex .reduce((acc, val) => acc + val, ''); // concat + return res; }; - const float_lambda = (bit_width: number, mask: bigint, flt2bigint: (flt: number, ab: ArrayBuffer) => bigint): string|undefined => { - const elems = 128 / bit_width; - const pad_len = bit_width / 4; - - if(args.length !== elems) return undefined; - return args - .map(str => str.replace(/_/gi, '')) // WASM allows _ in numbers, TS doesn't like those - .map(str => parseFloat(str)) // parse to float ~ might not accept all floats - .map(flt => { - const buf = new ArrayBuffer(bit_width / 8); - return flt2bigint(flt, buf) & mask; - }) - .map(num => num.toString(16).padStart(pad_len, '0')) // convert to hex - .reduce((acc, str) => acc + str, ''); // concat - }; - - const flt32_lambda = (flt: number, ab: ArrayBuffer) => { - const fltBuffer = new Float32Array(ab); - fltBuffer[0] = flt; - const intBuffer = new Int32Array(ab); - return BigInt(intBuffer[0]); - }; - - const flt64_lambda = (flt: number, ab: ArrayBuffer) => { - const fltBuffer = new Float64Array(ab); - fltBuffer[0] = flt; - const intBuffer = new BigInt64Array(ab); - return intBuffer[0]; - }; + const float_lambda = (elem_count: number, parser: (s: string) => string|undefined): string|undefined => { + if(args.length !== elem_count) return undefined; + const parsed = args.map(str => parser(str)); + if(parsed.some(str => str === undefined)) return undefined; + return parsed.reduce((acc, val) => acc + (val as string), ''); + } switch(type) { case 'i8x16': return int_lambda(8, 0x00000000000000ffn); @@ -67,8 +80,8 @@ function parseV128(type: string, args: string[]): string | undefined { case 'i32x4': return int_lambda(32, 0x00000000ffffffffn); case 'i64x2': return int_lambda(64, 0xffffffffffffffffn); - case 'f32x4': return float_lambda(32, 0x00000000ffffffffn, flt32_lambda); - case 'f64x2': return float_lambda(64, 0xffffffffffffffffn, flt64_lambda); + case 'f32x4': return float_lambda(4, parseWasmFloat32); + case 'f64x2': return float_lambda(2, parseWasmFloat64); default: return undefined; } @@ -118,11 +131,10 @@ export function parseArguments(input: string, index: Cursor): WASM.Value[] { delta = consume(input, cursor, /^[^.)]*/d); const type: WASM.Type = WASM.typing.get(input.slice(cursor + delta - 3, cursor + delta)) ?? WASM.Type.i64; - // console.log(`arg #${args.length}.type: ${input.slice(cursor + delta - 3, cursor + delta)}`); cursor += delta + consume(input, cursor + delta, /^[^)]*const /d); delta = consume(input, cursor, /^[^)]*/d); - let maybe: number | undefined; + let maybe: number | bigint | undefined; if (type === WASM.Type.f32 || type === WASM.Type.f64) { maybe = parseHexFloat(input.slice(cursor, cursor + delta)); } else { @@ -179,6 +191,10 @@ function parseHexFloat(input: string): number { return Infinity; } + if (input.includes('e')) { + return parseFloat(input); + } + const radix: number = input.includes('0x') ? 16 : 10; let base: string = input, mantissa, exponent = 0; @@ -200,16 +216,11 @@ function parseHexFloat(input: string): number { return mantissa * Math.pow(2, exponent); } -function parseInteger(hex: string, bytes: number = 4): number { - if (!hex.includes('0x')) { - return parseInt(hex); - } - const mask = parseInt('0x80' + '00'.repeat(bytes - 1), 16); - let integer = parseInt(hex, 16); - if (integer >= mask) { - integer = integer - mask * 2; +function parseInteger(hex: string, bytes: number = 4): bigint { + if(hex.startsWith('-')) { + return BigInt(-1) * BigInt(hex.slice(1)); } - return integer; + return BigInt(hex); } export function find(regex: RegExp, input: string) { diff --git a/tutorials/wat/main/simd.wat b/tutorials/wat/main/simd.wat index d81dfd24..18d6bc4c 100644 --- a/tutorials/wat/main/simd.wat +++ b/tutorials/wat/main/simd.wat @@ -5,39 +5,8 @@ (memory 1) (func $run (type $void->void) - (v128.store (i32.const 0) (v128.const i16x8 -1 2 -3 4 -5 6 -7 8)) - - (v128.load (i32.const 0)) - i16x8.extract_lane_s 0 - call $print.int - - (v128.load (i32.const 0)) - i16x8.extract_lane_s 1 - call $print.int - - (v128.load (i32.const 0)) - i16x8.extract_lane_s 2 - call $print.int - - (v128.load (i32.const 0)) - i16x8.extract_lane_s 3 - call $print.int - - (v128.load (i32.const 0)) - i16x8.extract_lane_s 4 - call $print.int - - (v128.load (i32.const 0)) - i16x8.extract_lane_s 5 - call $print.int - - (v128.load (i32.const 0)) - i16x8.extract_lane_s 6 - call $print.int - - (v128.load (i32.const 0)) - i16x8.extract_lane_s 7 - call $print.int + (i64x2.splat (i64.const -9223372036854775808)) + drop ) (export "main" (func $run)) From 3fd00f808288856ec384e54b4ad5a0e017cde4d9 Mon Sep 17 00:00:00 2001 From: jay-tux Date: Thu, 10 Oct 2024 09:41:26 +0200 Subject: [PATCH 6/7] SIMD instructions necessary for ULPPack --- src/Interpreter/instructions.cpp | 509 +++++++++++++++++++++++++++++- src/Interpreter/instructions.h | 12 +- src/Interpreter/interpreter.cpp | 223 ++++++++++++- tests/latch/latch-0.3.0.tgz | Bin 58886 -> 59219 bytes tests/latch/package-lock.json | 2 +- tests/latch/src/util/spec.util.ts | 5 +- tutorials/wat/main/simd.wat | 67 +++- 7 files changed, 805 insertions(+), 13 deletions(-) diff --git a/src/Interpreter/instructions.cpp b/src/Interpreter/instructions.cpp index 84136591..084941ba 100644 --- a/src/Interpreter/instructions.cpp +++ b/src/Interpreter/instructions.cpp @@ -1335,14 +1335,32 @@ bool i_instr_simd_extract(Module* m, uint8_t opcode){ return true; }; - switch(opcode) { // TODO: we ignore the _s and _u for now... + auto lane_handler_unsigned = [&raw_top, lane](const int max, I *in, O &out, const uint8_t type) { + if(lane > max) { + sprintf(exception, "lane index out of bounds (%d > %d)", lane, max); + return false; + } + + // type switcher between uint8 and uint16 based on input type + using temp_t = std::conditional_t, uint8_t, uint16_t>; + temp_t x; + memcpy(&x, &in[lane], sizeof(temp_t)); + out = x; + raw_top.value_type = type; + + return true; + }; + + switch(opcode) { case 0x15: // i8x16.extract_lane_s + return lane_handler(15, raw_top.value.simd.i8x16, raw_top.value.int32, I32); case 0x16: // i8x16.extract_lane_u - return lane_handler(15, raw_top.value.simd.i8x16, raw_top.value.uint32, I32); + return lane_handler_unsigned(15, raw_top.value.simd.i8x16, raw_top.value.uint32, I32); case 0x18: // i16x8.extract_lane_s + return lane_handler(7, raw_top.value.simd.i16x8, raw_top.value.int32, I32); case 0x19: // i16x8.extract_lane_u - return lane_handler(7, raw_top.value.simd.i16x8, raw_top.value.uint32, I32); + return lane_handler_unsigned(7, raw_top.value.simd.i16x8, raw_top.value.uint32, I32); case 0x1b: // i32x4.extract_lane return lane_handler(3, raw_top.value.simd.i32x4, raw_top.value.uint32, I32); @@ -1351,10 +1369,10 @@ bool i_instr_simd_extract(Module* m, uint8_t opcode){ return lane_handler(1, raw_top.value.simd.i64x2, raw_top.value.uint64, I64); case 0x1f: // f32x4.extract_lane - return lane_handler(3, raw_top.value.simd.f32x4, raw_top.value.uint32, F32); + return lane_handler(3, raw_top.value.simd.f32x4, raw_top.value.f32, F32); case 0x21: // f64x2.extract_lane - return lane_handler(1, raw_top.value.simd.f64x2, raw_top.value.uint64, F64); + return lane_handler(1, raw_top.value.simd.f64x2, raw_top.value.f64, F64); } return false; @@ -1483,3 +1501,484 @@ bool i_instr_simd_load(Module* m) { return success; } + +bool i_instr_simd_bin_bit_op(Module* m, uint8_t opcode){ + auto v1 = m->stack[m->sp - 1].value.simd; + auto v2 = m->stack[m->sp].value.simd; + m->sp--; + + const auto apply = [&v1, &v2, m](F &&op) { + m->stack[m->sp].value.simd.i64x2[0] = op(v1.i64x2[0], v2.i64x2[0]); + m->stack[m->sp].value.simd.i64x2[1] = op(v1.i64x2[1], v2.i64x2[1]); + return true; + }; + + switch(opcode) { + case 0x4e: // bit-and + return apply([](const uint64_t &a, const uint64_t &b) { return a & b; }); + case 0x4f: // bit-and-not + return apply([](const uint64_t &a, const uint64_t &b) { return a & ~b; }); + case 0x50: // bit-or + return apply([](const uint64_t &a, const uint64_t &b) { return a | b; }); + case 0x51: // xor + return apply([](const uint64_t &a, const uint64_t &b) { return a ^ b; }); + } + + return false; +} + +bool i_instr_simd_v128_not(Module* m){ + m->stack[m->sp].value.simd.i64x2[0] = ~m->stack[m->sp].value.simd.i64x2[0]; + m->stack[m->sp].value.simd.i64x2[1] = ~m->stack[m->sp].value.simd.i64x2[1]; + return true; +} + + +// to implement the whole swathe of SIMD instructions, let's use some templates +// so the compiler can generate the code... +namespace { +// anonymous namespace to hide implementation details/allow code folding +// the SIMD vector type (for ease of coding) +using simd_t = decltype(StackValue::value.simd); + +// use type-traits for all compile-time meta-data +template struct v128_traits; +template <> struct v128_traits { + // we need to know the number of elements + constexpr static uint N = 16; + // we need to know the amount of bits + constexpr static uint bits = 8; + // the type of elements in the SIMD vector + using type = int8_t; + // the type to use when an operation returns a boolean + using bool_alt = int8_t; + // we need to know the signed version of this type + using signed_t = int8_t; + // we also need to know the unsigned version of this type + using unsigned_t = uint8_t; + // for the ext_add_pairwise, we need the extended type + using extended_t = int16_t; + // pointer-to-member to access the SIMD vector + constexpr static auto member = &simd_t::i8x16; +}; +template <> struct v128_traits { + constexpr static uint N = 16; + constexpr static uint bits = 8; + using type = uint8_t; + using bool_alt = int8_t; + using signed_t = int8_t; + using unsigned_t = uint8_t; + using extended_t = uint16_t; + constexpr static auto member = &simd_t::i8x16; +}; +template <> struct v128_traits { + constexpr static uint N = 8; + constexpr static uint bits = 16; + using type = int16_t; + using bool_alt = int16_t; + using signed_t = int16_t; + using unsigned_t = uint16_t; + using extended_t = int32_t; + constexpr static auto member = &simd_t::i16x8; +}; +template <> struct v128_traits { + constexpr static uint N = 8; + constexpr static uint bits = 16; + using type = uint16_t; + using bool_alt = int16_t; + using signed_t = int16_t; + using unsigned_t = uint16_t; + using extended_t = uint32_t; + constexpr static auto member = &simd_t::i16x8; +}; +template <> struct v128_traits { + constexpr static uint N = 4; + constexpr static uint bits = 32; + using type = int32_t; + using bool_alt = int32_t; + using signed_t = int32_t; + using unsigned_t = uint32_t; + constexpr static auto member = &simd_t::i32x4; +}; +template <> struct v128_traits { + constexpr static uint N = 4; + constexpr static uint bits = 32; + using type = uint32_t; + using bool_alt = int32_t; + using signed_t = int32_t; + using unsigned_t = uint32_t; + constexpr static auto member = &simd_t::i32x4; +}; +template <> struct v128_traits { + constexpr static uint N = 2; + constexpr static uint bits = 64; + using type = int64_t; + using bool_alt = int64_t; + using signed_t = int64_t; + using unsigned_t = uint64_t; + constexpr static auto member = &simd_t::i64x2; +}; +template <> struct v128_traits { + constexpr static uint N = 2; + constexpr static uint bits = 64; + using type = uint64_t; + using bool_alt = int64_t; + using signed_t = int64_t; + using unsigned_t = uint64_t; + constexpr static auto member = &simd_t::i64x2; +}; +template <> struct v128_traits { + constexpr static uint N = 4; + using type = float; + using bool_alt = int32_t; + using signed_t = float; + constexpr static auto member = &simd_t::f32x4; +}; +template <> struct v128_traits { + constexpr static uint N = 2; + using type = double; + using bool_alt = int64_t; + using signed_t = double; + constexpr static auto member = &simd_t::f64x2; +}; + +// get a reference to a lane in a SIMD vector +template +constexpr typename v128_traits::signed_t &get_lane_ref(StackValue &sv, uint8_t lane) { + // v128_traits::member is pointer-to-member + // (struct).*(ptr-to-member) gets struct.member + // so we get (simd-union).(correct type field)[lane] + return (sv.value.simd.*v128_traits::member)[lane]; +} +// get a const reference to a lane in a SIMD vector +template +constexpr const typename v128_traits::signed_t &get_lane_cref(const StackValue &sv, uint8_t lane) { + return (sv.value.simd.*v128_traits::member)[lane]; +} +// get a copy of a lane in a SIMD vector +template +constexpr typename v128_traits::signed_t get_lane_copy(StackValue &sv, uint8_t lane) { + return (sv.value.simd.*v128_traits::member)[lane]; +} + +// apply binary operator lane-wise +template +constexpr bool simd_bin_op(Module *m, const StackValue &sv1, const StackValue &sv2, F &&f) { + static_assert(std::is_invocable_v, "Operation is not invocable on type T"); + static_assert(sizeof(T) == sizeof(ExplicitCast), "ExplicitCast must have same size as T"); + + using result_t = std::conditional_t< + std::is_same_v, bool>, // if the result is a boolean + typename v128_traits::bool_alt, // then use the bool_alt type (to ensure lane count for floats) + typename v128_traits::type // otherwise, use the normal type + >; + using result_traits = v128_traits; // v128 traits for the result type + + static_assert(v128_traits::N == result_traits::N, "Result type must have same lane count as input type"); + + m->stack[m->sp].value_type = V128; + for(uint i = 0; i < v128_traits::N; i++) { + ExplicitCast lane1, lane2; + if constexpr(std::is_same_v) { + lane1 = get_lane_cref(sv1, i); + lane2 = get_lane_cref(sv2, i); + } + else { + memcpy(&lane1, &get_lane_cref(sv1, i), sizeof(T)); + memcpy(&lane2, &get_lane_cref(sv2, i), sizeof(T)); + } + get_lane_ref(m->stack[m->sp], i) = f(lane1, lane2); + } + return true; +} + +template typename FPre, typename ExplicitCast = T, typename F = FPre> +constexpr bool simd_bin_op(Module *m, const StackValue &sv1, const StackValue &sv2) { + return simd_bin_op(m, sv1, sv2, F{}); +} + +template typename FPre, typename ExplicitCast = T, typename F = FPre> +constexpr bool simd_shift(Module *m, const StackValue &sv1, const StackValue &sv2) { + static_assert(std::is_invocable_v, "Operation is not invocable on type T"); + static_assert(sizeof(T) == sizeof(ExplicitCast), "ExplicitCast must have same size as T"); + + using result_t = std::conditional_t< + std::is_same_v, bool>, // if the result is a boolean + typename v128_traits::bool_alt, // then use the bool_alt type (to ensure lane count for floats) + typename v128_traits::type // otherwise, use the normal type + >; + using result_traits = v128_traits; // v128 traits for the result type + + static_assert(v128_traits::N == result_traits::N, "Result type must have same lane count as input type"); + + F f{}; + + m->stack[m->sp].value_type = V128; + for(uint i = 0; i < v128_traits::N; i++) { + ExplicitCast lane1; + int32_t shift = sv2.value.int32; + if constexpr(std::is_same_v) { + lane1 = get_lane_cref(sv1, i); + } + else { + memcpy(&lane1, &get_lane_cref(sv1, i), sizeof(T)); + } + get_lane_ref(m->stack[m->sp], i) = f(lane1, shift); + } + return true; +} + +template +constexpr bool simd_ext_add(Module *m) { + using T_traits = v128_traits; + using extend_t = typename T_traits::extended_t; + using extend_traits = v128_traits; + + StackValue copy = m->stack[m->sp]; + m->stack[m->sp].value_type = V128; + StackValue &res = m->stack[m->sp]; + + for(uint i = 0; i < extend_traits::N; i++) { + auto x1 = static_cast(get_lane_cref(copy, 2 * i)); + auto x2 = static_cast(get_lane_cref(copy, 2 * i + 1)); + get_lane_ref(res, i) = x1 + x2; + } + + return true; +} +} + +// helper code for saturating arithmetic +namespace { +template +struct sat_add { + constexpr T operator()(const T t1, const T t2) const { + // from https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/sat_arith.h#L49 + T t3{}; + if(!__builtin_add_overflow(t1, t2, &t3)) return t3; + if constexpr(std::is_unsigned_v) return std::numeric_limits::max(); + else if(t1 < 0) return std::numeric_limits::min(); + else return std::numeric_limits::max(); + } +}; + +template +struct sat_sub { + constexpr T operator()(const T t1, const T t2) const { + // from https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/sat_arith.h#L65 + T t3{}; + if(!__builtin_sub_overflow(t1, t2, &t3)) return t3; + if constexpr(std::is_unsigned_v) return 0; + else if(t1 < 0) return std::numeric_limits::min(); + else return std::numeric_limits::max(); + } +}; + +template struct min_struct { constexpr T operator()(const T t1, const T t2) const { return std::min(t1, t2); } }; +template struct max_struct { constexpr T operator()(const T t1, const T t2) const { return std::max(t1, t2); } }; +// pseudo-min/max as defined in https://github.com/WebAssembly/simd/blob/main/proposals/simd/SIMD.md#pseudo-minimum +template struct p_min_struct { constexpr T operator()(const T t1, const T t2) const { return t2 < t1 ? t2 : t1; } }; +template struct p_max_struct { constexpr T operator()(const T t1, const T t2) const { return t1 < t2 ? t2 : t1; } }; + +template struct shift_left { + constexpr T operator()(const T t1, const int32_t t2) const { return static_cast(t1 << (t2 % v128_traits::bits)); } +}; +template struct arith_shift_right { + // sign-preserving right shift ~> works only "correctly" on signed types + constexpr T operator()(const T t1, const int32_t t2) const { + using type = typename v128_traits::signed_t; + type st1; + + if constexpr(std::is_same_v) st1 = t1; + else memcpy(&st1, &t1, sizeof(T)); + + st1 >>= (t2 % v128_traits::bits); + + T result; + if constexpr(std::is_same_v) result = st1; + else memcpy(&result, &st1, sizeof(T)); + + return result; + } +}; +template struct logic_shift_right { + // zero fill right shift ~> works only "correctly" on unsigned types + constexpr T operator()(const T t1, const int32_t t2) const { + using type = typename v128_traits::unsigned_t; + type ut1; + + if constexpr(std::is_same_v) ut1 = t1; + else memcpy(&ut1, &t1, sizeof(T)); + + ut1 >>= (t2 % v128_traits::bits); + + T result; + if constexpr(std::is_same_v) result = ut1; + else memcpy(&result, &ut1, sizeof(T)); + + return result; + } +}; +} + +bool i_instr_simd_bin_v128_v128_op(Module* m, uint8_t opcode){ + // need to keep copies! + const auto v1 = m->stack[m->sp - 1]; + const auto v2 = m->stack[m->sp]; + m->sp--; + + switch(opcode) { + // i8x16 -> ==, !=, <, , >u, <=, <=u, >=, >=u + case 0x23: return simd_bin_op(m, v1, v2); + case 0x24: return simd_bin_op(m, v1, v2); + case 0x25: return simd_bin_op(m, v1, v2); + case 0x26: return simd_bin_op(m, v1, v2); + case 0x27: return simd_bin_op(m, v1, v2); + case 0x28: return simd_bin_op(m, v1, v2); + case 0x29: return simd_bin_op(m, v1, v2); + case 0x2a: return simd_bin_op(m, v1, v2); + case 0x2b: return simd_bin_op(m, v1, v2); + case 0x2c: return simd_bin_op(m, v1, v2); + // i16x8 -> ==, !=, <, , >u, <=, <=u, >=, >=u + case 0x2d: return simd_bin_op(m, v1, v2); + case 0x2e: return simd_bin_op(m, v1, v2); + case 0x2f: return simd_bin_op(m, v1, v2); + case 0x30: return simd_bin_op(m, v1, v2); + case 0x31: return simd_bin_op(m, v1, v2); + case 0x32: return simd_bin_op(m, v1, v2); + case 0x33: return simd_bin_op(m, v1, v2); + case 0x34: return simd_bin_op(m, v1, v2); + case 0x35: return simd_bin_op(m, v1, v2); + case 0x36: return simd_bin_op(m, v1, v2); + // i32x4 -> ==, !=, <, , >u, <=, <=u, >=, >=u + case 0x37: return simd_bin_op(m, v1, v2); + case 0x38: return simd_bin_op(m, v1, v2); + case 0x39: return simd_bin_op(m, v1, v2); + case 0x3a: return simd_bin_op(m, v1, v2); + case 0x3b: return simd_bin_op(m, v1, v2); + case 0x3c: return simd_bin_op(m, v1, v2); + case 0x3d: return simd_bin_op(m, v1, v2); + case 0x3e: return simd_bin_op(m, v1, v2); + case 0x3f: return simd_bin_op(m, v1, v2); + case 0x40: return simd_bin_op(m, v1, v2); + // f32x4 -> ==, !=, <, >, <=, >= + case 0x41: return simd_bin_op(m, v1, v2); + case 0x42: return simd_bin_op(m, v1, v2); + case 0x43: return simd_bin_op(m, v1, v2); + case 0x44: return simd_bin_op(m, v1, v2); + case 0x45: return simd_bin_op(m, v1, v2); + case 0x46: return simd_bin_op(m, v1, v2); + // f64x2 -> ==, !=, <, >, <=, >= + case 0x47: return simd_bin_op(m, v1, v2); + case 0x48: return simd_bin_op(m, v1, v2); + case 0x49: return simd_bin_op(m, v1, v2); + case 0x4a: return simd_bin_op(m, v1, v2); + case 0x4b: return simd_bin_op(m, v1, v2); + case 0x4c: return simd_bin_op(m, v1, v2); + // i8x16 -> +, + sat s, + sat u, -, - sat s, - sat u + case 0x6e: return simd_bin_op(m, v1, v2); + case 0x6f: return simd_bin_op(m, v1, v2); + case 0x70: return simd_bin_op(m, v1, v2); + case 0x71: return simd_bin_op(m, v1, v2); + case 0x72: return simd_bin_op(m, v1, v2); + case 0x73: return simd_bin_op(m, v1, v2); + // i8x16 min s, min u, max s, max u (can't pass std::min/std::max as template argument, they are function-overload-sets) + case 0x76: return simd_bin_op(m, v1, v2); + case 0x77: return simd_bin_op(m, v1, v2); + case 0x78: return simd_bin_op(m, v1, v2); + case 0x79: return simd_bin_op(m, v1, v2); + // i16x8 -> +, + sat s, + sat u, -, - sat s, - sat u, * + case 0x8e: return simd_bin_op(m, v1, v2); + case 0x8f: return simd_bin_op(m, v1, v2); + case 0x90: return simd_bin_op(m, v1, v2); + case 0x91: return simd_bin_op(m, v1, v2); + case 0x92: return simd_bin_op(m, v1, v2); + case 0x93: return simd_bin_op(m, v1, v2); + case 0x95: return simd_bin_op(m, v1, v2); + // i16x8 min s, min u, max s, max u + case 0x96: return simd_bin_op(m, v1, v2); + case 0x97: return simd_bin_op(m, v1, v2); + case 0x98: return simd_bin_op(m, v1, v2); + case 0x99: return simd_bin_op(m, v1, v2); + // i32x4 -> +, -, * + case 0xae: return simd_bin_op(m, v1, v2); + case 0xb1: return simd_bin_op(m, v1, v2); + case 0xb5: return simd_bin_op(m, v1, v2); + // i32x4 min s, min u, max s, max u + case 0xb6: return simd_bin_op(m, v1, v2); + case 0xb7: return simd_bin_op(m, v1, v2); + case 0xb8: return simd_bin_op(m, v1, v2); + case 0xb9: return simd_bin_op(m, v1, v2); + // i64x2 -> +, -, * + case 0xce: return simd_bin_op(m, v1, v2); + case 0xd1: return simd_bin_op(m, v1, v2); + case 0xd5: return simd_bin_op(m, v1, v2); + // i64x2 -> ==, !=, <, >, <=, >= + case 0xd6: return simd_bin_op(m, v1, v2); + case 0xd7: return simd_bin_op(m, v1, v2); + case 0xd8: return simd_bin_op(m, v1, v2); + case 0xd9: return simd_bin_op(m, v1, v2); + case 0xda: return simd_bin_op(m, v1, v2); + case 0xdb: return simd_bin_op(m, v1, v2); + // f32x4 -> +, -, *, /, min, max, pmin, pmax + case 0xe4: return simd_bin_op(m, v1, v2); + case 0xe5: return simd_bin_op(m, v1, v2); + case 0xe6: return simd_bin_op(m, v1, v2); + case 0xe7: return simd_bin_op(m, v1, v2); + case 0xe8: return simd_bin_op(m, v1, v2); + case 0xe9: return simd_bin_op(m, v1, v2); + case 0xea: return simd_bin_op(m, v1, v2); + case 0xeb: return simd_bin_op(m, v1, v2); + // f64x2 -> +, -, *, /, min, max + case 0xf0: return simd_bin_op(m, v1, v2); + case 0xf1: return simd_bin_op(m, v1, v2); + case 0xf2: return simd_bin_op(m, v1, v2); + case 0xf3: return simd_bin_op(m, v1, v2); + case 0xf4: return simd_bin_op(m, v1, v2); + case 0xf5: return simd_bin_op(m, v1, v2); + case 0xf6: return simd_bin_op(m, v1, v2); + case 0xf7: return simd_bin_op(m, v1, v2); + + default: + return false; + } +} + +bool i_instr_simd_shift(Module* m, uint8_t opcode){ + // need to keep copies! + const auto v1 = m->stack[m->sp - 1]; + const auto v2 = m->stack[m->sp]; + m->sp--; + + switch(opcode) { + // i8x16 <<, >>(s), >>(u) + case 0x6b: return simd_shift(m, v1, v2); + case 0x6c: return simd_shift(m, v1, v2); + case 0x6d: return simd_shift(m, v1, v2); + // i16x8 <<, >>(s), >>(u) + case 0x8b: return simd_shift(m, v1, v2); + case 0x8c: return simd_shift(m, v1, v2); + case 0x8d: return simd_shift(m, v1, v2); + // i32x4 <<, >>(s), >>(u) + case 0xab: return simd_shift(m, v1, v2); + case 0xac: return simd_shift(m, v1, v2); + case 0xad: return simd_shift(m, v1, v2); + // i64x2 <<, >>(s), >>(u) + case 0xcb: return simd_shift(m, v1, v2); + case 0xcc: return simd_shift(m, v1, v2); + case 0xcd: return simd_shift(m, v1, v2); + + default: + return false; + } +} + +bool i_instr_simd_ext_add_pairwise(Module* m, uint8_t opcode){ + switch(opcode) { + case 0x7c: return simd_ext_add(m); + case 0x7d: return simd_ext_add(m); + case 0x7e: return simd_ext_add(m); + case 0x7f: return simd_ext_add(m); + default: return false; + } +} diff --git a/src/Interpreter/instructions.h b/src/Interpreter/instructions.h index 9d4732de..82b04b9b 100644 --- a/src/Interpreter/instructions.h +++ b/src/Interpreter/instructions.h @@ -84,4 +84,14 @@ bool i_instr_simd_const(Module *m); bool i_instr_simd_store(Module *m); -bool i_instr_simd_load(Module *m); \ No newline at end of file +bool i_instr_simd_load(Module *m); + +bool i_instr_simd_bin_bit_op(Module *m, uint8_t opcode); + +bool i_instr_simd_v128_not(Module *m); + +bool i_instr_simd_bin_v128_v128_op(Module *m, uint8_t opcode); + +bool i_instr_simd_shift(Module *m, uint8_t opcode); + +bool i_instr_simd_ext_add_pairwise(Module *m, uint8_t opcode); \ No newline at end of file diff --git a/src/Interpreter/interpreter.cpp b/src/Interpreter/interpreter.cpp index d54855ac..68c88a71 100644 --- a/src/Interpreter/interpreter.cpp +++ b/src/Interpreter/interpreter.cpp @@ -477,6 +477,24 @@ bool Interpreter::interpret_simd(Module *m) { // representations. However, we only support the shortest possible // encodings; see https://webassembly.github.io/spec/core/appendix/index-instructions.html + constexpr static auto next_pc_0x01 = [](Module *m, const uint8_t opcode) -> bool { + const auto next = *m->pc_ptr; + m->pc_ptr++; + if(next != 0x01) { + sprintf(exception, "SIMD opcode 0x%02x%02x should be followed by 0x%02x, but got 0x%02x", + 0x7d, opcode, 0x01, next); + return false; + } + return true; + }; + + // TODO: should be removed one day... + constexpr static auto not_implemented = [](const uint8_t opcode) -> bool { + sprintf(exception, "SIMD opcode 0x%02x%02x is not implemented (yet)", + 0x7d, opcode); + return false; + }; + const auto opcode = *m->pc_ptr; m->pc_ptr++; switch(opcode) { @@ -485,8 +503,7 @@ bool Interpreter::interpret_simd(Module *m) { case 0x0b: return i_instr_simd_store(m); case 0x0c: return i_instr_simd_const(m); - case 0x0f ... 0x14: - return i_instr_simd_splat(m, opcode); + case 0x0f ... 0x14: return i_instr_simd_splat(m, opcode); case 0x15: // interspersed with (dim).extract_lane case 0x16: @@ -506,6 +523,208 @@ bool Interpreter::interpret_simd(Module *m) { case 0x22: return i_instr_simd_replace(m, opcode); + case 0x23 ... 0x2c: // i8x16 relational operators + case 0x2d ... 0x36: // i16x8 relational operators + case 0x37 ... 0x40: // i32x4 relational operators + case 0x41 ... 0x46: // f32x4 relational operators + case 0x47 ... 0x4c: // f64x2 relational operators + return i_instr_simd_bin_v128_v128_op(m, opcode); + + case 0x4d: // v128.not + return i_instr_simd_v128_not(m); + + case 0x4e ... 0x51: // v128 bit-wise operators + return i_instr_simd_bin_bit_op(m, opcode); + + case 0x52: // TODO -> v128.bitselect + return not_implemented(opcode); + + case 0x53: // TODO -> v128.any_true + return not_implemented(opcode); + + case 0x54 ... 0x5d: // TODO -> v128.loadX_lane, v128.storeX_lane, v128.loadX_zero + return not_implemented(opcode); + + case 0x5e ... 0x5f: // TODO -> demote/promote f32<->f64 + return not_implemented(opcode); + + case 0x60 ... 0x62: // TODO -> i8x16. ~ abs, neg, popcnt + return not_implemented(opcode); + + case 0x63 ... 0x64: // TODO -> i8x16. ~ all_true, bitmask + return not_implemented(opcode); + + case 0x65 ... 0x66: // TODO -> i8x16.narrow_i16x8_(s/u) + return not_implemented(opcode); + + case 0x67 ... 0x6a: // TODO -> f32x4. ~ ceil, floor, trunc, nearest + return not_implemented(opcode); + + case 0x6b ... 0x6d: // i8x16 shifts + return i_instr_simd_shift(m, opcode); + + case 0x6e ... 0x73: // i8x16.(add/sub) + return i_instr_simd_bin_v128_v128_op(m, opcode); + + case 0x74 ... 0x75: // TODO -> f64x2. ~ ceil, floor + return not_implemented(opcode); + + case 0x76 ... 0x79: // i8x16.(min/max) + return i_instr_simd_bin_v128_v128_op(m, opcode); + + case 0x7a: // TODO -> f64x2.trunc + return not_implemented(opcode); + + case 0x7b: // TODO -> i8x16.avgr_u + return not_implemented(opcode); + + case 0x7c ... 0x7f: // TODO -> (dim).extadd_pairwise_(dim2) + return i_instr_simd_ext_add_pairwise(m, opcode); + + // --- From 0x80: 3-byte SIMD opcodes, so check next PC for 0x01 --- + + case 0x80 ... 0x81: // TODO -> i16x8. ~ abs, neg + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0x82: // TODO -> i16x8.q15mulr_sat_s + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0x83 ... 0x84: // TODO -> i16x8. ~ all_true, bitmask + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0x85 ... 0x86: // TODO -> i16x8.narrow_i32x4_(s/u) + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0x87 ... 0x8a: // TODO -> i16x8.extend_(low/high)_i8x16_(s/u) + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0x8b ... 0x8d: // i16x8 shifts + return next_pc_0x01(m, opcode) && i_instr_simd_shift(m, opcode); + + case 0x8e ... 0x93: // i16x8.(add/sub) + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + case 0x94: // TODO -> f64x2.nearest + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0x95: // i16x8.mul + case 0x96 ... 0x99: // i16x8.(min/max) + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + // case 0x9a: ! invalid opcode ! + + case 0x9b: // TODO -> i16x8.avgr_u + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0x9c ... 0x9f: // TODO -> i16x8.extmul_(low/high)_i8x16_(s/u) + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0xa0 ... 0xa1: // TODO -> i32x4. ~ abs, neg + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + // case 0xa2: ! invalid opcode ! + + case 0xa3 ... 0xa4: // TODO -> i32x4. ~ all_true, bitmask + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + // case 0xa5 ... 0xa6: ! invalid opcode ! + + case 0xa7 ... 0xaa: // TODO -> i32x4.extend_(low/high)_i16x8_(s/u) + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0xab ... 0xad: // i32x4 shifts + return next_pc_0x01(m, opcode) && i_instr_simd_shift(m, opcode); + + case 0xae: // i32x4.add + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + // case 0xaf ... 0xb0: ! invalid opcode ! + + case 0xb1: // i32x4.sub + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + // case 0xb2 ... 0xb4: ! invalid opcode ! + + case 0xb5: // i32x4.mul + case 0xb6 ... 0xb9: // i32x4.(min/max) + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + case 0xba: // TODO -> i32x4.dot_i16x8_s + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + // case 0xbb: ! invalid opcode ! + + case 0xbc ... 0xbf: // TODO -> i32x4.extmul_(low/high)_i16x8_(s/u) + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0xc0 ... 0xc1: // TODO -> i64x2. ~ abs, neg + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + // case 0xc2: ! invalid opcode ! + + case 0xc3 ... 0xc4: // TODO -> i64x2. ~ all_true, bitmask + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + // case 0xc5 ... 0xc6: ! invalid opcode ! + + case 0xc7 ... 0xca: // TODO -> i64x2.extend_(low/high)_i32x4_(s/u) + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0xcb ... 0xcd: // i64x2 shifts + return next_pc_0x01(m, opcode) && i_instr_simd_shift(m, opcode); + + case 0xce: // i64x2.add + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + // case 0xcf ... 0xd0: ! invalid opcode ! + + case 0xd1: // i64x2.sub + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + // case 0xd2 ... 0xd4: ! invalid opcode ! + + case 0xd5: // i64x2.mul + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + case 0xd6 ... 0xdb: // i64x2 relational operators + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + case 0xdc ... 0xdf: // TODO -> i64x2.extmul_(low/high)_i32x4_(s/u) + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0xe0 ... 0xe1: // TODO -> f32x4. ~ abs, neg + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + // case 0xe2: ! invalid opcode ! + + case 0xe3: // TODO -> f32x4.sqrt + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0xe4 ... 0xeb: // f32x4. ~ add, sub, mul, div, min, max, pmin, pmax + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + case 0xec ... 0xed: // TODO -> f64x2. ~ abs, neg + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + // case 0xee: ! invalid opcode ! + case 0xef: // TODO -> f64x2.sqrt + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0xf0 ... 0xf7: // f64x2. ~ add, sub, mul, div, min, max, pmin, pmax + return next_pc_0x01(m, opcode) && i_instr_simd_bin_v128_v128_op(m, opcode); + + case 0xf8 ... 0xf9: // TODO -> i32x4.trunc_sat_f32x4_(s/u) + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0xfa ... 0xfb: // TODO -> f32x4.convert_i32x4_(s/u) + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0xfc ... 0xfd: // TODO -> i32x4.trunc_sat_f64x2_(s/u)_zero + return next_pc_0x01(m, opcode) && not_implemented(opcode); + + case 0xfe ... 0xff: // TODO -> f64x2.convert_low_i32x4_(s/u) + return next_pc_0x01(m, opcode) && not_implemented(opcode); + default: { sprintf(exception, "unrecognized SIMD opcode 0x%x (0x%x 0x%x)", opcode, 0xfd, opcode); return false; diff --git a/tests/latch/latch-0.3.0.tgz b/tests/latch/latch-0.3.0.tgz index f6d591b9e40959e992b9cb40f4b26d9bd522189c..9f1913bd138bbc00ef474fcd3fa3f522d7729962 100644 GIT binary patch delta 58051 zcmV)PK()Vy%mdTT1AiZj2mk;800092?7iuJ+eY#zdOrIp5MAFP7*o(LCsG{$DT=a{ z*peg3@nmF;1(A>hiv$?})DjQh;{ML3^K|D)ZY{k7pcc!?ct)NH1vGl8?yjz`uC8Sm zcFw|+Xy(;stG%_`{$F3>-|Xz{^5UXbmJa{sXP4%@|Fy8RJbybkx4b+H`DW*4=a(1Y z@BjJ}{*AIcOaYX8=p_8})Zee<-|Nji?^WE1k}P`ks5KZ~rSZvW?)ja%H$OYS;O%X{ zdF8zdj~+dG6Q%t)%i=-e#hG^+rP0xqcanxl9(5buaT-P5;MnV&hUrPv@bZBdCRg4t zN;4=hILgB~iGPz5FZ4Rl$Ro&^pF%a+;5fes(+Dzmy)erLoj8R0yzZbg>PJZ)=GfkG z+>0{L&rc(7YFCt)s#7D~DC|9o6A!=1Pu@kGpAJU3mquBh#vQDq;l)X(H|in`@^dfl z$D#!+PCd^aL8YS%dVp{?y#AmYALHMMx-}df_2TTb;eT~wtomq_Lt=)BG=vT8$IKx0 zvZ&X41U19}H}zFRM|lwRAr5FRhA6|7i_<~h?n#_IIv%A7G#OEu?f{02TKpJwa!kSO z$AeyPaDiRx43ch)J<3)dJ=%j$;nCncqQ3CNCW9P6We{)zhI&@Tr|dNB^}M4<3>dTv z!y6jiNq@0RTP=523y&8^?OpEtMG8(#bGZ+6h1dG)(dY9%57}}_HF_WL#2D$9yTbd+HCJ)Wq+^RJFS=S+FaXwwYm3O&*%&(S-ODy6VS7#Ze`{}ZdkeeK+TPmRf!7A~a%WE!eYd&WZg|a|&0QRj zjh*e+jYl|~P-2@ZfpS}It_6qMvt|Uc;QQO%wyMxuZ#Q2-UAtHqyC^dUkN(%gzyHL4 zL$UuOJ)7x#%w~?$upeCv(zBTiNLrZ2gMXPOQP3=a&tGEyUs`_Z?*GeA=awG!|3Bm3 z6zp{#?~+rij~;E)z7lk!<2Z@lqyyL<@+&{OL@J*(yr~Z#qU`mcJL*M1y+1wjyz{U( zidMWl9Yv4E_0>lrYY<+9alV#D;n{EyC%N~`lV9+I@d}$hv=JWlB1k+R#9eQ86@Rvx zB!itX9l+icWgq6?QyTp~iqpuS%467zvl;nusxGtd!ES#Pb?w|iFa!V3`BOF{@*pbf zf^WhUV93e}_MKCIf z92y_{XH|obo)>oV70<7G&wlj$*?)#HHbEBUdr$^AnmQMT{A06WG2-~g1l*n>zp70f zJK*i0T~1ValIX&F!(jNpX$^YkRxZy|O&zILUICejk|_0gU`0peznK}}AEVBhQNTL| z*hOX|XP#bJB|VR)^2o$E949rmf&TO|&N;cRz*x2F0yqHbY}Dz%=N0I0AAgyso`BtZ z;)(8Bg?O9-z%IZ3Jm4~_y9zf0@zg#C?ludylh+JEqhydAs6?Z_fpNM_-O4=nI$_>9 z^?V%QvHGB&pocX7&PYEh@5~_i%nppj)7VALBAIYfRv!VV&OZU1SkxwX3aB-6vKyW; zP%EDPR%d)Iws5oYE-5#zLtg6t13daD?L@D`;Sfm2+nra>j4d?ihr>r-!~Wk)JE!q^ zl-_yYzuEpjH$S)R?*B{kix21juX_KN$Wz$VkDYz?m^b1ctTIm(!kQ_2I_l(u)JFk; z+$!+c8pO%*lhFkne?@SfC%CJs+=na&2svhwMWaigY2A|2@v-NB<5m%zhS~N-qJ|KP z)%9jq)!_btrjr%9g5fAT^%(#O+C>`YkuR&qZ4XB|pyUnc{q9xL0p7qEmWFru_|s3j z+gkz7eR2{XU-@ox4KEq>dJS*BK7OAZHWcv3z3^nkt6kI{lWYbc1UB`*j+2lE6@P!z z3v;9}&S7gtrmK^g*bulDroEX_I*^Zry#k(-h}bPj5VH|iUiQ2ZVmdwFeNz%oJ~2+$bT-^x|z*c;&HbDr|~4JUf}s)m-rf#0@O{Z1XH2Y z=n}p#!_!rn{ki2jyu2MkZLKhie06>m5|6{#$De#C8}y>&BtP|LfH$&Aj~{=6&tvaU zuyF=NFapoKxNDJ-1c?y-Q9S1Fqp+9xgZvZ@&jMyCOu{s(<(Y!qB|z4o+Zku*5;A13 z@dy6vf&WAL-wzXf$JGZXhx8tkyaz87cG7s5OAItVy$j1yCnRlzxL;hAlm7=94nGXj z0g8-m=GOY8OYBOMCI~Ps1m+=A53JxkOg)|x!T}c3u0HbB4S`?y%G+Ndd4CGmYaVr{ zP+p>5R?G7qhm(T{E`N>db(2{#G1+B>F2bYS5@TJ2xsZq%tA(?f(y^=~a=FV*XGMl& z7|pg0*yTLA`IMDGXxmZ2~MLl9MnAA|w{=^@rN^~t zdA}wv*c$K=DYV7Y9s~1s*3F~-&_|*ad<2tr32qOgT&|QbyGlA@#Ya9+`;(LN2{ZwD zlPC%-AlKYOUATA9mpiQ>!4<@GHGlZ{6AZ(6W;E;#!Y&Qr;gfURDI2AJ1Eg)% zrfZX$WwxP#-M6mT1${d-N{|XCPCu7f@f1EpmoaWFsCdetJ^qA$#w+ju6^{>{su6ov zORnwh)sgAd(Xjf1h_gb!4I>ribOnFRG-!MUe{@?0B$I|k0)Js-mrMBGAsH8lR(Aw@ z9aJzJv}|FJz6qVzu}}RuD4`X#b~>8av#f2E+uP(tCq~omP!$2cz=ezsSU;E zw#=oavhe=OU4O6IVoh9h8!gNbpjZy932LJoxN9J)aViY-=}$=QV8e%_1uS~3_7xoV zGFc&Tb;fDh=h_?I{sI11;GyhuwDG3yUEDMHzXv;2Hf8tB4ppLwI8zJGomb%M4H1Yd z)rVc1ayd(z^|CBnpaZuOjBtYP2J!sR7i1oMgCN!GSbrnqja(rD{+knk3O20*-%$Wz z$a*x4k}|=LXb&igEoeNY{37VUQx3HNn8#s9ZzqJ)D|p!996L||=vx%_eIV48gJAM; z`C{63D33f#~x8FRKBF&Cr{$K998ZD(Ld|}kUt;)0u>yk*&wA` zM5+mjK7aA%EV7Pdk$NqREi%8hy81u0y7#xgd3L(XMjJSp!T(I zHidu1T?3F_hRL9zbmGGrY?>?vg|$s=O-rn6#d|{FWy2mIQf;MH-=8~ZI0~7)Q9s#5 zuB{~Zd};1>0$kJdoc$>lREDftxVM3sX6ikb9e*XQDZedGU`(#u+A=@};$nO&moO8M4%>c)QHZbUpb?BboR+k1Pcgk*(VHs6C zN$cY-&cmoj*K~YZ;MC027|cff=xvh6JucnwYFt^ZE;-=$3151MV!?1A4#Y45xCpRH zV%dRYXSOmUe*^}fRG46^*u+OVM1NSP8lmC{8Mg39WPC?#o%McrCMp5+gEz`A^qR~Y z3hJzT3ZQ~3{72&s*04gqIxS33$c`Tv_kDxo?+rR(kJ8EvgtQr&Xy3FLvXusmH+KSU z`3QB1DGVh9L@$BRj1pFM=sFagXLqb-m`+wazp}hLo08{DQ=YPnG!jS;Vtnz)ktphJ? zVz2a9NhSYh#=skqMPrBqo#?JiG0~1%$>W4AD%4f1VaSIa31NhEJw^2qyGEW+HJEhz ziA#>igX3dhCu#O{W<2V|27eh*gV1CcwnqIUIM^J{UOxVWV8I3hdQA(7z z)B;y6ySpwN>fi^}0@O0$vcS{SW^2Gp4WlskF;Qw7PRkbL5*f_%QFuJt^6wvx-F-j7ljKk{U5%|h$Q9vw8=HTB`$o-R7XJ~| zO17ob=rR=BhJU%^u6X`_IQ>U+`XBPB@jTd{JFw3ivTVVEp3Rljce#W7zur9YJ8+i<_z2@{zf z=)_lH|9{=?k9uJ~NWb{{e>z{V|6ZD#d+`79Ronka?DX&hzH#LhY;Q8Uv~e>8K^?eyZqvSGSIwL?Jwm9G};NhygC>$!wFOz{7; zA%CAfmlRA~|8sMT=Wx{Jx!AWD4k@2XjkhCn^53l^%&r|W4i z8%CY@IPM5PXM>@X@fgtD)nls#s`y$5@4thw2)R<9GpNXYnx9?BuvGWGtlSm%2FwlvY0ax{OsKqa<~gMK4Oai*G2~t*oiQ z*GeKlezs%@C^+ju`L6`kZ6Mv-A;mMeg=^|tsP*VTEq55urOYh3ZLntvs7go^6q z(#dmeGl>zd_>agF;+mRlLXsCa4vPHhORP%y)NWv?JmYJao@7Xj_7Ca-UA+6GpeM8m zNQV%257U^;(5i;D$@t9qWvdPDo2z%L(10IAp?dKOMq$QWHDa{(CGKYguD z94$c!U|Z#muEy{jxj_uXfxwS`86A*abjBhFU~Wrr^OvudRp zTd`p%gGwy@VJ}kA+kbq^Pr4Q=##S!f&8i$?-K)=jnTMRJ!tN>56i=z=3gM|G2mMdG zye`OpNvZ!HFMqDR|5;d?E5v_9r;rcw-@icqi$c#2AK1Wt4N!q~d?`}k-~Prc-~EiD zLm@Wi58iXr)j`99&F&2TKd)^t&gNay3rz9OR!N|odPv+*nt#K!0!1+*DXbIW8=`Co zD^`lv-%ue0W(o>SVbDTKdG3AF5470YTcKo%jX<`BP=XSG^d842BXT&bgf#*XNt&W$ z)Q>0!OT4A(J2bdr^to;shqLPU{+X*^DCuUo$bEn#)*t{-`_5bWoG~5jpOH|Qp%@F{ zHVg_;L)4BePJgoT4TeZJ4lN5J%5BrWh1Csl$oq8yW=J-CQvgZ`+tL(P`;F))FhKbL z-Rn6KGJyR7jzHZs3}Fr&Ow%9H=>?9;>iykU^n`}LeG8#Tzk69waZ85x2IkQDMv)T7 zx){S$4(7E5-;$O4Z3>!K`8O*uIr!gg>o9L?ZdcM7)PEa|QhB7d+Z7eDtnLD`bK7*2 z!rEsl`bPMyS;C>-6)&Gv(QY0MKdXYxOmFH17venzZMh53O*?_%9Xri(KQGLSGrNw3k=3r=g zCY~yo0%NcID%gTz{0~J4(JFTu{clbm#eXNC6A5ba{=c}mP>lb*y!@d5_f_xz7+aDK zV#bD#X}dDqq_OSKd=>o!4l;hCOqHH2qwYppO4U^f>_vz)IFGpQ%!&)IhpbI-|w#+)SplJ)6d^`pVX5n zf4}j5{QlseK69c?(P4M$0p&ucRn+)1&k5hjjrku`bW&8y0$Myc<^U2s2Y;QSFMu77=N`{LUYKIhOx3Jg?24^$iMPMF6uNNQHvfIpi=QKn&0Whfs1~j~j$on|Tq{jt0{WgO6DC{}{ ziizPA$h#Gs5Rc+soL_NM%2}iEca-5Z4z>YM*2}wdLL#mda)pU-ITE~X{(t?$ZgZpk zVRLJ*{i3}?&7A1+Dn{Eu;w59!%b{-xfkI}sT`M=&D;9rZ%tDUdAjyoR@yP~ue zBi`^1f%GO*hm*A)ktWAZy~j$HM?UD&(GW?XhC5I&s_)l`{Jf-P?Xs3BoWO(WX!i1AV<0Al@|J?zStT$nt1d2?Tz;r-5j{ znFzx6ImsTY!N3fYK`~u8-U%?%)1U3s_=c4=_qf~(KUS;keb5Z*Z1gRS`h)Z6&fRm1|7ksR8zw?$Ct3ZB6STIwZIe_WEPoyA zZ}xfJKMd$)q2_7deK%0eGP;( zf!BaXdF~T7^37ZT%n4z{AvZQkVlx?j$QEJ+LCqsxV4!TqWxS z$OFM_sjuQks5l;DYg{GV=t^0=Sbs#ust&_hC>3q(Uz$jU&oKn*j;+Oo&{Td4)a$!u znub?0qaB6HjCXB}&;*1q)^1pCtmKnw071ydNBK)x%x)f!8 zau+Sl>De)pFe4gcVyotrR=EK^{#3%k zIBO3>7FhUM+>G>o!|hEzbUE5dhFl{FhuP_%`kWy%-2G_8al)=UAaSlcwsM0eKCAu~ z@Qrwvt;1hdH{|5KLyM?~7av~<-Lz`y8)vI(Anu|Ufc(mnts@!?U4Q@c%P1Os-X+jA zlhY$F0gICZBrOlVel#ws4{%GC?FHFse4LX%Bo<8?W-S4nfYyZ3^y^^XR<0O3IozXy}rBr<tE9Te|dRnzQq6g?8E;5HShoW z{_kZht^f`8+`Sz%J}F6K!E~&UY#cYt%+?v9sDN@?{SbW>S)sGy+MLRQs8sd=mCA&$ z!&P4?Q#!-aTD)cT#MqtXRtnQLY$sj*Vwvu^V_+v3Z5U%{G+_B?!moHhBwc(8K_`DT zV8~(9rHqhh&-lpdX-q6_DKA-1q$L~B?rW_ z8|T^r`Xaqd(2Lxv%`nBHu~NG}%RGr{K)EM9)c36#nQ?JVu=Fe%uU5Q1tN(?_Q<}3N z{|=ax4_*x}qO=vF3bzrtOjT8@>%4zy-1qA!Bt{OZ_Q?)frPiy6eubS_R4ASacz45~sk@{}2Jg?8^4%4(fjmK-yIl zhVE^zZ>uP9`GBv2goMW$P;7_?wWcFeDn7wm+i5p{ezU!~wWnjs5nco}Yrsp0zME7! z{AvTa=?o}!pc_pAA==LVzXEE!xRhU`b)&=j&B^WE2k4Ca3wm~eFo6bRkZq7E8Fw9vMr$5>fgn7JBtkBtS;%Q+q5t1O6MQPg$(r0qG(8VPDfXHiBPFK&~%&{$E^Nd|Gn;e~AC|RiFP=aJI6*E`VQUkzJ0^ zYqDkhK=+$=R!%GUbRo%M(X^uSGE0Y;Q;^CKbF$Tdu2c)kLg;wfxHD`-7RB3vA?Rbmb+ zqG1%{*`<83T8NcmTz61>b8ECLL9JhVFZ5A`!&nY-hklv6qhSxYn9gaKBvFqdz;pb& z%7}NAF@O_k4F`Xu*5Gk5jRs8M0(Dno=$5N3iv`dejmxjQcLtLI?MC784FF}O^JcI2 zimC##D*!i}5g_OrBw(>gbdNVP5?K2>mL@kqdsY%ku#hx2EFsh zajm_t!f7{Tj`To+DXZV7Mh&0aGN-Rfv(aj*y5zd6k6=Oiii!l{iB%zj?L?q-!&5`z z`l}Wl#Y-(@gAt$xUb2ND*}vKR+Fk1Xz1oSYH*)^e&Ak-JwhUQd;( zDco$xD-0y8I+?RkrxQh8nU!9%tdI>iW|@CyLvGTATo_lQI~Z|fOMdh4)y+pCOgIxg zmQ;no42KFT@j~1f1;Rk*JI6xe(v60&^Fe>(C_}|h3js>7!c_mX^0Ee~ak+?hOTdMn zN4*BwG+`V~OMp}JYAC;nLXpk;mh#oD%P_`JpUk&CIOB~%s7^YCvIXZ>C>wmCQh|Sn z23V_!D^-dE(=kEU{Rq^II?`1JgQI3(06eT%`Ss*zGsUPQ`^RzA>%v}~07rI!7MsMS=0v$#mEN(%6-Xe}pE{wv7^eK|1Hps|C~rjM-$=&O+=g@(IEmj&PmIRw)i znaLLtRj$QVl{Z9@ZZlmGRe*0kD;s}W*V*pe6uAvc<7{$EEtN|RSFu6)Qe?#^w0{(x zhKP@;(>(d@m;TEt%~(u8`95kh0a$?a;$mIF^X|T^<$yf$QAZ+AH4BMB%`#vxZG50& z^V7I$eAZ-javmyhO~N9vt#ZO9o>#0MA1bQ&_><#Xlolt72=%$huJ|UJ+M}!%7uG^x{dA9@I@d zk}+3X@lYIq%phMY@>C>ZL18)RBo{3JvaBjbsg5=aehcjk$5}1dk0hn<$-iHlVrXsB(NE*Lf~dP-j!fMs%kBS zV-_?0B`_eTBcqJ~xOJ6>z!fl(UuLgC{a~vdo})rb=GOeId~^P6 z)RQ0(;@tuQ=HzaKi+Ap&!GRhVXcP&K*d$YVTWXXcskYeY;D~57V22OMh@rul_R;Ov z$A@)SMW2&@Efs&Wc7?)4s#xx;x?#t{&l);uNT~;}uz#2XLoKhmGK<1k6_>qxXtERJ z(yv(Z9J1Wtb{byCIbVowvAL^Js9^A5-cGKDbHW$Ssx-M69nB4{UR6eWLkzxIFs&;M7ek0oAlV9V8t zCX6vDYed(uA{TRIRead0_{fAoeic!gZq_YYM9``K?RM&YB8yiRbBB67Ij4bLb<=Y{ z{>Pk{nZp+ImY&(vROSE^qBZckYR0(y%S)KC+6mkVqSOt3&%0*lw=x7 zX|JUsNPlpV_>(U$9e-(< zoS3^*Ie}85FI$9gn?bB_tZ<9LyaB-ybcTFEUr;hp z7Il3v%7>%87>27WqYA#FGvG6C-j%Txq%NVjDpD%r@^%6J&IDc}Hc2orQ zAVgTm*Co+o+~)3fK>#C8XsFPT#@)z~LO5R$uF@e>)t#W4R@n1zDPS-vg-*WUN<1{o zK%ex`%Apwq{?-*fEB^bu3V(f#J3bsg=wMY_d>Sr4orlRPt<{ylWLhR@OL+;=SkJ@E z^BHgghovhjN^A;H3Kq~PbAKmUjtNBh5-SRL3XMuR4KMhiJGR7qhzivWKs`LvPRgQaM z{yH4`;u_#b?!E4}cKI+_3NO^xbaV1%_dc7`VtA`LVU)sxlY4DY3xDa$8ti1ZZLF{- z+~0td;iru-tOo7Zgo0iM=%OkT>$-mL5E>YAa|p4}_3+s%fy#7MiHtmDQrp#KB+8hD zL|Szr=83E_Vj4b&%pyO+S3QEM$?kil9g;3WlOhxW=5hsND)IpDoct7MqyM(m|WHqI!`5qQEx$p!>%mtsZh~| z!h)`4T&7GbAAb$yMMI?6@Qw`U8yvMQWVJ7j9akg02L5m)^ufqOOHEof>k{%qp@gVP zb_~PRNk6^|EJ(mFjeW* z=Ntas$o_Y3c4^Ml|6f?1fAIhLRqOu~1{qrUX6*R%3V-8xpjA?XUgO9PY;T$^IdMmd zR!rK8F3j_&Pr=$|wR`~@6AWA`ok$4tI{soQGILJyudq5ny;&)5b8r*U7r$PxYLq*` zWMeqh@RKL93qQzlDK~y&+p_5LGz9F0L#7Ba3lvin!=sIO9M^?$S=|X|Pt!wxD~zBN z5qO}T|9?gFU)z7}c1|N)>7Q)?HaY(1{PJRf{x2;)(EqQS{;x|*ok*dPVWRW$>L`u7 zWnZ=iWvOPG?MhmI`DE%y>g?)SmM~kGc!$US=8j{krj`ug%**9!ipxjCR>%XaH=QG# zJ1yrRtu>L;u-A*q%j`Ra4&1YVJwV2r8j%=J*nfBGV+Jjt8wC+%>)L*z8Fvr&tON~- zr0uq;SM2naL<#5AZ=5r2 z!+&-qfMkB8A15)e5y%Np-1rFgbu^zLEfU#_EP(oD6A~Rgb`Oo+MMqKj>GW}&O4IQu z#8~jy%NP-oO#V2S-M1J;o<0La`6&mKml7Vd*uil?e05%mFGX$rs@X zVS`ncQY(-d)!$O>yyJeLbcsQcjyfrlD3p=oTg-{V*=TwQkfw1S|A8oQ<4O8Ll;RGf zTCw)kywfMv(1&mIz!U+0wv#t<%?pGvF~*sk@-46=75MLOy|?HsMn$2*m889jnSU)C zLLL~@@Z=H;+Jd5necd~tJbqGhdNGh@e_SkQ1al%$#9e_ z@Q4&s5=j8zFOQ{GVx&=noGcgihG-H@-jYHS1W`k_i-)FuEx;8K6z{s82>! zb;}DNm66cK5(OKc@DGf1v^&rO-aJm^Np-BYG&JeGf!ZB1 zP4`HA)eeW%z8QAA?B9<3NC8x0P^|&TXuKryt8Q9DV5>6X(jWA?aub4j4Sx!t7x9^f z4I{8^qVpGfiIVvfuS)GjIIGtk3*s|4JJ*km8mS^{ zl4Y$|g=)Eh&)g2iZM46PADN0uSS`AurM?$DRZ%KdAwe1xeg0^m297?o0&8F`GaInM zB!58mN)aQ6yFG=eA-A^doi(dFd?0L^n9uJuyqLH^Tnz96zemtCFM^Lf0PMSIc_J34=7aq$l_?lisV#Z@sPNT+-oRGQCNPx*6~I0+fC64;1rl8kX_gF(E$h*z zM~-iA{$O%zkbnFm`~04sF7e``01%y#)X8Sm3e*2w&o7(M){AkZ;)$FG`rxH%1d2=G(E6M}4lA1ZD!H6lM; zW8P%_>rhy`awxy({om~TTygy`Ej(R*SpQ%3`j^OKkN|XYsM0MThbmRD2^=L>1g19l zVMkIeD1QY7VXy=&l&poRg-<8F!BN;N`4IOB`~qtjCvommI}I(QZFr&{I2Llb3c%=Z zC2Z=s0z~mt0jGFcEyjB_;UA=^%oq0F46>NqC9wHi9(84k>rq;kklMo32NKQEIFJ|) z{sP~~(}Eq~(}R)1#|QNq$lyfCo);jHU$sCFS$|axN0m!D(Pj0`W>ZVTpd#EWs)N+C zh9QmYjrxi4nG<$V0{h4cf6Db2y5YNHebwX6(Z=@c#5CZk8G8C%x1U>JAKWN&11 zGLw8SxJISB4QoDwcchwuad2e2XkEck1!ULp4W}i5XY^90vmV1QIfGTh7>KxwT923e znP;_?8-UZycFEa=fQdVD4K#AF-KM2YjuZLuZIX?KL)OYc_{mJ7R`d{9TzYQOb${En zLGd4U?f?4yfB2ayz?1cV7fa&5FT>-*{{J=a|28=^&J&7kmz^<&B>~&j$I3n2-j+M3 zaj*M9_`|WwSf6x>-h#M3+%V_?rbtwty?c%)p<*(W2`EhggOgs?E$0 zgIGKv)Lam@`1OFqi0*=Gz>|$VE`Qh49C3{;B&Sws3fY(IIF;r1#w<>g8ZuT$Y|<0J z&!{gX!oUCXf4omK)=H&Vj0!G|snI3H?R*6lAg-#KOf@MkW{Kd+>S(g0)2s%y84lcF zg~kx^9kXblLJ1I^mc|{g3{YFG1h5OhqTm%gOC)g2Mn@dV!k@3(TGNXDvVY|C=%Xbx zH6*0`5fVPI%IdT?XXk1sU7aUNx(%f0*gcihCU3XKMzjQ!DyHj zLD1MH8e7pJ+Nr20DP`gmn}1!-`9blN$S1@@y|qwnvU2v($&>f^6aF0q z+1z+viM1(a<8}CPknVCQK))vI0CL3@7!EYd@=~S6(Ihi_V{DW<{^h!+>rQUjHINO8)JK%kcUxS49CtA`=MzJ0g8O#epTSz*@B90+(|_L|JgLt#7$Zs| z*m6a}qkgfTAN=6k`j6L^Cxtru&Pu4RBEry=u-+BpBuADyXAbxJByNaC$EKl9leoS_{eK4D6+EGH!*1-?JC|dX$qNBDLnZ@V>L;4Yu6C z+1|tzC-Mt@DsE1L#>Bq7Zw5PK_snE2Z{0I4{H1!PLAyoI%73`j@*q2SBpc6I$BXGp zZ@RDI?ac^xtbB(QnbbY=IfP zXRH=Fp%vK(+1S)-CG~#(kP|GZoL@GeE&)-4$SaF(uw|!8c)Jqa8 z>@(tz8b^X|uBv)GS_j`gLteqETE?O*j-xw#7QHP)B$r+*L{dR2Z;wl==x3u-`WCYO)Rd-$~!)=E9SWo1^LB{I%*0POWZmYq%f5s=L^>$ zcEWY{u){BI2r$9_Pa$0Pm(l;7dpi5HaQ`$O)eWDDU}B`L+d--f zC4b>{GZLFYl-AvNZ!_P1E3ezS=;{E$MT4tvXW*led*6JX66_NN9G|7A<1%G+QZXIt zi%QPPfa~k3@VM^Vohs|9sYYq%W<^RI05x1z_t)(BOxSrDU73vkLKXf+#2@y<-bHxD z;nOob2PFe1OMQjMN>#nDpQcopCu5{^+J9>nyLPla?^Wib^Ehl(wT zsno?_KFSbJr-IXMNDC z361zZNw-!|<B_?d;#!~yUsm-QaL^ zdj~TV>H1LFq38q>uG3Yn5c~#8^U$~shG|HIE{fHvGd9$!91gcb)DKZY8LHd}0%_S} zRY>}%}okzUH$%M$rejI;Cy{^|CX}MA?bk6O*gox9%fE{E*OYsVnTy=&E3}laSK0w&5L=@w|P#SrH&Y6Kx@On{50dAmoXi>pkdB%U?h(AQ$k5oC|U!Wf6 zNyDoJkLUPkUy*bMjts}@JZI0u z!@kTb?ZoV00_ZrJ7caRH;c0~Kqo^Xfj8$L;%dm{~NmM=zs1RZ(3o4FgMeuigSnm9m zp)!%tApP=D+zinsVP6SRlDG?^=Y8>KN*@J`LzuFwJV zZ=jXk&>UtUIZ3Q2KE4vQSRNC^eB&P+73iqHUz?t$rfUsU+{a;&$L0X3)cEk=TAv64 z-)=DK#aVQ3Udl(mF!p21tET|K3WIAb1VkUbBy4A%tb&cX3myj;^Rv@Y-W^;d$^yWh zv*&-oS={USwraoGyqSSEvQZ+)c@GUAfJI5%wJta`CzoHZTM^+uw-WB4+ynfsRv&F} zw8F zlycn+An{CAQv7C)l(oc)Sxcgf$T&e5UW?cVpl5k;@Ea~d2t=su!u;ZBK{so-X?TC9 zVOBK`MsYj>!rVy=83HA+TwmCZ?+$l4&x#ltRWW09hE5GidW)VA?MNp2P2iMbS#>0% zGIC}wkANKQAfss8>lP4$&$)y_e5H1`JRAqgjz6Wk$g*5+)9sx#^?@JjPcUxsIlwU7tp?1gB#rudgoP5v_gro{H z|LT(>Oiq95R-5l_Y2~=`+%b9HDjb9uAvS?iU7ArY8MfVOg~a$17{?OMa3Vv>ECYftoV`T{DN6|ElxVj21GU6OPt>3 zkXUmWK1;&@l$^RNBLm!+yGd>IS4RyseXyH{2}*yy0Nbd_6||+ITlN!R4Yjx;s5!NK zPW$F&Y>6M(K4?eQ5~?}d=5W!;eryMy<^=y5br(2+~|5e9Rh*Gg}tA_HOYYI%SAUE5$(0x%KPodsXg6Ikr!pp1~{_VEZ* zpp=SsqYEyhG;bkw!qkRXQVq4QPlQaYzi%cHXoEp0(lfKdyHZkTJLVjM|0!fI?##F4 zp2n7}ri#`G$`Z05z9I89#I+la#;hsjP?O^@QTWY3FX4x07K07Tn*R1TRl3SAqNsnH zm$QJW2(DaC+_M7FR(wus;5t_+dgoiRB6F|>tkcsb&uImBwt=Uq{;poQ4& zEFPkONnNkZ2wn$gRXQtF=dPoOgC?{`ZkPZe0;@|6Hg@pLX$a9ApskcTTdkg&(i_C&Xa{tHh({O#A3=l&7Wpq4*>cy zP0BtAZSUXCaO_EH&JH|DNlcjed4Fo7x%sNS&IZ7|hmaxAn5U z{#Fe~Cc;yzK7V1Jowr+Cn_Dl02b58gKy&8zjm@pi-Ir=a;h316+BLjsZ>_5uhJ2bf zzi)2swRd*jzS)zNK)--n8Vz$}@LbF~iQJ((G3*)CeW*fG?Ooq;dXA{K!d{69EravL zI&eMo4R&t4?AWZ#kkNdtXf9ACpTMFakOI;9N2GQ>u76lT`enjas)_Z@x6_;W|H8WE z4e(vIf@}Og%snl{|9Sd!_QC$^tEB&x$Y~@?@OiMBx+bf>Y?fr zyxt&aD1RG4kh2)OZB8@nK9qN=f>}eU?>3_(^`f#Aef_egA<3W{eaI+?l3fjcSm6&- z!t+Vsgc19qk3Dd%!)jxkyo;y#mt18x?=e{A+u4ndN0c^P8;sY zqmZo^W~Zu7^;VV@IZc&QzEosPRj1@jSw`W}LVx5`Z`D~<^ZJ!ob~`um>Q0iaX78?c zSKnS5&Z1f>(H_hERDMPBAs!8-a8ZIZZIwwX#jv`@Ux%fO{b#%3P=J|zV7MH^1F0bV z*ZJru^|oPmz?{H)?7{U;Kh$>PPipc8L3xML?MHcF-r|1cq`0V#j_2VtoT+^wpq0_? z$A5V)JgT$F(q4bK9>XwNZq#q=&s*Zhf`Ak~OVl_U;H5`p*nmOTmriGQYBh6cYRK8`COR0+>=baL+MjT_qgyMxYI zl-v4r*7dB;({qeE! zfZZjy@ek=!1dGAhI0CgPJJueudy_7tMe`W_ryJ&B%^AEZM5LQCgEKQ+j{00>{eK3y zTE+ku(j=9@NCJai^d=rg3J)y?D|na299IK7_~8QHBENGwO3u*dR%g(q;FG9-e*~vM zbIzgKpf@=25BJ~fY_|^ZHjc^};R=-Mv@Gwd-q?$!K+G!F3Q6^bfLu{(?5+*(+BIYp zq?kDB?fP}57yxBw^Czr6;;-H{cYoH&g_fhU&CBG2?7v!@X!aArX{}qM=ZuoGFT%#`M1697eo&`t@nqADvfUEXk%4hLD3 zdD8&l@X7;9;azlr9C`x^=!#=5$c-^8Bz7|BFaB{AxNb_#J%yM)R#U00blp~BM*C29 zPEettC-#aOA{B2Jh8ymDw}0LL?yw8qcJyw%BNm7BcDti?`F(pWPq`v!LNpO9pKCjw zi^4UkqgKMxT6#@I?YxTWszNqTm@Yo>JNz$udeE%1nA3nyA1fYg%mkic$YklTxx;ny z)oh$|#CdL#<4Ee}3_;dCW4}_jVFpAYG*ss&)A$=*L}?}fUw?1ld`j^Q2us0- zl>91F?8wEgJ5O6CQM!|yXkufs7<6gq7#eZNC>zPlGS=x3!4Kf5g*sBM!ICm%DXFj$ zRw;RM%tpje<46B)6_*g*5@yRU*#GhnmGV6wwSPtcqVlz&5O&dBu@JbRBPr^%=nF9MQSl5;so&UBeZx#Uv{`18do}wX$l49wY;0TeRY$JUgJOkxF^x2 z735n6eC0U5^qsq@1JPqYolw5eO)FY*;ao4^X4#R^5q}+AcDCE=1xJdp4I z9Qsd^yBR5sy_Zeky7)in>)+A;nxB7&|MOMTe~CbjYkrw*sq@H0P3t$Mem9aSBd1E2 z^h_n}qvkp5nas{jt-2pi!=4D~H9KGYO7|+_^Fr}68bFG#i{)Rp&!bf2SSscSyImcM zOk`UwW`AR0O(EygV$L{0MFpAR`(lRfs4pO%n=SwPYS0OLnaDF&o~POCi45~)&}NZ< zV6J4$*gMW{4&;UWdy1TkRXJbu21lW6ZmBAlG}z>P^Rrd?sCOdMTvaB4$DC`vY?RLj zXX5*!Y-(o4dxJYITV#^MAr=W|1-wYYVRkwYV}G<<0_))TSdHOw37B|3+O=z$ujCiV}l9|vRI&$rnQQZ zZ+}AEKy#PABM(;C|BJ4%zwrLQIJaCl|1B=gJ;Z*M+@*_qDU{@4nW1{+;AnMJ*gtCoZeyd~W_b z%Cks$=(UhZcqpfQOEPS{(%H4Lj*_!vaDTxY+_H$c&MATfiLgA%{kb4I@=ekUk8{AO z6)Cp%3BA8xg8{2GsLcQ#4;mgMEibC12EaTSP1BD#OGpIWO24G(g9C7 z%k*4Hp2FRQ5Z92O70Rk__UD%C!G91~BUHNa=Nn#awpK4Vv6K~j1XkLw)#_0EEqe27 zg<0g+OWX>p)&yk#0?59bt>38Gu{kq512Aa(P%=9oj$&Y>a$oqEO5i=u?8}eBB$2CI z^lbNxh^;kqm|nMTDzOWYb8FN;ic)R|hI%bN0j|V{iQEvnI_NzS9mn+s7k^ReJ@pU} z3jwnDBw33Q5UP@=i;A|Si#c*U2idSNdIkiZ*2HYW6w&fiZnc@l`Ds7OV|3OWA46~B zlT!rRh5&M|D-bP)j=V@)j#KoBQTxzuAc5RqF&Oq2bsBf_bkNNg^84T-zV{@f|GoZ6aL%E|HR+mV>U?cyNzq)e+$L<-*Zb3@xT9^e@M8d zP$Ot+#hdEkEx;7=AXA1rB>d7O4+O}~^}^(2gsv1&&6Ab2LZlo~a(^DDgQQRAdaB|) zN;6S>HdqK|ITbk@OhSE#LGn@L6|@9CFeRmI_&OEv(Ujh2C~!~E4MY==PgoEdIq?w7 z`Ox$bNgcJ&2PiRDNgf4PrZSW^H-#5Lm}j5c#+(w4Bd8so4k#ZFoza_4FAAykwC_!) z$DUOZ)oAcrGVGJrFMrC68<9+)94iu1S%eaxSe|t}iU`4hn=+V_}2sP6Amk%EQ)A{y9#xrHdVfp{oKhq>ttv#ZG;#xJ zOg~_HHbWSh>CT`xNNEE8xfsj^3$lSYilV1Wi}YbGm=EUUhd~-r;&;KUPUNj}8ix?S z%?3|{MKur%8rL)%EWrvg06SkVg^eA+%ydq}SimM%p8nV$z-RjUJwWb$Rc+1#oU9*jjqKIEb1cK&y6U!6f8{%&6I~- z{WIi$CH`O7Rd6ObxclD!7nh3uUlx}i{D1v9`@i0%7aFv|O|48B6F$`-?f}*`-4CGB zUG@RUm)dw6Q^E+BQrW=T30t^TQ3@I0urlh{M>B5 z#;naft{4;F5_FiWwLw*`;v-dyKwY*7s0|GiHGd|7+GLz-hhQ zP~g0Hfn(O;)?PPTL(WC-JSteh>{?4Ful~|(CF|J8ZmV&&)@;ImqU(?+T7BDWowx9} z$=QFyCurn#i@QfnBd}ebC$)#zX!@KbM1 zSAPoCh0SItU_*E*_ZtDUYT%Fdx^D4T1`;1b{m6OW5vsHVHf}R83`Pq^<;Ce5{I;7o zK+V5bgZr~60-y5Rf(ujhv2B0^v$?hU0;UuZC=M$r{&oP{hz;b|2JmdWB`uctzTw@ zN5gJwN>l_(C}FS9Sbt;cH69eFLN3GmJ^Y?USMW>1SmF@SCJY`joMbn zc6b_S|H1}$%^9LC%N~e-Focw!64lOUWE5k88?Juew7P?Uf4_m~m#_U~aAhCY5ZB}e zhmRE-T7mv6Z(hQR!On=(Ut$sk{CW|65@q`7O@fnUw#y~U5by0@!W_nq~> z^}+j#um8D)rKiR9zx3e$^M9{f|Mu*gBmiSZgsG6}Skf7L!N*-%;R$Awchtz#MVFMI zE~7CQ8RQ@x_QvkQl}F2x4M$ST9R!W>!za^aA^ouFK=}-(M79WC|v_3oMPn@<}M@SWKi;NMV|qCws$<(7UR+si@)%QN^R5e$iC%S63AE-*Sk*&-1_V|19J6-UIoc zO#c_)uwRV-F~7X{K!5-LGWu^$zJ30;7{39&k^|$$l;iXOQjEA!REj-NAz2sBEa4Fi z2<^;63{3J!suq@6ke!UB>KTVz4(FK(ibOabBcfZF=t@M zz;x|_HFs&WLID>GbjbLK8XHorq#poyl4cPqf^8ptT<07HW1y@KcvAD|GAHp7*PyV2 z`#$6{7;jQm{C^5iE0Zs6nil~zPlKF!#xNczaSrLL3K2gyEr}I-bV8WmDUZmc<2dX@ zDg_;@?Xufy1bmcmbFt=r(03}cM8Z=T!jIAV9h)9>pX;%9c15N_H?zPewwUXsXB7YCtfg zK{GXxrjhDBU`z^hVV6^y-7Y`{44|2X;l%2~EPo{?8)1kpUJ25~l^EYbs7QYh)!ImM z8WPjW#(!MY6|S?%MOg=z*Rx1UqhS>4*%Zy7CwhUwo5WH_`h$Rv?7)YqKpnk$Mn{=^ zMvWi3(^QwP%4kl_54Lm0IM)FjiP7>Yqxsp5oUDX*n_Zl$V?gh&kwMaf>|IO~2F!gZ zIvDnGDXd*_wJ=y1I$S`#MPtDWd_?FmfxmaTk$<~OW!r^we@ot&whK3=EqP(~kVaJonGLjd-p3 z^G}fQY8@f^xrqtLZsX1F8oxCgBf4M2v_z%-uJV0UY4dA%L&nl&nRW%gzti31&j`}@ zYk%@Y@oG~xhWxv%gszY~xjbLtH7p9lFRu}Xs{@G;hAY|bhR!9@g;gY_+*2gKD=+T<$^->F$M`B5h z|50))nynG0WosdJVwVoYQo4*~&emw$pvvvE)zWGNBs@PYy)|!{Hy3<{CWwC)ckKzP z2&iM}cWb)ff`J%|##Z9f{pr;CY z{!7bHbJ=kE{Eo>0{x+?jHa}@7{;u#!kg4hg(qo+cRnG?f^w;>gBg9M}x!4PRMW_iP zwIGGg@dgm*4JH}%bGD}2#+tt8yTzXkftCCuX!Tz4Q+r5C9J_B_iO>9+?tfHAKfc4| zH*Ei;A$`H?36lTu51sl>Bk~Jl5*4g#*mlz#Q$@BZn-L|o&i5BVM zdaWPNTXKKHw+myc_6#K*fa7V)pcj!LY?B3EwDhoJPybjG*hHzCd`tTC4^s?R0ndC( zlfdDcfx>T5S;|ltYFw?uI)7gut?Aa1HA5>$7Mf|Vq6W`T=5kRI#DUSmM-y@0vfh!J z9YHc6xjkAl6~AcjdP{?+Q=viYrc={qdOumKoQ*XN8XUc=2l$TAZ!xi+C)QBg3fhVsXt`_iNTPw>O4s z_q>kJjTRd*{Kl=(nxhOrYmb?Rog1JTRrs@^^}#?#f{}Ia2vmPu)=bYx`^4ZTaa{gr z6{<02PY)rtSh88R#bgvWMN8YrTWal*knUBD`;0%<`8b6rIBQH{%Rxa)Cr0Tf8pM~f zzShj(D`!&N9|`s)saNziemXZeKGVWnao8K?niY1%-_hHGzX~~|* zzhA>Uy-+yNyFZg`X&e{#HCpSe0Z^n%3iD6b`J7F3a9wLIof?y$X&VL+J<}`mW0SyX zFc*GZBinr2r2JIPW&3vHNnG!yHL?icN0SF?FMn_5rp^j{wi20YmR8+4Q`)w9=-0Qn znwH_`jnYgDEr%N7K6T17w%A zjF7}Kx4-)fH*=Ozg;^%8RX@4(Z zI4j24zAhyKH78etYj(K9{?Nw1*Mnj`2u~*e1_aPX&i2YsA6NC#cA^v6`di3_IoEd- z!fR}w&>-5>ox7sQedu!#8G3^1zPO?GoGsYWx3J#PpKbH#1vrR$_t>bpcMk?%3lGd2 z_B0pHkS66mHdX6m<})`5Smv*bY4|$O>$if(6}zEU z`K;8_=z!*4-I-vI5`@kKz9}n>YSYjF02ap-6Q}4pZDd3@UGW9aQ>Jo#uty*4TOaH? zKY)#FpDmYmA)wUB8Zu^S->eszt%q{XYk2^a9FO(ImXYc1-oWFo&^?c?;(zeFNYqnk z&s$I*oL8wMA_RLtg>r(=+PxDfuK=)w91&SJbve1K!V z`1iN!PDs;a(|2fWIxtDv0RulDph8Lv%-FY=x6+M^Mto+s0_MOf0ZB!zE}_;to*u9$ z^U7Jl-Q1rwZ&tDC#dzpL%YV}ok}$S^)iW_n8z_?W=u(-`wBAwLB!8I8BCkDY0$79D zh^M8SFT3xGhx=6M8Z)-8dX_Rxbjv`kB`uM&jr+h{?HOh^VVJftSE_if8=LrW6e8(* z|EKiz8GX&lP+#`rq(_n!m*5Qyc{;SNa<}R#A@=rX2VT6FTAwA(7Xw%IU89#JXJVS~9C6Sj6yiUr%_E$Atls7k_>*(plnKdJ#Y`Av_6A zvVA!RtFjg6%5Uc};Qkdb9&4W9CIIa<_Q-(LJ9R!$Q?~W=xsrhPzX3b&_)gpqTfO)o z;0hu=WYTRzv@DeO?Mj_3;Jo-Z_qXeof<`oZ6c+y;SGVf4efR3ndbNK)c$~hXU1M6y z;+lc@EI7!kHhrYxFdh7Z{ zxzHN+i@vGd)Mz`nt!Y`NjyPJ#z5}POmft1Ih%pEsWq;qPk&DVF7z~d-ilJ}RE4r5$ znclMl?k4=P2i$E)=h6X9ktx$BYzJBzs7p5l(S50@6W3GIawyvIY<(kMS@e!3vh3Da zH>#uW+G9Of>L<`;N?Eff~D8Xg|n%R(G+o_j@r3{qpfGkEU8IV2_7E!<{4 zfUcRgr;p4{vKMeWhPqqr`0`jF(;TxQB<#2S4}a+!;4G&?-{DSLWtW``w%PXCn1DLs zahLov*F&a`kn;d9=%y`BlsO2f%x!Kr-JvocX@jrgz1C4qM`>VKDcGn#7$&WR|GLbQ zE_hrk#P*jXz!u>D*Vjw&pSHFuFZ^#m692^qpCQ2Jcz@z(5(FSB`Lh{7Zj&@s7}6&ag6OJ#O)kYc<7;ZqW&}w& zBM7>~yt5cVYBL!@IA75-7(t3#b(NXsr87Bm4b~E9gK88QJVJ_yk>s%|dyh0yMQ2>? zh1~CLIa;BY|NU9_e~AAa52jxO_`lr#4}aUG75{7PCH~hB-2dh9^R0hqQ~we8{k-a( zA_%>M5Z2;z0S6uSV}zrJ&9j5*>CuV6VV?wNjl-jPTf3fsUzLF`@-24Ql2wc;21s?) zAQSg4QNT5|sx_40E>Xmww#NxZl~Uq-*I9nA4k9e(H=jf=9bZ(Ac?0bBaV|Xq{~%?#qZq*aj|T(CyGTo*OcHnCkL0Z zr3mGaTqPX^(jSf#@cmS!9BZy|5`RullRiEw)`MWV0#=LLWE6pbDw!D|egyuXad=h2}$m;W*JO4p&K*vu=^>6^SS*c{KS(qJONH1B(DM zL2y=)q65@0V-rP{Dh6Ey@u6VrFHQ9v#2$jci_ClJJ3+P17{`Pfy9Gz?LrvL8lQ>> zd*In}QAI7S#P4gUjQlAKfqzYKohiS&^Q7(MVAgk4Z8!?6d*@ZHivGk7Q}nM9cZl-S zB7-KnWJRH})Esr;($x1*VJvmWikV&_ppL0REoM$AE>zP{-l&wWyRW_Z<>jl&{C3o< z{YQfxR+~blKT3lT!W?`SQpt z9Ec^o;q9d!mm>G+Du29>i}bC;uQmT#?q3k_$vvKR-EH+ah<<;Awg#yYIl2SKSjAHC-+On=0t{icc^QbU25rH~U}H^_5Kd~ixOZqsK@ zo4>`wj6phw%t)GX7n~M=+a&r6_T#i(FRG7vY?Hqyeter&+ni z{3{tiY~&djqJMA;vr5R9CGmD$)rb4s}Y*YSyqeYL50%i9&b)7sCA$DyL0{RZwnaINrCAE6iyA(ePZ*zu$W1096cH za{cuk>wM;kg?J{}xfe7+ujWlqhB4LouQ6}1fbzNa41XtlLF*1ie$RP{eq@zgV;+?o z%-f?{p5fAVO*V0XW?1#jh%Y-KO`ywJ^T)6!>#FQKr%W%fq3dF)*POVsV)r?r&Btf( zSj5D}cF+E}-AAPDJ#BcPzj2H%$n^wQ_k%mDiuashY=L*2beekE#a?zXhCjJ3ExLvf z9LmpjUw`(x@3_~6%+qIw_PQJYUvRHGBh2-zJt=3dP47xbiqc3A19OsRc94-$Z=)mOEq9u`|v% zi)0%QzVTTEPT9l(&|zCLjIvxhILsY3%u)*z(q(hRR8T|i9MJ>{1Cit%8)v@VZ83*X zK5wa6Hyjos>N^H?284AydSDlQA3+RQ)kAF`jCEgc_&mmd&8UM+mgHH?Cf1IHz#2%M zfqz5^BM_XF4O~gF!M2-C<}xa}X2aWZywz&MErwfx3)wr>So<5O6Ht9_?e5($Pma$X zg#(4pUR*g|{6F0BpBsbe@b(KrLCp96*x1}!E60C+iU0Kj?Z0fmx%Ia_jz^a5R}lKc zBN-GKelshv45DyeZ8yREIKD>Pr7WQwH-B;h!5pPoQ5z_WAwpX9Q5Ih%_a^r}{3WtO z6LZ|b2nC!fK8web46VN^r+hMsvuTnWmS;3TPQiStB2vm|3}n2P%<231pA%t)1#>CI zg@))2qUBGH46S{{>tcS3|A~H>9I0XShvMi7peRkeAiS-XLX1aA%O)Nh0c%$)d zpffuqIkx9<<~xD|5oU;tJVO3VYk$1oh=N7@Bd;%_Gxtd7W1V$DVv|p@OqD-1)nLBG zK!Cr5J+w>WV8plzsFMUZXt(6Ps)!>faNY+D(+vpQ7PIXh+S3edz&=GTPZ*UDY6i50 z&7RH;q5~1Bd2H)Vj}s@%o_uD&^E8Bj=RIbP{6wo87cPrD~! zX2_IrHW3Bq665S+fP4PTNled?enwx5A#k_&sx5luj^h-C+&tnT&KqXlO)@i6)=e{O z#-nyDz87{s#p0!VZ&mc(LDleT{#xM_{{`ZI!6{apE~_Gv$Y1Z0@%3LXlirs^f}Ah^ zt#7XFl;yvT7ysWMC;z!do_`C1BGz`B1={XL;|P52Ff>x}Q3K=l6yjQ%^pirid64nB z9bvkEXTlZ>36;g86!Rm|OMI<@+lWevNUm!{_92h8}C(0P8oB zUnaRTG9;Rbd(My^$`Tq51%<0+Obh(YG|Y*kn-_XqauFex6*k_#vr!uL>P04#~5M z_ksRboGC}r+`~k;hJV!EUl=_n1FFh&df&05l^Uf@aWZtZOV71+v>&Qp-G7TZ_ta8j`J(B1!uc=n zv)>s1S=p(S@jqMJm7SOK|A(FbY~=Z|e_lNaMD%q_2LuOlhWH?@54ys?A!1@S89_u& z`FTk#q@ugQ7x7@q6-wF(e2kyK8JZ^ zm}aAntt;C&&nlfqLzfN<{uh%$cAB`pErE*~^s6T+>Pp6!y- zGgL~?W=ZK;S4z)@E4U*nJvBDqfLt4zBz|I427i$k>IsiRQj_kHnrMH9n$&`SoLKE? zlhgUBg$zl&Go?MPqU*SLA=Rh;ah1zMO7Ko(6e4D6Js}D0NQZ$Rc!WT&lRON*EE(g& zxg^b2M=Rre20OPSHhw5%(p@3)UKqGW)nkeD>fdwL?}7yb+5JlOvw~ze>vzOFQ;>f0 zz<*i4NTW+KZ|^JBkE_RoVb@i^R;m9Eo%QRm{yX@N{nysFL#$uwA3N(8Bhv!t91mUf zYXkkJr=2yb&#UPXxR+^fCvGWdaeRPKA1}(4oB_mzC8G`qP#1dyS5Ov=r;kfes)~#D z?0$51M&iMj;H~E|y(rcO?$1^3`eHzOZhyFU&TrI+i6>YoKLH4=_~)?ab!nK+&D(Ml z@e{Hg4I_-xF16%3Sk#iwp8OU)d3L`?TVjQW(lpV{Ro)!#E3&8K4-FQMO77_tQ*Uoh zOVDa_>a6)%spdCKv)`lWN1&ZeR71;eQ3M zNZ->2A}nOA9dN8d9z4ZjQmoEv?@6T$skvCnz=+zwN|ByS=*D^Tv{F8Mr9FJ$E@jgq5$EgB`crITl==|SrL8q z>F)z`;74_N;OK7|9ca@8J_1~BH}|d?%Jz;{BnZKEV^2F`OpT!qI+vj~EaU8kxs3V& zj%QMPNk&)3#>&DnGFMD9md^Q(?-X+%e2#C`z0)wW+fmw8ZHxA~g_^<#8Gq!V_nc(3 zj^~!eF=~~QmLh+#h|LY|;A)mO_FO@?AU*~j7I!RI-I3m)wmgiAq>qz|TjWME>kEht z;tj~jRFF19%r$TnPI(|NDVS*1kDPd3{jLpW6$7Sl2Bo#vdg|Kaq1{9rsC`^}aEje{ zJ&$b@uRYCqTRgca_KFQYSAQ{DVw(jsLBEcS*6e7ZV3Etamxx82W zRv??3+Ua-bpcA8idV#5=ZrxM&v_nH^^wD~*@CXdMP>Qi-vjV%*>)mJ9#A~d2q2;$u zyTYzcb;_cSQm!M0rRteD7hh7J@lTX5e?hv%dmaLVG~UIGdLa^GCu7) zJVSYCJdEcdBiSaBEx4(zg`@Ql6Q>`togF=2KuQ(o z26o;7rEN05C<;Eooqw&+5-IJC`t-z*JjwvukW%oqJjz6#Eha>qV)xLEd=xN#DjMJ+ zgL{z45d#XIvG5JHbJ%0(Y<;ihoG>#|Cp9*4&%|x@hVd4RJg4MRe5Cut=YTU^+P)Qx z>R{<=Q$PSKOjTP%d?Lp1#ZCKMW9*G*Kv*K^%QM!#*MU{#Sbr3A<5Qp}YqHjl7Zy8V z4Y~2DqaHlFEZPG`9;J(&$$;U!&N(G=EFR|M)C|roL%xkeEpDZ@xaAfYhM{(t9D8Xn zOJI=U!4?U%>+DW2VA1;$`>p`5n6>@XTFX$M+D_oS(QelaWx=~b%tEg@eEpUJ@q%{z zt(T#?00WK6+kbCOUwrV6J@N-N_wBdFbZ}|yNq6kLrWHt7%A=Uk&igB-#M5r@v{ELu zl2#&fm$F@BT8YuqO1Z14NOroM)nbgC<-ApC@ot|zt)z#VzV#!TYD=KQT;=rYO#d-; zmoltlDHMw$td0+R-bPLD&BvQ;`fSxSC9LcDi{r$HYZ6bs%n4)x{%3u&!KlI3RClLOw1mEd`yC*UjewHaDX`=KI#p#8NhNCnQX5=)=$1>N(K)5QT zF|Y=bhrxAnHRc?Lqu~hLJ#t^BCTEdxd_M+MPA|M4p@)McRFoxIM)+jVNhe*XPy3;N zITVf;qJIIB&wPN{b%)?=qD<}2v2J5$KGVb* zD5S(dF=Nqv#@7l%eO)kF#caTa8O2)zYW2gqil}Ye_ud&m7Dp6B=04hV`UWDGoxbrg zwsW}XJqDZ=jGFE$pv6O`l0Rt(5vN55HOcX|ihtor8y0+tA;B4z*J2oB-jzqZxf|Bblp~2aD?U zEe~VNRyl4ue1z#yV{kR(P$JXgxJZuPoAkkMLfH&2Z{p4vA@EwlmhP-V@{MP>y`qb& z;kth-JYDlN0U(vjE7mRmoJ}qNSLiJem$70Tu!U~f#ec9j5nM0*yC;L&0TOwmJL(l= zE*(|ny+FadmXf8_#Qd7@_`32Gy_oGOdh3;3MMDj)#gL{okYRK>?XBYqDABGN|pBhh{}9qN2OJ zqOM5l`?{j!b8xIHnkng2i&rPM%CiA%K2l&YA`uCRi*x))$~I!idg~pM?QGZ5wL&sr zK$lRZYAITAxhB%^enl$ZUK!Ob>tYS_o&{kq7iWocKy+06d#X^#sA0AQqYp6rXmo!f zL-~pB;f>PO;LI*fy!lA)J67OjZZ#uIq)5)F5_+DC&5X&pApMDmpLMoGc$Lv(3=L|x zo{pNlibZi2_Bj<~QOEbJRC)}_50S?`z9N4iUpc~Y0Qw`QHDbq#F9IvrxeiczQ00Dj zvCXOUL6I_vje>hjj#xlZU(r6QGFpEDtrYHJXLtmKGCucbauciXQVn@m=Da!DY%KQ! zG@Nym<>iw-Zy2ALzVuw;{6sxAkE^YRXqR%d|8Y$oH30Q3#xTbS_GJ7T>iZCu%#G;- z*<&HXdmdjl!l;W%c};Szx_@i=?&nNj;q;~Z4Lghn9jv;)Z*+hAH%1{BiI0D7q5YBv zQ|nC-ZVLuurSw?!pXn}PIyNu|w%w9jgLYnMe4+C~%~q?3KSS&9Q?9Mj>6;wkyG$*t zl5|bT$)OTRbM8!spJUr|MEWB-<_Lq^qGJ+f%?9rDW#GQ;z}4rt{5)~s8ruAqcv=m7 z?GtY!la0D2|BF;6$NIp(^#XscgHqnoQ#Jld%hy@;-2zq5aPeeEyMD?}J{gwWQc?{( zchrtX_|AI*$#Yvc z=(`FTC)ASS%J)H=O2$02d|*eGX99IUU{1HhJ3;GENOk_7O@lc*{<8|@`>o?YZ&kJ( z@!xk|;y?dD{T~~8JN#cUH|$8D02}6@eXw=H0~QY&(8Xat8IK*jj~RlBbJId>*_w5{ zXd{?(=Q=9>5_VhoQ`&!-Rj58f^izD&ZX8`fK8WbArs)CXTyzAL&p_LG9A%)y)B40t zH0UM*NsoZ?VT$|$nw%i+gJoOxm&R2e4aiU}tl!9PL;<8!wt zKDRWLpRI!IQrm<;+4$T{FevAql8Q^UR(G_xPYBBJswT4Z6s#?U$lK6`ku61Dk(qLBDPXzGDGDl+YpR=OZn77~$P?(KQRF1#ZZ~y>y53PU0QJj<8|+ z5Ok^Edklvt%&S{Ig-77rTIf(tDmOF3l%b3|W}uTaXxL-}JVZQB1G8b`Gd{{}Zfuxb zl+4Xp*OEo~6KwsQDgBaaGGRobOjL6y8p02tY1pBK(PDp-2}dPn7Y&~cqo!c>IN{iG zgVEHU&R;$bAjA{w9R8^<8Vd*~pcKX+!5#^B2Q5#YF@;Y{u%C%sKXL~V!SsG*4{j(H ziC&lI7POMQQ+Rkv8KA)~#4ucJ z?NS@pJTiZWG<=4;;DCBEbTkgEE@Sx<#cspi3*UJ>YK(cecwl{I!#%-!o8|N9?!Il$ zx|Mjt zK>z^8^&buL-nUrRI}PCyu*uS7#eheN@zdt0Yb#!C(wjXh+K7 zK|Fs*;8vmD0$@JJnec&5rWB7LfFR`~qcqVWQI;TyE!{b}Z?cM{jvsjO zbtGDx$vdNiN!N1!EmP3|;Qf%SEm-UPFH|TK#y?kr5kY$avcY=n{K8!_m@&X z6~kUHi{YZ*jpI@H87I!=5C+&B6YBKAuoy1&2Y4gNc@!z1@Jlujd{Bx8Tt|Z*d`Q2N zK_`o&9Da9W`mNTO&|6H#qsdsW2AGuxYCVWi%YhLNR}))UhEgLQOvQ2x+o!e0L1=&Q zCkNPw!SD_g21uvZXdme@7#5jjNf#&eAkHFPvK~;SPf1|pn-Qo%vf%{g{Z$%`n~~ve zPtN-tsNMZI9w5bHExDH?+?{lg!m*=+ZixJg?#SiO?r_4@82R`iMa2yGR!KiHq3*fl zjCe_Y7#+@2YBd~4fq-eN}t4E)K{{_s{>d^!-aG~(p zr~-+Gys{jhS2YapBNGM#e7f&?`ax*lJxOrD5!WpIxD}}@1YiO2S(k3~wlRN2Ddq=0 z^G6A7eD@jM1wMOpCB(*0Lv9e$+5`g#tjpSGS6|EVit(n@iQVLqE(aYQ==|O=#GR`m znbTC8Xq%ZS6LA;%Q*LQt^w3PL!BR1f8ZyvoG%CC7!beT><}C;ZwF2&eV$Az2PDk6& zV}zNZTEV{4mL@Xs0T9@`q?&(rh*X0Ge%R%)7^$4LCX|sl5ockMns1`8%x8tgoCIla znc`L#7pK@+ptun)uBVvMl=8t2a^f!AdfH|xhqmz5pcvuw9Jl$;i*;)>gc0a6JdxG^^TpZ>qiR07GJn0?1hP z(Icc1=$itzI}=LYE17@t&A!?-g5Q$HOB`CL9NzRS#qh4BrK-{3)OmDOwNLI>Nu5)3 zD41?SD5t)lm@YBr2Mk`s+%9!B$g?!8IjiB+b0M@RTu_bUC$zTiZf!B89=*LSb}T2p z!|ilaPP+>gPV#8#eS%pBHV6p``lzPe-V~?Zxt<4+nsxgerx<@M3bOg}+t0d|5qH*@ zbt9a0pM7^htQkycr$mzQo(_S1w%a}Uw)sUEh_Iwj3kLktf_XRecvuWQBUU|UP3l@K z+b;Q%;`D6eJcHEd66w*P$be10A1nTE+W7S3mDKEN#r zDkEcL)4JYc*BvlPVGF@zi+3AipX~7H zKf2_rMW2QCWm1@a$GCZ~vQylDEf!y&xR_cN^BlT4a#?oH<$ix(!#%7$FK~XvhMtS;Eo!CSb*t~# zEVvD=!{yqJIL3mW0Ff7P<Gmm4UEA%9D{qG zV~c+pYmoI24;n;tV2ih*vc>Ky{-{9iJs6$}Ht2!X>E1VcD)Scg)Dn{wtKKqYk}Wuj z>wC7lKOHFH7CTEguLje*eb+@Nw54k}1b9C^dgsyRB0MIVN~HoTEmGaz2F0s@7>4qQ zQ;fA31Z^XvnXnmhZb)^eNeb{&_vU2NVhVqS4&R&_^ZKbx{dD$(ema}KIgMoXA_(V9 zj#@$qcnt%IinXr0<&xB|W$Gk8F5moje~jh}HT;8Tcfi)-4yfBhpN4cb=J}n`!Ty8W zigcoOTPus(+OXR?_`|mq10ULLo#Gk!o47&T*Y_B-_spT%Td$MHYn0&5P<-CL@g9G* z-|7kMn$WT{vRn;JX=~s;TLnb*=gJ^@TI}Ss0oj_NPPs}gIj`ctBt1Kq6v4x7}MSon;zHXbltm{-Y$<85$)+c zUh4hEPCfX9sm5+u&+G(RAHL6MDnctn?j{B-x;?KiJp-BrC@S1*5Dtvi9y%BTC8wG%mS1a2nl?>G!S_fln6nw$yspSjuf zOgV0B1eD^P=iE4io`~hy4}Zv#=s&-)TCiHGvEen#a~Qh!8OG>$9hiZM-tq0wcYog3 zzChuIZ+^bYKJWVrOW!d+58oC0@>e}!WpHw1I!wR1h_ZAk`mp}W6(D~In(E0_=jm(^ zwN||8lJY=VVNRfYTb{|~km?H-=H}0^7l>bpaoH+EvuwyX2}Cue<})3`w8(RL@zn$# z-M|OlKnunmTs+fc!f;u3dF$@-K-NB6APy?Hj$`=4<%fUSSy-xJvA%Qv8we)rw0y#; z-i7^XSmi;~blYzErmcS?Yk;5R@^*0*X@fRqE4G+D3O<2u7>AVe5(*n{?cKK!lD=D4 zaXUR)Wc+W|R~t2pn7VG@8oxn*z5D9@wO+S^6`g#m?h1EmM)&-nv%uQAIHvaxuyLy> zIW(h;`g8}u*WcOiHS;j1uu6zrcScrXpzN$N%xWWKS)t<~cr7r-!X&h^ zx(Ue(Ovlv>t9>Jwm#?$x&d5rPmYvlUvpQfo)s;`WHg7i#u5DPYrJ^;Xfzi zBwfwoarW@##6L^%|5VmDHf;Ro=H}W9|Id%Zf9m1q;7@;eh>$Z)N24H-b17<~@i^{} z0CkoAu7o0AvXPPi=5i zOg#>=scX)b1|t_U*eO0$8TY612kTnE8_Eu&LmV^mhL#|2U@osb3DLm+Cb zXz?)MTmyedcPwxNBTgFkrdRyiQ$Dvu8vu+hCd2XJ2jP2HZPDTN5o2lN*|q;d67UDa z|F=8Wad(n_IRU`@_zzo~Yi0a@WoPGQ|Nmk8zcKO#0f2g8fcOuG{JDub$KVfF3C7?O z#AL;vgfF&W=mKP&rT~0yCjz?9GZrXg#C#*Te4Ky9F@uz62x>>vxWWV%hgGkb(10HA zL}`qudy#PW;WA6QcK#pZY@BqUewl#4=ZOB!pr9Zg#R8$-F{-7R3yPAD2FJRHb2<_B+@0ED`$nuOSZzDl~<7S_lWa zA0**{B4~il%UO&!!70G&g~0#2xD>c8%G8(%=Dse0()*F<9BlI)WAQ^qhow;AH2Vymk%Cuoe68dlry#J&9Z9A7c$^o1c| zu;>E{U0hMo-iY_Kra!!A+Jw^Agi-@&#OdDQ{HPEYD6<@aNn5lm^A6{xv6HQ8oMp;##?6a z&SCIQXHQJCLxrE<5yV3yV-vxg~JRLbQ|qvCA6ZiX0I<(uoij|MueZ7Js-{rH?@C5TsUnxZ>lN| z10ecQ!n3qjpJ{>L_}pn5J<4^s*cwM)6C_y8Ry;HUn&dY$vl=|Slmr4|91PvPBY)1S z^kQoA9*?oBM|YQzj4(GSP){0Lr z7H*4>ET?_qj^cETRb+n+bGyvgOdYZfhEsU<+4GUd%`Cc)_RS+s`gZhe%=g$)nvBHp z1*MGxi@qrFo%AkpQ)H@6Ga>^>AH@jjd~Q68)A_)%ljAwUQR{TthW9kVk#yS#TkYC% zeaDvDJ#en~kLGUp>DJ?31Lh9&$^Dr)KJG2ovziJ|#TaIF+fsjv89DWCJuZ%!rIJpW z?ed_M<{+GR?!#xzv%5l2&ho^pFJg1E{dBxkSMaX{X|2%}u+Tp;9v*aAqJt*9qtV@; z7~Mc_1fJ{gx^iAIz#)oug(j20e{%_YlEHnOePQfr z_c&8jBr%gx3CVweh}=!=z*_SB$k(PZ`L2DVO;(;wE6;bn;V`6AZ@H!1w>(@846pRd z(7bZR$ze&pobxU7N%Xy$C;HC0bKBBhveW?a&9S#=fZ(QBCs}&aa~;M?+7|84e9i(k zBaoatRQL1=lz1%Wcuqt(b+M~FGDJKb_!r7egAO-65y8x9gd^i4e07Ws+V=D52TkV6%VZGu|fr=nj^`J^98p zPN|A*s?~p%=bBVZ`fJRIv(^9@ras+y^fun|Q_J(hyyr;KbLy36o=C!Qfj6GL>$ITl zqO0C|OuBB2Je$E?V8LhuPkjn%+epCG>~QNLpm zB_9Jiv9<%J$UnB7EsgOphGHw|(e=(B*`r6ZYwUl~nBDn2_=(|ZJn$^RtvQ=_vSx(I zv;;R1j*olX?pq7tkyUlgJ_s6efDh^W9lmjZVE$rho@f6RRfDlhimA7}s7gKrpr;c3ajOYygsaO5#(*ORSlNCg;aLcsc!BEZyvKR7E0 z)4+e=Pig)VahrL_id`F%|L?O!l-56vM$z}HZTQuUM&H!`V{LtVZKv%2vHjxz_XF2I zA9-U7P%psT4$HH&AEe0uodG5T2+=2g_tN2I1a|(UPoWddVP4kB508$@r0j zejIn%GnGvGK*(|+8!TIvB%LDIQ}l(%kR^Ygdk}Pn>7+l8(aa<3<|$lL_l1`1yKqEUZG zA*a(SJ`}d?A>1eL0}FGs?r~NU$Bi`9W-GrE7(67}I_&er=Yr{3q)vlsi3tqN9*mRx zs2qGsp}G%=!25_@Nn6^-L-u3wNnKunikDiS84_(V5$K8pVUtvcCzL=82=jh@7eG&b zXx(-_Pjt(%hMsV0gvR}YTy0*4{L+nR(K)|oY3KHN&=o4bC}4-t zBArr{;h5A~yL9q4Y)WPE&mq<5gj?EJi44hXD*sS*TI%?c1C)^ASUi78QSk$+cOhWv ziVr>HFGaf@^_8x!zo@!4E?O$ZsWM=!s8Kcy%qRH>$$J&hl&Qy600V^ADkT8?{&&y< zEOY*kz7PU3_xxY4tZkR{f7{#JFZ#bf!1+INKtR+xO91FxCu#S08IKO$UFG^<{=F~L zYsrBZVSq{a0qhhCj#PiNJbl#PMVDi#5Fn+*C_?ZCoz`GUaWA|d zQB*<&JAtI)@xy-zrsHHBU4j^?!iYv$Z_+O$JXWtD9z#@2s+xR36NH}8907ch`T{yN zKTlvlJHrX|OP(emC1Zp{nMlug0p)_nBNoB5B;(>rsG%%e%>AzT*?t&w_`EBm*1TvH zV4JSvfn3Y-NnCU?o0a3Z&lG$Ia{9kF zkeM%ui=uLm+;+h1?{SR5g77B6?6^-y4T~}NqYJNnwjjp)mhxUjF7~GOs8&X#Cc|!P zW#!nTui$@4C_`8JlJ|{4EY=-8+LR$e(wgl-!mZ<4NM`Kir%dvFDE@u$b!fj4i-^PQ z?ciW{STe<1KCZ&4x-N%Cd{I3m73(L1OO@%=*cAq9rv!fS(Qouo&gA_A^OK6dN1t5M zClmGwtGf*0sDbN8X7`+QIcKlw1$YC)R4w_+HUNK=hYJ?CjC@9H#-=l4D1?80;|zZy z>nseIVjT!rJ=`MT&f|0Xe$!FVx13Q`OhICyp81cuqK-rEd(IcbdwTo$=KA)^+dNYS)tt_M&>sRY_sE$q2iWx z@im7dfiqDBAVi4O+U5~68v4kY`Zn7w%W;3iHcMVo-QsUE=h~yM>^<6fj`61vMo1(G z8?*>_If8~3x}4I|#)W2;1A5ieg@qqktk(wTme1Qfnm$87jRwpn1%@qTgLEXO-Q1=cz!}Mec1dMZyyU-Sr6rkPo`j$5MGuYX5CpGCQ_ss>`f-{QwLCke$T7la?$mMEcJtDFa8ECes7EI+1!wR z>vL~`8^0VoKx~5+Zb;-LGX#IU{EQxW?R}db=uj~Guh0X1qX*J2>4BJ^)Kv*Qc98X| zr6tV{_SII#QTC@0gL!9nZ;!KRl=(q=4HVPwLfNBL0%hTB$>d0cI-ngJiF(fZFmubo zLaBet6fyM@jS9(^lPSj$djKLiKcKuS1HaMkb6y zf+l31lvt`PzCdYCO#ij!MAcDKJm}vtKe%^vxx8Git~07>#^OO)y6T*#>py6&5f^jF zk#ry63PzJ<;v3FbH&TDi7wQ}9gKx3`b|jPqr2k;?#er%4fTQ;IYvZDl7m#7R^)(91%QJqUF_$F{whsTkfQH|+R)nMVVfM&<2#)#8n_!yMa zRT=T#(VHaFHdwz}b4ZJ0@YdZ4fHK^u-7GW6>@+P8Gbt_VX{mo-na7^1q9hiC=>7P_ z33p@EzXz<+N_O-9~Iny$+wgoO(?EcH@1;^)!0k zMCSDw(?s5%GlyMGSauTQ9K|cJ%;y6vA%=BCXK5*5HKyL61{#CPaeQ>_FNGX!BpMv0yEx@HmjAFr^$sa$(%G`Zk{g6M~TJa8Ycg>@wRAY!7XbV(MK7q(pysZNxW+$#x-5+WUaieVBQt z*oHdP>^rWp{1CwsP?e~$=#_hnN8!Ucn8#G>4^1s>ZOod;eoFP=e2x1D!Rf|BlYXv| zD_|9VzCb1ajro5SG3#o39Dfl8YytoKMy2fkwX?nT;{WyI{J-RYbHA@3&cP2v`J*Vu zC@;Q_rpbSBA{;yRg}=-Ue~c2zsyV%$L$uleRQ`Fj@u~QG4|eE_s$x+Ua1CVk(5I37 zx#>x@&T;vj;7A*LQrXn`W>qJDaGQAs$ZMx z06zt-I;1!)zvFd(%6Iq#S$xL2bh>C#eu`f@IPbNv70@)&(NznlYL0sen$ zyA=Op3oyYi`~Q#H|Bb;nynpqZIXnO(N+FzrpT-P8ML&~!JCe7zP(TnEJwQzO)7-P8 zl$L+}SsEsKl-<_@Z5Ox)DuLs@koKno0@^@5{^%lfY5faU_sh7Oub$$MuRsB^X#H2p z>woh_{`-OJpA9`<{PJ-))!xbrS9NJNJ$X?#m7Et@a-QVDFC>X72Htz{6senjB*eM5 z@aUa-bO&nT4~)|fWjy5sa%o6&@O0nx^k08O1X;NLzZCqtaQ$y=ZdFS7-?jA@{Lc?x z|1;3P3d}nL{2TTssfcz0f1HidVbqmxs#$lE42JMq7SSHXo#ZO%MB-k_U(7-VkCT2p z)Nxgo#0XDhE$GEr=}Fi;JE)!>orrp#1ZR!IBZ-(vqBMDg&@#NPMr@fV>*Y)0i#vZ3 z3KUy_Bnd+*8avPs4v~qfsBQ&8Nsfzdz8YrzQ~Wc+-lcvPrO2_spX?XQME3}?6GSZF&Hvo&w51^fShFB=fMzMp+w1nbywoGm4PR= zYIsF8?0HnhPk8)`_J)?*&>1JJG$T0IzpS=lr2!cplld>wZcfsL& z3S7khvTgIftr!3Ah5zk`%YPxIq32SdC4G=V;Ak=)UKMXUaoZA@Oi3=EjN)vXOm_aqu~$>|BwkJ&ZP z-g;tZF5aCy?K^QB-v2ViUPv zXt(Ku9Z!a@A|mobIv9>L=Uo;!N!$P>!c6xEf2j6rnm*^k8H0HnbDbY^dXa7w%*Exv zbVs@gFyNixsyktXArp^>yo*{gFQJ8e=N&_{nuypyWRYUe`OMpVjt8ue_`*_viP@0Z zaCWCa^BY#+v14xZZ$nL0Gd_D(OhWXc6V2H1PNAm2L>`e87!k}T0ln&!jn^sFowZX6 zf1fN+faG}L?eIVC+g|?o4+!Oet?}Ingd*qxalAgmM^q`&`-goYnTQ@azyMxd>X372 zv+9uHzc>-h9Q(i6>f-oY>wnj`wl_-ppRKLR=F9p2L(hL4d4A&8)XcE7KPDqg6FE*C zx*X(v8OI}&0EWMvsTDFbOiBTD5(}9?e?B~q@;>|^4N)3hf;~z+F#^{!#Y@zgK?sw_ z<5QgzNjJTC{818j3@;UTOcJL|FLPdPH$_|UufcG9jYJnFk;y2TKBlaW$8mo&&gok$f8N%_ z^%Vt(gTGI28^!M$`;8tOotrI&YQa(TiluMM<3aaC zgrJ6C!fuY7rl#l-HA$`>=!2qfIuL=nB$MXXlW})=C)#$Kq!2uMf+RbA7|<&uWQj4d zvGAk0jP+0DQUmd@PgH#7B7sfeAa7M+Z`#RP2*Mbu?tS{&Np!I5ET zl*Pj1D3`QFqGNL&+qx)q5~U>;=v!p-*~kA>)nm=W18W%xo3gkwEcQjof7DZKb+WR$ zcZkV}h29qXjHG^=42tA^(Pz^9jXMQa5on8W%~4tKO9j#vogbyD3DH1qQn=kAQ&B%E z_9q-bD~Pv_`Hjn~19Pj`W#Vq!T`vB$-2cA`PtN&l)o#0_+6|Rzm$>2E349=R@Y*&!U7m z!Uz*ssUfby)gzL{u_HAHGj!ZhReO6t2cEIe!^pG4@0p>#^9AH!e;v|gp-ZUhm|rvP z8>faD`m#fjJ3AEI+2F@_U^AFAG6-xYq0o)1<)b3qnDeQwxxsS~-uOINtiIhC?Acbl zDKiw9>KXm%iOK6QQt>ef^B}X;Dp_%rk}L<}i(Lq;TjFXE{)avP)S44W3bLiZZ3f6D z^{O>~*>2H9XyHT{f1+36#YOR<>4~VY8Qm(4uKbA(p2fS5<#%Oei11BR?LWMv>O^`a zl%EzE?5B#iU)E&J(}7CZvL?$)g#kC$JwRwYh`aQ?_b8&U;V@Qx9t_ls8hR^INAG-@ zP9m>)?6UKz{{)o+kz&-Pr$xgAPglG}Mz7bNMUFJ}!|1qp!oFu| znw;tx0gPD%j zEy|-y3wtBYuLkYfv2%PioraFP>ViU^F)WjKzZ1}$eH*xeRDk&n$h`MD;3vIaVGy`F z{AjOwsdTiMm5D?{q-1o=?UEE>MLrdb9*tET`D@xBfBI#MuxlLY{f$SK*ITbNri(^W zP?60Z$)-7yO*N7y<^(>SXWtjBH5G5fmzQC%zwsROX1JC=2PCglWm>a$QU;9dTM@DE znUS;Amvh#f$m4RJG6Zm}CUg;r@M^}Gj`^Jkw&_A3b`lAFE71H()g zm%8;;e@Z=KF-58b5PVRk2mV{_ov|LZ`9jMi73wH(}stPFVDb1J`69iE#gAZC%&5Rur zaM)rr9^9VSLIq8QUSRBw`y8`+LhS=XJ+849e^25&Bh&&HAtQi%Wb3#W@bK5VfO95R z0*06kO0Q;7LSeGko-kR#@9P?+PHMCr`F3a>!Fsn#ow>pB)I(o@U5mBN+Q%x}!fbIx z=o0p<8yr!BWxLk(Xv?#`6cATc0^)SiOdyIhbS+3>E_ z$kFGqM$S-cwNlJyE!T`471!yu*(90HNC>8?U41g)a@_LSKF66xdH3;k$e*uzTJEn) z2cfSkISg6*XT*sx|Ec&+r>A$Ud+P4ve^`&@<3Zmm%^cB8$ISU~1ZRpCYb^pzyu|YC zDlD+{WX4R)+4Ia>MtWRlO}(!0F{)_eUMuy%xr?7#f+N?Qa^{a`X z*U`3DCfx8JgT1}u|}QQa*%b)Ch~ zDIxNF47duBA5?Oda;9siqU4rs(@@IPW0bcS;+8NBo+}!DW(7fBK2vC3bEccM;@>r2 zC%g|Xzh0Riik^}J3*__}xJo1q`+yDX(C5(~wf<$RPHM|-LvcikTftbOf0)|!b~>nY zi35GKdZBw*XHFqMtMPAm9ho_Tt>BUGirX||((FUPZdx6oI683;%N^HeUJ!yD{ytYc z^Wx3!vDNl>Y#4G@=P~QGgSpKTDM;)R?AMG9U%Z@ep~L&nyr8@cH(EgTe6 zVpK2f?B86VYkcT=LT3iqEg{^AdKx?bg~7OEmFX7xT6z&wydIkd=Nh;mE}g{9Wa#<` zgg``sKySC}zTPHuU8<)u(%=+^rqz0EI$g6^AlF{0MxyPhA@iPze^U@i?d?{H5?1T( z@^6{ZOl0~_9pgHV13#~ZyLvea^)qog8PrN-xDvIJBM1H2%E-8MW(598Z#AjS`nth%bS`OJ*7c1LDQjla%!nqhdwDl zIqmvQ%_PTv^pl!(3fwZeZ?(Mh>$b7&@7^;bH5?hIRZ9q+_sqB>k0|j1qa2=7iPwP{ zV)D_ml+a0FMKc7;V$0P?v92%OSL@I+_{wDqrY(ecefDgse>&6>QXK41#KG2+Lb9w^ z)zR1zA~_2wP^CE2)4Dkb_ne8E&BvStmY(`<$&2+)af^Bvl7-n|ox^jrqb6!eX>UGU zgV`ekR)1xs$y?82E`;TkiSDeoa=x;5h&p`7NgzF94j#k6cBCLiNEoDDBYwmQ>bNCp zP*<)>8|i~If7&?%aLRK@X)D1GTgvr}7LrZngvl~n{%qYQAiS`UByjN_ruC;}8Y&KU zu)wy!>0A$!v?N2~>xTPiQAS|&e^{9OmWhO*eUkIBrGbpFVS(1&a}e!~kM{2C0dy;f*_wR8up5%s; zbnys$BgZ-);SyPVD%>qMMFh=awhgm~MpwEf!}r`jI+r;dhlfGqu)e(8qOA7U456*a zWs&u)X(6_3Un5Cz1_Wkjg2Z;PTTCqJKUz?-$Y?LT1=` zQ(wCt?Q)ld26%NgDW-TRa{wc{2!BXU4h`_-oRxO!g(NBZT2Q_5m_3^N+kL1Dt;Gj0 zoJhaM5~ImB8wh@~_cU769z1j{jg0AfnA ze;Af*B%Q>Vx%rkP%K-bFaA5>PQ*;F^na#iCGt8ZW{*f%rK7_W0{bW3raH0Ni8lUz@ zK?2NJ{ZSWw%#CxO^$~J3DF%HSYrs>IpTtpD;+^gZ*`_(C7`iJhwh9r9o8W@&Vdpj; z6K;!8dgE(A%yrTP!D2e4{1W;qVGm+Ef8;w1gh4whVv7&c_&7ndWtOOj>c8I=zX2wB zJsI2rP_#4b%Bb^EnqC%rotziL6vMdp%<%3>aUx}-EXEFo=;-IwlR(av-!;#d1On!x z=x$&Tp28>c1|y+h3Na@_r9-x&r_-W!$0A-mU>>n0-Dn&!_@=CoMwb!f48eV(e~j+! zOi~MRgTg%2T}lRGFD8iuj$WlvF0rZb(?I0K_lTdo!_n^|{Ip*j4_$-o6&LR@P8a-R z-fhi3UY>tZi)UlZE=m})aEVy#_1O@!#%zdLtAsG~6~gSI1TYH~z^qjQn1u>pM!2*x z!YnEw%+Qr%|LjetdcG&94B(Qte_z#6=B|*?$hy9D%J;rmkG2tvB9Kbzk$HQamA!d8 zob_mSz0im#?~tDw*d%e)>dMwttIN+V5zv*Ol>WV3nA9FM}zWLTXm|McjMl3 za*b3qETiH{e8>e{rOOm)E=UF%kOCga)nfGe$WRsM-1*MM=hY-HMyl;0f9XG2bWBzz zM2%tGSrv?ecIhtp(B}F&aHp#~Yv}Ws@f^RQeX1I>>$pjEyspoyqnkU-h){JpBX6Oo zy=IPV`%GQU8N-B;3#ea4-X7DmTzj}# zPJC^{TrGOFRSoyJ8Oy?2%!opBxpz1p=_i6Wi+Z0KI4B=rZz0&4ZQnguUSK{YI>#8rPeoB<1-6KQ_*?^aV@WflOOoFE4Hj=sVjF~ahOPt)xR*dnc>a8}%+MPiQE4Rs*@=!VcPANyYvB@j^!9N7#4IsL zms$mhBxTx^Xx!Ie=D&b>yy~M+Ac2i?Qv2^bbN1~kK}v6}9v}gVfTOe}Ig@K1Ah-p_k`YICFV! z`aE(Y1Y;3FhD{%-xeM5m0;XOGE32bIi;nzmYkcCdMLzPhOml-H{h7sHR-PkdxF+O_ z`c>zmgO2fb=eeT5F~<|;s2iA=H|1a`#x9lTqnMRB4Ho-)j||c!JUlda>V3hUra*NQ zr+Iyk24G~me~pJ5?ELL6xfgP`6bW^q{YIFky#aIgk)Cqo9z2%(uJiV|?ZCj3gf|Lr zte=MDB{E>;zY)pn(yiu-nZNzgr-rG1O99L&psjorjy)$z?lGhtaV;c|4BV0roW-%$ z)=b}~4NnwRts0?H%R6;_!sCFS>D8M0?%iK_^Lig?e|g<<+@^5qO1*d9!qFIp)RDzU z;mGH#9N0#3$0IKj?Zu2exauu?fL=WB0PQ^E0PQR~K!sc66Hn02Gfq(Hz-dA7E-0|J z!|k_Do>;7@m+V}^!`uKKg|)L8lT594fk3J&_@0<#@4O+4>p5bhwoU}hQ@fbM1;xlg zI}@*ue-{qgBs4t;ueD1XWGeVT-+B|@CfpDhM&?2)Tv-mtlcnN4t=twbSNpA9yBuJ) z!o6dXZ}u3WPZfU)4pAwn?~22thr&Wj3k#1*SjgFFa1+j!6%bfFnk_4A2aAc@_0jT< zyLtsqQQ=)+5m<7+=Y&mW`5e)ky&6qW27mTne+RHa$zXA;#|^pz*7sN3$qq!YTBOgI7m4kLjUMB>OHYgTf@vX7i?`N#ZmiZw@aolF^ebBgI~x1S|5)|? zq3n8-_U5UQL%G907yo|tx!6{kutwishk$uFQGM(0iAD$O{?p`L(9du+0DMzne_Gr1 z8jsgu38ctiT^4tC!o7?|1w6LZ#eW$8mXiO+WSpe%&)4w$Sjzu*V`ts=|JYoA;eY;t z{vT@ix$j3W9@mPu;r%!sL91_mM_BHLib>k!nvXIMqr{>)*-`RPI|NP_je?I#B3}C)c4dE%3O-AG8q6b>D>d8Ady15ja zF{*>A!eS;gtNKY;J=cNh+tsAFX@u1qUm+gIZNG}(y^bXA{3!p9rJ?AP{9A077r>}I zBZ0VJ!9Dy+K9F%`8%UblW_~OUbbqFSM*^w`hW_r1e5Gp*uWRX>Qso>4Nl%*wdfK#^ zr%eMrZQxPvN$OZXo%5kM0|Bjg2}sddJwVB3XXWUnAsod>KwD}tFVOL=qqj=ca^(Nk zQ|% z43h!8JQD#*{0N+%F~8q0lYd?UuE&GoCtO1MLvUCZIT!yqob)fj3)f3}4M><5OV3Nj zI+n)$az~uCaGn_xF7c|$d8wM|BTl&;+^8e2QEiD6?nE7MN>%h5O1qNPyrK3#AQ9jF zKJUbt0(IFdzr#>;4G2Z&eisTwnA|&0&Z}A*winO`M2A#7@YWLQvy4NG3g+UF zlRdm+m8nr>B-u%mrj%8gBQuC!MOKClY)h{bSWV$TROZ2xwP_k=L)A4~QvG3i@f?<% zJJh9|YoWEK`?RbiFu5Jj$C~WsthT(b3^CY?>u)+9;&I?a#F}ro ziRb+GLmDQ-;g0O3&+tj3GRq!N;EPskQ`qiP6lEU3XpPUx$r8mnlP z^8f9NW^O68(d>mK9L8(KzXPx5joBQR{*`i)N5#!`i+|zxi*LvEp2xgF_js!T@m=* z;$E{d9Dl6%0KbidIcH@z%DQ(^7XNKkel0Rw9bv}N%5@fB{r#uw@pzQKUtR4ElV65e zZ?&@aOJ%LHy?XOY-bp&cU)I;wH;X45m93qhe*Ih0@2wQqF8Zu^@JoIzLUHE5B*WFq zs9Q|y;HdFena}^bUUTI1*URE2`b$3T6`ZjXOUM}eZWIlEUHQL7+u@hHAXz|X*k3(8IzBjv zE~%slq88?>f@9$-9p2>-nf#XrQRYE1jaTCPNQ5aAMXs#;xwf=YRg^GRm+2QWUt-Nr!`YrTF##QSt9p@z}EB#a}wz75L*XgHeA4 zViTq*{LUtWmCH$zcJ*JPVxkBrw|Y686eYrxT1oPiXk{>*#wjEc^F?X9b~G$jAWv8Pe>CsV>*6ESn89kzuA)x75+pE*qU>Sie_`YMuVm1T@87TFpnuW( z@At*(e)#a0f2uFVWL&A{d7J^h|8J+o-ZqX0-F)Q;0xuWa=yaHLe_i?e{QPuPx^bu2 zP~w%V$pC7y66wre4KHur%Y1)+&r8K;zdG83Yhre_uu{c_{eI;YhVgwbJNf68zyG=- zSsMPvTlnj*to>Bd@g$2Em8Kr6bbn^~%avH_pt~p;zY(cnOQk@Ve$FP9{h*h|EpQ&x)3U|XYTvU?f+{V!q#uue|9!r_ zh#Yshhm5jhT1fXRg27}sNFR!=2?J0UYx#paMT9xvTSmn5N?4fG7X356&VS?atK0ZN zJ$)>wkYcb5N=*{C!Mieul}$< ziZXFWQ1=M+KK?w3()`tMd>v=+S-Rp-y&MkHI2t%^6qqTyKB|47R8G=WcMV+Tf+)>= z(ix_c{@@?>L)r}}i#NvSQrs{bKy~5`5b2bwiMl?iO-VQIfB*R}aDRDmtba+-<|7qc z_QlJ8!TMj{+1zyaf33f)|L^g?)z#INzh&`NoW+Aq3`&>$@4&YC)5_|vbmq6gk*OJt zxP(A1Px>{N6F6U`{tRhAT?!&O;f^Nb(PS*Q1Abk=WjUOTi?!coPvR`Io)k3_PgI?L zX`;8)%#BG+b;%t%>wnsF7ma6Kck)hoAG(V!$JSLx@Qtd%%&X9QT?t1m9hGQJZ*L_%=_~dPX7cOI!8nh`r3UH; zGe_pq8XCn{y40}D=%Y6)-9${SC7X=}-$i*JpL8ev(W@b(d4F$C?gd#rr_ZtQk)RY6 z?uSR0H$hSS%ucT6?M{}A{wO{D%{oM!|BYGN3K}Z)q!-H`fz&?IotjBRxQe7xbVyN+ zVlVrM-m~+xs4yrYynF?SH`WH)qx^K3PqO&G{(H7UwHPC@Cac|U7Uwx@)~g5~9e}i> zGgsT@6VHEn?|<|4rRqy1fCch@WqYf1{%=)Y?EinL^FNr3()eDT;y)o1_fO7KTumFf zg-EL4_cDu@i}{~M|ECDbzw!Fttd#K|TicbF_5WS>@HQIemP4IsHW7H zDgt#u3zUI6os>UrlQiYRs5D{z`))~&^$!61crg9)i+}&J=YMJaZ|tnU;JK*jVz_fAyKI-nA3=}i}hYn(mnVjA4_0+eObTlH$?MBRr<%Z`yP9XMO{z^U6vq4n$75w|2Phq2f#p|LR@$r$} z#D6^gJSqAoiPBeCgf5^gugl(BE}<|mrfIxnwp!yk8L&o2gD8E-W6VP5@CJtPAMahR zMsnPH@wj0Oy=c3hD?k3`;W+=njrOYv|NqZo|L;=#&&tO7_KW||_dWk<|DrR~Aqmp) z`JXzOWiXzTM1}owB~jN-*Spz}g!!qp41Y5x&HSc8(6wUATE%E>`TRspjL|l~KrS+s zl9?@NMuv zYda8{3_j2Prb$$v4dAL?Z7 zu~6)>B=BGv$&;hLm4bI1-;dvyQ2~@Ryzj&#<+vxo*|%;h!->#+=HtJeDA=}GiSJif z6Ht-)Ak-&?Ao!~22#15SvGq#TXD*b&mfxXBcH)pCf$URk@GElVD;F-7| zlwX;IyK)@~;dR#AQ8W>|{eP_2#SLII|LxHfb=!6d0-JZc3~DZW%7S;O&kgvwkxLf$ zhtv2gWK`TNgs4p4Yo|>0EzCWmox)#u(ffm8Cra~0sj6u@FG+FLi02H}WK^8@aZNU5 zQ97v6+@YC((yun(?U#RF&Oj8@915k`E8(>3=uStuf-)97<6n)3qkn{5hh`6oBbTKv zRO)-$ItqzMuYYqk528_iJsdAFhEVy1gS}iTKT6Zf;;fg%v-6S{gLGfWeKG;1WRCkU za?`(){MVYqlP?hh7u^3q*0cOSwl-e;KYqyl4^(S>+_`?OQHUeJ8zZ-ZSs;;aoF@IG zWQ6`K@++&wbZQ$cRe$W?^6IHKYO=46hND+Mvx}&{e_96fQJPqQm7LuYEgyTXHH{D2ep6@R~?{XElCRevp9He&au z_LXtI`h8X&F5z$ve^%$#kZCtzr-5W}=^FjU^807@{ zGof6KObPc-FeqxN4bjhVDDw9!|D~?^(ct0NH>GBYr~j=?-VEZ89bbIUhrr?xm;>sf zoE#pi^fE1Wr+DznxBztH=*oUZUyKm;Wxtk}f>`j=&3{FNp-1YVOPbjkI@dR<58pE_ zE>~>*`iG{Bnd|?fe2Kp)|Knz5vyA`V*?!^w{l4-)^T&Q8@dC8hb00~P?c?icniT8d z%}NmGKquky7qVRrpMp4fB9O#|rjYk|!lO^boxd+myKb>li`ZmB@Gqu$_op|~!M)Ro z<1W62KY#LEzPgG8(}j3mD}GI~VmFg-1ooploCpilPw-p#@XL3xh=VL%zz_XNew&O& zvK0LJ(;UYhbV7QCrV`PW;vz7f2;I9u1^lMiZwoZ+r))Gcw0C2?cxSq@I zeYFHfnb{6)>a$TJv-<@7xN_CyOZG&$gs1d}m=rlZ)W`H!=q79uaF?WoB$t-34m0}E z=)aC$gYVgT#LUYwL6+()PYL#>1jS~9)F{k1BY|ym_?;*7{$v-bus`qr5ES^{r+V{T>#FQ!K2_TC^-5iKv zwuC@H1DVexZLwp4{_M&cpY`HFoJFZAYJbYfY#PH0fS~qc13&B-_mD$$J zuyKKDJM*;z4dy`4&3r9(pjXO;6`T0Nviv92{{Rq2@LN56B@oym{)df{{%3Rjh5z}7 z*#EfqclIF8j}hKu?I04TzrK+iXgLoKq2InJg8#JZ-+@&7mi!Nut@YCVe|zm^{eOSw z`~Ol`{x7?aTN+NHllb2m`a(44T_xliU}+X@%(#@Xes=R1=+8_i z^b+jjtFC{CvGbeqe^u7j%JSdli~avc-2VsxLUwR@ifXWm@c3t|)*YpTB6XP0|A`A4 z-AvJfYUPtFBdcJuR;Mp_$uANxvTXIXmkuuh8u76>iG`CYe~DX{`$LD84}aU6j9)qG z^Tt_^H?H#EILa*~1|5w+6*bHRx>oFEc>)wcs8JlpUG+pkzZr15$Vd-F$@`Vmk}Q)~ zb~%*8&yE8A>%YtS{?nQY)Gt#6T{-gYkf%J1{H7P0XT>mh|JiE@N99Y#Q zkGgBhGKOm$OZJ%zJZjgxY=7E-GO`|ohMqB1Q;G1g-`TZL@1I)@M3~u6`x6KZY8imU z|BUE*s!A`%?!U+RF9V}|8~p#q`nrSv)u{oV{`H@8r4O^{iDkd7H(XQp{g z1p2_~M`qk{e>5WuOUW1O1)KJb*8k{>RKN@MzuRT}*Uk(66DgsmK z&`Jy9Q$25haR(EK^M4PEXMo|5ra!dLpQjAopXm%*j{i^i8$SO4SfKw|ci8{7cV6PZ ze&7ASYU_T9V09jFV-a>^4&k56TbFsZ$;G|;pZ^IS_DP0b{l&5$C-MK^-j($>ZY1IN z`4xm;Ml%o+U6!+Q60K+KY=lW{!Nkd4FNdWkBl~{>?`4MYuJ@!N7Z)N(02V{N9oVee9C*{`Rz@#G+9zO!mZ4 zZK|vd^;+AQ5{kRjFeh|$q6`J~KGZg{Du*rr9tBq@n)~xMe30Gzdr+(@c(;_n@qc1N z5Y^@P|C6^ToIZppw>Ug3-N*miGq#UPn;x-!(DiqsQ-5vZ)K|w|F06J${Cz|%o+K-| z;vhULex?%-a|=+-nuXg9{jZ9h^}_Mr5bMMA|7_LzpI7-+_zZ&O!BmpHPh;B;H*nPo&up2!9Zjsj#R8??{7YE$|d8WsO{G}4>= zzlCS%lYdP>s^mZWcKpZgK^^~b7ta4z`)qIN3jVSV+K-1JaS?#x7;v05afO`45+RY% ze1d=#wBT9%fg)x=fdWE9l{uH-bdV27M-JaVJqi{0cy9>!zGdW0(-r*Le4HzMsgt;Y zyFbvE^Eei@PHR}hsj^z!-N#^y z`~PXmziRrg@38+lXxIMVuPguA3gBaNfWC?-FgmTKe_S@#iJ|n|(a|=m6|GWh5p<|j z`Dk?ZPP)@YU>h9$6*jhtL1$o_N{~?Ll1sf~c>SG_6mN0*lpc)Lhag|O{U@MF3OVC z*EK2NZSEg7_Ts#t&ASyXzvw0#qB#*wbAMoutW;ljw$76oYjPUuUE4TC&one^IgNs1 zsbsu)tydQig=|f(Zc|_Eccn9T_VAMPHoi=IGW5G?V$(yt?efVS@nim4bD@XZF%Nc{ zhsARWN16O7&+$;(qFSK)ocdp`s(WGiPuCIuXTMj=f4?>TZ%21@Z~~Hi-%v{waes<% z9M#LMPj@Q9xQ3auDayFzSueN^@U36?6Obh7KMwz3lRMZA+)*vcLM*L&qI-)%QV7 zE_g@YjyP6B!>|o@(nu5gG^|2=+KMGNrrad^G_TLfRphbmU8}~ zjJA=@*Lje9jvJMM$W2STFr`RYlTb&a(ow`p5s2*I<(mc(PLn$h{$F5)`CQsd(a(zV zS!kG10yXI8V=yN$G7wZxIe&FWVOCReyF>r+ujNTJU{(CzmgWD^@APZ?zi%f00gU^# zltTP+H2Ur27_?OUoC*!rhl{gMC#PJwmE4B0NIpNhyyT?;d{C9X{4_d0=jr88m$Gja zcI@)wuP4V>qW4UoI>;t3u1-%!r~g7*taTi-n^t7}GCCby{wjvdu7BxluIikhoF0oh zaM=`fMyKPGi;JuCF|QWMxNF)tbt#JmaJXJaf&TK%*?D5G_9!rs8ewS%a)~Vm%PdFj z6t02{M73Ce)wJQ&2rueKKMO~}&=G`AkGGkt;Yt*zVgfZzQ+@we+kaD%;_**Gh5qlL z*RtgQ-TMB2W&Ynbk$>3Z=G~^1#2)2>3Dol*4-LPEe5rTj0VGJ60S75RBVdgfZ-c1z z5Z}ZDblOFTW~4q?pGaSKw&yy{A~PbhP0lN#3&360Ru+HwHxY=39*V9PmVeFrIOID^WPn@rkN6>h;HeJz85zNT*zfQ}d|9b6KjsN&9cJucLa5`~5l^Q#A$&;L3!Vfy^VV#2;|8)b4Ta!i>$ zcUoqBjQ~imz^2wA_)twTk{SZi>}ri3;H|b$Du19Fz+a$;Ppd-`Q-7VI<4~(hQbFW{ zi9I9n>@LLUVXb|V;RgYc*g$6mW<72p^%n7MCdN|YMN?zF6I94F?rt-Rk8 zP=6p{W=C5Kh}jIuJ=$It`)M{$a29=qD^lOXG35xT(X?Qp#B!$8ydE# z`;_Bv!1XyCc=R6S1H6`1#L6C8cPM&3>o+a!l1m7O17p97C9k=%oumKsm;c4-zkiOy z{$sz@ukruB1^-8>Iz|tEDJUM|41{J0-A-YWi3$B);R}QpDVFGv1T4`l67JfaA6QDS zNQskt&L56_^0vgcaq<}+{62*c=cWx0aN{7R_K#8=1tb0W(1J?_dgF@$e_VJc5SSc( z6MKJq6M)Nxn2DR-oKrDmDUYKa(SMPOsSRWWY26{H8Ma!Dcu;hyjPgwSx!|yQjp~B1 z%#F!I9%h91w#afdAx@c_D`h@zvnaT?pR_D>lysy`7RmJX8o`*%td;M801xgrLvowX z{?fm90f|Qr=^vPCh s9&UQMYyJhv0QCH?rWdpHJaaTrzrXdb{?)(w_y76(FPWOm;sC@100IA=w*UYD delta 57724 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 (type $void->void (func)) (type $i32->void (func (param i32))) + (type $v128->v128->v128->v128 (func (param v128) (param v128) (param v128) (result v128))) + (type $v128->v128->i32->v128 (func (param v128) (param v128) (param i32) (result v128))) + (type $v128->i16 (func (param v128) (result i32))) + (type $v128->void (func (param v128))) (memory 1) + (func $vmlaq_u16 (type $v128->v128->v128->v128) + (i16x8.mul (local.get 0) (local.get 1)) + (i16x8.add (local.get 2)) + ) + + (func $vsraq_n_u16 (type $v128->v128->i32->v128) + (i16x8.shr_s (local.get 0) (local.get 2)) + (i16x8.add (local.get 1)) + ) + + (func $print.v128 (type $v128->void) + local.get 0 + i16x8.extract_lane_s 0 + call $print.int + + local.get 0 + i16x8.extract_lane_s 1 + call $print.int + + local.get 0 + i16x8.extract_lane_s 2 + call $print.int + + local.get 0 + i16x8.extract_lane_s 3 + call $print.int + + local.get 0 + i16x8.extract_lane_s 4 + call $print.int + + local.get 0 + i16x8.extract_lane_s 5 + call $print.int + + local.get 0 + i16x8.extract_lane_s 6 + call $print.int + + local.get 0 + i16x8.extract_lane_s 7 + call $print.int + ) + + (func $vaddvq_u16 (type $v128->i16) + (i32x4.extadd_pairwise_i16x8_u (local.get 0)) + local.tee 0 + i32x4.extract_lane 0 + local.get 0 + i32x4.extract_lane 1 + local.get 0 + i32x4.extract_lane 2 + local.get 0 + i32x4.extract_lane 3 + i32.add + i32.add + i32.add + ) + (func $run (type $void->void) - (i64x2.splat (i64.const -9223372036854775808)) - drop + (call $vaddvq_u16 (v128.const i16x8 1 2 3 4 5 6 7 8)) + call $print.int ) (export "main" (func $run)) From db9c9f084920d6f332fdba5a0fdbbd425fd6bd65 Mon Sep 17 00:00:00 2001 From: jay-tux Date: Fri, 11 Oct 2024 11:15:26 +0200 Subject: [PATCH 7/7] ULPPACK vector dot product (and required instructions) --- src/Interpreter/instructions.cpp | 19 ++++- src/Interpreter/instructions.h | 4 +- src/Interpreter/interpreter.cpp | 4 + tutorials/c/.gitignore | 1 + tutorials/c/Makefile | 9 ++ tutorials/c/add.c | 18 ++++ tutorials/c/matmul.c | 140 +++++++++++++++++++++++++++++++ tutorials/wat/main/simd.wat | 99 +++++++++++++++++++++- 8 files changed, 289 insertions(+), 5 deletions(-) create mode 100644 tutorials/c/.gitignore create mode 100644 tutorials/c/Makefile create mode 100644 tutorials/c/add.c create mode 100644 tutorials/c/matmul.c diff --git a/src/Interpreter/instructions.cpp b/src/Interpreter/instructions.cpp index 084941ba..4e75a9a5 100644 --- a/src/Interpreter/instructions.cpp +++ b/src/Interpreter/instructions.cpp @@ -1979,6 +1979,23 @@ bool i_instr_simd_ext_add_pairwise(Module* m, uint8_t opcode){ case 0x7d: return simd_ext_add(m); case 0x7e: return simd_ext_add(m); case 0x7f: return simd_ext_add(m); - default: return false; + default: + return false; + } +} + +bool i_instr_simd_swizzle(Module* m){ + const int8_t *current = m->stack[m->sp - 1].value.simd.i8x16; + uint8_t swizzle[16]; + memcpy(swizzle, m->stack[m->sp].value.simd.i8x16, 16 * sizeof(int8_t)); + int8_t lanes[16]; + + for(int i = 0; i < 16; i++) { + lanes[i] = swizzle[i] < 16 ? current[swizzle[i]] : static_cast(0); } + + m->sp--; + m->stack[m->sp].value_type = V128; + memcpy(m->stack[m->sp].value.simd.i8x16, lanes, 16 * sizeof(int8_t)); + return true; } diff --git a/src/Interpreter/instructions.h b/src/Interpreter/instructions.h index 82b04b9b..69b0810e 100644 --- a/src/Interpreter/instructions.h +++ b/src/Interpreter/instructions.h @@ -94,4 +94,6 @@ bool i_instr_simd_bin_v128_v128_op(Module *m, uint8_t opcode); bool i_instr_simd_shift(Module *m, uint8_t opcode); -bool i_instr_simd_ext_add_pairwise(Module *m, uint8_t opcode); \ No newline at end of file +bool i_instr_simd_ext_add_pairwise(Module *m, uint8_t opcode); + +bool i_instr_simd_swizzle(Module *m); \ No newline at end of file diff --git a/src/Interpreter/interpreter.cpp b/src/Interpreter/interpreter.cpp index 68c88a71..44018582 100644 --- a/src/Interpreter/interpreter.cpp +++ b/src/Interpreter/interpreter.cpp @@ -497,12 +497,16 @@ bool Interpreter::interpret_simd(Module *m) { const auto opcode = *m->pc_ptr; m->pc_ptr++; + switch(opcode) { case 0x00: return i_instr_simd_load(m); case 0x0b: return i_instr_simd_store(m); case 0x0c: return i_instr_simd_const(m); + case 0x0d: return not_implemented(opcode); // TODO: i8x16.shuffle + case 0x0e: return i_instr_simd_swizzle(m); + case 0x0f ... 0x14: return i_instr_simd_splat(m, opcode); case 0x15: // interspersed with (dim).extract_lane diff --git a/tutorials/c/.gitignore b/tutorials/c/.gitignore new file mode 100644 index 00000000..3d758890 --- /dev/null +++ b/tutorials/c/.gitignore @@ -0,0 +1 @@ +!Makefile \ No newline at end of file diff --git a/tutorials/c/Makefile b/tutorials/c/Makefile new file mode 100644 index 00000000..87d87599 --- /dev/null +++ b/tutorials/c/Makefile @@ -0,0 +1,9 @@ +all: add.wasm matmul.wasm +.PHONY: all + +%.wasm: %.c Makefile + clang --target=wasm32 -msimd128 -O3 -flto -nostdlib -Wl,--no-entry -Wl,--export-all -o $@ $< + +clean: + rm -f *.wasm +.PHONY: clean \ No newline at end of file diff --git a/tutorials/c/add.c b/tutorials/c/add.c new file mode 100644 index 00000000..46bc7366 --- /dev/null +++ b/tutorials/c/add.c @@ -0,0 +1,18 @@ +// +// Created by jay on 10/10/24. +// + +#include "wasm_simd128.h" + +// static unsigned char *memory; // 1 WASM page + +__attribute__((import_module("env"), import_name("print_int"))) +extern void print_int(int value); + +typedef v128_t v128; + +__attribute__((noinline)) +int add(const int a, const int b) { return a * a + b; } + +__attribute__((export_name("main"))) +void _start() { print_int(add(4, 2)); } \ No newline at end of file diff --git a/tutorials/c/matmul.c b/tutorials/c/matmul.c new file mode 100644 index 00000000..9baaf97b --- /dev/null +++ b/tutorials/c/matmul.c @@ -0,0 +1,140 @@ +// +// Created by jay on 10/10/24. +// +#include "stdint.h" +#include "wasm_simd128.h" + +static unsigned char *memory[1024]; + +__attribute__((import_module("env"), import_name("print_int"))) +extern void print_int(int value); + +/** + * Computes a * b + c (lane-wise) + */ +__attribute__((noinline)) +v128_t vmlaq_u16(const v128_t a, const v128_t b, const v128_t c) { + return wasm_i16x8_add(wasm_i16x8_mul(a, b), c); +} + +/** + * Computes (a >> shift) + b (lane-wise) + */ +__attribute__((noinline)) +v128_t vsraq_n_u16(const v128_t a, const v128_t b, const unsigned int shift) { + return wasm_i16x8_add(b, wasm_i16x8_shr(a, shift)); +} + +/** + * Computes the sum of all lanes in a vector + */ +__attribute__((noinline)) +short vaddvq_u16(v128_t v) { +#define SWIZZLE_MASK0 wasm_i8x16_const(0x4, 0x5, 0x6, 0x7, -1, -1, -1, -1, 0xc, 0xd, 0xe, 0xf, -1, -1, -1, -1) +#define SWIZZLE_MASK1 wasm_i8x16_const(0x8, 0x9, 0xa, 0xb, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1) + + v = wasm_i32x4_extadd_pairwise_i16x8(v); + v = wasm_i32x4_add(v, wasm_i8x16_swizzle(v, SWIZZLE_MASK0)); + v = wasm_i32x4_add(v, wasm_i8x16_swizzle(v, SWIZZLE_MASK1)); + return wasm_i32x4_extract_lane(v, 0); +} + +__attribute__((noinline)) +void print_v128(const v128_t v) { + print_int(wasm_i16x8_extract_lane(v, 0)); + print_int(wasm_i16x8_extract_lane(v, 1)); + print_int(wasm_i16x8_extract_lane(v, 2)); + print_int(wasm_i16x8_extract_lane(v, 3)); + print_int(wasm_i16x8_extract_lane(v, 4)); + print_int(wasm_i16x8_extract_lane(v, 5)); + print_int(wasm_i16x8_extract_lane(v, 6)); + print_int(wasm_i16x8_extract_lane(v, 7)); +} + +__attribute__((noinline)) +v128_t vmovq_n_u16(const unsigned short n) { + return wasm_i16x8_splat(n); +} + +__attribute__((noinline)) +v128_t vld1q_u16(const unsigned short *ptr) { + return wasm_v128_load(ptr); +} + +__attribute__((noinline)) +v128_t vandq_u16(const v128_t a, const v128_t b) { + return wasm_v128_and(a, b); +} + +unsigned short small_dot(const unsigned short w, const unsigned short a) { + return ((w * a) & 0x0f00) >> 8; +} + +unsigned short small_vec_dot(const v128_t w, const v128_t a) { + return vaddvq_u16(wasm_i16x8_shr(vandq_u16(wasm_i16x8_mul(w, a), wasm_i16x8_splat(0x0f00)), 8)); +} + +unsigned short small_vec_dot_ptr(const unsigned short *w, const unsigned short *a) { + v128_t local = vmovq_n_u16(0); + v128_t sum = vmovq_n_u16(0); + const v128_t v_w = vld1q_u16(w); + const v128_t v_a = vld1q_u16(a); + local = vmlaq_u16(v_w, v_a, local); + local = vandq_u16(local, wasm_i16x8_splat(0x0f00)); + sum = vsraq_n_u16(local, sum, 8); + return vaddvq_u16(sum); +} + +__attribute__((noinline)) +int dot(const unsigned short *w, const unsigned short *a, const int k) { + // expect w=1, a=1, k%(depth*iter*8)=0 +#define DEPTH 2 +#define ITER 2 +#define MASK vmovq_n_u16(0x0f00) + // expect k % 32 == 0 + + v128_t sum = vmovq_n_u16(0); + for(int i = 0; i < k; i += 8 * DEPTH * ITER) { + v128_t local = vmovq_n_u16(0); + for(int j = 0; j < ITER; j++) { + v128_t vecw = vld1q_u16(w); + v128_t veca = vld1q_u16(a); + local = vmlaq_u16(vecw, veca, local); + w += 8; + a += 8; + } + local = vandq_u16(local, MASK); + sum = vsraq_n_u16(local, sum, 8); + } + return vaddvq_u16(sum); +} + +__attribute__((export_name("main"))) +void _start() { + const unsigned short packed_w[16] = { + 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0101, 0x0202, 0x0303, + 0x0302, 0x0100, 0x0201, 0x0001, 0x0201, 0x0201, 0x0201, 0x0201 + }; + + const unsigned short packed_a[16] = { + 0x0100, 0x0002, 0x0201, 0x0100, 0x0100, 0x0200, 0x0300, 0x0000, + 0x0100, 0x0200, 0x0300, 0x0400, 0x0001, 0x0001, 0x0001, 0x0001 + }; + + print_int(dot(packed_w, packed_a, 32)); // OK! + + // print_int(small_dot(0x0302, 0x0104)); // OK! + + // print_int(small_vec_dot( + // wasm_i16x8_const(0x0001, 0x0203, 0x0001, 0x0203, 0x0302, 0x0100, 0x0302, 0x0100), + // wasm_i16x8_const(0x0001, 0x0001, 0x0001, 0x0001, 0x0201, 0x0201, 0x0201, 0x0201) + // )); // OK! + + // const unsigned short w[16] = { + // 0x0001, 0x0203, 0x0001, 0x0203, 0x0302, 0x0100, 0x0302, 0x0100 + // }; + // const unsigned short a[16] = { + // 0x0001, 0x0001, 0x0001, 0x0001, 0x0201, 0x0201, 0x0201, 0x0201 + // }; + // print_int(small_vec_dot_ptr(w, a)); // OK! +} \ No newline at end of file diff --git a/tutorials/wat/main/simd.wat b/tutorials/wat/main/simd.wat index 2660e13d..8bcc1fd3 100644 --- a/tutorials/wat/main/simd.wat +++ b/tutorials/wat/main/simd.wat @@ -52,8 +52,75 @@ call $print.int ) + (func $print.v128.i8x16 (type $v128->void) + local.get 0 + i8x16.extract_lane_s 0 + call $print.int + + local.get 0 + i8x16.extract_lane_s 1 + call $print.int + + local.get 0 + i8x16.extract_lane_s 2 + call $print.int + + local.get 0 + i8x16.extract_lane_s 3 + call $print.int + + local.get 0 + i8x16.extract_lane_s 4 + call $print.int + + local.get 0 + i8x16.extract_lane_s 5 + call $print.int + + local.get 0 + i8x16.extract_lane_s 6 + call $print.int + + local.get 0 + i8x16.extract_lane_s 7 + call $print.int + + local.get 0 + i8x16.extract_lane_s 8 + call $print.int + + local.get 0 + i8x16.extract_lane_s 9 + call $print.int + + local.get 0 + i8x16.extract_lane_s 10 + call $print.int + + local.get 0 + i8x16.extract_lane_s 11 + call $print.int + + local.get 0 + i8x16.extract_lane_s 12 + call $print.int + + local.get 0 + i8x16.extract_lane_s 13 + call $print.int + + local.get 0 + i8x16.extract_lane_s 14 + call $print.int + + local.get 0 + i8x16.extract_lane_s 15 + call $print.int + ) + (func $vaddvq_u16 (type $v128->i16) - (i32x4.extadd_pairwise_i16x8_u (local.get 0)) + local.get 0 + i32x4.extadd_pairwise_i16x8_u local.tee 0 i32x4.extract_lane 0 local.get 0 @@ -67,10 +134,36 @@ i32.add ) + (func $vaddvq_u16.swizzle (type $v128->i16) + local.get 0 + i32x4.extadd_pairwise_i16x8_u + local.tee 0 + v128.const i8x16 0x4 0x5 0x6 0x7 0xc 0xd 0xe 0xf 0x8 0x9 0xa 0xb -1 -1 -1 -1 + i8x16.swizzle + i32x4.add + i32x4.extract_lane 0 +) + + (; (func $vaddvq_u16.swizzle (type $v128->i16) ;) + (; local.get 0 ;) + (; i32x4.extadd_pairwise_i16x8_u ;) + (; local.tee 0 ;) + (; v128.const i8x16 0x4 0x5 0x6 0x7 -1 -1 -1 -1 0xc 0xd 0xe 0xf -1 -1 -1 -1 ;) + (; i8x16.swizzle ;) + (; local.get 0 ;) + (; i32x4.add ;) + (; local.tee 0 ;) + (; v128.const i8x16 0x8 0x9 0xa 0xb -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ;) + (; i8x16.swizzle ;) + (; local.get 0 ;) + (; i32x4.add ;) + (; i32x4.extract_lane 0 ;) + (; ) ;) + (func $run (type $void->void) - (call $vaddvq_u16 (v128.const i16x8 1 2 3 4 5 6 7 8)) + (call $vaddvq_u16.swizzle (v128.const i16x8 1 2 3 4 5 6 7 8)) call $print.int ) (export "main" (func $run)) -) \ No newline at end of file +)