From d5e0b2ad793512402f258375898f7666edec54c4 Mon Sep 17 00:00:00 2001 From: "John K. Luebs" Date: Sat, 9 Nov 2024 21:57:08 -0600 Subject: [PATCH] update --- .gitignore | 5 + .prettierignore | 3 + CMakeLists.txt | 48 + compat/avxintrin.h | 2010 +++++++++++++++++++++ demo/index.html | 29 + ecgsyn.cpp | 9 + eslint.config.js | 29 + index.html | 22 + mini-odeint/CMakeLists.txt | 39 +- mini-odeint/{ => include}/mini-odeint.hpp | 0 package.json | 29 + pffft/cmake/compiler_warnings.cmake | 4 +- pffft/pffft.h | 4 +- pnpm-lock.yaml | 1329 ++++++++++++++ prettier.config.js | 19 + src/index.ts | 116 ++ tsconfig.json | 21 + 17 files changed, 3696 insertions(+), 20 deletions(-) create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 CMakeLists.txt create mode 100644 compat/avxintrin.h create mode 100644 demo/index.html create mode 100644 ecgsyn.cpp create mode 100644 eslint.config.js create mode 100644 index.html rename mini-odeint/{ => include}/mini-odeint.hpp (100%) create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 prettier.config.js create mode 100644 src/index.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c09716e --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.cache/ +build/ +compile_commands.json +/dist/ +node_modules/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..2d6d673 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +pffft/ +mini-odeint/ +pnpm-lock.yaml diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6047ff0 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,48 @@ +cmake_minimum_required(VERSION 3.20) +set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) + +set(EMSCRIPTEN_ROOT $ENV{EMSDK}) +if(NOT EMSCRIPTEN_ROOT) + set(EMSCRIPTEN_ROOT /usr/lib/emscripten) +endif() + +set(EMSCRIPTEN_ROOT + "${EMSCRIPTEN_ROOT}" + CACHE PATH "Emscripten SDK path") + +set(CMAKE_TOOLCHAIN_FILE + "${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake" + CACHE FILEPATH "Emscripten toolchain file") + +project(ecgsyn.js) + +option(BUILD_SHARED_LIBS "Build shared libraries" OFF) + +set(CMAKE_C_STANDARD 99) +set(CMAKE_CXX_STANDARD 20) + +set(PFFFT_USE_TYPE_FLOAT + OFF + CACHE BOOL "activate pffft float" FORCE) + +include_directories(BEFORE SYSTEM compat) +add_compile_options(-flto -msimd128 -mavx) +add_link_options(-flto) + +add_subdirectory(mini-odeint EXCLUDE_FROM_ALL) +add_subdirectory(pffft EXCLUDE_FROM_ALL) + +add_executable(ecgsyn ecgsyn.cpp) +target_compile_options(ecgsyn PRIVATE) +target_link_options( + ecgsyn + PRIVATE + -flto + -sEXPORTED_FUNCTIONS=_ecgsyn + --no-entry + -sSTRICT + -sNO_ASSERTIONS + -sNO_FILESYSTEM + -sMALLOC=emmalloc) +target_link_libraries(ecgsyn PRIVATE PFFFT) +set_target_properties(ecgsyn PROPERTIES SUFFIX ".wasm") diff --git a/compat/avxintrin.h b/compat/avxintrin.h new file mode 100644 index 0000000..45171eb --- /dev/null +++ b/compat/avxintrin.h @@ -0,0 +1,2010 @@ +/* + * Copyright 2020 The Emscripten Authors. All rights reserved. + * Emscripten is available under two separate licenses, the MIT license and the + * University of Illinois/NCSA Open Source License. Both these licenses can be + * found in the LICENSE file. + */ +#ifndef __emscripten_avxintrin_h__ +#define __emscripten_avxintrin_h__ + +#ifndef __AVX__ +#error "AVX instruction set not enabled" +#endif + +#include +#include +#include +#include +#include +#include + +typedef struct { + __m128d v0; + __m128d v1; +} __m256d; + +typedef struct { + __m128 v0; + __m128 v1; +} __m256; + +typedef struct { + __m128i v0; + __m128i v1; +} __m256i; + +typedef int64_t __m128i_u __attribute__((__vector_size__(16), __aligned__(1))); + +typedef struct { + __m128i_u v0; + __m128i_u v1; +} __m256i_u; + +union __m256_data { + __m256i int_view; + __m256d double_view; + __m256 float_view; + __m128i_u int_u_view; +}; + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_add_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_add_pd(__a.v0, __b.v0); + ret.v1 = _mm_add_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_add_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_add_ps(__a.v0, __b.v0); + ret.v1 = _mm_add_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_sub_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_sub_pd(__a.v0, __b.v0); + ret.v1 = _mm_sub_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_sub_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_sub_ps(__a.v0, __b.v0); + ret.v1 = _mm_sub_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_addsub_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_addsub_pd(__a.v0, __b.v0); + ret.v1 = _mm_addsub_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_addsub_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_addsub_ps(__a.v0, __b.v0); + ret.v1 = _mm_addsub_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_div_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_div_pd(__a.v0, __b.v0); + ret.v1 = _mm_div_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_div_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_div_ps(__a.v0, __b.v0); + ret.v1 = _mm_div_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_max_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_max_pd(__a.v0, __b.v0); + ret.v1 = _mm_max_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_max_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_max_ps(__a.v0, __b.v0); + ret.v1 = _mm_max_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_min_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_min_pd(__a.v0, __b.v0); + ret.v1 = _mm_min_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_min_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_min_ps(__a.v0, __b.v0); + ret.v1 = _mm_min_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_mul_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_mul_pd(__a.v0, __b.v0); + ret.v1 = _mm_mul_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_mul_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_mul_ps(__a.v0, __b.v0); + ret.v1 = _mm_mul_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_sqrt_pd(__m256d __a) { + __m256d ret; + ret.v0 = _mm_sqrt_pd(__a.v0); + ret.v1 = _mm_sqrt_pd(__a.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_sqrt_ps(__m256 __a) { + __m256 ret; + ret.v0 = _mm_sqrt_ps(__a.v0); + ret.v1 = _mm_sqrt_ps(__a.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_rsqrt_ps(__m256 __a) { + __m256 ret; + ret.v0 = _mm_rsqrt_ps(__a.v0); + ret.v1 = _mm_rsqrt_ps(__a.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_rcp_ps(__m256 __a) { + __m256 ret; + ret.v0 = _mm_rcp_ps(__a.v0); + ret.v1 = _mm_rcp_ps(__a.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_round_pd(__m256d __a, int __rounding) { + __m256d ret; + ret.v0 = _mm_round_pd(__a.v0, __rounding); + ret.v1 = _mm_round_pd(__a.v1, __rounding); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_round_ps(__m256 __a, int __rounding) { + __m256 ret; + ret.v0 = _mm_round_ps(__a.v0, __rounding); + ret.v1 = _mm_round_ps(__a.v1, __rounding); + return ret; +} + +#define _mm256_ceil_pd(V) _mm256_round_pd((V), _MM_FROUND_CEIL) +#define _mm256_floor_pd(V) _mm256_round_pd((V), _MM_FROUND_FLOOR) +#define _mm256_ceil_ps(V) _mm256_round_ps((V), _MM_FROUND_CEIL) +#define _mm256_floor_ps(V) _mm256_round_ps((V), _MM_FROUND_FLOOR) + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_and_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_and_pd(__a.v0, __b.v0); + ret.v1 = _mm_and_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_and_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_and_ps(__a.v0, __b.v0); + ret.v1 = _mm_and_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_andnot_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_andnot_pd(__a.v0, __b.v0); + ret.v1 = _mm_andnot_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_andnot_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_andnot_ps(__a.v0, __b.v0); + ret.v1 = _mm_andnot_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_or_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_or_pd(__a.v0, __b.v0); + ret.v1 = _mm_or_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_or_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_or_ps(__a.v0, __b.v0); + ret.v1 = _mm_or_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_xor_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_xor_pd(__a.v0, __b.v0); + ret.v1 = _mm_xor_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_xor_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_xor_ps(__a.v0, __b.v0); + ret.v1 = _mm_xor_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_hadd_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_hadd_pd(__a.v0, __b.v0); + ret.v1 = _mm_hadd_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_hadd_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_hadd_ps(__a.v0, __b.v0); + ret.v1 = _mm_hadd_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_hsub_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_hsub_pd(__a.v0, __b.v0); + ret.v1 = _mm_hsub_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_hsub_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_hsub_ps(__a.v0, __b.v0); + ret.v1 = _mm_hsub_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) +_mm_permutevar_pd(__m128d __a, __m128i __c) { + return (__m128d)wasm_f64x2_make( + ((__f64x2)__a)[(wasm_i64x2_extract_lane(__c, 0) >> 1) & 1], + ((__f64x2)__a)[(wasm_i64x2_extract_lane(__c, 1) >> 1) & 1]); +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_permutevar_pd(__m256d __a, __m256i __c) { + __m256d ret; + ret.v0 = _mm_permutevar_pd(__a.v0, __c.v0); + ret.v1 = _mm_permutevar_pd(__a.v1, __c.v1); + return ret; +} + +static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) +_mm_permutevar_ps(__m128 __a, __m128i __c) { + return (__m128)wasm_f32x4_make( + ((__f32x4)__a)[wasm_i32x4_extract_lane(__c, 0) & 3], + ((__f32x4)__a)[wasm_i32x4_extract_lane(__c, 1) & 3], + ((__f32x4)__a)[wasm_i32x4_extract_lane(__c, 2) & 3], + ((__f32x4)__a)[wasm_i32x4_extract_lane(__c, 3) & 3]); +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_permutevar_ps(__m256 __a, __m256i __c) { + __m256 ret; + ret.v0 = _mm_permutevar_ps(__a.v0, __c.v0); + ret.v1 = _mm_permutevar_ps(__a.v1, __c.v1); + return ret; +} + +#define _mm_permute_pd(__a, __imm) \ + ((__m128d)wasm_i64x2_shuffle( \ + (__m128d)(__a), (__m128d)(__a), ((__imm) & 1), (((__imm) >> 1) & 1))) + +#define _mm256_permute_pd(__A, __imm) \ + __extension__({ \ + __m256d __a = (__A); \ + _mm256_set_m128d(_mm_permute_pd(__a.v1, (__imm) >> 2), \ + _mm_permute_pd(__a.v0, (__imm))); \ + }) + +#define _mm_permute_ps(__a, __imm) \ + ((__m128)wasm_i32x4_shuffle((__m128)(__a), \ + (__m128)(__a), \ + ((__imm) & 3), \ + (((__imm) >> 2) & 3), \ + (((__imm) >> 4) & 3), \ + (((__imm) >> 6) & 3))) + +#define _mm256_permute_ps(__A, __imm) \ + __extension__({ \ + __m256 __a = (__A); \ + _mm256_set_m128(_mm_permute_ps(__a.v1, (__imm)), \ + _mm_permute_ps(__a.v0, (__imm))); \ + }) + +static __inline__ __m128d +__avx_select4d(__m256d __a, __m256d __b, const int imm8) { + switch (imm8 & 0xF) { + case 0: + case 4: + return __a.v0; + case 1: + case 5: + return __a.v1; + case 2: + case 6: + return __b.v0; + case 3: + case 7: + return __b.v1; + default: + return (__m128d)wasm_i64x2_const_splat(0); + } +} + +static __inline__ __m128 __avx_select4(__m256 __a, __m256 __b, const int imm8) { + switch (imm8 & 0xF) { + case 0: + case 4: + return __a.v0; + case 1: + case 5: + return __a.v1; + case 2: + case 6: + return __b.v0; + case 3: + case 7: + return __b.v1; + default: + return (__m128)wasm_i64x2_const_splat(0); + } +} + +static __inline__ __m128i +__avx_select4i(__m256i __a, __m256i __b, const int imm8) { + switch (imm8 & 0xF) { + case 0: + case 4: + return __a.v0; + case 1: + case 5: + return __a.v1; + case 2: + case 6: + return __b.v0; + case 3: + case 7: + return __b.v1; + default: + return wasm_i64x2_const_splat(0); + } +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_permute2f128_pd(__m256d __a, __m256d __b, const int imm8) { + __m256d ret; + ret.v0 = __avx_select4d(__a, __b, imm8); + ret.v1 = __avx_select4d(__a, __b, imm8 >> 4); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_permute2f128_ps(__m256 __a, __m256 __b, const int imm8) { + __m256 ret; + ret.v0 = __avx_select4(__a, __b, imm8); + ret.v1 = __avx_select4(__a, __b, imm8 >> 4); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_permute2f128_si256(__m256i __a, __m256i __b, const int imm8) { + __m256i ret; + ret.v0 = __avx_select4i(__a, __b, imm8); + ret.v1 = __avx_select4i(__a, __b, imm8 >> 4); + return ret; +} + +#define _mm256_blend_pd(__A, __B, imm8) \ + __extension__({ \ + __m256d __a = (__A); \ + __m256d __b = (__B); \ + _mm256_set_m128d(_mm_blend_pd(__a.v1, __b.v1, (imm8) >> 2), \ + _mm_blend_pd(__a.v0, __b.v0, (imm8))); \ + }) + +#define _mm256_blend_ps(__A, __B, imm) \ + __extension__({ \ + __m256 __a = (__A); \ + __m256 __b = (__B); \ + _mm256_set_m128(_mm_blend_ps(__a.v1, __b.v1, (imm) >> 4), \ + _mm_blend_ps(__a.v0, __b.v0, (imm))); \ + }) + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_blendv_pd(__m256d __a, __m256d __b, __m256d __c) { + __m256d ret; + ret.v0 = _mm_blendv_pd(__a.v0, __b.v0, __c.v0); + ret.v1 = _mm_blendv_pd(__a.v1, __b.v1, __c.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_blendv_ps(__m256 __a, __m256 __b, __m256 __c) { + __m256 ret; + ret.v0 = _mm_blendv_ps(__a.v0, __b.v0, __c.v0); + ret.v1 = _mm_blendv_ps(__a.v1, __b.v1, __c.v1); + return ret; +} + +#define _mm256_dp_ps(__A, __B, imm) \ + __extension__({ \ + __m256 __a = (__A); \ + __m256 __b = (__B); \ + _mm256_set_m128(_mm_dp_ps(__a.v1, __b.v1, (imm)), \ + _mm_dp_ps(__a.v0, __b.v0, (imm))); \ + }) + +#define _mm256_shuffle_ps(__A, __B, mask) \ + __extension__({ \ + __m256 __a = (__A); \ + __m256 __b = (__B); \ + _mm256_set_m128(_mm_shuffle_ps(__a.v1, __b.v1, (mask)), \ + _mm_shuffle_ps(__a.v0, __b.v0, (mask))); \ + }) + +#define _mm256_shuffle_pd(__A, __B, mask) \ + __extension__({ \ + __m256d __a = (__A); \ + __m256d __b = (__B); \ + _mm256_set_m128d(_mm_shuffle_pd(__a.v1, __b.v1, (mask) >> 2), \ + _mm_shuffle_pd(__a.v0, __b.v0, (mask))); \ + }) + +#define _CMP_EQ_OQ 0 +#define _CMP_LT_OS 1 +#define _CMP_LE_OS 2 +#define _CMP_UNORD_Q 3 +#define _CMP_NEQ_UQ 4 +#define _CMP_NLT_US 5 +#define _CMP_NLE_US 6 +#define _CMP_ORD_Q 7 +#define _CMP_EQ_UQ 8 +#define _CMP_NGE_US 9 +#define _CMP_NGT_US 10 +#define _CMP_FALSE_OQ 11 +#define _CMP_NEQ_OQ 12 +#define _CMP_GE_OS 13 +#define _CMP_GT_OS 14 +#define _CMP_TRUE_UQ 15 +#define _CMP_EQ_OS 16 +#define _CMP_LT_OQ 17 +#define _CMP_LE_OQ 18 +#define _CMP_UNORD_S 19 +#define _CMP_NEQ_US 20 +#define _CMP_NLT_UQ 21 +#define _CMP_NLE_UQ 22 +#define _CMP_ORD_S 23 +#define _CMP_EQ_US 24 +#define _CMP_NGE_UQ 25 +#define _CMP_NGT_UQ 26 +#define _CMP_FALSE_OS 27 +#define _CMP_NEQ_OS 28 +#define _CMP_GE_OQ 29 +#define _CMP_GT_OQ 30 +#define _CMP_TRUE_US 31 + +#define _mm_cmp_pd(__a, __b, __imm) \ + __extension__({ \ + __m128d __ret; \ + switch ((__imm)) { \ + case _CMP_EQ_OQ: \ + case _CMP_EQ_OS: \ + __ret = _mm_cmpeq_pd((__a), (__b)); \ + break; \ + case _CMP_EQ_UQ: \ + case _CMP_EQ_US: \ + __ret = _mm_or_pd(_mm_cmpeq_pd((__a), (__b)), \ + _mm_cmpunord_pd((__a), (__b))); \ + break; \ + case _CMP_LT_OS: \ + case _CMP_LT_OQ: \ + __ret = _mm_cmplt_pd((__a), (__b)); \ + break; \ + case _CMP_LE_OS: \ + case _CMP_LE_OQ: \ + __ret = _mm_cmple_pd((__a), (__b)); \ + break; \ + case _CMP_UNORD_Q: \ + case _CMP_UNORD_S: \ + __ret = _mm_cmpunord_pd((__a), (__b)); \ + break; \ + case _CMP_NEQ_UQ: \ + case _CMP_NEQ_US: \ + __ret = _mm_cmpneq_pd((__a), (__b)); \ + break; \ + case _CMP_NEQ_OQ: \ + case _CMP_NEQ_OS: \ + __ret = _mm_andnot_pd(_mm_cmpunord_pd((__a), (__b)), \ + _mm_cmpneq_pd((__a), (__b))); \ + break; \ + case _CMP_NLT_US: \ + case _CMP_NLT_UQ: \ + __ret = _mm_cmpnlt_pd((__a), (__b)); \ + break; \ + case _CMP_ORD_Q: \ + case _CMP_ORD_S: \ + __ret = _mm_cmpord_pd((__a), (__b)); \ + break; \ + case _CMP_NGE_US: \ + case _CMP_NGE_UQ: \ + __ret = _mm_cmpnge_pd((__a), (__b)); \ + break; \ + case _CMP_NGT_US: \ + case _CMP_NGT_UQ: \ + __ret = _mm_cmpngt_pd((__a), (__b)); \ + break; \ + case _CMP_FALSE_OQ: \ + case _CMP_FALSE_OS: \ + __ret = _mm_setzero_pd(); \ + break; \ + case _CMP_GE_OS: \ + case _CMP_GE_OQ: \ + __ret = _mm_cmpge_pd((__a), (__b)); \ + break; \ + case _CMP_GT_OS: \ + case _CMP_GT_OQ: \ + __ret = _mm_cmpgt_pd((__a), (__b)); \ + break; \ + case _CMP_TRUE_UQ: \ + case _CMP_TRUE_US: \ + __ret = (__m128d)wasm_i8x16_splat(0xFF); \ + break; \ + case _CMP_NLE_US: \ + case _CMP_NLE_UQ: \ + __ret = _mm_cmpnle_pd((__a), (__b)); \ + break; \ + } \ + __ret; \ + }) + +#define _mm_cmp_ps(__a, __b, __imm) \ + __extension__({ \ + __m128 __ret; \ + switch ((__imm)) { \ + case _CMP_EQ_OQ: \ + case _CMP_EQ_OS: \ + __ret = _mm_cmpeq_ps((__a), (__b)); \ + break; \ + case _CMP_EQ_UQ: \ + case _CMP_EQ_US: \ + __ret = _mm_or_ps(_mm_cmpeq_ps((__a), (__b)), \ + _mm_cmpunord_ps((__a), (__b))); \ + break; \ + case _CMP_LT_OS: \ + case _CMP_LT_OQ: \ + __ret = _mm_cmplt_ps((__a), (__b)); \ + break; \ + case _CMP_LE_OS: \ + case _CMP_LE_OQ: \ + __ret = _mm_cmple_ps((__a), (__b)); \ + break; \ + case _CMP_UNORD_Q: \ + case _CMP_UNORD_S: \ + __ret = _mm_cmpunord_ps((__a), (__b)); \ + break; \ + case _CMP_NEQ_UQ: \ + case _CMP_NEQ_US: \ + __ret = _mm_cmpneq_ps((__a), (__b)); \ + break; \ + case _CMP_NEQ_OQ: \ + case _CMP_NEQ_OS: \ + __ret = _mm_andnot_ps(_mm_cmpunord_ps((__a), (__b)), \ + _mm_cmpneq_ps((__a), (__b))); \ + break; \ + case _CMP_NLT_US: \ + case _CMP_NLT_UQ: \ + __ret = _mm_cmpnlt_ps((__a), (__b)); \ + break; \ + case _CMP_ORD_Q: \ + case _CMP_ORD_S: \ + __ret = _mm_cmpord_ps((__a), (__b)); \ + break; \ + case _CMP_NGE_US: \ + case _CMP_NGE_UQ: \ + __ret = _mm_cmpnge_ps((__a), (__b)); \ + break; \ + case _CMP_NGT_US: \ + case _CMP_NGT_UQ: \ + __ret = _mm_cmpngt_ps((__a), (__b)); \ + break; \ + case _CMP_FALSE_OQ: \ + case _CMP_FALSE_OS: \ + __ret = _mm_setzero_ps(); \ + break; \ + case _CMP_GE_OS: \ + case _CMP_GE_OQ: \ + __ret = _mm_cmpge_ps((__a), (__b)); \ + break; \ + case _CMP_GT_OS: \ + case _CMP_GT_OQ: \ + __ret = _mm_cmpgt_ps((__a), (__b)); \ + break; \ + case _CMP_TRUE_UQ: \ + case _CMP_TRUE_US: \ + __ret = (__m128)wasm_i8x16_splat(0xFF); \ + break; \ + case _CMP_NLE_US: \ + case _CMP_NLE_UQ: \ + __ret = _mm_cmpnle_ps((__a), (__b)); \ + break; \ + } \ + __ret; \ + }) + +#define _mm_cmp_sd(__a, __b, __imm) \ + __extension__({ \ + __m128d __ret; \ + switch ((__imm)) { \ + case _CMP_EQ_OQ: \ + case _CMP_EQ_OS: \ + __ret = _mm_cmpeq_sd((__a), (__b)); \ + break; \ + case _CMP_EQ_UQ: \ + case _CMP_EQ_US: \ + __ret = _mm_move_sd((__a), \ + _mm_or_pd(_mm_cmpeq_sd((__a), (__b)), \ + _mm_cmpunord_sd((__a), (__b)))); \ + break; \ + case _CMP_LT_OS: \ + case _CMP_LT_OQ: \ + __ret = _mm_cmplt_sd((__a), (__b)); \ + break; \ + case _CMP_LE_OS: \ + case _CMP_LE_OQ: \ + __ret = _mm_cmple_sd((__a), (__b)); \ + break; \ + case _CMP_UNORD_Q: \ + case _CMP_UNORD_S: \ + __ret = _mm_cmpunord_sd((__a), (__b)); \ + break; \ + case _CMP_NEQ_UQ: \ + case _CMP_NEQ_US: \ + __ret = _mm_cmpneq_sd((__a), (__b)); \ + break; \ + case _CMP_NEQ_OQ: \ + case _CMP_NEQ_OS: \ + __ret = _mm_move_sd((__a), \ + _mm_andnot_pd(_mm_cmpunord_sd((__a), (__b)), \ + _mm_cmpneq_sd((__a), (__b)))); \ + break; \ + case _CMP_NLT_US: \ + case _CMP_NLT_UQ: \ + __ret = _mm_cmpnlt_sd((__a), (__b)); \ + break; \ + case _CMP_ORD_Q: \ + case _CMP_ORD_S: \ + __ret = _mm_cmpord_sd((__a), (__b)); \ + break; \ + case _CMP_NGE_US: \ + case _CMP_NGE_UQ: \ + __ret = _mm_cmpnge_sd((__a), (__b)); \ + break; \ + case _CMP_NGT_US: \ + case _CMP_NGT_UQ: \ + __ret = _mm_cmpngt_sd((__a), (__b)); \ + break; \ + case _CMP_FALSE_OQ: \ + case _CMP_FALSE_OS: \ + __ret = _mm_move_sd((__a), _mm_setzero_pd()); \ + break; \ + case _CMP_GE_OS: \ + case _CMP_GE_OQ: \ + __ret = _mm_cmpge_sd((__a), (__b)); \ + break; \ + case _CMP_GT_OS: \ + case _CMP_GT_OQ: \ + __ret = _mm_cmpgt_sd((__a), (__b)); \ + break; \ + case _CMP_TRUE_UQ: \ + case _CMP_TRUE_US: \ + __ret = _mm_move_sd((__a), (__m128d)wasm_i8x16_splat(0xFF)); \ + break; \ + case _CMP_NLE_US: \ + case _CMP_NLE_UQ: \ + __ret = _mm_cmpnle_sd((__a), (__b)); \ + break; \ + } \ + __ret; \ + }) + +#define _mm_cmp_ss(__a, __b, __imm) \ + __extension__({ \ + __m128 __ret; \ + switch ((__imm)) { \ + case _CMP_EQ_OQ: \ + case _CMP_EQ_OS: \ + __ret = _mm_cmpeq_ss((__a), (__b)); \ + break; \ + case _CMP_EQ_UQ: \ + case _CMP_EQ_US: \ + __ret = _mm_move_ss((__a), \ + _mm_or_ps(_mm_cmpeq_ss((__a), (__b)), \ + _mm_cmpunord_ss((__a), (__b)))); \ + break; \ + case _CMP_LT_OS: \ + case _CMP_LT_OQ: \ + __ret = _mm_cmplt_ss((__a), (__b)); \ + break; \ + case _CMP_LE_OS: \ + case _CMP_LE_OQ: \ + __ret = _mm_cmple_ss((__a), (__b)); \ + break; \ + case _CMP_UNORD_Q: \ + case _CMP_UNORD_S: \ + __ret = _mm_cmpunord_ss((__a), (__b)); \ + break; \ + case _CMP_NEQ_UQ: \ + case _CMP_NEQ_US: \ + __ret = _mm_cmpneq_ss((__a), (__b)); \ + break; \ + case _CMP_NEQ_OQ: \ + case _CMP_NEQ_OS: \ + __ret = _mm_move_ss((__a), \ + _mm_andnot_ps(_mm_cmpunord_ss((__a), (__b)), \ + _mm_cmpneq_ss((__a), (__b)))); \ + break; \ + case _CMP_NLT_US: \ + case _CMP_NLT_UQ: \ + __ret = _mm_cmpnlt_ss((__a), (__b)); \ + break; \ + case _CMP_ORD_Q: \ + case _CMP_ORD_S: \ + __ret = _mm_cmpord_ss((__a), (__b)); \ + break; \ + case _CMP_NGE_US: \ + case _CMP_NGE_UQ: \ + __ret = _mm_cmpnge_ss((__a), (__b)); \ + break; \ + case _CMP_NGT_US: \ + case _CMP_NGT_UQ: \ + __ret = _mm_cmpngt_ss((__a), (__b)); \ + break; \ + case _CMP_FALSE_OQ: \ + case _CMP_FALSE_OS: \ + __ret = _mm_move_ss((__a), _mm_setzero_ps()); \ + break; \ + case _CMP_GE_OS: \ + case _CMP_GE_OQ: \ + __ret = _mm_cmpge_ss((__a), (__b)); \ + break; \ + case _CMP_GT_OS: \ + case _CMP_GT_OQ: \ + __ret = _mm_cmpgt_ss((__a), (__b)); \ + break; \ + case _CMP_TRUE_UQ: \ + case _CMP_TRUE_US: \ + __ret = _mm_move_ss((__a), (__m128)wasm_i8x16_splat(0xFF)); \ + break; \ + case _CMP_NLE_US: \ + case _CMP_NLE_UQ: \ + __ret = _mm_cmpnle_ss((__a), (__b)); \ + break; \ + } \ + __ret; \ + }) + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_cmp_pd(__m256d a, __m256d b, const int imm8) { + __m256d ret; + ret.v0 = _mm_cmp_pd(a.v0, b.v0, imm8); + ret.v1 = _mm_cmp_pd(a.v1, b.v1, imm8); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_cmp_ps(__m256 __a, __m256 __b, const int imm8) { + __m256 ret; + ret.v0 = _mm_cmp_ps(__a.v0, __b.v0, imm8); + ret.v1 = _mm_cmp_ps(__a.v1, __b.v1, imm8); + return ret; +} + +#define _mm256_extract_epi32(__A, N) \ + __extension__({ \ + __m256i __a = (__A); \ + ((N) & 0x7) < 4 ? _mm_extract_epi32(__a.v0, (N) & 0x3) \ + : _mm_extract_epi32(__a.v1, (N) & 0x3); \ + }) + +#define _mm256_extract_epi16(__A, N) \ + __extension__({ \ + __m256i __a = (__A); \ + ((N) & 0xF) < 8 ? _mm_extract_epi16(__a.v0, (N) & 0x7) \ + : _mm_extract_epi16(__a.v1, (N) & 0x7); \ + }) + +#define _mm256_extract_epi8(__A, N) \ + __extension__({ \ + __m256i __a = (__A); \ + ((N) & 0x1F) < 16 ? _mm_extract_epi8(__a.v0, (N) & 0xF) \ + : _mm_extract_epi8(__a.v1, (N) & 0xF); \ + }) + +#define _mm256_extract_epi64(__A, N) \ + __extension__({ \ + __m256i __a = (__A); \ + ((N) & 0x3) < 2 ? _mm_extract_epi64(__a.v0, (N) & 0x1) \ + : _mm_extract_epi64(__a.v1, (N) & 0x1); \ + }) + +#define _mm256_insert_epi32(__A, __I, N) \ + __extension__({ \ + __m256i __a = (__A); \ + int32_t __i = (__I); \ + ((N) & 0x7) < 4 \ + ? _mm256_set_m128i(__a.v1, _mm_insert_epi32(__a.v0, __i, (N) & 0x3)) \ + : _mm256_set_m128i(_mm_insert_epi32(__a.v1, __i, (N) & 0x3), __a.v0); \ + }) + +#define _mm256_insert_epi16(__A, __I, N) \ + __extension__({ \ + __m256i __a = (__A); \ + int16_t __i = (__I); \ + ((N) & 0xF) < 8 \ + ? _mm256_set_m128i(__a.v1, _mm_insert_epi16(__a.v0, __i, (N) & 0x7)) \ + : _mm256_set_m128i(_mm_insert_epi16(__a.v1, __i, (N) & 0x7), __a.v0); \ + }) + +#define _mm256_insert_epi8(__A, __I, N) \ + __extension__({ \ + __m256i __a = (__A); \ + int8_t __i = (__I); \ + ((N) & 0x1F) < 16 \ + ? _mm256_set_m128i(__a.v1, _mm_insert_epi8(__a.v0, __i, (N) & 0xF)) \ + : _mm256_set_m128i(_mm_insert_epi8(__a.v1, __i, (N) & 0xF), __a.v0); \ + }) + +#define _mm256_insert_epi64(__A, __I, N) \ + __extension__({ \ + __m256i __a = (__A); \ + int64_t __i = (__I); \ + ((N) & 0x3) < 2 \ + ? _mm256_set_m128i(__a.v1, _mm_insert_epi64(__a.v0, __i, (N) & 0x1)) \ + : _mm256_set_m128i(_mm_insert_epi64(__a.v1, __i, (N) & 0x1), __a.v0); \ + }) + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepi32_pd(__m128i __a) { + __m256d ret; + ret.v0 = _mm_cvtepi32_pd(__a); + __m128i __a1 = wasm_i32x4_shuffle(__a, __a, 2, 3, 0, 0); + ret.v1 = _mm_cvtepi32_pd(__a1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepi32_ps(__m256i __a) { + __m256 ret; + ret.v0 = _mm_cvtepi32_ps(__a.v0); + ret.v1 = _mm_cvtepi32_ps(__a.v1); + return ret; +} + +static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtpd_ps(__m256d __a) { + __m128 low = _mm_cvtpd_ps(__a.v0); + __m128 high = _mm_cvtpd_ps(__a.v1); + __m128 ret = (__m128)wasm_i32x4_shuffle(low, high, 0, 1, 4, 5); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtps_epi32(__m256 __a) { + __m256i ret; + ret.v0 = _mm_cvtps_epi32(__a.v0); + ret.v1 = _mm_cvtps_epi32(__a.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtps_pd(__m128 __a) { + __m256d ret; + ret.v0 = _mm_cvtps_pd(__a); + __m128 __a1 = (__m128)wasm_i32x4_shuffle(__a, __a, 2, 3, 0, 0); + ret.v1 = _mm_cvtps_pd(__a1); + return ret; +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvttpd_epi32(__m256d __a) { + __m128i low = _mm_cvttpd_epi32(__a.v0); + __m128i high = _mm_cvttpd_epi32(__a.v1); + __m128i ret = wasm_i32x4_shuffle(low, high, 0, 1, 4, 5); + return ret; +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtpd_epi32(__m256d __a) { + __m128i low = _mm_cvtpd_epi32(__a.v0); + __m128i high = _mm_cvtpd_epi32(__a.v1); + __m128i ret = wasm_i32x4_shuffle(low, high, 0, 1, 4, 5); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvttps_epi32(__m256 __a) { + __m256i ret; + ret.v0 = _mm_cvttps_epi32(__a.v0); + ret.v1 = _mm_cvttps_epi32(__a.v1); + return ret; +} + +static __inline__ double __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtsd_f64(__m256d __a) { + return _mm_cvtsd_f64(__a.v0); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtsi256_si32(__m256i __a) { + return _mm_cvtsi128_si32(__a.v0); +} + +static __inline__ float __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtss_f32(__m256 __a) { + return _mm_cvtss_f32(__a.v0); +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_movehdup_ps(__m256 __a) { + __m256 ret; + ret.v0 = _mm_movehdup_ps(__a.v0); + ret.v1 = _mm_movehdup_ps(__a.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_moveldup_ps(__m256 __a) { + __m256 ret; + ret.v0 = _mm_moveldup_ps(__a.v0); + ret.v1 = _mm_moveldup_ps(__a.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_movedup_pd(__m256d __a) { + __m256d ret; + ret.v0 = _mm_movedup_pd(__a.v0); + ret.v1 = _mm_movedup_pd(__a.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_unpackhi_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_unpackhi_pd(__a.v0, __b.v0); + ret.v1 = _mm_unpackhi_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_unpacklo_pd(__m256d __a, __m256d __b) { + __m256d ret; + ret.v0 = _mm_unpacklo_pd(__a.v0, __b.v0); + ret.v1 = _mm_unpacklo_pd(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_unpackhi_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_unpackhi_ps(__a.v0, __b.v0); + ret.v1 = _mm_unpackhi_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_unpacklo_ps(__m256 __a, __m256 __b) { + __m256 ret; + ret.v0 = _mm_unpacklo_ps(__a.v0, __b.v0); + ret.v1 = _mm_unpacklo_ps(__a.v1, __b.v1); + return ret; +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm_testz_pd(__m128d __a, __m128d __b) { + v128_t __m = + wasm_u64x2_shr(wasm_v128_not(wasm_v128_and((v128_t)__a, (v128_t)__b)), 63); + return wasm_i64x2_extract_lane(__m, 0) & wasm_i64x2_extract_lane(__m, 1); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm_testc_pd(__m128d __a, __m128d __b) { + v128_t __m = + wasm_u64x2_shr(wasm_v128_or(wasm_v128_not((v128_t)__b), (v128_t)__a), 63); + return wasm_i64x2_extract_lane(__m, 0) & wasm_i64x2_extract_lane(__m, 1); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm_testnzc_pd(__m128d __a, __m128d __b) { + v128_t __m = wasm_u64x2_shr(wasm_v128_and((v128_t)__a, (v128_t)__b), 63); + v128_t __m2 = wasm_u64x2_shr(wasm_v128_andnot((v128_t)__b, (v128_t)__a), 63); + return (wasm_i64x2_extract_lane(__m, 0) | wasm_i64x2_extract_lane(__m, 1)) & + (wasm_i64x2_extract_lane(__m2, 0) | wasm_i64x2_extract_lane(__m2, 1)); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm_testz_ps(__m128 __a, __m128 __b) { + v128_t __m = + wasm_u32x4_shr(wasm_v128_not(wasm_v128_and((v128_t)__a, (v128_t)__b)), 31); + __m = wasm_v128_and(__m, (v128_t)_mm_movehl_ps((__m128)__m, (__m128)__m)); + __m = wasm_v128_and(__m, _mm_shuffle_epi32(__m, _MM_SHUFFLE(3, 2, 0, 1))); + return wasm_i32x4_extract_lane(__m, 0); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm_testc_ps(__m128 __a, __m128 __b) { + v128_t __m = + wasm_u32x4_shr(wasm_v128_or(wasm_v128_not((v128_t)__b), (v128_t)__a), 31); + __m = wasm_v128_and(__m, (v128_t)_mm_movehl_ps((__m128)__m, (__m128)__m)); + __m = wasm_v128_and(__m, _mm_shuffle_epi32(__m, _MM_SHUFFLE(3, 2, 0, 1))); + return wasm_i32x4_extract_lane(__m, 0); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm_testnzc_ps(__m128 __a, __m128 __b) { + v128_t __m = wasm_u32x4_shr(wasm_v128_and((v128_t)__a, (v128_t)__b), 31); + v128_t __m2 = wasm_u32x4_shr(wasm_v128_andnot((v128_t)__b, (v128_t)__a), 31); + + __m = wasm_v128_or(__m, (v128_t)_mm_movehl_ps((__m128)__m, (__m128)__m)); + __m2 = wasm_v128_or(__m2, (v128_t)_mm_movehl_ps((__m128)__m2, (__m128)__m2)); + __m = wasm_v128_or(__m, _mm_shuffle_epi32(__m, _MM_SHUFFLE(3, 2, 0, 1))); + __m2 = wasm_v128_or(__m2, _mm_shuffle_epi32(__m2, _MM_SHUFFLE(3, 2, 0, 1))); + + return wasm_i32x4_extract_lane(__m, 0) & wasm_i32x4_extract_lane(__m2, 0); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_testz_pd(__m256d __a, __m256d __b) { + return _mm_testz_pd(__a.v0, __b.v0) & _mm_testz_pd(__a.v1, __b.v1); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_testc_pd(__m256d __a, __m256d __b) { + return _mm_testc_pd(__a.v0, __b.v0) & _mm_testc_pd(__a.v1, __b.v1); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_testnzc_pd(__m256d __a, __m256d __b) { + v128_t __m = + wasm_u64x2_shr(wasm_v128_and((v128_t)__a.v0, (v128_t)__b.v0), 63); + v128_t __m1 = + wasm_u64x2_shr(wasm_v128_and((v128_t)__a.v1, (v128_t)__b.v1), 63); + v128_t __m2 = + wasm_u64x2_shr(wasm_v128_andnot((v128_t)__b.v0, (v128_t)__a.v0), 63); + v128_t __m3 = + wasm_u64x2_shr(wasm_v128_andnot((v128_t)__b.v1, (v128_t)__a.v1), 63); + return wasm_v128_any_true(wasm_v128_or(__m, __m1)) & + wasm_v128_any_true(wasm_v128_or(__m2, __m3)); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_testz_ps(__m256 __a, __m256 __b) { + return _mm_testz_ps(__a.v0, __b.v0) & _mm_testz_ps(__a.v1, __b.v1); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_testc_ps(__m256 __a, __m256 __b) { + return _mm_testc_ps(__a.v0, __b.v0) & _mm_testc_ps(__a.v1, __b.v1); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_testnzc_ps(__m256 __a, __m256 __b) { + v128_t __m = + wasm_u32x4_shr(wasm_v128_and((v128_t)__a.v0, (v128_t)__b.v0), 31); + v128_t __m1 = + wasm_u32x4_shr(wasm_v128_and((v128_t)__a.v1, (v128_t)__b.v1), 31); + v128_t __m2 = + wasm_u32x4_shr(wasm_v128_andnot((v128_t)__b.v0, (v128_t)__a.v0), 31); + v128_t __m3 = + wasm_u32x4_shr(wasm_v128_andnot((v128_t)__b.v1, (v128_t)__a.v1), 31); + + return wasm_v128_any_true(wasm_v128_or(__m, __m1)) & + wasm_v128_any_true(wasm_v128_or(__m2, __m3)); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_testz_si256(__m256i __a, __m256i __b) { + return _mm_testz_si128(__a.v0, __b.v0) & _mm_testz_si128(__a.v1, __b.v1); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_testc_si256(__m256i __a, __m256i __b) { + return _mm_testc_si128(__a.v0, __b.v0) & _mm_testc_si128(__a.v1, __b.v1); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_testnzc_si256(__m256i __a, __m256i __b) { + v128_t __m = wasm_v128_and(__a.v0, __b.v0); + v128_t __m1 = wasm_v128_and(__a.v1, __b.v1); + v128_t __m2 = wasm_v128_andnot(__b.v0, __a.v0); + v128_t __m3 = wasm_v128_andnot(__b.v1, __a.v1); + return wasm_v128_any_true(wasm_v128_or(__m, __m1)) & + wasm_v128_any_true(wasm_v128_or(__m2, __m3)); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_movemask_pd(__m256d __a) { + return _mm_movemask_pd(__a.v0) | (_mm_movemask_pd(__a.v1) << 2); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_movemask_ps(__m256 __a) { + return _mm_movemask_ps(__a.v0) | (_mm_movemask_ps(__a.v1) << 4); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_zeroall(void) { + // Do nothing + // when porting any assembly code that would have calls to these functions + // around, that assembly code in the first place will not compile. +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_zeroupper(void) { + // Do nothing + // when porting any assembly code that would have calls to these functions + // around, that assembly code in the first place will not compile. +} + +static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) +_mm_broadcast_ss(float const* __a) { + return (__m128)wasm_v128_load32_splat(__a); +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_broadcast_sd(double const* __a) { + __m256d ret; + ret.v1 = ret.v0 = (__m128d)wasm_v128_load64_splat(__a); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_broadcast_ss(float const* __a) { + __m256 ret; + ret.v1 = ret.v0 = _mm_broadcast_ss(__a); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_broadcast_pd(__m128d const* __a) { + __m256d ret; + ret.v1 = ret.v0 = (__m128d)wasm_v128_load(__a); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_broadcast_ps(__m128 const* __a) { + __m256 ret; + ret.v1 = ret.v0 = (__m128)wasm_v128_load(__a); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_load_pd(double const* __p) { + __m256d ret; + ret.v0 = _mm_load_pd(__p); + ret.v1 = _mm_load_pd(__p + 2); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_load_ps(float const* __p) { + __m256 ret; + ret.v0 = _mm_load_ps(__p); + ret.v1 = _mm_load_ps(__p + 4); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_loadu_pd(double const* __p) { + __m256d ret; + ret.v0 = _mm_loadu_pd(__p); + ret.v1 = _mm_loadu_pd(__p + 2); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_loadu_ps(float const* __p) { + __m256 ret; + ret.v0 = _mm_loadu_ps(__p); + ret.v1 = _mm_loadu_ps(__p + 4); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_load_si256(__m256i const* __p) { + __m256i ret; + ret.v0 = _mm_load_si128((__m128i const*)__p); + ret.v1 = _mm_load_si128(((__m128i const*)__p) + 1); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_loadu_si256(__m256i_u const* __p) { + __m256i ret; + ret.v0 = _mm_loadu_si128((__m128i const*)__p); + ret.v1 = _mm_loadu_si128(((__m128i const*)__p) + 1); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_lddqu_si256(__m256i_u const* __p) { + __m256i ret; + ret.v0 = _mm_lddqu_si128((__m128i const*)__p); + ret.v1 = _mm_lddqu_si128(((__m128i const*)__p) + 1); + return ret; +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_store_pd(double* __p, __m256d __a) { + _mm_store_pd(__p, __a.v0); + _mm_store_pd(__p + 2, __a.v1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_store_ps(float* __p, __m256 __a) { + _mm_store_ps(__p, __a.v0); + _mm_store_ps(__p + 4, __a.v1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_storeu_pd(double* __p, __m256d __a) { + _mm_storeu_pd(__p, __a.v0); + _mm_storeu_pd(__p + 2, __a.v1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_storeu_ps(float* __p, __m256 __a) { + _mm_storeu_ps(__p, __a.v0); + _mm_storeu_ps(__p + 4, __a.v1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_store_si256(__m256i* __p, __m256i __a) { + _mm_store_si128((__m128i*)__p, __a.v0); + _mm_store_si128(((__m128i*)__p) + 1, __a.v1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_storeu_si256(__m256i_u* __p, __m256i __a) { + _mm_storeu_si128((__m128i*)__p, __a.v0); + _mm_storeu_si128(((__m128i*)__p) + 1, __a.v1); +} + +static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) +_mm_maskload_pd(double const* __p, __m128i __m) { + // This may cause an out-of-bounds memory load since we first load and + // then mask, but since there are no segmentation faults in Wasm memory + // accesses, that is ok (as long as we are within the heap bounds - + // a negligible limitation in practice) + return _mm_and_pd(_mm_load_pd(__p), (__m128d)wasm_i64x2_shr(__m, 63)); +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_maskload_pd(double const* __p, __m256i __m) { + __m256d ret; + ret.v0 = _mm_maskload_pd(__p, __m.v0); + ret.v1 = _mm_maskload_pd(__p + 2, __m.v1); + return ret; +} + +static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) +_mm_maskload_ps(float const* __p, __m128i __m) { + // This may cause an out-of-bounds memory load since we first load and + // then mask, but since there are no segmentation faults in Wasm memory + // accesses, that is ok (as long as we are within the heap bounds - + // a negligible limitation in practice) + return _mm_and_ps(_mm_load_ps(__p), (__m128)_mm_srai_epi32(__m, 31)); +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_maskload_ps(float const* __p, __m256i __m) { + __m256 ret; + ret.v0 = _mm_maskload_ps(__p, __m.v0); + ret.v1 = _mm_maskload_ps(__p + 4, __m.v1); + return ret; +} + +static __inline__ void + __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) + _mm_maskstore_ps(float* __p, __m128i __m, __m128 __a) { + if ((wasm_i32x4_extract_lane(__m, 0) & 0x80000000ull) != 0) + __p[0] = wasm_f32x4_extract_lane((v128_t)__a, 0); + if ((wasm_i32x4_extract_lane(__m, 1) & 0x80000000ull) != 0) + __p[1] = wasm_f32x4_extract_lane((v128_t)__a, 1); + if ((wasm_i32x4_extract_lane(__m, 2) & 0x80000000ull) != 0) + __p[2] = wasm_f32x4_extract_lane((v128_t)__a, 2); + if ((wasm_i32x4_extract_lane(__m, 3) & 0x80000000ull) != 0) + __p[3] = wasm_f32x4_extract_lane((v128_t)__a, 3); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_maskstore_ps(float* __p, __m256i __m, __m256 __a) { + _mm_maskstore_ps(__p, __m.v0, __a.v0); + _mm_maskstore_ps(__p + 4, __m.v1, __a.v1); +} + +static __inline__ void + __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) + _mm_maskstore_pd(double* __p, __m128i __m, __m128d __a) { + if ((wasm_i64x2_extract_lane(__m, 0) & 0x8000000000000000ull) != 0) + __p[0] = wasm_f64x2_extract_lane((v128_t)__a, 0); + if ((wasm_i64x2_extract_lane(__m, 1) & 0x8000000000000000ull) != 0) + __p[1] = wasm_f64x2_extract_lane((v128_t)__a, 1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_maskstore_pd(double* __p, __m256i __m, __m256d __a) { + _mm_maskstore_pd(__p, __m.v0, __a.v0); + _mm_maskstore_pd(__p + 2, __m.v1, __a.v1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_stream_si256(void* __a, __m256i __b) { + _mm_stream_si128((__m128i*)__a, __b.v0); + _mm_stream_si128(((__m128i*)__a) + 1, __b.v1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_stream_pd(void* __a, __m256d __b) { + _mm_stream_pd((double*)__a, __b.v0); + _mm_stream_pd(((double*)__a) + 2, __b.v1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_stream_ps(void* __p, __m256 __a) { + _mm_stream_ps((float*)__p, __a.v0); + _mm_stream_ps(((float*)__p) + 4, __a.v1); +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_undefined_pd(void) { + __m256d val; + return val; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_undefined_ps(void) { + __m256 val; + return val; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_undefined_si256(void) { + __m256i val; + return val; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_set_pd(double __a, double __b, double __c, double __d) { + __m256d ret; + ret.v0 = _mm_set_pd(__c, __d); + ret.v1 = _mm_set_pd(__a, __b); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_set_ps(float __a, + float __b, + float __c, + float __d, + float __e, + float __f, + float __g, + float __h) { + __m256 ret; + ret.v0 = _mm_set_ps(__e, __f, __g, __h); + ret.v1 = _mm_set_ps(__a, __b, __c, __d); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_set_epi32(int __i0, + int __i1, + int __i2, + int __i3, + int __i4, + int __i5, + int __i6, + int __i7) { + __m256i ret; + ret.v0 = _mm_set_epi32(__i4, __i5, __i6, __i7); + ret.v1 = _mm_set_epi32(__i0, __i1, __i2, __i3); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_set_epi16(short __w15, + short __w14, + short __w13, + short __w12, + short __w11, + short __w10, + short __w09, + short __w08, + short __w07, + short __w06, + short __w05, + short __w04, + short __w03, + short __w02, + short __w01, + short __w00) { + __m256i ret; + ret.v0 = + _mm_set_epi16(__w07, __w06, __w05, __w04, __w03, __w02, __w01, __w00); + ret.v1 = + _mm_set_epi16(__w15, __w14, __w13, __w12, __w11, __w10, __w09, __w08); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_set_epi8(char __b31, + char __b30, + char __b29, + char __b28, + char __b27, + char __b26, + char __b25, + char __b24, + char __b23, + char __b22, + char __b21, + char __b20, + char __b19, + char __b18, + char __b17, + char __b16, + char __b15, + char __b14, + char __b13, + char __b12, + char __b11, + char __b10, + char __b09, + char __b08, + char __b07, + char __b06, + char __b05, + char __b04, + char __b03, + char __b02, + char __b01, + char __b00) { + __m256i ret; + ret.v0 = _mm_set_epi8(__b15, + __b14, + __b13, + __b12, + __b11, + __b10, + __b09, + __b08, + __b07, + __b06, + __b05, + __b04, + __b03, + __b02, + __b01, + __b00); + ret.v1 = _mm_set_epi8(__b31, + __b30, + __b29, + __b28, + __b27, + __b26, + __b25, + __b24, + __b23, + __b22, + __b21, + __b20, + __b19, + __b18, + __b17, + __b16); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_set_epi64x(long long __a, long long __b, long long __c, long long __d) { + __m256i ret; + ret.v0 = _mm_set_epi64x(__c, __d); + ret.v1 = _mm_set_epi64x(__a, __b); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_setr_pd(double __a, double __b, double __c, double __d) { + return _mm256_set_pd(__d, __c, __b, __a); +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_setr_ps(float __a, + float __b, + float __c, + float __d, + float __e, + float __f, + float __g, + float __h) { + return _mm256_set_ps(__h, __g, __f, __e, __d, __c, __b, __a); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_setr_epi32(int __i0, + int __i1, + int __i2, + int __i3, + int __i4, + int __i5, + int __i6, + int __i7) { + return _mm256_set_epi32(__i7, __i6, __i5, __i4, __i3, __i2, __i1, __i0); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_setr_epi16(short __w15, + short __w14, + short __w13, + short __w12, + short __w11, + short __w10, + short __w09, + short __w08, + short __w07, + short __w06, + short __w05, + short __w04, + short __w03, + short __w02, + short __w01, + short __w00) { + return _mm256_set_epi16(__w00, + __w01, + __w02, + __w03, + __w04, + __w05, + __w06, + __w07, + __w08, + __w09, + __w10, + __w11, + __w12, + __w13, + __w14, + __w15); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_setr_epi8(char __b31, + char __b30, + char __b29, + char __b28, + char __b27, + char __b26, + char __b25, + char __b24, + char __b23, + char __b22, + char __b21, + char __b20, + char __b19, + char __b18, + char __b17, + char __b16, + char __b15, + char __b14, + char __b13, + char __b12, + char __b11, + char __b10, + char __b09, + char __b08, + char __b07, + char __b06, + char __b05, + char __b04, + char __b03, + char __b02, + char __b01, + char __b00) { + return _mm256_set_epi8(__b00, + __b01, + __b02, + __b03, + __b04, + __b05, + __b06, + __b07, + __b08, + __b09, + __b10, + __b11, + __b12, + __b13, + __b14, + __b15, + __b16, + __b17, + __b18, + __b19, + __b20, + __b21, + __b22, + __b23, + __b24, + __b25, + __b26, + __b27, + __b28, + __b29, + __b30, + __b31); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_setr_epi64x(long long __a, long long __b, long long __c, long long __d) { + return _mm256_set_epi64x(__d, __c, __b, __a); +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_set1_pd(double __w) { + __m256d ret; + ret.v1 = ret.v0 = (__m128d)wasm_f64x2_splat(__w); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_set1_ps(float __w) { + __m256 ret; + ret.v1 = ret.v0 = (__m128)wasm_f32x4_splat(__w); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_set1_epi32(int __i) { + __m256i ret; + ret.v1 = ret.v0 = wasm_i32x4_splat(__i); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_set1_epi16(short __w) { + __m256i ret; + ret.v1 = ret.v0 = wasm_i16x8_splat(__w); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_set1_epi8(char __b) { + __m256i ret; + ret.v1 = ret.v0 = wasm_i8x16_splat(__b); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_set1_epi64x(long long __q) { + __m256i ret; + ret.v1 = ret.v0 = wasm_i64x2_splat(__q); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_setzero_pd(void) { + __m256d ret; + ret.v1 = ret.v0 = _mm_setzero_pd(); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_setzero_ps(void) { + __m256 ret; + ret.v1 = ret.v0 = _mm_setzero_ps(); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_setzero_si256(void) { + __m256i ret; + ret.v1 = ret.v0 = _mm_setzero_si128(); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_castpd_ps(__m256d __a) { + union __m256_data ret; + ret.double_view = __a; + return ret.float_view; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_castpd_si256(__m256d __a) { + union __m256_data ret; + ret.double_view = __a; + return ret.int_view; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_castps_pd(__m256 __a) { + union __m256_data ret; + ret.float_view = __a; + return ret.double_view; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_castps_si256(__m256 __a) { + union __m256_data ret; + ret.float_view = __a; + return ret.int_view; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_castsi256_ps(__m256i __a) { + union __m256_data ret; + ret.int_view = __a; + return ret.float_view; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_castsi256_pd(__m256i __a) { + union __m256_data ret; + ret.int_view = __a; + return ret.double_view; +} + +static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) +_mm256_castpd256_pd128(__m256d __a) { + return __a.v0; +} + +static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) +_mm256_castps256_ps128(__m256 __a) { + return __a.v0; +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm256_castsi256_si128(__m256i __a) { + return __a.v0; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_castpd128_pd256(__m128d __a) { + __m256d ret; + ret.v0 = __a; + ret.v1 = _mm_setzero_pd(); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_castps128_ps256(__m128 __a) { + __m256 ret; + ret.v0 = __a; + ret.v1 = _mm_setzero_ps(); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_castsi128_si256(__m128i __a) { + __m256i ret; + ret.v0 = __a; + ret.v1 = _mm_setzero_si128(); + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_zextpd128_pd256(__m128d __a) { + __m256d ret; + ret.v0 = __a; + ret.v1 = _mm_setzero_pd(); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_zextps128_ps256(__m128 __a) { + __m256 ret; + ret.v0 = __a; + ret.v1 = _mm_setzero_ps(); + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_zextsi128_si256(__m128i __a) { + __m256i ret; + ret.v0 = __a; + ret.v1 = _mm_setzero_si128(); + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_insertf128_ps(__m256 __a, __m128 __b, const int imm8) { + __m256 ret = __a; + if (imm8 & 0x1) { + ret.v1 = __b; + } else { + ret.v0 = __b; + } + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_insertf128_pd(__m256d __a, __m128d __b, const int imm8) { + __m256d ret = __a; + if (imm8 & 0x1) { + ret.v1 = __b; + } else { + ret.v0 = __b; + } + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_insertf128_si256(__m256i __a, __m128i __b, const int imm8) { + __m256i ret = __a; + if (imm8 & 0x1) { + ret.v1 = __b; + } else { + ret.v0 = __b; + } + return ret; +} + +static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) +_mm256_extractf128_ps(__m256 __a, const int imm8) { + if (imm8 & 0x1) { + return __a.v1; + } else { + return __a.v0; + } +} + +static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) +_mm256_extractf128_pd(__m256d __a, const int imm8) { + if (imm8 & 0x1) { + return __a.v1; + } else { + return __a.v0; + } +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm256_extractf128_si256(__m256i __a, const int imm8) { + if (imm8 & 0x1) { + return __a.v1; + } else { + return __a.v0; + } +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_set_m128(__m128 __hi, __m128 __lo) { + __m256 ret; + ret.v0 = __lo; + ret.v1 = __hi; + return ret; +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_set_m128d(__m128d __hi, __m128d __lo) { + __m256d ret; + ret.v0 = __lo; + ret.v1 = __hi; + return ret; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_set_m128i(__m128i __hi, __m128i __lo) { + __m256i ret; + ret.v0 = __lo; + ret.v1 = __hi; + return ret; +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_setr_m128(__m128 __lo, __m128 __hi) { + return _mm256_set_m128(__hi, __lo); +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_setr_m128d(__m128d __lo, __m128d __hi) { + return (__m256d)_mm256_set_m128d(__hi, __lo); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_setr_m128i(__m128i __lo, __m128i __hi) { + return (__m256i)_mm256_set_m128i(__hi, __lo); +} + +static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_loadu2_m128(float const* __addr_hi, float const* __addr_lo) { + return _mm256_set_m128(_mm_loadu_ps(__addr_hi), _mm_loadu_ps(__addr_lo)); +} + +static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) +_mm256_loadu2_m128d(double const* __addr_hi, double const* __addr_lo) { + return _mm256_set_m128d(_mm_loadu_pd(__addr_hi), _mm_loadu_pd(__addr_lo)); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_loadu2_m128i(__m128i_u const* __addr_hi, __m128i_u const* __addr_lo) { + return _mm256_set_m128i(_mm_loadu_si128((__m128i const*)__addr_hi), + _mm_loadu_si128((__m128i const*)__addr_lo)); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_storeu2_m128(float* __addr_hi, float* __addr_lo, __m256 __a) { + _mm_storeu_ps(__addr_lo, __a.v0); + _mm_storeu_ps(__addr_hi, __a.v1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_storeu2_m128d(double* __addr_hi, double* __addr_lo, __m256d __a) { + _mm_storeu_pd(__addr_lo, __a.v0); + _mm_storeu_pd(__addr_hi, __a.v1); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_mm256_storeu2_m128i(__m128i_u* __addr_hi, __m128i_u* __addr_lo, __m256i __a) { + _mm_storeu_si128((__m128i*)__addr_lo, __a.v0); + _mm_storeu_si128((__m128i*)__addr_hi, __a.v1); +} + +#endif /* __emscripten_avxintrin_h__ */ diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..b65beaf --- /dev/null +++ b/demo/index.html @@ -0,0 +1,29 @@ + + + + + + Untitled + + + + + + + + + + + + diff --git a/ecgsyn.cpp b/ecgsyn.cpp new file mode 100644 index 0000000..6a2074b --- /dev/null +++ b/ecgsyn.cpp @@ -0,0 +1,9 @@ +#include + +extern "C" { + +int ecgsyn() { + std::printf("hello world\n"); + return 69; +} +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..11b9cbf --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,29 @@ +// @ts-check +import eslint from "@eslint/js"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + { + ignores: ["dist/**"], + }, + eslint.configs.recommended, + ...tseslint.configs.strict, + ...tseslint.configs.stylistic, + { + files: ["**/*.js"], + }, + { + files: ["**/*.ts"], + rules: { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + varsIgnorePattern: "^_", + argsIgnorePattern: "^_", + }, + ], + "@typescript-eslint/ban-ts-comment": "off", + }, + }, +); diff --git a/index.html b/index.html new file mode 100644 index 0000000..245553b --- /dev/null +++ b/index.html @@ -0,0 +1,22 @@ + + + + + + Untitled + + + + + + + + + + diff --git a/mini-odeint/CMakeLists.txt b/mini-odeint/CMakeLists.txt index 59817e6..920a42d 100644 --- a/mini-odeint/CMakeLists.txt +++ b/mini-odeint/CMakeLists.txt @@ -3,26 +3,33 @@ cmake_minimum_required(VERSION 3.20) project(mini-odeint) option(FORCE_FETCH_CATCH2 "Force fetching Catch2" OFF) +option(MINI_ODEINT_BUILD_TESTS "Build tests" OFF) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) -find_package(Catch2 3 QUIET) +if(MINI_ODEINT_BUILD_TESTS) + find_package(Catch2 3 QUIET) -if(NOT TARGET Catch2::Catch2WithMain OR FORCE_FETCH_CATCH2) - include(FetchContent) - FetchContent_Declare( - Catch2 - GIT_REPOSITORY https://github.com/catchorg/Catch2.git - GIT_TAG v3.4.0) - FetchContent_MakeAvailable(Catch2) - list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras) + if(NOT TARGET Catch2::Catch2WithMain OR FORCE_FETCH_CATCH2) + include(FetchContent) + FetchContent_Declare( + Catch2 + GIT_REPOSITORY https://github.com/catchorg/Catch2.git + GIT_TAG v3.4.0) + FetchContent_MakeAvailable(Catch2) + list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras) + endif() + + include(CTest) + include(Catch) + + add_executable(tests mini-odeint-tests.cpp include/mini-odeint.hpp) + target_include_directories(tests PRIVATE include) + target_link_libraries(tests PRIVATE Catch2::Catch2WithMain) + + catch_discover_tests(tests) endif() -include(CTest) -include(Catch) - -add_executable(tests mini-odeint-tests.cpp mini-odeint.hpp) -target_link_libraries(tests PRIVATE Catch2::Catch2WithMain) - -catch_discover_tests(tests) +add_library(mini-odeint INTERFACE include/mini-odeint.hpp) +target_include_directories(mini-odeint INTERFACE include) diff --git a/mini-odeint/mini-odeint.hpp b/mini-odeint/include/mini-odeint.hpp similarity index 100% rename from mini-odeint/mini-odeint.hpp rename to mini-odeint/include/mini-odeint.hpp diff --git a/package.json b/package.json new file mode 100644 index 0000000..635a2b9 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "type": "module", + "name": "ecgsyn.js", + "description": "ECGSyn demo", + "version": "1.0.0", + "author": "John Luebs ", + "license": "MIT", + "module": "dist/ecgsyn.js", + "exports": { + ".": "./dist/ecgsyn.js", + "./ecgsyn.wasm": "./dist/ecgsyn.wasm" + }, + "scripts": { + "build": "cmake --build build && tsc && cp -f build/ecgsyn.wasm ./dist", + "typecheck": "tsc --noEmit", + "lint": "eslint .", + "format": "prettier --write \"*.{js,ts,json,css,yml,yaml}\" \"**/*.{js,ts,json,css,yml.yaml}\"", + "serve": "http-server -c-1", + "test": "vitest" + }, + "devDependencies": { + "@eslint/js": "^9.14.0", + "http-server": "^14.1.1", + "prettier": "^3.3.3", + "typescript": "^5.6.3", + "typescript-eslint": "^8.13.0" + }, + "packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee" +} diff --git a/pffft/cmake/compiler_warnings.cmake b/pffft/cmake/compiler_warnings.cmake index 32c1782..c630174 100644 --- a/pffft/cmake/compiler_warnings.cmake +++ b/pffft/cmake/compiler_warnings.cmake @@ -1,11 +1,11 @@ function(target_activate_cxx_compiler_warnings target) target_compile_options(${target} PRIVATE $<$:-Wall -Wextra -pedantic>) - target_compile_options(${target} PRIVATE $<$:-Wall -Wextra -pedantic>) + target_compile_options(${target} PRIVATE $<$:-Wall -Wextra -pedantic -Wno-keyword-macro>) endfunction() function(target_activate_c_compiler_warnings target) target_compile_options(${target} PRIVATE $<$:-Wall -Wextra -pedantic>) - target_compile_options(${target} PRIVATE $<$:-Wall -Wextra -pedantic>) + target_compile_options(${target} PRIVATE $<$:-Wall -Wextra -pedantic -Wno-keyword-macro>) endfunction() diff --git a/pffft/pffft.h b/pffft/pffft.h index 7ad925c..0fe0049 100644 --- a/pffft/pffft.h +++ b/pffft/pffft.h @@ -194,10 +194,10 @@ extern "C" { void pffft_zconvolve_no_accu(PFFFT_Setup *setup, const float *dft_a, const float *dft_b, float *dft_ab, float scaling); /* return 4 or 1 wether support SSE/NEON/Altivec instructions was enabled when building pffft.c */ - int pffft_simd_size(); + int pffft_simd_size(void); /* return string identifier of used architecture (SSE/NEON/Altivec/..) */ - const char * pffft_simd_arch(); + const char * pffft_simd_arch(void); /* following functions are identical to the pffftd_ functions */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..374c067 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1329 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@eslint/js': + specifier: ^9.14.0 + version: 9.14.0 + http-server: + specifier: ^14.1.1 + version: 14.1.1 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + typescript: + specifier: ^5.6.3 + version: 5.6.3 + typescript-eslint: + specifier: ^8.13.0 + version: 8.13.0(eslint@9.14.0)(typescript@5.6.3) + +packages: + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.14.0': + resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.2': + resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@typescript-eslint/eslint-plugin@8.13.0': + resolution: {integrity: sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.13.0': + resolution: {integrity: sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.13.0': + resolution: {integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.13.0': + resolution: {integrity: sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.13.0': + resolution: {integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.13.0': + resolution: {integrity: sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.13.0': + resolution: {integrity: sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/visitor-keys@8.13.0': + resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + corser@2.0.1: + resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} + engines: {node: '>= 0.4.0'} + + cross-spawn@7.0.5: + resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} + engines: {node: '>= 8'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.14.0: + resolution: {integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http-server@14.1.1: + resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} + engines: {node: '>=12'} + hasBin: true + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + portfinder@1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + secure-compare@3.0.1: + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@1.4.0: + resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.13.0: + resolution: {integrity: sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + union@0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@eslint-community/eslint-utils@4.4.1(eslint@9.14.0)': + dependencies: + eslint: 9.14.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.18.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.7.0': {} + + '@eslint/eslintrc@3.1.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.7 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.14.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.2.2': + dependencies: + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@types/estree@1.0.6': {} + + '@types/json-schema@7.0.15': {} + + '@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0)(typescript@5.6.3))(eslint@9.14.0)(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.13.0 + eslint: 9.14.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.13.0(eslint@9.14.0)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.13.0 + debug: 4.3.7 + eslint: 9.14.0 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.13.0': + dependencies: + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/visitor-keys': 8.13.0 + + '@typescript-eslint/type-utils@8.13.0(eslint@9.14.0)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + debug: 4.3.7 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - eslint + - supports-color + + '@typescript-eslint/types@8.13.0': {} + + '@typescript-eslint/typescript-estree@8.13.0(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/visitor-keys': 8.13.0 + debug: 4.3.7 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.13.0(eslint@9.14.0)(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0) + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) + eslint: 9.14.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@8.13.0': + dependencies: + '@typescript-eslint/types': 8.13.0 + eslint-visitor-keys: 3.4.3 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + async@2.6.4: + dependencies: + lodash: 4.17.21 + + balanced-match@1.0.2: {} + + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + corser@2.0.1: {} + + cross-spawn@7.0.5: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.14.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.7.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.14.0 + '@eslint/plugin-kit': 0.2.2 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.5 + debug: 4.3.7 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + eventemitter3@4.0.7: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + + follow-redirects@1.15.9: {} + + function-bind@1.1.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@14.0.0: {} + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + html-encoding-sniffer@3.0.0: + dependencies: + whatwg-encoding: 2.0.0 + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http-server@14.1.1: + dependencies: + basic-auth: 2.0.1 + chalk: 4.1.2 + corser: 2.0.1 + he: 1.2.0 + html-encoding-sniffer: 3.0.0 + http-proxy: 1.18.1 + mime: 1.6.0 + minimist: 1.2.8 + opener: 1.5.2 + portfinder: 1.0.32 + secure-compare: 3.0.1 + union: 0.5.0 + url-join: 4.0.1 + transitivePeerDependencies: + - debug + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isexe@2.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime@1.6.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + ms@2.1.3: {} + + natural-compare@1.4.0: {} + + object-inspect@1.13.3: {} + + opener@1.5.2: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + picomatch@2.3.1: {} + + portfinder@1.0.32: + dependencies: + async: 2.6.4 + debug: 3.2.7 + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + + prelude-ls@1.2.1: {} + + prettier@3.3.3: {} + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + queue-microtask@1.2.3: {} + + requires-port@1.0.0: {} + + resolve-from@4.0.0: {} + + reusify@1.0.4: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safer-buffer@2.1.2: {} + + secure-compare@3.0.1: {} + + semver@7.6.3: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.3 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + text-table@0.2.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@1.4.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.13.0(eslint@9.14.0)(typescript@5.6.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0)(typescript@5.6.3))(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - eslint + - supports-color + + typescript@5.6.3: {} + + union@0.5.0: + dependencies: + qs: 6.13.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-join@4.0.1: {} + + whatwg-encoding@2.0.0: + dependencies: + iconv-lite: 0.6.3 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yocto-queue@0.1.0: {} diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..c48e454 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,19 @@ +// @ts-check +/** @type {import("prettier").Config} */ +export default { + semi: true, + trailingComma: "all", + singleQuote: false, + printWidth: 120, + endOfLine: "auto", + tabWidth: 4, + useTabs: false, + overrides: [ + { + files: "*.json", + options: { + parser: "json", + }, + }, + ], +}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..f88bb05 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,116 @@ +export interface Exports extends WebAssembly.Exports { + memory: WebAssembly.Memory; + _initialize(): void; + + ecgsyn(): number; +} + +let exports: Exports; + +class WASI { + private instance?: WebAssembly.Instance; + + private ESUCCESS = 0; + private ENOSYS = 52; + + private nameSpaces: Record> = { + wasi_snapshot_preview1: { + fd_write: this.fd_write, + }, + }; + + constructor() { + for (const ns of Object.keys(this.nameSpaces)) { + const nameSpace = this.nameSpaces[ns]; + + for (const fn of Object.keys(nameSpace)) { + let func = nameSpace[fn] || this.nosys(fn); + func = func.bind(this); + nameSpace[fn] = func; + } + } + } + + initialize(instance: WebAssembly.Instance): void { + this.instance = instance; + (instance.exports._initialize as CallableFunction)(); + } + + get imports(): WebAssembly.Imports { + return this.nameSpaces as WebAssembly.Imports; + } + + private get memory(): WebAssembly.Memory { + if (!this.instance) { + throw new Error("Instance not initialized"); + } + return this.instance.exports.memory as WebAssembly.Memory; + } + + private getDataview(): DataView { + if (!this.instance) { + throw new Error("Instance not initialized"); + } + return new DataView((this.instance.exports.memory as WebAssembly.Memory).buffer); + } + + private nosys(name: string): CallableFunction { + return (...args: number[]): number => { + console.error(`Unimplemented call to ${name}(${args.toString()})`); + return this.ENOSYS; + }; + } + + private fd_write(fd: number, iovs: number, iovsLen: number, nwritten: number): number { + const view = this.getDataview(); + const memory = this.memory; + + const buffers: Uint8Array[] = []; + let totalLen = 0; + + for (let i = 0; i < iovsLen; i++) { + const iov = iovs + i * 8; + const data = view.getUint32(iov, true); + const len = view.getUint32(iov + 4, true); + + if (len === 0) continue; + + buffers.push(new Uint8Array(memory.buffer, data, len)); + totalLen += len; + } + if (!totalLen) { + view.setUint32(nwritten, 0, true); + return this.ESUCCESS; + } + let buffer = new Uint8Array(totalLen); + let offset = 0; + for (const b of buffers) { + buffer.set(b, offset); + offset += b.length; + } + if (buffer.length > 0 && buffer[buffer.length - 1] === 10) { + buffer = buffer.subarray(0, buffer.length - 1); + } + + const string = new TextDecoder("utf-8").decode(buffer); + + if (fd === 1) console.log(string); + else console.error(string); + + view.setUint32(nwritten, totalLen, true); + + return this.ESUCCESS; + } +} + +export default async function load(): Promise { + if (!exports) { + const url = new URL("./ecgsyn.wasm", import.meta.url); + const wasi = new WASI(); + + const { instance } = await WebAssembly.instantiateStreaming(fetch(url.href), wasi.imports); + exports = instance.exports as Exports; + wasi.initialize(instance); + } + return exports; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e428d7e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "./dist", + "strict": true, + "sourceMap": true, + "declaration": true, + "declarationDir": "./dist/types/", + "noImplicitAny": true, + "esModuleInterop": true, + "downlevelIteration": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "isolatedModules": true, + "isolatedDeclarations": true + }, + "include": ["src"], + "exclude": ["src/**/*.test.ts"] +}