/* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Copyright:
* 2021 Evan Nemerson <evan@nemerson.com>
*/
#if !
defined (SIMDE_WASM_SIMD128_H)
#define SIMDE_WASM_SIMD128_H
#include "../simde-common.h"
HEDLEY_DIAGNOSTIC_PUSH
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
SIMDE_BEGIN_DECLS_
typedef union {
#if defined (SIMDE_VECTOR_SUBSCRIPT)
SIMDE_ALIGN_TO_16 int8_t i8 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 int16_t i16 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 int32_t i32 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 int64_t i64 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 uint8_t u8 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 uint16_t u16 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 uint32_t u32 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 uint64_t u64 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
#if defined (SIMDE_HAVE_INT128_)
SIMDE_ALIGN_TO_16 simde_int128 i128 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 simde_uint128 u128 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
#endif
SIMDE_ALIGN_TO_16 simde_float32 f32 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 simde_float64 f64 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 int_fast32_t i32f SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
SIMDE_ALIGN_TO_16 uint_fast32_t u32f SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
#else
SIMDE_ALIGN_TO_16 int8_t i8[16];
SIMDE_ALIGN_TO_16 int16_t i16[8];
SIMDE_ALIGN_TO_16 int32_t i32[4];
SIMDE_ALIGN_TO_16 int64_t i64[2];
SIMDE_ALIGN_TO_16 uint8_t u8[16];
SIMDE_ALIGN_TO_16 uint16_t u16[8];
SIMDE_ALIGN_TO_16 uint32_t u32[4];
SIMDE_ALIGN_TO_16 uint64_t u64[2];
#if defined (SIMDE_HAVE_INT128_)
SIMDE_ALIGN_TO_16 simde_int128 i128[1];
SIMDE_ALIGN_TO_16 simde_uint128 u128[1];
#endif
SIMDE_ALIGN_TO_16 simde_float32 f32[4];
SIMDE_ALIGN_TO_16 simde_float64 f64[2];
SIMDE_ALIGN_TO_16 int_fast32_t i32f[16 /
sizeof (int_fast32_t)];
SIMDE_ALIGN_TO_16 uint_fast32_t u32f[16 /
sizeof (uint_fast32_t)];
#endif
#if defined (SIMDE_X86_SSE_NATIVE)
SIMDE_ALIGN_TO_16 __m128 sse_m128;
#if defined (SIMDE_X86_SSE2_NATIVE)
SIMDE_ALIGN_TO_16 __m128i sse_m128i;
SIMDE_ALIGN_TO_16 __m128d sse_m128d;
#endif
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
SIMDE_ALIGN_TO_16 int8x16_t neon_i8;
SIMDE_ALIGN_TO_16 int16x8_t neon_i16;
SIMDE_ALIGN_TO_16 int32x4_t neon_i32;
SIMDE_ALIGN_TO_16 int64x2_t neon_i64;
SIMDE_ALIGN_TO_16 uint8x16_t neon_u8;
SIMDE_ALIGN_TO_16 uint16x8_t neon_u16;
SIMDE_ALIGN_TO_16 uint32x4_t neon_u32;
SIMDE_ALIGN_TO_16 uint64x2_t neon_u64;
SIMDE_ALIGN_TO_16 float32x4_t neon_f32;
#if defined (SIMDE_ARM_NEON_A64V8_NATIVE)
SIMDE_ALIGN_TO_16 float64x2_t neon_f64;
#endif
#elif defined (SIMDE_WASM_SIMD128_NATIVE)
SIMDE_ALIGN_TO_16 v128_t wasm_v128;
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE) ||
defined (SIMDE_ZARCH_ZVECTOR_13_NATI
VE)
SIMDE_ALIGN_TO_16 SIMDE_POWER_ALTIVEC_VECTOR(unsigned char ) altivec_u8;
SIMDE_ALIGN_TO_16 SIMDE_POWER_ALTIVEC_VECTOR(unsigned short ) altivec_u16;
SIMDE_ALIGN_TO_16 SIMDE_POWER_ALTIVEC_VECTOR(unsigned int ) altivec_u32;
SIMDE_ALIGN_TO_16 SIMDE_POWER_ALTIVEC_VECTOR(signed char ) altivec_i8;
SIMDE_ALIGN_TO_16 SIMDE_POWER_ALTIVEC_VECTOR(signed short ) altivec_i16;
SIMDE_ALIGN_TO_16 SIMDE_POWER_ALTIVEC_VECTOR(signed int ) altivec_i32;
SIMDE_ALIGN_TO_16 SIMDE_POWER_ALTIVEC_VECTOR(float ) altivec_f32;
#if defined (SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined (SIMDE_ZARCH_ZVECTOR_13_NATIVE)
SIMDE_ALIGN_TO_16 SIMDE_POWER_ALTIVEC_VECTOR(unsigned long long ) altivec_u64;
SIMDE_ALIGN_TO_16 SIMDE_POWER_ALTIVEC_VECTOR(signed long long ) altivec_i64;
SIMDE_ALIGN_TO_16 SIMDE_POWER_ALTIVEC_VECTOR(double ) altivec_f64;
#endif
#endif
} simde_v128_private;
#if defined (SIMDE_WASM_SIMD128_NATIVE)
typedef v128_t simde_v128_t;
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
typedef int32x4_t simde_v128_t;
#elif defined (SIMDE_X86_SSE2_NATIVE)
typedef __m128i simde_v128_t;
#elif defined (SIMDE_X86_SSE_NATIVE)
typedef __m128 simde_v128_t;
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined (SIMDE_ZARCH_ZVECTOR_13_NATIVE)
typedef SIMDE_POWER_ALTIVEC_VECTOR(signed int ) simde_v128_t;
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
typedef int32_t simde_v128_t SIMDE_ALIGN_TO_16 SIMDE_VECTOR(16) SIMDE_MAY_ALIAS;
#else
typedef simde_v128_private simde_v128_t;
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
typedef simde_v128_t v128_t;
#endif
HEDLEY_STATIC_ASSERT(16 == sizeof (simde_v128_t), "simde_v128_t size incorrect" );
HEDLEY_STATIC_ASSERT(16 == sizeof (simde_v128_private), "simde_v128_private size incorrect" );
#if defined (SIMDE_CHECK_ALIGNMENT) && defined (SIMDE_ALIGN_OF)
HEDLEY_STATIC_ASSERT(SIMDE_ALIGN_OF(simde_v128_t) == 16, "simde_v128_t is not 16-byte aligned" );
HEDLEY_STATIC_ASSERT(SIMDE_ALIGN_OF(simde_v128_private) == 16, "simde_v128_private is not 16-byte aligned" );
#endif
#define SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(Other_Type, SIMDe_Type, To_Name, From_Name) \
SIMDE_FUNCTION_ATTRIBUTES \
Other_Type To_Name(SIMDe_Type v) { \
Other_Type r; \
simde_memcpy(&r, &v, sizeof (r)); \
return r; \
} \
\
SIMDE_FUNCTION_ATTRIBUTES \
SIMDe_Type From_Name(Other_Type v) { \
SIMDe_Type r; \
simde_memcpy(&r, &v, sizeof (r)); \
return r; \
}
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(simde_v128_private, simde_v128_t, simde_v128_to_private, simde_v128_from_private)
#define SIMDE_WASM_SIMD128_FMIN(x, y) \
(simde_math_isnan(x) ? SIMDE_MATH_NAN \
: simde_math_isnan(y) ? SIMDE_MATH_NAN \
: (((x) == 0) && ((y) == 0)) ? (simde_math_signbit(x) ? (x) : (y)) \
: ((x) < (y) ? (x) : (y)))
#define SIMDE_WASM_SIMD128_FMAX(x, y) \
(simde_math_isnan(x) ? SIMDE_MATH_NAN \
: simde_math_isnan(y) ? SIMDE_MATH_NAN \
: (((x) == 0) && ((y) == 0)) ? (simde_math_signbit(x) ? (y) : (x)) \
: ((x) > (y) ? (x) : (y)))
#if defined (SIMDE_X86_SSE2_NATIVE)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(__m128 , simde_v128_t, simde_v128_to_m128 , simde_v128_from_m128 )
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(__m128i, simde_v128_t, simde_v128_to_m128i, simde_v128_from_m128i)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(__m128d, simde_v128_t, simde_v128_to_m128d, simde_v128_from_m128d)
#endif
#if defined (SIMDE_ARM_NEON_A32V7_NATIVE)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS( int8x16_t, simde_v128_t, simde_v128_to_neon_i8 , simde_v128_from_neon_i8 )
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS( int16x8_t, simde_v128_t, simde_v128_to_neon_i16, simde_v128_from_neon_i16)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS( int32x4_t, simde_v128_t, simde_v128_to_neon_i32, simde_v128_from_neon_i32)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS( int64x2_t, simde_v128_t, simde_v128_to_neon_i64, simde_v128_from_neon_i64)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS( uint8x16_t, simde_v128_t, simde_v128_to_neon_u8 , simde_v128_from_neon_u8 )
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS( uint16x8_t, simde_v128_t, simde_v128_to_neon_u16, simde_v128_from_neon_u16)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS( uint32x4_t, simde_v128_t, simde_v128_to_neon_u32, simde_v128_from_neon_u32)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS( uint64x2_t, simde_v128_t, simde_v128_to_neon_u64, simde_v128_from_neon_u64)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(float32x4_t, simde_v128_t, simde_v128_to_neon_f32, simde_v128_from_neon_f32)
#if defined (SIMDE_ARM_NEON_A64V8_NATIVE)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(float64x2_t, simde_v128_t, simde_v128_to_neon_f64, simde_v128_from_neon_f64)
#endif
#endif /* defined(SIMDE_ARM_NEON_A32V7_NATIVE) */
#if defined (SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined (SIMDE_ZARCH_ZVECTOR_13_NATIVE)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(SIMDE_POWER_ALTIVEC_VECTOR( signed char ), simde_v128_t, simde_v128_to_altivec_i8 , simde_v128_from_altivec_i8 )
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(SIMDE_POWER_ALTIVEC_VECTOR( signed short ), simde_v128_t, simde_v128_to_altivec_i16, simde_v128_from_altivec_i16)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(SIMDE_POWER_ALTIVEC_VECTOR( signed int ), simde_v128_t, simde_v128_to_altivec_i32, simde_v128_from_altivec_i32)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(SIMDE_POWER_ALTIVEC_VECTOR(unsigned char ), simde_v128_t, simde_v128_to_altivec_u8 , simde_v128_from_altivec_u8 )
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(SIMDE_POWER_ALTIVEC_VECTOR(unsigned short ), simde_v128_t, simde_v128_to_altivec_u16, simde_v128_from_altivec_u16)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(SIMDE_POWER_ALTIVEC_VECTOR(unsigned int ), simde_v128_t, simde_v128_to_altivec_u32, simde_v128_from_altivec_u32)
#if defined (SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined (SIMDE_ZARCH_ZVECTOR_13_NATIVE)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(SIMDE_POWER_ALTIVEC_VECTOR( signed long long ), simde_v128_t, simde_v128_to_altivec_i64, simde_v128_from_altivec_i64)
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(SIMDE_POWER_ALTIVEC_VECTOR(unsigned long long ), simde_v128_t, simde_v128_to_altivec_u64, simde_v128_from_altivec_u64)
#endif
#if defined (SIMDE_BUG_GCC_95782)
SIMDE_FUNCTION_ATTRIBUTES
SIMDE_POWER_ALTIVEC_VECTOR(float )
simde_v128_to_altivec_f32(simde_v128_t value) {
simde_v128_private r_ = simde_v128_to_private(value);
return r_.altivec_f32;
}
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_v128_from_altivec_f32(SIMDE_POWER_ALTIVEC_VECTOR(float ) value) {
simde_v128_private r_;
r_.altivec_f32 = value;
return simde_v128_from_private(r_);
}
#else
SIMDE_WASM_SIMD128_GENERATE_CONVERSION_FUNCTIONS(SIMDE_POWER_ALTIVEC_VECTOR(float ), simde_v128_t, simde_v128_to_altivec_f32, simde_v128_from_altivec_f32)
#endif
#endif /* defined(SIMDE_POWER_ALTIVEC_P6_NATIVE) */
/*
* Begin function implementations
*/
/* load */
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_v128_load (const void * mem) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_v128_load(mem);
#elif defined (SIMDE_X86_SSE2_NATIVE)
return _mm_loadu_si128(HEDLEY_REINTERPRET_CAST(const __m128i*, mem));
#else
simde_v128_t r;
simde_memcpy(&r, mem, sizeof (r));
return r;
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_v128_load(mem) simde_wasm_v128_load((mem))
#endif
/* store */
SIMDE_FUNCTION_ATTRIBUTES
void
simde_wasm_v128_store (void * mem, simde_v128_t a) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
wasm_v128_store(mem, a);
#elif defined (SIMDE_X86_SSE2_NATIVE)
_mm_storeu_si128(HEDLEY_REINTERPRET_CAST(__m128i*, mem), a);
#else
simde_memcpy(mem, &a, sizeof (a));
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_v128_store(mem, a) simde_wasm_v128_store((mem), (a))
#endif
/* make */
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i8x16_make (
int8_t c0, int8_t c1, int8_t c2, int8_t c3, int8_t c4, int8_t c5, int8_t c6, int8_t c7,
int8_t c8, int8_t c9, int8_t c10, int8_t c11, int8_t c12, int8_t c13, int8_t c14, int8_t c15) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return
wasm_i8x16_make(
c0, c1, c2, c3, c4, c5, c6, c7,
c8, c9, c10, c11, c12, c13, c14, c15);
#elif defined (SIMDE_X86_SSE2_NATIVE)
return
_mm_setr_epi8(
c0, c1, c2, c3, c4, c5, c6, c7,
c8, c9, c10, c11, c12, c13, c14, c15);
#else
simde_v128_private r_;
r_.i8[ 0] = c0;
r_.i8[ 1] = c1;
r_.i8[ 2] = c2;
r_.i8[ 3] = c3;
r_.i8[ 4] = c4;
r_.i8[ 5] = c5;
r_.i8[ 6] = c6;
r_.i8[ 7] = c7;
r_.i8[ 8] = c8;
r_.i8[ 9] = c9;
r_.i8[10] = c10;
r_.i8[11] = c11;
r_.i8[12] = c12;
r_.i8[13] = c13;
r_.i8[14] = c14;
r_.i8[15] = c15;
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define \
wasm_i8x16_make( \
c0, c1, c2, c3, c4, c5, c6, c7, \
c8, c9, c10, c11, c12, c13, c14, c15) \
simde_wasm_i8x16_make( \
(c0), (c1), (c2), (c3), (c4), (c5), (c6), (c7), \
(c8), (c9), (c10), (c11), (c12), (c13), (c14), (c15))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i16x8_make (
int16_t c0, int16_t c1, int16_t c2, int16_t c3, int16_t c4, int16_t c5, int16_t c6, int16_t c7) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i16x8_make(c0, c1, c2, c3, c4, c5, c6, c7);
#elif defined (SIMDE_X86_SSE2_NATIVE)
return _mm_setr_epi16(c0, c1, c2, c3, c4, c5, c6, c7);
#else
simde_v128_private r_;
r_.i16[0] = c0;
r_.i16[1] = c1;
r_.i16[2] = c2;
r_.i16[3] = c3;
r_.i16[4] = c4;
r_.i16[5] = c5;
r_.i16[6] = c6;
r_.i16[7] = c7;
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define \
wasm_i16x8_make(c0, c1, c2, c3, c4, c5, c6, c7) \
simde_wasm_i16x8_make((c0), (c1), (c2), (c3), (c4), (c5), (c6), (c7))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i32x4_make (int32_t c0, int32_t c1, int32_t c2, int32_t c3) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i32x4_make(c0, c1, c2, c3);
#elif defined (SIMDE_X86_SSE2_NATIVE)
return _mm_setr_epi32(c0, c1, c2, c3);
#else
simde_v128_private r_;
r_.i32[0] = c0;
r_.i32[1] = c1;
r_.i32[2] = c2;
r_.i32[3] = c3;
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i32x4_make(c0, c1, c2, c3) simde_wasm_i32x4_make((c0), (c1), (c2), (c3))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i64x2_make (int64_t c0, int64_t c1) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i64x2_make(c0, c1);
#elif defined (SIMDE_X86_SSE2_NATIVE)
return _mm_set_epi64x(c1, c0);
#else
simde_v128_private r_;
r_.i64[ 0] = c0;
r_.i64[ 1] = c1;
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i64x2_make(c0, c1) simde_wasm_i64x2_make((c0), (c1))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f32x4_make (simde_float32 c0, simde_float32 c1, simde_float32 c2, simde_float32 c3) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_f32x4_make(c0, c1, c2, c3);
#else
simde_v128_private r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128 = _mm_setr_ps(c0, c1, c2, c3);
#else
r_.f32[0] = c0;
r_.f32[1] = c1;
r_.f32[2] = c2;
r_.f32[3] = c3;
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f32x4_make(c0, c1, c2, c3) simde_wasm_f32x4_make((c0), (c1), (c2), (c3))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f64x2_make (simde_float64 c0, simde_float64 c1) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_f64x2_make(c0, c1);
#else
simde_v128_private r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128d = _mm_set_pd(c1, c0);
#else
r_.f64[ 0] = c0;
r_.f64[ 1] = c1;
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f64x2_make(c0, c1) simde_wasm_f64x2_make((c0), (c1))
#endif
/* const */
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define \
simde_wasm_i8x16_const( \
c0, c1, c2, c3, c4, c5, c6, c7, \
c8, c9, c10, c11, c12, c13, c14, c15) \
wasm_i8x16_const( \
(c0), (c1), (c2), (c3), (c4), (c5), (c6), (c7), \
(c8), (c9), (c10), (c11), (c12), (c13), (c14), (c15))
#elif defined (SIMDE_STATEMENT_EXPR_) && defined (SIMDE_ASSERT_CONSTANT_) && defined (SIMDE_STATIC_ASSERT)
#define \
simde_wasm_i8x16_const( \
c0, c1, c2, c3, c4, c5, c6, c7, \
c8, c9, c10, c11, c12, c13, c14, c15) \
SIMDE_STATEMENT_EXPR_(({ \
SIMDE_ASSERT_CONSTANT_(c0); \
SIMDE_ASSERT_CONSTANT_(c1); \
SIMDE_ASSERT_CONSTANT_(c2); \
SIMDE_ASSERT_CONSTANT_(c3); \
SIMDE_ASSERT_CONSTANT_(c4); \
SIMDE_ASSERT_CONSTANT_(c5); \
SIMDE_ASSERT_CONSTANT_(c6); \
SIMDE_ASSERT_CONSTANT_(c7); \
SIMDE_ASSERT_CONSTANT_(c8); \
SIMDE_ASSERT_CONSTANT_(c9); \
SIMDE_ASSERT_CONSTANT_(c10); \
SIMDE_ASSERT_CONSTANT_(c11); \
SIMDE_ASSERT_CONSTANT_(c12); \
SIMDE_ASSERT_CONSTANT_(c13); \
SIMDE_ASSERT_CONSTANT_(c13); \
SIMDE_ASSERT_CONSTANT_(c15); \
\
simde_wasm_i8x16_make( \
c0, c1, c2, c3, c4, c5, c6, c7, \
c8, c9, c10, c11, c12, c13, c14, c15); \
}))
#else
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i8x16_const (
int8_t c0, int8_t c1, int8_t c2, int8_t c3, int8_t c4, int8_t c5, int8_t c6, int8_t c7,
int8_t c8, int8_t c9, int8_t c10, int8_t c11, int8_t c12, int8_t c13, int8_t c14, int8_t c15) {
return simde_wasm_i8x16_make(
c0, c1, c2, c3, c4, c5, c6, c7,
c8, c9, c10, c11, c12, c13, c14, c15);
}
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define \
wasm_i8x16_const( \
c0, c1, c2, c3, c4, c5, c6, c7, \
c8, c9, c10, c11, c12, c13, c14, c15) \
simde_wasm_i8x16_const( \
(c0), (c1), (c2), (c3), (c4), (c5), (c6), (c7), \
(c8), (c9), (c10), (c11), (c12), (c13), (c14), (c15))
#endif
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define \
simde_wasm_i16x8_const( \
c0, c1, c2, c3, c4, c5, c6, c7) \
wasm_i16x8_const( \
(c0), (c1), (c2), (c3), (c4), (c5), (c6), (c7))
#elif defined (SIMDE_STATEMENT_EXPR_) && defined (SIMDE_ASSERT_CONSTANT_) && defined (SIMDE_STATIC_ASSERT)
#define \
simde_wasm_i16x8_const( \
c0, c1, c2, c3, c4, c5, c6, c7) \
SIMDE_STATEMENT_EXPR_(({ \
SIMDE_ASSERT_CONSTANT_(c0); \
SIMDE_ASSERT_CONSTANT_(c1); \
SIMDE_ASSERT_CONSTANT_(c2); \
SIMDE_ASSERT_CONSTANT_(c3); \
SIMDE_ASSERT_CONSTANT_(c4); \
SIMDE_ASSERT_CONSTANT_(c5); \
SIMDE_ASSERT_CONSTANT_(c6); \
SIMDE_ASSERT_CONSTANT_(c7); \
\
simde_wasm_i16x8_make( \
c0, c1, c2, c3, c4, c5, c6, c7); \
}))
#else
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i16x8_const (
int16_t c0, int16_t c1, int16_t c2, int16_t c3, int16_t c4, int16_t c5, int16_t c6, int16_t c7) {
return simde_wasm_i16x8_make(
c0, c1, c2, c3, c4, c5, c6, c7);
}
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define \
wasm_i16x8_const( \
c0, c1, c2, c3, c4, c5, c6, c7) \
simde_wasm_i16x8_const( \
(c0), (c1), (c2), (c3), (c4), (c5), (c6), (c7))
#endif
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define \
simde_wasm_i32x4_const( \
c0, c1, c2, c3) \
wasm_i32x4_const( \
(c0), (c1), (c2), (c3))
#elif defined (SIMDE_STATEMENT_EXPR_) && defined (SIMDE_ASSERT_CONSTANT_) && defined (SIMDE_STATIC_ASSERT)
#define \
simde_wasm_i32x4_const( \
c0, c1, c2, c3) \
SIMDE_STATEMENT_EXPR_(({ \
SIMDE_ASSERT_CONSTANT_(c0); \
SIMDE_ASSERT_CONSTANT_(c1); \
SIMDE_ASSERT_CONSTANT_(c2); \
SIMDE_ASSERT_CONSTANT_(c3); \
\
simde_wasm_i32x4_make( \
c0, c1, c2, c3); \
}))
#else
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i32x4_const (
int32_t c0, int32_t c1, int32_t c2, int32_t c3) {
return simde_wasm_i32x4_make(
c0, c1, c2, c3);
}
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define \
wasm_i32x4_const( \
c0, c1, c2, c3) \
simde_wasm_i32x4_const( \
(c0), (c1), (c2), (c3))
#endif
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define \
simde_wasm_i64x2_const( \
c0, c1) \
wasm_i64x2_const( \
(c0), (c1))
#elif defined (SIMDE_STATEMENT_EXPR_) && defined (SIMDE_ASSERT_CONSTANT_) && defined (SIMDE_STATIC_ASSERT)
#define \
simde_wasm_i64x2_const( \
c0, c1) \
SIMDE_STATEMENT_EXPR_(({ \
SIMDE_ASSERT_CONSTANT_(c0); \
SIMDE_ASSERT_CONSTANT_(c1); \
\
simde_wasm_i64x2_make( \
c0, c1); \
}))
#else
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i64x2_const (
int64_t c0, int64_t c1) {
return simde_wasm_i64x2_make(
c0, c1);
}
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define \
wasm_i64x2_const( \
c0, c1) \
simde_wasm_i64x2_const( \
(c0), (c1))
#endif
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define \
simde_wasm_f32x4_const( \
c0, c1, c2, c3) \
wasm_f32x4_const( \
(c0), (c1), (c2), (c3))
#elif defined (SIMDE_STATEMENT_EXPR_) && defined (SIMDE_ASSERT_CONSTANT_) && defined (SIMDE_STATIC_ASSERT)
#define \
simde_wasm_f32x4_const( \
c0, c1, c2, c3) \
SIMDE_STATEMENT_EXPR_(({ \
SIMDE_ASSERT_CONSTANT_(c0); \
SIMDE_ASSERT_CONSTANT_(c1); \
SIMDE_ASSERT_CONSTANT_(c2); \
SIMDE_ASSERT_CONSTANT_(c3); \
\
simde_wasm_f32x4_make( \
c0, c1, c2, c3); \
}))
#else
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f32x4_const (
simde_float32 c0, simde_float32 c1, simde_float32 c2, simde_float32 c3) {
return simde_wasm_f32x4_make(
c0, c1, c2, c3);
}
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define \
wasm_f32x4_const( \
c0, c1, c2, c3) \
simde_wasm_f32x4_const( \
(c0), (c1), (c2), (c3))
#endif
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define \
simde_wasm_f64x2_const( \
c0, c1) \
wasm_f64x2_const( \
(c0), (c1))
#elif defined (SIMDE_STATEMENT_EXPR_) && defined (SIMDE_ASSERT_CONSTANT_) && defined (SIMDE_STATIC_ASSERT)
#define \
simde_wasm_f64x2_const( \
c0, c1) \
SIMDE_STATEMENT_EXPR_(({ \
SIMDE_ASSERT_CONSTANT_(c0); \
SIMDE_ASSERT_CONSTANT_(c1); \
\
simde_wasm_f64x2_make( \
c0, c1); \
}))
#else
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f64x2_const (
simde_float64 c0, simde_float64 c1) {
return simde_wasm_f64x2_make(
c0, c1);
}
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define \
wasm_f64x2_const( \
c0, c1) \
simde_wasm_f64x2_const( \
(c0), (c1))
#endif
/* splat */
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i8x16_splat (int8_t a) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i8x16_splat(a);
#else
simde_v128_private r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128i = _mm_set1_epi8(a);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_i8 = vdupq_n_s8(a);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined (SIMDE_ZARCH_ZVECTOR_13_NATIVE)
r_.altivec_i8 = vec_splats(a);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i8) / sizeof (r_.i8[0])) ; i++) {
r_.i8[i] = a;
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i8x16_splat(a) simde_wasm_i8x16_splat((a))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i16x8_splat (int16_t a) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i16x8_splat(a);
#else
simde_v128_private r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128i = _mm_set1_epi16(a);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_i16 = vdupq_n_s16(a);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined (SIMDE_ZARCH_ZVECTOR_13_NATIVE)
r_.altivec_i16 = vec_splats(a);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i16) / sizeof (r_.i16[0])) ; i++) {
r_.i16[i] = a;
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i16x8_splat(a) simde_wasm_i16x8_splat((a))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i32x4_splat (int32_t a) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i32x4_splat(a);
#else
simde_v128_private r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128i = _mm_set1_epi32(a);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_i32 = vdupq_n_s32(a);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined (SIMDE_ZARCH_ZVECTOR_13_NATIVE)
r_.altivec_i32 = vec_splats(a);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i32) / sizeof (r_.i32[0])) ; i++) {
r_.i32[i] = a;
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i32x4_splat(a) simde_wasm_i32x4_splat((a))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i64x2_splat (int64_t a) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i64x2_splat(a);
#else
simde_v128_private r_;
#if defined (SIMDE_X86_SSE2_NATIVE) && (!defined (HEDLEY_MSVC_VERSION) || HEDLEY_MSVC_VERSION_CHECK(19,0,0))
r_.sse_m128i = _mm_set1_epi64x(a);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_i64 = vdupq_n_s64(a);
#elif defined (SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined (SIMDE_ZARCH_ZVECTOR_13_NATIVE)
r_.altivec_i64 = vec_splats(HEDLEY_STATIC_CAST(signed long long , a));
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i64) / sizeof (r_.i64[0])) ; i++) {
r_.i64[i] = a;
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i64x2_splat(a) simde_wasm_i64x2_splat((a))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f32x4_splat (simde_float32 a) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_f32x4_splat(a);
#else
simde_v128_private r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128 = _mm_set1_ps(a);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_f32 = vdupq_n_f32(a);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined (SIMDE_ZARCH_ZVECTOR_14_NATIVE)
r_.altivec_f32 = vec_splats(a);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.f32) / sizeof (r_.f32[0])) ; i++) {
r_.f32[i] = a;
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f32x4_splat(a) simde_wasm_f32x4_splat((a))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f64x2_splat (simde_float64 a) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_f64x2_splat(a);
#else
simde_v128_private r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128d = _mm_set1_pd(a);
#elif defined (SIMDE_ARM_NEON_A64V8_NATIVE)
r_.neon_f64 = vdupq_n_f64(a);
#elif defined (SIMDE_POWER_ALTIVEC_P7_NATIVE) || defined (SIMDE_ZARCH_ZVECTOR_13_NATIVE)
r_.altivec_f64 = vec_splats(a);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.f64) / sizeof (r_.f64[0])) ; i++) {
r_.f64[i] = a;
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f64x2_splat(a) simde_wasm_f64x2_splat((a))
#endif
/* load_splat */
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_v128_load8_splat (const void * mem) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_v128_load8_splat(mem);
#else
int8_t v;
simde_memcpy(&v, mem, sizeof (v));
return simde_wasm_i8x16_splat(v);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_v128_load8_splat(mem) simde_wasm_v128_load8_splat((mem))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_v128_load16_splat (const void * mem) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_v128_load16_splat(mem);
#else
int16_t v;
simde_memcpy(&v, mem, sizeof (v));
return simde_wasm_i16x8_splat(v);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_v128_load16_splat(mem) simde_wasm_v128_load16_splat((mem))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_v128_load32_splat (const void * mem) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_v128_load32_splat(mem);
#else
int32_t v;
simde_memcpy(&v, mem, sizeof (v));
return simde_wasm_i32x4_splat(v);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_v128_load32_splat(mem) simde_wasm_v128_load32_splat((mem))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_v128_load64_splat (const void * mem) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_v128_load64_splat(mem);
#else
int64_t v;
simde_memcpy(&v, mem, sizeof (v));
return simde_wasm_i64x2_splat(v);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_v128_load64_splat(mem) simde_wasm_v128_load64_splat((mem))
#endif
/* extract_lane
*
* Note that, unlike normal WASM SIMD128 we return intN_t instead of
* int for sizeof(X) <= sizeof(int). This is done for portability;
* the regular API doesn't have to worry about things like int being
* 16 bits (like on AVR).
*
* This does mean that code which works in SIMDe may not work without
* changes on WASM, but luckily the necessary changes (i.e., casting
* the return values to smaller type when assigning to the smaller
* type) mean the code will work in *both* SIMDe and a native
* implementation. If you use the simde_* prefixed functions it will
* always work. */
SIMDE_FUNCTION_ATTRIBUTES
int8_t
simde_wasm_i8x16_extract_lane (simde_v128_t a, const int lane) {
simde_v128_private a_ = simde_v128_to_private(a);
return a_.i8[lane & 15];
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_i8x16_extract_lane(a, lane) HEDLEY_STATIC_CAST(int8_t, wasm_i8x16_extract_lane((a), (lane)))
#elif defined (SIMDE_X86_SSE4_1_NATIVE)
#define simde_wasm_i8x16_extract_lane(a, lane) HEDLEY_STATIC_CAST(int8_t, _mm_extract_epi8(simde_v128_to_m128i(a), (lane) & 15))
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
#define simde_wasm_i8x16_extract_lane(a, lane) vgetq_lane_s8(simde_v128_to_neon_i8(a), (lane) & 15)
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i8x16_extract_lane(a, lane) simde_wasm_i8x16_extract_lane((a), (lane))
#endif
SIMDE_FUNCTION_ATTRIBUTES
int16_t
simde_wasm_i16x8_extract_lane (simde_v128_t a, const int lane) {
simde_v128_private a_ = simde_v128_to_private(a);
return a_.i16[lane & 7];
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_i16x8_extract_lane(a, lane) HEDLEY_STATIC_CAST(int16_t, wasm_i16x8_extract_lane((a), (lane)))
#elif defined (SIMDE_X86_SSE2_NATIVE)
#define simde_wasm_i16x8_extract_lane(a, lane) HEDLEY_STATIC_CAST(int16_t, _mm_extract_epi16((a), (lane) & 7))
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_i16x8_extract_lane(a, lane) vgetq_lane_s16(simde_v128_to_neon_i16(a), (lane) & 7)
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i16x8_extract_lane(a, lane) simde_wasm_i16x8_extract_lane((a), (lane))
#endif
SIMDE_FUNCTION_ATTRIBUTES
int32_t
simde_wasm_i32x4_extract_lane (simde_v128_t a, const int lane) {
simde_v128_private a_ = simde_v128_to_private(a);
return a_.i32[lane & 3];
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_i32x4_extract_lane(a, lane) HEDLEY_STATIC_CAST(int32_t, wasm_i32x4_extract_lane((a), (lane)))
#elif defined (SIMDE_X86_SSE4_1_NATIVE)
#define simde_wasm_i32x4_extract_lane(a, lane) HEDLEY_STATIC_CAST(int32_t, _mm_extract_epi32((a), (lane) & 3))
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_i32x4_extract_lane(a, lane) vgetq_lane_s32(simde_v128_to_neon_i32(a), (lane) & 3)
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i32x4_extract_lane(a, lane) simde_wasm_i32x4_extract_lane((a), (lane))
#endif
SIMDE_FUNCTION_ATTRIBUTES
int64_t
simde_wasm_i64x2_extract_lane (simde_v128_t a, const int lane) {
simde_v128_private a_ = simde_v128_to_private(a);
return a_.i64[lane & 1];
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_i64x2_extract_lane(a, lane) HEDLEY_STATIC_CAST(int64_t, wasm_i64x2_extract_lane((a), (lane)))
#elif defined (SIMDE_X86_SSE4_1_NATIVE) && defined (SIMDE_ARCH_AMD64)
#define simde_wasm_i64x2_extract_lane(a, lane) HEDLEY_STATIC_CAST(int64_t, _mm_extract_epi64((a), (lane) & 1))
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_i64x2_extract_lane(a, lane) vgetq_lane_s64(simde_v128_to_neon_i64(a), (lane) & 1)
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i64x2_extract_lane(a, lane) simde_wasm_i64x2_extract_lane((a), (lane))
#endif
SIMDE_FUNCTION_ATTRIBUTES
uint8_t
simde_wasm_u8x16_extract_lane (simde_v128_t a, const int lane) {
simde_v128_private a_ = simde_v128_to_private(a);
return a_.u8[lane & 15];
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_u8x16_extract_lane(a, lane) HEDLEY_STATIC_CAST(uint8_t, wasm_u8x16_extract_lane((a), (lane)))
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
#define simde_wasm_u8x16_extract_lane(a, lane) vgetq_lane_u8(simde_v128_to_neon_u8(a), (lane) & 15)
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_u8x16_extract_lane(a, lane) simde_wasm_u8x16_extract_lane((a), (lane))
#endif
SIMDE_FUNCTION_ATTRIBUTES
uint16_t
simde_wasm_u16x8_extract_lane (simde_v128_t a, const int lane) {
simde_v128_private a_ = simde_v128_to_private(a);
return a_.u16[lane & 7];
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_u16x8_extract_lane(a, lane) HEDLEY_STATIC_CAST(uint16_t, wasm_u16x8_extract_lane((a), (lane)))
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_u16x8_extract_lane(a, lane) vgetq_lane_u16(simde_v128_to_neon_u16(a), (lane) & 7)
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_u16x8_extract_lane(a, lane) simde_wasm_u16x8_extract_lane((a), (lane))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_float32
simde_wasm_f32x4_extract_lane (simde_v128_t a, const int lane) {
simde_v128_private a_ = simde_v128_to_private(a);
return a_.f32[lane & 3];
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_f32x4_extract_lane(a, lane) wasm_f32x4_extract_lane((a), (lane))
#elif defined (SIMDE_X86_SSE4_1_NATIVE)
#define simde_wasm_f32x4(a, lane) _mm_extract_ps(simde_v128_to_m128(a), (lane) & 3)
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_f32x4_extract_lane(a, lane) vgetq_lane_f32(simde_v128_to_neon_f32(a), (lane) & 3)
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f32x4_extract_lane(a, lane) simde_wasm_f32x4_extract_lane((a), (lane))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_float64
simde_wasm_f64x2_extract_lane (simde_v128_t a, const int lane) {
simde_v128_private a_ = simde_v128_to_private(a);
return a_.f64[lane & 1];
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_f64x2_extract_lane(a, lane) wasm_f64x2_extract_lane((a), (lane))
#elif defined (SIMDE_ARM_NEON_A64V8_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_f64x2_extract_lane(a, lane) vgetq_lane_f64(simde_v128_to_neon_f64(a), (lane) & 1)
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f64x2_extract_lane(a, lane) simde_wasm_f64x2_extract_lane((a), (lane))
#endif
/* replace_lane */
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i8x16_replace_lane (simde_v128_t a, const int lane, int8_t value) {
simde_v128_private a_ = simde_v128_to_private(a);
a_.i8[lane & 15] = value;
return simde_v128_from_private(a_);
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_i8x16_replace_lane(a, lane, value) wasm_i8x16_replace_lane((a), (lane), (value))
#elif defined (SIMDE_X86_SSE4_1_NATIVE)
#if defined (__clang__) && !SIMDE_DETECT_CLANG_VERSION_CHECK(7,0,0)
#define simde_wasm_i8x16_replace_lane(a, lane, value) HEDLEY_REINTERPRET_CAST(simde_v128_t, _mm_insert_epi8((a), (value), (lane) & 15))
#else
#define simde_wasm_i8x16_replace_lane(a, lane, value) _mm_insert_epi8((a), (value), (lane) & 15)
#endif
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
#define simde_wasm_i8x16_replace_lane(a, lane, value) simde_v128_from_neon_i8(vsetq_lane_s8((value), simde_v128_to_neon_i8(a), (lane) & 15))
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i8x16_replace_lane(a, lane, value) simde_wasm_i8x16_replace_lane((a), (lane), (value))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i16x8_replace_lane (simde_v128_t a, const int lane, int16_t value) {
simde_v128_private a_ = simde_v128_to_private(a);
a_.i16[lane & 7] = value;
return simde_v128_from_private(a_);
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_i16x8_replace_lane(a, lane, value) wasm_i16x8_replace_lane((a), (lane), (value))
#elif defined (SIMDE_X86_SSE2_NATIVE)
#define simde_wasm_i16x8_replace_lane(a, lane, value) _mm_insert_epi16((a), (value), (lane) & 7)
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_i16x8_replace_lane(a, lane, value) simde_v128_from_neon_i16(vsetq_lane_s16((value), simde_v128_to_neon_i16(a), (lane) & 7))
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i16x8_replace_lane(a, lane, value) simde_wasm_i16x8_replace_lane((a), (lane), (value))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i32x4_replace_lane (simde_v128_t a, const int lane, int32_t value) {
simde_v128_private a_ = simde_v128_to_private(a);
a_.i32[lane & 3] = value;
return simde_v128_from_private(a_);
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_i32x4_replace_lane(a, lane, value) wasm_i32x4_replace_lane((a), (lane), (value))
#elif defined (SIMDE_X86_SSE4_1_NATIVE)
#if defined (__clang__) && !SIMDE_DETECT_CLANG_VERSION_CHECK(7,0,0)
#define simde_wasm_i32x4_replace_lane(a, lane, value) HEDLEY_REINTERPRET_CAST(simde_v128_t, _mm_insert_epi32((a), (value), (lane) & 3))
#else
#define simde_wasm_i32x4_replace_lane(a, lane, value) _mm_insert_epi32((a), (value), (lane) & 3)
#endif
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_i32x4_replace_lane(a, lane, value) simde_v128_from_neon_i32(vsetq_lane_s32((value), simde_v128_to_neon_i32(a), (lane) & 3))
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i32x4_replace_lane(a, lane, value) simde_wasm_i32x4_replace_lane((a), (lane), (value))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i64x2_replace_lane (simde_v128_t a, const int lane, int64_t value) {
simde_v128_private a_ = simde_v128_to_private(a);
a_.i64[lane & 1] = value;
return simde_v128_from_private(a_);
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_i64x2_replace_lane(a, lane, value) wasm_i64x2_replace_lane((a), (lane), (value))
#elif defined (SIMDE_X86_SSE4_1_NATIVE) && defined (SIMDE_ARCH_AMD64)
#define simde_wasm_i64x2_replace_lane(a, lane, value) _mm_insert_epi64((a), (value), (lane) & 1)
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_i64x2_replace_lane(a, lane, value) simde_v128_from_neon_i64(vsetq_lane_s64((value), simde_v128_to_neon_i64(a), (lane) & 1))
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i64x2_replace_lane(a, lane, value) simde_wasm_i64x2_replace_lane((a), (lane), (value))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f32x4_replace_lane (simde_v128_t a, const int lane, simde_float32 value) {
simde_v128_private a_ = simde_v128_to_private(a);
a_.f32[lane & 3] = value;
return simde_v128_from_private(a_);
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_f32x4_replace_lane(a, lane, value) wasm_f32x4_replace_lane((a), (lane), (value))
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_f32x4_replace_lane(a, lane, value) simde_v128_from_neon_f32(vsetq_lane_f32((value), simde_v128_to_neon_f32(a), (lane) & 3))
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f32x4_replace_lane(a, lane, value) simde_wasm_f32x4_replace_lane((a), (lane), (value))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f64x2_replace_lane (simde_v128_t a, const int lane, simde_float64 value) {
simde_v128_private a_ = simde_v128_to_private(a);
a_.f64[lane & 1] = value;
return simde_v128_from_private(a_);
}
#if defined (SIMDE_WASM_SIMD128_NATIVE)
#define simde_wasm_f64x2_replace_lane(a, lane, value) wasm_f64x2_replace_lane((a), (lane), (value))
#elif defined (SIMDE_ARM_NEON_A64V8_NATIVE) && !defined (SIMDE_BUG_CLANG_BAD_VGET_SET_LANE_TYPES)
#define simde_wasm_f64x2_replace_lane(a, lane, value) simde_v128_from_neon_f64(vsetq_lane_f64((value), simde_v128_to_neon_f64(a), (lane) & 1))
#endif
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f64x2_replace_lane(a, lane, value) simde_wasm_f64x2_replace_lane((a), (lane), (value))
#endif
/* eq */
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i8x16_eq (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i8x16_eq(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128i = _mm_cmpeq_epi8(a_.sse_m128i, b_.sse_m128i);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u8 = vceqq_s8(a_.neon_i8, b_.neon_i8);
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i8 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i8), a_.i8 == b_.i8);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i8) / sizeof (r_.i8[0])) ; i++) {
r_.i8[i] = (a_.i8[i] == b_.i8[i]) ? ~INT8_C(0) : INT8_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i8x16_eq(a, b) simde_wasm_i8x16_eq((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i16x8_eq (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i16x8_eq(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128i = _mm_cmpeq_epi16(a_.sse_m128i, b_.sse_m128i);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u16 = vceqq_s16(a_.neon_i16, b_.neon_i16);
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i16 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i16), a_.i16 == b_.i16);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i16) / sizeof (r_.i16[0])) ; i++) {
r_.i16[i] = (a_.i16[i] == b_.i16[i]) ? ~INT16_C(0) : INT16_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i16x8_eq(a, b) simde_wasm_i16x8_eq((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i32x4_eq (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i32x4_eq(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128i = _mm_cmpeq_epi32(a_.sse_m128i, b_.sse_m128i);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u32 = vceqq_s32(a_.neon_i32, b_.neon_i32);
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), a_.i32 == b_.i32);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i32) / sizeof (r_.i32[0])) ; i++) {
r_.i32[i] = (a_.i32[i] == b_.i32[i]) ? ~INT32_C(0) : INT32_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i32x4_eq(a, b) simde_wasm_i32x4_eq((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i64x2_eq (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i64x2_eq(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE4_1_NATIVE)
r_.sse_m128i = _mm_cmpeq_epi64(a_.sse_m128i, b_.sse_m128i);
#elif defined (SIMDE_ARM_NEON_A64V8_NATIVE)
r_.neon_u64 = vceqq_s64(a_.neon_i64, b_.neon_i64);
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i64 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i64), a_.i64 == b_.i64);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i64) / sizeof (r_.i64[0])) ; i++) {
r_.i64[i] = (a_.i64[i] == b_.i64[i]) ? ~INT64_C(0) : INT64_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i64x2_eq(a, b) simde_wasm_i64x2_eq((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f32x4_eq (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_f32x4_eq(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128 = _mm_cmpeq_ps(a_.sse_m128, b_.sse_m128);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u32 = vceqq_f32(a_.neon_f32, b_.neon_f32);
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), a_.f32 == b_.f32);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.f32) / sizeof (r_.f32[0])) ; i++) {
r_.i32[i] = (a_.f32[i] == b_.f32[i]) ? ~INT32_C(0) : INT32_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f32x4_eq(a, b) simde_wasm_f32x4_eq((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f64x2_eq (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_f64x2_eq(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128d = _mm_cmpeq_pd(a_.sse_m128d, b_.sse_m128d);
#elif defined (SIMDE_ARM_NEON_A64V8_NATIVE)
r_.neon_u64 = vceqq_f64(a_.neon_f64, b_.neon_f64);
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), a_.f64 == b_.f64);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.f64) / sizeof (r_.f64[0])) ; i++) {
r_.i64[i] = (a_.f64[i] == b_.f64[i]) ? ~INT64_C(0) : INT64_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f64x2_eq(a, b) simde_wasm_f64x2_eq((a), (b))
#endif
/* ne */
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i8x16_ne (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i8x16_ne(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u8 = vmvnq_u8(vceqq_s8(a_.neon_i8, b_.neon_i8));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i8 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i8), a_.i8 != b_.i8);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i8) / sizeof (r_.i8[0])) ; i++) {
r_.i8[i] = (a_.i8[i] != b_.i8[i]) ? ~INT8_C(0) : INT8_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i8x16_ne(a, b) simde_wasm_i8x16_ne((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i16x8_ne (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i16x8_ne(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u16 = vmvnq_u16(vceqq_s16(a_.neon_i16, b_.neon_i16));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i16 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i16), a_.i16 != b_.i16);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i16) / sizeof (r_.i16[0])) ; i++) {
r_.i16[i] = (a_.i16[i] != b_.i16[i]) ? ~INT16_C(0) : INT16_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i16x8_ne(a, b) simde_wasm_i16x8_ne((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i32x4_ne (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i32x4_ne(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u32 = vmvnq_u32(vceqq_s32(a_.neon_i32, b_.neon_i32));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), a_.i32 != b_.i32);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i32) / sizeof (r_.i32[0])) ; i++) {
r_.i32[i] = (a_.i32[i] != b_.i32[i]) ? ~INT32_C(0) : INT32_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i32x4_ne(a, b) simde_wasm_i32x4_ne((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i64x2_ne (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i64x2_ne(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_ARM_NEON_A64V8_NATIVE)
r_.neon_u32 = vmvnq_u32(vreinterpretq_u32_u64(vceqq_s64(a_.neon_i64, b_.neon_i64)));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i64 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i64), a_.i64 != b_.i64);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i64) / sizeof (r_.i64[0])) ; i++) {
r_.i64[i] = (a_.i64[i] != b_.i64[i]) ? ~INT64_C(0) : INT64_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i64x2_ne(a, b) simde_wasm_i64x2_ne((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f32x4_ne (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_f32x4_ne(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128 = _mm_cmpneq_ps(a_.sse_m128, b_.sse_m128);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u32 = vmvnq_u32(vceqq_f32(a_.neon_f32, b_.neon_f32));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), a_.f32 != b_.f32);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.f32) / sizeof (r_.f32[0])) ; i++) {
r_.i32[i] = (a_.f32[i] != b_.f32[i]) ? ~INT32_C(0) : INT32_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f32x4_ne(a, b) simde_wasm_f32x4_ne((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f64x2_ne (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_f64x2_ne(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128d = _mm_cmpneq_pd(a_.sse_m128d, b_.sse_m128d);
#elif defined (SIMDE_ARM_NEON_A64V8_NATIVE)
r_.neon_u32 = vmvnq_u32(vreinterpretq_u32_u64(vceqq_f64(a_.neon_f64, b_.neon_f64)));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), a_.f64 != b_.f64);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.f64) / sizeof (r_.f64[0])) ; i++) {
r_.i64[i] = (a_.f64[i] != b_.f64[i]) ? ~INT64_C(0) : INT64_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_f64x2_ne(a, b) simde_wasm_f64x2_ne((a), (b))
#endif
/* lt */
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i8x16_lt (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i8x16_lt(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128i = _mm_cmplt_epi8(a_.sse_m128i, b_.sse_m128i);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u8 = vcltq_s8(a_.neon_i8, b_.neon_i8);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE)
r_.altivec_i8 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(signed char ), vec_cmplt(a_.altivec_i8, b_.altivec_i8));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i8 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i8), a_.i8 < b_.i8);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i8) / sizeof (r_.i8[0])) ; i++) {
r_.i8[i] = (a_.i8[i] < b_.i8[i]) ? ~INT8_C(0) : INT8_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i8x16_lt(a, b) simde_wasm_i8x16_lt((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i16x8_lt (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i16x8_lt(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128i = _mm_cmplt_epi16(a_.sse_m128i, b_.sse_m128i);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u16 = vcltq_s16(a_.neon_i16, b_.neon_i16);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE)
r_.altivec_i16 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(signed short ), vec_cmplt(a_.altivec_i16, b_.altivec_i16));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i16 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i16), a_.i16 < b_.i16);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i16) / sizeof (r_.i16[0])) ; i++) {
r_.i16[i] = (a_.i16[i] < b_.i16[i]) ? ~INT16_C(0) : INT16_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i16x8_lt(a, b) simde_wasm_i16x8_lt((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i32x4_lt (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i32x4_lt(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128i = _mm_cmplt_epi32(a_.sse_m128i, b_.sse_m128i);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u32 = vcltq_s32(a_.neon_i32, b_.neon_i32);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE)
r_.altivec_i32 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(signed int ), vec_cmplt(a_.altivec_i32, b_.altivec_i32));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), a_.i32 < b_.i32);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i32) / sizeof (r_.i32[0])) ; i++) {
r_.i32[i] = (a_.i32[i] < b_.i32[i]) ? ~INT32_C(0) : INT32_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i32x4_lt(a, b) simde_wasm_i32x4_lt((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_i64x2_lt (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_i64x2_lt(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_ARM_NEON_A64V8_NATIVE)
r_.neon_u64 = vcltq_s64(a_.neon_i64, b_.neon_i64);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
int32x4_t tmp = vorrq_s32(
vandq_s32(
vreinterpretq_s32_u32(vceqq_s32(b_.neon_i32, a_.neon_i32)),
vsubq_s32(a_.neon_i32, b_.neon_i32)
),
vreinterpretq_s32_u32(vcgtq_s32(b_.neon_i32, a_.neon_i32))
);
int32x4x2_t trn = vtrnq_s32(tmp, tmp);
r_.neon_i32 = trn.val[1];
#elif defined (SIMDE_X86_SSE4_2_NATIVE)
r_.sse_m128i = _mm_cmpgt_epi64(b_.sse_m128i, a_.sse_m128i);
#elif defined (SIMDE_X86_SSE2_NATIVE)
/* https://stackoverflow.com/a/65175746 */
r_.sse_m128i =
_mm_shuffle_epi32(
_mm_or_si128(
_mm_and_si128(
_mm_cmpeq_epi32(b_.sse_m128i, a_.sse_m128i),
_mm_sub_epi64(a_.sse_m128i, b_.sse_m128i)
),
_mm_cmpgt_epi32(
b_.sse_m128i,
a_.sse_m128i
)
),
_MM_SHUFFLE(3, 3, 1, 1)
);
#elif defined (SIMDE_POWER_ALTIVEC_P8_NATIVE)
SIMDE_POWER_ALTIVEC_VECTOR(signed int ) tmp =
vec_or(
vec_and(
HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(signed int ), vec_cmpeq(b_.altivec_i32, a_.altivec_i32)),
HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(signed int ), vec_sub(
HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(signed long long ), a_.altivec_i32),
HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(signed long long ), b_.altivec_i32)
))
),
vec_cmpgt(b_.altivec_i32, a_.altivec_i32)
);
r_.altivec_i32 = vec_mergeo(tmp, tmp);
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i64 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i64), a_.i64 < b_.i64);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.i64) / sizeof (r_.i64[0])) ; i++) {
r_.i64[i] = (a_.i64[i] < b_.i64[i]) ? ~INT64_C(0) : INT64_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_i64x2_lt(a, b) simde_wasm_i64x2_lt((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_u8x16_lt (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_u8x16_lt(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u8 = vcltq_u8(a_.neon_u8, b_.neon_u8);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE)
r_.altivec_u8 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(unsigned char ), vec_cmplt(a_.altivec_u8, b_.altivec_u8));
#elif defined (SIMDE_X86_SSE2_NATIVE)
__m128i tmp = _mm_subs_epu8(b_.sse_m128i, a_.sse_m128i);
r_.sse_m128i = _mm_adds_epu8(tmp, _mm_sub_epi8(_mm_setzero_si128(), tmp));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.u8 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.u8), a_.u8 < b_.u8);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.u8) / sizeof (r_.u8[0])) ; i++) {
r_.u8[i] = (a_.u8[i] < b_.u8[i]) ? ~UINT8_C(0) : UINT8_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_u8x16_lt(a, b) simde_wasm_u8x16_lt((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_u16x8_lt (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_u16x8_lt(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u16 = vcltq_u16(a_.neon_u16, b_.neon_u16);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE)
r_.altivec_u16 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(unsigned short ), vec_cmplt(a_.altivec_u16, b_.altivec_u16));
#elif defined (SIMDE_X86_SSE2_NATIVE)
__m128i tmp = _mm_subs_epu16(b_.sse_m128i, a_.sse_m128i);
r_.sse_m128i = _mm_adds_epu16(tmp, _mm_sub_epi16(_mm_setzero_si128(), tmp));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.u16 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.u16), a_.u16 < b_.u16);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.u16) / sizeof (r_.u16[0])) ; i++) {
r_.u16[i] = (a_.u16[i] < b_.u16[i]) ? ~UINT16_C(0) : UINT16_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_u16x8_lt(a, b) simde_wasm_u16x8_lt((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_u32x4_lt (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_u32x4_lt(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u32 = vcltq_u32(a_.neon_u32, b_.neon_u32);
#elif defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128i =
_mm_xor_si128(
_mm_cmpgt_epi32(b_.sse_m128i, a_.sse_m128i),
_mm_srai_epi32(_mm_xor_si128(b_.sse_m128i, a_.sse_m128i), 31)
);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE)
r_.altivec_u32 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(unsigned int ), vec_cmplt(a_.altivec_u32, b_.altivec_u32));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.u32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.u32), a_.u32 < b_.u32);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.u32) / sizeof (r_.u32[0])) ; i++) {
r_.u32[i] = (a_.u32[i] < b_.u32[i]) ? ~UINT32_C(0) : UINT32_C(0);
}
#endif
return simde_v128_from_private(r_);
#endif
}
#if defined (SIMDE_WASM_SIMD128_ENABLE_NATIVE_ALIASES)
#define wasm_u32x4_lt(a, b) simde_wasm_u32x4_lt((a), (b))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_v128_t
simde_wasm_f32x4_lt (simde_v128_t a, simde_v128_t b) {
#if defined (SIMDE_WASM_SIMD128_NATIVE)
return wasm_f32x4_lt(a, b);
#else
simde_v128_private
a_ = simde_v128_to_private(a),
b_ = simde_v128_to_private(b),
r_;
#if defined (SIMDE_X86_SSE2_NATIVE)
r_.sse_m128 = _mm_cmplt_ps(a_.sse_m128, b_.sse_m128);
#elif defined (SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u32 = vcltq_f32(a_.neon_f32, b_.neon_f32);
#elif defined (SIMDE_POWER_ALTIVEC_P6_NATIVE)
r_.altivec_f32 = HEDLEY_REINTERPRET_CAST(SIMDE_POWER_ALTIVEC_VECTOR(float ), vec_cmplt(a_.altivec_f32, b_.altivec_f32));
#elif defined (SIMDE_VECTOR_SUBSCRIPT)
r_.i32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.i32), a_.f32 < b_.f32);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof (r_.f32) / sizeof (r_.f32[0])) ; i++) {
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5 C=96 H=94 G=94
¤ Dauer der Verarbeitung: 0.17 Sekunden
¤
*© Formatika GbR, Deutschland