diff --git a/meson.build b/meson.build index 99698b42d..3f72de356 100644 --- a/meson.build +++ b/meson.build @@ -48,6 +48,7 @@ simde_neon_families = [ 'cvtn', 'combine', 'create', + 'div', 'dot', 'dot_lane', 'dup_n', @@ -164,6 +165,7 @@ simde_neon_families = [ 'shr_n', 'shrn_n', 'sqadd', + 'sqrt', 'sra_n', 'sri_n', 'st1', diff --git a/simde/arm/neon.h b/simde/arm/neon.h index 981912f9e..634abc122 100644 --- a/simde/arm/neon.h +++ b/simde/arm/neon.h @@ -22,6 +22,7 @@ * * Copyright: * 2020 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_H) @@ -68,6 +69,7 @@ #include "neon/cvtn.h" #include "neon/combine.h" #include "neon/create.h" +#include "neon/div.h" #include "neon/dot.h" #include "neon/dot_lane.h" #include "neon/dup_lane.h" @@ -184,6 +186,7 @@ #include "neon/shr_n.h" #include "neon/shrn_n.h" #include "neon/sqadd.h" +#include "neon/sqrt.h" #include "neon/sra_n.h" #include "neon/sri_n.h" #include "neon/st1.h" diff --git a/simde/arm/neon/abs.h b/simde/arm/neon/abs.h index 3c705e98b..982bed9cc 100644 --- a/simde/arm/neon/abs.h +++ b/simde/arm/neon/abs.h @@ -22,6 +22,7 @@ * * Copyright: * 2020 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_ABS_H) @@ -47,6 +48,45 @@ simde_vabsd_s64(int64_t a) { #define vabsd_s64(a) simde_vabsd_s64(a) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16_t +simde_vabsh_f16(simde_float16_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vabsh_f16(a); + #else + simde_float32_t a_ = simde_float16_to_float32(a); + + return (a_ >= 0.0f) ? simde_float16_from_float32(a_) : simde_float16_from_float32(-a_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vabsh_f16 + #define vabsh_f16(a) simde_vabsh_f16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vabs_f16(simde_float16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vabs_f16(a); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vabsh_f16(a_.values[i]); + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vabs_f16 + #define vabs_f16(a) simde_vabs_f16(a) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vabs_f32(simde_float32x2_t a) { @@ -211,6 +251,29 @@ simde_vabs_s64(simde_int64x1_t a) { #define vabs_s64(a) simde_vabs_s64(a) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vabsq_f16(simde_float16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vabsq_f16(a); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vabsh_f16(a_.values[i]); + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vabsq_f16 + #define vabsq_f16(a) simde_vabsq_f16(a) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vabsq_f32(simde_float32x4_t a) { diff --git a/simde/arm/neon/cgt.h b/simde/arm/neon/cgt.h index a090dca5b..465cdb917 100644 --- a/simde/arm/neon/cgt.h +++ b/simde/arm/neon/cgt.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Christopher Moore + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_CGT_H) @@ -78,6 +79,23 @@ simde_vcgtd_u64(uint64_t a, uint64_t b) { #define vcgtd_u64(a, b) simde_vcgtd_u64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +uint16_t +simde_vcgth_f16(simde_float16_t a, simde_float16_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return HEDLEY_STATIC_CAST(uint16_t, vcgth_f16(a, b)); + #else + simde_float32_t a_ = simde_float16_to_float32(a); + simde_float32_t b_ = simde_float16_to_float32(b); + + return (a_ > b_) ? UINT16_MAX : 0; + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vcgth_f16 + #define vcgth_f16(a, b) simde_vcgth_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES uint32_t simde_vcgts_f32(simde_float32_t a, simde_float32_t b) { @@ -92,6 +110,30 @@ simde_vcgts_f32(simde_float32_t a, simde_float32_t b) { #define vcgts_f32(a, b) simde_vcgts_f32((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_uint16x8_t +simde_vcgtq_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vcgtq_f16(a, b); + #else + simde_float16x8_private + a_ = simde_float16x8_to_private(a), + b_ = simde_float16x8_to_private(b); + simde_uint16x8_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vcgth_f16(a_.values[i], b_.values[i]); + } + + return simde_uint16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcgtq_f16 + #define vcgtq_f16(a, b) simde_vcgtq_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_uint32x4_t simde_vcgtq_f32(simde_float32x4_t a, simde_float32x4_t b) { @@ -442,6 +484,30 @@ simde_vcgtq_u64(simde_uint64x2_t a, simde_uint64x2_t b) { #define vcgtq_u64(a, b) simde_vcgtq_u64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_uint16x4_t +simde_vcgt_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vcgt_f16(a, b); + #else + simde_float16x4_private + a_ = simde_float16x4_to_private(a), + b_ = simde_float16x4_to_private(b); + simde_uint16x4_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vcgth_f16(a_.values[i], b_.values[i]); + } + + return simde_uint16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcgt_f16 + #define vcgt_f16(a, b) simde_vcgt_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_uint32x2_t simde_vcgt_f32(simde_float32x2_t a, simde_float32x2_t b) { diff --git a/simde/arm/neon/clez.h b/simde/arm/neon/clez.h index ae3eea9b8..dd308c7f4 100644 --- a/simde/arm/neon/clez.h +++ b/simde/arm/neon/clez.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Christopher Moore + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_CLEZ_H) @@ -78,6 +79,44 @@ simde_vclezs_f32(simde_float32_t a) { #define vclezs_f32(a) simde_vclezs_f32(a) #endif +SIMDE_FUNCTION_ATTRIBUTES +uint16_t +simde_vclezh_f16(simde_float16_t a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return HEDLEY_STATIC_CAST(uint16_t, vclezh_f16(a)); + #else + simde_float32_t a_ = simde_float16_to_float32(a); + + return (a_ <= 0.0f) ? UINT16_MAX : 0; + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vclezh_f16 + #define vclezh_f16(a) simde_vclezh_f16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint16x8_t +simde_vclezq_f16(simde_float16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vclezq_f16(a); + #else + simde_float16x8_private a_ = simde_float16x8_to_private(a); + simde_uint16x8_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vclezh_f16(a_.values[i]); + } + + return simde_uint16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vclezq_f16 + #define vclezq_f16(a) simde_vclezq_f16(a) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_uint32x4_t simde_vclezq_f32(simde_float32x4_t a) { @@ -246,6 +285,28 @@ simde_vclezq_s64(simde_int64x2_t a) { #define vclezq_s64(a) simde_vclezq_s64(a) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_uint16x4_t +simde_vclez_f16(simde_float16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vclez_f16(a); + #else + simde_float16x4_private a_ = simde_float16x4_to_private(a); + simde_uint16x4_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vclezh_f16(a_.values[i]); + } + + return simde_uint16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vclez_f16 + #define vclez_f16(a) simde_vclez_f16(a) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_uint32x2_t simde_vclez_f32(simde_float32x2_t a) { diff --git a/simde/arm/neon/clt.h b/simde/arm/neon/clt.h index ae3602732..9d3cf4076 100644 --- a/simde/arm/neon/clt.h +++ b/simde/arm/neon/clt.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Christopher Moore + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_CLT_H) @@ -77,6 +78,23 @@ simde_vcltd_u64(uint64_t a, uint64_t b) { #define vcltd_u64(a, b) simde_vcltd_u64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +uint16_t +simde_vclth_f16(simde_float16_t a, simde_float16_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return HEDLEY_STATIC_CAST(uint16_t, vclth_f16(a, b)); + #else + simde_float32_t a_ = simde_float16_to_float32(a); + simde_float32_t b_ = simde_float16_to_float32(b); + + return (a_ < b_) ? UINT16_MAX : 0; + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vclth_f16 + #define vclth_f16(a, b) simde_vclth_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES uint32_t simde_vclts_f32(simde_float32_t a, simde_float32_t b) { @@ -91,6 +109,30 @@ simde_vclts_f32(simde_float32_t a, simde_float32_t b) { #define vclts_f32(a, b) simde_vclts_f32((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_uint16x8_t +simde_vcltq_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vcltq_f16(a, b); + #else + simde_float16x8_private + a_ = simde_float16x8_to_private(a), + b_ = simde_float16x8_to_private(b); + simde_uint16x8_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vclth_f16(a_.values[i], b_.values[i]); + } + + return simde_uint16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcltq_f16 + #define vcltq_f16(a, b) simde_vcltq_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_uint32x4_t simde_vcltq_f32(simde_float32x4_t a, simde_float32x4_t b) { @@ -450,6 +492,30 @@ simde_vcltq_u64(simde_uint64x2_t a, simde_uint64x2_t b) { #define vcltq_u64(a, b) simde_vcltq_u64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_uint16x4_t +simde_vclt_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vclt_f16(a, b); + #else + simde_float16x4_private + a_ = simde_float16x4_to_private(a), + b_ = simde_float16x4_to_private(b); + simde_uint16x4_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vclth_f16(a_.values[i], b_.values[i]); + } + + return simde_uint16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vclt_f16 + #define vclt_f16(a, b) simde_vclt_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_uint32x2_t simde_vclt_f32(simde_float32x2_t a, simde_float32x2_t b) { diff --git a/simde/arm/neon/combine.h b/simde/arm/neon/combine.h index 66c1df646..7e1e17135 100644 --- a/simde/arm/neon/combine.h +++ b/simde/arm/neon/combine.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_COMBINE_H) @@ -34,6 +35,32 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vcombine_f16(simde_float16x4_t low, simde_float16x4_t high) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vcombine_f16(low, high); + #else + simde_float16x8_private r_; + simde_float16x4_private + low_ = simde_float16x4_to_private(low), + high_ = simde_float16x4_to_private(high); + + size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; + SIMDE_VECTORIZE + for (size_t i = 0 ; i < halfway ; i++) { + r_.values[i] = low_.values[i]; + r_.values[i + halfway] = high_.values[i]; + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vcombine_f16 + #define vcombine_f16(low, high) simde_vcombine_f16((low), (high)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vcombine_f32(simde_float32x2_t low, simde_float32x2_t high) { diff --git a/simde/arm/neon/cvt.h b/simde/arm/neon/cvt.h index 7a43bb5a9..015be5f6c 100644 --- a/simde/arm/neon/cvt.h +++ b/simde/arm/neon/cvt.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Sean Maher * 2020-2021 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_CVT_H) @@ -486,7 +487,6 @@ simde_vcvt_u64_f64(simde_float64x1_t a) { #define vcvt_u64_f64(a) simde_vcvt_u64_f64(a) #endif - SIMDE_FUNCTION_ATTRIBUTES simde_int16x8_t simde_vcvtq_s16_f16(simde_float16x8_t a) { @@ -1169,6 +1169,135 @@ simde_vcvtq_f64_u64(simde_uint64x2_t a) { #define vcvtq_f64_u64(a) simde_vcvtq_f64_u64(a) #endif +SIMDE_FUNCTION_ATTRIBUTES +int32_t +simde_vcvtas_s32_f32(simde_float32 a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + return vcvtas_s32_f32(a); + #else + if (HEDLEY_UNLIKELY(a < HEDLEY_STATIC_CAST(simde_float32, INT32_MIN))) { + return INT32_MIN; + } else if (HEDLEY_UNLIKELY(a > HEDLEY_STATIC_CAST(simde_float32, INT32_MAX))) { + return INT32_MAX; + } else if (HEDLEY_UNLIKELY(simde_math_isnanf(a))) { + return 0; + } else { + // Round to Nearest with Ties to Away (a.k.a Rounding away from zero) rounding mode. + // For example, 23.2 gets rounded to 24, and −23.2 gets rounded to −24. + return HEDLEY_STATIC_CAST(int32_t, simde_math_roundf(a)); + } + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vcvtas_s32_f32 + #define vcvtas_s32_f32(a) simde_vcvtas_s32_f32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +uint32_t +simde_vcvtas_u32_f32(simde_float32 a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + return vcvtas_u32_f32(a); + #else + if (HEDLEY_UNLIKELY(a > HEDLEY_STATIC_CAST(simde_float32, UINT32_MAX))) { + return UINT32_MAX; + } else if (HEDLEY_UNLIKELY(simde_math_isnanf(a))) { + return 0; + } else { + // Round to Nearest with Ties to Away (a.k.a Rounding away from zero) rounding mode. + // For example, 23.2 gets rounded to 24, and −23.2 gets rounded to −24. + if(a < 0) return 0; + return HEDLEY_STATIC_CAST(uint32_t, simde_math_roundf(a)); + } + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vcvtas_u32_f32 + #define vcvtas_u32_f32(a) simde_vcvtas_u32_f32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_int32x2_t +simde_vcvta_s32_f32(simde_float32x2_t a) { + simde_float32x2_private a_ = simde_float32x2_to_private(a); + simde_int32x2_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vcvtas_s32_f32(a_.values[i]); + } + + return simde_int32x2_from_private(r_); +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvta_s32_f32 + #define vcvta_s32_f32(a) simde_vcvta_s32_f32(a) +#endif + + +SIMDE_FUNCTION_ATTRIBUTES +simde_int32x4_t +simde_vcvtaq_s32_f32(simde_float32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) + return vcvtaq_s32_f32(a); + #else + simde_float32x4_private a_ = simde_float32x4_to_private(a); + simde_int32x4_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vcvtas_s32_f32(a_.values[i]); + } + + return simde_int32x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvtaq_s32_f32 + #define vcvtaq_s32_f32(a) simde_vcvtaq_s32_f32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint32x2_t +simde_vcvta_u32_f32(simde_float32x2_t a) { + simde_float32x2_private a_ = simde_float32x2_to_private(a); + simde_uint32x2_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vcvtas_u32_f32(a_.values[i]); + } + + return simde_uint32x2_from_private(r_); +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvta_u32_f32 + #define vcvta_u32_f32(a) simde_vcvta_u32_f32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint32x4_t +simde_vcvtaq_u32_f32(simde_float32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) + return vcvtaq_u32_f32(a); + #else + simde_float32x4_private a_ = simde_float32x4_to_private(a); + simde_uint32x4_private r_; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vcvtas_u32_f32(a_.values[i]); + } + + return simde_uint32x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vcvtaq_u32_f32 + #define vcvtaq_u32_f32(a) simde_vcvtaq_u32_f32(a) +#endif + + SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/div.h b/simde/arm/neon/div.h new file mode 100644 index 000000000..ec8bda036 --- /dev/null +++ b/simde/arm/neon/div.h @@ -0,0 +1,90 @@ +/* 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: + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) + */ + +#if !defined(SIMDE_ARM_NEON_DIV_H) +#define SIMDE_ARM_NEON_DIV_H + +#include "types.h" + +#include "reinterpret.h" + +HEDLEY_DIAGNOSTIC_PUSH +SIMDE_DISABLE_UNWANTED_DIAGNOSTICS +SIMDE_BEGIN_DECLS_ + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x2_t +simde_vdiv_f32(simde_float32x2_t a, simde_float32x2_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + return vdiv_f32(a, b); + #else + simde_float32x2_private + r_, + a_ = simde_float32x2_to_private(a), + b_ = simde_float32x2_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = a_.values[i] / b_.values[i]; + } + + return simde_float32x2_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vdiv_f32 + #define vdiv_f32(a, b) simde_vdiv_f32((a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vdivq_f32(simde_float32x4_t a, simde_float32x4_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + return vdivq_f32(a, b); + #else + simde_float32x4_private + r_, + a_ = simde_float32x4_to_private(a), + b_ = simde_float32x4_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = a_.values[i] / b_.values[i]; + } + + return simde_float32x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vdivq_f32 + #define vdivq_f32(a, b) simde_vdivq_f32((a), (b)) +#endif + + +SIMDE_END_DECLS_ +HEDLEY_DIAGNOSTIC_POP + +#endif /* !defined(SIMDE_ARM_NEON_MUL_H) */ diff --git a/simde/arm/neon/ext.h b/simde/arm/neon/ext.h index 7b9062dda..446919355 100644 --- a/simde/arm/neon/ext.h +++ b/simde/arm/neon/ext.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_EXT_H) @@ -398,6 +399,32 @@ simde_vext_u64(simde_uint64x1_t a, simde_uint64x1_t b, const int n) #define vext_u64(a, b, n) simde_vext_u64((a), (b), (n)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vextq_f16(simde_float16x8_t a, simde_float16x8_t b, const int n) + SIMDE_REQUIRE_CONSTANT_RANGE(n, 0, 7) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + simde_float16x8_t r; + SIMDE_CONSTIFY_8_(vextq_f16, r, (HEDLEY_UNREACHABLE(), a), n, a, b); + return r; + #else + simde_float16x8_private + a_ = simde_float16x8_to_private(a), + b_ = simde_float16x8_to_private(b), + r_ = a_; + const size_t n_ = HEDLEY_STATIC_CAST(size_t, n); + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + size_t src = i + n_; + r_.values[i] = (src < (sizeof(r_.values) / sizeof(r_.values[0]))) ? a_.values[src] : b_.values[src & 7]; + } + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vextq_f16 + #define vextq_f16(a, b, n) simde_vextq_f16((a), (b), (n)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vextq_f32(simde_float32x4_t a, simde_float32x4_t b, const int n) diff --git a/simde/arm/neon/fma.h b/simde/arm/neon/fma.h index 4ee30d1d6..e66ee57b1 100644 --- a/simde/arm/neon/fma.h +++ b/simde/arm/neon/fma.h @@ -22,6 +22,7 @@ * * Copyright: * 2021 Atharva Nimbalkar +* 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_FMA_H) @@ -62,6 +63,20 @@ simde_vfma_f64(simde_float64x1_t a, simde_float64x1_t b, simde_float64x1_t c) { #define vfma_f64(a, b, c) simde_vfma_f64(a, b, c) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vfmaq_f16(simde_float16x8_t a, simde_float16x8_t b, simde_float16x8_t c) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && (defined(__ARM_FEATURE_FMA) && __ARM_FEATURE_FMA) && defined(SIMDE_ARM_NEON_FP16) + return vfmaq_f16(a, b, c); + #else + return simde_vaddq_f16(a, simde_vmulq_f16(b, c)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vfmaq_f16 + #define vfmaq_f16(a, b, c) simde_vfmaq_f16(a, b, c) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vfmaq_f32(simde_float32x4_t a, simde_float32x4_t b, simde_float32x4_t c) { diff --git a/simde/arm/neon/get_high.h b/simde/arm/neon/get_high.h index 654c63bd6..5987d6856 100644 --- a/simde/arm/neon/get_high.h +++ b/simde/arm/neon/get_high.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_GET_HIGH_H) @@ -34,6 +35,28 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vget_high_f16(simde_float16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vget_high_f16(a); + #else + simde_float16x4_private r_; + simde_float16x8_private a_ = simde_float16x8_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = a_.values[i + (sizeof(r_.values) / sizeof(r_.values[0]))]; + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vget_high_f16 + #define vget_high_f16(a) simde_vget_high_f16((a)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vget_high_f32(simde_float32x4_t a) { diff --git a/simde/arm/neon/get_lane.h b/simde/arm/neon/get_lane.h index 2dbeb55c6..a5f1bab49 100644 --- a/simde/arm/neon/get_lane.h +++ b/simde/arm/neon/get_lane.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_GET_LANE_H) @@ -34,6 +35,27 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16_t +simde_vget_lane_f16(simde_float16x4_t v, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_float16_t r; + + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + SIMDE_CONSTIFY_4_(vget_lane_f16, r, (HEDLEY_UNREACHABLE(), SIMDE_FLOAT16_VALUE(0.0)), lane, v); + #else + simde_float16x4_private v_ = simde_float16x4_to_private(v); + + r = v_.values[lane]; + #endif + + return r; +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vget_lane_f16 + #define vget_lane_f16(v, lane) simde_vget_lane_f16((v), (lane)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32_t simde_vget_lane_f32(simde_float32x2_t v, const int lane) @@ -247,6 +269,27 @@ simde_vget_lane_u64(simde_uint64x1_t v, const int lane) #define vget_lane_u64(v, lane) simde_vget_lane_u64((v), (lane)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16_t +simde_vgetq_lane_f16(simde_float16x8_t v, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + simde_float16_t r; + + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + SIMDE_CONSTIFY_8_(vget_lane_f16, r, (HEDLEY_UNREACHABLE(), SIMDE_FLOAT16_VALUE(0.0)), lane, v); + #else + simde_float16x8_private v_ = simde_float16x8_to_private(v); + + r = v_.values[lane]; + #endif + + return r; +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vgetq_lane_f16 + #define vgetq_lane_f16(v, lane) simde_vgetq_lane_f16((v), (lane)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32_t simde_vgetq_lane_f32(simde_float32x4_t v, const int lane) diff --git a/simde/arm/neon/get_low.h b/simde/arm/neon/get_low.h index 84e17783c..4092b60ca 100644 --- a/simde/arm/neon/get_low.h +++ b/simde/arm/neon/get_low.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_GET_LOW_H) @@ -34,6 +35,28 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vget_low_f16(simde_float16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vget_low_f16(a); + #else + simde_float16x4_private r_; + simde_float16x8_private a_ = simde_float16x8_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = a_.values[i]; + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vget_low_f16 + #define vget_low_f16(a) simde_vget_low_f16((a)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vget_low_f32(simde_float32x4_t a) { diff --git a/simde/arm/neon/ld1_dup.h b/simde/arm/neon/ld1_dup.h index 9df7477b7..ce6da6d2e 100644 --- a/simde/arm/neon/ld1_dup.h +++ b/simde/arm/neon/ld1_dup.h @@ -23,6 +23,7 @@ * Copyright: * 2021 Zhi An Ng (Copyright owned by Google, LLC) * 2021 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_LD1_DUP_H) @@ -177,6 +178,20 @@ simde_vld1_dup_u64(uint64_t const * ptr) { #define vld1_dup_u64(a) simde_vld1_dup_u64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vld1q_dup_f16(simde_float16 const * ptr) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vld1q_dup_f16(ptr); + #else + return simde_vdupq_n_f16(*ptr); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vld1q_dup_f16 + #define vld1q_dup_f16(a) simde_vld1q_dup_f16((a)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vld1q_dup_f32(simde_float32 const * ptr) { diff --git a/simde/arm/neon/ld2.h b/simde/arm/neon/ld2.h index ed8ce1a04..7ba934259 100644 --- a/simde/arm/neon/ld2.h +++ b/simde/arm/neon/ld2.h @@ -22,6 +22,7 @@ * * Copyright: * 2021 Zhi An Ng (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_LD2_H) @@ -673,6 +674,40 @@ simde_vld2q_u64(uint64_t const ptr[HEDLEY_ARRAY_PARAM(4)]) { #define vld2q_u64(a) simde_vld2q_u64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8x2_t +simde_vld2q_f16(simde_float16_t const ptr[HEDLEY_ARRAY_PARAM(16)]) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vld2q_f16(ptr); + #else + #if defined(SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_) && HEDLEY_GCC_VERSION_CHECK(12,0,0) + HEDLEY_DIAGNOSTIC_PUSH + SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_ + #endif + simde_float16x8_private r_[2]; + + for (size_t i = 0 ; i < (sizeof(r_) / sizeof(r_[0])); i++) { + for (size_t j = 0 ; j < (sizeof(r_[0].values) / sizeof(r_[0].values[0])) ; j++) { + r_[i].values[j] = ptr[i + (j * (sizeof(r_) / sizeof(r_[0])))]; + } + } + #if defined(SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_) && HEDLEY_GCC_VERSION_CHECK(12,0,0) + HEDLEY_DIAGNOSTIC_POP + #endif + + simde_float16x8x2_t r = { { + simde_float16x8_from_private(r_[0]), + simde_float16x8_from_private(r_[1]), + } }; + + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vld2q_f16 + #define vld2q_f16(a) simde_vld2q_f16((a)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4x2_t simde_vld2q_f32(simde_float32_t const ptr[HEDLEY_ARRAY_PARAM(8)]) { diff --git a/simde/arm/neon/max.h b/simde/arm/neon/max.h index 1e2b449e3..04c38184a 100644 --- a/simde/arm/neon/max.h +++ b/simde/arm/neon/max.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_MAX_H) @@ -36,6 +37,52 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16_t +simde_vmaxh_f16(simde_float16_t a, simde_float16_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vmaxh_f16(a, b); + #else + simde_float32_t r_; + simde_float32_t a_ = simde_float16_to_float32(a); + simde_float32_t b_ = simde_float16_to_float32(b); + #if !defined(SIMDE_FAST_NANS) + r_ = (a_ >= b_) ? a_ : ((a_ < b_) ? b_ : SIMDE_MATH_NANF); + #else + r_ = (a_ > b_) ? a_ : b_; + #endif + return simde_float16_from_float32(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vmaxh_f16 + #define vmaxh_f16(a, b) simde_vmaxh_f16((a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vmax_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vmax_f16(a, b); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a), + b_ = simde_float16x4_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vmaxh_f16(a_.values[i], b_.values[i]); + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vmax_f16 + #define vmax_f16(a, b) simde_vmax_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vmax_f32(simde_float32x2_t a, simde_float32x2_t b) { @@ -293,6 +340,30 @@ simde_x_vmax_u64(simde_uint64x1_t a, simde_uint64x1_t b) { #endif } +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vmaxq_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vmaxq_f16(a, b); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a), + b_ = simde_float16x8_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vmaxh_f16(a_.values[i], b_.values[i]); + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vmaxq_f16 + #define vmaxq_f16(a, b) simde_vmaxq_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vmaxq_f32(simde_float32x4_t a, simde_float32x4_t b) { diff --git a/simde/arm/neon/min.h b/simde/arm/neon/min.h index bbcef25f0..469e65aa0 100644 --- a/simde/arm/neon/min.h +++ b/simde/arm/neon/min.h @@ -22,6 +22,7 @@ * * Copyright: * 2020 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_MIN_H) @@ -36,6 +37,52 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16_t +simde_vminh_f16(simde_float16_t a, simde_float16_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vminh_f16(a, b); + #else + simde_float32_t r_; + simde_float32_t a_ = simde_float16_to_float32(a); + simde_float32_t b_ = simde_float16_to_float32(b); + #if !defined(SIMDE_FAST_NANS) + r_ = (a_ <= b_) ? a_ : ((a_ > b_) ? b_ : SIMDE_MATH_NANF); + #else + r_ = (a_ < b_) ? a_ : b_; + #endif + return simde_float16_from_float32(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vminh_f16 + #define vminh_f16(a, b) simde_vminh_f16((a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vmin_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vmin_f16(a, b); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a), + b_ = simde_float16x4_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vminh_f16(a_.values[i], b_.values[i]); + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vmin_f16 + #define vmin_f16(a, b) simde_vmin_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vmin_f32(simde_float32x2_t a, simde_float32x2_t b) { @@ -321,6 +368,30 @@ simde_x_vmin_u64(simde_uint64x1_t a, simde_uint64x1_t b) { #endif } +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vminq_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vminq_f16(a, b); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a), + b_ = simde_float16x8_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vminh_f16(a_.values[i], b_.values[i]); + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vminq_f16 + #define vminq_f16(a, b) simde_vminq_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vminq_f32(simde_float32x4_t a, simde_float32x4_t b) { diff --git a/simde/arm/neon/mul.h b/simde/arm/neon/mul.h index 48de8a240..59e4d0934 100644 --- a/simde/arm/neon/mul.h +++ b/simde/arm/neon/mul.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_MUL_H) @@ -36,6 +37,49 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16_t +simde_vmulh_f16(simde_float16_t a, simde_float16_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vmulh_f16(a, b); + #else + simde_float32_t a_ = simde_float16_to_float32(a); + simde_float32_t b_ = simde_float16_to_float32(b); + + return simde_float16_from_float32(a_ * b_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vmulh_f16 + #define vmulh_f16(a, b) simde_vmulh_f16((a), (b)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vmul_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vmul_f16(a, b); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a), + b_ = simde_float16x4_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + simde_float32_t tmp_a_ = simde_float16_to_float32(a_.values[i]); + simde_float32_t tmp_b_ = simde_float16_to_float32(b_.values[i]); + r_.values[i] = simde_float16_from_float32(tmp_a_ * tmp_b_); + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vmul_f16 + #define vmul_f16(a, b) simde_vmul_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vmul_f32(simde_float32x2_t a, simde_float32x2_t b) { @@ -302,6 +346,32 @@ simde_x_vmul_u64(simde_uint64x1_t a, simde_uint64x1_t b) { return simde_uint64x1_from_private(r_); } +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vmulq_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vmulq_f16(a, b); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a), + b_ = simde_float16x8_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + simde_float32_t tmp_a_ = simde_float16_to_float32(a_.values[i]); + simde_float32_t tmp_b_ = simde_float16_to_float32(b_.values[i]); + r_.values[i] = simde_float16_from_float32(tmp_a_ * tmp_b_); + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vmulq_f16 + #define vmulq_f16(a, b) simde_vmulq_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vmulq_f32(simde_float32x4_t a, simde_float32x4_t b) { diff --git a/simde/arm/neon/mul_lane.h b/simde/arm/neon/mul_lane.h index f7b1f2e51..c4b18df34 100644 --- a/simde/arm/neon/mul_lane.h +++ b/simde/arm/neon/mul_lane.h @@ -22,12 +22,14 @@ * * Copyright: * 2020 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_MUL_LANE_H) #define SIMDE_ARM_NEON_MUL_LANE_H #include "types.h" +#include "mul.h" HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS @@ -353,6 +355,27 @@ simde_vmul_laneq_u32(simde_uint32x2_t a, simde_uint32x4_t b, const int lane) #define vmul_laneq_u32(a, b, lane) simde_vmul_laneq_u32((a), (b), (lane)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vmulq_lane_f16(simde_float16x8_t a, simde_float16x4_t b, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a); + simde_float16x4_private b_ = simde_float16x4_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vmulh_f16(a_.values[i], b_.values[lane]); + } + + return simde_float16x8_from_private(r_); +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vmulq_lane_f16 + #define vmulq_lane_f16(a, b, lane) simde_vmulq_lane_f16((a), (b), (lane)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vmulq_lane_f32(simde_float32x4_t a, simde_float32x2_t b, const int lane) diff --git a/simde/arm/neon/mul_n.h b/simde/arm/neon/mul_n.h index 5c73ad2e7..05ae48a19 100644 --- a/simde/arm/neon/mul_n.h +++ b/simde/arm/neon/mul_n.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_MUL_N_H) @@ -36,6 +37,20 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vmul_n_f16(simde_float16x4_t a, simde_float16 b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vmul_n_f16(a, b); + #else + return simde_vmul_f16(a, simde_vdup_n_f16(b)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vmul_n_f16 + #define vmul_n_f16(a, b) simde_vmul_n_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vmul_n_f32(simde_float32x2_t a, simde_float32 b) { @@ -120,6 +135,20 @@ simde_vmul_n_u32(simde_uint32x2_t a, uint32_t b) { #define vmul_n_u32(a, b) simde_vmul_n_u32((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vmulq_n_f16(simde_float16x8_t a, simde_float16 b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vmulq_n_f16(a, b); + #else + return simde_vmulq_f16(a, simde_vdupq_n_f16(b)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vmulq_n_f16 + #define vmulq_n_f16(a, b) simde_vmulq_n_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vmulq_n_f32(simde_float32x4_t a, simde_float32 b) { diff --git a/simde/arm/neon/padd.h b/simde/arm/neon/padd.h index 6cfd99a2d..1c0b9685b 100644 --- a/simde/arm/neon/padd.h +++ b/simde/arm/neon/padd.h @@ -23,6 +23,7 @@ * Copyright: * 2020-2021 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_PADD_H) @@ -96,6 +97,20 @@ simde_vpadds_f32(simde_float32x2_t a) { #define vpadds_f32(a) simde_vpadds_f32((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vpadd_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && !SIMDE_DETECT_CLANG_VERSION_NOT(9,0,0) && defined(SIMDE_ARM_NEON_FP16) + return vpadd_f16(a, b); + #else + return simde_vadd_f16(simde_vuzp1_f16(a, b), simde_vuzp2_f16(a, b)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vpadd_f16 + #define vpadd_f16(a, b) simde_vpadd_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vpadd_f32(simde_float32x2_t a, simde_float32x2_t b) { diff --git a/simde/arm/neon/pmax.h b/simde/arm/neon/pmax.h index ecf31a1a9..fc3020828 100644 --- a/simde/arm/neon/pmax.h +++ b/simde/arm/neon/pmax.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_PMAX_H) @@ -67,6 +68,20 @@ simde_vpmaxqd_f64(simde_float64x2_t a) { #define vpmaxqd_f64(a) simde_vpmaxqd_f64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vpmax_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vpmax_f16(a, b); + #else + return simde_vmax_f16(simde_vuzp1_f16(a, b), simde_vuzp2_f16(a, b)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vpmax_f16 + #define vpmax_f16(a, b) simde_vpmax_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vpmax_f32(simde_float32x2_t a, simde_float32x2_t b) { diff --git a/simde/arm/neon/qrshrn_n.h b/simde/arm/neon/qrshrn_n.h index f5864ae00..75f0a846c 100644 --- a/simde/arm/neon/qrshrn_n.h +++ b/simde/arm/neon/qrshrn_n.h @@ -22,6 +22,7 @@ * * Copyright: * 2021 Zhi An Ng (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_QRSHRN_N_H) @@ -35,6 +36,26 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + #define simde_vqrshrnh_n_s16(a, n) vqrshrnh_n_s16(a, n) +#else + #define simde_vqrshrnh_n_s16(a, n) simde_vqmovnh_s16(simde_x_vrshrh_n_s16(a, n)) +#endif +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vqrshrnh_n_s16 + #define vqrshrnh_n_s16(a, n) simde_vqrshrnh_n_s16(a, n) +#endif + +#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + #define simde_vqrshrnh_n_u16(a, n) vqrshrnh_n_u16(a, n) +#else + #define simde_vqrshrnh_n_u16(a, n) simde_vqmovnh_u16(simde_x_vrshrh_n_u16(a, n)) +#endif +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vqrshrnh_n_u16 + #define vqrshrnh_n_u16(a, n) simde_vqrshrnh_n_u16(a, n) +#endif + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #define simde_vqrshrns_n_s32(a, n) vqrshrns_n_s32(a, n) #else diff --git a/simde/arm/neon/qrshrun_n.h b/simde/arm/neon/qrshrun_n.h index 8903d9ffb..3de0b9c8c 100644 --- a/simde/arm/neon/qrshrun_n.h +++ b/simde/arm/neon/qrshrun_n.h @@ -22,6 +22,7 @@ * * Copyright: * 2021 Zhi An Ng (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_QRSHRUN_N_H) @@ -55,6 +56,16 @@ SIMDE_BEGIN_DECLS_ #define vqrshrund_n_s64(a, n) simde_vqrshrund_n_s64((a), (n)) #endif +#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + #define simde_vqrshrunh_n_s16(a, n) HEDLEY_STATIC_CAST(uint8_t, vqrshrunh_n_s16((a), (n))) +#else + #define simde_vqrshrunh_n_s16(a, n) simde_vqmovunh_s16(simde_x_vrshrh_n_s16(a, n)) +#endif +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vqrshrunh_n_s16 + #define vqrshrunh_n_s16(a, n) simde_vqrshrunh_n_s16((a), (n)) +#endif + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #define simde_vqrshrun_n_s16(a, n) vqrshrun_n_s16((a), (n)) #else diff --git a/simde/arm/neon/recpe.h b/simde/arm/neon/recpe.h index ed9ef4254..df36b9a3a 100644 --- a/simde/arm/neon/recpe.h +++ b/simde/arm/neon/recpe.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2021 Zhi An Ng (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_RECPE_H) @@ -34,6 +35,23 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16_t +simde_vrecpeh_f16(simde_float16_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrecpeh_f16(a); + #else + simde_float32_t r_; + simde_float32_t a_ = simde_float16_to_float32(a); + r_ = 1.0f / a_; + return simde_float16_from_float32(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrecpeh_f16 + #define vrecpeh_f16(a) simde_vrecpeh_f16((a)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32_t simde_vrecpes_f32(simde_float32_t a) { @@ -62,6 +80,29 @@ simde_vrecped_f64(simde_float64_t a) { #define vrecped_f64(a) simde_vrecped_f64((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vrecpe_f16(simde_float16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrecpe_f16(a); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vrecpeh_f16(a_.values[i]); + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrecpe_f16 + #define vrecpe_f16(a) simde_vrecpe_f16((a)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vrecpe_f32(simde_float32x2_t a) { @@ -198,6 +239,29 @@ simde_vrecpeq_f32(simde_float32x4_t a) { #define vrecpeq_f32(a) simde_vrecpeq_f32((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vrecpeq_f16(simde_float16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrecpeq_f16(a); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vrecpeh_f16(a_.values[i]); + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrecpeq_f16 + #define vrecpeq_f16(a) simde_vrecpeq_f16((a)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_uint32x2_t simde_vrecpe_u32(simde_uint32x2_t a){ diff --git a/simde/arm/neon/recps.h b/simde/arm/neon/recps.h index 85c4f1052..ab803d362 100644 --- a/simde/arm/neon/recps.h +++ b/simde/arm/neon/recps.h @@ -22,6 +22,7 @@ * * Copyright: * 2021 Zhi An Ng (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_RECPS_H) @@ -77,6 +78,23 @@ simde_vrecps_f64(simde_float64x1_t a, simde_float64x1_t b) { #define vrecps_f64(a, b) simde_vrecps_f64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vrecps_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrecps_f16(a, b); + #else + return + simde_vsub_f16( + simde_vdup_n_f16(SIMDE_FLOAT16_VALUE(2.0)), + simde_vmul_f16(a, b)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrecps_f16 + #define vrecps_f16(a, b) simde_vrecps_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vrecps_f32(simde_float32x2_t a, simde_float32x2_t b) { @@ -119,6 +137,23 @@ simde_vrecpsq_f32(simde_float32x4_t a, simde_float32x4_t b) { #define vrecpsq_f32(a, b) simde_vrecpsq_f32((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vrecpsq_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrecpsq_f16(a, b); + #else + return + simde_vsubq_f16( + simde_vdupq_n_f16(SIMDE_FLOAT16_VALUE(2.0)), + simde_vmulq_f16(a, b)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrecpsq_f16 + #define vrecpsq_f16(a, b) simde_vrecpsq_f16((a), (b)) +#endif + SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP #endif /* !defined(SIMDE_ARM_NEON_RECPS_H) */ diff --git a/simde/arm/neon/reinterpret.h b/simde/arm/neon/reinterpret.h index 88bddbe6d..990938eb8 100644 --- a/simde/arm/neon/reinterpret.h +++ b/simde/arm/neon/reinterpret.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ @@ -3163,6 +3164,278 @@ simde_vreinterpretq_f64_f32(simde_float32x4_t a) { #define vreinterpretq_f64_f32(a) simde_vreinterpretq_f64_f32(a) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vreinterpret_f16_f32(simde_float32x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpret_f16_f32(a); + #else + simde_float16x4_private r_; + simde_float32x2_private a_ = simde_float32x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_f16_f32 + #define vreinterpret_f16_f32 simde_vreinterpret_f16_f32 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vreinterpret_f16_s16(simde_int16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpret_f16_s16(a); + #else + simde_float16x4_private r_; + simde_int16x4_private a_ = simde_int16x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_f16_s16 + #define vreinterpret_f16_s16 simde_vreinterpret_f16_s16 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vreinterpret_f16_s32(simde_int32x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpret_f16_s32(a); + #else + simde_float16x4_private r_; + simde_int32x2_private a_ = simde_int32x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_f16_s32 + #define vreinterpret_f16_s32 simde_vreinterpret_f16_s32 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vreinterpret_f16_s64(simde_int64x1_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpret_f16_s64(a); + #else + simde_float16x4_private r_; + simde_int64x1_private a_ = simde_int64x1_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_f16_s64 + #define vreinterpret_f16_s64 simde_vreinterpret_f16_s64 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vreinterpret_f16_s8(simde_int8x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpret_f16_s8(a); + #else + simde_float16x4_private r_; + simde_int8x8_private a_ = simde_int8x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_f16_s8 + #define vreinterpret_f16_s8 simde_vreinterpret_f16_s8 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vreinterpret_f16_u32(simde_uint32x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpret_f16_u32(a); + #else + simde_float16x4_private r_; + simde_uint32x2_private a_ = simde_uint32x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_f16_u32 + #define vreinterpret_f16_u32 simde_vreinterpret_f16_u32 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vreinterpret_f16_u64(simde_uint64x1_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpret_f16_u64(a); + #else + simde_float16x4_private r_; + simde_uint64x1_private a_ = simde_uint64x1_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_f16_u64 + #define vreinterpret_f16_u64 simde_vreinterpret_f16_u64 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vreinterpret_f16_u8(simde_uint8x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpret_f16_u8(a); + #else + simde_float16x4_private r_; + simde_uint8x8_private a_ = simde_uint8x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpret_f16_u8 + #define vreinterpret_f16_u8 simde_vreinterpret_f16_u8 +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vreinterpretq_f16_f32(simde_float32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpretq_f16_f32(a); + #else + simde_float16x8_private r_; + simde_float32x4_private a_ = simde_float32x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_f16_f32 + #define vreinterpretq_f16_f32(a) simde_vreinterpretq_f16_f32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vreinterpretq_f16_s16(simde_int16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpretq_f16_s16(a); + #else + simde_float16x8_private r_; + simde_int16x8_private a_ = simde_int16x8_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_f16_s16 + #define vreinterpretq_f16_s16(a) simde_vreinterpretq_f16_s16(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vreinterpretq_f16_s32(simde_int32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpretq_f16_s32(a); + #else + simde_float16x8_private r_; + simde_int32x4_private a_ = simde_int32x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_f16_s32 + #define vreinterpretq_f16_s32(a) simde_vreinterpretq_f16_s32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vreinterpretq_f16_s64(simde_int64x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpretq_f16_s64(a); + #else + simde_float16x8_private r_; + simde_int64x2_private a_ = simde_int64x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_f16_s64 + #define vreinterpretq_f16_s64(a) simde_vreinterpretq_f16_s64(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vreinterpretq_f16_s8(simde_int8x16_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpretq_f16_s8(a); + #else + simde_float16x8_private r_; + simde_int8x16_private a_ = simde_int8x16_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_f16_s8 + #define vreinterpretq_f16_s8(a) simde_vreinterpretq_f16_s8(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vreinterpretq_f16_u32(simde_uint32x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpretq_f16_u32(a); + #else + simde_float16x8_private r_; + simde_uint32x4_private a_ = simde_uint32x4_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_f16_u32 + #define vreinterpretq_f16_u32(a) simde_vreinterpretq_f16_u32(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vreinterpretq_f16_u64(simde_uint64x2_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpretq_f16_u64(a); + #else + simde_float16x8_private r_; + simde_uint64x2_private a_ = simde_uint64x2_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_f16_u64 + #define vreinterpretq_f16_u64(a) simde_vreinterpretq_f16_u64(a) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vreinterpretq_f16_u8(simde_uint8x16_t a) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vreinterpretq_f16_u8(a); + #else + simde_float16x8_private r_; + simde_uint8x16_private a_ = simde_uint8x16_to_private(a); + simde_memcpy(&r_, &a_, sizeof(r_)); + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vreinterpretq_f16_u8 + #define vreinterpretq_f16_u8(a) simde_vreinterpretq_f16_u8(a) +#endif + SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP diff --git a/simde/arm/neon/rndn.h b/simde/arm/neon/rndn.h index d3d073172..c8990a10d 100644 --- a/simde/arm/neon/rndn.h +++ b/simde/arm/neon/rndn.h @@ -22,6 +22,7 @@ * * Copyright: * 2020-2021 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_RNDN_H) @@ -33,6 +34,24 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16_t +simde_vrndnh_f16(simde_float16_t a) { + #if \ + defined(SIMDE_ARM_NEON_A32V8_NATIVE) && \ + (!defined(__clang__) || SIMDE_DETECT_CLANG_VERSION_CHECK(7,0,0)) && \ + (!defined(HEDLEY_GCC_VERSION) || (defined(SIMDE_ARM_NEON_A64V8_NATIVE) && HEDLEY_GCC_VERSION_CHECK(8,0,0))) && defined(SIMDE_ARM_NEON_FP16) + return vrndnh_f16(a); + #else + simde_float32_t a_ = simde_float16_to_float32(a); + return simde_float16_from_float32(simde_math_roundevenf(a_)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrndnh_f16 + #define vrndnh_f16(a) simde_vrndnh_f16(a) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32_t simde_vrndns_f32(simde_float32_t a) { @@ -50,6 +69,29 @@ simde_vrndns_f32(simde_float32_t a) { #define vrndns_f32(a) simde_vrndns_f32(a) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vrndn_f16(simde_float16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrndn_f16(a); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vrndnh_f16(a_.values[i]); + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrndn_f16 + #define vrndn_f16(a) simde_vrndn_f16(a) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vrndn_f32(simde_float32x2_t a) { @@ -97,6 +139,29 @@ simde_vrndn_f64(simde_float64x1_t a) { #define vrndn_f64(a) simde_vrndn_f64(a) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vrndnq_f16(simde_float16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrndnq_f16(a); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vrndnh_f16(a_.values[i]); + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrndnq_f16 + #define vrndnq_f16(a) simde_vrndnq_f16(a) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vrndnq_f32(simde_float32x4_t a) { diff --git a/simde/arm/neon/rshr_n.h b/simde/arm/neon/rshr_n.h index 1eb0c11c0..a27495536 100644 --- a/simde/arm/neon/rshr_n.h +++ b/simde/arm/neon/rshr_n.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Christopher Moore + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_RSHR_N_H) @@ -41,6 +42,20 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +int16_t +simde_x_vrshrh_n_s16(int16_t a, const int n) + SIMDE_REQUIRE_CONSTANT_RANGE(n, 1, 16) { + return (a >> ((n == 16) ? 15 : n)) + ((a & HEDLEY_STATIC_CAST(int16_t, UINT16_C(1) << (n - 1))) != 0); +} + +SIMDE_FUNCTION_ATTRIBUTES +uint16_t +simde_x_vrshrh_n_u16(uint16_t a, const int n) + SIMDE_REQUIRE_CONSTANT_RANGE(n, 1, 16) { + return ((n == 16) ? 0 : (a >> n)) + ((a & (UINT32_C(1) << (n - 1))) != 0); +} + SIMDE_FUNCTION_ATTRIBUTES int32_t simde_x_vrshrs_n_s32(int32_t a, const int n) diff --git a/simde/arm/neon/rsqrte.h b/simde/arm/neon/rsqrte.h index 8b2adbe2a..25b753039 100644 --- a/simde/arm/neon/rsqrte.h +++ b/simde/arm/neon/rsqrte.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2021 Zhi An Ng (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_RSQRTE_H) @@ -34,6 +35,27 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16_t +simde_vrsqrteh_f16(simde_float16_t a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrsqrteh_f16(a); + #else + #if defined(simde_math_sqrtf) + simde_float32_t r_; + simde_float32_t a_ = simde_float16_to_float32(a); + r_ = 1.0f / simde_math_sqrtf(a_); + return simde_float16_from_float32(r_); + #else + HEDLEY_UNREACHABLE(); + #endif + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vrsqrteh_f16 + #define vrsqrteh_f16(a) simde_vrsqrteh_f16((a)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32_t simde_vrsqrtes_f32(simde_float32_t a) { @@ -144,6 +166,33 @@ simde_vrsqrte_u32(simde_uint32x2_t a) { #define vrsqrte_u32(a) simde_vrsqrte_u32((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vrsqrte_f16(simde_float16x4_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrsqrte_f16(a); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a); + + #if defined(simde_math_sqrtf) + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vrsqrteh_f16(a_.values[i]); + } + #else + HEDLEY_UNREACHABLE(); + #endif + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrsqrte_f16 + #define vrsqrte_f16(a) simde_vrsqrte_f16((a)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vrsqrte_f32(simde_float32x2_t a) { @@ -279,6 +328,33 @@ simde_vrsqrteq_u32(simde_uint32x4_t a) { #define vrsqrteq_u32(a) simde_vrsqrteq_u32((a)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vrsqrteq_f16(simde_float16x8_t a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrsqrteq_f16(a); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a); + + #if defined(simde_math_sqrtf) + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vrsqrteh_f16(a_.values[i]); + } + #else + HEDLEY_UNREACHABLE(); + #endif + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrsqrteq_f16 + #define vrsqrteq_f16(a) simde_vrsqrteq_f16((a)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vrsqrteq_f32(simde_float32x4_t a) { diff --git a/simde/arm/neon/rsqrts.h b/simde/arm/neon/rsqrts.h index 3c7f720bb..633ad3aaf 100644 --- a/simde/arm/neon/rsqrts.h +++ b/simde/arm/neon/rsqrts.h @@ -23,6 +23,7 @@ * Copyright: * 2021 Zhi An Ng (Copyright owned by Google, LLC) * 2021 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_RSQRTS_H) @@ -37,6 +38,26 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16_t +simde_vrsqrtsh_f16(simde_float16_t a, simde_float16_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrsqrtsh_f16(a, b); + #else + return + simde_vmulh_f16( + simde_vsubh_f16( + SIMDE_FLOAT16_VALUE(3.0), + simde_vmulh_f16(a, b)), + SIMDE_FLOAT16_VALUE(0.5) + ); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vrsqrtsh_f16 + #define vrsqrtsh_f16(a, b) simde_vrsqrtsh_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32_t simde_vrsqrtss_f32(simde_float32_t a, simde_float32_t b) { @@ -65,6 +86,26 @@ simde_vrsqrtsd_f64(simde_float64_t a, simde_float64_t b) { #define vrsqrtsd_f64(a, b) simde_vrsqrtsd_f64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vrsqrts_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrsqrts_f16(a, b); + #else + return + simde_vmul_n_f16( + simde_vsub_f16( + simde_vdup_n_f16(SIMDE_FLOAT16_VALUE(3.0)), + simde_vmul_f16(a, b)), + SIMDE_FLOAT16_VALUE(0.5) + ); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrsqrts_f16 + #define vrsqrts_f16(a, b) simde_vrsqrts_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vrsqrts_f32(simde_float32x2_t a, simde_float32x2_t b) { @@ -107,6 +148,26 @@ simde_vrsqrts_f64(simde_float64x1_t a, simde_float64x1_t b) { #define vrsqrts_f64(a, b) simde_vrsqrts_f64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vrsqrtsq_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vrsqrtsq_f16(a, b); + #else + return + simde_vmulq_n_f16( + simde_vsubq_f16( + simde_vdupq_n_f16(SIMDE_FLOAT16_VALUE(3.0)), + simde_vmulq_f16(a, b)), + SIMDE_FLOAT16_VALUE(0.5) + ); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vrsqrtsq_f16 + #define vrsqrtsq_f16(a, b) simde_vrsqrtsq_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vrsqrtsq_f32(simde_float32x4_t a, simde_float32x4_t b) { diff --git a/simde/arm/neon/set_lane.h b/simde/arm/neon/set_lane.h index 70291143a..6c290aa5a 100644 --- a/simde/arm/neon/set_lane.h +++ b/simde/arm/neon/set_lane.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_SET_LANE_H) @@ -33,6 +34,25 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vset_lane_f16(simde_float16_t a, simde_float16x4_t v, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 3) { + simde_float16x4_t r; + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + SIMDE_CONSTIFY_4_(vset_lane_f16, r, (HEDLEY_UNREACHABLE(), v), lane, a, v); + #else + simde_float16x4_private v_ = simde_float16x4_to_private(v); + v_.values[lane] = a; + r = simde_float16x4_from_private(v_); + #endif + return r; +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vset_lane_f16 + #define vset_lane_f16(a, b, c) simde_vset_lane_f16((a), (b), (c)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vset_lane_f32(simde_float32_t a, simde_float32x2_t v, const int lane) @@ -226,6 +246,25 @@ simde_vset_lane_u64(uint64_t a, simde_uint64x1_t v, const int lane) #define vset_lane_u64(a, b, c) simde_vset_lane_u64((a), (b), (c)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vsetq_lane_f16(simde_float16_t a, simde_float16x8_t v, const int lane) + SIMDE_REQUIRE_CONSTANT_RANGE(lane, 0, 7) { + simde_float16x8_t r; + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + SIMDE_CONSTIFY_8_(vsetq_lane_f16, r, (HEDLEY_UNREACHABLE(), v), lane, a, v); + #else + simde_float16x8_private v_ = simde_float16x8_to_private(v); + v_.values[lane] = a; + r = simde_float16x8_from_private(v_); + #endif + return r; +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vsetq_lane_f16 + #define vsetq_lane_f16(a, b, c) simde_vsetq_lane_f16((a), (b), (c)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vsetq_lane_f32(simde_float32_t a, simde_float32x4_t v, const int lane) diff --git a/simde/arm/neon/sqrt.h b/simde/arm/neon/sqrt.h new file mode 100644 index 000000000..fb0b5e6d6 --- /dev/null +++ b/simde/arm/neon/sqrt.h @@ -0,0 +1,201 @@ +/* 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: + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) + */ + +#if !defined(SIMDE_ARM_NEON_SQRT_H) +#define SIMDE_ARM_NEON_SQRT_H + +#include "types.h" + +HEDLEY_DIAGNOSTIC_PUSH +SIMDE_DISABLE_UNWANTED_DIAGNOSTICS +SIMDE_BEGIN_DECLS_ + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16 +simde_vsqrth_f16(simde_float16 a) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vsqrth_f16(a, b); + #elif defined(simde_math_sqrtf) + simde_float32 af = simde_float16_to_float32(a); + return simde_float16_from_float32(simde_math_sqrtf(af)); + #else + HEDLEY_UNREACHABLE(); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vsqrth_f16 + #define vsqrth_f16(a) simde_vsqrth_f16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vsqrt_f16(simde_float16x4_t a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vsqrt_f16(a); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vsqrth_f16(a_.values[i]); + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vsqrt_f16 + #define vsqrt_f16(a) simde_vsqrt_f16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x2_t +simde_vsqrt_f32(simde_float32x2_t a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + return vsqrt_f32(a); + #elif defined(simde_math_sqrtf) + simde_float32x2_private + r_, + a_ = simde_float32x2_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_math_sqrtf(a_.values[i]); + } + + return simde_float32x2_from_private(r_); + #else + HEDLEY_UNREACHABLE(); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vsqrt_f32 + #define vsqrt_f32(a) simde_vsqrt_f32((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float64x1_t +simde_vsqrt_f64(simde_float64x1_t a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + return vsqrt_f64(a); + #elif defined(simde_math_sqrt) + simde_float64x1_private + r_, + a_ = simde_float64x1_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_math_sqrt(a_.values[i]); + } + + return simde_float64x1_from_private(r_); + #else + HEDLEY_UNREACHABLE(); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vsqrt_f64 + #define vsqrt_f64(a) simde_vsqrt_f64((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vsqrtq_f16(simde_float16x8_t a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vsqrtq_f16(a); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a); + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vsqrth_f16(a_.values[i]); + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vsqrtq_f16 + #define vsqrtq_f16(a) simde_vsqrtq_f16((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float32x4_t +simde_vsqrtq_f32(simde_float32x4_t a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + return vsqrtq_f32(a); + #elif defined(simde_math_sqrtf) + simde_float32x4_private + r_, + a_ = simde_float32x4_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_math_sqrtf(a_.values[i]); + } + + return simde_float32x4_from_private(r_); + #else + HEDLEY_UNREACHABLE(); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vsqrtq_f32 + #define vsqrtq_f32(a) simde_vsqrtq_f32((a)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_float64x2_t +simde_vsqrtq_f64(simde_float64x2_t a) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) + return vsqrtq_f64(a); + #elif defined(simde_math_sqrt) + simde_float64x2_private + r_, + a_ = simde_float64x2_to_private(a); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_math_sqrt(a_.values[i]); + } + + return simde_float64x2_from_private(r_); + #else + HEDLEY_UNREACHABLE(); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vsqrtq_f64 + #define vsqrtq_f64(a) simde_vsqrtq_f64((a)) +#endif + + +SIMDE_END_DECLS_ +HEDLEY_DIAGNOSTIC_POP +#endif /* !defined(SIMDE_ARM_NEON_SQRT_H) */ diff --git a/simde/arm/neon/st2.h b/simde/arm/neon/st2.h index 9dcaef633..5493c2645 100644 --- a/simde/arm/neon/st2.h +++ b/simde/arm/neon/st2.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2021 Zhi An Ng (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_ST2_H) @@ -37,6 +38,26 @@ SIMDE_BEGIN_DECLS_ #if !defined(SIMDE_BUG_INTEL_857088) +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst2_f16(simde_float16_t *ptr, simde_float16x4x2_t val) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + vst2_f16(ptr, val); + #else + simde_float16_t buf[8]; + simde_float16x4_private a_[2] = {simde_float16x4_to_private(val.val[0]), + simde_float16x4_to_private(val.val[1])}; + for (size_t i = 0; i < (sizeof(val.val[0]) / sizeof(*ptr)) * 2 ; i++) { + buf[i] = a_[i % 2].values[i / 2]; + } + simde_memcpy(ptr, buf, sizeof(buf)); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vst2_f16 + #define vst2_f16(a, b) simde_vst2_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES void simde_vst2_f32(simde_float32_t *ptr, simde_float32x2x2_t val) { @@ -237,6 +258,22 @@ simde_vst2_u64(uint64_t *ptr, simde_uint64x1x2_t val) { #define vst2_u64(a, b) simde_vst2_u64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +void +simde_vst2q_f16(simde_float16_t *ptr, simde_float16x8x2_t val) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + vst2q_f16(ptr, val); + #else + simde_float16x8x2_t r = simde_vzipq_f16(val.val[0], val.val[1]); + simde_vst1q_f16(ptr, r.val[0]); + simde_vst1q_f16(ptr+8, r.val[1]); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vst2q_f16 + #define vst2q_f16(a, b) simde_vst2q_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES void simde_vst2q_f32(simde_float32_t *ptr, simde_float32x4x2_t val) { diff --git a/simde/arm/neon/sub.h b/simde/arm/neon/sub.h index 85a9d5017..8756ba84e 100644 --- a/simde/arm/neon/sub.h +++ b/simde/arm/neon/sub.h @@ -22,6 +22,7 @@ * * Copyright: * 2020 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_SUB_H) @@ -33,6 +34,22 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16 +simde_vsubh_f16(simde_float16 a, simde_float16 b) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vsubh_f16(a, b); + #else + simde_float32 af = simde_float16_to_float32(a); + simde_float32 bf = simde_float16_to_float32(b); + return simde_float16_from_float32(af - bf); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vsubh_f16 + #define vsubh_f16(a, b) simde_vsubh_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES int64_t simde_vsubd_s64(int64_t a, int64_t b) { @@ -61,6 +78,30 @@ simde_vsubd_u64(uint64_t a, uint64_t b) { #define vsubd_u64(a, b) simde_vsubd_u64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vsub_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vsub_f16(a, b); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a), + b_ = simde_float16x4_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_vsubh_f16(a_.values[i], b_.values[i]); + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vsub_f16 + #define vsub_f16(a, b) simde_vsub_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vsub_f32(simde_float32x2_t a, simde_float32x2_t b) { @@ -353,6 +394,32 @@ simde_vsub_u64(simde_uint64x1_t a, simde_uint64x1_t b) { #define vsub_u64(a, b) simde_vsub_u64((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vsubq_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vsubq_f16(a, b); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a), + b_ = simde_float16x8_to_private(b); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + simde_float32_t tmp_a_ = simde_float16_to_float32(a_.values[i]); + simde_float32_t tmp_b_ = simde_float16_to_float32(b_.values[i]); + r_.values[i] = simde_float16_from_float32(tmp_a_ - tmp_b_); + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vsubq_f16 + #define vsubq_f16(a, b) simde_vsubq_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vsubq_f32(simde_float32x4_t a, simde_float32x4_t b) { diff --git a/simde/arm/neon/types.h b/simde/arm/neon/types.h index 12bce8b87..dd3b738c6 100644 --- a/simde/arm/neon/types.h +++ b/simde/arm/neon/types.h @@ -22,6 +22,7 @@ * * Copyright: * 2020 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_TYPES_H) @@ -399,6 +400,16 @@ typedef union { typedef uint64x2x4_t simde_uint64x2x4_t; typedef float32x4x4_t simde_float32x4x4_t; + #if defined(SIMDE_ARM_NEON_FP16) + typedef float16_t simde_float16_t; + typedef float16x4_t simde_float16x4_t; + typedef float16x8_t simde_float16x8_t; + typedef float16x4x2_t simde_float16x4x2_t; + typedef float16x8x2_t simde_float16x8x2_t; + #else + #define SIMDE_ARM_NEON_NEED_PORTABLE_F16 + #endif + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) typedef float64_t simde_float64_t; typedef float64x1_t simde_float64x1_t; @@ -417,14 +428,8 @@ typedef union { #define SIMDE_ARM_NEON_NEED_PORTABLE_F64X2XN #endif - #if SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16 - typedef float16_t simde_float16_t; - typedef float16x4_t simde_float16x4_t; - typedef float16x8_t simde_float16x8_t; - #else - #define SIMDE_ARM_NEON_NEED_PORTABLE_F16 - #endif #elif (defined(SIMDE_X86_MMX_NATIVE) || defined(SIMDE_X86_SSE_NATIVE)) && defined(SIMDE_ARM_NEON_FORCE_NATIVE_TYPES) + #define SIMDE_ARM_NEON_NEED_PORTABLE_F16 #define SIMDE_ARM_NEON_NEED_PORTABLE_F32 #define SIMDE_ARM_NEON_NEED_PORTABLE_F64 @@ -483,8 +488,6 @@ typedef union { #define SIMDE_ARM_NEON_NEED_PORTABLE_U64X2 #define SIMDE_ARM_NEON_NEED_PORTABLE_F64X2 #endif - - #define SIMDE_ARM_NEON_NEED_PORTABLE_F16 #elif defined(SIMDE_WASM_SIMD128_NATIVE) && defined(SIMDE_ARM_NEON_FORCE_NATIVE_TYPES) #define SIMDE_ARM_NEON_NEED_PORTABLE_F32 #define SIMDE_ARM_NEON_NEED_PORTABLE_F64 @@ -507,6 +510,7 @@ typedef union { typedef v128_t simde_float32x4_t; typedef v128_t simde_float64x2_t; #elif defined(SIMDE_POWER_ALTIVEC_P6_NATIVE) || defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE) + #define SIMDE_ARM_NEON_NEED_PORTABLE_F16 #define SIMDE_ARM_NEON_NEED_PORTABLE_F32 #define SIMDE_ARM_NEON_NEED_PORTABLE_F64 @@ -531,9 +535,7 @@ typedef union { #define SIMDE_ARM_NEON_NEED_PORTABLE_I64X2 #define SIMDE_ARM_NEON_NEED_PORTABLE_U64X2 #define SIMDE_ARM_NEON_NEED_PORTABLE_F64X2 - #define SIMDE_ARM_NEON_NEED_PORTABLE_F16 #endif - #define SIMDE_ARM_NEON_NEED_PORTABLE_F16 #elif defined(SIMDE_VECTOR) typedef simde_float32 simde_float32_t; typedef simde_float64 simde_float64_t; @@ -562,6 +564,12 @@ typedef union { typedef simde_float16 simde_float16_t; typedef simde_float16_t simde_float16x4_t SIMDE_VECTOR(8); typedef simde_float16_t simde_float16x8_t SIMDE_VECTOR(16); + typedef struct simde_float16x4x2_t { + simde_float16x4_t val[2]; + } simde_float16x4x2_t; + typedef struct simde_float16x8x2_t { + simde_float16x8_t val[2]; + } simde_float16x8x2_t; #else #define SIMDE_ARM_NEON_NEED_PORTABLE_F16 #endif @@ -647,6 +655,13 @@ typedef union { typedef simde_float16 simde_float16_t; typedef simde_float16x4_private simde_float16x4_t; typedef simde_float16x8_private simde_float16x8_t; + + typedef struct simde_float16x4x2_t { + simde_float16x4_t val[2]; + } simde_float16x4x2_t; + typedef struct simde_float16x8x2_t { + simde_float16x8_t val[2]; + } simde_float16x8x2_t; #endif #if defined(SIMDE_ARM_NEON_NEED_PORTABLE_F32) typedef simde_float32 simde_float32_t; diff --git a/simde/arm/neon/uzp1.h b/simde/arm/neon/uzp1.h index 6cf65a782..02ab056f8 100644 --- a/simde/arm/neon/uzp1.h +++ b/simde/arm/neon/uzp1.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_UZP1_H) @@ -34,6 +35,33 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vuzp1_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vuzp1_f16(a, b); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a), + b_ = simde_float16x4_to_private(b); + + const size_t halfway_point = sizeof(r_.values) / sizeof(r_.values[0]) / 2; + SIMDE_VECTORIZE + for (size_t i = 0 ; i < halfway_point ; i++) { + const size_t idx = i << 1; + r_.values[ i ] = a_.values[idx]; + r_.values[i + halfway_point] = b_.values[idx]; + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vuzp1_f16 + #define vuzp1_f16(a, b) simde_vuzp1_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vuzp1_f32(simde_float32x2_t a, simde_float32x2_t b) { diff --git a/simde/arm/neon/uzp2.h b/simde/arm/neon/uzp2.h index 26856ab7e..830b3e254 100644 --- a/simde/arm/neon/uzp2.h +++ b/simde/arm/neon/uzp2.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_UZP2_H) @@ -34,6 +35,33 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vuzp2_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vuzp2_f16(a, b); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a), + b_ = simde_float16x4_to_private(b); + + const size_t halfway_point = sizeof(r_.values) / sizeof(r_.values[0]) / 2; + SIMDE_VECTORIZE + for (size_t i = 0 ; i < halfway_point ; i++) { + const size_t idx = i << 1; + r_.values[ i ] = a_.values[idx | 1]; + r_.values[i + halfway_point] = b_.values[idx | 1]; + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vuzp2_f16 + #define vuzp2_f16(a, b) simde_vuzp2_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vuzp2_f32(simde_float32x2_t a, simde_float32x2_t b) { diff --git a/simde/arm/neon/zip.h b/simde/arm/neon/zip.h index 830a8d4db..7e8d91ba6 100644 --- a/simde/arm/neon/zip.h +++ b/simde/arm/neon/zip.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_ZIP_H) && !defined(SIMDE_BUG_INTEL_857088) @@ -36,6 +37,21 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4x2_t +simde_vzip_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vzip_f16(a, b); + #else + simde_float16x4x2_t r = { { simde_vzip1_f16(a, b), simde_vzip2_f16(a, b) } }; + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vzip_f16 + #define vzip_f16(a, b) simde_vzip_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2x2_t simde_vzip_f32(simde_float32x2_t a, simde_float32x2_t b) { @@ -141,6 +157,21 @@ simde_vzip_u32(simde_uint32x2_t a, simde_uint32x2_t b) { #define vzip_u32(a, b) simde_vzip_u32((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8x2_t +simde_vzipq_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vzipq_f16(a, b); + #else + simde_float16x8x2_t r = { { simde_vzip1q_f16(a, b), simde_vzip2q_f16(a, b) } }; + return r; + #endif +} +#if defined(SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES) + #undef vzipq_f16 + #define vzipq_f16(a, b) simde_vzipq_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4x2_t simde_vzipq_f32(simde_float32x4_t a, simde_float32x4_t b) { diff --git a/simde/arm/neon/zip1.h b/simde/arm/neon/zip1.h index b0298be4f..c1714504b 100644 --- a/simde/arm/neon/zip1.h +++ b/simde/arm/neon/zip1.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_ZIP1_H) @@ -34,6 +35,32 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vzip1_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vzip1_f16(a, b); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a), + b_ = simde_float16x4_to_private(b); + + const size_t halfway_point = sizeof(r_.values) / sizeof(r_.values[0]) / 2; + SIMDE_VECTORIZE + for (size_t i = 0 ; i < halfway_point ; i++) { + r_.values[2 * i ] = a_.values[i]; + r_.values[2 * i + 1] = b_.values[i]; + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vzip1_f16 + #define vzip1_f16(a, b) simde_vzip1_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vzip1_f32(simde_float32x2_t a, simde_float32x2_t b) { @@ -279,6 +306,32 @@ simde_vzip1_u32(simde_uint32x2_t a, simde_uint32x2_t b) { #define vzip1_u32(a, b) simde_vzip1_u32((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vzip1q_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vzip1q_f16(a, b); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a), + b_ = simde_float16x8_to_private(b); + + const size_t halfway_point = sizeof(r_.values) / sizeof(r_.values[0]) / 2; + SIMDE_VECTORIZE + for (size_t i = 0 ; i < halfway_point ; i++) { + r_.values[2 * i ] = a_.values[i]; + r_.values[2 * i + 1] = b_.values[i]; + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vzip1q_f16 + #define vzip1q_f16(a, b) simde_vzip1q_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vzip1q_f32(simde_float32x4_t a, simde_float32x4_t b) { diff --git a/simde/arm/neon/zip2.h b/simde/arm/neon/zip2.h index bf78b1201..54fe6a3c2 100644 --- a/simde/arm/neon/zip2.h +++ b/simde/arm/neon/zip2.h @@ -23,6 +23,7 @@ * Copyright: * 2020 Evan Nemerson * 2020 Sean Maher (Copyright owned by Google, LLC) + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ #if !defined(SIMDE_ARM_NEON_ZIP2_H) @@ -34,6 +35,32 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_BEGIN_DECLS_ +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x4_t +simde_vzip2_f16(simde_float16x4_t a, simde_float16x4_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vzip2_f16(a, b); + #else + simde_float16x4_private + r_, + a_ = simde_float16x4_to_private(a), + b_ = simde_float16x4_to_private(b); + + const size_t halfway_point = sizeof(r_.values) / sizeof(r_.values[0]) / 2; + SIMDE_VECTORIZE + for (size_t i = 0 ; i < halfway_point ; i++) { + r_.values[(2 * i) ] = a_.values[halfway_point + i]; + r_.values[(2 * i) + 1] = b_.values[halfway_point + i]; + } + + return simde_float16x4_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vzip2_f16 + #define vzip2_f16(a, b) simde_vzip2_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x2_t simde_vzip2_f32(simde_float32x2_t a, simde_float32x2_t b) { @@ -258,6 +285,32 @@ simde_vzip2_u32(simde_uint32x2_t a, simde_uint32x2_t b) { #define vzip2_u32(a, b) simde_vzip2_u32((a), (b)) #endif +SIMDE_FUNCTION_ATTRIBUTES +simde_float16x8_t +simde_vzip2q_f16(simde_float16x8_t a, simde_float16x8_t b) { + #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) + return vzip2q_f16(a, b); + #else + simde_float16x8_private + r_, + a_ = simde_float16x8_to_private(a), + b_ = simde_float16x8_to_private(b); + + const size_t halfway_point = sizeof(r_.values) / sizeof(r_.values[0]) / 2; + SIMDE_VECTORIZE + for (size_t i = 0 ; i < halfway_point ; i++) { + r_.values[(2 * i) ] = a_.values[halfway_point + i]; + r_.values[(2 * i) + 1] = b_.values[halfway_point + i]; + } + + return simde_float16x8_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) + #undef vzip2q_f16 + #define vzip2q_f16(a, b) simde_vzip2q_f16((a), (b)) +#endif + SIMDE_FUNCTION_ATTRIBUTES simde_float32x4_t simde_vzip2q_f32(simde_float32x4_t a, simde_float32x4_t b) { diff --git a/simde/simde-math.h b/simde/simde-math.h index 5ea5dba93..ab05efd13 100644 --- a/simde/simde-math.h +++ b/simde/simde-math.h @@ -22,6 +22,7 @@ * * Copyright: * 2017-2020 Evan Nemerson + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) */ /* Attempt to find math functions. Functions may be in , @@ -1363,6 +1364,16 @@ simde_math_fpclass(double v, const int imm8) { #endif #endif +#if !defined(simde_math_sqrtl) + #if SIMDE_MATH_BUILTIN_LIBM(sqrtl) + #define simde_math_sqrtl(v) __builtin_sqrtl(v) + #elif defined(SIMDE_MATH_HAVE_CMATH) + #define simde_math_sqrtl(v) std::sqrt(v) + #elif defined(SIMDE_MATH_HAVE_MATH_H) + #define simde_math_sqrtl(v) sqrtl(v) + #endif +#endif + #if !defined(simde_math_tan) #if SIMDE_MATH_BUILTIN_LIBM(tan) #define simde_math_tan(v) __builtin_tan(v) diff --git a/test/arm/neon/abs.c b/test/arm/neon/abs.c index bd896d15a..beda70cb3 100644 --- a/test/arm/neon/abs.c +++ b/test/arm/neon/abs.c @@ -48,6 +48,44 @@ test_simde_vabsd_s64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vabs_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(-5.20) }, + { SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(8.20), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(5.20) } }, + { { SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(-3.80) }, + { SIMDE_FLOAT16_VALUE(4.40), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(3.80) } }, + { { SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(-2.40), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(5.70) }, + { SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(5.70) } }, + { { SIMDE_FLOAT16_VALUE(8.30), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(9.10), SIMDE_FLOAT16_VALUE(8.50) }, + { SIMDE_FLOAT16_VALUE(8.30), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(9.10), SIMDE_FLOAT16_VALUE(8.50) } }, + { { SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(5.50) }, + { SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(5.50) } }, + { { SIMDE_FLOAT16_VALUE(7.70), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(3.90) }, + { SIMDE_FLOAT16_VALUE(7.70), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(3.90) } }, + { { SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(1.00) }, + { SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(1.00) } }, + { { SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(3.70) }, + { SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(3.70) } }, + { { SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(8.40) }, + { SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(8.40) } }, + { { SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(4.10) }, + { SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(4.10) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t r = simde_vabs_f16(a); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), INT_MAX); + } + + return 0; +} + static int test_simde_vabs_f32 (SIMDE_MUNIT_TEST_ARGS) { static const struct { @@ -252,6 +290,43 @@ test_simde_vabs_s64 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vabsq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(-7.50), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(-9.30), SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(3.00) }, + { SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(3.00) } }, + { { SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(-5.70), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(9.80), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(8.30) }, + { SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(5.70), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(9.80), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(8.30) } }, + { { SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(8.70), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(-5.40), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(1.70) }, + { SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(8.70), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(5.40), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(1.70) } }, + { { SIMDE_FLOAT16_VALUE(-10.00), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(-9.40), SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(-9.50) }, + { SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(9.50) } }, + { { SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-7.80), SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(-8.80), SIMDE_FLOAT16_VALUE(-6.00) }, + { SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(6.00) } }, + { { SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(-5.10), SIMDE_FLOAT16_VALUE(-6.90), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(2.80) }, + { SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(5.10), SIMDE_FLOAT16_VALUE(6.90), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(2.80) } }, + { { SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(-7.00), SIMDE_FLOAT16_VALUE(9.80), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(4.30) }, + { SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(9.80), SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(4.30) } }, + { { SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(-7.20), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(5.10), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(5.90) }, + { SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(5.10), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(5.90) } }, + { { SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(-6.90), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(7.30) }, + { SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(6.90), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(7.30) } }, + { { SIMDE_FLOAT16_VALUE(5.10), SIMDE_FLOAT16_VALUE(-7.80), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(7.40), SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(0.00) }, + { SIMDE_FLOAT16_VALUE(5.10), SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(7.40), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(0.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t r = simde_vabsq_f16(a); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), INT_MAX); + } + + return 0; +} + static int test_simde_vabsq_f32 (SIMDE_MUNIT_TEST_ARGS) { static const struct { @@ -472,6 +547,7 @@ test_simde_vabsq_s64 (SIMDE_MUNIT_TEST_ARGS) { SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vabsd_s64) +SIMDE_TEST_FUNC_LIST_ENTRY(vabs_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vabs_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vabs_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vabs_s8) @@ -479,6 +555,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vabs_s16) SIMDE_TEST_FUNC_LIST_ENTRY(vabs_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vabs_s64) +SIMDE_TEST_FUNC_LIST_ENTRY(vabsq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vabsq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vabsq_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vabsq_s8) diff --git a/test/arm/neon/cage.c b/test/arm/neon/cage.c index eb9def7ba..d487f9232 100644 --- a/test/arm/neon/cage.c +++ b/test/arm/neon/cage.c @@ -6,7 +6,7 @@ static int test_simde_vcageh_f16 (SIMDE_MUNIT_TEST_ARGS) { #if 1 - static const struct { + struct { simde_float32 a; simde_float32 b; uint16_t r; diff --git a/test/arm/neon/cgt.c b/test/arm/neon/cgt.c index a4ca71242..b704f7b05 100644 --- a/test/arm/neon/cgt.c +++ b/test/arm/neon/cgt.c @@ -9,6 +9,44 @@ #include "../../../simde/arm/neon.h" #endif +static int +test_simde_vcgt_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + uint16_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( -49.28), SIMDE_FLOAT16_VALUE( -109.00), SIMDE_FLOAT16_VALUE( -626.50), SIMDE_FLOAT16_VALUE( -567.00) }, + { SIMDE_FLOAT16_VALUE( -178.88), SIMDE_FLOAT16_VALUE( 10.22), SIMDE_FLOAT16_VALUE( 976.50), SIMDE_FLOAT16_VALUE( -31.19) }, + { UINT16_MAX, UINT16_C( 0), UINT16_C( 0), UINT16_C( 0)} }, + { { SIMDE_FLOAT16_VALUE( -226.00), SIMDE_FLOAT16_VALUE( -520.50), SIMDE_FLOAT16_VALUE( -252.38), SIMDE_FLOAT16_VALUE( -407.50) }, + { SIMDE_FLOAT16_VALUE( 89.44), SIMDE_FLOAT16_VALUE( -200.50), SIMDE_FLOAT16_VALUE( -439.75), SIMDE_FLOAT16_VALUE( -450.75) }, + { UINT16_C( 0), UINT16_C( 0), UINT16_MAX, UINT16_MAX } }, + { { SIMDE_FLOAT16_VALUE( -833.00), SIMDE_FLOAT16_VALUE( -714.00), SIMDE_FLOAT16_VALUE( 428.50), SIMDE_FLOAT16_VALUE( 871.50) }, + { SIMDE_FLOAT16_VALUE( -157.12), SIMDE_FLOAT16_VALUE( 972.50), SIMDE_FLOAT16_VALUE( 298.75), SIMDE_FLOAT16_VALUE( -919.50) }, + { UINT16_C( 0), UINT16_C( 0), UINT16_MAX, UINT16_MAX } }, + { { SIMDE_FLOAT16_VALUE( 488.00), SIMDE_FLOAT16_VALUE( 112.56), SIMDE_FLOAT16_VALUE( 58.66), SIMDE_FLOAT16_VALUE( 879.50) }, + { SIMDE_FLOAT16_VALUE( 129.00), SIMDE_FLOAT16_VALUE( -858.50), SIMDE_FLOAT16_VALUE( -133.88), SIMDE_FLOAT16_VALUE( -920.50) }, + { UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX} }, + { { SIMDE_FLOAT16_VALUE( 16.59), SIMDE_FLOAT16_VALUE( 239.50), SIMDE_FLOAT16_VALUE( -487.50), SIMDE_FLOAT16_VALUE( 853.50) }, + { SIMDE_FLOAT16_VALUE( -750.50), SIMDE_FLOAT16_VALUE( -510.75), SIMDE_FLOAT16_VALUE( -177.50), SIMDE_FLOAT16_VALUE( 23.77) }, + { UINT16_MAX, UINT16_MAX, UINT16_C( 0), UINT16_MAX} }, + { { SIMDE_FLOAT16_VALUE( -31.45), SIMDE_FLOAT16_VALUE( 570.00), SIMDE_FLOAT16_VALUE( -616.00), SIMDE_FLOAT16_VALUE( -942.00) }, + { SIMDE_FLOAT16_VALUE( 630.50), SIMDE_FLOAT16_VALUE( 823.50), SIMDE_FLOAT16_VALUE( -392.75), SIMDE_FLOAT16_VALUE( -463.25) }, + { UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), UINT16_C( 0)} } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_uint16x4_t r = simde_vcgt_f16(a, b); + + simde_test_arm_neon_assert_equal_u16x4(r, simde_vld1_u16(test_vec[i].r)); + } + + return 0; +} + static int test_simde_vcgt_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -679,6 +717,50 @@ test_simde_vcgt_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vcgtq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + uint16_t r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( -259.46), SIMDE_FLOAT16_VALUE( -774.65), SIMDE_FLOAT16_VALUE( 628.16), SIMDE_FLOAT16_VALUE( -992.75), + SIMDE_FLOAT16_VALUE( 127.08), SIMDE_FLOAT16_VALUE( 51.79), SIMDE_FLOAT16_VALUE( 966.55), SIMDE_FLOAT16_VALUE( -31.51) }, + { SIMDE_FLOAT16_VALUE( -259.46), SIMDE_FLOAT16_VALUE( -774.65), SIMDE_FLOAT16_VALUE( 628.16), SIMDE_FLOAT16_VALUE( -707.60), + SIMDE_FLOAT16_VALUE( 36.37), SIMDE_FLOAT16_VALUE( 73.30), SIMDE_FLOAT16_VALUE( 646.26), SIMDE_FLOAT16_VALUE( -31.51) }, + { UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), + UINT16_MAX, UINT16_C( 0), UINT16_MAX, UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( 466.70), SIMDE_FLOAT16_VALUE( 282.12), SIMDE_FLOAT16_VALUE( -570.04), SIMDE_FLOAT16_VALUE( -866.16), + SIMDE_FLOAT16_VALUE( -574.22), SIMDE_FLOAT16_VALUE( -2.51), SIMDE_FLOAT16_VALUE( -310.68), SIMDE_FLOAT16_VALUE( -504.85) }, + { SIMDE_FLOAT16_VALUE( -215.26), SIMDE_FLOAT16_VALUE( -475.25), SIMDE_FLOAT16_VALUE( -570.04), SIMDE_FLOAT16_VALUE( -866.16), + SIMDE_FLOAT16_VALUE( -574.22), SIMDE_FLOAT16_VALUE( -2.51), SIMDE_FLOAT16_VALUE( -697.28), SIMDE_FLOAT16_VALUE( 552.86) }, + { UINT16_MAX, UINT16_MAX, UINT16_C( 0), UINT16_C( 0), + UINT16_C( 0), UINT16_C( 0), UINT16_MAX, UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( 342.57), SIMDE_FLOAT16_VALUE( 504.54), SIMDE_FLOAT16_VALUE( 219.24), SIMDE_FLOAT16_VALUE( -166.34), + SIMDE_FLOAT16_VALUE( -280.95), SIMDE_FLOAT16_VALUE( -30.91), SIMDE_FLOAT16_VALUE( 705.25), SIMDE_FLOAT16_VALUE( -225.48) }, + { SIMDE_FLOAT16_VALUE( -190.21), SIMDE_FLOAT16_VALUE( 504.54), SIMDE_FLOAT16_VALUE( 219.24), SIMDE_FLOAT16_VALUE( -723.52), + SIMDE_FLOAT16_VALUE( -240.87), SIMDE_FLOAT16_VALUE( 846.33), SIMDE_FLOAT16_VALUE( -227.65), SIMDE_FLOAT16_VALUE( -225.48) }, + { UINT16_MAX, UINT16_C( 0), UINT16_C( 0), UINT16_MAX, + UINT16_C( 0), UINT16_C( 0), UINT16_MAX, UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( 841.66), SIMDE_FLOAT16_VALUE( 572.39), SIMDE_FLOAT16_VALUE( 594.22), SIMDE_FLOAT16_VALUE( -491.55), + SIMDE_FLOAT16_VALUE( 152.78), SIMDE_FLOAT16_VALUE( 77.13), SIMDE_FLOAT16_VALUE( 510.85), SIMDE_FLOAT16_VALUE( 939.45) }, + { SIMDE_FLOAT16_VALUE( 841.66), SIMDE_FLOAT16_VALUE( 110.40), SIMDE_FLOAT16_VALUE( 593.11), SIMDE_FLOAT16_VALUE( 184.23), + SIMDE_FLOAT16_VALUE( 271.42), SIMDE_FLOAT16_VALUE( 898.23), SIMDE_FLOAT16_VALUE( 510.85), SIMDE_FLOAT16_VALUE( 990.47) }, + { UINT16_C( 0), UINT16_MAX, UINT16_MAX, UINT16_C( 0), + UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), UINT16_C( 0) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_uint16x8_t r = simde_vcgtq_f16(a, b); + + simde_test_arm_neon_assert_equal_u16x8(r, simde_vld1q_u16(test_vec[i].r)); + } + + return 0; +} + static int test_simde_vcgtq_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1562,6 +1644,47 @@ test_simde_vcgtd_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vcgth_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16_t a; + simde_float16_t b; + uint16_t r; + } test_vec[] = { + { SIMDE_FLOAT16_VALUE( 167.25), + SIMDE_FLOAT16_VALUE( -952.00), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( -942.50), + SIMDE_FLOAT16_VALUE( 623.50), + UINT16_C( 0) }, + { SIMDE_FLOAT16_VALUE( -1.52), + SIMDE_FLOAT16_VALUE( -118.88), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( -734.00), + SIMDE_FLOAT16_VALUE( -63.38), + UINT16_C( 0) }, + { SIMDE_FLOAT16_VALUE( -352.00), + SIMDE_FLOAT16_VALUE( 409.00), + UINT16_C( 0) }, + { SIMDE_FLOAT16_VALUE( 191.75), + SIMDE_FLOAT16_VALUE( -388.75), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( 835.50), + SIMDE_FLOAT16_VALUE( -550.50), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( -529.00), + SIMDE_FLOAT16_VALUE( -873.50), + UINT16_MAX } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + uint16_t r = simde_vcgth_f16(test_vec[i].a, test_vec[i].b); + simde_assert_equal_u16(r, test_vec[i].r); + } + + return 0; +} + static int test_simde_vcgts_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1618,6 +1741,7 @@ test_simde_vcgts_f32 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vcgt_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vcgt_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vcgt_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vcgt_s8) @@ -1629,6 +1753,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vcgt_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vcgt_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vcgt_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vcgtq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vcgtq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vcgtq_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vcgtq_s8) @@ -1644,6 +1769,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vcgtd_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vcgtd_s64) SIMDE_TEST_FUNC_LIST_ENTRY(vcgtd_u64) SIMDE_TEST_FUNC_LIST_ENTRY(vcgts_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vcgth_f16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/clez.c b/test/arm/neon/clez.c index b6c9a7fec..a6192a3ff 100644 --- a/test/arm/neon/clez.c +++ b/test/arm/neon/clez.c @@ -9,6 +9,32 @@ #include "../../../simde/arm/neon.h" #endif +static int +test_simde_vclez_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + uint16_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 259.46), SIMDE_FLOAT16_VALUE( 774.65), SIMDE_FLOAT16_VALUE( 628.16), SIMDE_FLOAT16_VALUE( 707.60)}, + { UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( -215.26), SIMDE_FLOAT16_VALUE( -475.25), SIMDE_FLOAT16_VALUE( 570.04), SIMDE_FLOAT16_VALUE( 866.16)}, + { UINT16_MAX, UINT16_MAX, UINT16_C( 0), UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( -190.21), SIMDE_FLOAT16_VALUE( 504.54), SIMDE_FLOAT16_VALUE( 219.24), SIMDE_FLOAT16_VALUE( -723.52)}, + { UINT16_MAX, UINT16_C( 0), UINT16_C( 0), UINT16_MAX } }, + { { SIMDE_FLOAT16_VALUE( 841.66), SIMDE_FLOAT16_VALUE( -110.40), SIMDE_FLOAT16_VALUE( -593.11), SIMDE_FLOAT16_VALUE( 184.23)}, + { UINT16_C( 0), UINT16_MAX, UINT16_MAX, UINT16_C( 0) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_uint16x4_t r = simde_vclez_f16(a); + + simde_test_arm_neon_assert_equal_u16x4(r, simde_vld1_u16(test_vec[i].r)); + } + + return 0; +} + static int test_simde_vclez_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -333,6 +359,40 @@ test_simde_vclez_s64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vclezq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + uint16_t r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 259.46), SIMDE_FLOAT16_VALUE( 774.65), SIMDE_FLOAT16_VALUE( 628.16), SIMDE_FLOAT16_VALUE( 707.60), + SIMDE_FLOAT16_VALUE( -36.37), SIMDE_FLOAT16_VALUE( 73.30), SIMDE_FLOAT16_VALUE( -646.26), SIMDE_FLOAT16_VALUE( 31.51) }, + { UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), + UINT16_MAX, UINT16_C( 0), UINT16_MAX, UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( -215.26), SIMDE_FLOAT16_VALUE( -475.25), SIMDE_FLOAT16_VALUE( 570.04), SIMDE_FLOAT16_VALUE( 866.16), + SIMDE_FLOAT16_VALUE( 574.22), SIMDE_FLOAT16_VALUE( 2.51), SIMDE_FLOAT16_VALUE( -697.28), SIMDE_FLOAT16_VALUE( 552.86) }, + { UINT16_MAX, UINT16_MAX, UINT16_C( 0), UINT16_C( 0), + UINT16_C( 0), UINT16_C( 0), UINT16_MAX, UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( -190.21), SIMDE_FLOAT16_VALUE( 504.54), SIMDE_FLOAT16_VALUE( 219.24), SIMDE_FLOAT16_VALUE( -723.52), + SIMDE_FLOAT16_VALUE( 240.87), SIMDE_FLOAT16_VALUE( 846.33), SIMDE_FLOAT16_VALUE( -227.65), SIMDE_FLOAT16_VALUE( 225.48) }, + { UINT16_MAX, UINT16_C( 0), UINT16_C( 0), UINT16_MAX, + UINT16_C( 0), UINT16_C( 0), UINT16_MAX, UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( 841.66), SIMDE_FLOAT16_VALUE( -110.40), SIMDE_FLOAT16_VALUE( -593.11), SIMDE_FLOAT16_VALUE( 184.23), + SIMDE_FLOAT16_VALUE( 271.42), SIMDE_FLOAT16_VALUE( 898.23), SIMDE_FLOAT16_VALUE( 510.85), SIMDE_FLOAT16_VALUE( 990.47) }, + { UINT16_C( 0), UINT16_MAX, UINT16_MAX, UINT16_C( 0), + UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), UINT16_C( 0) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_uint16x8_t r = simde_vclezq_f16(a); + + simde_test_arm_neon_assert_equal_u16x8(r, simde_vld1q_u16(test_vec[i].r)); + } + + return 0; +} + static int test_simde_vclezq_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -805,7 +865,40 @@ test_simde_vclezs_f32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vclezh_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16_t a; + uint16_t r; + } test_vec[] = { + { SIMDE_FLOAT16_VALUE( -190.08), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( -896.69), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( -980.09), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( 545.23), + UINT16_C( 0) }, + { SIMDE_FLOAT16_VALUE( 227.24), + UINT16_C( 0) }, + { SIMDE_FLOAT16_VALUE( -169.70), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( -438.24), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( 716.84), + UINT16_C( 0) } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + uint16_t r = simde_vclezh_f16(test_vec[i].a); + simde_assert_equal_u16(r, test_vec[i].r); + } + + return 0; +} + SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vclez_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vclez_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vclez_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vclez_s8) @@ -813,6 +906,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vclez_s16) SIMDE_TEST_FUNC_LIST_ENTRY(vclez_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vclez_s64) +SIMDE_TEST_FUNC_LIST_ENTRY(vclezq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vclezq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vclezq_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vclezq_s8) @@ -823,6 +917,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vclezq_s64) SIMDE_TEST_FUNC_LIST_ENTRY(vclezd_s64) SIMDE_TEST_FUNC_LIST_ENTRY(vclezd_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vclezs_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vclezh_f16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/clt.c b/test/arm/neon/clt.c index 3fb3fa5c5..9a601377c 100644 --- a/test/arm/neon/clt.c +++ b/test/arm/neon/clt.c @@ -9,6 +9,38 @@ #include "../../../simde/arm/neon.h" #endif +static int +test_simde_vclt_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + uint16_t r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( -259.46), SIMDE_FLOAT16_VALUE( -774.65), SIMDE_FLOAT16_VALUE( 628.16), SIMDE_FLOAT16_VALUE( -707.60) }, + { SIMDE_FLOAT16_VALUE( -259.46), SIMDE_FLOAT16_VALUE( -774.65), SIMDE_FLOAT16_VALUE( 628.16), SIMDE_FLOAT16_VALUE( -992.75) }, + { UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( -215.26), SIMDE_FLOAT16_VALUE( -475.25), SIMDE_FLOAT16_VALUE( -570.04), SIMDE_FLOAT16_VALUE( -866.16) }, + { SIMDE_FLOAT16_VALUE( 466.70), SIMDE_FLOAT16_VALUE( 282.12), SIMDE_FLOAT16_VALUE( -570.04), SIMDE_FLOAT16_VALUE( -866.16) }, + { UINT16_MAX, UINT16_MAX, UINT16_C( 0), UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( -190.21), SIMDE_FLOAT16_VALUE( 504.54), SIMDE_FLOAT16_VALUE( 219.24), SIMDE_FLOAT16_VALUE( -723.52) }, + { SIMDE_FLOAT16_VALUE( 342.57), SIMDE_FLOAT16_VALUE( 504.54), SIMDE_FLOAT16_VALUE( 219.24), SIMDE_FLOAT16_VALUE( -166.34) }, + { UINT16_MAX, UINT16_C( 0), UINT16_C( 0), UINT16_MAX } }, + { { SIMDE_FLOAT16_VALUE( 841.66), SIMDE_FLOAT16_VALUE( 110.40), SIMDE_FLOAT16_VALUE( 593.11), SIMDE_FLOAT16_VALUE( 184.23) }, + { SIMDE_FLOAT16_VALUE( 841.66), SIMDE_FLOAT16_VALUE( 572.39), SIMDE_FLOAT16_VALUE( 594.22), SIMDE_FLOAT16_VALUE( -491.55) }, + { UINT16_C( 0), UINT16_MAX, UINT16_MAX, UINT16_C( 0) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_uint16x4_t r = simde_vclt_f16(a, b); + + simde_test_arm_neon_assert_equal_u16x4(r, simde_vld1_u16(test_vec[i].r)); + } + + return 0; +} + static int test_simde_vclt_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -679,6 +711,50 @@ test_simde_vclt_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vcltq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + uint16_t r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( -259.46), SIMDE_FLOAT16_VALUE( -774.65), SIMDE_FLOAT16_VALUE( 628.16), SIMDE_FLOAT16_VALUE( -707.60), + SIMDE_FLOAT16_VALUE( 36.37), SIMDE_FLOAT16_VALUE( 73.30), SIMDE_FLOAT16_VALUE( 646.26), SIMDE_FLOAT16_VALUE( -31.51) }, + { SIMDE_FLOAT16_VALUE( -259.46), SIMDE_FLOAT16_VALUE( -774.65), SIMDE_FLOAT16_VALUE( 628.16), SIMDE_FLOAT16_VALUE( -992.75), + SIMDE_FLOAT16_VALUE( 127.08), SIMDE_FLOAT16_VALUE( 51.79), SIMDE_FLOAT16_VALUE( 966.55), SIMDE_FLOAT16_VALUE( -31.51) }, + { UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), + UINT16_MAX, UINT16_C( 0), UINT16_MAX, UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( -215.26), SIMDE_FLOAT16_VALUE( -475.25), SIMDE_FLOAT16_VALUE( -570.04), SIMDE_FLOAT16_VALUE( -866.16), + SIMDE_FLOAT16_VALUE( -574.22), SIMDE_FLOAT16_VALUE( -2.51), SIMDE_FLOAT16_VALUE( -697.28), SIMDE_FLOAT16_VALUE( 552.86) }, + { SIMDE_FLOAT16_VALUE( 466.70), SIMDE_FLOAT16_VALUE( 282.12), SIMDE_FLOAT16_VALUE( -570.04), SIMDE_FLOAT16_VALUE( -866.16), + SIMDE_FLOAT16_VALUE( -574.22), SIMDE_FLOAT16_VALUE( -2.51), SIMDE_FLOAT16_VALUE( -310.68), SIMDE_FLOAT16_VALUE( -504.85) }, + { UINT16_MAX, UINT16_MAX, UINT16_C( 0), UINT16_C( 0), + UINT16_C( 0), UINT16_C( 0), UINT16_MAX, UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( -190.21), SIMDE_FLOAT16_VALUE( 504.54), SIMDE_FLOAT16_VALUE( 219.24), SIMDE_FLOAT16_VALUE( -723.52), + SIMDE_FLOAT16_VALUE( -240.87), SIMDE_FLOAT16_VALUE( 846.33), SIMDE_FLOAT16_VALUE( -227.65), SIMDE_FLOAT16_VALUE( -225.48) }, + { SIMDE_FLOAT16_VALUE( 342.57), SIMDE_FLOAT16_VALUE( 504.54), SIMDE_FLOAT16_VALUE( 219.24), SIMDE_FLOAT16_VALUE( -166.34), + SIMDE_FLOAT16_VALUE( -280.95), SIMDE_FLOAT16_VALUE( -30.91), SIMDE_FLOAT16_VALUE( 705.25), SIMDE_FLOAT16_VALUE( -225.48) }, + { UINT16_MAX, UINT16_C( 0), UINT16_C( 0), UINT16_MAX, + UINT16_C( 0), UINT16_C( 0), UINT16_MAX, UINT16_C( 0) } }, + { { SIMDE_FLOAT16_VALUE( 841.66), SIMDE_FLOAT16_VALUE( 110.40), SIMDE_FLOAT16_VALUE( 593.11), SIMDE_FLOAT16_VALUE( 184.23), + SIMDE_FLOAT16_VALUE( 271.42), SIMDE_FLOAT16_VALUE( 898.23), SIMDE_FLOAT16_VALUE( 510.85), SIMDE_FLOAT16_VALUE( 990.47) }, + { SIMDE_FLOAT16_VALUE( 841.66), SIMDE_FLOAT16_VALUE( 572.39), SIMDE_FLOAT16_VALUE( 594.22), SIMDE_FLOAT16_VALUE( -491.55), + SIMDE_FLOAT16_VALUE( 152.78), SIMDE_FLOAT16_VALUE( 77.13), SIMDE_FLOAT16_VALUE( 510.85), SIMDE_FLOAT16_VALUE( 939.45) }, + { UINT16_C( 0), UINT16_MAX, UINT16_MAX, UINT16_C( 0), + UINT16_C( 0), UINT16_C( 0), UINT16_C( 0), UINT16_C( 0) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_uint16x8_t r = simde_vcltq_f16(a, b); + + simde_test_arm_neon_assert_equal_u16x8(r, simde_vld1q_u16(test_vec[i].r)); + } + + return 0; +} + static int test_simde_vcltq_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1562,6 +1638,47 @@ test_simde_vcltd_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vclth_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16_t a; + simde_float16_t b; + uint16_t r; + } test_vec[] = { + { SIMDE_FLOAT16_VALUE( 167.25), + SIMDE_FLOAT16_VALUE( -952.00), + UINT16_C( 0) }, + { SIMDE_FLOAT16_VALUE( -942.50), + SIMDE_FLOAT16_VALUE( 623.50), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( -1.52), + SIMDE_FLOAT16_VALUE( -118.88), + UINT16_C( 0) }, + { SIMDE_FLOAT16_VALUE( -734.00), + SIMDE_FLOAT16_VALUE( -63.38), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( -352.00), + SIMDE_FLOAT16_VALUE( 409.00), + UINT16_MAX }, + { SIMDE_FLOAT16_VALUE( 191.75), + SIMDE_FLOAT16_VALUE( -388.75), + UINT16_C( 0) }, + { SIMDE_FLOAT16_VALUE( 835.50), + SIMDE_FLOAT16_VALUE( -550.50), + UINT16_C( 0) }, + { SIMDE_FLOAT16_VALUE( -529.00), + SIMDE_FLOAT16_VALUE( -873.50), + UINT16_C( 0) } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + uint16_t r = simde_vclth_f16(test_vec[i].a, test_vec[i].b); + simde_assert_equal_u16(r, test_vec[i].r); + } + + return 0; +} + static int test_simde_vclts_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1618,6 +1735,7 @@ test_simde_vclts_f32 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vclt_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vclt_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vclt_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vclt_s8) @@ -1629,6 +1747,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vclt_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vclt_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vclt_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vcltq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vcltq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vcltq_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vcltq_s8) @@ -1644,6 +1763,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vcltd_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vcltd_s64) SIMDE_TEST_FUNC_LIST_ENTRY(vcltd_u64) SIMDE_TEST_FUNC_LIST_ENTRY(vclts_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vclth_f16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/combine.c b/test/arm/neon/combine.c index 99c8af690..88ac3a994 100644 --- a/test/arm/neon/combine.c +++ b/test/arm/neon/combine.c @@ -3,6 +3,58 @@ #include "test-neon.h" #include "../../../simde/arm/neon/combine.h" +static int +test_simde_vcombine_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( -49.28), SIMDE_FLOAT16_VALUE( -109.00), SIMDE_FLOAT16_VALUE( -626.50), SIMDE_FLOAT16_VALUE( -567.00) }, + { SIMDE_FLOAT16_VALUE( -178.88), SIMDE_FLOAT16_VALUE( 10.22), SIMDE_FLOAT16_VALUE( 976.50), SIMDE_FLOAT16_VALUE( -31.19) }, + { SIMDE_FLOAT16_VALUE( -49.28), SIMDE_FLOAT16_VALUE( -109.00), SIMDE_FLOAT16_VALUE( -626.50), SIMDE_FLOAT16_VALUE( -567.00), + SIMDE_FLOAT16_VALUE( -178.88), SIMDE_FLOAT16_VALUE( 10.22), SIMDE_FLOAT16_VALUE( 976.50), SIMDE_FLOAT16_VALUE( -31.19) } }, + { { SIMDE_FLOAT16_VALUE( -226.00), SIMDE_FLOAT16_VALUE( -520.50), SIMDE_FLOAT16_VALUE( -252.38), SIMDE_FLOAT16_VALUE( -407.50) }, + { SIMDE_FLOAT16_VALUE( 89.44), SIMDE_FLOAT16_VALUE( -200.50), SIMDE_FLOAT16_VALUE( -439.75), SIMDE_FLOAT16_VALUE( -450.75) }, + { SIMDE_FLOAT16_VALUE( -226.00), SIMDE_FLOAT16_VALUE( -520.50), SIMDE_FLOAT16_VALUE( -252.38), SIMDE_FLOAT16_VALUE( -407.50), + SIMDE_FLOAT16_VALUE( 89.44), SIMDE_FLOAT16_VALUE( -200.50), SIMDE_FLOAT16_VALUE( -439.75), SIMDE_FLOAT16_VALUE( -450.75) } }, + { { SIMDE_FLOAT16_VALUE( -833.00), SIMDE_FLOAT16_VALUE( -714.00), SIMDE_FLOAT16_VALUE( 428.50), SIMDE_FLOAT16_VALUE( 871.50) }, + { SIMDE_FLOAT16_VALUE( -157.12), SIMDE_FLOAT16_VALUE( 972.50), SIMDE_FLOAT16_VALUE( 298.75), SIMDE_FLOAT16_VALUE( -919.50) }, + { SIMDE_FLOAT16_VALUE( -833.00), SIMDE_FLOAT16_VALUE( -714.00), SIMDE_FLOAT16_VALUE( 428.50), SIMDE_FLOAT16_VALUE( 871.50), + SIMDE_FLOAT16_VALUE( -157.12), SIMDE_FLOAT16_VALUE( 972.50), SIMDE_FLOAT16_VALUE( 298.75), SIMDE_FLOAT16_VALUE( -919.50) } }, + { { SIMDE_FLOAT16_VALUE( 488.00), SIMDE_FLOAT16_VALUE( 112.56), SIMDE_FLOAT16_VALUE( 58.66), SIMDE_FLOAT16_VALUE( 879.50) }, + { SIMDE_FLOAT16_VALUE( 129.00), SIMDE_FLOAT16_VALUE( -858.50), SIMDE_FLOAT16_VALUE( -133.88), SIMDE_FLOAT16_VALUE( -920.50) }, + { SIMDE_FLOAT16_VALUE( 488.00), SIMDE_FLOAT16_VALUE( 112.56), SIMDE_FLOAT16_VALUE( 58.66), SIMDE_FLOAT16_VALUE( 879.50), + SIMDE_FLOAT16_VALUE( 129.00), SIMDE_FLOAT16_VALUE( -858.50), SIMDE_FLOAT16_VALUE( -133.88), SIMDE_FLOAT16_VALUE( -920.50) } }, + { { SIMDE_FLOAT16_VALUE( 32.59), SIMDE_FLOAT16_VALUE( 239.50), SIMDE_FLOAT16_VALUE( -487.50), SIMDE_FLOAT16_VALUE( 853.50) }, + { SIMDE_FLOAT16_VALUE( -750.50), SIMDE_FLOAT16_VALUE( -510.75), SIMDE_FLOAT16_VALUE( -177.50), SIMDE_FLOAT16_VALUE( 23.77) }, + { SIMDE_FLOAT16_VALUE( 32.59), SIMDE_FLOAT16_VALUE( 239.50), SIMDE_FLOAT16_VALUE( -487.50), SIMDE_FLOAT16_VALUE( 853.50), + SIMDE_FLOAT16_VALUE( -750.50), SIMDE_FLOAT16_VALUE( -510.75), SIMDE_FLOAT16_VALUE( -177.50), SIMDE_FLOAT16_VALUE( 23.77) } }, + { { SIMDE_FLOAT16_VALUE( -31.45), SIMDE_FLOAT16_VALUE( 570.00), SIMDE_FLOAT16_VALUE( 616.00), SIMDE_FLOAT16_VALUE( -942.00) }, + { SIMDE_FLOAT16_VALUE( -630.50), SIMDE_FLOAT16_VALUE( -823.50), SIMDE_FLOAT16_VALUE( -392.75), SIMDE_FLOAT16_VALUE( -463.25) }, + { SIMDE_FLOAT16_VALUE( -31.45), SIMDE_FLOAT16_VALUE( 570.00), SIMDE_FLOAT16_VALUE( 616.00), SIMDE_FLOAT16_VALUE( -942.00), + SIMDE_FLOAT16_VALUE( -630.50), SIMDE_FLOAT16_VALUE( -823.50), SIMDE_FLOAT16_VALUE( -392.75), SIMDE_FLOAT16_VALUE( -463.25) } }, + { { SIMDE_FLOAT16_VALUE( -537.50), SIMDE_FLOAT16_VALUE( -964.50), SIMDE_FLOAT16_VALUE( -592.00), SIMDE_FLOAT16_VALUE( 305.50) }, + { SIMDE_FLOAT16_VALUE( -992.00), SIMDE_FLOAT16_VALUE( 707.00), SIMDE_FLOAT16_VALUE( 386.00), SIMDE_FLOAT16_VALUE( 496.00) }, + { SIMDE_FLOAT16_VALUE( -537.50), SIMDE_FLOAT16_VALUE( -964.50), SIMDE_FLOAT16_VALUE( -592.00), SIMDE_FLOAT16_VALUE( 305.50), + SIMDE_FLOAT16_VALUE( -992.00), SIMDE_FLOAT16_VALUE( 707.00), SIMDE_FLOAT16_VALUE( 386.00), SIMDE_FLOAT16_VALUE( 496.00) } }, + { { SIMDE_FLOAT16_VALUE( -180.50), SIMDE_FLOAT16_VALUE( -555.50), SIMDE_FLOAT16_VALUE( 375.50), SIMDE_FLOAT16_VALUE( 948.50) }, + { SIMDE_FLOAT16_VALUE( -413.75), SIMDE_FLOAT16_VALUE( -758.50), SIMDE_FLOAT16_VALUE( -972.00), SIMDE_FLOAT16_VALUE( 619.00) }, + { SIMDE_FLOAT16_VALUE( -180.50), SIMDE_FLOAT16_VALUE( -555.50), SIMDE_FLOAT16_VALUE( 375.50), SIMDE_FLOAT16_VALUE( 948.50), + SIMDE_FLOAT16_VALUE( -413.75), SIMDE_FLOAT16_VALUE( -758.50), SIMDE_FLOAT16_VALUE( -972.00), SIMDE_FLOAT16_VALUE( 619.00) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_float16x8_t r = simde_vcombine_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vcombine_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -597,6 +649,7 @@ test_simde_vcombine_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vcombine_s8) diff --git a/test/arm/neon/cvt.c b/test/arm/neon/cvt.c index 04a27707e..1fd75a297 100644 --- a/test/arm/neon/cvt.c +++ b/test/arm/neon/cvt.c @@ -1552,6 +1552,240 @@ test_simde_vcvt_f64_f32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vcvtas_s32_f32 (SIMDE_MUNIT_TEST_ARGS) { + static const struct { + simde_float32 a; + int32_t r; + } test_vec[] = { + #if !defined(SIMDE_FAST_CONVERSION_RANGE) + { SIMDE_MATH_NANF, + INT32_C( 0) }, + { HEDLEY_STATIC_CAST(simde_float32, INT32_MAX) + SIMDE_FLOAT32_C(1000.0), + INT32_MAX }, + { HEDLEY_STATIC_CAST(simde_float32, INT32_MIN) - SIMDE_FLOAT32_C(1000.0), + INT32_MIN }, + #endif + { SIMDE_FLOAT32_C( 550.19), + INT32_C( 550) }, + { SIMDE_FLOAT32_C( -14.71), + -INT32_C( 15) }, + { SIMDE_FLOAT32_C( 735.91), + INT32_C( 736) }, + { SIMDE_FLOAT32_C( 355.60), + INT32_C( 356) }, + { SIMDE_FLOAT32_C( -850.41), + -INT32_C( 850) }, + { SIMDE_FLOAT32_C( -934.68), + -INT32_C( 935) }, + { SIMDE_FLOAT32_C( -125.50), + -INT32_C( 126) }, + { SIMDE_FLOAT32_C( 784.50), + INT32_C( 785) } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32 a = test_vec[i].a; + int32_t r = simde_vcvtas_s32_f32(a); + + simde_assert_equal_i32(r, test_vec[i].r); + } + + return 0; +} + +static int +test_simde_vcvtas_u32_f32 (SIMDE_MUNIT_TEST_ARGS) { + static const struct { + simde_float32 a; + uint32_t r; + } test_vec[] = { + #if !defined(SIMDE_FAST_CONVERSION_RANGE) + { SIMDE_MATH_NANF, + UINT32_C( 0) }, + { HEDLEY_STATIC_CAST(simde_float32, UINT32_MAX) + SIMDE_FLOAT32_C(1000.0), + UINT32_MAX }, + #endif + { SIMDE_FLOAT32_C( 550.19), + UINT32_C( 550) }, + { SIMDE_FLOAT32_C( -14.71), + UINT32_C( 0) }, + { SIMDE_FLOAT32_C( 735.91), + UINT32_C( 736) }, + { SIMDE_FLOAT32_C( 355.60), + UINT32_C( 356) }, + { SIMDE_FLOAT32_C( -850.41), + UINT32_C( 0) }, + { SIMDE_FLOAT32_C( -934.68), + UINT32_C( 0) }, + { SIMDE_FLOAT32_C( -125.28), + UINT32_C( 0) }, + { SIMDE_FLOAT32_C( 784.80), + UINT32_C( 785) } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32 a = test_vec[i].a; + uint32_t r = simde_vcvtas_u32_f32(a); + + simde_assert_equal_u32(r, test_vec[i].r); + } + + return 0; +} + +static int +test_simde_vcvta_s32_f32 (SIMDE_MUNIT_TEST_ARGS) { + static const struct { + simde_float32 a[2]; + int32_t r[2]; + } test_vec[] = { + #if !defined(SIMDE_FAST_CONVERSION_RANGE) + { { HEDLEY_STATIC_CAST(simde_float32, INT32_MAX) + SIMDE_FLOAT32_C(1000.0), + HEDLEY_STATIC_CAST(simde_float32, INT32_MIN) - SIMDE_FLOAT32_C(1000.0) }, + { INT32_MAX, INT32_MIN } }, + { { SIMDE_MATH_NANF, SIMDE_MATH_INFINITYF }, + { INT32_C( 0), INT32_MAX } }, + #endif + { { SIMDE_FLOAT32_C( 396.3), SIMDE_FLOAT32_C( -246.90) }, + { INT32_C( 396), -INT32_C( 247) } }, + { { SIMDE_FLOAT32_C( 241.51), SIMDE_FLOAT32_C( 602.56) }, + { INT32_C( 242), INT32_C( 603) } }, + { { SIMDE_FLOAT32_C( -106.85), SIMDE_FLOAT32_C( -566.67) }, + { -INT32_C( 107), -INT32_C( 567) } }, + { { SIMDE_FLOAT32_C( 463.44), SIMDE_FLOAT32_C( 539.86) }, + { INT32_C( 463), INT32_C( 540) } }, + { { SIMDE_FLOAT32_C( -550.41), SIMDE_FLOAT32_C( 982.91) }, + { -INT32_C( 550), INT32_C( 983) } }, + { { SIMDE_FLOAT32_C( 499.92), SIMDE_FLOAT32_C( -727.55) }, + { INT32_C( 500), -INT32_C( 728) } }, + { { SIMDE_FLOAT32_C( -713.41), SIMDE_FLOAT32_C( 713.10) }, + { -INT32_C( 713), INT32_C( 713) } }, + { { SIMDE_FLOAT32_C( -998.69), SIMDE_FLOAT32_C( -409.99) }, + { -INT32_C( 999), -INT32_C( 410) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x2_t a = simde_vld1_f32(test_vec[i].a); + simde_int32x2_t r = simde_vcvta_s32_f32(a); + + simde_test_arm_neon_assert_equal_i32x2(r, simde_vld1_s32(test_vec[i].r)); + } + + return 0; +} + +static int +test_simde_vcvta_u32_f32 (SIMDE_MUNIT_TEST_ARGS) { + static const struct { + simde_float32 a[2]; + uint32_t r[2]; + } test_vec[] = { + #if !defined(SIMDE_FAST_CONVERSION_RANGE) + { { HEDLEY_STATIC_CAST(simde_float32, UINT32_MAX) + SIMDE_FLOAT32_C(1000.0), + SIMDE_FLOAT32_C(-1000.0) }, + { UINT32_MAX, 0 } }, + { { SIMDE_MATH_NANF, SIMDE_MATH_INFINITYF }, + { UINT32_C( 0), UINT32_MAX } }, + #endif + { { SIMDE_FLOAT32_C( 396.3), SIMDE_FLOAT32_C( -246.90) }, + { UINT32_C( 396), UINT32_C( 0) } }, + { { SIMDE_FLOAT32_C( 241.51), SIMDE_FLOAT32_C( 602.56) }, + { UINT32_C( 242), UINT32_C( 603) } }, + { { SIMDE_FLOAT32_C( -106.85), SIMDE_FLOAT32_C( -566.67) }, + { UINT32_C( 0), UINT32_C( 0) } }, + { { SIMDE_FLOAT32_C( 463.44), SIMDE_FLOAT32_C( 539.86) }, + { UINT32_C( 463), UINT32_C( 540) } }, + { { SIMDE_FLOAT32_C( -550.41), SIMDE_FLOAT32_C( 982.91) }, + { UINT32_C( 0), UINT32_C( 983) } }, + { { SIMDE_FLOAT32_C( 499.92), SIMDE_FLOAT32_C( -727.55) }, + { UINT32_C( 500), UINT32_C( 0) } }, + { { SIMDE_FLOAT32_C( -713.41), SIMDE_FLOAT32_C( 713.10) }, + { UINT32_C( 0), UINT32_C( 713) } }, + { { SIMDE_FLOAT32_C( -998.69), SIMDE_FLOAT32_C( -409.99) }, + { UINT32_C( 0), UINT32_C( 0) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x2_t a = simde_vld1_f32(test_vec[i].a); + simde_uint32x2_t r = simde_vcvta_u32_f32(a); + + simde_test_arm_neon_assert_equal_u32x2(r, simde_vld1_u32(test_vec[i].r)); + } + + return 0; +} + +static int +test_simde_vcvtaq_s32_f32 (SIMDE_MUNIT_TEST_ARGS) { + static const struct { + simde_float32 a[4]; + int32_t r[4]; + } test_vec[] = { + #if !defined(SIMDE_FAST_CONVERSION_RANGE) + { { HEDLEY_STATIC_CAST(simde_float32, INT32_MAX) + SIMDE_FLOAT32_C(10000.0), HEDLEY_STATIC_CAST(simde_float32, INT32_MIN) - SIMDE_FLOAT32_C(10000.0), SIMDE_MATH_NANF, SIMDE_MATH_INFINITYF }, + { INT32_MAX, INT32_MIN, INT32_C( 0), INT32_MAX } }, + #endif + { { SIMDE_FLOAT32_C( 553.19), SIMDE_FLOAT32_C( -89.37), SIMDE_FLOAT32_C( -751.51), SIMDE_FLOAT32_C( 39.67) }, + { INT32_C( 553), -INT32_C( 89), -INT32_C( 752), INT32_C( 40) } }, + { { SIMDE_FLOAT32_C( 324.39), SIMDE_FLOAT32_C( 39.90), SIMDE_FLOAT32_C( 154.38), SIMDE_FLOAT32_C( -782.06) }, + { INT32_C( 324), INT32_C( 40), INT32_C( 154), -INT32_C( 782) } }, + { { SIMDE_FLOAT32_C( 683.78), SIMDE_FLOAT32_C( 860.43), SIMDE_FLOAT32_C( 258.08), SIMDE_FLOAT32_C( -431.46) }, + { INT32_C( 684), INT32_C( 860), INT32_C( 258), -INT32_C( 431) } }, + { { SIMDE_FLOAT32_C( 4.94), SIMDE_FLOAT32_C( -752.53), SIMDE_FLOAT32_C( 343.30), SIMDE_FLOAT32_C( -618.07) }, + { INT32_C( 5), -INT32_C( 753), INT32_C( 343), -INT32_C( 618) } }, + { { SIMDE_FLOAT32_C( -508.63), SIMDE_FLOAT32_C( 933.29), SIMDE_FLOAT32_C( 48.92), SIMDE_FLOAT32_C( 220.74) }, + { -INT32_C( 509), INT32_C( 933), INT32_C( 49), INT32_C( 221) } }, + { { SIMDE_FLOAT32_C( -447.64), SIMDE_FLOAT32_C( -181.80), SIMDE_FLOAT32_C( -962.01), SIMDE_FLOAT32_C( 914.94) }, + { -INT32_C( 448), -INT32_C( 182), -INT32_C( 962), INT32_C( 915) } }, + { { SIMDE_FLOAT32_C( -193.26), SIMDE_FLOAT32_C( 71.12), SIMDE_FLOAT32_C( 342.76), SIMDE_FLOAT32_C( -390.07) }, + { -INT32_C( 193), INT32_C( 71), INT32_C( 343), -INT32_C( 390) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t a = simde_vld1q_f32(test_vec[i].a); + simde_int32x4_t r = simde_vcvtaq_s32_f32(a); + simde_test_arm_neon_assert_equal_i32x4(r, simde_vld1q_s32(test_vec[i].r)); + } + + return 0; +} + +static int +test_simde_vcvtaq_u32_f32 (SIMDE_MUNIT_TEST_ARGS) { + static const struct { + simde_float32 a[4]; + uint32_t r[4]; + } test_vec[] = { + #if !defined(SIMDE_FAST_CONVERSION_RANGE) + { { HEDLEY_STATIC_CAST(simde_float32, UINT32_MAX) + SIMDE_FLOAT32_C(10000.0), SIMDE_FLOAT32_C(-10000.0), SIMDE_MATH_NANF, SIMDE_MATH_INFINITYF }, + { UINT32_MAX, UINT32_C( 0), UINT32_C( 0), UINT32_MAX } }, + #endif + { { SIMDE_FLOAT32_C( 553.19), SIMDE_FLOAT32_C( -89.37), SIMDE_FLOAT32_C( -751.51), SIMDE_FLOAT32_C( 39.67) }, + { UINT32_C( 553), UINT32_C( 0), UINT32_C( 0), UINT32_C( 40) } }, + { { SIMDE_FLOAT32_C( 324.39), SIMDE_FLOAT32_C( 39.90), SIMDE_FLOAT32_C( 154.38), SIMDE_FLOAT32_C( -782.06) }, + { UINT32_C( 324), UINT32_C( 40), UINT32_C( 154), UINT32_C( 0) } }, + { { SIMDE_FLOAT32_C( 683.78), SIMDE_FLOAT32_C( 860.43), SIMDE_FLOAT32_C( 258.08), SIMDE_FLOAT32_C( -431.46) }, + { UINT32_C( 684), UINT32_C( 860), UINT32_C( 258), UINT32_C( 0) } }, + { { SIMDE_FLOAT32_C( 4.94), SIMDE_FLOAT32_C( -752.53), SIMDE_FLOAT32_C( 343.30), SIMDE_FLOAT32_C( -618.07) }, + { UINT32_C( 5), UINT32_C( 0), UINT32_C( 343), UINT32_C( 0) } }, + { { SIMDE_FLOAT32_C( -508.63), SIMDE_FLOAT32_C( 933.29), SIMDE_FLOAT32_C( 48.92), SIMDE_FLOAT32_C( 220.74) }, + { UINT32_C( 0), UINT32_C( 933), UINT32_C( 49), UINT32_C( 221) } }, + { { SIMDE_FLOAT32_C( -447.64), SIMDE_FLOAT32_C( -181.80), SIMDE_FLOAT32_C( -962.01), SIMDE_FLOAT32_C( 914.94) }, + { UINT32_C( 0), UINT32_C( 0), UINT32_C( 0), UINT32_C( 915) } }, + { { SIMDE_FLOAT32_C( -193.26), SIMDE_FLOAT32_C( 71.12), SIMDE_FLOAT32_C( 342.76), SIMDE_FLOAT32_C( -390.07) }, + { UINT32_C( 0), UINT32_C( 71), UINT32_C( 343), UINT32_C( 0) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t a = simde_vld1q_f32(test_vec[i].a); + simde_uint32x4_t r = simde_vcvtaq_u32_f32(a); + simde_test_arm_neon_assert_equal_u32x4(r, simde_vld1q_u32(test_vec[i].r)); + } + + return 0; +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vcvts_s32_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vcvtd_s64_f64) @@ -1589,6 +1823,13 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vcvtq_f64_u64) SIMDE_TEST_FUNC_LIST_ENTRY(vcvt_f16_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vcvt_f32_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vcvt_f64_f32) + +SIMDE_TEST_FUNC_LIST_ENTRY(vcvtas_s32_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvtas_u32_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvta_s32_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvta_u32_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvtaq_s32_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vcvtaq_u32_f32) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/div.c b/test/arm/neon/div.c new file mode 100644 index 000000000..161acff77 --- /dev/null +++ b/test/arm/neon/div.c @@ -0,0 +1,115 @@ +#define SIMDE_TEST_ARM_NEON_INSN div + +#include "test-neon.h" +#include "../../../simde/arm/neon/div.h" + +static int +test_simde_vdiv_f32 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float32 a[2]; + simde_float32 b[2]; + simde_float32 r[2]; + } test_vec[] = { + { { SIMDE_FLOAT32_C(-246.61), SIMDE_FLOAT32_C(-792.20) }, + { SIMDE_FLOAT32_C(747.10), SIMDE_FLOAT32_C(-128.92) }, + { SIMDE_FLOAT32_C(-0.33), SIMDE_FLOAT32_C(6.14) } }, + { { SIMDE_FLOAT32_C(424.59), SIMDE_FLOAT32_C(-797.13) }, + { SIMDE_FLOAT32_C(-210.37), SIMDE_FLOAT32_C(-738.57) }, + { SIMDE_FLOAT32_C(-2.02), SIMDE_FLOAT32_C(1.08) } }, + { { SIMDE_FLOAT32_C(-681.72), SIMDE_FLOAT32_C(541.25) }, + { SIMDE_FLOAT32_C(568.84), SIMDE_FLOAT32_C(-919.64) }, + { SIMDE_FLOAT32_C(-1.20), SIMDE_FLOAT32_C(-0.59) } }, + { { SIMDE_FLOAT32_C(880.97), SIMDE_FLOAT32_C(457.69) }, + { SIMDE_FLOAT32_C(-25.21), SIMDE_FLOAT32_C(-20.82) }, + { SIMDE_FLOAT32_C(-34.95), SIMDE_FLOAT32_C(-21.98) } }, + { { SIMDE_FLOAT32_C(709.87), SIMDE_FLOAT32_C(-254.84) }, + { SIMDE_FLOAT32_C(202.11), SIMDE_FLOAT32_C(-932.42) }, + { SIMDE_FLOAT32_C(3.51), SIMDE_FLOAT32_C(0.27) } }, + { { SIMDE_FLOAT32_C(-421.37), SIMDE_FLOAT32_C(-299.43) }, + { SIMDE_FLOAT32_C(260.81), SIMDE_FLOAT32_C(497.12) }, + { SIMDE_FLOAT32_C(-1.62), SIMDE_FLOAT32_C(-0.60) } }, + { { SIMDE_FLOAT32_C(495.09), SIMDE_FLOAT32_C(-18.59) }, + { SIMDE_FLOAT32_C(-972.83), SIMDE_FLOAT32_C(973.15) }, + { SIMDE_FLOAT32_C(-0.51), SIMDE_FLOAT32_C(-0.02) } }, + { { SIMDE_FLOAT32_C(-968.48), SIMDE_FLOAT32_C(-739.00) }, + { SIMDE_FLOAT32_C(224.68), SIMDE_FLOAT32_C(-500.16) }, + { SIMDE_FLOAT32_C(-4.31), SIMDE_FLOAT32_C(1.48) } }, + { { SIMDE_FLOAT32_C(706.64), SIMDE_FLOAT32_C(440.83) }, + { SIMDE_FLOAT32_C(-697.78), SIMDE_FLOAT32_C(784.30) }, + { SIMDE_FLOAT32_C(-1.01), SIMDE_FLOAT32_C(0.56) } }, + { { SIMDE_FLOAT32_C(171.08), SIMDE_FLOAT32_C(-82.45) }, + { SIMDE_FLOAT32_C(-948.90), SIMDE_FLOAT32_C(-438.40) }, + { SIMDE_FLOAT32_C(-0.18), SIMDE_FLOAT32_C(0.19) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x2_t a, b, r; + + a = simde_vld1_f32(test_vec[i].a); + b = simde_vld1_f32(test_vec[i].b); + r = simde_vdiv_f32(a, b); + + simde_test_arm_neon_assert_equal_f32x2(r, simde_vld1_f32(test_vec[i].r), 1); + } + + return 0; +} + +static int +test_simde_vdivq_f32 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float32 a[4]; + simde_float32 b[4]; + simde_float32 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C(690.14), SIMDE_FLOAT32_C(72.00), SIMDE_FLOAT32_C(-847.46), SIMDE_FLOAT32_C(224.05) }, + { SIMDE_FLOAT32_C(-16.25), SIMDE_FLOAT32_C(-468.95), SIMDE_FLOAT32_C(219.70), SIMDE_FLOAT32_C(-994.83) }, + { SIMDE_FLOAT32_C(-42.46), SIMDE_FLOAT32_C(-0.15), SIMDE_FLOAT32_C(-3.86), SIMDE_FLOAT32_C(-0.23) } }, + { { SIMDE_FLOAT32_C(15.11), SIMDE_FLOAT32_C(-51.64), SIMDE_FLOAT32_C(-267.55), SIMDE_FLOAT32_C(-349.21) }, + { SIMDE_FLOAT32_C(566.36), SIMDE_FLOAT32_C(187.53), SIMDE_FLOAT32_C(-201.93), SIMDE_FLOAT32_C(69.88) }, + { SIMDE_FLOAT32_C(0.03), SIMDE_FLOAT32_C(-0.28), SIMDE_FLOAT32_C(1.32), SIMDE_FLOAT32_C(-5.00) } }, + { { SIMDE_FLOAT32_C(-421.47), SIMDE_FLOAT32_C(252.11), SIMDE_FLOAT32_C(-360.83), SIMDE_FLOAT32_C(201.92) }, + { SIMDE_FLOAT32_C(666.79), SIMDE_FLOAT32_C(-509.75), SIMDE_FLOAT32_C(-218.04), SIMDE_FLOAT32_C(759.52) }, + { SIMDE_FLOAT32_C(-0.63), SIMDE_FLOAT32_C(-0.49), SIMDE_FLOAT32_C(1.65), SIMDE_FLOAT32_C(0.27) } }, + { { SIMDE_FLOAT32_C(-613.29), SIMDE_FLOAT32_C(-320.60), SIMDE_FLOAT32_C(854.70), SIMDE_FLOAT32_C(623.67) }, + { SIMDE_FLOAT32_C(150.20), SIMDE_FLOAT32_C(965.65), SIMDE_FLOAT32_C(-80.16), SIMDE_FLOAT32_C(-415.88) }, + { SIMDE_FLOAT32_C(-4.08), SIMDE_FLOAT32_C(-0.33), SIMDE_FLOAT32_C(-10.66), SIMDE_FLOAT32_C(-1.50) } }, + { { SIMDE_FLOAT32_C(-251.13), SIMDE_FLOAT32_C(405.25), SIMDE_FLOAT32_C(-400.23), SIMDE_FLOAT32_C(772.23) }, + { SIMDE_FLOAT32_C(-781.87), SIMDE_FLOAT32_C(724.61), SIMDE_FLOAT32_C(517.90), SIMDE_FLOAT32_C(245.11) }, + { SIMDE_FLOAT32_C(0.32), SIMDE_FLOAT32_C(0.56), SIMDE_FLOAT32_C(-0.77), SIMDE_FLOAT32_C(3.15) } }, + { { SIMDE_FLOAT32_C(-107.85), SIMDE_FLOAT32_C(-479.61), SIMDE_FLOAT32_C(-32.07), SIMDE_FLOAT32_C(-586.53) }, + { SIMDE_FLOAT32_C(421.93), SIMDE_FLOAT32_C(-304.44), SIMDE_FLOAT32_C(327.16), SIMDE_FLOAT32_C(559.89) }, + { SIMDE_FLOAT32_C(-0.26), SIMDE_FLOAT32_C(1.58), SIMDE_FLOAT32_C(-0.10), SIMDE_FLOAT32_C(-1.05) } }, + { { SIMDE_FLOAT32_C(-209.46), SIMDE_FLOAT32_C(4.97), SIMDE_FLOAT32_C(904.66), SIMDE_FLOAT32_C(-360.68) }, + { SIMDE_FLOAT32_C(61.47), SIMDE_FLOAT32_C(-621.09), SIMDE_FLOAT32_C(221.91), SIMDE_FLOAT32_C(745.82) }, + { SIMDE_FLOAT32_C(-3.41), SIMDE_FLOAT32_C(-0.01), SIMDE_FLOAT32_C(4.08), SIMDE_FLOAT32_C(-0.48) } }, + { { SIMDE_FLOAT32_C(-816.44), SIMDE_FLOAT32_C(-202.10), SIMDE_FLOAT32_C(-276.32), SIMDE_FLOAT32_C(-588.56) }, + { SIMDE_FLOAT32_C(-218.16), SIMDE_FLOAT32_C(-289.94), SIMDE_FLOAT32_C(-932.73), SIMDE_FLOAT32_C(498.04) }, + { SIMDE_FLOAT32_C(3.74), SIMDE_FLOAT32_C(0.70), SIMDE_FLOAT32_C(0.30), SIMDE_FLOAT32_C(-1.18) } }, + { { SIMDE_FLOAT32_C(231.50), SIMDE_FLOAT32_C(9.60), SIMDE_FLOAT32_C(-307.81), SIMDE_FLOAT32_C(581.74) }, + { SIMDE_FLOAT32_C(-886.78), SIMDE_FLOAT32_C(-210.27), SIMDE_FLOAT32_C(-522.74), SIMDE_FLOAT32_C(-495.13) }, + { SIMDE_FLOAT32_C(-0.26), SIMDE_FLOAT32_C(-0.05), SIMDE_FLOAT32_C(0.59), SIMDE_FLOAT32_C(-1.17) } }, + { { SIMDE_FLOAT32_C(-173.84), SIMDE_FLOAT32_C(980.62), SIMDE_FLOAT32_C(-409.94), SIMDE_FLOAT32_C(616.98) }, + { SIMDE_FLOAT32_C(152.98), SIMDE_FLOAT32_C(820.61), SIMDE_FLOAT32_C(-490.46), SIMDE_FLOAT32_C(539.45) }, + { SIMDE_FLOAT32_C(-1.14), SIMDE_FLOAT32_C(1.19), SIMDE_FLOAT32_C(0.84), SIMDE_FLOAT32_C(1.14) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t a, b, r; + + a = simde_vld1q_f32(test_vec[i].a); + b = simde_vld1q_f32(test_vec[i].b); + r = simde_vdivq_f32(a, b); + + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; +} + +SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vdiv_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vdivq_f32) +SIMDE_TEST_FUNC_LIST_END + +#include "test-neon-footer.h" diff --git a/test/arm/neon/ext.c b/test/arm/neon/ext.c index 4c856b572..b5f1d8f80 100644 --- a/test/arm/neon/ext.c +++ b/test/arm/neon/ext.c @@ -687,6 +687,94 @@ test_simde_vext_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vextq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + int n; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00), + SIMDE_FLOAT16_VALUE( -918.50), SIMDE_FLOAT16_VALUE( -717.00), SIMDE_FLOAT16_VALUE( -823.00), SIMDE_FLOAT16_VALUE( -581.00) }, + { SIMDE_FLOAT16_VALUE( 684.00), SIMDE_FLOAT16_VALUE( 563.00), SIMDE_FLOAT16_VALUE( 15.31), SIMDE_FLOAT16_VALUE( -786.50), + SIMDE_FLOAT16_VALUE( 891.00), SIMDE_FLOAT16_VALUE( 859.50), SIMDE_FLOAT16_VALUE( 387.25), SIMDE_FLOAT16_VALUE( 969.00) }, + INT32_C( 0), + { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00), + SIMDE_FLOAT16_VALUE( -918.50), SIMDE_FLOAT16_VALUE( -717.00), SIMDE_FLOAT16_VALUE( -823.00), SIMDE_FLOAT16_VALUE( -581.00) }}, + { { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 29.20), SIMDE_FLOAT16_VALUE( -856.00), SIMDE_FLOAT16_VALUE( 267.25), + SIMDE_FLOAT16_VALUE( -302.00), SIMDE_FLOAT16_VALUE( 526.50), SIMDE_FLOAT16_VALUE( 713.00), SIMDE_FLOAT16_VALUE( -14.83) }, + { SIMDE_FLOAT16_VALUE( -848.00), SIMDE_FLOAT16_VALUE( 815.50), SIMDE_FLOAT16_VALUE( -672.50), SIMDE_FLOAT16_VALUE( 274.50), + SIMDE_FLOAT16_VALUE( 933.00), SIMDE_FLOAT16_VALUE( -952.50), SIMDE_FLOAT16_VALUE( 426.00), SIMDE_FLOAT16_VALUE( 373.75) }, + INT32_C( 1), + { SIMDE_FLOAT16_VALUE( 29.20), SIMDE_FLOAT16_VALUE( -856.00), SIMDE_FLOAT16_VALUE( 267.25), SIMDE_FLOAT16_VALUE( -302.00), + SIMDE_FLOAT16_VALUE( 526.50), SIMDE_FLOAT16_VALUE( 713.00), SIMDE_FLOAT16_VALUE( -14.83), SIMDE_FLOAT16_VALUE( -848.00) }}, + { { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( -475.75), SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00), + SIMDE_FLOAT16_VALUE( -192.62), SIMDE_FLOAT16_VALUE( 446.50), SIMDE_FLOAT16_VALUE( -590.00), SIMDE_FLOAT16_VALUE( -508.50) }, + { SIMDE_FLOAT16_VALUE( 9.56), SIMDE_FLOAT16_VALUE( 425.25), SIMDE_FLOAT16_VALUE( -294.75), SIMDE_FLOAT16_VALUE( -99.19), + SIMDE_FLOAT16_VALUE( 284.50), SIMDE_FLOAT16_VALUE( -907.50), SIMDE_FLOAT16_VALUE( -130.00), SIMDE_FLOAT16_VALUE( -722.00) }, + INT32_C( 2), + { SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00), SIMDE_FLOAT16_VALUE( -192.62), SIMDE_FLOAT16_VALUE( 446.50), + SIMDE_FLOAT16_VALUE( -590.00), SIMDE_FLOAT16_VALUE( -508.50), SIMDE_FLOAT16_VALUE( 9.56), SIMDE_FLOAT16_VALUE( 425.25) }}, + { { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 14.28), SIMDE_FLOAT16_VALUE( 545.00), SIMDE_FLOAT16_VALUE( 819.50), + SIMDE_FLOAT16_VALUE( -459.00), SIMDE_FLOAT16_VALUE( 258.50), SIMDE_FLOAT16_VALUE( -195.12), SIMDE_FLOAT16_VALUE( -307.00) }, + { SIMDE_FLOAT16_VALUE( 73.81), SIMDE_FLOAT16_VALUE( 132.25), SIMDE_FLOAT16_VALUE( 967.50), SIMDE_FLOAT16_VALUE( 6.60), + SIMDE_FLOAT16_VALUE( 179.88), SIMDE_FLOAT16_VALUE( 393.50), SIMDE_FLOAT16_VALUE( -619.50), SIMDE_FLOAT16_VALUE( 89.12) }, + INT32_C( 3), + { SIMDE_FLOAT16_VALUE( 819.50), SIMDE_FLOAT16_VALUE( -459.00), SIMDE_FLOAT16_VALUE( 258.50), SIMDE_FLOAT16_VALUE( -195.12), + SIMDE_FLOAT16_VALUE( -307.00), SIMDE_FLOAT16_VALUE( 73.81), SIMDE_FLOAT16_VALUE( 132.25), SIMDE_FLOAT16_VALUE( 967.50) }}, + { { SIMDE_FLOAT16_VALUE( 918.00), SIMDE_FLOAT16_VALUE( 650.00), SIMDE_FLOAT16_VALUE( 80.00), SIMDE_FLOAT16_VALUE( -275.00), + SIMDE_FLOAT16_VALUE( 96.56), SIMDE_FLOAT16_VALUE( 489.75), SIMDE_FLOAT16_VALUE( 216.50), SIMDE_FLOAT16_VALUE( -894.00) }, + { SIMDE_FLOAT16_VALUE( -85.06), SIMDE_FLOAT16_VALUE( 921.50), SIMDE_FLOAT16_VALUE( 6.98), SIMDE_FLOAT16_VALUE( -800.50), + SIMDE_FLOAT16_VALUE( -986.00), SIMDE_FLOAT16_VALUE( 877.00), SIMDE_FLOAT16_VALUE( -522.50), SIMDE_FLOAT16_VALUE( 135.75) }, + INT32_C( 4), + { SIMDE_FLOAT16_VALUE( 96.56), SIMDE_FLOAT16_VALUE( 489.75), SIMDE_FLOAT16_VALUE( 216.50), SIMDE_FLOAT16_VALUE( -894.00), + SIMDE_FLOAT16_VALUE( -85.06), SIMDE_FLOAT16_VALUE( 921.50), SIMDE_FLOAT16_VALUE( 6.98), SIMDE_FLOAT16_VALUE( -800.50) }}, + { { SIMDE_FLOAT16_VALUE( -108.69), SIMDE_FLOAT16_VALUE( -977.50), SIMDE_FLOAT16_VALUE( -44.56), SIMDE_FLOAT16_VALUE( 432.25), + SIMDE_FLOAT16_VALUE( 281.00), SIMDE_FLOAT16_VALUE( 760.00), SIMDE_FLOAT16_VALUE( -874.50), SIMDE_FLOAT16_VALUE( -645.00) }, + { SIMDE_FLOAT16_VALUE( -107.50), SIMDE_FLOAT16_VALUE( -907.00), SIMDE_FLOAT16_VALUE( 361.50), SIMDE_FLOAT16_VALUE( -927.50), + SIMDE_FLOAT16_VALUE( 486.50), SIMDE_FLOAT16_VALUE( 742.00), SIMDE_FLOAT16_VALUE( 161.50), SIMDE_FLOAT16_VALUE( 404.25) }, + INT32_C( 5), + { SIMDE_FLOAT16_VALUE( 760.00), SIMDE_FLOAT16_VALUE( -874.50), SIMDE_FLOAT16_VALUE( -645.00), SIMDE_FLOAT16_VALUE( -107.50), + SIMDE_FLOAT16_VALUE( -907.00), SIMDE_FLOAT16_VALUE( 361.50), SIMDE_FLOAT16_VALUE( -927.50), SIMDE_FLOAT16_VALUE( 486.50) }}, + { { SIMDE_FLOAT16_VALUE( 392.00), SIMDE_FLOAT16_VALUE( -758.50), SIMDE_FLOAT16_VALUE( -870.50), SIMDE_FLOAT16_VALUE( -511.25), + SIMDE_FLOAT16_VALUE( 731.50), SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( -405.25), SIMDE_FLOAT16_VALUE( -353.75) }, + { SIMDE_FLOAT16_VALUE( 267.50), SIMDE_FLOAT16_VALUE( 602.00), SIMDE_FLOAT16_VALUE( -154.25), SIMDE_FLOAT16_VALUE( 281.75), + SIMDE_FLOAT16_VALUE( 478.75), SIMDE_FLOAT16_VALUE( 323.25), SIMDE_FLOAT16_VALUE( -582.50), SIMDE_FLOAT16_VALUE( -630.00) }, + INT32_C( 6), + { SIMDE_FLOAT16_VALUE( -405.25), SIMDE_FLOAT16_VALUE( -353.75), SIMDE_FLOAT16_VALUE( 267.50), SIMDE_FLOAT16_VALUE( 602.00), + SIMDE_FLOAT16_VALUE( -154.25), SIMDE_FLOAT16_VALUE( 281.75), SIMDE_FLOAT16_VALUE( 478.75), SIMDE_FLOAT16_VALUE( 323.25) }}, + { { SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( 372.75), SIMDE_FLOAT16_VALUE( 802.50), SIMDE_FLOAT16_VALUE( -373.00), + SIMDE_FLOAT16_VALUE( 133.12), SIMDE_FLOAT16_VALUE( 928.00), SIMDE_FLOAT16_VALUE( -18.17), SIMDE_FLOAT16_VALUE( -974.50) }, + { SIMDE_FLOAT16_VALUE( -979.50), SIMDE_FLOAT16_VALUE( -656.50), SIMDE_FLOAT16_VALUE( -902.00), SIMDE_FLOAT16_VALUE( 507.00), + SIMDE_FLOAT16_VALUE( -914.50), SIMDE_FLOAT16_VALUE( 259.50), SIMDE_FLOAT16_VALUE( -88.69), SIMDE_FLOAT16_VALUE( 477.25) }, + INT32_C( 7), + { SIMDE_FLOAT16_VALUE( -974.50), SIMDE_FLOAT16_VALUE( -979.50), SIMDE_FLOAT16_VALUE( -656.50), SIMDE_FLOAT16_VALUE( -902.00), + SIMDE_FLOAT16_VALUE( 507.00), SIMDE_FLOAT16_VALUE( -914.50), SIMDE_FLOAT16_VALUE( 259.50), SIMDE_FLOAT16_VALUE( -88.69) }}, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + int n = test_vec[i].n; + simde_float16x8_t r; + switch(n) { + case 0: r = simde_vextq_f16(a, b, 0); break; + case 1: r = simde_vextq_f16(a, b, 1); break; + case 2: r = simde_vextq_f16(a, b, 2); break; + case 3: r = simde_vextq_f16(a, b, 3); break; + case 4: r = simde_vextq_f16(a, b, 4); break; + case 5: r = simde_vextq_f16(a, b, 5); break; + case 6: r = simde_vextq_f16(a, b, 6); break; + case 7: r = simde_vextq_f16(a, b, 7); break; + default: HEDLEY_UNREACHABLE(); r = a; break; + } + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vextq_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1549,6 +1637,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vext_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vext_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vext_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vextq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vextq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vextq_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vextq_s8) diff --git a/test/arm/neon/fma.c b/test/arm/neon/fma.c index 911d3b0fb..128212d15 100644 --- a/test/arm/neon/fma.c +++ b/test/arm/neon/fma.c @@ -73,6 +73,67 @@ test_simde_vfma_f32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vfmaq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + simde_float16 c[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(31.59), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(25.00), SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(23.00), SIMDE_FLOAT16_VALUE(-12.00), SIMDE_FLOAT16_VALUE(19.80) }, + { SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(-2.20), SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(0.00) }, + { SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(0.00), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(-0.80) }, + { SIMDE_FLOAT16_VALUE(15.39), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(16.80), SIMDE_FLOAT16_VALUE(35.34), SIMDE_FLOAT16_VALUE(-9.91), SIMDE_FLOAT16_VALUE(23.00), SIMDE_FLOAT16_VALUE(-17.45), SIMDE_FLOAT16_VALUE(19.80) } }, + { { SIMDE_FLOAT16_VALUE(18.30), SIMDE_FLOAT16_VALUE(-39.00), SIMDE_FLOAT16_VALUE(-47.69), SIMDE_FLOAT16_VALUE(-43.50), SIMDE_FLOAT16_VALUE(24.20), SIMDE_FLOAT16_VALUE(11.80), SIMDE_FLOAT16_VALUE(-18.20), SIMDE_FLOAT16_VALUE(27.70) }, + { SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(-2.40), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(3.20) }, + { SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(-4.50), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(2.70), SIMDE_FLOAT16_VALUE(-0.00), SIMDE_FLOAT16_VALUE(-3.70) }, + { SIMDE_FLOAT16_VALUE(18.70), SIMDE_FLOAT16_VALUE(-48.81), SIMDE_FLOAT16_VALUE(-47.00), SIMDE_FLOAT16_VALUE(-30.91), SIMDE_FLOAT16_VALUE(9.84), SIMDE_FLOAT16_VALUE(5.32), SIMDE_FLOAT16_VALUE(-18.20), SIMDE_FLOAT16_VALUE(15.87) } }, + { { SIMDE_FLOAT16_VALUE(-27.00), SIMDE_FLOAT16_VALUE(-35.59), SIMDE_FLOAT16_VALUE(-37.59), SIMDE_FLOAT16_VALUE(31.50), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-26.59), SIMDE_FLOAT16_VALUE(13.80), SIMDE_FLOAT16_VALUE(-5.40) }, + { SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(1.60) }, + { SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(-3.70) }, + { SIMDE_FLOAT16_VALUE(-35.16), SIMDE_FLOAT16_VALUE(-15.86), SIMDE_FLOAT16_VALUE(-30.78), SIMDE_FLOAT16_VALUE(20.66), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(-25.89), SIMDE_FLOAT16_VALUE(14.18), SIMDE_FLOAT16_VALUE(-11.31) } }, + { { SIMDE_FLOAT16_VALUE(-24.30), SIMDE_FLOAT16_VALUE(-8.70), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-7.60), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(10.10), SIMDE_FLOAT16_VALUE(-49.41), SIMDE_FLOAT16_VALUE(49.59) }, + { SIMDE_FLOAT16_VALUE(1.90), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(1.80), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-4.50), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(-3.00) }, + { SIMDE_FLOAT16_VALUE(-2.40), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(-1.10), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(-3.20) }, + { SIMDE_FLOAT16_VALUE(-28.86), SIMDE_FLOAT16_VALUE(-8.74), SIMDE_FLOAT16_VALUE(-4.68), SIMDE_FLOAT16_VALUE(-11.92), SIMDE_FLOAT16_VALUE(-23.80), SIMDE_FLOAT16_VALUE(10.49), SIMDE_FLOAT16_VALUE(-43.41), SIMDE_FLOAT16_VALUE(59.19) } }, + { { SIMDE_FLOAT16_VALUE(32.19), SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(10.60), SIMDE_FLOAT16_VALUE(47.50), SIMDE_FLOAT16_VALUE(-22.59), SIMDE_FLOAT16_VALUE(-47.59), SIMDE_FLOAT16_VALUE(38.91), SIMDE_FLOAT16_VALUE(-10.10) }, + { SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(2.10) }, + { SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(-4.30), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-0.90) }, + { SIMDE_FLOAT16_VALUE(33.06), SIMDE_FLOAT16_VALUE(-11.77), SIMDE_FLOAT16_VALUE(19.84), SIMDE_FLOAT16_VALUE(54.50), SIMDE_FLOAT16_VALUE(-20.17), SIMDE_FLOAT16_VALUE(-48.59), SIMDE_FLOAT16_VALUE(34.09), SIMDE_FLOAT16_VALUE(-11.99) } }, + { { SIMDE_FLOAT16_VALUE(-16.59), SIMDE_FLOAT16_VALUE(4.30), SIMDE_FLOAT16_VALUE(45.59), SIMDE_FLOAT16_VALUE(-28.00), SIMDE_FLOAT16_VALUE(-14.90), SIMDE_FLOAT16_VALUE(-45.59), SIMDE_FLOAT16_VALUE(22.20), SIMDE_FLOAT16_VALUE(30.80) }, + { SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(4.80) }, + { SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(2.20) }, + { SIMDE_FLOAT16_VALUE(-16.91), SIMDE_FLOAT16_VALUE(-8.44), SIMDE_FLOAT16_VALUE(25.50), SIMDE_FLOAT16_VALUE(-41.44), SIMDE_FLOAT16_VALUE(-16.70), SIMDE_FLOAT16_VALUE(-36.97), SIMDE_FLOAT16_VALUE(6.67), SIMDE_FLOAT16_VALUE(41.34) } }, + { { SIMDE_FLOAT16_VALUE(34.59), SIMDE_FLOAT16_VALUE(47.00), SIMDE_FLOAT16_VALUE(-23.30), SIMDE_FLOAT16_VALUE(-23.59), SIMDE_FLOAT16_VALUE(34.81), SIMDE_FLOAT16_VALUE(14.20), SIMDE_FLOAT16_VALUE(27.20), SIMDE_FLOAT16_VALUE(16.91) }, + { SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(0.40) }, + { SIMDE_FLOAT16_VALUE(-0.40), SIMDE_FLOAT16_VALUE(-4.50), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(4.70) }, + { SIMDE_FLOAT16_VALUE(33.97), SIMDE_FLOAT16_VALUE(69.06), SIMDE_FLOAT16_VALUE(-36.84), SIMDE_FLOAT16_VALUE(-24.38), SIMDE_FLOAT16_VALUE(34.69), SIMDE_FLOAT16_VALUE(15.52), SIMDE_FLOAT16_VALUE(32.31), SIMDE_FLOAT16_VALUE(18.78) } }, + { { SIMDE_FLOAT16_VALUE(18.09), SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(-42.81), SIMDE_FLOAT16_VALUE(34.59), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(29.80), SIMDE_FLOAT16_VALUE(-46.09) }, + { SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(1.90), SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(-0.70) }, + { SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(-2.90), SIMDE_FLOAT16_VALUE(3.50) }, + { SIMDE_FLOAT16_VALUE(32.09), SIMDE_FLOAT16_VALUE(16.59), SIMDE_FLOAT16_VALUE(-49.47), SIMDE_FLOAT16_VALUE(34.00), SIMDE_FLOAT16_VALUE(7.36), SIMDE_FLOAT16_VALUE(7.07), SIMDE_FLOAT16_VALUE(25.44), SIMDE_FLOAT16_VALUE(-48.53) } }, + { { SIMDE_FLOAT16_VALUE(21.30), SIMDE_FLOAT16_VALUE(31.59), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(45.00), SIMDE_FLOAT16_VALUE(-30.59), SIMDE_FLOAT16_VALUE(-22.91), SIMDE_FLOAT16_VALUE(-26.20), SIMDE_FLOAT16_VALUE(10.00) }, + { SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-1.90) }, + { SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(-0.80) }, + { SIMDE_FLOAT16_VALUE(21.55), SIMDE_FLOAT16_VALUE(15.22), SIMDE_FLOAT16_VALUE(14.17), SIMDE_FLOAT16_VALUE(43.09), SIMDE_FLOAT16_VALUE(-34.66), SIMDE_FLOAT16_VALUE(-23.98), SIMDE_FLOAT16_VALUE(-24.38), SIMDE_FLOAT16_VALUE(11.52) } }, + { { SIMDE_FLOAT16_VALUE(22.20), SIMDE_FLOAT16_VALUE(-18.09), SIMDE_FLOAT16_VALUE(12.90), SIMDE_FLOAT16_VALUE(-21.20), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(-48.00), SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(1.60) }, + { SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(-2.40), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(0.90) }, + { SIMDE_FLOAT16_VALUE(-4.60), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(0.80) }, + { SIMDE_FLOAT16_VALUE(36.47), SIMDE_FLOAT16_VALUE(-27.69), SIMDE_FLOAT16_VALUE(14.37), SIMDE_FLOAT16_VALUE(-36.75), SIMDE_FLOAT16_VALUE(-1.34), SIMDE_FLOAT16_VALUE(-53.53), SIMDE_FLOAT16_VALUE(24.22), SIMDE_FLOAT16_VALUE(2.32) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_float16x8_t c = simde_vld1q_f16(test_vec[i].c); + simde_float16x8_t r = simde_vfmaq_f16(a, b, c); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vfmaq_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -283,6 +344,7 @@ test_simde_vfmaq_f64 (SIMDE_MUNIT_TEST_ARGS) { SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vfma_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vfmaq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vfmaq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vfma_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vfmaq_f64) diff --git a/test/arm/neon/get_high.c b/test/arm/neon/get_high.c index 1eb5760c2..66fa60fc2 100644 --- a/test/arm/neon/get_high.c +++ b/test/arm/neon/get_high.c @@ -3,6 +3,51 @@ #include "test-neon.h" #include "../../../simde/arm/neon/get_high.h" +static int +test_simde_vget_high_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00), + SIMDE_FLOAT16_VALUE( -918.50), SIMDE_FLOAT16_VALUE( -717.00), SIMDE_FLOAT16_VALUE( -823.00), SIMDE_FLOAT16_VALUE( -581.00) }, + { SIMDE_FLOAT16_VALUE( -918.50), SIMDE_FLOAT16_VALUE( -717.00), SIMDE_FLOAT16_VALUE( -823.00), SIMDE_FLOAT16_VALUE( -581.00) } }, + { { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 29.20), SIMDE_FLOAT16_VALUE( -856.00), SIMDE_FLOAT16_VALUE( 267.25), + SIMDE_FLOAT16_VALUE( -302.00), SIMDE_FLOAT16_VALUE( 526.50), SIMDE_FLOAT16_VALUE( 713.00), SIMDE_FLOAT16_VALUE( -14.83) }, + { SIMDE_FLOAT16_VALUE( -302.00), SIMDE_FLOAT16_VALUE( 526.50), SIMDE_FLOAT16_VALUE( 713.00), SIMDE_FLOAT16_VALUE( -14.83) } }, + { { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( -475.75), SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00), + SIMDE_FLOAT16_VALUE( -192.62), SIMDE_FLOAT16_VALUE( 446.50), SIMDE_FLOAT16_VALUE( -590.00), SIMDE_FLOAT16_VALUE( -508.50) }, + { SIMDE_FLOAT16_VALUE( -192.62), SIMDE_FLOAT16_VALUE( 446.50), SIMDE_FLOAT16_VALUE( -590.00), SIMDE_FLOAT16_VALUE( -508.50) } }, + { { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 14.28), SIMDE_FLOAT16_VALUE( 545.00), SIMDE_FLOAT16_VALUE( 819.50), + SIMDE_FLOAT16_VALUE( -459.00), SIMDE_FLOAT16_VALUE( 258.50), SIMDE_FLOAT16_VALUE( -195.12), SIMDE_FLOAT16_VALUE( -307.00) }, + { SIMDE_FLOAT16_VALUE( -459.00), SIMDE_FLOAT16_VALUE( 258.50), SIMDE_FLOAT16_VALUE( -195.12), SIMDE_FLOAT16_VALUE( -307.00) } }, + { { SIMDE_FLOAT16_VALUE( 918.00), SIMDE_FLOAT16_VALUE( 650.00), SIMDE_FLOAT16_VALUE( 80.00), SIMDE_FLOAT16_VALUE( -275.00), + SIMDE_FLOAT16_VALUE( 96.56), SIMDE_FLOAT16_VALUE( 489.75), SIMDE_FLOAT16_VALUE( 216.50), SIMDE_FLOAT16_VALUE( -894.00) }, + { SIMDE_FLOAT16_VALUE( 96.56), SIMDE_FLOAT16_VALUE( 489.75), SIMDE_FLOAT16_VALUE( 216.50), SIMDE_FLOAT16_VALUE( -894.00) } }, + { { SIMDE_FLOAT16_VALUE( -108.69), SIMDE_FLOAT16_VALUE( -977.50), SIMDE_FLOAT16_VALUE( -44.56), SIMDE_FLOAT16_VALUE( 432.25), + SIMDE_FLOAT16_VALUE( 281.00), SIMDE_FLOAT16_VALUE( 760.00), SIMDE_FLOAT16_VALUE( -874.50), SIMDE_FLOAT16_VALUE( -645.00) }, + { SIMDE_FLOAT16_VALUE( 281.00), SIMDE_FLOAT16_VALUE( 760.00), SIMDE_FLOAT16_VALUE( -874.50), SIMDE_FLOAT16_VALUE( -645.00) } }, + { { SIMDE_FLOAT16_VALUE( 392.00), SIMDE_FLOAT16_VALUE( -758.50), SIMDE_FLOAT16_VALUE( -870.50), SIMDE_FLOAT16_VALUE( -511.25), + SIMDE_FLOAT16_VALUE( 731.50), SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( -405.25), SIMDE_FLOAT16_VALUE( -353.75) }, + { SIMDE_FLOAT16_VALUE( 731.50), SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( -405.25), SIMDE_FLOAT16_VALUE( -353.75) } }, + { { SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( 372.75), SIMDE_FLOAT16_VALUE( 802.50), SIMDE_FLOAT16_VALUE( -373.00), + SIMDE_FLOAT16_VALUE( 133.12), SIMDE_FLOAT16_VALUE( 928.00), SIMDE_FLOAT16_VALUE( -18.17), SIMDE_FLOAT16_VALUE( -974.50) }, + { SIMDE_FLOAT16_VALUE( 133.12), SIMDE_FLOAT16_VALUE( 928.00), SIMDE_FLOAT16_VALUE( -18.17), SIMDE_FLOAT16_VALUE( -974.50) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a; + simde_float16x4_t r; + + a = simde_vld1q_f16(test_vec[i].a); + r = simde_vget_high_f16(a); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vget_high_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -360,6 +405,7 @@ test_simde_vget_high_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vget_high_s8) diff --git a/test/arm/neon/get_lane.c b/test/arm/neon/get_lane.c index 1e2af1a22..ee2518dd3 100644 --- a/test/arm/neon/get_lane.c +++ b/test/arm/neon/get_lane.c @@ -6,6 +6,52 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DIAGNOSTIC_DISABLE_UNREACHABLE_ +static int +test_simde_vget_lane_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + int b; + simde_float16 r; + } test_vec[] = { + { {SIMDE_FLOAT16_VALUE(-49.25), SIMDE_FLOAT16_VALUE(-109.00), SIMDE_FLOAT16_VALUE(-626.50), SIMDE_FLOAT16_VALUE(-567.00)}, + INT8_C( 0), + SIMDE_FLOAT16_VALUE(-49.25)}, + { {SIMDE_FLOAT16_VALUE(-226.00), SIMDE_FLOAT16_VALUE(-520.50), SIMDE_FLOAT16_VALUE(-252.38), SIMDE_FLOAT16_VALUE(-407.50)}, + INT8_C( 1), + SIMDE_FLOAT16_VALUE(-520.50)}, + { {SIMDE_FLOAT16_VALUE(-833.00), SIMDE_FLOAT16_VALUE(-714.00), SIMDE_FLOAT16_VALUE(428.50), SIMDE_FLOAT16_VALUE(871.50)}, + INT8_C( 2), + SIMDE_FLOAT16_VALUE(428.50)}, + { {SIMDE_FLOAT16_VALUE(488.00), SIMDE_FLOAT16_VALUE(112.56), SIMDE_FLOAT16_VALUE(58.66), SIMDE_FLOAT16_VALUE(879.50)}, + INT8_C( 3), + SIMDE_FLOAT16_VALUE(879.50)}, + { {SIMDE_FLOAT16_VALUE(32.59), SIMDE_FLOAT16_VALUE(239.50), SIMDE_FLOAT16_VALUE(-487.50), SIMDE_FLOAT16_VALUE(853.50)}, + INT8_C( 2), + SIMDE_FLOAT16_VALUE(-487.50)}, + { {SIMDE_FLOAT16_VALUE(-31.45), SIMDE_FLOAT16_VALUE(570.00), SIMDE_FLOAT16_VALUE(616.00), SIMDE_FLOAT16_VALUE(-942.00)}, + INT8_C( 1), + SIMDE_FLOAT16_VALUE(570.00)}, + { {SIMDE_FLOAT16_VALUE(-537.50), SIMDE_FLOAT16_VALUE(-964.50), SIMDE_FLOAT16_VALUE(-592.00), SIMDE_FLOAT16_VALUE(305.50)}, + INT8_C( 3), + SIMDE_FLOAT16_VALUE(305.50)}, + { {SIMDE_FLOAT16_VALUE(-180.50), SIMDE_FLOAT16_VALUE(-555.50), SIMDE_FLOAT16_VALUE(375.50), SIMDE_FLOAT16_VALUE(948.50)}, + INT8_C( 0), + SIMDE_FLOAT16_VALUE(-180.50)}, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + int b = test_vec[i].b; + simde_float16 r; + SIMDE_CONSTIFY_4_(simde_vget_lane_f16, r, (HEDLEY_UNREACHABLE(), SIMDE_FLOAT16_VALUE(0.0)), b, a); + + simde_assert_equal_f16(r, test_vec[i].r, 1); + } + + return 0; +} + static int test_simde_vget_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -431,6 +477,60 @@ test_simde_vget_lane_u64 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vgetq_lane_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + int b; + simde_float16 r; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00), + SIMDE_FLOAT16_VALUE( -918.50), SIMDE_FLOAT16_VALUE( -717.00), SIMDE_FLOAT16_VALUE( -823.00), SIMDE_FLOAT16_VALUE( -581.00) }, + INT8_C( 0), + SIMDE_FLOAT16_VALUE(441.00)}, + { { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 29.20), SIMDE_FLOAT16_VALUE( -856.00), SIMDE_FLOAT16_VALUE( 267.25), + SIMDE_FLOAT16_VALUE( -302.00), SIMDE_FLOAT16_VALUE( 526.50), SIMDE_FLOAT16_VALUE( 713.00), SIMDE_FLOAT16_VALUE( -14.83) }, + INT8_C( 1), + SIMDE_FLOAT16_VALUE(29.20)}, + { { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( -475.75), SIMDE_FLOAT16_VALUE( 269.8), SIMDE_FLOAT16_VALUE( 991.00), + SIMDE_FLOAT16_VALUE( -192.62), SIMDE_FLOAT16_VALUE( 446.50), SIMDE_FLOAT16_VALUE( -590.00), SIMDE_FLOAT16_VALUE( -508.50) }, + INT8_C( 2), + SIMDE_FLOAT16_VALUE(269.8)}, + { { SIMDE_FLOAT16_VALUE( 918.00), SIMDE_FLOAT16_VALUE( 650.00), SIMDE_FLOAT16_VALUE( 80.00), SIMDE_FLOAT16_VALUE( -275.00), + SIMDE_FLOAT16_VALUE( 96.56), SIMDE_FLOAT16_VALUE( 489.75), SIMDE_FLOAT16_VALUE( 216.50), SIMDE_FLOAT16_VALUE( -894.00) }, + INT8_C( 3), + SIMDE_FLOAT16_VALUE(-275.00)}, + { { SIMDE_FLOAT16_VALUE( -108.69), SIMDE_FLOAT16_VALUE( -977.50), SIMDE_FLOAT16_VALUE( -44.56), SIMDE_FLOAT16_VALUE( 432.25), + SIMDE_FLOAT16_VALUE( 281.00), SIMDE_FLOAT16_VALUE( 760.00), SIMDE_FLOAT16_VALUE( -874.50), SIMDE_FLOAT16_VALUE( -645.00) }, + INT8_C( 4), + SIMDE_FLOAT16_VALUE(281.00)}, + { { SIMDE_FLOAT16_VALUE( 392.00), SIMDE_FLOAT16_VALUE( -758.50), SIMDE_FLOAT16_VALUE( -870.50), SIMDE_FLOAT16_VALUE( -511.25), + SIMDE_FLOAT16_VALUE( 731.50), SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( -405.25), SIMDE_FLOAT16_VALUE( -353.75) }, + INT8_C( 5), + SIMDE_FLOAT16_VALUE(345.75)}, + { { SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( 372.75), SIMDE_FLOAT16_VALUE( 802.50), SIMDE_FLOAT16_VALUE( -373.00), + SIMDE_FLOAT16_VALUE( 133.12), SIMDE_FLOAT16_VALUE( 928.00), SIMDE_FLOAT16_VALUE( -18.17), SIMDE_FLOAT16_VALUE( -974.50) }, + INT8_C( 6), + SIMDE_FLOAT16_VALUE(-18.17)}, + { { SIMDE_FLOAT16_VALUE( -634.00), SIMDE_FLOAT16_VALUE( -283.75), SIMDE_FLOAT16_VALUE( -99.50), SIMDE_FLOAT16_VALUE( 134.00), + SIMDE_FLOAT16_VALUE( -781.50), SIMDE_FLOAT16_VALUE( 1188.00), SIMDE_FLOAT16_VALUE( -106.88), SIMDE_FLOAT16_VALUE( -497.25) }, + INT8_C( 7), + SIMDE_FLOAT16_VALUE(-497.25)}, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + int b = test_vec[i].b; + simde_float16 r; + SIMDE_CONSTIFY_8_(simde_vgetq_lane_f16, r, (HEDLEY_UNREACHABLE(), SIMDE_FLOAT16_VALUE(0.0)), b, a); + + simde_assert_equal_f16(r, test_vec[i].r, 1); + } + + return 0; +} + static int test_simde_vgetq_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -906,6 +1006,7 @@ test_simde_vgetq_lane_u64 (SIMDE_MUNIT_TEST_ARGS) { HEDLEY_DIAGNOSTIC_POP SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vget_lane_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vget_lane_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vget_lane_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vget_lane_s8) @@ -917,6 +1018,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vget_lane_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vget_lane_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vget_lane_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vgetq_lane_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vgetq_lane_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vgetq_lane_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vgetq_lane_s8) diff --git a/test/arm/neon/get_low.c b/test/arm/neon/get_low.c index f4576d593..188e22237 100644 --- a/test/arm/neon/get_low.c +++ b/test/arm/neon/get_low.c @@ -3,6 +3,51 @@ #include "test-neon.h" #include "../../../simde/arm/neon/get_low.h" +static int +test_simde_vget_low_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00), + SIMDE_FLOAT16_VALUE( -918.50), SIMDE_FLOAT16_VALUE( -717.00), SIMDE_FLOAT16_VALUE( -823.00), SIMDE_FLOAT16_VALUE( -581.00) }, + { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00) } }, + { { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 29.20), SIMDE_FLOAT16_VALUE( -856.00), SIMDE_FLOAT16_VALUE( 267.25), + SIMDE_FLOAT16_VALUE( -302.00), SIMDE_FLOAT16_VALUE( 526.50), SIMDE_FLOAT16_VALUE( 713.00), SIMDE_FLOAT16_VALUE( -14.83) }, + { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 29.20), SIMDE_FLOAT16_VALUE( -856.00), SIMDE_FLOAT16_VALUE( 267.25) } }, + { { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( -475.75), SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00), + SIMDE_FLOAT16_VALUE( -192.62), SIMDE_FLOAT16_VALUE( 446.50), SIMDE_FLOAT16_VALUE( -590.00), SIMDE_FLOAT16_VALUE( -508.50) }, + { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( -475.75), SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00) } }, + { { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 14.28), SIMDE_FLOAT16_VALUE( 545.00), SIMDE_FLOAT16_VALUE( 819.50), + SIMDE_FLOAT16_VALUE( -459.00), SIMDE_FLOAT16_VALUE( 258.50), SIMDE_FLOAT16_VALUE( -195.12), SIMDE_FLOAT16_VALUE( -307.00) }, + { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 14.28), SIMDE_FLOAT16_VALUE( 545.00), SIMDE_FLOAT16_VALUE( 819.50) } }, + { { SIMDE_FLOAT16_VALUE( 918.00), SIMDE_FLOAT16_VALUE( 650.00), SIMDE_FLOAT16_VALUE( 80.00), SIMDE_FLOAT16_VALUE( -275.00), + SIMDE_FLOAT16_VALUE( 96.56), SIMDE_FLOAT16_VALUE( 489.75), SIMDE_FLOAT16_VALUE( 216.50), SIMDE_FLOAT16_VALUE( -894.00) }, + { SIMDE_FLOAT16_VALUE( 918.00), SIMDE_FLOAT16_VALUE( 650.00), SIMDE_FLOAT16_VALUE( 80.00), SIMDE_FLOAT16_VALUE( -275.00) } }, + { { SIMDE_FLOAT16_VALUE( -108.69), SIMDE_FLOAT16_VALUE( -977.50), SIMDE_FLOAT16_VALUE( -44.56), SIMDE_FLOAT16_VALUE( 432.25), + SIMDE_FLOAT16_VALUE( 281.00), SIMDE_FLOAT16_VALUE( 760.00), SIMDE_FLOAT16_VALUE( -874.50), SIMDE_FLOAT16_VALUE( -645.00) }, + { SIMDE_FLOAT16_VALUE( -108.69), SIMDE_FLOAT16_VALUE( -977.50), SIMDE_FLOAT16_VALUE( -44.56), SIMDE_FLOAT16_VALUE( 432.25) } }, + { { SIMDE_FLOAT16_VALUE( 392.00), SIMDE_FLOAT16_VALUE( -758.50), SIMDE_FLOAT16_VALUE( -870.50), SIMDE_FLOAT16_VALUE( -511.25), + SIMDE_FLOAT16_VALUE( 731.50), SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( -405.25), SIMDE_FLOAT16_VALUE( -353.75) }, + { SIMDE_FLOAT16_VALUE( 392.00), SIMDE_FLOAT16_VALUE( -758.50), SIMDE_FLOAT16_VALUE( -870.50), SIMDE_FLOAT16_VALUE( -511.25) } }, + { { SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( 372.75), SIMDE_FLOAT16_VALUE( 802.50), SIMDE_FLOAT16_VALUE( -373.00), + SIMDE_FLOAT16_VALUE( 133.12), SIMDE_FLOAT16_VALUE( 928.00), SIMDE_FLOAT16_VALUE( -18.17), SIMDE_FLOAT16_VALUE( -974.50) }, + { SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( 372.75), SIMDE_FLOAT16_VALUE( 802.50), SIMDE_FLOAT16_VALUE( -373.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a; + simde_float16x4_t r; + + a = simde_vld1q_f16(test_vec[i].a); + r = simde_vget_low_f16(a); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vget_low_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -360,6 +405,7 @@ test_simde_vget_low_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vget_low_s8) diff --git a/test/arm/neon/ld1_dup.c b/test/arm/neon/ld1_dup.c index 1d9702447..ebe7f9a2f 100644 --- a/test/arm/neon/ld1_dup.c +++ b/test/arm/neon/ld1_dup.c @@ -585,6 +585,57 @@ test_simde_vld1_dup_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld1q_dup_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16_t a; + simde_float16_t unused; + simde_float16_t r[8]; + } test_vec[] = { + { SIMDE_FLOAT16_VALUE( -275.48), + SIMDE_FLOAT16_VALUE( 563.30), + { SIMDE_FLOAT16_VALUE( -275.48), SIMDE_FLOAT16_VALUE( -275.48), SIMDE_FLOAT16_VALUE( -275.48), SIMDE_FLOAT16_VALUE( -275.48), + SIMDE_FLOAT16_VALUE( -275.48), SIMDE_FLOAT16_VALUE( -275.48), SIMDE_FLOAT16_VALUE( -275.48), SIMDE_FLOAT16_VALUE( -275.48) } }, + { SIMDE_FLOAT16_VALUE( -478.65), + SIMDE_FLOAT16_VALUE( 688.84), + { SIMDE_FLOAT16_VALUE( -478.65), SIMDE_FLOAT16_VALUE( -478.65), SIMDE_FLOAT16_VALUE( -478.65), SIMDE_FLOAT16_VALUE( -478.65), + SIMDE_FLOAT16_VALUE( -478.65), SIMDE_FLOAT16_VALUE( -478.65), SIMDE_FLOAT16_VALUE( -478.65), SIMDE_FLOAT16_VALUE( -478.65) } }, + { SIMDE_FLOAT16_VALUE( 810.78), + SIMDE_FLOAT16_VALUE( -456.08), + { SIMDE_FLOAT16_VALUE( 810.78), SIMDE_FLOAT16_VALUE( 810.78), SIMDE_FLOAT16_VALUE( 810.78), SIMDE_FLOAT16_VALUE( 810.78), + SIMDE_FLOAT16_VALUE( 810.78), SIMDE_FLOAT16_VALUE( 810.78), SIMDE_FLOAT16_VALUE( 810.78), SIMDE_FLOAT16_VALUE( 810.78) } }, + { SIMDE_FLOAT16_VALUE( -139.83), + SIMDE_FLOAT16_VALUE( -302.96), + { SIMDE_FLOAT16_VALUE( -139.83), SIMDE_FLOAT16_VALUE( -139.83), SIMDE_FLOAT16_VALUE( -139.83), SIMDE_FLOAT16_VALUE( -139.83), + SIMDE_FLOAT16_VALUE( -139.83), SIMDE_FLOAT16_VALUE( -139.83), SIMDE_FLOAT16_VALUE( -139.83), SIMDE_FLOAT16_VALUE( -139.83) } }, + { SIMDE_FLOAT16_VALUE( 16.91), + SIMDE_FLOAT16_VALUE( -128.20), + { SIMDE_FLOAT16_VALUE( 16.91), SIMDE_FLOAT16_VALUE( 16.91), SIMDE_FLOAT16_VALUE( 16.91), SIMDE_FLOAT16_VALUE( 16.91), + SIMDE_FLOAT16_VALUE( 16.91), SIMDE_FLOAT16_VALUE( 16.91), SIMDE_FLOAT16_VALUE( 16.91), SIMDE_FLOAT16_VALUE( 16.91) } }, + { SIMDE_FLOAT16_VALUE( 315.19), + SIMDE_FLOAT16_VALUE( -659.25), + { SIMDE_FLOAT16_VALUE( 315.19), SIMDE_FLOAT16_VALUE( 315.19), SIMDE_FLOAT16_VALUE( 315.19), SIMDE_FLOAT16_VALUE( 315.19), + SIMDE_FLOAT16_VALUE( 315.19), SIMDE_FLOAT16_VALUE( 315.19), SIMDE_FLOAT16_VALUE( 315.19), SIMDE_FLOAT16_VALUE( 315.19) } }, + { SIMDE_FLOAT16_VALUE( -303.00), + SIMDE_FLOAT16_VALUE( -865.13), + { SIMDE_FLOAT16_VALUE( -303.00), SIMDE_FLOAT16_VALUE( -303.00), SIMDE_FLOAT16_VALUE( -303.00), SIMDE_FLOAT16_VALUE( -303.00), + SIMDE_FLOAT16_VALUE( -303.00), SIMDE_FLOAT16_VALUE( -303.00), SIMDE_FLOAT16_VALUE( -303.00), SIMDE_FLOAT16_VALUE( -303.00) } }, + { SIMDE_FLOAT16_VALUE( 391.93), + SIMDE_FLOAT16_VALUE( -958.40), + { SIMDE_FLOAT16_VALUE( 391.93), SIMDE_FLOAT16_VALUE( 391.93), SIMDE_FLOAT16_VALUE( 391.93), SIMDE_FLOAT16_VALUE( 391.93), + SIMDE_FLOAT16_VALUE( 391.93), SIMDE_FLOAT16_VALUE( 391.93), SIMDE_FLOAT16_VALUE( 391.93), SIMDE_FLOAT16_VALUE( 391.93) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t r = simde_vld1q_dup_f16(&test_vec[i].a); + + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), + INT_MAX); + } + + return 0; +} + static int test_simde_vld1q_dup_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1187,6 +1238,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld1_dup_u8) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_dup_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_dup_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vld1_dup_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_dup_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_dup_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_dup_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vld1q_dup_s8) diff --git a/test/arm/neon/ld2.c b/test/arm/neon/ld2.c index 54ba4e26e..63412fe7d 100644 --- a/test/arm/neon/ld2.c +++ b/test/arm/neon/ld2.c @@ -1456,6 +1456,59 @@ test_simde_vld2q_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vld2q_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16_t a[16]; + simde_float16_t r[2][8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 793.71), SIMDE_FLOAT16_VALUE( 221.62), SIMDE_FLOAT16_VALUE( 781.57), SIMDE_FLOAT16_VALUE( -525.52), + SIMDE_FLOAT16_VALUE( 800.99), SIMDE_FLOAT16_VALUE( -411.87), SIMDE_FLOAT16_VALUE( 483.99), SIMDE_FLOAT16_VALUE( 852.73), + SIMDE_FLOAT16_VALUE( -433.25), SIMDE_FLOAT16_VALUE( -811.76), SIMDE_FLOAT16_VALUE( -463.04), SIMDE_FLOAT16_VALUE( 671.94), + SIMDE_FLOAT16_VALUE( -60.94), SIMDE_FLOAT16_VALUE( -434.20), SIMDE_FLOAT16_VALUE( -263.89), SIMDE_FLOAT16_VALUE( 754.63) }, + { { SIMDE_FLOAT16_VALUE( 793.71), SIMDE_FLOAT16_VALUE( 781.57), SIMDE_FLOAT16_VALUE( 800.99), SIMDE_FLOAT16_VALUE( 483.99), + SIMDE_FLOAT16_VALUE( -433.25), SIMDE_FLOAT16_VALUE( -463.04), SIMDE_FLOAT16_VALUE( -60.94), SIMDE_FLOAT16_VALUE( -263.89) }, + { SIMDE_FLOAT16_VALUE( 221.62), SIMDE_FLOAT16_VALUE( -525.52), SIMDE_FLOAT16_VALUE( -411.87), SIMDE_FLOAT16_VALUE( 852.73), + SIMDE_FLOAT16_VALUE( -811.76), SIMDE_FLOAT16_VALUE( 671.94), SIMDE_FLOAT16_VALUE( -434.20), SIMDE_FLOAT16_VALUE( 754.63) } } }, + { { SIMDE_FLOAT16_VALUE( -877.85), SIMDE_FLOAT16_VALUE( -225.98), SIMDE_FLOAT16_VALUE( -292.03), SIMDE_FLOAT16_VALUE( 932.32), + SIMDE_FLOAT16_VALUE( -463.10), SIMDE_FLOAT16_VALUE( 171.18), SIMDE_FLOAT16_VALUE( -115.23), SIMDE_FLOAT16_VALUE( -867.52), + SIMDE_FLOAT16_VALUE( -182.14), SIMDE_FLOAT16_VALUE( 874.57), SIMDE_FLOAT16_VALUE( -306.44), SIMDE_FLOAT16_VALUE( 180.87), + SIMDE_FLOAT16_VALUE( -827.59), SIMDE_FLOAT16_VALUE( -449.53), SIMDE_FLOAT16_VALUE( -593.39), SIMDE_FLOAT16_VALUE( 966.11) }, + { { SIMDE_FLOAT16_VALUE( -877.85), SIMDE_FLOAT16_VALUE( -292.03), SIMDE_FLOAT16_VALUE( -463.10), SIMDE_FLOAT16_VALUE( -115.23), + SIMDE_FLOAT16_VALUE( -182.14), SIMDE_FLOAT16_VALUE( -306.44), SIMDE_FLOAT16_VALUE( -827.59), SIMDE_FLOAT16_VALUE( -593.39) }, + { SIMDE_FLOAT16_VALUE( -225.98), SIMDE_FLOAT16_VALUE( 932.32), SIMDE_FLOAT16_VALUE( 171.18), SIMDE_FLOAT16_VALUE( -867.52), + SIMDE_FLOAT16_VALUE( 874.57), SIMDE_FLOAT16_VALUE( 180.87), SIMDE_FLOAT16_VALUE( -449.53), SIMDE_FLOAT16_VALUE( 966.11) } } }, + { { SIMDE_FLOAT16_VALUE( 772.09), SIMDE_FLOAT16_VALUE( -811.82), SIMDE_FLOAT16_VALUE( -559.40), SIMDE_FLOAT16_VALUE( 573.08), + SIMDE_FLOAT16_VALUE( -223.69), SIMDE_FLOAT16_VALUE( 924.59), SIMDE_FLOAT16_VALUE( 425.81), SIMDE_FLOAT16_VALUE( 343.06), + SIMDE_FLOAT16_VALUE( -887.17), SIMDE_FLOAT16_VALUE( 962.76), SIMDE_FLOAT16_VALUE( 15.01), SIMDE_FLOAT16_VALUE( 51.89), + SIMDE_FLOAT16_VALUE( -471.44), SIMDE_FLOAT16_VALUE( 751.11), SIMDE_FLOAT16_VALUE( -193.48), SIMDE_FLOAT16_VALUE( -349.29) }, + { { SIMDE_FLOAT16_VALUE( 772.09), SIMDE_FLOAT16_VALUE( -559.40), SIMDE_FLOAT16_VALUE( -223.69), SIMDE_FLOAT16_VALUE( 425.81), + SIMDE_FLOAT16_VALUE( -887.17), SIMDE_FLOAT16_VALUE( 15.01), SIMDE_FLOAT16_VALUE( -471.44), SIMDE_FLOAT16_VALUE( -193.48) }, + { SIMDE_FLOAT16_VALUE( -811.82), SIMDE_FLOAT16_VALUE( 573.08), SIMDE_FLOAT16_VALUE( 924.59), SIMDE_FLOAT16_VALUE( 343.06), + SIMDE_FLOAT16_VALUE( 962.76), SIMDE_FLOAT16_VALUE( 51.89), SIMDE_FLOAT16_VALUE( 751.11), SIMDE_FLOAT16_VALUE( -349.29) } } }, + { { SIMDE_FLOAT16_VALUE( -474.87), SIMDE_FLOAT16_VALUE( 514.49), SIMDE_FLOAT16_VALUE( -416.97), SIMDE_FLOAT16_VALUE( 62.03), + SIMDE_FLOAT16_VALUE( -314.33), SIMDE_FLOAT16_VALUE( 467.80), SIMDE_FLOAT16_VALUE( 194.51), SIMDE_FLOAT16_VALUE( 503.53), + SIMDE_FLOAT16_VALUE( 342.37), SIMDE_FLOAT16_VALUE( 888.07), SIMDE_FLOAT16_VALUE( -315.60), SIMDE_FLOAT16_VALUE( 514.77), + SIMDE_FLOAT16_VALUE( -561.46), SIMDE_FLOAT16_VALUE( 91.01), SIMDE_FLOAT16_VALUE( 480.89), SIMDE_FLOAT16_VALUE( -789.37) }, + { { SIMDE_FLOAT16_VALUE( -474.87), SIMDE_FLOAT16_VALUE( -416.97), SIMDE_FLOAT16_VALUE( -314.33), SIMDE_FLOAT16_VALUE( 194.51), + SIMDE_FLOAT16_VALUE( 342.37), SIMDE_FLOAT16_VALUE( -315.60), SIMDE_FLOAT16_VALUE( -561.46), SIMDE_FLOAT16_VALUE( 480.89) }, + { SIMDE_FLOAT16_VALUE( 514.49), SIMDE_FLOAT16_VALUE( 62.03), SIMDE_FLOAT16_VALUE( 467.80), SIMDE_FLOAT16_VALUE( 503.53), + SIMDE_FLOAT16_VALUE( 888.07), SIMDE_FLOAT16_VALUE( 514.77), SIMDE_FLOAT16_VALUE( 91.01), SIMDE_FLOAT16_VALUE( -789.37) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8x2_t r = simde_vld2q_f16(test_vec[i].a); + + simde_float16x8x2_t expected = { + {simde_vld1q_f16(test_vec[i].r[0]), simde_vld1q_f16(test_vec[i].r[1])}}; + + simde_test_arm_neon_assert_equal_f16x8(r.val[0], expected.val[0], INT_MAX); + simde_test_arm_neon_assert_equal_f16x8(r.val[1], expected.val[1], INT_MAX); + } + + return 0; +} + static int test_simde_vld2q_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1636,6 +1689,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_s64) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vld2q_f64) #endif /* !defined(SIMDE_BUG_INTEL_857088) */ diff --git a/test/arm/neon/max.c b/test/arm/neon/max.c index f057a2274..23b0b4e9a 100644 --- a/test/arm/neon/max.c +++ b/test/arm/neon/max.c @@ -3,6 +3,38 @@ #include "test-neon.h" #include "../../../simde/arm/neon/max.h" +static int +test_simde_vmax_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00) }, + { SIMDE_FLOAT16_VALUE( 684.00), SIMDE_FLOAT16_VALUE( 563.00), SIMDE_FLOAT16_VALUE( 15.31), SIMDE_FLOAT16_VALUE( -786.50) }, + { SIMDE_FLOAT16_VALUE( 684.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00) } }, + { { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 29.20), SIMDE_FLOAT16_VALUE( -856.00), SIMDE_FLOAT16_VALUE( 267.25) }, + { SIMDE_FLOAT16_VALUE( -848.00), SIMDE_FLOAT16_VALUE( 815.50), SIMDE_FLOAT16_VALUE( -672.50), SIMDE_FLOAT16_VALUE( 274.50) }, + { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 815.50), SIMDE_FLOAT16_VALUE( -672.50), SIMDE_FLOAT16_VALUE( 274.50) } }, + { { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( -475.75), SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00) }, + { SIMDE_FLOAT16_VALUE( 9.56), SIMDE_FLOAT16_VALUE( 425.25), SIMDE_FLOAT16_VALUE( -294.75), SIMDE_FLOAT16_VALUE( -99.19) }, + { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( 425.25), SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00) } }, + { { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 14.28), SIMDE_FLOAT16_VALUE( 545.00), SIMDE_FLOAT16_VALUE( 819.50) }, + { SIMDE_FLOAT16_VALUE( 73.81), SIMDE_FLOAT16_VALUE( 132.25), SIMDE_FLOAT16_VALUE( 967.50), SIMDE_FLOAT16_VALUE( 6.60) }, + { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 132.25), SIMDE_FLOAT16_VALUE( 967.50), SIMDE_FLOAT16_VALUE( 819.50) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_float16x4_t r = simde_vmax_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vmax_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -506,6 +538,50 @@ test_simde_x_vmax_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vmaxq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00), + SIMDE_FLOAT16_VALUE( -918.50), SIMDE_FLOAT16_VALUE( -717.00), SIMDE_FLOAT16_VALUE( -823.00), SIMDE_FLOAT16_VALUE( -581.00) }, + { SIMDE_FLOAT16_VALUE( 684.00), SIMDE_FLOAT16_VALUE( 563.00), SIMDE_FLOAT16_VALUE( 15.31), SIMDE_FLOAT16_VALUE( -786.50), + SIMDE_FLOAT16_VALUE( 891.00), SIMDE_FLOAT16_VALUE( 859.50), SIMDE_FLOAT16_VALUE( 387.25), SIMDE_FLOAT16_VALUE( 969.00) }, + { SIMDE_FLOAT16_VALUE( 684.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00), + SIMDE_FLOAT16_VALUE( 891.00), SIMDE_FLOAT16_VALUE( 859.50), SIMDE_FLOAT16_VALUE( 387.25), SIMDE_FLOAT16_VALUE( 969.00) } }, + { { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 29.20), SIMDE_FLOAT16_VALUE( -856.00), SIMDE_FLOAT16_VALUE( 267.25), + SIMDE_FLOAT16_VALUE( -302.00), SIMDE_FLOAT16_VALUE( 526.50), SIMDE_FLOAT16_VALUE( 713.00), SIMDE_FLOAT16_VALUE( -14.83) }, + { SIMDE_FLOAT16_VALUE( -848.00), SIMDE_FLOAT16_VALUE( 815.50), SIMDE_FLOAT16_VALUE( -672.50), SIMDE_FLOAT16_VALUE( 274.50), + SIMDE_FLOAT16_VALUE( 933.00), SIMDE_FLOAT16_VALUE( -952.50), SIMDE_FLOAT16_VALUE( 426.00), SIMDE_FLOAT16_VALUE( 373.75) }, + { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 815.50), SIMDE_FLOAT16_VALUE( -672.50), SIMDE_FLOAT16_VALUE( 274.50), + SIMDE_FLOAT16_VALUE( 933.00), SIMDE_FLOAT16_VALUE( 526.50), SIMDE_FLOAT16_VALUE( 713.00), SIMDE_FLOAT16_VALUE( 373.75) } }, + { { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( -475.75), SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00), + SIMDE_FLOAT16_VALUE( -192.62), SIMDE_FLOAT16_VALUE( 446.50), SIMDE_FLOAT16_VALUE( -590.00), SIMDE_FLOAT16_VALUE( -508.50) }, + { SIMDE_FLOAT16_VALUE( 9.56), SIMDE_FLOAT16_VALUE( 425.25), SIMDE_FLOAT16_VALUE( -294.75), SIMDE_FLOAT16_VALUE( -99.19), + SIMDE_FLOAT16_VALUE( 284.50), SIMDE_FLOAT16_VALUE( -907.50), SIMDE_FLOAT16_VALUE( -130.00), SIMDE_FLOAT16_VALUE( -722.00) }, + { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( 425.25), SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00), + SIMDE_FLOAT16_VALUE( 284.50), SIMDE_FLOAT16_VALUE( 446.50), SIMDE_FLOAT16_VALUE( -130.00), SIMDE_FLOAT16_VALUE( -508.50) } }, + { { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 14.28), SIMDE_FLOAT16_VALUE( 545.00), SIMDE_FLOAT16_VALUE( 819.50), + SIMDE_FLOAT16_VALUE( -459.00), SIMDE_FLOAT16_VALUE( 258.50), SIMDE_FLOAT16_VALUE( -195.12), SIMDE_FLOAT16_VALUE( -307.00) }, + { SIMDE_FLOAT16_VALUE( 73.81), SIMDE_FLOAT16_VALUE( 132.25), SIMDE_FLOAT16_VALUE( 967.50), SIMDE_FLOAT16_VALUE( 6.60), + SIMDE_FLOAT16_VALUE( 179.88), SIMDE_FLOAT16_VALUE( 393.50), SIMDE_FLOAT16_VALUE( -619.50), SIMDE_FLOAT16_VALUE( 89.12) }, + { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 132.25), SIMDE_FLOAT16_VALUE( 967.50), SIMDE_FLOAT16_VALUE( 819.50), + SIMDE_FLOAT16_VALUE( 179.88), SIMDE_FLOAT16_VALUE( 393.50), SIMDE_FLOAT16_VALUE( -195.12), SIMDE_FLOAT16_VALUE( 89.12) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_float16x8_t r = simde_vmaxq_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vmaxq_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1057,6 +1133,7 @@ test_simde_x_vmaxq_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vmax_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vmax_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmax_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vmax_s8) @@ -1068,6 +1145,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vmax_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vmax_u32) SIMDE_TEST_FUNC_LIST_ENTRY(x_vmax_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vmaxq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vmaxq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmaxq_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vmaxq_s8) diff --git a/test/arm/neon/min.c b/test/arm/neon/min.c index ce9db8e07..624b61550 100644 --- a/test/arm/neon/min.c +++ b/test/arm/neon/min.c @@ -3,6 +3,58 @@ #include "test-neon.h" #include "../../../simde/arm/neon/min.h" +static int +test_simde_vmin_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-7.60), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(-0.50) }, + { SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(2.40) }, + { SIMDE_FLOAT16_VALUE(-7.60), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(-0.50) } }, + { { SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(9.60) }, + { SIMDE_FLOAT16_VALUE(1.80), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(-9.80), SIMDE_FLOAT16_VALUE(7.90) }, + { SIMDE_FLOAT16_VALUE(1.80), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(-9.80), SIMDE_FLOAT16_VALUE(7.90) } }, + { { SIMDE_FLOAT16_VALUE(-4.30), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(-2.20) }, + { SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(0.00), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(-2.10) }, + { SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(-2.20) } }, + { { SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(5.60), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-7.60) }, + { SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(8.30), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(-8.00) }, + { SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(5.60), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(-8.00) } }, + { { SIMDE_FLOAT16_VALUE(-5.30), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(4.80) }, + { SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(4.10), SIMDE_FLOAT16_VALUE(5.60) }, + { SIMDE_FLOAT16_VALUE(-5.30), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(4.80) } }, + { { SIMDE_FLOAT16_VALUE(8.70), SIMDE_FLOAT16_VALUE(8.70), SIMDE_FLOAT16_VALUE(6.40), SIMDE_FLOAT16_VALUE(-6.70) }, + { SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(1.80), SIMDE_FLOAT16_VALUE(-6.20) }, + { SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(1.80), SIMDE_FLOAT16_VALUE(-6.70) } }, + { { SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(-7.40), SIMDE_FLOAT16_VALUE(-1.00) }, + { SIMDE_FLOAT16_VALUE(-5.30), SIMDE_FLOAT16_VALUE(5.10), SIMDE_FLOAT16_VALUE(-10.00), SIMDE_FLOAT16_VALUE(-0.80) }, + { SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(5.10), SIMDE_FLOAT16_VALUE(-10.00), SIMDE_FLOAT16_VALUE(-1.00) } }, + { { SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(9.50), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(6.50) }, + { SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(-6.70) }, + { SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(-6.70) } }, + { { SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(5.30) }, + { SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-8.30) }, + { SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-8.30) } }, + { { SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(-6.40) }, + { SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(-2.90) }, + { SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(-6.40) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a, b, r; + + a = simde_vld1_f16(test_vec[i].a); + b = simde_vld1_f16(test_vec[i].b); + r = simde_vmin_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vmin_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -489,6 +541,54 @@ test_simde_x_vmin_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vminq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(-8.90), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(-8.60), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(9.80), SIMDE_FLOAT16_VALUE(-8.20) }, + { SIMDE_FLOAT16_VALUE(-9.40), SIMDE_FLOAT16_VALUE(-5.90), SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(8.30) }, + { SIMDE_FLOAT16_VALUE(-9.40), SIMDE_FLOAT16_VALUE(-5.90), SIMDE_FLOAT16_VALUE(-8.90), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(-8.60), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(-8.20) } }, + { { SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(7.60), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(5.20) }, + { SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(-2.20), SIMDE_FLOAT16_VALUE(5.40), SIMDE_FLOAT16_VALUE(-6.00), SIMDE_FLOAT16_VALUE(-8.70), SIMDE_FLOAT16_VALUE(6.80), SIMDE_FLOAT16_VALUE(-0.80) }, + { SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(-6.00), SIMDE_FLOAT16_VALUE(-8.70), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(-0.80) } }, + { { SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(-9.40), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(0.70) }, + { SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(7.40), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(-5.30), SIMDE_FLOAT16_VALUE(-4.90) }, + { SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(-9.40), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(-4.90) } }, + { { SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(1.80), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(-4.10) }, + { SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(7.40), SIMDE_FLOAT16_VALUE(1.80), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(-8.30) }, + { SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(7.40), SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(-8.30) } }, + { { SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(0.00), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(-1.20) }, + { SIMDE_FLOAT16_VALUE(4.10), SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(-1.10), SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(4.80) }, + { SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(-1.10), SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(-1.20) } }, + { { SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(-7.60), SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(8.10), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(9.40) }, + { SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(-7.70), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(-2.90), SIMDE_FLOAT16_VALUE(-8.30) }, + { SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(-7.60), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(-7.70), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(-2.90), SIMDE_FLOAT16_VALUE(-8.30) } }, + { { SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(-6.90), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(-7.40) }, + { SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(-6.00), SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(-9.10), SIMDE_FLOAT16_VALUE(5.30), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(-5.20) }, + { SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(-6.00), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(-9.10), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(-7.40) } }, + { { SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(0.00), SIMDE_FLOAT16_VALUE(-9.80), SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(-6.60), SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(-2.90), SIMDE_FLOAT16_VALUE(6.00) }, + { SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(7.20) }, + { SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-9.80), SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(-6.60), SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(6.00) } }, + { { SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(2.20) }, + { SIMDE_FLOAT16_VALUE(-2.90), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(-6.60) }, + { SIMDE_FLOAT16_VALUE(-2.90), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(-6.60) } }, + { { SIMDE_FLOAT16_VALUE(9.10), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(-4.60), SIMDE_FLOAT16_VALUE(-1.00), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-0.10) }, + { SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(-7.20), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(-3.10) }, + { SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(-4.60), SIMDE_FLOAT16_VALUE(-7.20), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-3.10) } }, + }; + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_float16x8_t r = simde_vminq_f16(a, b); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vminq_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -1013,6 +1113,7 @@ test_simde_x_vminq_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vmin_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vmin_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmin_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vmin_s8) @@ -1024,6 +1125,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vmin_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vmin_u32) SIMDE_TEST_FUNC_LIST_ENTRY(x_vmin_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vminq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vminq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vminq_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vminq_s8) diff --git a/test/arm/neon/mul.c b/test/arm/neon/mul.c index d0c5303e1..03a358724 100644 --- a/test/arm/neon/mul.c +++ b/test/arm/neon/mul.c @@ -3,6 +3,76 @@ #include "test-neon.h" #include "../../../simde/arm/neon/mul.h" +static int +test_simde_vmul_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 147.875), SIMDE_FLOAT16_VALUE( 183.125), + SIMDE_FLOAT16_VALUE( 250.125), SIMDE_FLOAT16_VALUE( 236.5), }, + { SIMDE_FLOAT16_VALUE( 27.609375), SIMDE_FLOAT16_VALUE( 24.734375), + SIMDE_FLOAT16_VALUE( 129.875), SIMDE_FLOAT16_VALUE( 108.875), }, + { SIMDE_FLOAT16_VALUE( 4082.0), SIMDE_FLOAT16_VALUE( 4528.0), + SIMDE_FLOAT16_VALUE( 32480.0), SIMDE_FLOAT16_VALUE( 25744.0), } }, + { { SIMDE_FLOAT16_VALUE( 95.75), SIMDE_FLOAT16_VALUE( 215.25), + SIMDE_FLOAT16_VALUE( 5.47265625), SIMDE_FLOAT16_VALUE( 14.390625), }, + { SIMDE_FLOAT16_VALUE( 206.375), SIMDE_FLOAT16_VALUE( 3.19140625), + SIMDE_FLOAT16_VALUE( 201.625), SIMDE_FLOAT16_VALUE( 143.375), }, + { SIMDE_FLOAT16_VALUE( 19760.0), SIMDE_FLOAT16_VALUE( 687.0), + SIMDE_FLOAT16_VALUE( 1103.0), SIMDE_FLOAT16_VALUE( 2064.0), } }, + { { SIMDE_FLOAT16_VALUE( -112.1875), SIMDE_FLOAT16_VALUE( -80.8125), + SIMDE_FLOAT16_VALUE( -234.25), SIMDE_FLOAT16_VALUE( -8.703125), }, + { SIMDE_FLOAT16_VALUE( 207.0), SIMDE_FLOAT16_VALUE( 134.0), + SIMDE_FLOAT16_VALUE( 230.625), SIMDE_FLOAT16_VALUE( 75.125), }, + { SIMDE_FLOAT16_VALUE( -23216.0), SIMDE_FLOAT16_VALUE( -10832.0), + SIMDE_FLOAT16_VALUE( -54016.0), SIMDE_FLOAT16_VALUE( -654.0), } }, + { { SIMDE_FLOAT16_VALUE( -128.0), SIMDE_FLOAT16_VALUE( -165.625), + SIMDE_FLOAT16_VALUE( -222.125), SIMDE_FLOAT16_VALUE( -161.875), }, + { SIMDE_FLOAT16_VALUE( 144.625), SIMDE_FLOAT16_VALUE( 217.625), + SIMDE_FLOAT16_VALUE( 120.625), SIMDE_FLOAT16_VALUE( 5.9765625), }, + { SIMDE_FLOAT16_VALUE( -18512.0), SIMDE_FLOAT16_VALUE( -36032.0), + SIMDE_FLOAT16_VALUE( -26800.0), SIMDE_FLOAT16_VALUE( -967.5), } }, + { { SIMDE_FLOAT16_VALUE( 183.375), SIMDE_FLOAT16_VALUE( 181.25), + SIMDE_FLOAT16_VALUE( 171.25), SIMDE_FLOAT16_VALUE( 167.625), }, + { SIMDE_FLOAT16_VALUE( -92.3125), SIMDE_FLOAT16_VALUE( -203.0), + SIMDE_FLOAT16_VALUE( -95.0), SIMDE_FLOAT16_VALUE( -192.375), }, + { SIMDE_FLOAT16_VALUE( -16928.0), SIMDE_FLOAT16_VALUE( -36800.0), + SIMDE_FLOAT16_VALUE( -16272.0), SIMDE_FLOAT16_VALUE( -32240.0), } }, + { { SIMDE_FLOAT16_VALUE( 252.875), SIMDE_FLOAT16_VALUE( 178.5), + SIMDE_FLOAT16_VALUE( 178.0), SIMDE_FLOAT16_VALUE( 184.25), }, + { SIMDE_FLOAT16_VALUE( -217.125), SIMDE_FLOAT16_VALUE( -9.8125), + SIMDE_FLOAT16_VALUE( -15.921875), SIMDE_FLOAT16_VALUE( -143.125), }, + { SIMDE_FLOAT16_VALUE( -54912.0), SIMDE_FLOAT16_VALUE( -1752.0), + SIMDE_FLOAT16_VALUE( -2834.0), SIMDE_FLOAT16_VALUE( -26368.0), } }, + { { SIMDE_FLOAT16_VALUE( -237.875), SIMDE_FLOAT16_VALUE( -210.375), + SIMDE_FLOAT16_VALUE( -142.25), SIMDE_FLOAT16_VALUE( -20.171875), }, + { SIMDE_FLOAT16_VALUE( -14.34375), SIMDE_FLOAT16_VALUE( -179.625), + SIMDE_FLOAT16_VALUE( -236.5), SIMDE_FLOAT16_VALUE( -231.0), }, + { SIMDE_FLOAT16_VALUE( 3412.0), SIMDE_FLOAT16_VALUE( 37792.0), + SIMDE_FLOAT16_VALUE( 33632.0), SIMDE_FLOAT16_VALUE( 4660.0), } }, + { { SIMDE_FLOAT16_VALUE( -78.125), SIMDE_FLOAT16_VALUE( -183.375), + SIMDE_FLOAT16_VALUE( -216.125), SIMDE_FLOAT16_VALUE( -192.75), }, + { SIMDE_FLOAT16_VALUE( -206.125), SIMDE_FLOAT16_VALUE( -53.21875), + SIMDE_FLOAT16_VALUE( -241.875), SIMDE_FLOAT16_VALUE( -5.8359375), }, + { SIMDE_FLOAT16_VALUE( 16104.0), SIMDE_FLOAT16_VALUE( 9760.0), + SIMDE_FLOAT16_VALUE( 52288.0), SIMDE_FLOAT16_VALUE( 1125.0), } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a, b, r; + + a = simde_vld1_f16(test_vec[i].a); + b = simde_vld1_f16(test_vec[i].b); + r = simde_vmul_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vmul_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -471,6 +541,75 @@ test_simde_x_vmul_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } + +static int +test_simde_vmulq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 218.125), SIMDE_FLOAT16_VALUE( 147.75), SIMDE_FLOAT16_VALUE( 163.875), SIMDE_FLOAT16_VALUE( 3.16796875), + SIMDE_FLOAT16_VALUE( 168.5), SIMDE_FLOAT16_VALUE( 4.4453125), SIMDE_FLOAT16_VALUE( 166.25), SIMDE_FLOAT16_VALUE( 95.0625), }, + { SIMDE_FLOAT16_VALUE( 232.875), SIMDE_FLOAT16_VALUE( 164.25), SIMDE_FLOAT16_VALUE( 77.25), SIMDE_FLOAT16_VALUE( 9.1171875), + SIMDE_FLOAT16_VALUE( 161.25), SIMDE_FLOAT16_VALUE( 69.25), SIMDE_FLOAT16_VALUE( 68.1875), SIMDE_FLOAT16_VALUE( 71.3125), }, + { SIMDE_FLOAT16_VALUE( 50784.0), SIMDE_FLOAT16_VALUE( 24272.0), SIMDE_FLOAT16_VALUE( 12656.0), SIMDE_FLOAT16_VALUE( 28.890625), + SIMDE_FLOAT16_VALUE( 27168.0), SIMDE_FLOAT16_VALUE( 307.75), SIMDE_FLOAT16_VALUE( 11336.0), SIMDE_FLOAT16_VALUE( 6780.0), } }, + { { SIMDE_FLOAT16_VALUE( -190.875), SIMDE_FLOAT16_VALUE( -167.5), SIMDE_FLOAT16_VALUE( -108.0), SIMDE_FLOAT16_VALUE( -198.25), + SIMDE_FLOAT16_VALUE( -45.5), SIMDE_FLOAT16_VALUE( -189.25), SIMDE_FLOAT16_VALUE( -104.8125), SIMDE_FLOAT16_VALUE( -212.625), }, + { SIMDE_FLOAT16_VALUE( 123.8125), SIMDE_FLOAT16_VALUE( 128.25), SIMDE_FLOAT16_VALUE( 188.125), SIMDE_FLOAT16_VALUE( 196.375), + SIMDE_FLOAT16_VALUE( 193.0), SIMDE_FLOAT16_VALUE( 70.3125), SIMDE_FLOAT16_VALUE( 179.5), SIMDE_FLOAT16_VALUE( 116.6875), }, + { SIMDE_FLOAT16_VALUE( -23632.0), SIMDE_FLOAT16_VALUE( -21488.0), SIMDE_FLOAT16_VALUE( -20320.0), SIMDE_FLOAT16_VALUE( -38944.0), + SIMDE_FLOAT16_VALUE( -8784.0), SIMDE_FLOAT16_VALUE( -13304.0), SIMDE_FLOAT16_VALUE( -18816.0), SIMDE_FLOAT16_VALUE( -24816.0), } }, + { { SIMDE_FLOAT16_VALUE( 90.125), SIMDE_FLOAT16_VALUE( 83.25), SIMDE_FLOAT16_VALUE( 97.875), SIMDE_FLOAT16_VALUE( 182.375), + SIMDE_FLOAT16_VALUE( 195.0), SIMDE_FLOAT16_VALUE( 62.25), SIMDE_FLOAT16_VALUE( 79.0), SIMDE_FLOAT16_VALUE( 87.5625), }, + { SIMDE_FLOAT16_VALUE( -152.875), SIMDE_FLOAT16_VALUE( -221.625), SIMDE_FLOAT16_VALUE( -172.5), SIMDE_FLOAT16_VALUE( -251.0), + SIMDE_FLOAT16_VALUE( -91.6875), SIMDE_FLOAT16_VALUE( -42.8125), SIMDE_FLOAT16_VALUE( -115.9375), SIMDE_FLOAT16_VALUE( -157.5), }, + { SIMDE_FLOAT16_VALUE( -13776.0), SIMDE_FLOAT16_VALUE( -18448.0), SIMDE_FLOAT16_VALUE( -16880.0), SIMDE_FLOAT16_VALUE( -45792.0), + SIMDE_FLOAT16_VALUE( -17872.0), SIMDE_FLOAT16_VALUE( -2666.0), SIMDE_FLOAT16_VALUE( -9160.0), SIMDE_FLOAT16_VALUE( -13792.0), } }, + { { SIMDE_FLOAT16_VALUE( -246.125), SIMDE_FLOAT16_VALUE( -174.375), SIMDE_FLOAT16_VALUE( -140.375), SIMDE_FLOAT16_VALUE( -182.125), + SIMDE_FLOAT16_VALUE( -13.140625), SIMDE_FLOAT16_VALUE( -193.75), SIMDE_FLOAT16_VALUE( -193.0), SIMDE_FLOAT16_VALUE( -50.96875), }, + { SIMDE_FLOAT16_VALUE( -165.875), SIMDE_FLOAT16_VALUE( -0.9404296875), SIMDE_FLOAT16_VALUE( -124.9375), SIMDE_FLOAT16_VALUE( -205.0), + SIMDE_FLOAT16_VALUE( -91.375), SIMDE_FLOAT16_VALUE( -60.25), SIMDE_FLOAT16_VALUE( -171.75), SIMDE_FLOAT16_VALUE( -188.0), }, + { SIMDE_FLOAT16_VALUE( 40832.0), SIMDE_FLOAT16_VALUE( 164.0), SIMDE_FLOAT16_VALUE( 17536.0), SIMDE_FLOAT16_VALUE( 37344.0), + SIMDE_FLOAT16_VALUE( 1201.0), SIMDE_FLOAT16_VALUE( 11672.0), SIMDE_FLOAT16_VALUE( 33152.0), SIMDE_FLOAT16_VALUE( 9584.0), } }, + { { SIMDE_FLOAT16_VALUE( 250.0), SIMDE_FLOAT16_VALUE( 155.875), SIMDE_FLOAT16_VALUE( 238.5), SIMDE_FLOAT16_VALUE( 120.6875), + SIMDE_FLOAT16_VALUE( 214.0), SIMDE_FLOAT16_VALUE( 20.984375), SIMDE_FLOAT16_VALUE( 132.5), SIMDE_FLOAT16_VALUE( 91.0), }, + { SIMDE_FLOAT16_VALUE( 63.75), SIMDE_FLOAT16_VALUE( 37.65625), SIMDE_FLOAT16_VALUE( 61.21875), SIMDE_FLOAT16_VALUE( 169.625), + SIMDE_FLOAT16_VALUE( 110.875), SIMDE_FLOAT16_VALUE( 117.6875), SIMDE_FLOAT16_VALUE( 146.0), SIMDE_FLOAT16_VALUE( 171.5), }, + { SIMDE_FLOAT16_VALUE( 15936.0), SIMDE_FLOAT16_VALUE( 5868.0), SIMDE_FLOAT16_VALUE( 14600.0), SIMDE_FLOAT16_VALUE( 20464.0), + SIMDE_FLOAT16_VALUE( 23728.0), SIMDE_FLOAT16_VALUE( 2470.0), SIMDE_FLOAT16_VALUE( 19344.0), SIMDE_FLOAT16_VALUE( 15608.0), } }, + { { SIMDE_FLOAT16_VALUE( -228.0), SIMDE_FLOAT16_VALUE( -123.625), SIMDE_FLOAT16_VALUE( -5.078125), SIMDE_FLOAT16_VALUE( -49.15625), + SIMDE_FLOAT16_VALUE( -169.75), SIMDE_FLOAT16_VALUE( -46.5625), SIMDE_FLOAT16_VALUE( -224.625), SIMDE_FLOAT16_VALUE( -250.375), }, + { SIMDE_FLOAT16_VALUE( 232.125), SIMDE_FLOAT16_VALUE( 140.25), SIMDE_FLOAT16_VALUE( 0.3115234375), SIMDE_FLOAT16_VALUE( 6.703125), + SIMDE_FLOAT16_VALUE( 130.25), SIMDE_FLOAT16_VALUE( 97.4375), SIMDE_FLOAT16_VALUE( 153.125), SIMDE_FLOAT16_VALUE( 157.5), }, + { SIMDE_FLOAT16_VALUE( -52928.0), SIMDE_FLOAT16_VALUE( -17344.0), SIMDE_FLOAT16_VALUE( -1.58203125), SIMDE_FLOAT16_VALUE( -329.5), + SIMDE_FLOAT16_VALUE( -22112.0), SIMDE_FLOAT16_VALUE( -4536.0), SIMDE_FLOAT16_VALUE( -34400.0), SIMDE_FLOAT16_VALUE( -39424.0), } }, + { { SIMDE_FLOAT16_VALUE( 49.90625), SIMDE_FLOAT16_VALUE( 216.25), SIMDE_FLOAT16_VALUE( 129.375), SIMDE_FLOAT16_VALUE( 27.8125), + SIMDE_FLOAT16_VALUE( 243.5), SIMDE_FLOAT16_VALUE( 63.875), SIMDE_FLOAT16_VALUE( 48.90625), SIMDE_FLOAT16_VALUE( 169.0), }, + { SIMDE_FLOAT16_VALUE( -100.75), SIMDE_FLOAT16_VALUE( -101.125), SIMDE_FLOAT16_VALUE( -128.625), SIMDE_FLOAT16_VALUE( -94.0), + SIMDE_FLOAT16_VALUE( -9.0390625), SIMDE_FLOAT16_VALUE( -62.75), SIMDE_FLOAT16_VALUE( -239.625), SIMDE_FLOAT16_VALUE( -240.25), }, + { SIMDE_FLOAT16_VALUE( -5028.0), SIMDE_FLOAT16_VALUE( -21872.0), SIMDE_FLOAT16_VALUE( -16640.0), SIMDE_FLOAT16_VALUE( -2614.0), + SIMDE_FLOAT16_VALUE( -2202.0), SIMDE_FLOAT16_VALUE( -4008.0), SIMDE_FLOAT16_VALUE( -11720.0), SIMDE_FLOAT16_VALUE( -40608.0), } }, + { { SIMDE_FLOAT16_VALUE( -14.78125), SIMDE_FLOAT16_VALUE( -105.75), SIMDE_FLOAT16_VALUE( -180.25), SIMDE_FLOAT16_VALUE( -157.375), + SIMDE_FLOAT16_VALUE( -214.375), SIMDE_FLOAT16_VALUE( -5.015625), SIMDE_FLOAT16_VALUE( -74.875), SIMDE_FLOAT16_VALUE( -85.5625), }, + { SIMDE_FLOAT16_VALUE( -254.75), SIMDE_FLOAT16_VALUE( -234.5), SIMDE_FLOAT16_VALUE( -181.25), SIMDE_FLOAT16_VALUE( -122.3125), + SIMDE_FLOAT16_VALUE( -9.6015625), SIMDE_FLOAT16_VALUE( -90.1875), SIMDE_FLOAT16_VALUE( -11.671875), SIMDE_FLOAT16_VALUE( -161.0), }, + { SIMDE_FLOAT16_VALUE( 3766.0), SIMDE_FLOAT16_VALUE( 24800.0), SIMDE_FLOAT16_VALUE( 32672.0), SIMDE_FLOAT16_VALUE( 19248.0), + SIMDE_FLOAT16_VALUE( 2058.0), SIMDE_FLOAT16_VALUE( 452.25), SIMDE_FLOAT16_VALUE( 874.0), SIMDE_FLOAT16_VALUE( 13776.0), } } + }; + + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_float16x8_t r = simde_vmulq_f16(a, b); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vmulq_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -985,6 +1124,7 @@ test_simde_x_vmulq_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vmul_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_s8) @@ -996,6 +1136,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vmul_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_u32) SIMDE_TEST_FUNC_LIST_ENTRY(x_vmul_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_s8) diff --git a/test/arm/neon/mul_lane.c b/test/arm/neon/mul_lane.c index 1c35f9d62..b6adb4bd3 100644 --- a/test/arm/neon/mul_lane.c +++ b/test/arm/neon/mul_lane.c @@ -722,6 +722,53 @@ test_simde_vmul_laneq_u32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vmulq_lane_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[4]; + int lane; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 218.125), SIMDE_FLOAT16_VALUE( 147.75), SIMDE_FLOAT16_VALUE( 163.875), SIMDE_FLOAT16_VALUE( 3.16796875), + SIMDE_FLOAT16_VALUE( 168.5), SIMDE_FLOAT16_VALUE( 4.4453125), SIMDE_FLOAT16_VALUE( 166.25), SIMDE_FLOAT16_VALUE( 95.0625), }, + { SIMDE_FLOAT16_VALUE( 1.25), SIMDE_FLOAT16_VALUE( 69.25), SIMDE_FLOAT16_VALUE( 68.1875), SIMDE_FLOAT16_VALUE( 71.3125) }, + INT8_C( 0), + { SIMDE_FLOAT16_VALUE(272.65625), SIMDE_FLOAT16_VALUE(184.6875), SIMDE_FLOAT16_VALUE(204.84375), SIMDE_FLOAT16_VALUE(3.95947265625), + SIMDE_FLOAT16_VALUE(210.625), SIMDE_FLOAT16_VALUE(5.556640625), SIMDE_FLOAT16_VALUE(207.8125), SIMDE_FLOAT16_VALUE(118.828125) } }, + { { SIMDE_FLOAT16_VALUE( -190.5), SIMDE_FLOAT16_VALUE( -167.5), SIMDE_FLOAT16_VALUE( -108.0), SIMDE_FLOAT16_VALUE( -18.5), + SIMDE_FLOAT16_VALUE( -45.0), SIMDE_FLOAT16_VALUE( -37.2), SIMDE_FLOAT16_VALUE( -41.25), SIMDE_FLOAT16_VALUE( -212.4), }, + { SIMDE_FLOAT16_VALUE( 193.0), SIMDE_FLOAT16_VALUE( 17.5), SIMDE_FLOAT16_VALUE( 179.5), SIMDE_FLOAT16_VALUE( 116.2), }, + INT8_C( 1), + { SIMDE_FLOAT16_VALUE(-3333.75), SIMDE_FLOAT16_VALUE(-2931.25), SIMDE_FLOAT16_VALUE(-1890.0), SIMDE_FLOAT16_VALUE(-323.75), + SIMDE_FLOAT16_VALUE(-787.5), SIMDE_FLOAT16_VALUE(-651.0), SIMDE_FLOAT16_VALUE(-721.875), SIMDE_FLOAT16_VALUE(-3717.0) } }, + { { SIMDE_FLOAT16_VALUE( 19.0), SIMDE_FLOAT16_VALUE( 83.2), SIMDE_FLOAT16_VALUE( 7.75), SIMDE_FLOAT16_VALUE( 12.125), + SIMDE_FLOAT16_VALUE( 15.3), SIMDE_FLOAT16_VALUE( 26.5), SIMDE_FLOAT16_VALUE( 39.5), SIMDE_FLOAT16_VALUE( -7.25), }, + { SIMDE_FLOAT16_VALUE( -152.875), SIMDE_FLOAT16_VALUE( -221.625), SIMDE_FLOAT16_VALUE( -9.2), SIMDE_FLOAT16_VALUE( -251.0) }, + INT8_C( 2), + { SIMDE_FLOAT16_VALUE(-174.875), SIMDE_FLOAT16_VALUE(-765.44), SIMDE_FLOAT16_VALUE(-71.4), SIMDE_FLOAT16_VALUE(-111.55), + SIMDE_FLOAT16_VALUE(-140.76), SIMDE_FLOAT16_VALUE(-243.875), SIMDE_FLOAT16_VALUE(-363.4), SIMDE_FLOAT16_VALUE(66.7) } }, + { { SIMDE_FLOAT16_VALUE( -46.25), SIMDE_FLOAT16_VALUE( -74.5), SIMDE_FLOAT16_VALUE( -14.5), SIMDE_FLOAT16_VALUE( -1.125), + SIMDE_FLOAT16_VALUE( -13.25), SIMDE_FLOAT16_VALUE( -93.5), SIMDE_FLOAT16_VALUE( -19.0), SIMDE_FLOAT16_VALUE( -50.5), }, + { SIMDE_FLOAT16_VALUE( -165.875), SIMDE_FLOAT16_VALUE( -0.9404296875), SIMDE_FLOAT16_VALUE( -124.9375), SIMDE_FLOAT16_VALUE( -2.5) }, + INT8_C( 3), + { SIMDE_FLOAT16_VALUE( 115.625), SIMDE_FLOAT16_VALUE( 186.25), SIMDE_FLOAT16_VALUE( 36.25), SIMDE_FLOAT16_VALUE( 2.8125), + SIMDE_FLOAT16_VALUE( 33.125), SIMDE_FLOAT16_VALUE( 233.75), SIMDE_FLOAT16_VALUE( 47.5), SIMDE_FLOAT16_VALUE( 126.25), } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + + simde_float16x8_t r; + SIMDE_CONSTIFY_4_(simde_vmulq_lane_f16, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_f16(SIMDE_FLOAT16_VALUE(0.0))), test_vec[i].lane, a, b); + + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vmulq_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -2007,6 +2054,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vmul_laneq_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_laneq_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_laneq_u32) +SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_lane_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_lane_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_lane_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_lane_s16) diff --git a/test/arm/neon/mul_n.c b/test/arm/neon/mul_n.c index b512a0632..2377e47c1 100644 --- a/test/arm/neon/mul_n.c +++ b/test/arm/neon/mul_n.c @@ -3,6 +3,38 @@ #include "test-neon.h" #include "../../../simde/arm/neon/mul_n.h" +static int +test_simde_vmul_n_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 218.125), SIMDE_FLOAT16_VALUE( 147.75), SIMDE_FLOAT16_VALUE( 163.875), SIMDE_FLOAT16_VALUE( 3.16796875) }, + SIMDE_FLOAT16_VALUE( 1.25), + { SIMDE_FLOAT16_VALUE(272.65625), SIMDE_FLOAT16_VALUE(184.6875), SIMDE_FLOAT16_VALUE(204.84375), SIMDE_FLOAT16_VALUE(3.95947265625) } }, + { { SIMDE_FLOAT16_VALUE( -190.5), SIMDE_FLOAT16_VALUE( -167.5), SIMDE_FLOAT16_VALUE( -108.0), SIMDE_FLOAT16_VALUE( -18.5) }, + SIMDE_FLOAT16_VALUE( 17.5), + { SIMDE_FLOAT16_VALUE(-3333.75), SIMDE_FLOAT16_VALUE(-2931.25), SIMDE_FLOAT16_VALUE(-1890.0), SIMDE_FLOAT16_VALUE(-323.75) } }, + { { SIMDE_FLOAT16_VALUE( 19.0), SIMDE_FLOAT16_VALUE( 83.2), SIMDE_FLOAT16_VALUE( 7.75), SIMDE_FLOAT16_VALUE( 12.125) }, + SIMDE_FLOAT16_VALUE( -9.2), + { SIMDE_FLOAT16_VALUE(-174.875), SIMDE_FLOAT16_VALUE(-765.44), SIMDE_FLOAT16_VALUE(-71.4), SIMDE_FLOAT16_VALUE(-111.55) } }, + { { SIMDE_FLOAT16_VALUE( -46.25), SIMDE_FLOAT16_VALUE( -74.5), SIMDE_FLOAT16_VALUE( -14.5), SIMDE_FLOAT16_VALUE( -1.125) }, + SIMDE_FLOAT16_VALUE( -2.5), + { SIMDE_FLOAT16_VALUE( 115.625), SIMDE_FLOAT16_VALUE( 186.25), SIMDE_FLOAT16_VALUE( 36.25), SIMDE_FLOAT16_VALUE( 2.8125) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16 b = test_vec[i].b; + simde_float16x4_t r = simde_vmul_n_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vmul_n_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -355,6 +387,34 @@ test_simde_vmul_n_u32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vmulq_n_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[1]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 12.0), SIMDE_FLOAT16_VALUE( 48.0), SIMDE_FLOAT16_VALUE( 22.5), SIMDE_FLOAT16_VALUE( 19.25), + SIMDE_FLOAT16_VALUE( 8.5), SIMDE_FLOAT16_VALUE( 10.25), SIMDE_FLOAT16_VALUE( 4.625), SIMDE_FLOAT16_VALUE( 179.5) }, + { SIMDE_FLOAT16_VALUE( 124.0) }, + { SIMDE_FLOAT16_VALUE( 1488.0), SIMDE_FLOAT16_VALUE( 5952.0), SIMDE_FLOAT16_VALUE( 2790.0), SIMDE_FLOAT16_VALUE( 2387.0), + SIMDE_FLOAT16_VALUE( 1054.0), SIMDE_FLOAT16_VALUE( 1271.0), SIMDE_FLOAT16_VALUE( 573.5), SIMDE_FLOAT16_VALUE( 22256.0) } }, + { { SIMDE_FLOAT16_VALUE( -12.0), SIMDE_FLOAT16_VALUE( 48.0), SIMDE_FLOAT16_VALUE( -22.5), SIMDE_FLOAT16_VALUE( 19.25), + SIMDE_FLOAT16_VALUE( -8.5), SIMDE_FLOAT16_VALUE( -10.25), SIMDE_FLOAT16_VALUE( 4.125), SIMDE_FLOAT16_VALUE( -93.5) }, + { SIMDE_FLOAT16_VALUE( 23.0) }, + { SIMDE_FLOAT16_VALUE( -276.0), SIMDE_FLOAT16_VALUE( 1104.0), SIMDE_FLOAT16_VALUE( -517.5), SIMDE_FLOAT16_VALUE( 442.75), + SIMDE_FLOAT16_VALUE( -195.5), SIMDE_FLOAT16_VALUE( -235.75), SIMDE_FLOAT16_VALUE( 94.875), SIMDE_FLOAT16_VALUE( -2150.5) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t r = simde_vmulq_n_f16(a, test_vec[i].b[0]); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vmulq_n_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -708,6 +768,7 @@ test_simde_vmulq_n_u32 (SIMDE_MUNIT_TEST_ARGS) { SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vmul_n_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_n_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_n_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_n_s16) @@ -715,6 +776,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vmul_n_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_n_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vmul_n_u32) +SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_n_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_n_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_n_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vmulq_n_s16) diff --git a/test/arm/neon/padd.c b/test/arm/neon/padd.c index 286d9c464..12d04b937 100644 --- a/test/arm/neon/padd.c +++ b/test/arm/neon/padd.c @@ -3,6 +3,47 @@ #include "test-neon.h" #include "../../../simde/arm/neon/padd.h" +static int +test_simde_vpadd_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( -49.28), SIMDE_FLOAT16_VALUE( -109.00), SIMDE_FLOAT16_VALUE( -626.50), SIMDE_FLOAT16_VALUE( -567.00) }, + { SIMDE_FLOAT16_VALUE( -178.88), SIMDE_FLOAT16_VALUE( 10.22), SIMDE_FLOAT16_VALUE( 976.50), SIMDE_FLOAT16_VALUE( -31.19) }, + { SIMDE_FLOAT16_VALUE(-158.28), SIMDE_FLOAT16_VALUE(-1193.50), SIMDE_FLOAT16_VALUE(-168.66), SIMDE_FLOAT16_VALUE(945.31) } }, + { { SIMDE_FLOAT16_VALUE( -226.00), SIMDE_FLOAT16_VALUE( 89.44), SIMDE_FLOAT16_VALUE( -520.50), SIMDE_FLOAT16_VALUE( -200.50) }, + { SIMDE_FLOAT16_VALUE( -252.38), SIMDE_FLOAT16_VALUE( -439.75), SIMDE_FLOAT16_VALUE( -407.50), SIMDE_FLOAT16_VALUE( -450.75) }, + { SIMDE_FLOAT16_VALUE( -136.50), SIMDE_FLOAT16_VALUE( -721.00), SIMDE_FLOAT16_VALUE( -692.00), SIMDE_FLOAT16_VALUE( -858.00) } }, + { { SIMDE_FLOAT16_VALUE( -833.00), SIMDE_FLOAT16_VALUE( -157.12), SIMDE_FLOAT16_VALUE( -714.00), SIMDE_FLOAT16_VALUE( 972.50) }, + { SIMDE_FLOAT16_VALUE( 428.50), SIMDE_FLOAT16_VALUE( 298.75), SIMDE_FLOAT16_VALUE( 871.50), SIMDE_FLOAT16_VALUE( -919.50) }, + { SIMDE_FLOAT16_VALUE( -990.00), SIMDE_FLOAT16_VALUE( 258.50), SIMDE_FLOAT16_VALUE( 727.00), SIMDE_FLOAT16_VALUE( -48.00) } }, + { { SIMDE_FLOAT16_VALUE( 488.00), SIMDE_FLOAT16_VALUE( 129.00), SIMDE_FLOAT16_VALUE( -858.50), SIMDE_FLOAT16_VALUE( 112.56) }, + { SIMDE_FLOAT16_VALUE( 58.66), SIMDE_FLOAT16_VALUE( -133.88), SIMDE_FLOAT16_VALUE( 879.50), SIMDE_FLOAT16_VALUE( -920.50) }, + { SIMDE_FLOAT16_VALUE( 617.00), SIMDE_FLOAT16_VALUE( -746.00), SIMDE_FLOAT16_VALUE( -75.25), SIMDE_FLOAT16_VALUE( -41.00) } }, + { { SIMDE_FLOAT16_VALUE( 32.59), SIMDE_FLOAT16_VALUE( -750.50), SIMDE_FLOAT16_VALUE( -510.75), SIMDE_FLOAT16_VALUE( 239.50) }, + { SIMDE_FLOAT16_VALUE( -487.50), SIMDE_FLOAT16_VALUE( -177.50), SIMDE_FLOAT16_VALUE( 853.50), SIMDE_FLOAT16_VALUE( 23.77) }, + { SIMDE_FLOAT16_VALUE( -718.00), SIMDE_FLOAT16_VALUE( -271.25), SIMDE_FLOAT16_VALUE( -665.00), SIMDE_FLOAT16_VALUE( 877.50) } }, + { { SIMDE_FLOAT16_VALUE( -537.50), SIMDE_FLOAT16_VALUE( -992.00), SIMDE_FLOAT16_VALUE( -964.50), SIMDE_FLOAT16_VALUE( 707.00) }, + { SIMDE_FLOAT16_VALUE( -592.00), SIMDE_FLOAT16_VALUE( 386.00), SIMDE_FLOAT16_VALUE( 305.50), SIMDE_FLOAT16_VALUE( 496.00) }, + { SIMDE_FLOAT16_VALUE( -1530.00), SIMDE_FLOAT16_VALUE( -257.50), SIMDE_FLOAT16_VALUE( -206.00), SIMDE_FLOAT16_VALUE( 801.50) } }, + { { SIMDE_FLOAT16_VALUE( -180.50), SIMDE_FLOAT16_VALUE( -413.75), SIMDE_FLOAT16_VALUE( -555.50), SIMDE_FLOAT16_VALUE( -758.50) }, + { SIMDE_FLOAT16_VALUE( 375.50), SIMDE_FLOAT16_VALUE( -972.00), SIMDE_FLOAT16_VALUE( 948.50), SIMDE_FLOAT16_VALUE( 619.00) }, + { SIMDE_FLOAT16_VALUE( -594.00), SIMDE_FLOAT16_VALUE( -1314.00), SIMDE_FLOAT16_VALUE( -596.50), SIMDE_FLOAT16_VALUE( 1568.00) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_float16x4_t r = simde_vpadd_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vpadd_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -973,6 +1014,7 @@ test_simde_vpadds_f32 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vpadd_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vpadd_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vpadd_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vpadd_s16) diff --git a/test/arm/neon/pmax.c b/test/arm/neon/pmax.c index 3ce6bb131..9218deadc 100644 --- a/test/arm/neon/pmax.c +++ b/test/arm/neon/pmax.c @@ -3,6 +3,38 @@ #include "test-neon.h" #include "../../../simde/arm/neon/pmax.h" +static int +test_simde_vpmax_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 684.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 563.00) }, + { SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 15.31), SIMDE_FLOAT16_VALUE( 896.00), SIMDE_FLOAT16_VALUE( -786.50) }, + { SIMDE_FLOAT16_VALUE( 684.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00) } }, + { { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( -848.00), SIMDE_FLOAT16_VALUE( 29.20), SIMDE_FLOAT16_VALUE( 815.50) }, + { SIMDE_FLOAT16_VALUE( -856.00), SIMDE_FLOAT16_VALUE( -672.50), SIMDE_FLOAT16_VALUE( 267.25), SIMDE_FLOAT16_VALUE( 274.50) }, + { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 815.50), SIMDE_FLOAT16_VALUE( -672.50), SIMDE_FLOAT16_VALUE( 274.50) } }, + { { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( 9.56), SIMDE_FLOAT16_VALUE( -475.75), SIMDE_FLOAT16_VALUE( 425.25) }, + { SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( -294.75), SIMDE_FLOAT16_VALUE( 991.00), SIMDE_FLOAT16_VALUE( -99.19) }, + { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( 425.25), SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00) } }, + { { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 73.81), SIMDE_FLOAT16_VALUE( 14.28), SIMDE_FLOAT16_VALUE( 132.25) }, + { SIMDE_FLOAT16_VALUE( 545.00), SIMDE_FLOAT16_VALUE( 967.50), SIMDE_FLOAT16_VALUE( 819.50), SIMDE_FLOAT16_VALUE( 6.60) }, + { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 132.25), SIMDE_FLOAT16_VALUE( 967.50), SIMDE_FLOAT16_VALUE( 819.50) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_float16x4_t r = simde_vpmax_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vpmax_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -797,6 +829,7 @@ test_simde_vpmaxqd_f64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vpmax_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vpmax_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vpmax_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vpmax_s16) diff --git a/test/arm/neon/qrshrn_n.c b/test/arm/neon/qrshrn_n.c index 3aac112f1..b805c46d0 100644 --- a/test/arm/neon/qrshrn_n.c +++ b/test/arm/neon/qrshrn_n.c @@ -605,6 +605,112 @@ test_simde_vqrshrn_n_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vqrshrnh_n_s16 (SIMDE_MUNIT_TEST_ARGS) { + static const struct { + int16_t a; + int8_t r1; + int8_t r3; + int8_t r5; + int8_t r7; + int8_t r8; + } test_vec[] = { + { INT16_C( 32767), + INT8_MAX, + INT8_MAX, + INT8_MAX, + INT8_MAX, + INT8_MAX }, + { INT16_C( 29541), + INT8_MAX, + INT8_MAX, + INT8_MAX, + INT8_MAX, + INT8_C( 115) }, + { -INT16_C( 32766), + INT8_MIN, + INT8_MIN, + INT8_MIN, + INT8_MIN, + INT8_MIN }, + { INT16_C( 5687), + INT8_MAX, + INT8_MAX, + INT8_MAX, + INT8_C( 44), + INT8_C( 22) } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + int16_t r1 = simde_vqrshrnh_n_s16(test_vec[i].a, 1); + int16_t r3 = simde_vqrshrnh_n_s16(test_vec[i].a, 3); + int16_t r5 = simde_vqrshrnh_n_s16(test_vec[i].a, 5); + int16_t r7 = simde_vqrshrnh_n_s16(test_vec[i].a, 7); + int16_t r8 = simde_vqrshrnh_n_s16(test_vec[i].a, 8); + + simde_assert_equal_i16(r1, test_vec[i].r1); + simde_assert_equal_i16(r3, test_vec[i].r3); + simde_assert_equal_i16(r5, test_vec[i].r5); + simde_assert_equal_i16(r7, test_vec[i].r7); + simde_assert_equal_i16(r8, test_vec[i].r8); + } + + return 0; +} + +static int +test_simde_vqrshrnh_n_u16 (SIMDE_MUNIT_TEST_ARGS) { + static const struct { + uint16_t a; + uint8_t r1; + uint8_t r3; + uint8_t r5; + uint8_t r7; + uint8_t r8; + } test_vec[] = { + { UINT16_C( 32767), + UINT8_MAX, + UINT8_MAX, + UINT8_MAX, + UINT8_MAX, + UINT8_C( 128) }, + { UINT16_C( 29541), + UINT8_MAX, + UINT8_MAX, + UINT8_MAX, + UINT8_C( 231), + UINT8_C( 115) }, + { UINT16_C( 12766), + UINT8_MAX, + UINT8_MAX, + UINT8_MAX, + UINT8_C( 100), + UINT8_C( 50) }, + { UINT16_C( 5687), + UINT8_MAX, + UINT8_MAX, + UINT8_C( 178), + UINT8_C( 44), + UINT8_C( 22) } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + uint16_t r1 = simde_vqrshrnh_n_u16(test_vec[i].a, 1); + uint16_t r3 = simde_vqrshrnh_n_u16(test_vec[i].a, 3); + uint16_t r5 = simde_vqrshrnh_n_u16(test_vec[i].a, 5); + uint16_t r7 = simde_vqrshrnh_n_u16(test_vec[i].a, 7); + uint16_t r8 = simde_vqrshrnh_n_u16(test_vec[i].a, 8); + + simde_assert_equal_u16(r1, test_vec[i].r1); + simde_assert_equal_u16(r3, test_vec[i].r3); + simde_assert_equal_u16(r5, test_vec[i].r5); + simde_assert_equal_u16(r7, test_vec[i].r7); + simde_assert_equal_u16(r8, test_vec[i].r8); + } + + return 0; +} + static int test_simde_vqrshrns_n_s32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1004,6 +1110,8 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrn_n_s64) SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrn_n_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrn_n_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrn_n_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrnh_n_s16) +SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrnh_n_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrns_n_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrns_n_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrnd_n_s64) diff --git a/test/arm/neon/qrshrun_n.c b/test/arm/neon/qrshrun_n.c index ef986326a..7f3b25c8f 100644 --- a/test/arm/neon/qrshrun_n.c +++ b/test/arm/neon/qrshrun_n.c @@ -1,9 +1,87 @@ - #define SIMDE_TEST_ARM_NEON_INSN qrshrun_n #include "test-neon.h" #include "../../../simde/arm/neon/qrshrun_n.h" +static int +test_simde_vqrshrunh_n_s16 (SIMDE_MUNIT_TEST_ARGS) { + static const struct { + int16_t a; + uint8_t r1; + uint8_t r3; + uint8_t r5; + uint8_t r6; + uint8_t r8; + } test_vec[] = { + { -INT16_C( 14576), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0) }, + { INT16_C( 14737), + UINT8_MAX, + UINT8_MAX, + UINT8_MAX, + UINT8_C(230), + UINT8_C( 58) }, + { -INT16_C( 20270), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0) }, + { INT16_C( 19750), + UINT8_MAX, + UINT8_MAX, + UINT8_MAX, + UINT8_MAX, + UINT8_C( 77) }, + { -INT16_C( 27309), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0) }, + { INT16_C( 10024), + UINT8_MAX, + UINT8_MAX, + UINT8_MAX, + UINT8_C(157), + UINT8_C( 39) }, + { -INT16_C( 24653), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0) }, + { -INT16_C( 14574), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0), + UINT8_C( 0) } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + int16_t a = test_vec[i].a; + + uint8_t r1 = simde_vqrshrunh_n_s16(a, 1); + uint8_t r3 = simde_vqrshrunh_n_s16(a, 3); + uint8_t r5 = simde_vqrshrunh_n_s16(a, 5); + uint8_t r6 = simde_vqrshrunh_n_s16(a, 6); + uint8_t r8 = simde_vqrshrunh_n_s16(a, 8); + + simde_assert_equal_u8(r1, test_vec[i].r1); + simde_assert_equal_u8(r3, test_vec[i].r3); + simde_assert_equal_u8(r5, test_vec[i].r5); + simde_assert_equal_u8(r6, test_vec[i].r6); + simde_assert_equal_u8(r8, test_vec[i].r8); + } + + return 0; +} + static int test_simde_vqrshrun_n_s16 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -502,6 +580,7 @@ test_simde_vqrshruns_n_s32 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrunh_n_s16) SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrun_n_s16) SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrun_n_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vqrshrun_n_s64) diff --git a/test/arm/neon/recpe.c b/test/arm/neon/recpe.c index f352c371b..59d702345 100644 --- a/test/arm/neon/recpe.c +++ b/test/arm/neon/recpe.c @@ -97,6 +97,44 @@ test_simde_vrecped_f64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vrecpe_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(5.70), SIMDE_FLOAT16_VALUE(-7.70) }, + { SIMDE_FLOAT16_VALUE(-0.29), SIMDE_FLOAT16_VALUE(-0.26), SIMDE_FLOAT16_VALUE(0.18), SIMDE_FLOAT16_VALUE(-0.13) } }, + { { SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(-7.20), SIMDE_FLOAT16_VALUE(-7.50) }, + { SIMDE_FLOAT16_VALUE(0.27), SIMDE_FLOAT16_VALUE(0.29), SIMDE_FLOAT16_VALUE(-0.14), SIMDE_FLOAT16_VALUE(-0.13) } }, + { { SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(7.30), SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(8.90) }, + { SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(0.14), SIMDE_FLOAT16_VALUE(0.13), SIMDE_FLOAT16_VALUE(0.11) } }, + { { SIMDE_FLOAT16_VALUE(5.10), SIMDE_FLOAT16_VALUE(-8.90), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(-1.50) }, + { SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(-0.11), SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(-0.67) } }, + { { SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(-5.20) }, + { SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(0.14), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-0.19) } }, + { { SIMDE_FLOAT16_VALUE(-6.40), SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(8.90), SIMDE_FLOAT16_VALUE(-0.90) }, + { SIMDE_FLOAT16_VALUE(-0.16), SIMDE_FLOAT16_VALUE(0.42), SIMDE_FLOAT16_VALUE(0.11), SIMDE_FLOAT16_VALUE(-1.11) } }, + { { SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(-2.50) }, + { SIMDE_FLOAT16_VALUE(0.48), SIMDE_FLOAT16_VALUE(0.13), SIMDE_FLOAT16_VALUE(1.67), SIMDE_FLOAT16_VALUE(-0.40) } }, + { { SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(-9.40), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(7.00) }, + { SIMDE_FLOAT16_VALUE(-0.29), SIMDE_FLOAT16_VALUE(-0.11), SIMDE_FLOAT16_VALUE(-0.33), SIMDE_FLOAT16_VALUE(0.14) } }, + { { SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(2.20) }, + { SIMDE_FLOAT16_VALUE(-0.16), SIMDE_FLOAT16_VALUE(0.11), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(0.45) } }, + { { SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(1.60) }, + { SIMDE_FLOAT16_VALUE(0.25), SIMDE_FLOAT16_VALUE(0.24), SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(0.63) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t r = simde_vrecpe_f16(a); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vrecpe_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -284,6 +322,43 @@ test_simde_vrecpeq_f32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vrecpeq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(-9.30), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(9.10) }, + { SIMDE_FLOAT16_VALUE(0.13), SIMDE_FLOAT16_VALUE(-0.11), SIMDE_FLOAT16_VALUE(0.13), SIMDE_FLOAT16_VALUE(-0.32), SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(-0.29), SIMDE_FLOAT16_VALUE(-0.27), SIMDE_FLOAT16_VALUE(0.11) } }, + { { SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(9.10), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(-9.30), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(-5.20) }, + { SIMDE_FLOAT16_VALUE(0.18), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(0.26), SIMDE_FLOAT16_VALUE(0.11), SIMDE_FLOAT16_VALUE(0.21), SIMDE_FLOAT16_VALUE(-0.11), SIMDE_FLOAT16_VALUE(0.15), SIMDE_FLOAT16_VALUE(-0.19) } }, + { { SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(7.60), SIMDE_FLOAT16_VALUE(5.30), SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(-8.60) }, + { SIMDE_FLOAT16_VALUE(-0.24), SIMDE_FLOAT16_VALUE(-0.31), SIMDE_FLOAT16_VALUE(0.13), SIMDE_FLOAT16_VALUE(0.19), SIMDE_FLOAT16_VALUE(0.38), SIMDE_FLOAT16_VALUE(-0.29), SIMDE_FLOAT16_VALUE(0.11), SIMDE_FLOAT16_VALUE(-0.12) } }, + { { SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(4.30), SIMDE_FLOAT16_VALUE(9.10) }, + { SIMDE_FLOAT16_VALUE(-0.29), SIMDE_FLOAT16_VALUE(-1.43), SIMDE_FLOAT16_VALUE(0.67), SIMDE_FLOAT16_VALUE(0.22), SIMDE_FLOAT16_VALUE(0.12), SIMDE_FLOAT16_VALUE(0.15), SIMDE_FLOAT16_VALUE(0.23), SIMDE_FLOAT16_VALUE(0.11) } }, + { { SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(-9.30) }, + { SIMDE_FLOAT16_VALUE(-0.17), SIMDE_FLOAT16_VALUE(0.17), SIMDE_FLOAT16_VALUE(-0.11), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-0.37), SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(3.33), SIMDE_FLOAT16_VALUE(-0.11) } }, + { { SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(6.70), SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(4.40), SIMDE_FLOAT16_VALUE(4.10) }, + { SIMDE_FLOAT16_VALUE(-0.37), SIMDE_FLOAT16_VALUE(0.11), SIMDE_FLOAT16_VALUE(-0.16), SIMDE_FLOAT16_VALUE(0.15), SIMDE_FLOAT16_VALUE(-0.26), SIMDE_FLOAT16_VALUE(0.12), SIMDE_FLOAT16_VALUE(0.23), SIMDE_FLOAT16_VALUE(0.24) } }, + { { SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(-4.30), SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(6.70) }, + { SIMDE_FLOAT16_VALUE(-0.71), SIMDE_FLOAT16_VALUE(-0.11), SIMDE_FLOAT16_VALUE(0.11), SIMDE_FLOAT16_VALUE(0.14), SIMDE_FLOAT16_VALUE(-0.23), SIMDE_FLOAT16_VALUE(0.12), SIMDE_FLOAT16_VALUE(0.59), SIMDE_FLOAT16_VALUE(0.15) } }, + { { SIMDE_FLOAT16_VALUE(-7.20), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(-9.80), SIMDE_FLOAT16_VALUE(9.90) }, + { SIMDE_FLOAT16_VALUE(-0.14), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-0.32), SIMDE_FLOAT16_VALUE(0.17), SIMDE_FLOAT16_VALUE(0.59), SIMDE_FLOAT16_VALUE(0.14), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(0.10) } }, + { { SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(6.90), SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(3.00) }, + { SIMDE_FLOAT16_VALUE(0.71), SIMDE_FLOAT16_VALUE(-0.25), SIMDE_FLOAT16_VALUE(-0.16), SIMDE_FLOAT16_VALUE(0.17), SIMDE_FLOAT16_VALUE(0.14), SIMDE_FLOAT16_VALUE(0.42), SIMDE_FLOAT16_VALUE(0.15), SIMDE_FLOAT16_VALUE(0.33) } }, + { { SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(-0.40), SIMDE_FLOAT16_VALUE(9.50), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(4.30), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(-7.70) }, + { SIMDE_FLOAT16_VALUE(-1.43), SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(0.11), SIMDE_FLOAT16_VALUE(-0.21), SIMDE_FLOAT16_VALUE(0.14), SIMDE_FLOAT16_VALUE(0.23), SIMDE_FLOAT16_VALUE(0.33), SIMDE_FLOAT16_VALUE(-0.13) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t r = simde_vrecpeq_f16(a); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vrecpe_u32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -382,6 +457,7 @@ SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vrecpes_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrecped_f64) +SIMDE_TEST_FUNC_LIST_ENTRY(vrecpe_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vrecpe_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrecpe_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vrecpeq_f64) @@ -389,6 +465,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vrecpe_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vrecpeq_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vrecpeq_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vrecpeq_f16) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/recps.c b/test/arm/neon/recps.c index cb8b838ea..67421b078 100644 --- a/test/arm/neon/recps.c +++ b/test/arm/neon/recps.c @@ -236,6 +236,56 @@ test_simde_vrecps_f32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vrecps_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(4.40) }, + { SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(4.90) }, + { SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(8.45), SIMDE_FLOAT16_VALUE(7.76), SIMDE_FLOAT16_VALUE(-19.55) } }, + { { SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(-2.90) }, + { SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(-4.90) }, + { SIMDE_FLOAT16_VALUE(-3.88), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(-12.21) } }, + { { SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(-2.40) }, + { SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(1.70) }, + { SIMDE_FLOAT16_VALUE(1.53), SIMDE_FLOAT16_VALUE(2.12), SIMDE_FLOAT16_VALUE(-4.48), SIMDE_FLOAT16_VALUE(6.08) } }, + { { SIMDE_FLOAT16_VALUE(4.40), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(1.40) }, + { SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(3.20) }, + { SIMDE_FLOAT16_VALUE(7.72), SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(-8.28), SIMDE_FLOAT16_VALUE(-2.48) } }, + { { SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(3.40) }, + { SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(-4.20) }, + { SIMDE_FLOAT16_VALUE(4.96), SIMDE_FLOAT16_VALUE(0.00), SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(16.28) } }, + { { SIMDE_FLOAT16_VALUE(-2.90), SIMDE_FLOAT16_VALUE(-4.30), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(-3.00) }, + { SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(-2.40) }, + { SIMDE_FLOAT16_VALUE(-3.51), SIMDE_FLOAT16_VALUE(4.15), SIMDE_FLOAT16_VALUE(3.08), SIMDE_FLOAT16_VALUE(-5.20) } }, + { { SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(-4.10) }, + { SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(-4.60), SIMDE_FLOAT16_VALUE(-2.60) }, + { SIMDE_FLOAT16_VALUE(-4.45), SIMDE_FLOAT16_VALUE(4.94), SIMDE_FLOAT16_VALUE(-10.89), SIMDE_FLOAT16_VALUE(-8.66) } }, + { { SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(2.20) }, + { SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(-2.60) }, + { SIMDE_FLOAT16_VALUE(-4.24), SIMDE_FLOAT16_VALUE(2.66), SIMDE_FLOAT16_VALUE(0.89), SIMDE_FLOAT16_VALUE(7.72) } }, + { { SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(-0.80) }, + { SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(0.70) }, + { SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(2.33), SIMDE_FLOAT16_VALUE(-18.67), SIMDE_FLOAT16_VALUE(2.56) } }, + { { SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(-4.60), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(-4.30) }, + { SIMDE_FLOAT16_VALUE(4.10), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(-1.00), SIMDE_FLOAT16_VALUE(4.40) }, + { SIMDE_FLOAT16_VALUE(-16.45), SIMDE_FLOAT16_VALUE(22.70), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(20.92) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_float16x4_t r = simde_vrecps_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vrecpsq_f64 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -350,13 +400,64 @@ test_simde_vrecpsq_f32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vrecpsq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(-4.50), SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(-0.60), SIMDE_FLOAT16_VALUE(4.10) }, + { SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(1.10) }, + { SIMDE_FLOAT16_VALUE(-8.23), SIMDE_FLOAT16_VALUE(5.84), SIMDE_FLOAT16_VALUE(12.80), SIMDE_FLOAT16_VALUE(-5.35), SIMDE_FLOAT16_VALUE(1.01), SIMDE_FLOAT16_VALUE(0.48), SIMDE_FLOAT16_VALUE(1.52), SIMDE_FLOAT16_VALUE(-2.51) } }, + { { SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(4.30), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(-0.40), SIMDE_FLOAT16_VALUE(3.40) }, + { SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(4.10), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(-2.40), SIMDE_FLOAT16_VALUE(1.00) }, + { SIMDE_FLOAT16_VALUE(2.78), SIMDE_FLOAT16_VALUE(8.16), SIMDE_FLOAT16_VALUE(0.71), SIMDE_FLOAT16_VALUE(-9.55), SIMDE_FLOAT16_VALUE(-10.30), SIMDE_FLOAT16_VALUE(16.41), SIMDE_FLOAT16_VALUE(1.04), SIMDE_FLOAT16_VALUE(-1.40) } }, + { { SIMDE_FLOAT16_VALUE(-4.30), SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-2.40), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(-0.00), SIMDE_FLOAT16_VALUE(1.60) }, + { SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(-4.50), SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(-2.40), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(-4.30), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-2.40) }, + { SIMDE_FLOAT16_VALUE(-1.44), SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(-0.59), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(2.96), SIMDE_FLOAT16_VALUE(3.29), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(5.84) } }, + { { SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(-0.60), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(1.90), SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(1.90) }, + { SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(-4.50), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(-0.30) }, + { SIMDE_FLOAT16_VALUE(6.59), SIMDE_FLOAT16_VALUE(0.98), SIMDE_FLOAT16_VALUE(12.08), SIMDE_FLOAT16_VALUE(15.31), SIMDE_FLOAT16_VALUE(-6.55), SIMDE_FLOAT16_VALUE(12.35), SIMDE_FLOAT16_VALUE(-16.80), SIMDE_FLOAT16_VALUE(2.57) } }, + { { SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-2.60) }, + { SIMDE_FLOAT16_VALUE(-0.40), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(2.80) }, + { SIMDE_FLOAT16_VALUE(2.08), SIMDE_FLOAT16_VALUE(-6.40), SIMDE_FLOAT16_VALUE(22.00), SIMDE_FLOAT16_VALUE(-12.41), SIMDE_FLOAT16_VALUE(-7.18), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(12.14), SIMDE_FLOAT16_VALUE(9.28) } }, + { { SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(2.70), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(0.80) }, + { SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(-3.50) }, + { SIMDE_FLOAT16_VALUE(6.65), SIMDE_FLOAT16_VALUE(-5.02), SIMDE_FLOAT16_VALUE(2.56), SIMDE_FLOAT16_VALUE(1.96), SIMDE_FLOAT16_VALUE(6.42), SIMDE_FLOAT16_VALUE(14.58), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(4.80) } }, + { { SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(1.90) }, + { SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(2.70) }, + { SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(0.86), SIMDE_FLOAT16_VALUE(-0.87), SIMDE_FLOAT16_VALUE(3.41), SIMDE_FLOAT16_VALUE(15.68), SIMDE_FLOAT16_VALUE(3.69), SIMDE_FLOAT16_VALUE(-12.21), SIMDE_FLOAT16_VALUE(-3.13) } }, + { { SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(-2.80) }, + { SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(4.40), SIMDE_FLOAT16_VALUE(1.90), SIMDE_FLOAT16_VALUE(-0.90), SIMDE_FLOAT16_VALUE(-4.50), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(-3.20) }, + { SIMDE_FLOAT16_VALUE(3.15), SIMDE_FLOAT16_VALUE(18.72), SIMDE_FLOAT16_VALUE(-5.98), SIMDE_FLOAT16_VALUE(4.79), SIMDE_FLOAT16_VALUE(-20.50), SIMDE_FLOAT16_VALUE(-5.05), SIMDE_FLOAT16_VALUE(14.80), SIMDE_FLOAT16_VALUE(-6.96) } }, + { { SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(-1.00), SIMDE_FLOAT16_VALUE(-1.10), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(-0.90), SIMDE_FLOAT16_VALUE(3.60) }, + { SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(0.00), SIMDE_FLOAT16_VALUE(-0.90), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(-1.00) }, + { SIMDE_FLOAT16_VALUE(3.43), SIMDE_FLOAT16_VALUE(14.59), SIMDE_FLOAT16_VALUE(18.17), SIMDE_FLOAT16_VALUE(4.30), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(-1.24), SIMDE_FLOAT16_VALUE(-2.23), SIMDE_FLOAT16_VALUE(5.60) } }, + { { SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(-0.40), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(4.10), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(-1.80) }, + { SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(-3.70) }, + { SIMDE_FLOAT16_VALUE(4.72), SIMDE_FLOAT16_VALUE(2.28), SIMDE_FLOAT16_VALUE(7.04), SIMDE_FLOAT16_VALUE(1.15), SIMDE_FLOAT16_VALUE(7.74), SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(-8.65), SIMDE_FLOAT16_VALUE(-4.66) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_float16x8_t r = simde_vrecpsq_f16(a, b); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vrecpss_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrecpsd_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vrecps_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vrecps_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vrecps_f16) +SIMDE_TEST_FUNC_LIST_ENTRY(vrecpsq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vrecpsq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrecpsq_f64) SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/reinterpret.c b/test/arm/neon/reinterpret.c index c545cd36d..6f4a7af62 100644 --- a/test/arm/neon/reinterpret.c +++ b/test/arm/neon/reinterpret.c @@ -6669,6 +6669,593 @@ test_simde_vreinterpretq_u64_f64 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vreinterpret_f16_f32 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float32 a[2]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( 640.27), SIMDE_FLOAT32_C( -585.88) }, + }, + { { SIMDE_FLOAT32_C( 495.02), SIMDE_FLOAT32_C( -454.59) }, + }, + { { SIMDE_FLOAT32_C( -794.50), SIMDE_FLOAT32_C( -757.76) }, + }, + { { SIMDE_FLOAT32_C( -987.01), SIMDE_FLOAT32_C( -967.63) }, + }, + { { SIMDE_FLOAT32_C( 776.12), SIMDE_FLOAT32_C( -392.25) }, + }, + { { SIMDE_FLOAT32_C( 488.06), SIMDE_FLOAT32_C( -965.22) }, + }, + { { SIMDE_FLOAT32_C( -118.01), SIMDE_FLOAT32_C( 15.16) }, + }, + { { SIMDE_FLOAT32_C( -392.02), SIMDE_FLOAT32_C( 26.20) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x2_t a = simde_vld1_f32(test_vec[i].a); + simde_float32x2_private a_ = simde_float32x2_to_private(a); + simde_float16x4_t r = simde_vreinterpret_f16_f32(a); + simde_float16x4_private r_ = simde_float16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpret_f16_s16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + int16_t a[4]; + } test_vec[] = { + { { -INT16_C( 27026), -INT16_C( 5702), -INT16_C( 32251), -INT16_C( 22224) }, + }, + { { INT16_C( 18627), -INT16_C( 18788), INT16_C( 28877), INT16_C( 229) }, + }, + { { -INT16_C( 22464), INT16_C( 10858), -INT16_C( 1223), -INT16_C( 1199) }, + }, + { { INT16_C( 17727), INT16_C( 2234), INT16_C( 24935), -INT16_C( 10779) }, + }, + { { -INT16_C( 24584), -INT16_C( 578), -INT16_C( 4575), -INT16_C( 6746) }, + }, + { { INT16_C( 16951), INT16_C( 1179), -INT16_C( 32590), -INT16_C( 3324) }, + }, + { { INT16_C( 28456), INT16_C( 24861), INT16_C( 28522), -INT16_C( 22180) }, + }, + { { INT16_C( 5812), INT16_C( 7090), -INT16_C( 26760), INT16_C( 28912) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int16x4_t a = simde_vld1_s16(test_vec[i].a); + simde_int16x4_private a_ = simde_int16x4_to_private(a); + simde_float16x4_t r = simde_vreinterpret_f16_s16(a); + simde_float16x4_private r_ = simde_float16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpret_f16_s32 (SIMDE_MUNIT_TEST_ARGS) { + struct { + int32_t a[2]; + } test_vec[] = { + { { -INT32_C( 115647159), INT32_C( 1543473707) }, + }, + { { -INT32_C( 414762519), -INT32_C( 1092812093) }, + }, + { { -INT32_C( 524899849), -INT32_C( 1091006359) }, + }, + { { INT32_C( 1246431952), -INT32_C( 91088719) }, + }, + { { -INT32_C( 1577865867), INT32_C( 570225207) }, + }, + { { -INT32_C( 301448405), INT32_C( 1017963845) }, + }, + { { -INT32_C( 149134450), -INT32_C( 994765581) }, + }, + { { -INT32_C( 821166050), -INT32_C( 1899388904) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int32x2_t a = simde_vld1_s32(test_vec[i].a); + simde_int32x2_private a_ = simde_int32x2_to_private(a); + simde_float16x4_t r = simde_vreinterpret_f16_s32(a); + simde_float16x4_private r_ = simde_float16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpret_f16_s64 (SIMDE_MUNIT_TEST_ARGS) { + struct { + int64_t a[1]; + } test_vec[] = { + { { INT64_C( 6507368899876856448) }, + }, + { { -INT64_C( 5606110019210035735) }, + }, + { { INT64_C( 5538191326012830769) }, + }, + { { -INT64_C( 3913861957691473674) }, + }, + { { -INT64_C( 93860817958845234) }, + }, + { { INT64_C( 3899560943408114888) }, + }, + { { -INT64_C( 3174423257829653766) }, + }, + { { -INT64_C( 3548350518083791698) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int64x1_t a = simde_vld1_s64(test_vec[i].a); + simde_int64x1_private a_ = simde_int64x1_to_private(a); + simde_float16x4_t r = simde_vreinterpret_f16_s64(a); + simde_float16x4_private r_ = simde_float16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpret_f16_s8 (SIMDE_MUNIT_TEST_ARGS) { + struct { + int8_t a[8]; + } test_vec[] = { + { { -INT8_C( 42), INT8_C( 92), INT8_C( 93), INT8_C( 70), INT8_C( 89), -INT8_C( 37), -INT8_C( 103), -INT8_C( 92) }, + }, + { { INT8_C( 40), -INT8_C( 95), -INT8_C( 44), INT8_C( 67), -INT8_C( 63), -INT8_C( 92), -INT8_C( 108), INT8_C( 10) }, + }, + { { INT8_C( 37), INT8_C( 114), -INT8_C( 8), -INT8_C( 112), -INT8_C( 60), -INT8_C( 12), -INT8_C( 68), -INT8_C( 73) }, + }, + { { -INT8_C( 40), -INT8_C( 11), -INT8_C( 75), INT8_C( 51), -INT8_C( 124), -INT8_C( 99), INT8_C( 109), INT8_C( 90) }, + }, + { { -INT8_C( 7), -INT8_C( 54), -INT8_C( 95), INT8_C( 82), -INT8_C( 91), INT8_C( 58), -INT8_C( 10), -INT8_C( 50) }, + }, + { { -INT8_C( 37), -INT8_C( 54), INT8_C( 17), -INT8_C( 100), INT8_C( 110), -INT8_C( 91), -INT8_C( 90), -INT8_C( 108) }, + }, + { { INT8_C( 23), -INT8_C( 97), INT8_C( 36), -INT8_C( 36), -INT8_C( 109), -INT8_C( 31), -INT8_C( 109), INT8_C( 107) }, + }, + { { -INT8_C( 42), INT8_C( 73), -INT8_C( 97), INT8_C( 91), -INT8_C( 26), INT8_C( 12), -INT8_C( 75), -INT8_C( 33) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int8x8_t a = simde_vld1_s8(test_vec[i].a); + simde_int8x8_private a_ = simde_int8x8_to_private(a); + simde_float16x4_t r = simde_vreinterpret_f16_s8(a); + simde_float16x4_private r_ = simde_float16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpret_f16_u32 (SIMDE_MUNIT_TEST_ARGS) { + struct { + uint32_t a[2]; + } test_vec[] = { + { { UINT32_C(3803574018), UINT32_C( 183881149) }, + }, + { { UINT32_C( 881972491), UINT32_C(2577490452) }, + }, + { { UINT32_C( 231932657), UINT32_C(1707981836) }, + }, + { { UINT32_C(2565105070), UINT32_C(1101186879) }, + }, + { { UINT32_C(1931696054), UINT32_C( 813504548) }, + }, + { { UINT32_C( 40111854), UINT32_C(1654326640) }, + }, + { { UINT32_C( 342846983), UINT32_C(3631824170) }, + }, + { { UINT32_C(3782303138), UINT32_C(3676508964) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint32x2_t a = simde_vld1_u32(test_vec[i].a); + simde_uint32x2_private a_ = simde_uint32x2_to_private(a); + simde_float16x4_t r = simde_vreinterpret_f16_u32(a); + simde_float16x4_private r_ = simde_float16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpret_f16_u64 (SIMDE_MUNIT_TEST_ARGS) { + struct { + uint64_t a[1]; + } test_vec[] = { + { { UINT64_C( 8779430749390950521) }, + }, + { { UINT64_C( 5787192216487944357) }, + }, + { { UINT64_C( 1212378576244495394) }, + }, + { { UINT64_C(11587186962892113876) }, + }, + { { UINT64_C(15419974588312544197) }, + }, + { { UINT64_C( 584303456178448674) }, + }, + { { UINT64_C( 9413963231737312176) }, + }, + { { UINT64_C(10928834220922494436) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint64x1_t a = simde_vld1_u64(test_vec[i].a); + simde_uint64x1_private a_ = simde_uint64x1_to_private(a); + simde_float16x4_t r = simde_vreinterpret_f16_u64(a); + simde_float16x4_private r_ = simde_float16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpret_f16_u8 (SIMDE_MUNIT_TEST_ARGS) { + struct { + uint8_t a[8]; + } test_vec[] = { + { { UINT8_C(112), UINT8_C(213), UINT8_C(254), UINT8_C(209), UINT8_C( 81), UINT8_C(219), UINT8_C(117), UINT8_C(223) }, + }, + { { UINT8_C(124), UINT8_C(231), UINT8_C(194), UINT8_C(124), UINT8_C(243), UINT8_C( 26), UINT8_C(211), UINT8_C(153) }, + }, + { { UINT8_C(234), UINT8_C( 24), UINT8_C(169), UINT8_C(251), UINT8_C( 31), UINT8_C(217), UINT8_C(225), UINT8_C(202) }, + }, + { { UINT8_C( 55), UINT8_C(239), UINT8_C( 94), UINT8_C(148), UINT8_C(180), UINT8_C(176), UINT8_C( 71), UINT8_C( 36) }, + }, + { { UINT8_C(133), UINT8_C( 70), UINT8_C(245), UINT8_C(214), UINT8_C( 33), UINT8_C(106), UINT8_C(181), UINT8_C(157) }, + }, + { { UINT8_C( 81), UINT8_C(119), UINT8_C( 26), UINT8_C( 68), UINT8_C(145), UINT8_C(237), UINT8_C(222), UINT8_C(123) }, + }, + { { UINT8_C( 6), UINT8_C(135), UINT8_C(118), UINT8_C( 37), UINT8_C( 96), UINT8_C( 87), UINT8_C(240), UINT8_C(151) }, + }, + { { UINT8_C( 70), UINT8_C( 78), UINT8_C( 43), UINT8_C(250), UINT8_C(254), UINT8_C(115), UINT8_C( 30), UINT8_C(131) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint8x8_t a = simde_vld1_u8(test_vec[i].a); + simde_uint8x8_private a_ = simde_uint8x8_to_private(a); + simde_float16x4_t r = simde_vreinterpret_f16_u8(a); + simde_float16x4_private r_ = simde_float16x4_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpretq_f16_f32 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float32 a[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C( -811.50), SIMDE_FLOAT32_C( 514.96), SIMDE_FLOAT32_C( -136.00), SIMDE_FLOAT32_C( -141.79) }, + }, + { { SIMDE_FLOAT32_C( 61.02), SIMDE_FLOAT32_C( 477.62), SIMDE_FLOAT32_C( 148.51), SIMDE_FLOAT32_C( 991.88) }, + }, + { { SIMDE_FLOAT32_C( -930.50), SIMDE_FLOAT32_C( 415.23), SIMDE_FLOAT32_C( -261.81), SIMDE_FLOAT32_C( 239.22) }, + }, + { { SIMDE_FLOAT32_C( -235.74), SIMDE_FLOAT32_C( -683.57), SIMDE_FLOAT32_C( -77.80), SIMDE_FLOAT32_C( 884.34) }, + }, + { { SIMDE_FLOAT32_C( -663.55), SIMDE_FLOAT32_C( 620.01), SIMDE_FLOAT32_C( -701.35), SIMDE_FLOAT32_C( 534.67) }, + }, + { { SIMDE_FLOAT32_C( -55.34), SIMDE_FLOAT32_C( 286.47), SIMDE_FLOAT32_C( -242.86), SIMDE_FLOAT32_C( -763.34) }, + }, + { { SIMDE_FLOAT32_C( 995.87), SIMDE_FLOAT32_C( 465.38), SIMDE_FLOAT32_C( 128.46), SIMDE_FLOAT32_C( -623.09) }, + }, + { { SIMDE_FLOAT32_C( 144.58), SIMDE_FLOAT32_C( 923.36), SIMDE_FLOAT32_C( -420.92), SIMDE_FLOAT32_C( 333.08) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t a = simde_vld1q_f32(test_vec[i].a); + simde_float32x4_private a_ = simde_float32x4_to_private(a); + simde_float16x8_t r = simde_vreinterpretq_f16_f32(a); + simde_float16x8_private r_ = simde_float16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpretq_f16_s16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + int16_t a[8]; + } test_vec[] = { + { { INT16_C( 26800), INT16_C( 6579), INT16_C( 6869), INT16_C( 1599), -INT16_C( 6376), -INT16_C( 21236), INT16_C( 31152), INT16_C( 26129) }, + }, + { { INT16_C( 4862), -INT16_C( 26934), -INT16_C( 17327), -INT16_C( 8418), INT16_C( 12000), -INT16_C( 10920), -INT16_C( 22979), -INT16_C( 4503) }, + }, + { { INT16_C( 7438), -INT16_C( 7417), INT16_C( 17975), INT16_C( 20713), -INT16_C( 2770), -INT16_C( 8451), INT16_C( 3694), INT16_C( 27972) }, + }, + { { INT16_C( 3616), INT16_C( 28931), INT16_C( 8650), -INT16_C( 21936), -INT16_C( 22449), -INT16_C( 29313), -INT16_C( 6066), INT16_C( 23675) }, + }, + { { -INT16_C( 32251), INT16_C( 15679), INT16_C( 10441), -INT16_C( 2163), -INT16_C( 30179), -INT16_C( 29483), INT16_C( 6552), -INT16_C( 18183) }, + }, + { { -INT16_C( 985), -INT16_C( 3798), INT16_C( 31261), INT16_C( 28059), INT16_C( 6691), INT16_C( 29178), INT16_C( 29954), INT16_C( 2254) }, + }, + { { INT16_C( 3575), -INT16_C( 16315), -INT16_C( 11722), INT16_C( 21431), -INT16_C( 29604), -INT16_C( 2849), -INT16_C( 10075), -INT16_C( 13140) }, + }, + { { -INT16_C( 10540), -INT16_C( 3395), INT16_C( 22609), INT16_C( 29791), INT16_C( 22898), INT16_C( 30181), -INT16_C( 19506), -INT16_C( 14979) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int16x8_t a = simde_vld1q_s16(test_vec[i].a); + simde_int16x8_private a_ = simde_int16x8_to_private(a); + simde_float16x8_t r = simde_vreinterpretq_f16_s16(a); + simde_float16x8_private r_ = simde_float16x8_to_private(r); + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpretq_f16_s32 (SIMDE_MUNIT_TEST_ARGS) { + struct { + int32_t a[4]; + } test_vec[] = { + { { INT32_C( 623130355), INT32_C( 1449239400), -INT32_C( 1128746035), -INT32_C( 1367149809) }, + }, + { { -INT32_C( 2072522775), -INT32_C( 1280826145), INT32_C( 2128924204), -INT32_C( 1000200240) }, + }, + { { -INT32_C( 957774242), -INT32_C( 149075415), INT32_C( 229889534), -INT32_C( 1296353591) }, + }, + { { -INT32_C( 449367547), -INT32_C( 2087133353), INT32_C( 2114026925), INT32_C( 37905316) }, + }, + { { INT32_C( 331951082), INT32_C( 1946871414), -INT32_C( 2071871813), -INT32_C( 113820428) }, + }, + { { -INT32_C( 958501265), -INT32_C( 95848627), -INT32_C( 1736946700), -INT32_C( 1734624594) }, + }, + { { INT32_C( 1554801894), INT32_C( 97564234), INT32_C( 1753895284), -INT32_C( 60636787) }, + }, + { { INT32_C( 2093105199), -INT32_C( 1418326857), INT32_C( 88403799), -INT32_C( 1885413463) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int32x4_t a = simde_vld1q_s32(test_vec[i].a); + simde_int32x4_private a_ = simde_int32x4_to_private(a); + simde_float16x8_t r = simde_vreinterpretq_f16_s32(a); + simde_float16x8_private r_ = simde_float16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpretq_f16_s64 (SIMDE_MUNIT_TEST_ARGS) { + struct { + int64_t a[2]; + } test_vec[] = { + { { -INT64_C( 7111391188455227457), -INT64_C( 3254191077044569329) }, + }, + { { -INT64_C( 1650031472652397181), -INT64_C( 309481479475721661) }, + }, + { { INT64_C( 5693002100524252415), -INT64_C( 3378233746908740393) }, + }, + { { -INT64_C( 6847697544965884688), -INT64_C( 4550811824021290590) }, + }, + { { -INT64_C( 7507740545089526719), INT64_C( 2218023018207253417) }, + }, + { { -INT64_C( 9191243350082271628), -INT64_C( 8581830885716983195) }, + }, + { { -INT64_C( 2760187395494638758), INT64_C( 664167231916119275) }, + }, + { { -INT64_C( 1243752674535709601), -INT64_C( 6115893445395211696) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int64x2_t a = simde_vld1q_s64(test_vec[i].a); + simde_int64x2_private a_ = simde_int64x2_to_private(a); + simde_float16x8_t r = simde_vreinterpretq_f16_s64(a); + simde_float16x8_private r_ = simde_float16x8_to_private(r); + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpretq_f16_s8 (SIMDE_MUNIT_TEST_ARGS) { + struct { + int8_t a[16]; + } test_vec[] = { + { { INT8_C( 126), -INT8_C( 42), INT8_C( 86), -INT8_C( 114), -INT8_C( 16), INT8_C( 92), -INT8_C( 85), INT8_C( 13), + -INT8_C( 40), INT8_C( 5), INT8_C( 82), INT8_C( 85), INT8_C( 58), INT8_MIN, -INT8_C( 124), -INT8_C( 105) }, + }, + { { INT8_C( 11), INT8_C( 67), INT8_C( 88), INT8_C( 58), -INT8_C( 6), -INT8_C( 66), -INT8_C( 54), INT8_C( 93), + -INT8_C( 80), -INT8_C( 34), -INT8_C( 77), -INT8_C( 9), INT8_C( 108), INT8_C( 83), -INT8_C( 44), -INT8_C( 22) }, + }, + { { INT8_C( 41), INT8_C( 42), INT8_C( 120), INT8_C( 26), -INT8_C( 122), INT8_C( 35), INT8_C( 39), INT8_C( 95), + INT8_C( 41), INT8_C( 121), -INT8_C( 76), INT8_C( 99), -INT8_C( 7), INT8_C( 56), -INT8_C( 6), INT8_C( 4) }, + }, + { { INT8_C( 124), INT8_C( 82), INT8_C( 62), INT8_C( 118), INT8_C( 16), INT8_C( 8), -INT8_C( 45), -INT8_C( 63), + -INT8_C( 25), -INT8_C( 122), -INT8_C( 72), INT8_C( 83), -INT8_C( 39), -INT8_C( 116), INT8_C( 61), INT8_C( 3) }, + }, + { { -INT8_C( 74), -INT8_C( 75), INT8_C( 29), INT8_C( 61), -INT8_C( 40), INT8_C( 68), -INT8_C( 100), INT8_C( 1), + -INT8_C( 67), INT8_C( 80), INT8_C( 100), -INT8_C( 74), -INT8_C( 120), INT8_C( 95), -INT8_C( 69), INT8_C( 4) }, + }, + { { -INT8_C( 79), -INT8_C( 7), INT8_C( 122), -INT8_C( 62), INT8_C( 2), INT8_C( 77), -INT8_C( 125), -INT8_C( 23), + -INT8_C( 45), INT8_C( 59), INT8_C( 60), -INT8_C( 83), -INT8_C( 57), INT8_C( 121), -INT8_C( 80), INT8_C( 125) }, + }, + { { INT8_C( 46), -INT8_C( 51), -INT8_C( 70), INT8_C( 6), INT8_C( 17), INT8_C( 86), INT8_C( 8), -INT8_C( 50), + -INT8_C( 90), INT8_C( 108), -INT8_C( 124), INT8_C( 47), -INT8_C( 53), INT8_C( 63), INT8_C( 51), INT8_C( 125) }, + }, + { { INT8_C( 57), -INT8_C( 82), INT8_C( 63), INT8_C( 59), -INT8_C( 5), -INT8_C( 62), INT8_C( 36), -INT8_C( 49), + -INT8_C( 3), INT8_C( 96), INT8_C( 124), -INT8_C( 60), -INT8_C( 39), INT8_C( 44), INT8_C( 65), INT8_C( 7) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_int8x16_t a = simde_vld1q_s8(test_vec[i].a); + simde_int8x16_private a_ = simde_int8x16_to_private(a); + simde_float16x8_t r = simde_vreinterpretq_f16_s8(a); + simde_float16x8_private r_ = simde_float16x8_to_private(r); + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpretq_f16_u32 (SIMDE_MUNIT_TEST_ARGS) { + struct { + uint32_t a[4]; + } test_vec[] = { + { { UINT32_C( 798628804), UINT32_C(2308740029), UINT32_C(1010183400), UINT32_C( 499135747) }, + }, + { { UINT32_C(3302186879), UINT32_C(1617207352), UINT32_C(1291082784), UINT32_C(3849247008) }, + }, + { { UINT32_C(2970880244), UINT32_C(2201727131), UINT32_C(3753865692), UINT32_C( 654147750) }, + }, + { { UINT32_C( 401264863), UINT32_C(2423803504), UINT32_C(3420220587), UINT32_C( 967854661) }, + }, + { { UINT32_C(4008428627), UINT32_C(1366435444), UINT32_C(1026568599), UINT32_C(2439196081) }, + }, + { { UINT32_C(1839746813), UINT32_C(1207771292), UINT32_C(3524516237), UINT32_C(1997325092) }, + }, + { { UINT32_C(4234540936), UINT32_C(3025000221), UINT32_C(3136388617), UINT32_C(2840286635) }, + }, + { { UINT32_C(1058469027), UINT32_C(2709984276), UINT32_C( 292854509), UINT32_C(3850928221) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint32x4_t a = simde_vld1q_u32(test_vec[i].a); + simde_uint32x4_private a_ = simde_uint32x4_to_private(a); + simde_float16x8_t r = simde_vreinterpretq_f16_u32(a); + simde_float16x8_private r_ = simde_float16x8_to_private(r); + + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpretq_f16_u64 (SIMDE_MUNIT_TEST_ARGS) { + struct { + uint64_t a[2]; + } test_vec[] = { + { { UINT64_C( 1234218851471792026), UINT64_C( 2677674681134575894) }, + }, + { { UINT64_C(14515460789981832380), UINT64_C( 8215729928409844471) }, + }, + { { UINT64_C(18432155657786037817), UINT64_C(11578942536244388252) }, + }, + { { UINT64_C(16827624080118754063), UINT64_C( 5552162173842289092) }, + }, + { { UINT64_C(16230363121171568980), UINT64_C( 8591211574267264694) }, + }, + { { UINT64_C( 117863513551373256), UINT64_C( 8002802099049782445) }, + }, + { { UINT64_C(11810948322241091523), UINT64_C( 4217752382814901672) }, + }, + { { UINT64_C( 2754116619510988282), UINT64_C( 4755228904491897970) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint64x2_t a = simde_vld1q_u64(test_vec[i].a); + simde_uint64x2_private a_ = simde_uint64x2_to_private(a); + simde_float16x8_t r = simde_vreinterpretq_f16_u64(a); + simde_float16x8_private r_ = simde_float16x8_to_private(r); + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + +static int +test_simde_vreinterpretq_f16_u8 (SIMDE_MUNIT_TEST_ARGS) { + struct { + uint8_t a[16]; + } test_vec[] = { + { { UINT8_C( 74), UINT8_C( 19), UINT8_C( 69), UINT8_C( 21), UINT8_C( 71), UINT8_C( 59), UINT8_C(199), UINT8_C(127), + UINT8_C( 82), UINT8_C(179), UINT8_C(169), UINT8_C(199), UINT8_C( 92), UINT8_C( 94), UINT8_C( 56), UINT8_C(138) }, + }, + { { UINT8_C(242), UINT8_C(208), UINT8_C( 27), UINT8_C( 42), UINT8_MAX, UINT8_C(136), UINT8_C( 16), UINT8_C(131), + UINT8_C( 2), UINT8_C( 11), UINT8_C( 23), UINT8_C(252), UINT8_C(182), UINT8_C(246), UINT8_C(201), UINT8_C( 0) }, + }, + { { UINT8_C( 10), UINT8_C( 14), UINT8_C( 22), UINT8_C( 81), UINT8_C( 73), UINT8_C(221), UINT8_C(208), UINT8_C(156), + UINT8_C(144), UINT8_C(121), UINT8_C( 99), UINT8_C(236), UINT8_C(215), UINT8_C(155), UINT8_C(118), UINT8_C(202) }, + }, + { { UINT8_C(108), UINT8_C(145), UINT8_C(244), UINT8_C(107), UINT8_C( 25), UINT8_C( 4), UINT8_C(239), UINT8_C( 28), + UINT8_C( 15), UINT8_C( 6), UINT8_C( 24), UINT8_C(197), UINT8_C(253), UINT8_C(225), UINT8_C(198), UINT8_C( 7) }, + }, + { { UINT8_C(240), UINT8_C(220), UINT8_C( 88), UINT8_C( 57), UINT8_C(185), UINT8_C( 40), UINT8_C(213), UINT8_C( 73), + UINT8_C(161), UINT8_C( 56), UINT8_C( 53), UINT8_C(120), UINT8_C(212), UINT8_C(172), UINT8_C( 66), UINT8_C( 64) }, + }, + { { UINT8_C( 61), UINT8_C( 54), UINT8_C(171), UINT8_C( 87), UINT8_C( 58), UINT8_C(154), UINT8_C(115), UINT8_C( 74), + UINT8_C(161), UINT8_C(139), UINT8_C( 15), UINT8_C(158), UINT8_C(108), UINT8_C(213), UINT8_C(165), UINT8_C( 92) }, + }, + { { UINT8_C(177), UINT8_C(253), UINT8_C(150), UINT8_C(106), UINT8_C( 37), UINT8_C(107), UINT8_C(179), UINT8_C(198), + UINT8_C(164), UINT8_C(233), UINT8_C( 62), UINT8_C(120), UINT8_C(149), UINT8_C(129), UINT8_C(184), UINT8_C(210) }, + }, + { { UINT8_C(183), UINT8_C( 99), UINT8_C( 41), UINT8_C(242), UINT8_C(254), UINT8_C(156), UINT8_C( 60), UINT8_C(159), + UINT8_C( 39), UINT8_C( 75), UINT8_C( 61), UINT8_C(148), UINT8_C( 33), UINT8_C(226), UINT8_C(240), UINT8_C(210) }, + }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint8x16_t a = simde_vld1q_u8(test_vec[i].a); + simde_uint8x16_private a_ = simde_uint8x16_to_private(a); + simde_float16x8_t r = simde_vreinterpretq_f16_u8(a); + simde_float16x8_private r_ = simde_float16x8_to_private(r); + simde_assert_equal_i(0, simde_memcmp(&r_, &a_, sizeof(r_))); + } + + return 0; +} + SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f32_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f64_s8) @@ -6873,6 +7460,38 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_u8_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_u16_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_u32_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_u64_f64) +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f16_f32) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f16_s16) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f16_s32) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f16_s64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f16_s8) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f16_u32) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f16_u64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpret_f16_u8) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f16_f32) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f16_s16) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f16_s32) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f16_s64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f16_s8) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f16_u32) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f16_u64) + +SIMDE_TEST_FUNC_LIST_ENTRY(vreinterpretq_f16_u8) + SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h" diff --git a/test/arm/neon/rndn.c b/test/arm/neon/rndn.c index f5b50dcdf..92f9483e5 100644 --- a/test/arm/neon/rndn.c +++ b/test/arm/neon/rndn.c @@ -3,6 +3,77 @@ #include "test-neon.h" #include "../../../simde/arm/neon/rndn.h" +static int +test_simde_vrndnh_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16_t a; + simde_float16_t r; + } test_vec[] = { + #if !defined(SIMDE_FAST_NANS) + { SIMDE_NANHF, + SIMDE_NANHF, }, + #endif + { SIMDE_FLOAT16_VALUE( -1.50), + SIMDE_FLOAT16_VALUE( -2.00)}, + { SIMDE_FLOAT16_VALUE( -2.50), + SIMDE_FLOAT16_VALUE( -2.00)}, + { SIMDE_FLOAT16_VALUE( -593.90), + SIMDE_FLOAT16_VALUE( -594.00)}, + { SIMDE_FLOAT16_VALUE( 569.79), + SIMDE_FLOAT16_VALUE( 570.00)}, + { SIMDE_FLOAT16_VALUE( -670.11), + SIMDE_FLOAT16_VALUE( -670.00)}, + { SIMDE_FLOAT16_VALUE( -4.27), + SIMDE_FLOAT16_VALUE( -4.00)}, + { SIMDE_FLOAT16_VALUE( -389.20), + SIMDE_FLOAT16_VALUE( -389.00)}, + { SIMDE_FLOAT16_VALUE( 172.22), + SIMDE_FLOAT16_VALUE( 172.00)}, + { SIMDE_FLOAT16_VALUE( 13.87), + SIMDE_FLOAT16_VALUE( 14.00)} + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16_t _r = simde_vrndnh_f16(test_vec[i].a); + + simde_assert_equal_f16(_r, test_vec[i].r, 1); + } + + return 0; +} + +static int +test_simde_vrndn_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 r[4]; + } test_vec[] = { + #if !defined(SIMDE_FAST_NANS) + { { SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF }, + { SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF } }, + #endif + { { SIMDE_FLOAT16_VALUE( -1.50), SIMDE_FLOAT16_VALUE( 1.50), SIMDE_FLOAT16_VALUE( -2.50), SIMDE_FLOAT16_VALUE( 2.50) }, + { SIMDE_FLOAT16_VALUE( -2.00), SIMDE_FLOAT16_VALUE( 2.00), SIMDE_FLOAT16_VALUE( -2.00), SIMDE_FLOAT16_VALUE( 2.00) } }, + { { SIMDE_FLOAT16_VALUE( -593.90), SIMDE_FLOAT16_VALUE( 196.84), SIMDE_FLOAT16_VALUE( 569.79), SIMDE_FLOAT16_VALUE( 336.27) }, + { SIMDE_FLOAT16_VALUE( -594.00), SIMDE_FLOAT16_VALUE( 197.00), SIMDE_FLOAT16_VALUE( 570.00), SIMDE_FLOAT16_VALUE( 336.00) } }, + { { SIMDE_FLOAT16_VALUE( -670.11), SIMDE_FLOAT16_VALUE( 299.96), SIMDE_FLOAT16_VALUE( -4.27), SIMDE_FLOAT16_VALUE( -333.31) }, + { SIMDE_FLOAT16_VALUE( -670.00), SIMDE_FLOAT16_VALUE( 300.00), SIMDE_FLOAT16_VALUE( -4.00), SIMDE_FLOAT16_VALUE( -333.00) } }, + { { SIMDE_FLOAT16_VALUE( -389.20), SIMDE_FLOAT16_VALUE( 338.21), SIMDE_FLOAT16_VALUE( 172.22), SIMDE_FLOAT16_VALUE( 64.71) }, + { SIMDE_FLOAT16_VALUE( -389.00), SIMDE_FLOAT16_VALUE( 338.00), SIMDE_FLOAT16_VALUE( 172.00), SIMDE_FLOAT16_VALUE( 65.00) } }, + { { SIMDE_FLOAT16_VALUE( 89.38), SIMDE_FLOAT16_VALUE( -40.62), SIMDE_FLOAT16_VALUE( 13.87), SIMDE_FLOAT16_VALUE( -75.96) }, + { SIMDE_FLOAT16_VALUE( 89.00), SIMDE_FLOAT16_VALUE( -41.00), SIMDE_FLOAT16_VALUE( 14.00), SIMDE_FLOAT16_VALUE( -76.00) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t r = simde_vrndn_f16(a); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vrndn_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -117,6 +188,31 @@ test_simde_vrndn_f64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vrndnq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 r[8]; + } test_vec[] = { + #if !defined(SIMDE_FAST_NANS) + { { SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF }, + { SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF, SIMDE_NANHF } }, + #endif + { { SIMDE_FLOAT16_VALUE( -1.50), SIMDE_FLOAT16_VALUE( 1.50), SIMDE_FLOAT16_VALUE( -2.50), SIMDE_FLOAT16_VALUE( 2.50), SIMDE_FLOAT16_VALUE( -593.90), SIMDE_FLOAT16_VALUE( 196.84), SIMDE_FLOAT16_VALUE( 569.79), SIMDE_FLOAT16_VALUE( 336.27) }, + { SIMDE_FLOAT16_VALUE( -2.00), SIMDE_FLOAT16_VALUE( 2.00), SIMDE_FLOAT16_VALUE( -2.00), SIMDE_FLOAT16_VALUE( 2.00), SIMDE_FLOAT16_VALUE( -594.00), SIMDE_FLOAT16_VALUE( 197.00), SIMDE_FLOAT16_VALUE( 570.00), SIMDE_FLOAT16_VALUE( 336.00) } }, + { { SIMDE_FLOAT16_VALUE( -670.11), SIMDE_FLOAT16_VALUE( 299.96), SIMDE_FLOAT16_VALUE( -4.27), SIMDE_FLOAT16_VALUE( -333.31), SIMDE_FLOAT16_VALUE( -389.20), SIMDE_FLOAT16_VALUE( 338.21), SIMDE_FLOAT16_VALUE( 172.22), SIMDE_FLOAT16_VALUE( 64.71) }, + { SIMDE_FLOAT16_VALUE( -670.00), SIMDE_FLOAT16_VALUE( 300.00), SIMDE_FLOAT16_VALUE( -4.00), SIMDE_FLOAT16_VALUE( -333.00), SIMDE_FLOAT16_VALUE( -389.00), SIMDE_FLOAT16_VALUE( 338.00), SIMDE_FLOAT16_VALUE( 172.00), SIMDE_FLOAT16_VALUE( 65.00) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t r = simde_vrndnq_f16(a); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vrndnq_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -223,9 +319,13 @@ test_simde_vrndnq_f64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vrndnh_f16) + +SIMDE_TEST_FUNC_LIST_ENTRY(vrndn_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vrndn_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrndn_f64) +SIMDE_TEST_FUNC_LIST_ENTRY(vrndnq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vrndnq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrndnq_f64) SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/rsqrte.c b/test/arm/neon/rsqrte.c index 28154f1c1..296dd4aab 100644 --- a/test/arm/neon/rsqrte.c +++ b/test/arm/neon/rsqrte.c @@ -4,6 +4,44 @@ #include "test-neon.h" #include "../../../simde/arm/neon/rsqrte.h" +static int +test_simde_vrsqrteh_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a; + simde_float16 r; + } test_vec[] = { + { SIMDE_FLOAT16_VALUE(5.50), + SIMDE_FLOAT16_VALUE(0.43) }, + { SIMDE_FLOAT16_VALUE(1.00), + SIMDE_FLOAT16_VALUE(1.00) }, + { SIMDE_FLOAT16_VALUE(9.20), + SIMDE_FLOAT16_VALUE(0.33) }, + { SIMDE_FLOAT16_VALUE(8.40), + SIMDE_FLOAT16_VALUE(0.35) }, + { SIMDE_FLOAT16_VALUE(19.59), + SIMDE_FLOAT16_VALUE(0.23) }, + { SIMDE_FLOAT16_VALUE(11.80), + SIMDE_FLOAT16_VALUE(0.29) }, + { SIMDE_FLOAT16_VALUE(7.50), + SIMDE_FLOAT16_VALUE(0.37) }, + { SIMDE_FLOAT16_VALUE(13.90), + SIMDE_FLOAT16_VALUE(0.27) }, + { SIMDE_FLOAT16_VALUE(11.50), + SIMDE_FLOAT16_VALUE(0.29) }, + { SIMDE_FLOAT16_VALUE(17.41), + SIMDE_FLOAT16_VALUE(0.24) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16_t a = test_vec[i].a; + simde_float16_t r = simde_vrsqrteh_f16(a); + + simde_assert_equal_f16(r, test_vec[i].r, 1); + } + + return 0; +} + static int test_simde_vrsqrtes_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -96,6 +134,44 @@ test_simde_vrsqrted_f64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vrsqrte_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(0.27), SIMDE_FLOAT16_VALUE(15.80), SIMDE_FLOAT16_VALUE(5.01), SIMDE_FLOAT16_VALUE(5.52) }, + { SIMDE_FLOAT16_VALUE(1.92), SIMDE_FLOAT16_VALUE(0.25), SIMDE_FLOAT16_VALUE(0.45), SIMDE_FLOAT16_VALUE(0.43) } }, + { { SIMDE_FLOAT16_VALUE(7.54), SIMDE_FLOAT16_VALUE(6.66), SIMDE_FLOAT16_VALUE(6.05), SIMDE_FLOAT16_VALUE(16.09) }, + { SIMDE_FLOAT16_VALUE(0.36), SIMDE_FLOAT16_VALUE(0.39), SIMDE_FLOAT16_VALUE(0.41), SIMDE_FLOAT16_VALUE(0.25) } }, + { { SIMDE_FLOAT16_VALUE(19.90), SIMDE_FLOAT16_VALUE(2.34), SIMDE_FLOAT16_VALUE(3.67), SIMDE_FLOAT16_VALUE(3.92) }, + { SIMDE_FLOAT16_VALUE(0.22), SIMDE_FLOAT16_VALUE(0.65), SIMDE_FLOAT16_VALUE(0.52), SIMDE_FLOAT16_VALUE(0.51) } }, + { { SIMDE_FLOAT16_VALUE(14.50), SIMDE_FLOAT16_VALUE(16.47), SIMDE_FLOAT16_VALUE(11.05), SIMDE_FLOAT16_VALUE(4.20) }, + { SIMDE_FLOAT16_VALUE(0.26), SIMDE_FLOAT16_VALUE(0.25), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(0.49) } }, + { { SIMDE_FLOAT16_VALUE(18.15), SIMDE_FLOAT16_VALUE(1.15), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(3.21) }, + { SIMDE_FLOAT16_VALUE(0.23), SIMDE_FLOAT16_VALUE(0.93), SIMDE_FLOAT16_VALUE(0.67), SIMDE_FLOAT16_VALUE(0.56) } }, + { { SIMDE_FLOAT16_VALUE(16.58), SIMDE_FLOAT16_VALUE(18.76), SIMDE_FLOAT16_VALUE(12.15), SIMDE_FLOAT16_VALUE(18.22) }, + { SIMDE_FLOAT16_VALUE(0.25), SIMDE_FLOAT16_VALUE(0.23), SIMDE_FLOAT16_VALUE(0.29), SIMDE_FLOAT16_VALUE(0.23) } }, + { { SIMDE_FLOAT16_VALUE(17.57), SIMDE_FLOAT16_VALUE(0.46), SIMDE_FLOAT16_VALUE(15.00), SIMDE_FLOAT16_VALUE(2.88) }, + { SIMDE_FLOAT16_VALUE(0.24), SIMDE_FLOAT16_VALUE(1.47), SIMDE_FLOAT16_VALUE(0.26), SIMDE_FLOAT16_VALUE(0.59) } }, + { { SIMDE_FLOAT16_VALUE(4.86), SIMDE_FLOAT16_VALUE(8.30), SIMDE_FLOAT16_VALUE(8.66), SIMDE_FLOAT16_VALUE(4.23) }, + { SIMDE_FLOAT16_VALUE(0.45), SIMDE_FLOAT16_VALUE(0.35), SIMDE_FLOAT16_VALUE(0.34), SIMDE_FLOAT16_VALUE(0.49) } }, + { { SIMDE_FLOAT16_VALUE(8.89), SIMDE_FLOAT16_VALUE(6.56), SIMDE_FLOAT16_VALUE(4.22), SIMDE_FLOAT16_VALUE(17.29) }, + { SIMDE_FLOAT16_VALUE(0.34), SIMDE_FLOAT16_VALUE(0.39), SIMDE_FLOAT16_VALUE(0.49), SIMDE_FLOAT16_VALUE(0.24) } }, + { { SIMDE_FLOAT16_VALUE(9.95), SIMDE_FLOAT16_VALUE(6.08), SIMDE_FLOAT16_VALUE(7.59), SIMDE_FLOAT16_VALUE(0.41) }, + { SIMDE_FLOAT16_VALUE(0.32), SIMDE_FLOAT16_VALUE(0.41), SIMDE_FLOAT16_VALUE(0.36), SIMDE_FLOAT16_VALUE(1.55) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t r = simde_vrsqrte_f16(a); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vrsqrte_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -234,6 +310,43 @@ test_simde_vrsqrte_u32 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vrsqrteq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(13.00), SIMDE_FLOAT16_VALUE(17.80), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(13.20), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(12.70) }, + { SIMDE_FLOAT16_VALUE(0.58), SIMDE_FLOAT16_VALUE(0.28), SIMDE_FLOAT16_VALUE(0.24), SIMDE_FLOAT16_VALUE(0.53), SIMDE_FLOAT16_VALUE(0.28), SIMDE_FLOAT16_VALUE(0.51), SIMDE_FLOAT16_VALUE(0.33), SIMDE_FLOAT16_VALUE(0.28) } }, + { { SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(16.09), SIMDE_FLOAT16_VALUE(16.91), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(19.91), SIMDE_FLOAT16_VALUE(15.40), SIMDE_FLOAT16_VALUE(13.90), SIMDE_FLOAT16_VALUE(15.00) }, + { SIMDE_FLOAT16_VALUE(0.91), SIMDE_FLOAT16_VALUE(0.25), SIMDE_FLOAT16_VALUE(0.24), SIMDE_FLOAT16_VALUE(0.53), SIMDE_FLOAT16_VALUE(0.22), SIMDE_FLOAT16_VALUE(0.25), SIMDE_FLOAT16_VALUE(0.27), SIMDE_FLOAT16_VALUE(0.26) } }, + { { SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(14.60), SIMDE_FLOAT16_VALUE(6.90), SIMDE_FLOAT16_VALUE(18.00), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(19.91), SIMDE_FLOAT16_VALUE(1.50) }, + { SIMDE_FLOAT16_VALUE(0.54), SIMDE_FLOAT16_VALUE(0.26), SIMDE_FLOAT16_VALUE(0.38), SIMDE_FLOAT16_VALUE(0.24), SIMDE_FLOAT16_VALUE(0.41), SIMDE_FLOAT16_VALUE(0.33), SIMDE_FLOAT16_VALUE(0.22), SIMDE_FLOAT16_VALUE(0.82) } }, + { { SIMDE_FLOAT16_VALUE(18.20), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(13.00), SIMDE_FLOAT16_VALUE(13.40), SIMDE_FLOAT16_VALUE(9.40) }, + { SIMDE_FLOAT16_VALUE(0.23), SIMDE_FLOAT16_VALUE(0.38), SIMDE_FLOAT16_VALUE(0.39), SIMDE_FLOAT16_VALUE(0.67), SIMDE_FLOAT16_VALUE(0.33), SIMDE_FLOAT16_VALUE(0.28), SIMDE_FLOAT16_VALUE(0.27), SIMDE_FLOAT16_VALUE(0.33) } }, + { { SIMDE_FLOAT16_VALUE(12.80), SIMDE_FLOAT16_VALUE(14.40), SIMDE_FLOAT16_VALUE(19.09), SIMDE_FLOAT16_VALUE(14.60), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(5.30), SIMDE_FLOAT16_VALUE(15.90), SIMDE_FLOAT16_VALUE(3.60) }, + { SIMDE_FLOAT16_VALUE(0.28), SIMDE_FLOAT16_VALUE(0.26), SIMDE_FLOAT16_VALUE(0.23), SIMDE_FLOAT16_VALUE(0.26), SIMDE_FLOAT16_VALUE(0.49), SIMDE_FLOAT16_VALUE(0.43), SIMDE_FLOAT16_VALUE(0.25), SIMDE_FLOAT16_VALUE(0.53) } }, + { { SIMDE_FLOAT16_VALUE(19.70), SIMDE_FLOAT16_VALUE(19.80), SIMDE_FLOAT16_VALUE(8.10), SIMDE_FLOAT16_VALUE(11.90), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(14.00), SIMDE_FLOAT16_VALUE(12.60), SIMDE_FLOAT16_VALUE(14.70) }, + { SIMDE_FLOAT16_VALUE(0.23), SIMDE_FLOAT16_VALUE(0.22), SIMDE_FLOAT16_VALUE(0.35), SIMDE_FLOAT16_VALUE(0.29), SIMDE_FLOAT16_VALUE(0.45), SIMDE_FLOAT16_VALUE(0.27), SIMDE_FLOAT16_VALUE(0.28), SIMDE_FLOAT16_VALUE(0.26) } }, + { { SIMDE_FLOAT16_VALUE(13.90), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(19.59), SIMDE_FLOAT16_VALUE(12.30), SIMDE_FLOAT16_VALUE(10.60), SIMDE_FLOAT16_VALUE(2.70), SIMDE_FLOAT16_VALUE(15.00), SIMDE_FLOAT16_VALUE(5.30) }, + { SIMDE_FLOAT16_VALUE(0.27), SIMDE_FLOAT16_VALUE(0.58), SIMDE_FLOAT16_VALUE(0.23), SIMDE_FLOAT16_VALUE(0.29), SIMDE_FLOAT16_VALUE(0.31), SIMDE_FLOAT16_VALUE(0.61), SIMDE_FLOAT16_VALUE(0.26), SIMDE_FLOAT16_VALUE(0.43) } }, + { { SIMDE_FLOAT16_VALUE(7.60), SIMDE_FLOAT16_VALUE(13.20), SIMDE_FLOAT16_VALUE(14.20), SIMDE_FLOAT16_VALUE(17.59), SIMDE_FLOAT16_VALUE(16.91), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(14.50) }, + { SIMDE_FLOAT16_VALUE(0.36), SIMDE_FLOAT16_VALUE(0.28), SIMDE_FLOAT16_VALUE(0.27), SIMDE_FLOAT16_VALUE(0.24), SIMDE_FLOAT16_VALUE(0.24), SIMDE_FLOAT16_VALUE(0.46), SIMDE_FLOAT16_VALUE(0.46), SIMDE_FLOAT16_VALUE(0.26) } }, + { { SIMDE_FLOAT16_VALUE(17.80), SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(11.30), SIMDE_FLOAT16_VALUE(8.20), SIMDE_FLOAT16_VALUE(10.10), SIMDE_FLOAT16_VALUE(11.90) }, + { SIMDE_FLOAT16_VALUE(0.24), SIMDE_FLOAT16_VALUE(0.42), SIMDE_FLOAT16_VALUE(0.79), SIMDE_FLOAT16_VALUE(0.43), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(0.35), SIMDE_FLOAT16_VALUE(0.31), SIMDE_FLOAT16_VALUE(0.29) } }, + { { SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(19.41), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(17.59), SIMDE_FLOAT16_VALUE(13.00), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(13.80) }, + { SIMDE_FLOAT16_VALUE(1.05), SIMDE_FLOAT16_VALUE(0.23), SIMDE_FLOAT16_VALUE(0.52), SIMDE_FLOAT16_VALUE(0.24), SIMDE_FLOAT16_VALUE(0.28), SIMDE_FLOAT16_VALUE(0.32), SIMDE_FLOAT16_VALUE(0.32), SIMDE_FLOAT16_VALUE(0.27) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t r = simde_vrsqrteq_f16(a); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vrsqrteq_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -372,13 +485,16 @@ test_simde_vrsqrteq_f64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrteh_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrtes_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrted_f64) +SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrte_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrte_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrte_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrte_u32) +SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrteq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrteq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrteq_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrteq_f64) diff --git a/test/arm/neon/rsqrts.c b/test/arm/neon/rsqrts.c index e047ccf26..aacd576ed 100644 --- a/test/arm/neon/rsqrts.c +++ b/test/arm/neon/rsqrts.c @@ -3,6 +3,50 @@ #include "test-neon.h" #include "../../../simde/arm/neon/rsqrts.h" +static int +test_simde_vrsqrts_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( -1.81), SIMDE_FLOAT16_VALUE( 6.08), + SIMDE_FLOAT16_VALUE( 4.44), SIMDE_FLOAT16_VALUE( 6.63) }, + { SIMDE_FLOAT16_VALUE( -0.75), SIMDE_FLOAT16_VALUE( 3.06), + SIMDE_FLOAT16_VALUE( 5.97), SIMDE_FLOAT16_VALUE( -5.82) }, + { SIMDE_FLOAT16_VALUE( 0.82), SIMDE_FLOAT16_VALUE( -7.80), + SIMDE_FLOAT16_VALUE( -11.75), SIMDE_FLOAT16_VALUE( 20.79) } }, + { { SIMDE_FLOAT16_VALUE( -4.07), SIMDE_FLOAT16_VALUE( 2.30), + SIMDE_FLOAT16_VALUE( -7.18), SIMDE_FLOAT16_VALUE( -5.76) }, + { SIMDE_FLOAT16_VALUE( -2.84), SIMDE_FLOAT16_VALUE( -2.53), + SIMDE_FLOAT16_VALUE( 0.29), SIMDE_FLOAT16_VALUE( -6.65) }, + { SIMDE_FLOAT16_VALUE( -4.28), SIMDE_FLOAT16_VALUE( 4.41), + SIMDE_FLOAT16_VALUE( 2.54), SIMDE_FLOAT16_VALUE( -17.65) } }, + { { SIMDE_FLOAT16_VALUE( -6.30), SIMDE_FLOAT16_VALUE( -9.44), + SIMDE_FLOAT16_VALUE( 9.05), SIMDE_FLOAT16_VALUE( 4.99) }, + { SIMDE_FLOAT16_VALUE( -1.04), SIMDE_FLOAT16_VALUE( 1.58), + SIMDE_FLOAT16_VALUE( 3.75), SIMDE_FLOAT16_VALUE( -1.14) }, + { SIMDE_FLOAT16_VALUE( -1.78), SIMDE_FLOAT16_VALUE( 8.96), + SIMDE_FLOAT16_VALUE( -15.47), SIMDE_FLOAT16_VALUE( 4.34) } }, + { { SIMDE_FLOAT16_VALUE( -6.57), SIMDE_FLOAT16_VALUE( -6.46), + SIMDE_FLOAT16_VALUE( 4.91), SIMDE_FLOAT16_VALUE( 1.78) }, + { SIMDE_FLOAT16_VALUE( -0.70), SIMDE_FLOAT16_VALUE( 8.06), + SIMDE_FLOAT16_VALUE( 6.18), SIMDE_FLOAT16_VALUE( -6.90) }, + { SIMDE_FLOAT16_VALUE( -0.80), SIMDE_FLOAT16_VALUE( 27.53), + SIMDE_FLOAT16_VALUE( -13.67), SIMDE_FLOAT16_VALUE( 7.64) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_float16x4_t r = simde_vrsqrts_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vrsqrts_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -119,6 +163,49 @@ test_simde_vrsqrts_f64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vrsqrtsq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( -2.14), SIMDE_FLOAT16_VALUE( -4.57), SIMDE_FLOAT16_VALUE( 6.16), SIMDE_FLOAT16_VALUE( -7.69), + SIMDE_FLOAT16_VALUE( -5.58), SIMDE_FLOAT16_VALUE( 3.64), SIMDE_FLOAT16_VALUE( 5.46), SIMDE_FLOAT16_VALUE( -2.76) }, + { SIMDE_FLOAT16_VALUE( -7.94), SIMDE_FLOAT16_VALUE( 2.13), SIMDE_FLOAT16_VALUE( -3.52), SIMDE_FLOAT16_VALUE( -2.01), + SIMDE_FLOAT16_VALUE( 7.89), SIMDE_FLOAT16_VALUE( -4.25), SIMDE_FLOAT16_VALUE( 0.59), SIMDE_FLOAT16_VALUE( -8.41) }, + { SIMDE_FLOAT16_VALUE( -7.00), SIMDE_FLOAT16_VALUE( 6.37), SIMDE_FLOAT16_VALUE( 12.34), SIMDE_FLOAT16_VALUE( -6.23), + SIMDE_FLOAT16_VALUE( 23.51), SIMDE_FLOAT16_VALUE( 9.24), SIMDE_FLOAT16_VALUE( -0.11), SIMDE_FLOAT16_VALUE( -10.11) } }, + { { SIMDE_FLOAT16_VALUE( -3.70), SIMDE_FLOAT16_VALUE( 9.56), SIMDE_FLOAT16_VALUE( 3.17), SIMDE_FLOAT16_VALUE( -4.64), + SIMDE_FLOAT16_VALUE( 0.47), SIMDE_FLOAT16_VALUE( -6.48), SIMDE_FLOAT16_VALUE( 6.04), SIMDE_FLOAT16_VALUE( -4.62) }, + { SIMDE_FLOAT16_VALUE( 4.55), SIMDE_FLOAT16_VALUE( -3.08), SIMDE_FLOAT16_VALUE( 4.22), SIMDE_FLOAT16_VALUE( 7.98), + SIMDE_FLOAT16_VALUE( 5.30), SIMDE_FLOAT16_VALUE( 2.22), SIMDE_FLOAT16_VALUE( -1.53), SIMDE_FLOAT16_VALUE( -6.84) }, + { SIMDE_FLOAT16_VALUE( 9.92), SIMDE_FLOAT16_VALUE( 16.22), SIMDE_FLOAT16_VALUE( -5.19), SIMDE_FLOAT16_VALUE( 20.01), + SIMDE_FLOAT16_VALUE( 0.25), SIMDE_FLOAT16_VALUE( 8.69), SIMDE_FLOAT16_VALUE( 6.12), SIMDE_FLOAT16_VALUE( -14.30) } }, + { { SIMDE_FLOAT16_VALUE( 7.64), SIMDE_FLOAT16_VALUE( -5.37), SIMDE_FLOAT16_VALUE( -4.53), SIMDE_FLOAT16_VALUE( 9.70), + SIMDE_FLOAT16_VALUE( -4.41), SIMDE_FLOAT16_VALUE( -6.85), SIMDE_FLOAT16_VALUE( -1.58), SIMDE_FLOAT16_VALUE( -6.52) }, + { SIMDE_FLOAT16_VALUE( 6.76), SIMDE_FLOAT16_VALUE( 1.95), SIMDE_FLOAT16_VALUE( -2.31), SIMDE_FLOAT16_VALUE( -8.82), + SIMDE_FLOAT16_VALUE( -1.10), SIMDE_FLOAT16_VALUE( 9.02), SIMDE_FLOAT16_VALUE( -4.93), SIMDE_FLOAT16_VALUE( 5.20) }, + { SIMDE_FLOAT16_VALUE( -24.32), SIMDE_FLOAT16_VALUE( 6.74), SIMDE_FLOAT16_VALUE( -3.73), SIMDE_FLOAT16_VALUE( 44.28), + SIMDE_FLOAT16_VALUE( -0.93), SIMDE_FLOAT16_VALUE( 32.39), SIMDE_FLOAT16_VALUE( -2.39), SIMDE_FLOAT16_VALUE( 18.45) } }, + { { SIMDE_FLOAT16_VALUE( 8.57), SIMDE_FLOAT16_VALUE( 8.24), SIMDE_FLOAT16_VALUE( -9.44), SIMDE_FLOAT16_VALUE( 3.12), + SIMDE_FLOAT16_VALUE( 8.30), SIMDE_FLOAT16_VALUE( -2.87), SIMDE_FLOAT16_VALUE( -8.99), SIMDE_FLOAT16_VALUE( 3.60) }, + { SIMDE_FLOAT16_VALUE( -4.83), SIMDE_FLOAT16_VALUE( 4.78), SIMDE_FLOAT16_VALUE( 1.10), SIMDE_FLOAT16_VALUE( 5.63), + SIMDE_FLOAT16_VALUE( 9.35), SIMDE_FLOAT16_VALUE( -0.52), SIMDE_FLOAT16_VALUE( 6.77), SIMDE_FLOAT16_VALUE( 6.99) }, + { SIMDE_FLOAT16_VALUE( 22.20), SIMDE_FLOAT16_VALUE( -18.19), SIMDE_FLOAT16_VALUE( 6.69), SIMDE_FLOAT16_VALUE( -7.28), + SIMDE_FLOAT16_VALUE( -37.30), SIMDE_FLOAT16_VALUE( 0.75), SIMDE_FLOAT16_VALUE( 31.93), SIMDE_FLOAT16_VALUE( -11.08) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_float16x8_t r = simde_vrsqrtsq_f16(a, b); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vrsqrtsq_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -233,6 +320,71 @@ test_simde_vrsqrtsq_f64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vrsqrtsh_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16_t a; + simde_float16_t b; + simde_float16_t r; + } test_vec[] = { + { SIMDE_FLOAT16_VALUE( -1.81), + SIMDE_FLOAT16_VALUE( -0.75), + SIMDE_FLOAT16_VALUE( 0.82) }, + { SIMDE_FLOAT16_VALUE( 4.44), + SIMDE_FLOAT16_VALUE( 5.97), + SIMDE_FLOAT16_VALUE( -11.75) }, + { SIMDE_FLOAT16_VALUE( -4.07), + SIMDE_FLOAT16_VALUE( -2.84), + SIMDE_FLOAT16_VALUE( -4.28) }, + { SIMDE_FLOAT16_VALUE( -7.18), + SIMDE_FLOAT16_VALUE( 0.29), + SIMDE_FLOAT16_VALUE( 2.54) }, + { SIMDE_FLOAT16_VALUE( -6.30), + SIMDE_FLOAT16_VALUE( -1.04), + SIMDE_FLOAT16_VALUE( -1.78) }, + { SIMDE_FLOAT16_VALUE( 9.05), + SIMDE_FLOAT16_VALUE( 3.75), + SIMDE_FLOAT16_VALUE( -15.47) }, + { SIMDE_FLOAT16_VALUE( -6.57), + SIMDE_FLOAT16_VALUE( -0.70), + SIMDE_FLOAT16_VALUE( -0.80) }, + { SIMDE_FLOAT16_VALUE( 4.91), + SIMDE_FLOAT16_VALUE( 6.18), + SIMDE_FLOAT16_VALUE( -13.67) }, + { SIMDE_FLOAT16_VALUE( 6.08), + SIMDE_FLOAT16_VALUE( 3.06), + SIMDE_FLOAT16_VALUE( -7.80) }, + { SIMDE_FLOAT16_VALUE( 6.63), + SIMDE_FLOAT16_VALUE( -5.82), + SIMDE_FLOAT16_VALUE( 20.79) }, + { SIMDE_FLOAT16_VALUE( 2.30), + SIMDE_FLOAT16_VALUE( -2.53), + SIMDE_FLOAT16_VALUE( 4.41) }, + { SIMDE_FLOAT16_VALUE( -5.76), + SIMDE_FLOAT16_VALUE( -6.65), + SIMDE_FLOAT16_VALUE( -17.65) }, + { SIMDE_FLOAT16_VALUE( -9.44), + SIMDE_FLOAT16_VALUE( 1.58), + SIMDE_FLOAT16_VALUE( 8.96) }, + { SIMDE_FLOAT16_VALUE( 4.99), + SIMDE_FLOAT16_VALUE( -1.14), + SIMDE_FLOAT16_VALUE( 4.34) }, + { SIMDE_FLOAT16_VALUE( -6.46), + SIMDE_FLOAT16_VALUE( 8.06), + SIMDE_FLOAT16_VALUE( 27.53) }, + { SIMDE_FLOAT16_VALUE( 1.78), + SIMDE_FLOAT16_VALUE( -6.90), + SIMDE_FLOAT16_VALUE( 7.64) } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16_t r = simde_vrsqrtsh_f16(test_vec[i].a, test_vec[i].b); + simde_assert_equal_f16(r, test_vec[i].r, 1); + } + + return 0; +} + static int test_simde_vrsqrtss_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -344,12 +496,15 @@ test_simde_vrsqrtsd_f64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrts_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrts_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrts_f64) +SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrtsq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrtsq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrtsq_f64) +SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrtsh_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrtss_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vrsqrtsd_f64) SIMDE_TEST_FUNC_LIST_END diff --git a/test/arm/neon/set_lane.c b/test/arm/neon/set_lane.c index c8ba29bd1..340db5443 100644 --- a/test/arm/neon/set_lane.c +++ b/test/arm/neon/set_lane.c @@ -6,6 +6,69 @@ HEDLEY_DIAGNOSTIC_PUSH SIMDE_DIAGNOSTIC_DISABLE_UNREACHABLE_ +static int +test_simde_vset_lane_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a; + simde_float16 v[4]; + simde_float16 r[4]; + int lane; + } test_vec[] = { + { SIMDE_FLOAT16_VALUE(64.81), + { SIMDE_FLOAT16_VALUE(-32.09), SIMDE_FLOAT16_VALUE(94.62), SIMDE_FLOAT16_VALUE(10.80), SIMDE_FLOAT16_VALUE(-37.00) }, + { SIMDE_FLOAT16_VALUE(-32.09), SIMDE_FLOAT16_VALUE(64.81), SIMDE_FLOAT16_VALUE(10.80), SIMDE_FLOAT16_VALUE(-37.00) }, + INT32_C( 1) }, + { SIMDE_FLOAT16_VALUE(22.41), + { SIMDE_FLOAT16_VALUE(92.62), SIMDE_FLOAT16_VALUE(98.19), SIMDE_FLOAT16_VALUE(43.50), SIMDE_FLOAT16_VALUE(-69.88) }, + { SIMDE_FLOAT16_VALUE(92.62), SIMDE_FLOAT16_VALUE(98.19), SIMDE_FLOAT16_VALUE(43.50), SIMDE_FLOAT16_VALUE(22.41) }, + INT32_C( 3) }, + { SIMDE_FLOAT16_VALUE(49.00), + { SIMDE_FLOAT16_VALUE(72.62), SIMDE_FLOAT16_VALUE(14.70), SIMDE_FLOAT16_VALUE(42.00), SIMDE_FLOAT16_VALUE(-46.00) }, + { SIMDE_FLOAT16_VALUE(72.62), SIMDE_FLOAT16_VALUE(14.70), SIMDE_FLOAT16_VALUE(42.00), SIMDE_FLOAT16_VALUE(49.00) }, + INT32_C( 3) }, + { SIMDE_FLOAT16_VALUE(-33.00), + { SIMDE_FLOAT16_VALUE(11.20), SIMDE_FLOAT16_VALUE(30.20), SIMDE_FLOAT16_VALUE(11.30), SIMDE_FLOAT16_VALUE(-64.00) }, + { SIMDE_FLOAT16_VALUE(11.20), SIMDE_FLOAT16_VALUE(-33.00), SIMDE_FLOAT16_VALUE(11.30), SIMDE_FLOAT16_VALUE(-64.00) }, + INT32_C( 1) }, + { SIMDE_FLOAT16_VALUE(69.81), + { SIMDE_FLOAT16_VALUE(69.38), SIMDE_FLOAT16_VALUE(-38.59), SIMDE_FLOAT16_VALUE(34.59), SIMDE_FLOAT16_VALUE(80.38) }, + { SIMDE_FLOAT16_VALUE(69.38), SIMDE_FLOAT16_VALUE(-38.59), SIMDE_FLOAT16_VALUE(69.81), SIMDE_FLOAT16_VALUE(80.38) }, + INT32_C( 2) }, + { SIMDE_FLOAT16_VALUE(35.09), + { SIMDE_FLOAT16_VALUE(60.09), SIMDE_FLOAT16_VALUE(-96.38), SIMDE_FLOAT16_VALUE(41.19), SIMDE_FLOAT16_VALUE(-12.70) }, + { SIMDE_FLOAT16_VALUE(60.09), SIMDE_FLOAT16_VALUE(-96.38), SIMDE_FLOAT16_VALUE(35.09), SIMDE_FLOAT16_VALUE(-12.70) }, + INT32_C( 2) }, + { SIMDE_FLOAT16_VALUE(10.20), + { SIMDE_FLOAT16_VALUE(-48.41), SIMDE_FLOAT16_VALUE(-27.00), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(-100.00) }, + { SIMDE_FLOAT16_VALUE(-48.41), SIMDE_FLOAT16_VALUE(-27.00), SIMDE_FLOAT16_VALUE(10.20), SIMDE_FLOAT16_VALUE(-100.00) }, + INT32_C( 2) }, + { SIMDE_FLOAT16_VALUE(-14.60), + { SIMDE_FLOAT16_VALUE(-84.19), SIMDE_FLOAT16_VALUE(51.31), SIMDE_FLOAT16_VALUE(-9.10), SIMDE_FLOAT16_VALUE(80.81) }, + { SIMDE_FLOAT16_VALUE(-84.19), SIMDE_FLOAT16_VALUE(-14.60), SIMDE_FLOAT16_VALUE(-9.10), SIMDE_FLOAT16_VALUE(80.81) }, + INT32_C( 1) }, + { SIMDE_FLOAT16_VALUE(-15.30), + { SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(91.38), SIMDE_FLOAT16_VALUE(88.00) }, + { SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(-15.30), SIMDE_FLOAT16_VALUE(88.00) }, + INT32_C( 2) }, + { SIMDE_FLOAT16_VALUE(-75.62), + { SIMDE_FLOAT16_VALUE(46.50), SIMDE_FLOAT16_VALUE(-72.00), SIMDE_FLOAT16_VALUE(-75.00), SIMDE_FLOAT16_VALUE(-83.38) }, + { SIMDE_FLOAT16_VALUE(-75.62), SIMDE_FLOAT16_VALUE(-72.00), SIMDE_FLOAT16_VALUE(-75.00), SIMDE_FLOAT16_VALUE(-83.38) }, + INT32_C( 0) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16 a = test_vec[i].a; + simde_float16x4_t v = simde_vld1_f16(test_vec[i].v); + int lane = test_vec[i].lane; + simde_float16x4_t r; + SIMDE_CONSTIFY_4_(simde_vset_lane_f16, r, (HEDLEY_UNREACHABLE(), v), lane, a, v); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vset_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -707,6 +770,76 @@ test_simde_vset_lane_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vsetq_lane_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a; + simde_float16 v[8]; + simde_float16 r[8]; + int lane; + } test_vec[] = { + { SIMDE_FLOAT16_VALUE( 44.00), + { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00), + SIMDE_FLOAT16_VALUE( -918.50), SIMDE_FLOAT16_VALUE( -717.00), SIMDE_FLOAT16_VALUE( -823.00), SIMDE_FLOAT16_VALUE( -581.00) }, + { SIMDE_FLOAT16_VALUE( 44.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00), + SIMDE_FLOAT16_VALUE( -918.50), SIMDE_FLOAT16_VALUE( -717.00), SIMDE_FLOAT16_VALUE( -823.00), SIMDE_FLOAT16_VALUE( -581.00) }, + INT32_C( 0) }, + { SIMDE_FLOAT16_VALUE( 25.00), + { SIMDE_FLOAT16_VALUE( -848.00), SIMDE_FLOAT16_VALUE( 815.50), SIMDE_FLOAT16_VALUE( -672.50), SIMDE_FLOAT16_VALUE( 274.50), + SIMDE_FLOAT16_VALUE( 933.00), SIMDE_FLOAT16_VALUE( -952.50), SIMDE_FLOAT16_VALUE( 426.00), SIMDE_FLOAT16_VALUE( 373.75) }, + { SIMDE_FLOAT16_VALUE( -848.00), SIMDE_FLOAT16_VALUE( 25.00), SIMDE_FLOAT16_VALUE( -672.50), SIMDE_FLOAT16_VALUE( 274.50), + SIMDE_FLOAT16_VALUE( 933.00), SIMDE_FLOAT16_VALUE( -952.50), SIMDE_FLOAT16_VALUE( 426.00), SIMDE_FLOAT16_VALUE( 373.75) }, + INT32_C( 1) }, + { SIMDE_FLOAT16_VALUE( -14.25), + { SIMDE_FLOAT16_VALUE( -854.50), SIMDE_FLOAT16_VALUE( 844.50), SIMDE_FLOAT16_VALUE( -1528.00), SIMDE_FLOAT16_VALUE( 542.00), + SIMDE_FLOAT16_VALUE( 631.00), SIMDE_FLOAT16_VALUE( -426.00), SIMDE_FLOAT16_VALUE( 1139.00), SIMDE_FLOAT16_VALUE( 359.00) }, + { SIMDE_FLOAT16_VALUE( -854.50), SIMDE_FLOAT16_VALUE( 844.50), SIMDE_FLOAT16_VALUE( -14.25), SIMDE_FLOAT16_VALUE( 542.00), + SIMDE_FLOAT16_VALUE( 631.00), SIMDE_FLOAT16_VALUE( -426.00), SIMDE_FLOAT16_VALUE( 1139.00), SIMDE_FLOAT16_VALUE( 359.00) }, + INT32_C( 2) }, + { SIMDE_FLOAT16_VALUE( 314.3), + { SIMDE_FLOAT16_VALUE( 9.56), SIMDE_FLOAT16_VALUE( 425.25), SIMDE_FLOAT16_VALUE( -294.75), SIMDE_FLOAT16_VALUE( -99.19), + SIMDE_FLOAT16_VALUE( 284.50), SIMDE_FLOAT16_VALUE( -907.50), SIMDE_FLOAT16_VALUE( -130.00), SIMDE_FLOAT16_VALUE( -722.00) }, + { SIMDE_FLOAT16_VALUE( 9.56), SIMDE_FLOAT16_VALUE( 425.25), SIMDE_FLOAT16_VALUE( -294.75), SIMDE_FLOAT16_VALUE( 314.3), + SIMDE_FLOAT16_VALUE( 284.50), SIMDE_FLOAT16_VALUE( -907.50), SIMDE_FLOAT16_VALUE( -130.00), SIMDE_FLOAT16_VALUE( -722.00) }, + INT32_C( 3) }, + { SIMDE_FLOAT16_VALUE( -4.25), + { SIMDE_FLOAT16_VALUE( 73.81), SIMDE_FLOAT16_VALUE( 132.25), SIMDE_FLOAT16_VALUE( 967.50), SIMDE_FLOAT16_VALUE( 6.60), + SIMDE_FLOAT16_VALUE( 179.88), SIMDE_FLOAT16_VALUE( 393.50), SIMDE_FLOAT16_VALUE( -619.50), SIMDE_FLOAT16_VALUE( 89.12) }, + { SIMDE_FLOAT16_VALUE( 73.81), SIMDE_FLOAT16_VALUE( 132.25), SIMDE_FLOAT16_VALUE( 967.50), SIMDE_FLOAT16_VALUE( 6.60), + SIMDE_FLOAT16_VALUE( -4.25), SIMDE_FLOAT16_VALUE( 393.50), SIMDE_FLOAT16_VALUE( -619.50), SIMDE_FLOAT16_VALUE( 89.12) }, + INT32_C( 4) }, + { SIMDE_FLOAT16_VALUE( -17.25), + { SIMDE_FLOAT16_VALUE( -85.06), SIMDE_FLOAT16_VALUE( 921.50), SIMDE_FLOAT16_VALUE( 6.98), SIMDE_FLOAT16_VALUE( -800.50), + SIMDE_FLOAT16_VALUE( -986.00), SIMDE_FLOAT16_VALUE( 877.00), SIMDE_FLOAT16_VALUE( -522.50), SIMDE_FLOAT16_VALUE( 135.75) }, + { SIMDE_FLOAT16_VALUE( -85.06), SIMDE_FLOAT16_VALUE( 921.50), SIMDE_FLOAT16_VALUE( 6.98), SIMDE_FLOAT16_VALUE( -800.50), + SIMDE_FLOAT16_VALUE( -986.00), SIMDE_FLOAT16_VALUE( -17.25), SIMDE_FLOAT16_VALUE( -522.50), SIMDE_FLOAT16_VALUE( 135.75) }, + INT32_C( 5) }, + { SIMDE_FLOAT16_VALUE( 43.2), + { SIMDE_FLOAT16_VALUE( -107.50), SIMDE_FLOAT16_VALUE( -907.00), SIMDE_FLOAT16_VALUE( 361.50), SIMDE_FLOAT16_VALUE( -927.50), + SIMDE_FLOAT16_VALUE( 486.50), SIMDE_FLOAT16_VALUE( 742.00), SIMDE_FLOAT16_VALUE( 161.50), SIMDE_FLOAT16_VALUE( 404.25) }, + { SIMDE_FLOAT16_VALUE( -107.50), SIMDE_FLOAT16_VALUE( -907.00), SIMDE_FLOAT16_VALUE( 361.50), SIMDE_FLOAT16_VALUE( -927.50), + SIMDE_FLOAT16_VALUE( 486.50), SIMDE_FLOAT16_VALUE( 742.00), SIMDE_FLOAT16_VALUE( 43.2), SIMDE_FLOAT16_VALUE( 404.25) }, + INT32_C( 6) }, + { SIMDE_FLOAT16_VALUE( -144.25), + { SIMDE_FLOAT16_VALUE( 267.50), SIMDE_FLOAT16_VALUE( 602.00), SIMDE_FLOAT16_VALUE( -154.25), SIMDE_FLOAT16_VALUE( 281.75), + SIMDE_FLOAT16_VALUE( 478.75), SIMDE_FLOAT16_VALUE( 323.25), SIMDE_FLOAT16_VALUE( -582.50), SIMDE_FLOAT16_VALUE( -630.00) }, + { SIMDE_FLOAT16_VALUE( 267.50), SIMDE_FLOAT16_VALUE( 602.00), SIMDE_FLOAT16_VALUE( -154.25), SIMDE_FLOAT16_VALUE( 281.75), + SIMDE_FLOAT16_VALUE( 478.75), SIMDE_FLOAT16_VALUE( 323.25), SIMDE_FLOAT16_VALUE( -582.50), SIMDE_FLOAT16_VALUE( -144.25) }, + INT32_C( 7) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16 a = test_vec[i].a; + simde_float16x8_t v = simde_vld1q_f16(test_vec[i].v); + int lane = test_vec[i].lane; + simde_float16x8_t r; + SIMDE_CONSTIFY_8_(simde_vsetq_lane_f16, r, (HEDLEY_UNREACHABLE(), v), lane, a, v); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vsetq_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1477,6 +1610,7 @@ test_simde_vsetq_lane_u64 (SIMDE_MUNIT_TEST_ARGS) { HEDLEY_DIAGNOSTIC_POP SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vset_lane_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vset_lane_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vset_lane_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vset_lane_s8) @@ -1488,6 +1622,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vset_lane_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vset_lane_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vset_lane_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vsetq_lane_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vsetq_lane_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vsetq_lane_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vsetq_lane_s8) diff --git a/test/arm/neon/sqrt.c b/test/arm/neon/sqrt.c new file mode 100644 index 000000000..5103f884e --- /dev/null +++ b/test/arm/neon/sqrt.c @@ -0,0 +1,286 @@ +#define SIMDE_TEST_ARM_NEON_INSN sqrt + +#include "test-neon.h" +#include "../../../simde/arm/neon/sqrt.h" + +static int +test_simde_vsqrth_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a; + simde_float16 r; + } test_vec[] = { + { SIMDE_FLOAT16_VALUE(14.90), + SIMDE_FLOAT16_VALUE(3.86) }, + { SIMDE_FLOAT16_VALUE(1.34), + SIMDE_FLOAT16_VALUE(1.16) }, + { SIMDE_FLOAT16_VALUE(17.19), + SIMDE_FLOAT16_VALUE(4.15) }, + { SIMDE_FLOAT16_VALUE(2.64), + SIMDE_FLOAT16_VALUE(1.63) }, + { SIMDE_FLOAT16_VALUE(12.54), + SIMDE_FLOAT16_VALUE(3.54) }, + { SIMDE_FLOAT16_VALUE(3.75), + SIMDE_FLOAT16_VALUE(1.94) }, + { SIMDE_FLOAT16_VALUE(2.83), + SIMDE_FLOAT16_VALUE(1.68) }, + { SIMDE_FLOAT16_VALUE(13.95), + SIMDE_FLOAT16_VALUE(3.73) }, + { SIMDE_FLOAT16_VALUE(8.32), + SIMDE_FLOAT16_VALUE(2.88) }, + { SIMDE_FLOAT16_VALUE(14.00), + SIMDE_FLOAT16_VALUE(3.74) }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16 r = simde_vsqrth_f16(test_vec[i].a); + + simde_assert_equal_f16(r, test_vec[i].r, 1); + } + + return 0; +} + +static int +test_simde_vsqrt_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(27.93), SIMDE_FLOAT16_VALUE(10.08), SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(11.22) }, + { SIMDE_FLOAT16_VALUE(5.28), SIMDE_FLOAT16_VALUE(3.18), SIMDE_FLOAT16_VALUE(3.05), SIMDE_FLOAT16_VALUE(3.35) } }, + { { SIMDE_FLOAT16_VALUE(15.66), SIMDE_FLOAT16_VALUE(10.82), SIMDE_FLOAT16_VALUE(12.12), SIMDE_FLOAT16_VALUE(29.63) }, + { SIMDE_FLOAT16_VALUE(3.96), SIMDE_FLOAT16_VALUE(3.29), SIMDE_FLOAT16_VALUE(3.48), SIMDE_FLOAT16_VALUE(5.44) } }, + { { SIMDE_FLOAT16_VALUE(9.58), SIMDE_FLOAT16_VALUE(0.73), SIMDE_FLOAT16_VALUE(25.50), SIMDE_FLOAT16_VALUE(28.03) }, + { SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(0.85), SIMDE_FLOAT16_VALUE(5.05), SIMDE_FLOAT16_VALUE(5.29) } }, + { { SIMDE_FLOAT16_VALUE(17.38), SIMDE_FLOAT16_VALUE(7.14), SIMDE_FLOAT16_VALUE(29.60), SIMDE_FLOAT16_VALUE(7.30) }, + { SIMDE_FLOAT16_VALUE(4.17), SIMDE_FLOAT16_VALUE(2.67), SIMDE_FLOAT16_VALUE(5.44), SIMDE_FLOAT16_VALUE(2.70) } }, + { { SIMDE_FLOAT16_VALUE(17.10), SIMDE_FLOAT16_VALUE(20.07), SIMDE_FLOAT16_VALUE(24.99), SIMDE_FLOAT16_VALUE(19.04) }, + { SIMDE_FLOAT16_VALUE(4.13), SIMDE_FLOAT16_VALUE(4.48), SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(4.36) } }, + { { SIMDE_FLOAT16_VALUE(22.22), SIMDE_FLOAT16_VALUE(29.40), SIMDE_FLOAT16_VALUE(18.64), SIMDE_FLOAT16_VALUE(19.27) }, + { SIMDE_FLOAT16_VALUE(4.71), SIMDE_FLOAT16_VALUE(5.42), SIMDE_FLOAT16_VALUE(4.32), SIMDE_FLOAT16_VALUE(4.39) } }, + { { SIMDE_FLOAT16_VALUE(18.40), SIMDE_FLOAT16_VALUE(24.71), SIMDE_FLOAT16_VALUE(6.33), SIMDE_FLOAT16_VALUE(22.61) }, + { SIMDE_FLOAT16_VALUE(4.29), SIMDE_FLOAT16_VALUE(4.97), SIMDE_FLOAT16_VALUE(2.52), SIMDE_FLOAT16_VALUE(4.75) } }, + { { SIMDE_FLOAT16_VALUE(19.57), SIMDE_FLOAT16_VALUE(25.27), SIMDE_FLOAT16_VALUE(21.44), SIMDE_FLOAT16_VALUE(21.66) }, + { SIMDE_FLOAT16_VALUE(4.42), SIMDE_FLOAT16_VALUE(5.03), SIMDE_FLOAT16_VALUE(4.63), SIMDE_FLOAT16_VALUE(4.65) } }, + { { SIMDE_FLOAT16_VALUE(14.01), SIMDE_FLOAT16_VALUE(25.21), SIMDE_FLOAT16_VALUE(20.26), SIMDE_FLOAT16_VALUE(3.23) }, + { SIMDE_FLOAT16_VALUE(3.74), SIMDE_FLOAT16_VALUE(5.02), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(1.80) } }, + { { SIMDE_FLOAT16_VALUE(14.15), SIMDE_FLOAT16_VALUE(25.08), SIMDE_FLOAT16_VALUE(19.10), SIMDE_FLOAT16_VALUE(25.72) }, + { SIMDE_FLOAT16_VALUE(3.76), SIMDE_FLOAT16_VALUE(5.01), SIMDE_FLOAT16_VALUE(4.37), SIMDE_FLOAT16_VALUE(5.07) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a, r; + + a = simde_vld1_f16(test_vec[i].a); + r = simde_vsqrt_f16(a); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + +static int +test_simde_vsqrt_f32 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float32 a[2]; + simde_float32 r[2]; + } test_vec[] = { + { { SIMDE_FLOAT32_C(255.87), SIMDE_FLOAT32_C(943.43) }, + { SIMDE_FLOAT32_C(16.00), SIMDE_FLOAT32_C(30.72) } }, + { { SIMDE_FLOAT32_C(250.05), SIMDE_FLOAT32_C(276.70) }, + { SIMDE_FLOAT32_C(15.81), SIMDE_FLOAT32_C(16.63) } }, + { { SIMDE_FLOAT32_C(249.60), SIMDE_FLOAT32_C(220.60) }, + { SIMDE_FLOAT32_C(15.80), SIMDE_FLOAT32_C(14.85) } }, + { { SIMDE_FLOAT32_C(334.91), SIMDE_FLOAT32_C(691.17) }, + { SIMDE_FLOAT32_C(18.30), SIMDE_FLOAT32_C(26.29) } }, + { { SIMDE_FLOAT32_C(664.12), SIMDE_FLOAT32_C(144.33) }, + { SIMDE_FLOAT32_C(25.77), SIMDE_FLOAT32_C(12.01) } }, + { { SIMDE_FLOAT32_C(107.89), SIMDE_FLOAT32_C(915.17) }, + { SIMDE_FLOAT32_C(10.39), SIMDE_FLOAT32_C(30.25) } }, + { { SIMDE_FLOAT32_C(951.87), SIMDE_FLOAT32_C(949.51) }, + { SIMDE_FLOAT32_C(30.85), SIMDE_FLOAT32_C(30.81) } }, + { { SIMDE_FLOAT32_C(943.48), SIMDE_FLOAT32_C(897.40) }, + { SIMDE_FLOAT32_C(30.72), SIMDE_FLOAT32_C(29.96) } }, + { { SIMDE_FLOAT32_C(420.47), SIMDE_FLOAT32_C(892.05) }, + { SIMDE_FLOAT32_C(20.51), SIMDE_FLOAT32_C(29.87) } }, + { { SIMDE_FLOAT32_C(30.16), SIMDE_FLOAT32_C(596.51) }, + { SIMDE_FLOAT32_C(5.49), SIMDE_FLOAT32_C(24.42) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x2_t a, r; + + a = simde_vld1_f32(test_vec[i].a); + r = simde_vsqrt_f32(a); + + simde_test_arm_neon_assert_equal_f32x2(r, simde_vld1_f32(test_vec[i].r), 1); + } + + return 0; +} + +static int +test_simde_vsqrt_f64 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float64 a[1]; + simde_float64 r[1]; + } test_vec[] = { + { { SIMDE_FLOAT64_C(3896.76) }, + { SIMDE_FLOAT64_C(62.42) } }, + { { SIMDE_FLOAT64_C(971.73) }, + { SIMDE_FLOAT64_C(31.17) } }, + { { SIMDE_FLOAT64_C(3227.46) }, + { SIMDE_FLOAT64_C(56.81) } }, + { { SIMDE_FLOAT64_C(3649.56) }, + { SIMDE_FLOAT64_C(60.41) } }, + { { SIMDE_FLOAT64_C(2741.38) }, + { SIMDE_FLOAT64_C(52.36) } }, + { { SIMDE_FLOAT64_C(1774.65) }, + { SIMDE_FLOAT64_C(42.13) } }, + { { SIMDE_FLOAT64_C(2370.86) }, + { SIMDE_FLOAT64_C(48.69) } }, + { { SIMDE_FLOAT64_C(3416.49) }, + { SIMDE_FLOAT64_C(58.45) } }, + { { SIMDE_FLOAT64_C(1455.69) }, + { SIMDE_FLOAT64_C(38.15) } }, + { { SIMDE_FLOAT64_C(3986.21) }, + { SIMDE_FLOAT64_C(63.14) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float64x1_t a = simde_vld1_f64(test_vec[i].a); + simde_float64x1_t r = simde_vsqrt_f64(a); + + simde_test_arm_neon_assert_equal_f64x1(r, simde_vld1_f64(test_vec[i].r), 1); + } + + return 0; +} + +static int +test_simde_vsqrtq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(10.75), SIMDE_FLOAT16_VALUE(3.14), SIMDE_FLOAT16_VALUE(3.83), SIMDE_FLOAT16_VALUE(2.77), SIMDE_FLOAT16_VALUE(12.19), SIMDE_FLOAT16_VALUE(1.99), SIMDE_FLOAT16_VALUE(1.01), SIMDE_FLOAT16_VALUE(15.86) }, + { SIMDE_FLOAT16_VALUE(3.28), SIMDE_FLOAT16_VALUE(1.77), SIMDE_FLOAT16_VALUE(1.96), SIMDE_FLOAT16_VALUE(1.67), SIMDE_FLOAT16_VALUE(3.49), SIMDE_FLOAT16_VALUE(1.41), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(3.98) } }, + { { SIMDE_FLOAT16_VALUE(13.23), SIMDE_FLOAT16_VALUE(19.79), SIMDE_FLOAT16_VALUE(10.84), SIMDE_FLOAT16_VALUE(13.04), SIMDE_FLOAT16_VALUE(1.81), SIMDE_FLOAT16_VALUE(1.07), SIMDE_FLOAT16_VALUE(17.89), SIMDE_FLOAT16_VALUE(12.24) }, + { SIMDE_FLOAT16_VALUE(3.64), SIMDE_FLOAT16_VALUE(4.45), SIMDE_FLOAT16_VALUE(3.29), SIMDE_FLOAT16_VALUE(3.61), SIMDE_FLOAT16_VALUE(1.34), SIMDE_FLOAT16_VALUE(1.04), SIMDE_FLOAT16_VALUE(4.23), SIMDE_FLOAT16_VALUE(3.50) } }, + { { SIMDE_FLOAT16_VALUE(19.11), SIMDE_FLOAT16_VALUE(7.79), SIMDE_FLOAT16_VALUE(14.92), SIMDE_FLOAT16_VALUE(3.96), SIMDE_FLOAT16_VALUE(11.17), SIMDE_FLOAT16_VALUE(13.91), SIMDE_FLOAT16_VALUE(19.04), SIMDE_FLOAT16_VALUE(8.31) }, + { SIMDE_FLOAT16_VALUE(4.37), SIMDE_FLOAT16_VALUE(2.79), SIMDE_FLOAT16_VALUE(3.86), SIMDE_FLOAT16_VALUE(1.99), SIMDE_FLOAT16_VALUE(3.34), SIMDE_FLOAT16_VALUE(3.73), SIMDE_FLOAT16_VALUE(4.36), SIMDE_FLOAT16_VALUE(2.88) } }, + { { SIMDE_FLOAT16_VALUE(3.38), SIMDE_FLOAT16_VALUE(15.99), SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(11.15), SIMDE_FLOAT16_VALUE(8.01), SIMDE_FLOAT16_VALUE(9.98), SIMDE_FLOAT16_VALUE(11.56) }, + { SIMDE_FLOAT16_VALUE(1.84), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(2.41), SIMDE_FLOAT16_VALUE(1.22), SIMDE_FLOAT16_VALUE(3.34), SIMDE_FLOAT16_VALUE(2.83), SIMDE_FLOAT16_VALUE(3.16), SIMDE_FLOAT16_VALUE(3.40) } }, + { { SIMDE_FLOAT16_VALUE(5.72), SIMDE_FLOAT16_VALUE(4.72), SIMDE_FLOAT16_VALUE(13.35), SIMDE_FLOAT16_VALUE(5.27), SIMDE_FLOAT16_VALUE(14.93), SIMDE_FLOAT16_VALUE(8.37), SIMDE_FLOAT16_VALUE(9.29), SIMDE_FLOAT16_VALUE(12.19) }, + { SIMDE_FLOAT16_VALUE(2.39), SIMDE_FLOAT16_VALUE(2.17), SIMDE_FLOAT16_VALUE(3.65), SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(3.86), SIMDE_FLOAT16_VALUE(2.89), SIMDE_FLOAT16_VALUE(3.05), SIMDE_FLOAT16_VALUE(3.49) } }, + { { SIMDE_FLOAT16_VALUE(0.56), SIMDE_FLOAT16_VALUE(15.39), SIMDE_FLOAT16_VALUE(2.96), SIMDE_FLOAT16_VALUE(14.04), SIMDE_FLOAT16_VALUE(3.69), SIMDE_FLOAT16_VALUE(16.17), SIMDE_FLOAT16_VALUE(10.27), SIMDE_FLOAT16_VALUE(8.75) }, + { SIMDE_FLOAT16_VALUE(0.75), SIMDE_FLOAT16_VALUE(3.92), SIMDE_FLOAT16_VALUE(1.72), SIMDE_FLOAT16_VALUE(3.75), SIMDE_FLOAT16_VALUE(1.92), SIMDE_FLOAT16_VALUE(4.02), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(2.96) } }, + { { SIMDE_FLOAT16_VALUE(6.87), SIMDE_FLOAT16_VALUE(17.75), SIMDE_FLOAT16_VALUE(10.49), SIMDE_FLOAT16_VALUE(12.41), SIMDE_FLOAT16_VALUE(10.46), SIMDE_FLOAT16_VALUE(13.51), SIMDE_FLOAT16_VALUE(14.18), SIMDE_FLOAT16_VALUE(3.12) }, + { SIMDE_FLOAT16_VALUE(2.62), SIMDE_FLOAT16_VALUE(4.21), SIMDE_FLOAT16_VALUE(3.24), SIMDE_FLOAT16_VALUE(3.52), SIMDE_FLOAT16_VALUE(3.23), SIMDE_FLOAT16_VALUE(3.68), SIMDE_FLOAT16_VALUE(3.77), SIMDE_FLOAT16_VALUE(1.76) } }, + { { SIMDE_FLOAT16_VALUE(16.66), SIMDE_FLOAT16_VALUE(2.38), SIMDE_FLOAT16_VALUE(5.49), SIMDE_FLOAT16_VALUE(15.56), SIMDE_FLOAT16_VALUE(5.03), SIMDE_FLOAT16_VALUE(15.19), SIMDE_FLOAT16_VALUE(19.95), SIMDE_FLOAT16_VALUE(2.03) }, + { SIMDE_FLOAT16_VALUE(4.08), SIMDE_FLOAT16_VALUE(1.54), SIMDE_FLOAT16_VALUE(2.34), SIMDE_FLOAT16_VALUE(3.94), SIMDE_FLOAT16_VALUE(2.24), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(4.47), SIMDE_FLOAT16_VALUE(1.42) } }, + { { SIMDE_FLOAT16_VALUE(8.75), SIMDE_FLOAT16_VALUE(7.36), SIMDE_FLOAT16_VALUE(16.08), SIMDE_FLOAT16_VALUE(10.14), SIMDE_FLOAT16_VALUE(18.98), SIMDE_FLOAT16_VALUE(3.88), SIMDE_FLOAT16_VALUE(10.48), SIMDE_FLOAT16_VALUE(15.78) }, + { SIMDE_FLOAT16_VALUE(2.96), SIMDE_FLOAT16_VALUE(2.71), SIMDE_FLOAT16_VALUE(4.01), SIMDE_FLOAT16_VALUE(3.18), SIMDE_FLOAT16_VALUE(4.36), SIMDE_FLOAT16_VALUE(1.97), SIMDE_FLOAT16_VALUE(3.24), SIMDE_FLOAT16_VALUE(3.97) } }, + { { SIMDE_FLOAT16_VALUE(16.48), SIMDE_FLOAT16_VALUE(13.25), SIMDE_FLOAT16_VALUE(2.25), SIMDE_FLOAT16_VALUE(15.60), SIMDE_FLOAT16_VALUE(17.74), SIMDE_FLOAT16_VALUE(6.29), SIMDE_FLOAT16_VALUE(1.11), SIMDE_FLOAT16_VALUE(14.10) }, + { SIMDE_FLOAT16_VALUE(4.06), SIMDE_FLOAT16_VALUE(3.64), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(3.95), SIMDE_FLOAT16_VALUE(4.21), SIMDE_FLOAT16_VALUE(2.51), SIMDE_FLOAT16_VALUE(1.05), SIMDE_FLOAT16_VALUE(3.75) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a, r; + + a = simde_vld1q_f16(test_vec[i].a); + r = simde_vsqrtq_f16(a); + + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + +static int +test_simde_vsqrtq_f32 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float32 a[4]; + simde_float32 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT32_C(898.16), SIMDE_FLOAT32_C(436.83), SIMDE_FLOAT32_C(941.91), SIMDE_FLOAT32_C(130.36) }, + { SIMDE_FLOAT32_C(29.97), SIMDE_FLOAT32_C(20.90), SIMDE_FLOAT32_C(30.69), SIMDE_FLOAT32_C(11.42) } }, + { { SIMDE_FLOAT32_C(946.72), SIMDE_FLOAT32_C(848.19), SIMDE_FLOAT32_C(947.07), SIMDE_FLOAT32_C(24.60) }, + { SIMDE_FLOAT32_C(30.77), SIMDE_FLOAT32_C(29.12), SIMDE_FLOAT32_C(30.77), SIMDE_FLOAT32_C(4.96) } }, + { { SIMDE_FLOAT32_C(511.81), SIMDE_FLOAT32_C(423.44), SIMDE_FLOAT32_C(105.77), SIMDE_FLOAT32_C(642.15) }, + { SIMDE_FLOAT32_C(22.62), SIMDE_FLOAT32_C(20.58), SIMDE_FLOAT32_C(10.28), SIMDE_FLOAT32_C(25.34) } }, + { { SIMDE_FLOAT32_C(394.76), SIMDE_FLOAT32_C(296.91), SIMDE_FLOAT32_C(606.33), SIMDE_FLOAT32_C(821.66) }, + { SIMDE_FLOAT32_C(19.87), SIMDE_FLOAT32_C(17.23), SIMDE_FLOAT32_C(24.62), SIMDE_FLOAT32_C(28.66) } }, + { { SIMDE_FLOAT32_C(529.20), SIMDE_FLOAT32_C(427.34), SIMDE_FLOAT32_C(115.65), SIMDE_FLOAT32_C(758.21) }, + { SIMDE_FLOAT32_C(23.00), SIMDE_FLOAT32_C(20.67), SIMDE_FLOAT32_C(10.75), SIMDE_FLOAT32_C(27.54) } }, + { { SIMDE_FLOAT32_C(567.66), SIMDE_FLOAT32_C(227.63), SIMDE_FLOAT32_C(704.04), SIMDE_FLOAT32_C(584.28) }, + { SIMDE_FLOAT32_C(23.83), SIMDE_FLOAT32_C(15.09), SIMDE_FLOAT32_C(26.53), SIMDE_FLOAT32_C(24.17) } }, + { { SIMDE_FLOAT32_C(922.13), SIMDE_FLOAT32_C(627.68), SIMDE_FLOAT32_C(890.72), SIMDE_FLOAT32_C(977.81) }, + { SIMDE_FLOAT32_C(30.37), SIMDE_FLOAT32_C(25.05), SIMDE_FLOAT32_C(29.84), SIMDE_FLOAT32_C(31.27) } }, + { { SIMDE_FLOAT32_C(651.46), SIMDE_FLOAT32_C(390.03), SIMDE_FLOAT32_C(164.80), SIMDE_FLOAT32_C(529.63) }, + { SIMDE_FLOAT32_C(25.52), SIMDE_FLOAT32_C(19.75), SIMDE_FLOAT32_C(12.84), SIMDE_FLOAT32_C(23.01) } }, + { { SIMDE_FLOAT32_C(92.82), SIMDE_FLOAT32_C(762.54), SIMDE_FLOAT32_C(539.12), SIMDE_FLOAT32_C(63.76) }, + { SIMDE_FLOAT32_C(9.63), SIMDE_FLOAT32_C(27.61), SIMDE_FLOAT32_C(23.22), SIMDE_FLOAT32_C(7.98) } }, + { { SIMDE_FLOAT32_C(944.37), SIMDE_FLOAT32_C(504.86), SIMDE_FLOAT32_C(894.52), SIMDE_FLOAT32_C(430.50) }, + { SIMDE_FLOAT32_C(30.73), SIMDE_FLOAT32_C(22.47), SIMDE_FLOAT32_C(29.91), SIMDE_FLOAT32_C(20.75) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float32x4_t a = simde_vld1q_f32(test_vec[i].a); + simde_float32x4_t r = simde_vsqrtq_f32(a); + simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); + } + + return 0; +} + +static int +test_simde_vsqrtq_f64 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float64 a[2]; + simde_float64 r[2]; + } test_vec[] = { + { { SIMDE_FLOAT64_C(1501.67), SIMDE_FLOAT64_C(3408.26) }, + { SIMDE_FLOAT64_C(38.75), SIMDE_FLOAT64_C(58.38) } }, + { { SIMDE_FLOAT64_C(1094.55), SIMDE_FLOAT64_C(3293.01) }, + { SIMDE_FLOAT64_C(33.08), SIMDE_FLOAT64_C(57.38) } }, + { { SIMDE_FLOAT64_C(2202.11), SIMDE_FLOAT64_C(1239.65) }, + { SIMDE_FLOAT64_C(46.93), SIMDE_FLOAT64_C(35.21) } }, + { { SIMDE_FLOAT64_C(252.00), SIMDE_FLOAT64_C(452.15) }, + { SIMDE_FLOAT64_C(15.87), SIMDE_FLOAT64_C(21.26) } }, + { { SIMDE_FLOAT64_C(2604.02), SIMDE_FLOAT64_C(3478.61) }, + { SIMDE_FLOAT64_C(51.03), SIMDE_FLOAT64_C(58.98) } }, + { { SIMDE_FLOAT64_C(2077.18), SIMDE_FLOAT64_C(3121.04) }, + { SIMDE_FLOAT64_C(45.58), SIMDE_FLOAT64_C(55.87) } }, + { { SIMDE_FLOAT64_C(2819.71), SIMDE_FLOAT64_C(2570.87) }, + { SIMDE_FLOAT64_C(53.10), SIMDE_FLOAT64_C(50.70) } }, + { { SIMDE_FLOAT64_C(3336.66), SIMDE_FLOAT64_C(2003.93) }, + { SIMDE_FLOAT64_C(57.76), SIMDE_FLOAT64_C(44.77) } }, + { { SIMDE_FLOAT64_C(2249.24), SIMDE_FLOAT64_C(30.55) }, + { SIMDE_FLOAT64_C(47.43), SIMDE_FLOAT64_C(5.53) } }, + { { SIMDE_FLOAT64_C(3238.95), SIMDE_FLOAT64_C(1018.00) }, + { SIMDE_FLOAT64_C(56.91), SIMDE_FLOAT64_C(31.91) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float64x2_t a = simde_vld1q_f64(test_vec[i].a); + simde_float64x2_t r = simde_vsqrtq_f64(a); + + simde_test_arm_neon_assert_equal_f64x2(r, simde_vld1q_f64(test_vec[i].r), 1); + } + + return 0; +} + +SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vsqrth_f16) +SIMDE_TEST_FUNC_LIST_ENTRY(vsqrt_f16) +SIMDE_TEST_FUNC_LIST_ENTRY(vsqrt_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vsqrt_f64) +SIMDE_TEST_FUNC_LIST_ENTRY(vsqrtq_f16) +SIMDE_TEST_FUNC_LIST_ENTRY(vsqrtq_f32) +SIMDE_TEST_FUNC_LIST_ENTRY(vsqrtq_f64) +SIMDE_TEST_FUNC_LIST_END + +#include "test-neon-footer.h" diff --git a/test/arm/neon/st2.c b/test/arm/neon/st2.c index 16ad9ab56..87d7536c6 100644 --- a/test/arm/neon/st2.c +++ b/test/arm/neon/st2.c @@ -1,11 +1,61 @@ - -#include "test/test.h" #define SIMDE_TEST_ARM_NEON_INSN st2 #include "test-neon.h" #include "../../../simde/arm/neon/st2.h" #if !defined(SIMDE_BUG_INTEL_857088) +static int +test_simde_vst2_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 r0[4]; + simde_float16 r1[4]; + simde_float16 a[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(5.90) }, + { SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(-6.80) }, + { SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(5.90), SIMDE_FLOAT16_VALUE(-6.80) } }, + { { SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(1.50) }, + { SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(8.90) }, + { SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(8.90) } }, + { { SIMDE_FLOAT16_VALUE(-1.10), SIMDE_FLOAT16_VALUE(-7.60), SIMDE_FLOAT16_VALUE(-4.60), SIMDE_FLOAT16_VALUE(0.20) }, + { SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(7.70), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(5.00) }, + { SIMDE_FLOAT16_VALUE(-1.10), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-7.60), SIMDE_FLOAT16_VALUE(7.70), SIMDE_FLOAT16_VALUE(-4.60), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(5.00) } }, + { { SIMDE_FLOAT16_VALUE(-8.60), SIMDE_FLOAT16_VALUE(-9.10), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(5.60) }, + { SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(-6.00) }, + { SIMDE_FLOAT16_VALUE(-8.60), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(-9.10), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(5.60), SIMDE_FLOAT16_VALUE(-6.00) } }, + { { SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(-6.50), SIMDE_FLOAT16_VALUE(-2.80) }, + { SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(-9.40), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(-2.80) }, + { SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(-9.40), SIMDE_FLOAT16_VALUE(-6.50), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(-2.80) } }, + { { SIMDE_FLOAT16_VALUE(-2.20), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(-7.40) }, + { SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(4.40), SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(9.20) }, + { SIMDE_FLOAT16_VALUE(-2.20), SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(4.40), SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(-7.40), SIMDE_FLOAT16_VALUE(9.20) } }, + { { SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(-0.90) }, + { SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(7.30) }, + { SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(-0.90), SIMDE_FLOAT16_VALUE(7.30) } }, + { { SIMDE_FLOAT16_VALUE(-8.40), SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(-0.60), SIMDE_FLOAT16_VALUE(0.20) }, + { SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(8.20), SIMDE_FLOAT16_VALUE(4.20) }, + { SIMDE_FLOAT16_VALUE(-8.40), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(-0.60), SIMDE_FLOAT16_VALUE(8.20), SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(4.20) } }, + { { SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(-7.90) }, + { SIMDE_FLOAT16_VALUE(-6.00), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(9.30) }, + { SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-6.00), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(9.30) } }, + { { SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(-7.50), SIMDE_FLOAT16_VALUE(9.60) }, + { SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(0.40) }, + { SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-7.50), SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(0.40) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4x2_t r_ = { { simde_vld1_f16(test_vec[i].r0), + simde_vld1_f16(test_vec[i].r1) } }; + + simde_float16 a_[8]; + simde_vst2_f16(a_, r_); + + simde_assert_equal_i(0, simde_memcmp(a_, test_vec[i].a, sizeof(test_vec[i].a))); + } + + return 0; +} + static int test_simde_vst2_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -662,6 +712,58 @@ test_simde_vst2_u64 (SIMDE_MUNIT_TEST_ARGS) { #endif } +static int +test_simde_vst2q_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 r0[8]; + simde_float16 r1[8]; + simde_float16 a[16]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-7.50), SIMDE_FLOAT16_VALUE(-0.90), SIMDE_FLOAT16_VALUE(-2.10) }, + { SIMDE_FLOAT16_VALUE(-5.90), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(-8.70), SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(-5.80) }, + { SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-5.90), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(-7.50), SIMDE_FLOAT16_VALUE(-8.70), SIMDE_FLOAT16_VALUE(-0.90), SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(-5.80) } }, + { { SIMDE_FLOAT16_VALUE(-6.80), SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(7.60), SIMDE_FLOAT16_VALUE(-9.80) }, + { SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(1.90), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(9.80), SIMDE_FLOAT16_VALUE(-2.80) }, + { SIMDE_FLOAT16_VALUE(-6.80), SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(1.90), SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(7.60), SIMDE_FLOAT16_VALUE(9.80), SIMDE_FLOAT16_VALUE(-9.80), SIMDE_FLOAT16_VALUE(-2.80) } }, + { { SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(6.70), SIMDE_FLOAT16_VALUE(-8.90), SIMDE_FLOAT16_VALUE(-8.90), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(3.90) }, + { SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(5.40), SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(-6.40), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(-0.70) }, + { SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(6.70), SIMDE_FLOAT16_VALUE(5.40), SIMDE_FLOAT16_VALUE(-8.90), SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(-8.90), SIMDE_FLOAT16_VALUE(-6.40), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(-0.70) } }, + { { SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(-7.40), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-9.90) }, + { SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(-6.80) }, + { SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(-7.40), SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(-6.80) } }, + { { SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(5.40), SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(-5.10), SIMDE_FLOAT16_VALUE(7.80) }, + { SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(0.80) }, + { SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(5.40), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(-5.10), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(0.80) } }, + { { SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(-7.60), SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(5.10), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(-5.50) }, + { SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(-5.10), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(0.00), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(-8.50) }, + { SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(-7.60), SIMDE_FLOAT16_VALUE(-5.10), SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(5.10), SIMDE_FLOAT16_VALUE(0.00), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(-8.50) } }, + { { SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(-5.00) }, + { SIMDE_FLOAT16_VALUE(8.10), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(5.80) }, + { SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(8.10), SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(-0.20), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(5.80) } }, + { { SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(8.20), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(-7.20), SIMDE_FLOAT16_VALUE(-4.20) }, + { SIMDE_FLOAT16_VALUE(8.90), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(-6.00) }, + { SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(8.90), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(8.20), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(-7.20), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(-6.00) } }, + { { SIMDE_FLOAT16_VALUE(-6.90), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(-1.00), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(-10.00) }, + { SIMDE_FLOAT16_VALUE(-7.50), SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-8.80) }, + { SIMDE_FLOAT16_VALUE(-6.90), SIMDE_FLOAT16_VALUE(-7.50), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(2.30), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(-1.00), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(-4.90), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-10.00), SIMDE_FLOAT16_VALUE(-8.80) } }, + { { SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(9.10) }, + { SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(-8.90), SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(-3.20) }, + { SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(-8.90), SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(9.10), SIMDE_FLOAT16_VALUE(-3.20) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8x2_t r_ = { { simde_vld1q_f16(test_vec[i].r0), + simde_vld1q_f16(test_vec[i].r1) } }; + + simde_float16 a_[16]; + simde_vst2q_f16(a_, r_); + + simde_assert_equal_i(0, simde_memcmp(a_, test_vec[i].a, sizeof(test_vec[i].a))); + } + + return 0; +} + static int test_simde_vst2q_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 @@ -1409,6 +1511,7 @@ test_simde_vst2q_u64 (SIMDE_MUNIT_TEST_ARGS) { SIMDE_TEST_FUNC_LIST_BEGIN #if !defined(SIMDE_BUG_INTEL_857088) +SIMDE_TEST_FUNC_LIST_ENTRY(vst2_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vst2_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vst2_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vst2_s8) @@ -1420,6 +1523,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vst2_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vst2_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vst2_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vst2q_s8) diff --git a/test/arm/neon/sub.c b/test/arm/neon/sub.c index 4e270cc33..d3784e5e6 100644 --- a/test/arm/neon/sub.c +++ b/test/arm/neon/sub.c @@ -3,6 +3,93 @@ #include "test-neon.h" #include "../../../simde/arm/neon/sub.h" +static int +test_simde_vsubh_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a; + simde_float16 b; + simde_float16 r; + } test_vec[] = { + { SIMDE_FLOAT16_VALUE( 167.25), + SIMDE_FLOAT16_VALUE( 952.00), + SIMDE_FLOAT16_VALUE( -785.00) }, + { SIMDE_FLOAT16_VALUE( -942.50), + SIMDE_FLOAT16_VALUE( -623.50), + SIMDE_FLOAT16_VALUE( -319.00) }, + { SIMDE_FLOAT16_VALUE( -1.52), + SIMDE_FLOAT16_VALUE( 118.88), + SIMDE_FLOAT16_VALUE( -120.38) }, + { SIMDE_FLOAT16_VALUE( -734.00), + SIMDE_FLOAT16_VALUE( 63.38), + SIMDE_FLOAT16_VALUE( -797.50) }, + { SIMDE_FLOAT16_VALUE( -352.00), + SIMDE_FLOAT16_VALUE( -409.00), + SIMDE_FLOAT16_VALUE( 57.00) }, + { SIMDE_FLOAT16_VALUE( 191.75), + SIMDE_FLOAT16_VALUE( 388.75), + SIMDE_FLOAT16_VALUE( -197.00) }, + { SIMDE_FLOAT16_VALUE( 835.50), + SIMDE_FLOAT16_VALUE( 550.50), + SIMDE_FLOAT16_VALUE( 285.00) }, + { SIMDE_FLOAT16_VALUE( -529.00), + SIMDE_FLOAT16_VALUE( 873.50), + SIMDE_FLOAT16_VALUE( -1402.00) } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16 r = simde_vsubh_f16(test_vec[i].a, test_vec[i].b); + + simde_assert_equal_f16(r, test_vec[i].r, 1); + } + return 0; +} + +static int +test_simde_vsub_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { {SIMDE_FLOAT16_VALUE(-49.28), SIMDE_FLOAT16_VALUE(-109.00), SIMDE_FLOAT16_VALUE(-626.50), SIMDE_FLOAT16_VALUE(-567.00)}, + {SIMDE_FLOAT16_VALUE(178.88), SIMDE_FLOAT16_VALUE(-10.22), SIMDE_FLOAT16_VALUE(-976.50), SIMDE_FLOAT16_VALUE(31.19)}, + {SIMDE_FLOAT16_VALUE(-228.12), SIMDE_FLOAT16_VALUE(-98.75), SIMDE_FLOAT16_VALUE(350.00), SIMDE_FLOAT16_VALUE(-598.00)} }, + { {SIMDE_FLOAT16_VALUE(-226.00), SIMDE_FLOAT16_VALUE(-520.50), SIMDE_FLOAT16_VALUE(-252.38), SIMDE_FLOAT16_VALUE(-407.50)}, + {SIMDE_FLOAT16_VALUE(-89.44), SIMDE_FLOAT16_VALUE(200.50), SIMDE_FLOAT16_VALUE(439.75), SIMDE_FLOAT16_VALUE(450.75)}, + {SIMDE_FLOAT16_VALUE(-136.50), SIMDE_FLOAT16_VALUE(-721.00), SIMDE_FLOAT16_VALUE(-692.00), SIMDE_FLOAT16_VALUE(-858.00)} }, + { {SIMDE_FLOAT16_VALUE(-833.00), SIMDE_FLOAT16_VALUE(-714.00), SIMDE_FLOAT16_VALUE(428.50), SIMDE_FLOAT16_VALUE(871.50)}, + {SIMDE_FLOAT16_VALUE(157.12), SIMDE_FLOAT16_VALUE(-972.50), SIMDE_FLOAT16_VALUE(-298.75), SIMDE_FLOAT16_VALUE(919.50)}, + {SIMDE_FLOAT16_VALUE(-990.00), SIMDE_FLOAT16_VALUE(258.50), SIMDE_FLOAT16_VALUE(727.00), SIMDE_FLOAT16_VALUE(-48.00)} }, + { {SIMDE_FLOAT16_VALUE(488.00), SIMDE_FLOAT16_VALUE(112.56), SIMDE_FLOAT16_VALUE(58.66), SIMDE_FLOAT16_VALUE(879.50)}, + {SIMDE_FLOAT16_VALUE(-129.00), SIMDE_FLOAT16_VALUE(858.50), SIMDE_FLOAT16_VALUE(133.88), SIMDE_FLOAT16_VALUE(920.50)}, + {SIMDE_FLOAT16_VALUE(617.00), SIMDE_FLOAT16_VALUE(-746.00), SIMDE_FLOAT16_VALUE(-75.25), SIMDE_FLOAT16_VALUE(-41.00)} }, + { {SIMDE_FLOAT16_VALUE(32.59), SIMDE_FLOAT16_VALUE(239.50), SIMDE_FLOAT16_VALUE(-487.50), SIMDE_FLOAT16_VALUE(853.50)}, + {SIMDE_FLOAT16_VALUE(750.50), SIMDE_FLOAT16_VALUE(510.75), SIMDE_FLOAT16_VALUE(177.50), SIMDE_FLOAT16_VALUE(-23.77)}, + {SIMDE_FLOAT16_VALUE(-718.00), SIMDE_FLOAT16_VALUE(-271.25), SIMDE_FLOAT16_VALUE(-665.00), SIMDE_FLOAT16_VALUE(877.50)} }, + { {SIMDE_FLOAT16_VALUE(-31.45), SIMDE_FLOAT16_VALUE(570.00), SIMDE_FLOAT16_VALUE(616.00), SIMDE_FLOAT16_VALUE(-942.00)}, + {SIMDE_FLOAT16_VALUE(630.50), SIMDE_FLOAT16_VALUE(823.50), SIMDE_FLOAT16_VALUE(392.75), SIMDE_FLOAT16_VALUE(463.25)}, + {SIMDE_FLOAT16_VALUE(-662.00), SIMDE_FLOAT16_VALUE(-253.50), SIMDE_FLOAT16_VALUE(223.25), SIMDE_FLOAT16_VALUE(-1405.00)} }, + { {SIMDE_FLOAT16_VALUE(-537.50), SIMDE_FLOAT16_VALUE(-964.50), SIMDE_FLOAT16_VALUE(-592.00), SIMDE_FLOAT16_VALUE(305.50)}, + {SIMDE_FLOAT16_VALUE(992.00), SIMDE_FLOAT16_VALUE(-707.00), SIMDE_FLOAT16_VALUE(-386.00), SIMDE_FLOAT16_VALUE(-496.00)}, + {SIMDE_FLOAT16_VALUE(-1530.00), SIMDE_FLOAT16_VALUE(-257.50), SIMDE_FLOAT16_VALUE(-206.00), SIMDE_FLOAT16_VALUE(801.50)} }, + { {SIMDE_FLOAT16_VALUE(-180.50), SIMDE_FLOAT16_VALUE(-555.50), SIMDE_FLOAT16_VALUE(375.50), SIMDE_FLOAT16_VALUE(948.50)}, + {SIMDE_FLOAT16_VALUE(413.75), SIMDE_FLOAT16_VALUE(758.50), SIMDE_FLOAT16_VALUE(972.00), SIMDE_FLOAT16_VALUE(-619.00)}, + {SIMDE_FLOAT16_VALUE(-594.00), SIMDE_FLOAT16_VALUE(-1314.00), SIMDE_FLOAT16_VALUE(-596.50), SIMDE_FLOAT16_VALUE(1568.00)} } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a, b, r; + + a = simde_vld1_f16(test_vec[i].a); + b = simde_vld1_f16(test_vec[i].b); + r = simde_vsub_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vsub_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -440,6 +527,74 @@ test_simde_vsub_u64 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vsubq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + simde_float16 r[8]; + } test_vec[] = { + +{ { SIMDE_FLOAT16_VALUE( 441.00), SIMDE_FLOAT16_VALUE( 861.50), SIMDE_FLOAT16_VALUE( 98.06), SIMDE_FLOAT16_VALUE( 896.00), + SIMDE_FLOAT16_VALUE( -918.50), SIMDE_FLOAT16_VALUE( -717.00), SIMDE_FLOAT16_VALUE( -823.00), SIMDE_FLOAT16_VALUE( -581.00) }, + { SIMDE_FLOAT16_VALUE( -684.00), SIMDE_FLOAT16_VALUE( -563.00), SIMDE_FLOAT16_VALUE( -15.31), SIMDE_FLOAT16_VALUE( 786.50), + SIMDE_FLOAT16_VALUE( -891.00), SIMDE_FLOAT16_VALUE( -859.50), SIMDE_FLOAT16_VALUE( -387.25), SIMDE_FLOAT16_VALUE( -969.00) }, + { SIMDE_FLOAT16_VALUE( 1125.00), SIMDE_FLOAT16_VALUE( 1424.00), SIMDE_FLOAT16_VALUE( 113.38), SIMDE_FLOAT16_VALUE( 109.50), + SIMDE_FLOAT16_VALUE( -27.50), SIMDE_FLOAT16_VALUE( 142.50), SIMDE_FLOAT16_VALUE( -435.75), SIMDE_FLOAT16_VALUE( 388.00) } }, +{ { SIMDE_FLOAT16_VALUE( -6.45), SIMDE_FLOAT16_VALUE( 29.20), SIMDE_FLOAT16_VALUE( -856.00), SIMDE_FLOAT16_VALUE( 267.25), + SIMDE_FLOAT16_VALUE( -302.00), SIMDE_FLOAT16_VALUE( 526.50), SIMDE_FLOAT16_VALUE( 713.00), SIMDE_FLOAT16_VALUE( -14.83) }, + { SIMDE_FLOAT16_VALUE( 848.00), SIMDE_FLOAT16_VALUE( -815.50), SIMDE_FLOAT16_VALUE( 672.50), SIMDE_FLOAT16_VALUE( -274.50), + SIMDE_FLOAT16_VALUE( -933.00), SIMDE_FLOAT16_VALUE( 952.50), SIMDE_FLOAT16_VALUE( -426.00), SIMDE_FLOAT16_VALUE( -373.75) }, + { SIMDE_FLOAT16_VALUE( -854.50), SIMDE_FLOAT16_VALUE( 844.50), SIMDE_FLOAT16_VALUE( -1528.00), SIMDE_FLOAT16_VALUE( 542.00), + SIMDE_FLOAT16_VALUE( 631.00), SIMDE_FLOAT16_VALUE( -426.00), SIMDE_FLOAT16_VALUE( 1139.00), SIMDE_FLOAT16_VALUE( 359.00) } }, +{ { SIMDE_FLOAT16_VALUE( 909.00), SIMDE_FLOAT16_VALUE( -475.75), SIMDE_FLOAT16_VALUE( 269.75), SIMDE_FLOAT16_VALUE( 991.00), + SIMDE_FLOAT16_VALUE( -192.62), SIMDE_FLOAT16_VALUE( 446.50), SIMDE_FLOAT16_VALUE( -590.00), SIMDE_FLOAT16_VALUE( -508.50) }, + { SIMDE_FLOAT16_VALUE( -9.56), SIMDE_FLOAT16_VALUE( -425.25), SIMDE_FLOAT16_VALUE( 294.75), SIMDE_FLOAT16_VALUE( 99.19), + SIMDE_FLOAT16_VALUE( -284.50), SIMDE_FLOAT16_VALUE( 907.50), SIMDE_FLOAT16_VALUE( 130.00), SIMDE_FLOAT16_VALUE( 722.00) }, + { SIMDE_FLOAT16_VALUE( 918.50), SIMDE_FLOAT16_VALUE( -50.50), SIMDE_FLOAT16_VALUE( -25.00), SIMDE_FLOAT16_VALUE( 892.00), + SIMDE_FLOAT16_VALUE( 91.88), SIMDE_FLOAT16_VALUE( -461.00), SIMDE_FLOAT16_VALUE( -720.00), SIMDE_FLOAT16_VALUE( -1230.00) } }, +{ { SIMDE_FLOAT16_VALUE( 121.69), SIMDE_FLOAT16_VALUE( 14.28), SIMDE_FLOAT16_VALUE( 545.00), SIMDE_FLOAT16_VALUE( 819.50), + SIMDE_FLOAT16_VALUE( -459.00), SIMDE_FLOAT16_VALUE( 258.50), SIMDE_FLOAT16_VALUE( -195.12), SIMDE_FLOAT16_VALUE( -307.00) }, + { SIMDE_FLOAT16_VALUE( -73.81), SIMDE_FLOAT16_VALUE( -132.25), SIMDE_FLOAT16_VALUE( -967.50), SIMDE_FLOAT16_VALUE( -6.60), + SIMDE_FLOAT16_VALUE( -179.88), SIMDE_FLOAT16_VALUE( -393.50), SIMDE_FLOAT16_VALUE( 619.50), SIMDE_FLOAT16_VALUE( -89.12) }, + { SIMDE_FLOAT16_VALUE( 195.50), SIMDE_FLOAT16_VALUE( 146.50), SIMDE_FLOAT16_VALUE( 1512.00), SIMDE_FLOAT16_VALUE( 826.00), + SIMDE_FLOAT16_VALUE( -279.00), SIMDE_FLOAT16_VALUE( 652.00), SIMDE_FLOAT16_VALUE( -814.50), SIMDE_FLOAT16_VALUE( -217.88) } }, +{ { SIMDE_FLOAT16_VALUE( 918.00), SIMDE_FLOAT16_VALUE( 650.00), SIMDE_FLOAT16_VALUE( 80.00), SIMDE_FLOAT16_VALUE( -275.00), + SIMDE_FLOAT16_VALUE( 96.56), SIMDE_FLOAT16_VALUE( 489.75), SIMDE_FLOAT16_VALUE( 216.50), SIMDE_FLOAT16_VALUE( -894.00) }, + { SIMDE_FLOAT16_VALUE( 85.06), SIMDE_FLOAT16_VALUE( -921.50), SIMDE_FLOAT16_VALUE( -6.98), SIMDE_FLOAT16_VALUE( 800.50), + SIMDE_FLOAT16_VALUE( 986.00), SIMDE_FLOAT16_VALUE( -877.00), SIMDE_FLOAT16_VALUE( 522.50), SIMDE_FLOAT16_VALUE( -135.75) }, + { SIMDE_FLOAT16_VALUE( 833.00), SIMDE_FLOAT16_VALUE( 1572.00), SIMDE_FLOAT16_VALUE( 87.00), SIMDE_FLOAT16_VALUE( -1076.00), + SIMDE_FLOAT16_VALUE( -889.50), SIMDE_FLOAT16_VALUE( 1367.00), SIMDE_FLOAT16_VALUE( -306.00), SIMDE_FLOAT16_VALUE( -758.00) } }, +{ { SIMDE_FLOAT16_VALUE( -108.69), SIMDE_FLOAT16_VALUE( -977.50), SIMDE_FLOAT16_VALUE( -44.56), SIMDE_FLOAT16_VALUE( 432.25), + SIMDE_FLOAT16_VALUE( 281.00), SIMDE_FLOAT16_VALUE( 760.00), SIMDE_FLOAT16_VALUE( -874.50), SIMDE_FLOAT16_VALUE( -645.00) }, + { SIMDE_FLOAT16_VALUE( 107.50), SIMDE_FLOAT16_VALUE( 907.00), SIMDE_FLOAT16_VALUE( -361.50), SIMDE_FLOAT16_VALUE( 927.50), + SIMDE_FLOAT16_VALUE( -486.50), SIMDE_FLOAT16_VALUE( -742.00), SIMDE_FLOAT16_VALUE( -161.50), SIMDE_FLOAT16_VALUE( -404.25) }, + { SIMDE_FLOAT16_VALUE( -216.25), SIMDE_FLOAT16_VALUE( -1884.00), SIMDE_FLOAT16_VALUE( 317.00), SIMDE_FLOAT16_VALUE( -495.25), + SIMDE_FLOAT16_VALUE( 767.50), SIMDE_FLOAT16_VALUE( 1502.00), SIMDE_FLOAT16_VALUE( -713.00), SIMDE_FLOAT16_VALUE( -240.75) } }, +{ { SIMDE_FLOAT16_VALUE( 392.00), SIMDE_FLOAT16_VALUE( -758.50), SIMDE_FLOAT16_VALUE( -870.50), SIMDE_FLOAT16_VALUE( -511.25), + SIMDE_FLOAT16_VALUE( 731.50), SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( -405.25), SIMDE_FLOAT16_VALUE( -353.75) }, + { SIMDE_FLOAT16_VALUE( -267.50), SIMDE_FLOAT16_VALUE( -602.00), SIMDE_FLOAT16_VALUE( 154.25), SIMDE_FLOAT16_VALUE( -281.75), + SIMDE_FLOAT16_VALUE( -478.75), SIMDE_FLOAT16_VALUE( -323.25), SIMDE_FLOAT16_VALUE( 582.50), SIMDE_FLOAT16_VALUE( 630.00) }, + { SIMDE_FLOAT16_VALUE( 659.50), SIMDE_FLOAT16_VALUE( -156.50), SIMDE_FLOAT16_VALUE( -1025.00), SIMDE_FLOAT16_VALUE( -229.50), + SIMDE_FLOAT16_VALUE( 1210.00), SIMDE_FLOAT16_VALUE( 669.00), SIMDE_FLOAT16_VALUE( -988.00), SIMDE_FLOAT16_VALUE( -984.00) } }, +{ { SIMDE_FLOAT16_VALUE( 345.75), SIMDE_FLOAT16_VALUE( 372.75), SIMDE_FLOAT16_VALUE( 802.50), SIMDE_FLOAT16_VALUE( -373.00), + SIMDE_FLOAT16_VALUE( 133.12), SIMDE_FLOAT16_VALUE( 928.00), SIMDE_FLOAT16_VALUE( -18.17), SIMDE_FLOAT16_VALUE( -974.50) }, + { SIMDE_FLOAT16_VALUE( 979.50), SIMDE_FLOAT16_VALUE( 656.50), SIMDE_FLOAT16_VALUE( 902.00), SIMDE_FLOAT16_VALUE( -507.00), + SIMDE_FLOAT16_VALUE( 914.50), SIMDE_FLOAT16_VALUE( -259.50), SIMDE_FLOAT16_VALUE( 88.69), SIMDE_FLOAT16_VALUE( -477.25) }, + { SIMDE_FLOAT16_VALUE( -634.00), SIMDE_FLOAT16_VALUE( -283.75), SIMDE_FLOAT16_VALUE( -99.50), SIMDE_FLOAT16_VALUE( 134.00), + SIMDE_FLOAT16_VALUE( -781.50), SIMDE_FLOAT16_VALUE( 1188.00), SIMDE_FLOAT16_VALUE( -106.88), SIMDE_FLOAT16_VALUE( -497.25) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_float16x8_t r = simde_vsubq_f16(a, b); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vsubq_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -924,6 +1079,8 @@ test_simde_vsubq_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vsubh_f16) +SIMDE_TEST_FUNC_LIST_ENTRY(vsub_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vsub_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vsub_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vsub_s8) @@ -935,6 +1092,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vsub_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vsub_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vsub_u64) +SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_f64) SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_s8) diff --git a/test/arm/neon/uzp1.c b/test/arm/neon/uzp1.c index 5f0fb8db0..644402287 100644 --- a/test/arm/neon/uzp1.c +++ b/test/arm/neon/uzp1.c @@ -3,6 +3,52 @@ #include "test-neon.h" #include "../../../simde/arm/neon/uzp1.h" +static int +test_simde_vuzp1_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( -49.28), SIMDE_FLOAT16_VALUE( -109.00), SIMDE_FLOAT16_VALUE( -626.50), SIMDE_FLOAT16_VALUE( -567.00) }, + { SIMDE_FLOAT16_VALUE( -178.88), SIMDE_FLOAT16_VALUE( 10.22), SIMDE_FLOAT16_VALUE( 976.50), SIMDE_FLOAT16_VALUE( -31.19) }, + { SIMDE_FLOAT16_VALUE( -49.28), SIMDE_FLOAT16_VALUE( -626.50), SIMDE_FLOAT16_VALUE( -178.88), SIMDE_FLOAT16_VALUE( 976.50) } }, + { { SIMDE_FLOAT16_VALUE( -226.00), SIMDE_FLOAT16_VALUE( -520.50), SIMDE_FLOAT16_VALUE( -252.38), SIMDE_FLOAT16_VALUE( -407.50) }, + { SIMDE_FLOAT16_VALUE( 89.44), SIMDE_FLOAT16_VALUE( -200.50), SIMDE_FLOAT16_VALUE( -439.75), SIMDE_FLOAT16_VALUE( -450.75) }, + { SIMDE_FLOAT16_VALUE( -226.00), SIMDE_FLOAT16_VALUE( -252.38), SIMDE_FLOAT16_VALUE( 89.44), SIMDE_FLOAT16_VALUE( -439.75) } }, + { { SIMDE_FLOAT16_VALUE( -833.00), SIMDE_FLOAT16_VALUE( -714.00), SIMDE_FLOAT16_VALUE( 428.50), SIMDE_FLOAT16_VALUE( 871.50) }, + { SIMDE_FLOAT16_VALUE( -157.12), SIMDE_FLOAT16_VALUE( 972.50), SIMDE_FLOAT16_VALUE( 298.75), SIMDE_FLOAT16_VALUE( -919.50) }, + { SIMDE_FLOAT16_VALUE( -833.00), SIMDE_FLOAT16_VALUE( 428.50), SIMDE_FLOAT16_VALUE( -157.12), SIMDE_FLOAT16_VALUE( 298.75) } }, + { { SIMDE_FLOAT16_VALUE( 488.00), SIMDE_FLOAT16_VALUE( 112.56), SIMDE_FLOAT16_VALUE( 58.66), SIMDE_FLOAT16_VALUE( 879.50) }, + { SIMDE_FLOAT16_VALUE( 129.00), SIMDE_FLOAT16_VALUE( -858.50), SIMDE_FLOAT16_VALUE( -133.88), SIMDE_FLOAT16_VALUE( -920.50) }, + { SIMDE_FLOAT16_VALUE( 488.00), SIMDE_FLOAT16_VALUE( 58.66), SIMDE_FLOAT16_VALUE( 129.00), SIMDE_FLOAT16_VALUE( -133.88) } }, + { { SIMDE_FLOAT16_VALUE( 32.59), SIMDE_FLOAT16_VALUE( 239.50), SIMDE_FLOAT16_VALUE( -487.50), SIMDE_FLOAT16_VALUE( 853.50) }, + { SIMDE_FLOAT16_VALUE( -750.50), SIMDE_FLOAT16_VALUE( -510.75), SIMDE_FLOAT16_VALUE( -177.50), SIMDE_FLOAT16_VALUE( 23.77) }, + { SIMDE_FLOAT16_VALUE( 32.59), SIMDE_FLOAT16_VALUE( -487.50), SIMDE_FLOAT16_VALUE( -750.50), SIMDE_FLOAT16_VALUE( -177.50) } }, + { { SIMDE_FLOAT16_VALUE( -31.45), SIMDE_FLOAT16_VALUE( 570.00), SIMDE_FLOAT16_VALUE( 616.00), SIMDE_FLOAT16_VALUE( -942.00) }, + { SIMDE_FLOAT16_VALUE( -630.50), SIMDE_FLOAT16_VALUE( -823.50), SIMDE_FLOAT16_VALUE( -392.75), SIMDE_FLOAT16_VALUE( -463.25) }, + { SIMDE_FLOAT16_VALUE( -31.45), SIMDE_FLOAT16_VALUE( 616.00), SIMDE_FLOAT16_VALUE( -630.50), SIMDE_FLOAT16_VALUE( -392.75) } }, + { { SIMDE_FLOAT16_VALUE( -537.50), SIMDE_FLOAT16_VALUE( -964.50), SIMDE_FLOAT16_VALUE( -592.00), SIMDE_FLOAT16_VALUE( 305.50) }, + { SIMDE_FLOAT16_VALUE( -992.00), SIMDE_FLOAT16_VALUE( 707.00), SIMDE_FLOAT16_VALUE( 386.00), SIMDE_FLOAT16_VALUE( 496.00) }, + { SIMDE_FLOAT16_VALUE( -537.50), SIMDE_FLOAT16_VALUE( -592.00), SIMDE_FLOAT16_VALUE( -992.00), SIMDE_FLOAT16_VALUE( 386.00) } }, + { { SIMDE_FLOAT16_VALUE( -180.50), SIMDE_FLOAT16_VALUE( -555.50), SIMDE_FLOAT16_VALUE( 375.50), SIMDE_FLOAT16_VALUE( 948.50) }, + { SIMDE_FLOAT16_VALUE( -413.75), SIMDE_FLOAT16_VALUE( -758.50), SIMDE_FLOAT16_VALUE( -972.00), SIMDE_FLOAT16_VALUE( 619.00) }, + { SIMDE_FLOAT16_VALUE( -180.50), SIMDE_FLOAT16_VALUE( 375.50), SIMDE_FLOAT16_VALUE( -413.75), SIMDE_FLOAT16_VALUE( -972.00) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a, b, r; + + a = simde_vld1_f16(test_vec[i].a); + b = simde_vld1_f16(test_vec[i].b); + r = simde_vuzp1_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vuzp1_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -795,6 +841,7 @@ test_simde_vuzp1q_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vuzp1_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vuzp1_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vuzp1_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vuzp1_s16) diff --git a/test/arm/neon/uzp2.c b/test/arm/neon/uzp2.c index 6df053665..00a6ff873 100644 --- a/test/arm/neon/uzp2.c +++ b/test/arm/neon/uzp2.c @@ -3,6 +3,40 @@ #include "test-neon.h" #include "../../../simde/arm/neon/uzp2.h" +static int +test_simde_vuzp2_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE( -49.28), SIMDE_FLOAT16_VALUE( -109.00), SIMDE_FLOAT16_VALUE( -626.50), SIMDE_FLOAT16_VALUE( -567.00) }, + { SIMDE_FLOAT16_VALUE( -178.88), SIMDE_FLOAT16_VALUE( 10.22), SIMDE_FLOAT16_VALUE( 976.50), SIMDE_FLOAT16_VALUE( -31.19) }, + { SIMDE_FLOAT16_VALUE( -109.00), SIMDE_FLOAT16_VALUE( -567.00), SIMDE_FLOAT16_VALUE( 10.22), SIMDE_FLOAT16_VALUE( -31.19) } }, + { { SIMDE_FLOAT16_VALUE( -226.00), SIMDE_FLOAT16_VALUE( -520.50), SIMDE_FLOAT16_VALUE( -252.38), SIMDE_FLOAT16_VALUE( -407.50) }, + { SIMDE_FLOAT16_VALUE( 89.44), SIMDE_FLOAT16_VALUE( -200.50), SIMDE_FLOAT16_VALUE( -439.75), SIMDE_FLOAT16_VALUE( -450.75) }, + { SIMDE_FLOAT16_VALUE( -520.50), SIMDE_FLOAT16_VALUE( -407.50), SIMDE_FLOAT16_VALUE( -200.50), SIMDE_FLOAT16_VALUE( -450.75) } }, + { { SIMDE_FLOAT16_VALUE( -833.00), SIMDE_FLOAT16_VALUE( -714.00), SIMDE_FLOAT16_VALUE( 428.50), SIMDE_FLOAT16_VALUE( 871.50) }, + { SIMDE_FLOAT16_VALUE( -157.12), SIMDE_FLOAT16_VALUE( 972.50), SIMDE_FLOAT16_VALUE( 298.75), SIMDE_FLOAT16_VALUE( -919.50) }, + { SIMDE_FLOAT16_VALUE( -714.00), SIMDE_FLOAT16_VALUE( 871.50), SIMDE_FLOAT16_VALUE( 972.50), SIMDE_FLOAT16_VALUE( -919.50) } }, + { { SIMDE_FLOAT16_VALUE( 488.00), SIMDE_FLOAT16_VALUE( 112.56), SIMDE_FLOAT16_VALUE( 58.66), SIMDE_FLOAT16_VALUE( 879.50) }, + { SIMDE_FLOAT16_VALUE( 129.00), SIMDE_FLOAT16_VALUE( -858.50), SIMDE_FLOAT16_VALUE( -133.88), SIMDE_FLOAT16_VALUE( -920.50) }, + { SIMDE_FLOAT16_VALUE( 112.56), SIMDE_FLOAT16_VALUE( 879.50), SIMDE_FLOAT16_VALUE( -858.50), SIMDE_FLOAT16_VALUE( -920.50) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a, b, r; + + a = simde_vld1_f16(test_vec[i].a); + b = simde_vld1_f16(test_vec[i].b); + r = simde_vuzp2_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vuzp2_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -795,6 +829,7 @@ test_simde_vuzp2q_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vuzp2_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vuzp2_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vuzp2_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vuzp2_s16) diff --git a/test/arm/neon/zip.c b/test/arm/neon/zip.c index 48ffd9b49..173efcc81 100644 --- a/test/arm/neon/zip.c +++ b/test/arm/neon/zip.c @@ -5,6 +5,67 @@ #if !defined(SIMDE_BUG_INTEL_857088) +static int +test_simde_vzip_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[2][4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(-6.90), SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(-1.00) }, + { SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(0.50), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(6.20) }, + { { SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(-6.90), SIMDE_FLOAT16_VALUE(0.50) }, + { SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(-1.00), SIMDE_FLOAT16_VALUE(6.20) } } }, + { { SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(6.90), SIMDE_FLOAT16_VALUE(-7.50), SIMDE_FLOAT16_VALUE(-1.90) }, + { SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(-9.30), SIMDE_FLOAT16_VALUE(0.00) }, + { { SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(6.90), SIMDE_FLOAT16_VALUE(3.50) }, + { SIMDE_FLOAT16_VALUE(-7.50), SIMDE_FLOAT16_VALUE(-9.30), SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(0.00) } } }, + { { SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(-4.20) }, + { SIMDE_FLOAT16_VALUE(-2.90), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(3.10) }, + { { SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(-2.90), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(2.10) }, + { SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(3.10) } } }, + { { SIMDE_FLOAT16_VALUE(8.30), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(5.00) }, + { SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(-9.80), SIMDE_FLOAT16_VALUE(-1.70) }, + { { SIMDE_FLOAT16_VALUE(8.30), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(-9.00) }, + { SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(-9.80), SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(-1.70) } } }, + { { SIMDE_FLOAT16_VALUE(9.10), SIMDE_FLOAT16_VALUE(1.80), SIMDE_FLOAT16_VALUE(-2.40), SIMDE_FLOAT16_VALUE(-4.10) }, + { SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(-9.10), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(3.90) }, + { { SIMDE_FLOAT16_VALUE(9.10), SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(1.80), SIMDE_FLOAT16_VALUE(-9.10) }, + { SIMDE_FLOAT16_VALUE(-2.40), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(3.90) } } }, + { { SIMDE_FLOAT16_VALUE(-6.40), SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(6.40) }, + { SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(3.90) }, + { { SIMDE_FLOAT16_VALUE(-6.40), SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(-8.30) }, + { SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(6.40), SIMDE_FLOAT16_VALUE(3.90) } } }, + { { SIMDE_FLOAT16_VALUE(6.40), SIMDE_FLOAT16_VALUE(-6.40), SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(-0.10) }, + { SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(-8.70) }, + { { SIMDE_FLOAT16_VALUE(6.40), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(-6.40), SIMDE_FLOAT16_VALUE(2.10) }, + { SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(-8.70) } } }, + { { SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(-1.00), SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(3.50) }, + { SIMDE_FLOAT16_VALUE(5.30), SIMDE_FLOAT16_VALUE(4.40), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(3.90) }, + { { SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(5.30), SIMDE_FLOAT16_VALUE(-1.00), SIMDE_FLOAT16_VALUE(4.40) }, + { SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(3.90) } } }, + { { SIMDE_FLOAT16_VALUE(8.90), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(-7.70), SIMDE_FLOAT16_VALUE(1.30) }, + { SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(9.30) }, + { { SIMDE_FLOAT16_VALUE(8.90), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(1.40) }, + { SIMDE_FLOAT16_VALUE(-7.70), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(9.30) } } }, + { { SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(-4.30), SIMDE_FLOAT16_VALUE(2.20) }, + { SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(7.40), SIMDE_FLOAT16_VALUE(-2.80) }, + { { SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(9.00) }, + { SIMDE_FLOAT16_VALUE(-4.30), SIMDE_FLOAT16_VALUE(7.40), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(-2.80) } } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_float16x4x2_t r = simde_vzip_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r.val[0], simde_vld1_f16(test_vec[i].r[0]), 1); + simde_test_arm_neon_assert_equal_f16x4(r.val[1], simde_vld1_f16(test_vec[i].r[1]), 1); + } + + return 0; +} + static int test_simde_vzip_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -549,6 +610,67 @@ test_simde_vzip_u32 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vzipq_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + simde_float16 r[2][8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(-7.80), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(-0.60) }, + { SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(-5.30), SIMDE_FLOAT16_VALUE(4.10) }, + { { SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(-7.80), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(7.50) }, + { SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(10.00), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(-5.30), SIMDE_FLOAT16_VALUE(-0.60), SIMDE_FLOAT16_VALUE(4.10) } } }, + { { SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(7.40), SIMDE_FLOAT16_VALUE(2.50) }, + { SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(5.90), SIMDE_FLOAT16_VALUE(-2.20), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(7.70), SIMDE_FLOAT16_VALUE(6.80) }, + { { SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(5.90) }, + { SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(-2.20), SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(7.40), SIMDE_FLOAT16_VALUE(7.70), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(6.80) } } }, + { { SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(-6.40), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(8.30), SIMDE_FLOAT16_VALUE(-5.30) }, + { SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(-5.40), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(8.80) }, + { { SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(-6.40), SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(-4.10) }, + { SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-5.40), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(8.30), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(-5.30), SIMDE_FLOAT16_VALUE(8.80) } } }, + { { SIMDE_FLOAT16_VALUE(8.10), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(-1.40) }, + { SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(-4.60), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(-5.40), SIMDE_FLOAT16_VALUE(-6.50) }, + { { SIMDE_FLOAT16_VALUE(8.10), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(-4.60), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(1.20) }, + { SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(-4.70), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(-5.40), SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(-6.50) } } }, + { { SIMDE_FLOAT16_VALUE(5.70), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(-6.60), SIMDE_FLOAT16_VALUE(-8.80), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(5.50) }, + { SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(6.80), SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(8.60) }, + { { SIMDE_FLOAT16_VALUE(5.70), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(-6.60), SIMDE_FLOAT16_VALUE(-5.20) }, + { SIMDE_FLOAT16_VALUE(-8.80), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(6.80), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(8.60) } } }, + { { SIMDE_FLOAT16_VALUE(-9.30), SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(4.30), SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(-6.00), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(-9.20) }, + { SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(-8.70), SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(3.50) }, + { { SIMDE_FLOAT16_VALUE(-9.30), SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(-2.50), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(4.30), SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(-8.70) }, + { SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(-6.00), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(3.50) } } }, + { { SIMDE_FLOAT16_VALUE(9.50), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(5.40), SIMDE_FLOAT16_VALUE(-2.70) }, + { SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(-8.60), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(2.70), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(-4.50), SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(-5.00) }, + { { SIMDE_FLOAT16_VALUE(9.50), SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-8.60), SIMDE_FLOAT16_VALUE(-3.50), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(2.70) }, + { SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(-4.50), SIMDE_FLOAT16_VALUE(5.40), SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-5.00) } } }, + { { SIMDE_FLOAT16_VALUE(-7.00), SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(-0.00), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(4.80) }, + { SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-7.10), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(4.90) }, + { { SIMDE_FLOAT16_VALUE(-7.00), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(-0.00), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(-7.10) }, + { SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(4.90) } } }, + { { SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(-6.30), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(7.50) }, + { SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-5.90), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(-6.50), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(7.60), SIMDE_FLOAT16_VALUE(-5.10) }, + { { SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(-5.90), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(3.60) }, + { SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(-6.50), SIMDE_FLOAT16_VALUE(-6.30), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(7.60), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(-5.10) } } }, + { { SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(-7.40), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(-4.50) }, + { SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(-7.80), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(-0.40) }, + { { SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(-7.30) }, + { SIMDE_FLOAT16_VALUE(-7.40), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(-7.80), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(-4.50), SIMDE_FLOAT16_VALUE(-0.40) } } }, + + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_float16x8x2_t r = simde_vzipq_f16(a, b); + simde_test_arm_neon_assert_equal_f16x8(r.val[0], simde_vld1q_f16(test_vec[i].r[0]), 1); + simde_test_arm_neon_assert_equal_f16x8(r.val[1], simde_vld1q_f16(test_vec[i].r[1]), 1); + } + + return 0; +} + static int test_simde_vzipq_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -1160,6 +1282,7 @@ test_simde_vzipq_u32 (SIMDE_MUNIT_TEST_ARGS) { SIMDE_TEST_FUNC_LIST_BEGIN #if !defined(SIMDE_BUG_INTEL_857088) +SIMDE_TEST_FUNC_LIST_ENTRY(vzip_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vzip_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vzip_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vzip_s16) @@ -1168,6 +1291,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vzip_u8) SIMDE_TEST_FUNC_LIST_ENTRY(vzip_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vzip_u32) +SIMDE_TEST_FUNC_LIST_ENTRY(vzipq_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vzipq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vzipq_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vzipq_s16) diff --git a/test/arm/neon/zip1.c b/test/arm/neon/zip1.c index 207d26373..b7a360b8c 100644 --- a/test/arm/neon/zip1.c +++ b/test/arm/neon/zip1.c @@ -3,6 +3,56 @@ #include #include +static int +test_simde_vzip1_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(5.60), SIMDE_FLOAT16_VALUE(5.30) }, + { SIMDE_FLOAT16_VALUE(6.70), SIMDE_FLOAT16_VALUE(-8.40), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(9.10) }, + { SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(6.70), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(-8.40) } }, + { { SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(-5.40) }, + { SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(-6.00), SIMDE_FLOAT16_VALUE(7.10) }, + { SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(-6.70) } }, + { { SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(8.30), SIMDE_FLOAT16_VALUE(-7.80) }, + { SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(-1.00), SIMDE_FLOAT16_VALUE(6.50), SIMDE_FLOAT16_VALUE(-2.70) }, + { SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(-1.00) } }, + { { SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(2.40) }, + { SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(-2.90), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(0.30) }, + { SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(-2.10), SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(-2.90) } }, + { { SIMDE_FLOAT16_VALUE(-5.70), SIMDE_FLOAT16_VALUE(-7.00), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(-3.20) }, + { SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(-0.40) }, + { SIMDE_FLOAT16_VALUE(-5.70), SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(-7.00), SIMDE_FLOAT16_VALUE(-5.60) } }, + { { SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(3.10) }, + { SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(7.40) }, + { SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(1.10) } }, + { { SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-9.10) }, + { SIMDE_FLOAT16_VALUE(-7.20), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(2.70) }, + { SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-7.20), SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(-2.60) } }, + { { SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(3.30) }, + { SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(-4.30) }, + { SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(1.20) } }, + { { SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(-8.10), SIMDE_FLOAT16_VALUE(-9.90) }, + { SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(-8.70) }, + { SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(8.40) } }, + { { SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(-6.20) }, + { SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(4.20) }, + { SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(9.30) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_float16x4_t r = simde_vzip1_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vzip1_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -309,6 +359,55 @@ test_simde_vzip1_u32 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vzip1q_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(9.50), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(-6.00), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(0.20) }, + { SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(5.70), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(-5.30) }, + { SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(9.50), SIMDE_FLOAT16_VALUE(5.70) } }, + { { SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(7.70), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(-7.70), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(-7.10) }, + { SIMDE_FLOAT16_VALUE(8.70), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-8.70) }, + { SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(8.70), SIMDE_FLOAT16_VALUE(7.70), SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(-4.20) } }, + { { SIMDE_FLOAT16_VALUE(-6.90), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(-7.00), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(-1.10), SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(-4.70) }, + { SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(9.50), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(9.80), SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(-7.70), SIMDE_FLOAT16_VALUE(7.40) }, + { SIMDE_FLOAT16_VALUE(-6.90), SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(9.50), SIMDE_FLOAT16_VALUE(-7.00), SIMDE_FLOAT16_VALUE(-3.20) } }, + { { SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(4.30), SIMDE_FLOAT16_VALUE(4.40), SIMDE_FLOAT16_VALUE(2.10), SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(-4.30) }, + { SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(-1.10), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(-8.60), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(-4.20) }, + { SIMDE_FLOAT16_VALUE(-1.50), SIMDE_FLOAT16_VALUE(7.00), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(-1.10), SIMDE_FLOAT16_VALUE(4.30), SIMDE_FLOAT16_VALUE(1.50) } }, + { { SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(-0.60), SIMDE_FLOAT16_VALUE(9.70) }, + { SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(4.40), SIMDE_FLOAT16_VALUE(-0.60), SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(-2.70) }, + { SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(0.20), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(4.40), SIMDE_FLOAT16_VALUE(8.00), SIMDE_FLOAT16_VALUE(-0.60) } }, + { { SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(-7.60) }, + { SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(0.30), SIMDE_FLOAT16_VALUE(0.00), SIMDE_FLOAT16_VALUE(7.40) }, + { SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(-3.70) } }, + { { SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(1.10) }, + { SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(-0.90), SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(2.70) }, + { SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(-0.90), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(-4.20), SIMDE_FLOAT16_VALUE(-2.70) } }, + { { SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(9.10) }, + { SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(3.50), SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(-6.80), SIMDE_FLOAT16_VALUE(-0.40), SIMDE_FLOAT16_VALUE(3.70) }, + { SIMDE_FLOAT16_VALUE(3.30), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(4.90), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(-8.30), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(0.40), SIMDE_FLOAT16_VALUE(3.50) } }, + { { SIMDE_FLOAT16_VALUE(-9.80), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(-10.00), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(9.80), SIMDE_FLOAT16_VALUE(-4.80), SIMDE_FLOAT16_VALUE(-3.50) }, + { SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(8.10), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(9.10), SIMDE_FLOAT16_VALUE(-7.70) }, + { SIMDE_FLOAT16_VALUE(-9.80), SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(-1.40), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(-10.00), SIMDE_FLOAT16_VALUE(-2.60) } }, + { { SIMDE_FLOAT16_VALUE(4.10), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-9.20), SIMDE_FLOAT16_VALUE(-0.40), SIMDE_FLOAT16_VALUE(6.10) }, + { SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(-8.80), SIMDE_FLOAT16_VALUE(7.70) }, + { SIMDE_FLOAT16_VALUE(4.10), SIMDE_FLOAT16_VALUE(9.30), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(-5.20) } } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_float16x8_t r = simde_vzip1q_f16(a, b); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vzip1q_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -749,6 +848,7 @@ test_simde_vzip1q_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vzip1_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vzip1_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vzip1_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vzip1_s16) @@ -757,6 +857,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vzip1_u8) SIMDE_TEST_FUNC_LIST_ENTRY(vzip1_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vzip1_u32) +SIMDE_TEST_FUNC_LIST_ENTRY(vzip1q_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vzip1q_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vzip1q_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vzip1q_s16) diff --git a/test/arm/neon/zip2.c b/test/arm/neon/zip2.c index 2ac73e208..125ea18da 100644 --- a/test/arm/neon/zip2.c +++ b/test/arm/neon/zip2.c @@ -3,6 +3,56 @@ #include #include +static int +test_simde_vzip2_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[4]; + simde_float16 b[4]; + simde_float16 r[4]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(-7.80), SIMDE_FLOAT16_VALUE(3.70), SIMDE_FLOAT16_VALUE(4.10), SIMDE_FLOAT16_VALUE(5.50) }, + { SIMDE_FLOAT16_VALUE(-6.10), SIMDE_FLOAT16_VALUE(1.40), SIMDE_FLOAT16_VALUE(5.30), SIMDE_FLOAT16_VALUE(4.90) }, + { SIMDE_FLOAT16_VALUE(4.10), SIMDE_FLOAT16_VALUE(5.30), SIMDE_FLOAT16_VALUE(5.50), SIMDE_FLOAT16_VALUE(4.90) } }, + { { SIMDE_FLOAT16_VALUE(3.90), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(3.60) }, + { SIMDE_FLOAT16_VALUE(6.30), SIMDE_FLOAT16_VALUE(-1.60), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(8.40) }, + { SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(8.40) } }, + { { SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(5.00), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(1.60) }, + { SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(-8.10), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(-6.60) }, + { SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-6.60) } }, + { { SIMDE_FLOAT16_VALUE(-6.90), SIMDE_FLOAT16_VALUE(-8.40), SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(9.60) }, + { SIMDE_FLOAT16_VALUE(-0.90), SIMDE_FLOAT16_VALUE(2.00), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(7.80) }, + { SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(-2.30), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(7.80) } }, + { { SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(8.80) }, + { SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(-3.40) }, + { SIMDE_FLOAT16_VALUE(-1.90), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-3.40) } }, + { { SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(6.40) }, + { SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(-8.80) }, + { SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(6.40), SIMDE_FLOAT16_VALUE(-8.80) } }, + { { SIMDE_FLOAT16_VALUE(3.00), SIMDE_FLOAT16_VALUE(6.20), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(6.00) }, + { SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(-5.10), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(-6.70) }, + { SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(6.00), SIMDE_FLOAT16_VALUE(-6.70) } }, + { { SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(-4.40), SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(9.80) }, + { SIMDE_FLOAT16_VALUE(-5.40), SIMDE_FLOAT16_VALUE(-6.20), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(-3.00) }, + { SIMDE_FLOAT16_VALUE(1.30), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(9.80), SIMDE_FLOAT16_VALUE(-3.00) } }, + { { SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(-1.10), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(2.20) }, + { SIMDE_FLOAT16_VALUE(2.40), SIMDE_FLOAT16_VALUE(-5.90), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(-7.20) }, + { SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(-7.20) } }, + { { SIMDE_FLOAT16_VALUE(-6.70), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-5.40) }, + { SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(-7.00), SIMDE_FLOAT16_VALUE(-6.10) }, + { SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(-7.00), SIMDE_FLOAT16_VALUE(-5.40), SIMDE_FLOAT16_VALUE(-6.10) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x4_t a = simde_vld1_f16(test_vec[i].a); + simde_float16x4_t b = simde_vld1_f16(test_vec[i].b); + simde_float16x4_t r = simde_vzip2_f16(a, b); + + simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vzip2_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -309,6 +359,55 @@ test_simde_vzip2_u32 (SIMDE_MUNIT_TEST_ARGS) { return 0; } +static int +test_simde_vzip2q_f16 (SIMDE_MUNIT_TEST_ARGS) { + struct { + simde_float16 a[8]; + simde_float16 b[8]; + simde_float16 r[8]; + } test_vec[] = { + { { SIMDE_FLOAT16_VALUE(9.60), SIMDE_FLOAT16_VALUE(6.90), SIMDE_FLOAT16_VALUE(7.80), SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(-8.70), SIMDE_FLOAT16_VALUE(8.20) }, + { SIMDE_FLOAT16_VALUE(1.80), SIMDE_FLOAT16_VALUE(4.00), SIMDE_FLOAT16_VALUE(-1.80), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(6.70), SIMDE_FLOAT16_VALUE(-0.60) }, + { SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(-8.70), SIMDE_FLOAT16_VALUE(6.70), SIMDE_FLOAT16_VALUE(8.20), SIMDE_FLOAT16_VALUE(-0.60) } }, + { { SIMDE_FLOAT16_VALUE(-7.70), SIMDE_FLOAT16_VALUE(1.10), SIMDE_FLOAT16_VALUE(0.70), SIMDE_FLOAT16_VALUE(1.50), SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(7.20) }, + { SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(-7.70), SIMDE_FLOAT16_VALUE(-6.50), SIMDE_FLOAT16_VALUE(-5.60), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(-1.80) }, + { SIMDE_FLOAT16_VALUE(6.60), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(3.60), SIMDE_FLOAT16_VALUE(7.20), SIMDE_FLOAT16_VALUE(-1.80) } }, + { { SIMDE_FLOAT16_VALUE(3.40), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(4.70), SIMDE_FLOAT16_VALUE(5.40), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(-10.00) }, + { SIMDE_FLOAT16_VALUE(2.70), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(7.10), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(6.00) }, + { SIMDE_FLOAT16_VALUE(5.40), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(9.90), SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(-9.70), SIMDE_FLOAT16_VALUE(-10.00), SIMDE_FLOAT16_VALUE(6.00) } }, + { { SIMDE_FLOAT16_VALUE(-3.60), SIMDE_FLOAT16_VALUE(-8.20), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-9.60) }, + { SIMDE_FLOAT16_VALUE(-4.10), SIMDE_FLOAT16_VALUE(-5.20), SIMDE_FLOAT16_VALUE(-5.80), SIMDE_FLOAT16_VALUE(4.80), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(-5.10), SIMDE_FLOAT16_VALUE(-4.20) }, + { SIMDE_FLOAT16_VALUE(-2.80), SIMDE_FLOAT16_VALUE(1.00), SIMDE_FLOAT16_VALUE(9.00), SIMDE_FLOAT16_VALUE(5.80), SIMDE_FLOAT16_VALUE(1.60), SIMDE_FLOAT16_VALUE(-5.10), SIMDE_FLOAT16_VALUE(-9.60), SIMDE_FLOAT16_VALUE(-4.20) } }, + { { SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(0.10), SIMDE_FLOAT16_VALUE(4.20), SIMDE_FLOAT16_VALUE(-0.40), SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(-5.50) }, + { SIMDE_FLOAT16_VALUE(2.60), SIMDE_FLOAT16_VALUE(-3.70), SIMDE_FLOAT16_VALUE(-0.10), SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(5.00) }, + { SIMDE_FLOAT16_VALUE(-3.90), SIMDE_FLOAT16_VALUE(-9.50), SIMDE_FLOAT16_VALUE(2.20), SIMDE_FLOAT16_VALUE(8.50), SIMDE_FLOAT16_VALUE(7.50), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-5.50), SIMDE_FLOAT16_VALUE(5.00) } }, + { { SIMDE_FLOAT16_VALUE(9.20), SIMDE_FLOAT16_VALUE(5.90), SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(-3.40) }, + { SIMDE_FLOAT16_VALUE(-6.80), SIMDE_FLOAT16_VALUE(-8.80), SIMDE_FLOAT16_VALUE(-6.60), SIMDE_FLOAT16_VALUE(-7.30), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(-6.90) }, + { SIMDE_FLOAT16_VALUE(-1.20), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(-3.20), SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(-3.40), SIMDE_FLOAT16_VALUE(-6.90) } }, + { { SIMDE_FLOAT16_VALUE(-8.80), SIMDE_FLOAT16_VALUE(-4.00), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(2.80) }, + { SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(2.90), SIMDE_FLOAT16_VALUE(-0.80), SIMDE_FLOAT16_VALUE(2.70), SIMDE_FLOAT16_VALUE(-0.60), SIMDE_FLOAT16_VALUE(-9.30), SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(-6.80) }, + { SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(-0.60), SIMDE_FLOAT16_VALUE(-3.00), SIMDE_FLOAT16_VALUE(-9.30), SIMDE_FLOAT16_VALUE(-0.70), SIMDE_FLOAT16_VALUE(-8.50), SIMDE_FLOAT16_VALUE(2.80), SIMDE_FLOAT16_VALUE(-6.80) } }, + { { SIMDE_FLOAT16_VALUE(6.70), SIMDE_FLOAT16_VALUE(3.80), SIMDE_FLOAT16_VALUE(8.80), SIMDE_FLOAT16_VALUE(-0.40), SIMDE_FLOAT16_VALUE(5.30), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(-2.00) }, + { SIMDE_FLOAT16_VALUE(-5.30), SIMDE_FLOAT16_VALUE(0.60), SIMDE_FLOAT16_VALUE(7.70), SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(2.20) }, + { SIMDE_FLOAT16_VALUE(5.30), SIMDE_FLOAT16_VALUE(7.90), SIMDE_FLOAT16_VALUE(-5.00), SIMDE_FLOAT16_VALUE(3.10), SIMDE_FLOAT16_VALUE(-3.80), SIMDE_FLOAT16_VALUE(-2.70), SIMDE_FLOAT16_VALUE(-2.00), SIMDE_FLOAT16_VALUE(2.20) } }, + { { SIMDE_FLOAT16_VALUE(-7.90), SIMDE_FLOAT16_VALUE(-3.30), SIMDE_FLOAT16_VALUE(3.20), SIMDE_FLOAT16_VALUE(4.60), SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(2.50) }, + { SIMDE_FLOAT16_VALUE(9.40), SIMDE_FLOAT16_VALUE(0.90), SIMDE_FLOAT16_VALUE(4.50), SIMDE_FLOAT16_VALUE(6.90), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(-3.40) }, + { SIMDE_FLOAT16_VALUE(-9.00), SIMDE_FLOAT16_VALUE(0.80), SIMDE_FLOAT16_VALUE(-0.30), SIMDE_FLOAT16_VALUE(-1.70), SIMDE_FLOAT16_VALUE(-3.10), SIMDE_FLOAT16_VALUE(-0.50), SIMDE_FLOAT16_VALUE(2.50), SIMDE_FLOAT16_VALUE(-3.40) } }, + { { SIMDE_FLOAT16_VALUE(6.10), SIMDE_FLOAT16_VALUE(-8.00), SIMDE_FLOAT16_VALUE(8.60), SIMDE_FLOAT16_VALUE(9.70), SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(8.70), SIMDE_FLOAT16_VALUE(-1.30) }, + { SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(-9.90), SIMDE_FLOAT16_VALUE(7.30), SIMDE_FLOAT16_VALUE(1.20), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(-8.60), SIMDE_FLOAT16_VALUE(5.90) }, + { SIMDE_FLOAT16_VALUE(8.40), SIMDE_FLOAT16_VALUE(1.70), SIMDE_FLOAT16_VALUE(-2.60), SIMDE_FLOAT16_VALUE(5.20), SIMDE_FLOAT16_VALUE(8.70), SIMDE_FLOAT16_VALUE(-8.60), SIMDE_FLOAT16_VALUE(-1.30), SIMDE_FLOAT16_VALUE(5.90) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a); + simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b); + simde_float16x8_t r = simde_vzip2q_f16(a, b); + simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1); + } + + return 0; +} + static int test_simde_vzip2q_f32 (SIMDE_MUNIT_TEST_ARGS) { struct { @@ -749,6 +848,7 @@ test_simde_vzip2q_u64 (SIMDE_MUNIT_TEST_ARGS) { } SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vzip2_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vzip2_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vzip2_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vzip2_s16) @@ -757,6 +857,7 @@ SIMDE_TEST_FUNC_LIST_ENTRY(vzip2_u8) SIMDE_TEST_FUNC_LIST_ENTRY(vzip2_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vzip2_u32) +SIMDE_TEST_FUNC_LIST_ENTRY(vzip2q_f16) SIMDE_TEST_FUNC_LIST_ENTRY(vzip2q_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vzip2q_s8) SIMDE_TEST_FUNC_LIST_ENTRY(vzip2q_s16)