2026-09-24 14:08:32 -06:00
# if !defined(SIMDE_TESTS_H)
# define SIMDE_TESTS_H
2026-09-24 14:30:19 -06:00
# include "../simde/hedley.h"
2026-09-24 14:08:32 -06:00
# include "../simde/simde-common.h"
# include "../simde/simde-f16.h"
2026-09-24 14:30:19 -06:00
# include "../simde/simde-bf16.h"
2026-09-24 14:08:32 -06:00
# include <time.h>
# include <stdlib.h>
# include <math.h>
# include <inttypes.h>
# include <stdarg.h>
typedef enum SimdeTestVecPos {
SIMDE_TEST_VEC_POS_SINGLE = 2 ,
SIMDE_TEST_VEC_POS_FIRST = 1 ,
SIMDE_TEST_VEC_POS_MIDDLE = 0 ,
SIMDE_TEST_VEC_POS_LAST = - 1
} SimdeTestVecPos ;
2026-09-24 14:30:19 -06:00
/* all tests benefit from these */
SIMDE_DIAGNOSTIC_DISABLE_PADDED_
SIMDE_DIAGNOSTIC_DISABLE_CPP98_COMPAT_PEDANTIC_
2026-09-24 14:08:32 -06:00
SIMDE_DIAGNOSTIC_DISABLE_VLA_
2026-09-24 14:30:19 -06:00
SIMDE_DIAGNOSTIC_DISABLE_DISABLED_MACRO_EXPANSION_
SIMDE_DIAGNOSTIC_DISABLE_BUGGY_CASTS_
SIMDE_DIAGNOSTIC_DISABLE_RESERVED_ID_
SIMDE_DIAGNOSTIC_DISABLE_C99_EXTENSIONS_
SIMDE_DIAGNOSTIC_DISABLE_USED_BUT_MARKED_UNUSED_
SIMDE_DIAGNOSTIC_DISABLE_NO_EMMS_INSTRUCTION_
# if defined(HEDLEY_MSVC_VERSION)
__pragma ( warning ( disable : 4730 ) ) // mixing _m64 and floating point expressions may result in incorrect code
# endif
# if defined(HEDLEY_GCC_VERSION) && !(HEDLEY_GCC_VERSION_CHECK(6,0,0))
HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION
# endif
HEDLEY_DIAGNOSTIC_PUSH
2026-09-24 14:08:32 -06:00
HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION
SIMDE_DIAGNOSTIC_DISABLE_ZERO_AS_NULL_POINTER_CONSTANT_
SIMDE_DIAGNOSTIC_DISABLE_CAST_FUNCTION_TYPE_
SIMDE_DIAGNOSTIC_DISABLE_NON_CONSTANT_AGGREGATE_INITIALIZER_
SIMDE_DIAGNOSTIC_DISABLE_C99_EXTENSIONS_
SIMDE_DIAGNOSTIC_DISABLE_DECLARATION_AFTER_STATEMENT_
SIMDE_DIAGNOSTIC_DISABLE_ANNEX_K_
# if \
HEDLEY_HAS_BUILTIN ( __builtin_abort ) | | \
HEDLEY_GCC_VERSION_CHECK ( 3 , 4 , 6 ) | | \
HEDLEY_ARM_VERSION_CHECK ( 4 , 1 , 0 )
# define simde_abort() __builtin_abort()
# elif defined(SIMDE_HAVE_STDLIB_H)
# define simde_abort() abort()
# endif
# define SIMDE_TEST_ASSERT_CONTINUE 0
# define SIMDE_TEST_ASSERT_TRAP 1
# define SIMDE_TEST_ASSERT_ABORT 2
# if !defined(SIMDE_TEST_ASSERT_FAILURE)
# if defined(SIMDE_TEST_BARE)
# define SIMDE_TEST_ASSERT_FAILURE SIMDE_TEST_ASSERT_CONTINUE
# else
# define SIMDE_TEST_ASSERT_FAILURE SIMDE_TEST_ASSERT_ABORT
# endif
# endif
# if !defined(SIMDE_TEST_ASSERT_ABORT) && !defined(SIMDE_TEST_ASSERT_CONTINUE) && !defined(SIMDE_TEST_ASSERT_TRAP)
# if defined(SIMDE_TEST_BARE)
# define SIMDE_TEST_ASSERT_CONTINUE
# else
# define SIMDE_TEST_ASSERT_ABORT
# endif
# endif
# if SIMDE_TEST_ASSERT_FAILURE == SIMDE_TEST_ASSERT_ABORT
# define SIMDE_TEST_ASSERT_RETURN(value) ((void) 0)
# else
# define SIMDE_TEST_ASSERT_RETURN(value) return value
# endif
# if defined(SIMDE_TEST_BARE)
# define SIMDE_CODEGEN_FP stderr
# else
# define SIMDE_CODEGEN_FP stdout
# endif
# if SIMDE_TEST_ASSERT_FAILURE == 2
HEDLEY_NO_RETURN
# endif
HEDLEY_PRINTF_FORMAT ( 1 , 2 )
static void
simde_test_debug_printf_ ( const char * format , . . . ) {
va_list ap ;
va_start ( ap , format ) ;
vfprintf ( stderr , format , ap ) ;
va_end ( ap ) ;
fflush ( stderr ) ;
/* Debug trap is great for local development where you can attach a
* debugger , but processes exiting with a SIGTRAP seem to be rather
* confusing for CI . */
# if SIMDE_TEST_ASSERT_FAILURE == 1
simde_trap ( ) ;
# elif SIMDE_TEST_ASSERT_FAILURE == 2
simde_abort ( ) ;
# endif
}
# if !defined(SIMDE_TEST_STRUCT_MODIFIERS)
# define SIMDE_TEST_STRUCT_MODIFIERS static const
# endif
HEDLEY_PRINTF_FORMAT ( 3 , 4 )
static void
simde_test_codegen_snprintf_ ( char * str , size_t size , const char * format , . . . ) {
va_list ap ;
int w ;
va_start ( ap , format ) ;
w = vsnprintf ( str , size , format , ap ) ;
va_end ( ap ) ;
if ( w > HEDLEY_STATIC_CAST ( int , size ) ) {
simde_test_debug_printf_ ( " Not enough space to write value (given %zu bytes, need %d bytes) \n " , size , w + 1 ) ;
}
}
static void
simde_test_codegen_f16 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , simde_float16 value ) {
simde_float32 valuef = simde_float16_to_float32 ( value ) ;
2026-09-24 14:30:19 -06:00
if ( simde_isnanhf ( value ) ) {
2026-09-24 14:08:32 -06:00
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_NANHF " ) ;
2026-09-24 14:30:19 -06:00
} else if ( simde_isinfhf ( value ) ) {
2026-09-24 14:08:32 -06:00
simde_test_codegen_snprintf_ ( buf , buf_len , " %5cSIMDE_INFINITYHF " , valuef < 0 ? ' - ' : ' ' ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_FLOAT16_VALUE(%9.2f) " , HEDLEY_STATIC_CAST ( double , valuef ) ) ;
}
}
static void
simde_test_codegen_f32 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , simde_float32 value ) {
if ( simde_math_isnan ( value ) ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_MATH_NANF " ) ;
} else if ( simde_math_isinf ( value ) ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %5cSIMDE_MATH_INFINITYF " , value < 0 ? ' - ' : ' ' ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_FLOAT32_C(%9.2f) " , HEDLEY_STATIC_CAST ( double , value ) ) ;
}
}
static void
simde_test_codegen_f64 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , simde_float64 value ) {
if ( simde_math_isnan ( value ) ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_MATH_NAN " ) ;
} else if ( simde_math_isinf ( value ) ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %7cSIMDE_MATH_INFINITY " , value < 0 ? ' - ' : ' ' ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_FLOAT64_C(%9.2f) " , HEDLEY_STATIC_CAST ( double , value ) ) ;
}
}
2026-09-24 14:30:19 -06:00
static void
simde_test_codegen_bf16 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , simde_bfloat16 value ) {
simde_float32 valuef = simde_bfloat16_to_float32 ( value ) ;
if ( simde_isnanbf ( value ) ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_NANBF " ) ;
} else if ( simde_isinfbf ( value ) ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %5cSIMDE_INFINITYBF " , valuef < 0 ? ' - ' : ' ' ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_BFLOAT16_VALUE(%9.2f) " , HEDLEY_STATIC_CAST ( double , valuef ) ) ;
}
}
2026-09-24 14:08:32 -06:00
static void
simde_test_codegen_i8 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , int8_t value ) {
if ( value = = INT8_MIN ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " INT8_MIN " ) ;
} else if ( value = = INT8_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " INT8_MAX " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " %cINT8_C(%4 " PRId8 " ) " , ( value < 0 ) ? ' - ' : ' ' , HEDLEY_STATIC_CAST ( int8_t , ( value < 0 ) ? - value : value ) ) ;
}
}
static void
simde_test_codegen_i16 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , int16_t value ) {
if ( value = = INT16_MIN ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %16s " , " INT16_MIN " ) ;
} else if ( value = = INT16_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %16s " , " INT16_MAX " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " %cINT16_C(%6 " PRId16 " ) " , ( value < 0 ) ? ' - ' : ' ' , HEDLEY_STATIC_CAST ( int16_t , ( value < 0 ) ? - value : value ) ) ;
}
}
static void
simde_test_codegen_i32 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , int32_t value ) {
if ( value = = INT32_MIN ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %22s " , " INT32_MIN " ) ;
} else if ( value = = INT32_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %22s " , " INT32_MAX " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " %cINT32_C(%12 " PRId32 " ) " , ( value < 0 ) ? ' - ' : ' ' , HEDLEY_STATIC_CAST ( int32_t , ( value < 0 ) ? - value : value ) ) ;
}
}
static void
simde_test_codegen_i64 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , int64_t value ) {
if ( value = = INT64_MIN ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %30s " , " INT64_MIN " ) ;
} else if ( value = = INT64_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %30s " , " INT64_MAX " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " %cINT64_C(%20 " PRId64 " ) " , ( value < 0 ) ? ' - ' : ' ' , HEDLEY_STATIC_CAST ( int64_t , ( value < 0 ) ? - value : value ) ) ;
}
}
static void
simde_test_codegen_u8 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , uint8_t value ) {
if ( value = = UINT8_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " UINT8_MAX " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " UINT8_C(%3 " PRIu8 " ) " , value ) ;
}
}
static void
simde_test_codegen_u16 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , uint16_t value ) {
if ( value = = UINT16_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %15s " , " UINT16_MAX " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " UINT16_C(%5 " PRIu16 " ) " , value ) ;
}
}
static void
simde_test_codegen_u32 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , uint32_t value ) {
if ( value = = UINT32_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %20s " , " UINT32_MAX " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " UINT32_C(%10 " PRIu32 " ) " , value ) ;
}
}
static void
simde_test_codegen_u64 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , uint64_t value ) {
if ( value = = UINT64_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %30s " , " UINT64_MAX " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " UINT64_C(%20 " PRIu64 " ) " , value ) ;
}
}
2026-09-24 14:30:19 -06:00
static void
simde_test_codegen_p8 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , simde_poly8 value ) {
uint8_t value_ = HEDLEY_STATIC_CAST ( uint8_t , value ) ;
if ( value_ = = UINT8_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_POLY8_C(UINT8_MAX) " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_POLY8_C(%3 " PRIu8 " ) " , value_ ) ;
}
}
static void
simde_test_codegen_p16 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , simde_poly16 value ) {
uint16_t value_ = HEDLEY_STATIC_CAST ( uint16_t , value ) ;
if ( value_ = = UINT16_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %15s " , " SIMDE_POLY16_C(UINT16_MAX) " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_POLY16_C(%5 " PRIu16 " ) " , value_ ) ;
}
}
static void
simde_test_codegen_p64 ( size_t buf_len , char buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] , simde_poly64 value ) {
uint64_t value_ = HEDLEY_STATIC_CAST ( uint64_t , value ) ;
if ( value_ = = UINT64_MAX ) {
simde_test_codegen_snprintf_ ( buf , buf_len , " %30s " , " SIMDE_POLY64_C(UINT64_MAX) " ) ;
} else {
simde_test_codegen_snprintf_ ( buf , buf_len , " SIMDE_POLY64_C(%20 " PRIu64 " ) " , value_ ) ;
}
}
2026-09-24 14:08:32 -06:00
static void
simde_test_codegen_write_indent ( int indent ) {
for ( int i = 0 ; i < indent ; i + + ) {
fputs ( " " , SIMDE_CODEGEN_FP ) ;
}
}
static int simde_test_codegen_rand ( void ) {
/* Single-threaded programs are so nice */
static int is_init = 0 ;
if ( HEDLEY_UNLIKELY ( ! is_init ) ) {
# if !defined(HEDLEY_EMSCRIPTEN_VERSION)
FILE * fp = fopen ( " /dev/urandom " , " r " ) ;
if ( fp = = NULL )
fp = fopen ( " /dev/random " , " r " ) ;
if ( fp ! = NULL ) {
unsigned int seed ;
size_t nread = fread ( & seed , sizeof ( seed ) , 1 , fp ) ;
fclose ( fp ) ;
if ( nread = = 1 ) {
srand ( seed ) ;
is_init = 1 ;
}
}
# endif
if ( ! is_init ) {
srand ( HEDLEY_STATIC_CAST ( unsigned int , time ( NULL ) ) ) ;
is_init = 1 ;
}
}
return rand ( ) ;
}
static void
simde_test_codegen_random_memory ( size_t buf_len , uint8_t buf [ HEDLEY_ARRAY_PARAM ( buf_len ) ] ) {
for ( size_t i = 0 ; i < buf_len ; i + + ) {
buf [ i ] = HEDLEY_STATIC_CAST ( uint8_t , simde_test_codegen_rand ( ) & 0xff ) ;
}
}
static simde_float32
simde_test_codegen_random_f32 ( simde_float32 min , simde_float32 max ) {
simde_float32 v = ( HEDLEY_STATIC_CAST ( simde_float32 , simde_test_codegen_rand ( ) ) / ( HEDLEY_STATIC_CAST ( simde_float32 , RAND_MAX ) / ( max - min ) ) ) + min ;
return simde_math_roundf ( v * SIMDE_FLOAT32_C ( 100.0 ) ) / SIMDE_FLOAT32_C ( 100.0 ) ;
}
static simde_float16
simde_test_codegen_random_f16 ( simde_float16 min , simde_float16 max ) {
return
simde_float16_from_float32 (
simde_test_codegen_random_f32 (
simde_float16_to_float32 ( min ) ,
simde_float16_to_float32 ( max )
)
) ;
}
static simde_float64
simde_test_codegen_random_f64 ( simde_float64 min , simde_float64 max ) {
simde_float64 v = ( HEDLEY_STATIC_CAST ( simde_float64 , simde_test_codegen_rand ( ) ) / ( HEDLEY_STATIC_CAST ( simde_float64 , RAND_MAX ) / ( max - min ) ) ) + min ;
return simde_math_round ( v * SIMDE_FLOAT64_C ( 100.0 ) ) / SIMDE_FLOAT64_C ( 100.0 ) ;
}
2026-09-24 14:30:19 -06:00
static simde_bfloat16
simde_test_codegen_random_bf16 ( simde_bfloat16 min , simde_bfloat16 max ) {
return
simde_bfloat16_from_float32 (
simde_test_codegen_random_f32 (
simde_bfloat16_to_float32 ( min ) ,
simde_bfloat16_to_float32 ( max )
)
) ;
}
2026-09-24 14:08:32 -06:00
typedef enum SimdeTestVecFloatMask {
SIMDE_TEST_VEC_FLOAT_DEFAULT = 0 ,
SIMDE_TEST_VEC_FLOAT_PAIR = 1 ,
SIMDE_TEST_VEC_FLOAT_NAN = 2 ,
SIMDE_TEST_VEC_FLOAT_EQUAL = 4 ,
SIMDE_TEST_VEC_FLOAT_ROUND = 8
}
# if \
( HEDLEY_HAS_ATTRIBUTE ( flag_enum ) & & ! defined ( HEDLEY_IBM_VERSION ) ) & & \
( ! defined ( __cplusplus ) | | SIMDE_DETECT_CLANG_VERSION_CHECK ( 5 , 0 , 0 ) )
__attribute__ ( ( __flag_enum__ ) )
# endif
SimdeTestVecFloatType ;
/* This is a bit messy, sorry. And I haven't really tested with
* anything greater than 4 - element vectors , there is no input
* validation , etc . I ' m not going to lose any sleep since it ' s
* just a test harness , but you probably shouldn ' t use this API
* directly since there is a good chance it will change . */
static void
simde_test_codegen_calc_pair ( int pairwise , size_t test_sets , size_t vectors_per_set , size_t elements_per_vector , size_t pos , size_t * a , size_t * b ) {
( void ) test_sets ; // <- for validating ranges
if ( pairwise ) {
* a = ( ( ( pos * 2 ) + 0 ) % elements_per_vector ) + ( ( ( ( pos * 2 ) + 0 ) / elements_per_vector ) * elements_per_vector ) ;
* b = ( ( ( pos * 2 ) + 1 ) % elements_per_vector ) + ( ( ( ( pos * 2 ) + 1 ) / elements_per_vector ) * elements_per_vector ) ;
} else {
size_t elements_per_set = elements_per_vector * vectors_per_set ;
size_t set_num = pos / elements_per_vector ;
size_t pos_in_set = pos % elements_per_vector ;
* a = ( elements_per_set * set_num ) + pos_in_set ;
* b = * a + elements_per_vector ;
}
}
static void
simde_test_codegen_float_set_value_ ( size_t element_size , size_t pos , void * values , simde_float32 f32_val , simde_float64 f64_val ) {
switch ( element_size ) {
case sizeof ( simde_float16 ) :
HEDLEY_REINTERPRET_CAST ( simde_float16 * , values ) [ pos ] = simde_float16_from_float32 ( f32_val ) ;
break ;
case sizeof ( simde_float32 ) :
HEDLEY_REINTERPRET_CAST ( simde_float32 * , values ) [ pos ] = f32_val ;
break ;
case sizeof ( simde_float64 ) :
HEDLEY_REINTERPRET_CAST ( simde_float64 * , values ) [ pos ] = f64_val ;
break ;
}
}
static void
simde_test_codegen_random_vfX_full_ (
size_t test_sets , size_t vectors_per_set , size_t elements_per_vector ,
size_t elem_size , void * values ,
simde_float64 min , simde_float64 max ,
SimdeTestVecFloatType vec_type ) {
for ( size_t i = 0 ; i < ( test_sets * vectors_per_set * elements_per_vector ) ; i + + ) {
simde_float64 v = simde_test_codegen_random_f64 ( min , max ) ;
if ( vec_type & SIMDE_TEST_VEC_FLOAT_ROUND ) {
if ( simde_test_codegen_rand ( ) & 7 ) {
do {
v = HEDLEY_STATIC_CAST ( simde_float64 , HEDLEY_STATIC_CAST ( int64_t , v ) ) ;
if ( simde_test_codegen_rand ( ) & 7 )
v + = 0.5 ;
} while ( v > max | | v < min ) ;
}
}
simde_test_codegen_float_set_value_ ( elem_size , i , values , HEDLEY_STATIC_CAST ( simde_float32 , v ) , v ) ;
}
int pairwise = ! ! ( vec_type & SIMDE_TEST_VEC_FLOAT_PAIR ) ;
size_t pos = 0 ;
size_t a , b ;
if ( vec_type & SIMDE_TEST_VEC_FLOAT_NAN ) {
simde_test_codegen_calc_pair ( pairwise , test_sets , vectors_per_set , elements_per_vector , pos + + , & a , & b ) ;
simde_test_codegen_float_set_value_ ( elem_size , a , values , SIMDE_MATH_NANF , SIMDE_MATH_NAN ) ;
simde_test_codegen_calc_pair ( pairwise , test_sets , vectors_per_set , elements_per_vector , pos + + , & a , & b ) ;
simde_test_codegen_float_set_value_ ( elem_size , b , values , SIMDE_MATH_NANF , SIMDE_MATH_NAN ) ;
simde_test_codegen_calc_pair ( pairwise , test_sets , vectors_per_set , elements_per_vector , pos + + , & a , & b ) ;
simde_test_codegen_float_set_value_ ( elem_size , a , values , SIMDE_MATH_NANF , SIMDE_MATH_NAN ) ;
simde_test_codegen_float_set_value_ ( elem_size , b , values , SIMDE_MATH_NANF , SIMDE_MATH_NAN ) ;
}
if ( vec_type & SIMDE_TEST_VEC_FLOAT_EQUAL ) {
simde_test_codegen_calc_pair ( pairwise , test_sets , vectors_per_set , elements_per_vector , pos + + , & a , & b ) ;
simde_float64 v = simde_test_codegen_random_f64 ( min , max ) ;
simde_test_codegen_float_set_value_ ( elem_size , a , values , HEDLEY_STATIC_CAST ( simde_float32 , v ) , v ) ;
simde_test_codegen_float_set_value_ ( elem_size , b , values , HEDLEY_STATIC_CAST ( simde_float32 , v ) , v ) ;
}
}
static void
simde_test_codegen_random_vf16_full (
size_t test_sets , size_t vectors_per_set , size_t elements_per_vector ,
simde_float16 values [ HEDLEY_ARRAY_PARAM ( test_sets * vectors_per_set * elements_per_vector ) ] ,
simde_float16 min , simde_float16 max ,
SimdeTestVecFloatType vec_type ) {
simde_test_codegen_random_vfX_full_ ( test_sets , vectors_per_set , elements_per_vector ,
sizeof ( simde_float16 ) , values ,
HEDLEY_STATIC_CAST ( simde_float64 , simde_float16_to_float32 ( min ) ) ,
HEDLEY_STATIC_CAST ( simde_float64 , simde_float16_to_float32 ( max ) ) ,
vec_type ) ;
}
static void
simde_test_codegen_random_vf32_full (
size_t test_sets , size_t vectors_per_set , size_t elements_per_vector ,
simde_float32 values [ HEDLEY_ARRAY_PARAM ( test_sets * vectors_per_set * elements_per_vector ) ] ,
simde_float32 min , simde_float32 max ,
SimdeTestVecFloatType vec_type ) {
simde_test_codegen_random_vfX_full_ ( test_sets , vectors_per_set , elements_per_vector ,
sizeof ( simde_float32 ) , values ,
HEDLEY_STATIC_CAST ( simde_float64 , min ) , HEDLEY_STATIC_CAST ( simde_float64 , max ) ,
vec_type ) ;
}
static void
simde_test_codegen_random_vf64_full (
size_t test_sets , size_t vectors_per_set , size_t elements_per_vector ,
simde_float64 values [ HEDLEY_ARRAY_PARAM ( test_sets * vectors_per_set * elements_per_vector ) ] ,
simde_float64 min , simde_float64 max ,
SimdeTestVecFloatType vec_type ) {
simde_test_codegen_random_vfX_full_ ( test_sets , vectors_per_set , elements_per_vector ,
sizeof ( simde_float64 ) , values ,
min , max ,
vec_type ) ;
}
2026-09-24 14:30:19 -06:00
static void
simde_test_codegen_random_vbf16_full (
size_t test_sets , size_t vectors_per_set , size_t elements_per_vector ,
simde_bfloat16 values [ HEDLEY_ARRAY_PARAM ( test_sets * vectors_per_set * elements_per_vector ) ] ,
simde_bfloat16 min , simde_bfloat16 max ,
SimdeTestVecFloatType vec_type ) {
simde_test_codegen_random_vfX_full_ ( test_sets , vectors_per_set , elements_per_vector ,
sizeof ( simde_bfloat16 ) , values ,
HEDLEY_STATIC_CAST ( simde_float64 , simde_bfloat16_to_float32 ( min ) ) ,
HEDLEY_STATIC_CAST ( simde_float64 , simde_bfloat16_to_float32 ( max ) ) ,
vec_type ) ;
}
2026-09-24 14:08:32 -06:00
static void
simde_test_codegen_random_vf16 ( size_t elem_count , simde_float16 values [ HEDLEY_ARRAY_PARAM ( elem_count ) ] , simde_float16 min , simde_float16 max ) {
for ( size_t i = 0 ; i < elem_count ; i + + ) {
values [ i ] = simde_test_codegen_random_f16 ( min , max ) ;
}
}
static void
simde_test_codegen_random_vf32 ( size_t elem_count , simde_float32 values [ HEDLEY_ARRAY_PARAM ( elem_count ) ] , simde_float32 min , simde_float32 max ) {
for ( size_t i = 0 ; i < elem_count ; i + + ) {
values [ i ] = simde_test_codegen_random_f32 ( min , max ) ;
}
}
static void
simde_test_codegen_random_vf64 ( size_t elem_count , simde_float64 values [ HEDLEY_ARRAY_PARAM ( elem_count ) ] , simde_float64 min , simde_float64 max ) {
for ( size_t i = 0 ; i < elem_count ; i + + ) {
values [ i ] = simde_test_codegen_random_f64 ( min , max ) ;
}
}
2026-09-24 14:30:19 -06:00
static void
simde_test_codegen_random_vbf16 ( size_t elem_count , simde_bfloat16 values [ HEDLEY_ARRAY_PARAM ( elem_count ) ] , simde_bfloat16 min , simde_bfloat16 max ) {
for ( size_t i = 0 ; i < elem_count ; i + + ) {
values [ i ] = simde_test_codegen_random_bf16 ( min , max ) ;
}
}
2026-09-24 14:08:32 -06:00
# define SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_(T, symbol_identifier) \
static T simde_test_codegen_random_ # # symbol_identifier ( void ) { \
T r ; \
simde_test_codegen_random_memory ( sizeof ( r ) , HEDLEY_REINTERPRET_CAST ( uint8_t * , & r ) ) ; \
return r ; \
}
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( int8_t , i8 )
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( int16_t , i16 )
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( int32_t , i32 )
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( int64_t , i64 )
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( uint8_t , u8 )
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( uint16_t , u16 )
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( uint32_t , u32 )
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( uint64_t , u64 )
2026-09-24 14:30:19 -06:00
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( simde_poly8 , p8 )
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( simde_poly16 , p16 )
SIMDE_TEST_CODEGEN_GENERATE_RANDOM_INT_FUNC_ ( simde_poly64 , p64 )
2026-09-24 14:08:32 -06:00
# define SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_(T, symbol_identifier, elements_per_line) \
static void \
simde_test_codegen_write_v # # symbol_identifier # # _full ( int indent , size_t elem_count , const char * name , T values [ HEDLEY_ARRAY_PARAM ( elem_count ) ] , SimdeTestVecPos pos ) { \
switch ( pos ) { \
case SIMDE_TEST_VEC_POS_FIRST : \
simde_test_codegen_write_indent ( indent ) ; \
indent + + ; \
fputs ( " { " , SIMDE_CODEGEN_FP ) ; \
break ; \
case SIMDE_TEST_VEC_POS_MIDDLE : \
case SIMDE_TEST_VEC_POS_LAST : \
indent + + ; \
simde_test_codegen_write_indent ( indent ) ; \
break ; \
case SIMDE_TEST_VEC_POS_SINGLE : \
simde_test_codegen_write_indent ( indent + + ) ; \
fprintf ( SIMDE_CODEGEN_FP , " static const " # T " %s[] = \n " , name ) ; \
simde_test_codegen_write_indent ( indent ) ; \
break ; \
} \
\
fputs ( " { " , SIMDE_CODEGEN_FP ) ; \
for ( size_t i = 0 ; i < elem_count ; i + + ) { \
if ( i ! = 0 ) { \
fputc ( ' , ' , SIMDE_CODEGEN_FP ) ; \
if ( ( i % elements_per_line ) = = 0 ) { \
fputc ( ' \n ' , SIMDE_CODEGEN_FP ) ; \
simde_test_codegen_write_indent ( indent + 1 ) ; \
} else { \
fputc ( ' ' , SIMDE_CODEGEN_FP ) ; \
} \
} \
\
char buf [ 53 ] ; \
simde_test_codegen_ # # symbol_identifier ( sizeof ( buf ) , buf , values [ i ] ) ; \
fputs ( buf , SIMDE_CODEGEN_FP ) ; \
} \
fputs ( " } " , SIMDE_CODEGEN_FP ) ; \
\
switch ( pos ) { \
case SIMDE_TEST_VEC_POS_FIRST : \
case SIMDE_TEST_VEC_POS_MIDDLE : \
fputc ( ' , ' , SIMDE_CODEGEN_FP ) ; \
break ; \
case SIMDE_TEST_VEC_POS_LAST : \
fputs ( " }, " , SIMDE_CODEGEN_FP ) ; \
break ; \
case SIMDE_TEST_VEC_POS_SINGLE : \
fputs ( " ; " , SIMDE_CODEGEN_FP ) ; \
break ; \
} \
\
fputc ( ' \n ' , SIMDE_CODEGEN_FP ) ; \
} \
\
static void \
simde_test_codegen_write_v # # symbol_identifier ( int indent , size_t elem_count , T values [ HEDLEY_ARRAY_PARAM ( elem_count ) ] , SimdeTestVecPos pos ) { \
simde_test_codegen_write_v # # symbol_identifier # # _full ( indent , elem_count , " ??? " , values , pos ) ; \
}
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( simde_float16 , f16 , 4 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( simde_float32 , f32 , 4 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( simde_float64 , f64 , 4 )
2026-09-24 14:30:19 -06:00
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( simde_bfloat16 , bf16 , 4 )
2026-09-24 14:08:32 -06:00
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( int8_t , i8 , 8 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( int16_t , i16 , 8 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( int32_t , i32 , 8 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( int64_t , i64 , 4 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( uint8_t , u8 , 8 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( uint16_t , u16 , 8 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( uint32_t , u32 , 8 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( uint64_t , u64 , 4 )
2026-09-24 14:30:19 -06:00
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( simde_poly8 , p8 , 8 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( simde_poly16 , p16 , 8 )
SIMDE_TEST_CODEGEN_GENERATE_WRITE_VECTOR_FUNC_ ( simde_poly64 , p64 , 4 )
2026-09-24 14:08:32 -06:00
# define simde_test_codegen_write_1vi8(indent, elem_count, values) simde_test_codegen_write_vi8_full( (indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vi16(indent, elem_count, values) simde_test_codegen_write_vi16_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vi32(indent, elem_count, values) simde_test_codegen_write_vi32_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vi64(indent, elem_count, values) simde_test_codegen_write_vi64_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vu8(indent, elem_count, values) simde_test_codegen_write_vu8_full( (indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vu16(indent, elem_count, values) simde_test_codegen_write_vu16_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vu32(indent, elem_count, values) simde_test_codegen_write_vu32_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vu64(indent, elem_count, values) simde_test_codegen_write_vu64_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vf16(indent, elem_count, values) simde_test_codegen_write_vf16_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vf32(indent, elem_count, values) simde_test_codegen_write_vf32_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vf64(indent, elem_count, values) simde_test_codegen_write_vf64_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
2026-09-24 14:30:19 -06:00
# define simde_test_codegen_write_1vp8(indent, elem_count, values) simde_test_codegen_write_vp8_full( (indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vp16(indent, elem_count, values) simde_test_codegen_write_vp16_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vp64(indent, elem_count, values) simde_test_codegen_write_vp64_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1vbf16(indent, elem_count, values) simde_test_codegen_write_vbf16_full((indent), (elem_count), #values, (values), SIMDE_TEST_VEC_POS_SINGLE)
2026-09-24 14:08:32 -06:00
# define SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_(T, symbol_identifier) \
static void \
simde_test_codegen_write_ # # symbol_identifier # # _full ( int indent , const char * name , T value , SimdeTestVecPos pos ) { \
switch ( pos ) { \
case SIMDE_TEST_VEC_POS_FIRST : \
simde_test_codegen_write_indent ( indent ) ; \
indent + + ; \
fputs ( " { " , SIMDE_CODEGEN_FP ) ; \
break ; \
case SIMDE_TEST_VEC_POS_MIDDLE : \
case SIMDE_TEST_VEC_POS_LAST : \
indent + + ; \
simde_test_codegen_write_indent ( indent ) ; \
break ; \
case SIMDE_TEST_VEC_POS_SINGLE : \
simde_test_codegen_write_indent ( indent + + ) ; \
fprintf ( SIMDE_CODEGEN_FP , " static const " # T " %s = " , name ) ; \
break ; \
} \
\
{ \
char buf [ 53 ] ; \
simde_test_codegen_ # # symbol_identifier ( sizeof ( buf ) , buf , value ) ; \
fputs ( buf , SIMDE_CODEGEN_FP ) ; \
} \
\
switch ( pos ) { \
case SIMDE_TEST_VEC_POS_FIRST : \
case SIMDE_TEST_VEC_POS_MIDDLE : \
fputc ( ' , ' , SIMDE_CODEGEN_FP ) ; \
break ; \
case SIMDE_TEST_VEC_POS_LAST : \
fputs ( " }, " , SIMDE_CODEGEN_FP ) ; \
break ; \
case SIMDE_TEST_VEC_POS_SINGLE : \
fputs ( " ; " , SIMDE_CODEGEN_FP ) ; \
break ; \
} \
\
fputc ( ' \n ' , SIMDE_CODEGEN_FP ) ; \
} \
\
static void \
simde_test_codegen_write_ # # symbol_identifier ( int indent , T value , SimdeTestVecPos pos ) { \
simde_test_codegen_write_ # # symbol_identifier # # _full ( indent , " ??? " , value , pos ) ; \
}
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( int8_t , i8 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( int16_t , i16 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( int32_t , i32 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( int64_t , i64 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( uint8_t , u8 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( uint16_t , u16 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( uint32_t , u32 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( uint64_t , u64 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( simde_float16 , f16 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( simde_float32 , f32 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( simde_float64 , f64 )
2026-09-24 14:30:19 -06:00
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( simde_poly8 , p8 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( simde_poly16 , p16 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( simde_poly64 , p64 )
SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_ ( simde_bfloat16 , bf16 )
2026-09-24 14:08:32 -06:00
# define simde_test_codegen_write_1i8(indent, value) simde_test_codegen_write_i8_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1i16(indent, value) simde_test_codegen_write_i16_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1i32(indent, value) simde_test_codegen_write_i32_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1i64(indent, value) simde_test_codegen_write_i64_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1u8(indent, value) simde_test_codegen_write_u8_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1u16(indent, value) simde_test_codegen_write_u16_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1u32(indent, value) simde_test_codegen_write_u32_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1u64(indent, value) simde_test_codegen_write_u64_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1f16(indent, value) simde_test_codegen_write_f16_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1f32(indent, value) simde_test_codegen_write_f32_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1f64(indent, value) simde_test_codegen_write_f64_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
2026-09-24 14:30:19 -06:00
# define simde_test_codegen_write_1p8(indent, value) simde_test_codegen_write_p8_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1p16(indent, value) simde_test_codegen_write_p16_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1p64(indent, value) simde_test_codegen_write_p64_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
# define simde_test_codegen_write_1bf16(indent, value) simde_test_codegen_write_bf16_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
2026-09-24 14:08:32 -06:00
HEDLEY_DIAGNOSTIC_PUSH
SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL_
static int
simde_test_equal_f32 ( simde_float32 a , simde_float32 b , simde_float32 slop ) {
if ( simde_math_isnan ( a ) ) {
return simde_math_isnan ( b ) ;
} else if ( simde_math_isinf ( a ) ) {
return ! ( ( a < b ) | | ( a > b ) ) ;
} else if ( slop = = SIMDE_FLOAT32_C ( 0.0 ) ) {
2026-09-24 14:30:19 -06:00
return ! simde_memcmp ( & a , & b , sizeof ( simde_float32 ) ) ;
2026-09-24 14:08:32 -06:00
} else {
simde_float32 lo = a - slop ;
if ( HEDLEY_UNLIKELY ( lo = = a ) )
lo = simde_math_nextafterf ( a , - SIMDE_MATH_INFINITYF ) ;
simde_float32 hi = a + slop ;
if ( HEDLEY_UNLIKELY ( hi = = a ) )
hi = simde_math_nextafterf ( a , SIMDE_MATH_INFINITYF ) ;
return ( ( b > = lo ) & & ( b < = hi ) ) ;
}
}
static int
simde_test_equal_f16 ( simde_float16 a , simde_float16 b , simde_float16 slop ) {
simde_float32
af = simde_float16_to_float32 ( a ) ,
bf = simde_float16_to_float32 ( b ) ,
slopf = simde_float16_to_float32 ( slop ) ;
return simde_test_equal_f32 ( af , bf , slopf ) ;
}
static int
simde_test_equal_f64 ( simde_float64 a , simde_float64 b , simde_float64 slop ) {
if ( simde_math_isnan ( a ) ) {
return simde_math_isnan ( b ) ;
} else if ( simde_math_isinf ( a ) ) {
return ! ( ( a < b ) | | ( a > b ) ) ;
} else if ( slop = = SIMDE_FLOAT64_C ( 0.0 ) ) {
2026-09-24 14:30:19 -06:00
return ! simde_memcmp ( & a , & b , sizeof ( simde_float64 ) ) ;
2026-09-24 14:08:32 -06:00
} else {
simde_float64 lo = a - slop ;
if ( HEDLEY_UNLIKELY ( lo = = a ) )
lo = simde_math_nextafter ( a , - SIMDE_MATH_INFINITY ) ;
simde_float64 hi = a + slop ;
if ( HEDLEY_UNLIKELY ( hi = = a ) )
hi = simde_math_nextafter ( a , SIMDE_MATH_INFINITY ) ;
return ( ( b > = lo ) & & ( b < = hi ) ) ;
}
}
2026-09-24 14:30:19 -06:00
static int
simde_test_equal_bf16 ( simde_bfloat16 a , simde_bfloat16 b , simde_bfloat16 slop ) {
simde_float32
af = simde_bfloat16_to_float32 ( a ) ,
bf = simde_bfloat16_to_float32 ( b ) ,
slopf = simde_bfloat16_to_float32 ( slop ) ;
return simde_test_equal_f32 ( af , bf , slopf ) ;
}
2026-09-24 14:08:32 -06:00
HEDLEY_DIAGNOSTIC_POP
static simde_float16
simde_test_f16_precision_to_slop ( int precision ) {
return HEDLEY_UNLIKELY ( precision = = INT_MAX ) ? SIMDE_FLOAT16_VALUE ( 0.0 ) : simde_float16_from_float32 ( simde_math_powf ( SIMDE_FLOAT32_C ( 10.0 ) , - HEDLEY_STATIC_CAST ( float , precision ) ) ) ;
}
static float
simde_test_f32_precision_to_slop ( int precision ) {
return HEDLEY_UNLIKELY ( precision = = INT_MAX ) ? SIMDE_FLOAT32_C ( 0.0 ) : simde_math_powf ( SIMDE_FLOAT32_C ( 10.0 ) , - HEDLEY_STATIC_CAST ( float , precision ) ) ;
}
static double
simde_test_f64_precision_to_slop ( int precision ) {
return HEDLEY_UNLIKELY ( precision = = INT_MAX ) ? SIMDE_FLOAT64_C ( 0.0 ) : simde_math_pow ( SIMDE_FLOAT64_C ( 10.0 ) , - HEDLEY_STATIC_CAST ( double , precision ) ) ;
}
2026-09-24 14:30:19 -06:00
static simde_bfloat16
simde_test_bf16_precision_to_slop ( int precision ) {
return HEDLEY_UNLIKELY ( precision = = INT_MAX ) ? SIMDE_BFLOAT16_VALUE ( 0.0 ) : simde_bfloat16_from_float32 ( simde_math_powf ( SIMDE_FLOAT32_C ( 10.0 ) , - HEDLEY_STATIC_CAST ( float , precision ) ) ) ;
}
2026-09-24 14:08:32 -06:00
static int
simde_assert_equal_vf16_ (
size_t vec_len , simde_float16 const a [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_float16 const b [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_float16 slop ,
const char * filename , int line , const char * astr , const char * bstr ) {
simde_float32 slop_ = simde_float16_to_float32 ( slop ) ;
for ( size_t i = 0 ; i < vec_len ; i + + ) {
simde_float32 a_ = simde_float16_to_float32 ( a [ i ] ) ;
simde_float32 b_ = simde_float16_to_float32 ( b [ i ] ) ;
2026-09-24 14:30:19 -06:00
2026-09-24 14:08:32 -06:00
if ( HEDLEY_UNLIKELY ( ! simde_test_equal_f32 ( a_ , b_ , slop_ ) ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s[%zu] ~= %s[%zu] (%f ~= %f) \n " ,
2026-09-24 14:30:19 -06:00
filename , line , astr , i , bstr , i , HEDLEY_STATIC_CAST ( double , a_ ) ,
2026-09-24 14:08:32 -06:00
HEDLEY_STATIC_CAST ( double , b_ ) ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
}
return 0 ;
}
2026-09-24 14:30:19 -06:00
# define simde_assert_equal_vf16(vec_len, a, b, precision) do { if (simde_assert_equal_vf16_(vec_len, a, b, simde_test_f16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:08:32 -06:00
static int
simde_assert_equal_f16_ ( simde_float16 a , simde_float16 b , simde_float16 slop ,
const char * filename , int line , const char * astr , const char * bstr ) {
simde_float32 a_ = simde_float16_to_float32 ( a ) ;
simde_float32 b_ = simde_float16_to_float32 ( b ) ;
simde_float32 slop_ = simde_float16_to_float32 ( slop ) ;
if ( HEDLEY_UNLIKELY ( ! simde_test_equal_f32 ( a_ , b_ , slop_ ) ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s ~= %s (%f ~= %f) \n " ,
filename , line , astr , bstr , HEDLEY_STATIC_CAST ( double , a_ ) ,
HEDLEY_STATIC_CAST ( double , b_ ) ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
return 0 ;
}
2026-09-24 14:30:19 -06:00
# define simde_assert_equal_f16(a, b, precision) do { if (simde_assert_equal_f16_(a, b, simde_test_f16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:08:32 -06:00
static int
simde_assert_equal_vf32_ (
size_t vec_len , simde_float32 const a [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_float32 const b [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_float32 slop ,
const char * filename , int line , const char * astr , const char * bstr ) {
for ( size_t i = 0 ; i < vec_len ; i + + ) {
if ( HEDLEY_UNLIKELY ( ! simde_test_equal_f32 ( a [ i ] , b [ i ] , slop ) ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s[%zu] ~= %s[%zu] (%f ~= %f) \n " ,
filename , line , astr , i , bstr , i , HEDLEY_STATIC_CAST ( double , a [ i ] ) , HEDLEY_STATIC_CAST ( double , b [ i ] ) ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
}
return 0 ;
}
2026-09-24 14:30:19 -06:00
# define simde_assert_equal_vf32(vec_len, a, b, precision) do { if (simde_assert_equal_vf32_(vec_len, a, b, simde_test_f32_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:08:32 -06:00
static int
simde_assert_equal_f32_ ( simde_float32 a , simde_float32 b , simde_float32 slop ,
const char * filename , int line , const char * astr , const char * bstr ) {
if ( HEDLEY_UNLIKELY ( ! simde_test_equal_f32 ( a , b , slop ) ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s ~= %s (%f ~= %f) \n " ,
filename , line , astr , bstr , HEDLEY_STATIC_CAST ( double , a ) , HEDLEY_STATIC_CAST ( double , b ) ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
return 0 ;
}
2026-09-24 14:30:19 -06:00
# define simde_assert_equal_f32(a, b, precision) do { if (simde_assert_equal_f32_(a, b, simde_test_f32_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:08:32 -06:00
static int
simde_assert_equal_vf64_ (
size_t vec_len , simde_float64 const a [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_float64 const b [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_float64 slop ,
const char * filename , int line , const char * astr , const char * bstr ) {
for ( size_t i = 0 ; i < vec_len ; i + + ) {
if ( HEDLEY_UNLIKELY ( ! simde_test_equal_f64 ( a [ i ] , b [ i ] , slop ) ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s[%zu] ~= %s[%zu] (%f ~= %f) \n " ,
filename , line , astr , i , bstr , i , HEDLEY_STATIC_CAST ( double , a [ i ] ) , HEDLEY_STATIC_CAST ( double , b [ i ] ) ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
}
return 0 ;
}
2026-09-24 14:30:19 -06:00
# define simde_assert_equal_vf64(vec_len, a, b, precision) do { if (simde_assert_equal_vf64_(vec_len, a, b, simde_test_f64_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:08:32 -06:00
static int
simde_assert_equal_f64_ ( simde_float64 a , simde_float64 b , simde_float64 slop ,
const char * filename , int line , const char * astr , const char * bstr ) {
if ( HEDLEY_UNLIKELY ( ! simde_test_equal_f64 ( a , b , slop ) ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s ~= %s (%f ~= %f) \n " ,
filename , line , astr , bstr , a , b ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
return 0 ;
}
2026-09-24 14:30:19 -06:00
# define simde_assert_equal_f64(a, b, precision) do { if (simde_assert_equal_f64_(a, b, simde_test_f64_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
static int
simde_assert_equal_vbf16_ (
size_t vec_len , simde_bfloat16 const a [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_bfloat16 const b [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_bfloat16 slop ,
const char * filename , int line , const char * astr , const char * bstr ) {
simde_float32 slop_ = simde_bfloat16_to_float32 ( slop ) ;
for ( size_t i = 0 ; i < vec_len ; i + + ) {
simde_float32 a_ = simde_bfloat16_to_float32 ( a [ i ] ) ;
simde_float32 b_ = simde_bfloat16_to_float32 ( b [ i ] ) ;
if ( HEDLEY_UNLIKELY ( ! simde_test_equal_f32 ( a_ , b_ , slop_ ) ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s[%zu] ~= %s[%zu] (%f ~= %f) \n " ,
filename , line , astr , i , bstr , i , HEDLEY_STATIC_CAST ( double , a_ ) ,
HEDLEY_STATIC_CAST ( double , b_ ) ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
}
return 0 ;
}
# define simde_assert_equal_vbf16(vec_len, a, b, precision) do { if (simde_assert_equal_vbf16_(vec_len, a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
static int
simde_assert_equal_bf16_ ( simde_bfloat16 a , simde_bfloat16 b , simde_bfloat16 slop ,
const char * filename , int line , const char * astr , const char * bstr ) {
simde_float32 a_ = simde_bfloat16_to_float32 ( a ) ;
simde_float32 b_ = simde_bfloat16_to_float32 ( b ) ;
simde_float32 slop_ = simde_bfloat16_to_float32 ( slop ) ;
if ( HEDLEY_UNLIKELY ( ! simde_test_equal_f32 ( a_ , b_ , slop_ ) ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s ~= %s (%f ~= %f) \n " ,
filename , line , astr , bstr , HEDLEY_STATIC_CAST ( double , a_ ) ,
HEDLEY_STATIC_CAST ( double , b_ ) ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
return 0 ;
}
# define simde_assert_equal_bf16(a, b, precision) do { if (simde_assert_equal_bf16_(a, b, simde_test_bf16_precision_to_slop(precision), __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
static int
simde_assert_equal_vp8_ (
size_t vec_len , simde_poly8 const a [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_poly8 const b [ HEDLEY_ARRAY_PARAM ( vec_len ) ] ,
const char * filename , int line , const char * astr , const char * bstr ) {
for ( size_t i = 0 ; i < vec_len ; i + + ) {
uint8_t a_ = HEDLEY_STATIC_CAST ( uint8_t , a [ i ] ) ;
uint8_t b_ = HEDLEY_STATIC_CAST ( uint8_t , b [ i ] ) ;
if ( HEDLEY_UNLIKELY ( a_ ! = b_ ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s[%zu] ~= %s[%zu] (% " PRIu8 " ~= % " PRIu8 " ) \n " ,
filename , line , astr , i , bstr , i , a_ , b_ ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
}
return 0 ;
}
# define simde_assert_equal_vp8(vec_len, a, b) do { if (simde_assert_equal_vp8_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
static int
simde_assert_equal_p8_ ( simde_poly8 a , simde_poly8 b ,
const char * filename , int line , const char * astr , const char * bstr ) {
uint8_t a_ = HEDLEY_STATIC_CAST ( uint8_t , a ) ;
uint8_t b_ = HEDLEY_STATIC_CAST ( uint8_t , b ) ;
if ( HEDLEY_UNLIKELY ( a_ ! = b_ ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s ~= %s (% " PRIu8 " ~= % " PRIu8 " ) \n " ,
filename , line , astr , bstr , a_ , b_ ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
return 0 ;
}
# define simde_assert_equal_p8(a, b) do { if (simde_assert_equal_p8_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
static int
simde_assert_equal_vp16_ (
size_t vec_len , simde_poly16 const a [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_poly16 const b [ HEDLEY_ARRAY_PARAM ( vec_len ) ] ,
const char * filename , int line , const char * astr , const char * bstr ) {
for ( size_t i = 0 ; i < vec_len ; i + + ) {
uint16_t a_ = HEDLEY_STATIC_CAST ( uint16_t , a [ i ] ) ;
uint16_t b_ = HEDLEY_STATIC_CAST ( uint16_t , b [ i ] ) ;
if ( HEDLEY_UNLIKELY ( a_ ! = b_ ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s[%zu] ~= %s[%zu] (% " PRIu16 " ~= % " PRIu16 " ) \n " ,
filename , line , astr , i , bstr , i , a_ , b_ ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
}
return 0 ;
}
# define simde_assert_equal_vp16(vec_len, a, b) do { if (simde_assert_equal_vp16_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
static int
simde_assert_equal_p16_ ( simde_poly16 a , simde_poly16 b ,
const char * filename , int line , const char * astr , const char * bstr ) {
uint16_t a_ = HEDLEY_STATIC_CAST ( uint16_t , a ) ;
uint16_t b_ = HEDLEY_STATIC_CAST ( uint16_t , b ) ;
if ( HEDLEY_UNLIKELY ( a_ ! = b_ ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s ~= %s (% " PRIu16 " ~= % " PRIu16 " ) \n " ,
filename , line , astr , bstr , a_ , b_ ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
return 0 ;
}
# define simde_assert_equal_p16(a, b) do { if (simde_assert_equal_p16_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
static int
simde_assert_equal_vp64_ (
size_t vec_len , simde_poly64 const a [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , simde_poly64 const b [ HEDLEY_ARRAY_PARAM ( vec_len ) ] ,
const char * filename , int line , const char * astr , const char * bstr ) {
for ( size_t i = 0 ; i < vec_len ; i + + ) {
uint64_t a_ = HEDLEY_STATIC_CAST ( uint64_t , a [ i ] ) ;
uint64_t b_ = HEDLEY_STATIC_CAST ( uint64_t , b [ i ] ) ;
if ( HEDLEY_UNLIKELY ( a_ ! = b_ ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s[%zu] ~= %s[%zu] (% " PRIu64 " ~= % " PRIu64 " ) \n " ,
filename , line , astr , i , bstr , i , a_ , b_ ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
}
return 0 ;
}
# define simde_assert_equal_vp64(vec_len, a, b) do { if (simde_assert_equal_vp64_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
static int
simde_assert_equal_p64_ ( simde_poly64 a , simde_poly64 b ,
const char * filename , int line , const char * astr , const char * bstr ) {
uint64_t a_ = HEDLEY_STATIC_CAST ( uint64_t , a ) ;
uint64_t b_ = HEDLEY_STATIC_CAST ( uint64_t , b ) ;
if ( HEDLEY_UNLIKELY ( a_ ! = b_ ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s ~= %s (% " PRIu64 " ~= % " PRIu64 " ) \n " ,
filename , line , astr , bstr , a_ , b_ ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
return 0 ;
}
# define simde_assert_equal_p64(a, b) do { if (simde_assert_equal_p64_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:08:32 -06:00
# define SIMDE_TEST_GENERATE_ASSERT_EQUAL_FUNC_(T, symbol_identifier, fmt) \
static int \
simde_assert_equal_v # # symbol_identifier # # _ ( \
size_t vec_len , const T a [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , const T b [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , \
const char * filename , int line , const char * astr , const char * bstr ) { \
for ( size_t i = 0 ; i < vec_len ; i + + ) { \
if ( HEDLEY_UNLIKELY ( a [ i ] ! = b [ i ] ) ) { \
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s[%zu] == %s[%zu] (% " fmt " == % " fmt " ) \n " , \
filename , line , astr , i , bstr , i , a [ i ] , b [ i ] ) ; \
SIMDE_TEST_ASSERT_RETURN ( 1 ) ; \
} \
} \
return 0 ; \
} \
\
static int \
simde_assert_equal_ # # symbol_identifier # # _ ( T a , T b , \
const char * filename , int line , const char * astr , const char * bstr ) { \
if ( HEDLEY_UNLIKELY ( a ! = b ) ) { \
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s == %s (% " fmt " == % " fmt " ) \n " , \
filename , line , astr , bstr , a , b ) ; \
SIMDE_TEST_ASSERT_RETURN ( 1 ) ; \
} \
return 0 ; \
} \
\
static int \
simde_assert_close_v # # symbol_identifier # # _ ( \
size_t vec_len , const T a [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , const T b [ HEDLEY_ARRAY_PARAM ( vec_len ) ] , const T slop , \
const char * filename , int line , const char * astr , const char * bstr ) { \
for ( size_t i = 0 ; i < vec_len ; i + + ) { \
if ( ( ( a [ i ] + slop ) < b [ i ] ) | | ( ( a [ i ] - slop ) > b [ i ] ) ) { \
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s[%zu] == %s[%zu] (% " fmt " == % " fmt " ) \n " , \
filename , line , astr , i , bstr , i , a [ i ] , b [ i ] ) ; \
SIMDE_TEST_ASSERT_RETURN ( 1 ) ; \
} \
} \
return 0 ; \
} \
\
static int \
simde_assert_close_ # # symbol_identifier # # _ ( T a , T b , T slop , \
const char * filename , int line , const char * astr , const char * bstr ) { \
if ( ( ( a + slop ) < b ) | | ( ( a - slop ) > b ) ) { \
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s == %s +/- % " fmt " (% " fmt " == % " fmt " ) \n " , \
filename , line , astr , bstr , slop , a , b ) ; \
SIMDE_TEST_ASSERT_RETURN ( 1 ) ; \
} \
return 0 ; \
}
static int
simde_assert_equal_i_ ( int a , int b , const char * filename , int line , const char * astr , const char * bstr ) {
if ( HEDLEY_UNLIKELY ( a ! = b ) ) {
simde_test_debug_printf_ ( " %s:%d: assertion failed: %s == %s (%d == %d) \n " ,
filename , line , astr , bstr , a , b ) ;
SIMDE_TEST_ASSERT_RETURN ( 1 ) ;
}
return 0 ;
}
SIMDE_TEST_GENERATE_ASSERT_EQUAL_FUNC_ ( int8_t , i8 , PRId8 )
SIMDE_TEST_GENERATE_ASSERT_EQUAL_FUNC_ ( int16_t , i16 , PRId16 )
SIMDE_TEST_GENERATE_ASSERT_EQUAL_FUNC_ ( int32_t , i32 , PRId32 )
SIMDE_TEST_GENERATE_ASSERT_EQUAL_FUNC_ ( int64_t , i64 , PRId64 )
SIMDE_TEST_GENERATE_ASSERT_EQUAL_FUNC_ ( uint8_t , u8 , PRIu8 )
SIMDE_TEST_GENERATE_ASSERT_EQUAL_FUNC_ ( uint16_t , u16 , PRIu16 )
SIMDE_TEST_GENERATE_ASSERT_EQUAL_FUNC_ ( uint32_t , u32 , PRIu32 )
SIMDE_TEST_GENERATE_ASSERT_EQUAL_FUNC_ ( uint64_t , u64 , PRIu64 )
# define simde_assert_equal_vi8(vec_len, a, b) do { if (simde_assert_equal_vi8_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_vi16(vec_len, a, b) do { if (simde_assert_equal_vi16_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_vi32(vec_len, a, b) do { if (simde_assert_equal_vi32_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_vi64(vec_len, a, b) do { if (simde_assert_equal_vi64_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_vu8(vec_len, a, b) do { if (simde_assert_equal_vu8_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_vu16(vec_len, a, b) do { if (simde_assert_equal_vu16_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_vu32(vec_len, a, b) do { if (simde_assert_equal_vu32_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_vu64(vec_len, a, b) do { if (simde_assert_equal_vu64_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:30:19 -06:00
# define simde_assert_equal_vp8(vec_len, a, b) do { if (simde_assert_equal_vp8_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_vp16(vec_len, a, b) do { if (simde_assert_equal_vp16_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_vp64(vec_len, a, b) do { if (simde_assert_equal_vp64_(vec_len, a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:08:32 -06:00
# define simde_assert_equal_i8(a, b) do { if (simde_assert_equal_i8_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_i16(a, b) do { if (simde_assert_equal_i16_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_i32(a, b) do { if (simde_assert_equal_i32_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_i64(a, b) do { if (simde_assert_equal_i64_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_u8(a, b) do { if (simde_assert_equal_u8_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_u16(a, b) do { if (simde_assert_equal_u16_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_u32(a, b) do { if (simde_assert_equal_u32_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_u64(a, b) do { if (simde_assert_equal_u64_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_i(a, b) do { if (simde_assert_equal_i_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:30:19 -06:00
# define simde_assert_equal_p8(a, b) do { if (simde_assert_equal_p8_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_p16(a, b) do { if (simde_assert_equal_p16_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_equal_p64(a, b) do { if (simde_assert_equal_p64_(a, b, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:08:32 -06:00
# define simde_assert_close_vi8(vec_len, a, b, slop) do { if (simde_assert_close_vi8_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_vi16(vec_len, a, b, slop) do { if (simde_assert_close_vi16_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_vi32(vec_len, a, b, slop) do { if (simde_assert_close_vi32_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_vi64(vec_len, a, b, slop) do { if (simde_assert_close_vi64_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_vu8(vec_len, a, b, slop) do { if (simde_assert_close_vu8_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_vu16(vec_len, a, b, slop) do { if (simde_assert_close_vu16_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_vu32(vec_len, a, b, slop) do { if (simde_assert_close_vu32_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_vu64(vec_len, a, b, slop) do { if (simde_assert_close_vu64_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:30:19 -06:00
# define simde_assert_close_vp8(vec_len, a, b, slop) do { if (simde_assert_close_vp8_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_vp16(vec_len, a, b, slop) do { if (simde_assert_close_vp16_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_vp64(vec_len, a, b, slop) do { if (simde_assert_close_vp64_(vec_len, a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:08:32 -06:00
# define simde_assert_close_i8(a, b, slop) do { if (simde_assert_close_i8_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_i16(a, b, slop) do { if (simde_assert_close_i16_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_i32(a, b, slop) do { if (simde_assert_close_i32_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_i64(a, b, slop) do { if (simde_assert_close_i64_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_u8(a, b, slop) do { if (simde_assert_close_u8_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_u16(a, b, slop) do { if (simde_assert_close_u16_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_u32(a, b, slop) do { if (simde_assert_close_u32_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_u64(a, b, slop) do { if (simde_assert_close_u64_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_i(a, b, slop) do { if (simde_assert_close_i_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:30:19 -06:00
# define simde_assert_close_p8(a, b, slop) do { if (simde_assert_close_p8_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_p16(a, b, slop) do { if (simde_assert_close_p16_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
# define simde_assert_close_p64(a, b, slop) do { if (simde_assert_close_p64_(a, b, slop, __FILE__, __LINE__, #a, #b)) { return 1; } } while (0)
2026-09-24 14:08:32 -06:00
/* Since each test is compiled in 4 different versions (C/C++ and
* native / emul ) , we need to be able to generate different symbols
* depending on preprocessor macros . */
# if defined(SIMDE_NO_NATIVE)
# if defined(__cplusplus)
# define SIMDE_TEST_GENERATE_VARIANT_SYMBOL_CURRENT(name) HEDLEY_CONCAT(name,_emul_cpp)
# define SIMDE_TEST_GENERATE_VARIANT_NAME_CURRENT(name) #name " / emul / cpp"
# else
# define SIMDE_TEST_GENERATE_VARIANT_SYMBOL_CURRENT(name) HEDLEY_CONCAT(name,_emul_c)
# define SIMDE_TEST_GENERATE_VARIANT_NAME_CURRENT(name) #name " / emul / c"
# endif
# else
# if defined(__cplusplus)
# define SIMDE_TEST_GENERATE_VARIANT_SYMBOL_CURRENT(name) HEDLEY_CONCAT(name,_native_cpp)
# define SIMDE_TEST_GENERATE_VARIANT_NAME_CURRENT(name) #name " / native / cpp"
# else
# define SIMDE_TEST_GENERATE_VARIANT_SYMBOL_CURRENT(name) HEDLEY_CONCAT(name,_native_c)
# define SIMDE_TEST_GENERATE_VARIANT_NAME_CURRENT(name) #name " / native / c"
# endif
# endif
/* The bare version basically assumes you just want to run a single
* test suite . It doesn ' t use munit , or any other dependencies so
* it ' s easy to use with creduce . */
# if defined(SIMDE_TEST_BARE)
# define SIMDE_TEST_FUNC_LIST_BEGIN static const struct { int (* func)(void); const char* name; } test_suite_tests[] = {
# define SIMDE_TEST_FUNC_LIST_ENTRY(name) { test_simde_##name, #name },
# define SIMDE_TEST_FUNC_LIST_END };
# define SIMDE_MUNIT_TEST_ARGS void
# else
HEDLEY_DIAGNOSTIC_PUSH
SIMDE_DIAGNOSTIC_DISABLE_CPP98_COMPAT_PEDANTIC_
SIMDE_DIAGNOSTIC_DISABLE_OLD_STYLE_CAST_
SIMDE_DIAGNOSTIC_DISABLE_VARIADIC_MACROS_
SIMDE_DIAGNOSTIC_DISABLE_RESERVED_ID_MACRO_
# include "munit/munit.h"
HEDLEY_DIAGNOSTIC_POP
# if \
HEDLEY_HAS_ATTRIBUTE ( unused ) | | \
HEDLEY_GCC_VERSION_CHECK ( 3 , 1 , 0 )
# define SIMDE_MUNIT_TEST_ARGS __attribute__((__unused__)) const MunitParameter params[], __attribute__((__unused__)) void* data
# else
/* Compilers other than emscripten are fine with casting away
* arguments . */
# define SIMDE_MUNIT_TEST_ARGS void
# endif
# define SIMDE_TEST_FUNC_LIST_BEGIN static MunitTest test_suite_tests[] = {
# if defined(__cplusplus)
# define SIMDE_TEST_FUNC_LIST_ENTRY(name) { \
const_cast < char * > ( " / " SIMDE_TEST_GENERATE_VARIANT_NAME_CURRENT ( name ) ) , \
HEDLEY_REINTERPRET_CAST ( MunitTestFunc , test_simde_ # # name ) , \
NULL , NULL , MUNIT_TEST_OPTION_NONE , NULL } ,
# else
# define SIMDE_TEST_FUNC_LIST_ENTRY(name) { \
( char * ) " / " SIMDE_TEST_GENERATE_VARIANT_NAME_CURRENT ( name ) , \
HEDLEY_REINTERPRET_CAST ( MunitTestFunc , test_simde_ # # name ) , \
NULL , NULL , MUNIT_TEST_OPTION_NONE , NULL } ,
# endif
# define SIMDE_TEST_FUNC_LIST_END { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } };
# define SIMDE_TEST_SUITE_DECLARE_GETTERS(name) \
HEDLEY_C_DECL MunitSuite * HEDLEY_CONCAT ( name , _native_c ) ( void ) ; \
HEDLEY_C_DECL MunitSuite * HEDLEY_CONCAT ( name , _emul_c ) ( void ) ; \
HEDLEY_C_DECL MunitSuite * HEDLEY_CONCAT ( name , _native_cpp ) ( void ) ; \
HEDLEY_C_DECL MunitSuite * HEDLEY_CONCAT ( name , _emul_cpp ) ( void ) ;
# endif
2026-09-24 14:30:19 -06:00
HEDLEY_DIAGNOSTIC_POP
2026-09-24 14:08:32 -06:00
# endif /* !defined(SIMDE_TESTS_H) */