From 02d7f0101c7068a0b767ab4f51d079ec84006c17 Mon Sep 17 00:00:00 2001 From: Hidayat Ullah Khan <huk2209@gmail.com> Date: Sat, 16 May 2020 14:53:11 +0530 Subject: [PATCH] sse4.2: added the implementation for mm_cmpestra Fixes #295 --- simde/x86/sse4.2.h | 221 +++++++ test/x86/sse4.2.c | 1387 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1608 insertions(+) diff --git a/simde/x86/sse4.2.h b/simde/x86/sse4.2.h index dee447a35..82a2d1a24 100644 --- a/simde/x86/sse4.2.h +++ b/simde/x86/sse4.2.h @@ -92,6 +92,227 @@ SIMDE_BEGIN_DECLS_ #define _SIDD_UNIT_MASK SIMDE_SIDD_UNIT_MASK #endif +SIMDE_FUNCTION_ATTRIBUTES +int +simde_mm_cmpestra_8_(simde__m128i a, int la, simde__m128i b, int lb, const int imm8) + SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) { + const int cmp_op = imm8 & 0x0c; + const int polarity = imm8 & 0x30; + simde__m128i_private + bool_res_ = simde__m128i_to_private(simde_mm_setzero_si128()), + a_ = simde__m128i_to_private(a), + b_ = simde__m128i_to_private(b); + const int upper_bound = (128 / 8) - 1; + int a_invalid = 0; + int b_invalid = 0; + for(int i = 0 ; i < upper_bound ; i++) { + for(int j = 0; j< upper_bound ; j++){ + int bitvalue = ((a_.i8[i] == b_.i8[j]) ? 1 : 0); + if(i == la) + a_invalid = 1; + if(j == lb) + b_invalid = 1; + switch(cmp_op){ + case SIMDE_SIDD_CMP_EQUAL_ANY: + case SIMDE_SIDD_CMP_RANGES: + bitvalue = 0; + break; + case SIMDE_SIDD_CMP_EQUAL_EACH: + if(a_invalid && b_invalid) + bitvalue = 1; + else + bitvalue = 0; + break; + case SIMDE_SIDD_CMP_EQUAL_ORDERED: + if(a_invalid && !b_invalid) + bitvalue = 1; + else if(a_invalid && b_invalid) + bitvalue = 1; + else + bitvalue = 0; + break; + } + bool_res_.i8[i] |= (bitvalue << j); + } + } + int32_t int_res_1 = 0; + int32_t int_res_2 = 0; + switch(cmp_op) { + case SIMDE_SIDD_CMP_EQUAL_ANY: + for(int i = 0 ; i < upper_bound ; i++){ + SIMDE_VECTORIZE_REDUCTION(|:int_res_1) + for(int j = 0 ; j < upper_bound ; j++){ + int_res_1 |= (((bool_res_.i8[i] >> j) & 1) << i); + } + } + break; + case SIMDE_SIDD_CMP_RANGES: + for(int i = 0 ; i < upper_bound ; i++){ + SIMDE_VECTORIZE_REDUCTION(|:int_res_1) + for(int j = 0 ; j < upper_bound ; j++){ + int_res_1 |= ((((bool_res_.i8[i] >> j) & 1) & ((bool_res_.i8[i] >> (j + 1)) & 1)) << i); + j += 2; + } + } + break; + case SIMDE_SIDD_CMP_EQUAL_EACH: + for(int i = 0 ; i < upper_bound ; i++){ + SIMDE_VECTORIZE_REDUCTION(|:int_res_1) + for(int j = 0 ; j < upper_bound ; j++){ + int_res_1 |= (((bool_res_.i8[i] >> i) & 1) << i); + } + } + break; + case SIMDE_SIDD_CMP_EQUAL_ORDERED: + int_res_1 = 0xff; + for(int i = 0 ; i < upper_bound ; i++){ + int k = i; + SIMDE_VECTORIZE_REDUCTION(&:int_res_1) + for(int j = 0 ; j < (upper_bound-i) ; j++){ + int_res_1 &= (((bool_res_.i8[k] >> j) & 1 ) << i) ; + k += 1; + } + } + break; + } + for(int i = 0; i < upper_bound ; i++){ + if(polarity & 1){ + if((polarity >> 1) & 1) { + if (i >= lb) { + int_res_2 |= (((int_res_1 >> i) & 1) << i); + } + else { + int_res_2 |= ((((int_res_1 >> i) & 1) ^ (-1)) << i); + } + } + else{ + int_res_2 |= ((((int_res_1 >> i) & 1) ^ (-1)) << i); + } + } + else{ + int_res_2 |= ( ((int_res_1 >> i) & 1) << i); + } + } + return !int_res_2 & (lb > upper_bound); +} + +SIMDE_FUNCTION_ATTRIBUTES +int +simde_mm_cmpestra_16_(simde__m128i a, int la, simde__m128i b, int lb, const int imm8) + SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 255) { + const int cmp_op = imm8 & 0x0c; + const int polarity = imm8 & 0x30; + simde__m128i_private + bool_res_ = simde__m128i_to_private(simde_mm_setzero_si128()), + a_ = simde__m128i_to_private(a), + b_ = simde__m128i_to_private(b); + const int upper_bound = (128 / 16) - 1; + int a_invalid = 0; + int b_invalid = 0; + for(int i = 0 ; i < upper_bound ; i++) { + for(int j = 0; j< upper_bound ; j++) + { + int bitvalue = ((a_.i16[i] == b_.i16[j]) ? 1 : 0); + if(i == la) + a_invalid = 1; + if(j == lb) + b_invalid = 1; + switch(cmp_op){ + case SIMDE_SIDD_CMP_EQUAL_ANY: + case SIMDE_SIDD_CMP_RANGES: + bitvalue = 0; + break; + case SIMDE_SIDD_CMP_EQUAL_EACH: + if(a_invalid && b_invalid) + bitvalue = 1; + else + bitvalue = 0; + break; + case SIMDE_SIDD_CMP_EQUAL_ORDERED: + if(a_invalid && !b_invalid) + bitvalue = 1; + else if(a_invalid && b_invalid) + bitvalue = 1; + else + bitvalue = 0; + break; + } + bool_res_.i16[i] |= (bitvalue << j); + } + } + int32_t int_res_1 = 0; + int32_t int_res_2 = 0; + switch(cmp_op) { + case SIMDE_SIDD_CMP_EQUAL_ANY: + for(int i = 0 ; i < upper_bound ; i++){ + SIMDE_VECTORIZE_REDUCTION(|:int_res_1) + for (int j = 0 ; j < upper_bound ; j++){ + int_res_1 |= (((bool_res_.i16[i] >> j) & 1) << i) ; + } + } + break; + case SIMDE_SIDD_CMP_RANGES: + for(int i = 0 ; i < upper_bound ; i++){ + SIMDE_VECTORIZE_REDUCTION(|:int_res_1) + for(int j = 0 ; j < upper_bound ; j++){ + int_res_1 |= ((((bool_res_.i16[i] >> j) & 1) & ((bool_res_.i16[i] >> (j + 1)) & 1)) << i); + j += 2; + } + } + break; + case SIMDE_SIDD_CMP_EQUAL_EACH: + for(int i = 0 ; i < upper_bound ; i++){ + SIMDE_VECTORIZE_REDUCTION(|:int_res_1) + for(int j = 0 ; j < upper_bound ; j++){ + int_res_1 |= (((bool_res_.i16[i] >> i) & 1) << i); + } + } + break; + case SIMDE_SIDD_CMP_EQUAL_ORDERED: + int_res_1 = 0xffff; + for(int i = 0 ; i < upper_bound ; i++){ + int k = i; + SIMDE_VECTORIZE_REDUCTION(&:int_res_1) + for(int j = 0 ; j < (upper_bound-i) ; j++){ + int_res_1 &= (((bool_res_.i16[k] >> j) & 1) << i) ; + k += 1; + } + } + break; + } + for(int i = 0; i < upper_bound ; i++){ + if(polarity & 1){ + if((polarity >> 1) & 1) { + if (i >= lb) { + int_res_2 |= (((int_res_1 >> i) & 1) << i); + } + else { + int_res_2 |= ((((int_res_1 >> i) & 1) ^ (-1)) << i); + } + } + else{ + int_res_2 |= ((((int_res_1 >> i) & 1) ^ (-1)) << i); + } + } + else{ + int_res_2 |= (((int_res_1 >> i) & 1) << i); + } + } + return !int_res_2 & (lb > upper_bound); +} + +#if defined(SIMDE_X86_SSE4_2_NATIVE) + #define simde_mm_cmpestra(a, la, b, lb, imm8) _mm_cmpestra(a, la, b, lb, imm8) +#else + #define simde_mm_cmpestra(a, la, b, lb, imm8) \ + (((imm8) & SIMDE_SIDD_UWORD_OPS) \ + ? simde_mm_cmpestra_16_((a), (la), (b), (lb), (imm8)) \ + : simde_mm_cmpestra_8_((a), (la), (b), (lb), (imm8))) +#endif +#if defined(SIMDE_X86_SSE4_2_ENABLE_NATIVE_ALIASES) + #define _mm_cmpestra(a, la, b, lb, imm8) simde_mm_cmpestra(a, la, b, lb, imm8) +#endif + SIMDE_FUNCTION_ATTRIBUTES int simde_mm_cmpestrs (simde__m128i a, int la, simde__m128i b, int lb, const int imm8) SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 127) { diff --git a/test/x86/sse4.2.c b/test/x86/sse4.2.c index f1a2ee994..a85b1bcd2 100644 --- a/test/x86/sse4.2.c +++ b/test/x86/sse4.2.c @@ -27,6 +27,1378 @@ #if defined(SIMDE_X86_SSE4_2_NATIVE) || defined(SIMDE_NO_NATIVE) || defined(SIMDE_ALWAYS_BUILD_NATIVE_TESTS) +static MunitResult +test_simde_mm_cmpestra_equalany_8(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi8(INT8_C( -95), INT8_C( 121), INT8_C( -77), INT8_C( -79), + INT8_C( -26), INT8_C( 105), INT8_C( 37), INT8_C( -97), + INT8_C( 67), INT8_C( -90), INT8_C( -51), INT8_C( 31), + INT8_C( 19), INT8_C( -83), INT8_C( 127), INT8_C( 51)), + 2 , + simde_mm_set_epi8(INT8_C( -42), INT8_C( -92), INT8_C( 82), INT8_C( 77), + INT8_C( 91), INT8_C( 115), INT8_C( 12), INT8_C( 52), + INT8_C( 10), INT8_C( -63), INT8_C( -24), INT8_C( -16), + INT8_C( -50), INT8_C( 39), INT8_C( 81), INT8_C( 0)), + 3 , + 0 }, + { simde_mm_set_epi8(INT8_C( 74), INT8_C( 91), INT8_C( 101), INT8_C( 90), + INT8_C(-108), INT8_C(-127), INT8_C( 86), INT8_C( 21), + INT8_C( 102), INT8_C( 66), INT8_C( 97), INT8_C( -48), + INT8_C( -2), INT8_C( 101), INT8_C( -20), INT8_C( -28)), + 13 , + simde_mm_set_epi8(INT8_C( 28), INT8_C( 67), INT8_C( 67), INT8_C( 62), + INT8_C( 3), INT8_C( -97), INT8_C( 111), INT8_C( 121), + INT8_C(-126), INT8_C( 114), INT8_C( 22), INT8_C(-113), + INT8_C( 35), INT8_C( 114), INT8_C( 100), INT8_C( 108)), + 12 , + 0 }, + { simde_mm_set_epi8(INT8_C( 80), INT8_C( 47), INT8_C( -67), INT8_C(-104), + INT8_C( -73), INT8_C( 121), INT8_C( 100), INT8_C(-109), + INT8_C( -17), INT8_C( 74), INT8_C( 56), INT8_C(-112), + INT8_C( -39), INT8_C( 66), INT8_C( -53), INT8_C( 23)), + 1 , + simde_mm_set_epi8(INT8_C( 47), INT8_C( -94), INT8_C( 121), INT8_C( 48), + INT8_C( -50), INT8_C( -46), INT8_C( -90), INT8_C( 25), + INT8_C( 35), INT8_C( 37), INT8_C( 27), INT8_C(-106), + INT8_C( 16), INT8_C( -31), INT8_C( 24), INT8_C( 29)), + 13 , + 0 }, + { simde_mm_set_epi8(INT8_C( 8), INT8_C( -87), INT8_C( 20), INT8_C( 84), + INT8_C(-107), INT8_C( -30), INT8_C( 91), INT8_C(-126), + INT8_C( 26), INT8_C(-100), INT8_C( 105), INT8_C( 67), + INT8_C( -95), INT8_C( 119), INT8_C( 119), INT8_C(-111)), + 11 , + simde_mm_set_epi8(INT8_C( -39), INT8_C( -97), INT8_C( -79), INT8_C( 41), + INT8_C( 19), INT8_C( 47), INT8_C(-116), INT8_C( -88), + INT8_C( 63), INT8_C( 123), INT8_C( -2), INT8_C( 97), + INT8_C( -27), INT8_C( 99), INT8_C( -40), INT8_C( -76)), + 1 , + 0 }, + { simde_mm_set_epi8(INT8_C( 48), INT8_C(-100), INT8_C( 3), INT8_C( 23), + INT8_C( -25), INT8_C( -35), INT8_C( 41), INT8_C( -55), + INT8_C( -96), INT8_C( -48), INT8_C( -48), INT8_C( 90), + INT8_C( -7), INT8_C( 41), INT8_C( 108), INT8_C( -38)), + 5 , + simde_mm_set_epi8(INT8_C( 17), INT8_C( 62), INT8_C( 32), INT8_C(-122), + INT8_C( 82), INT8_C( 24), INT8_C( -70), INT8_C( -73), + INT8_C( 55), INT8_C( -77), INT8_C( -70), INT8_C( -67), + INT8_C(-126), INT8_C(-114), INT8_C( 42), INT8_C( -92)), + 5 , + 0 }, + { simde_mm_set_epi8(INT8_C( 21), INT8_C( 8), INT8_C( -51), INT8_C( 91), + INT8_C( 51), INT8_C( 49), INT8_C(-106), INT8_C( 118), + INT8_C( -54), INT8_C( -6), INT8_C( 27), INT8_C( 48), + INT8_C( 75), INT8_C( -85), INT8_C( 9), INT8_C( -59)), + 13 , + simde_mm_set_epi8(INT8_C( -37), INT8_C( 84), INT8_C( -33), INT8_C( 8), + INT8_C( 10), INT8_C( 87), INT8_C( 124), INT8_C( 86), + INT8_C(-125), INT8_C( -40), INT8_C( 101), INT8_C( -82), + INT8_C( -60), INT8_C(-117), INT8_C( 127), INT8_C(-125)), + 3 , + 0 }, + { simde_mm_set_epi8(INT8_C( 89), INT8_C( 96), INT8_C(-123), INT8_C( 102), + INT8_C(-115), INT8_C( 32), INT8_C( -66), INT8_C( 55), + INT8_C( 101), INT8_C( 46), INT8_C( 49), INT8_C( -6), + INT8_C( 7), INT8_C(-104), INT8_C( -62), INT8_C( 3)), + 14 , + simde_mm_set_epi8(INT8_C( 16), INT8_C( 63), INT8_C(-127), INT8_C( 70), + INT8_C( -22), INT8_C( -16), INT8_C( 64), INT8_C(-126), + INT8_C( 8), INT8_C(-114), INT8_C( -59), INT8_C( -92), + INT8_C( 36), INT8_C( 71), INT8_C( -28), INT8_C( 83)), + 5 , + 0 }, + { simde_mm_set_epi8(INT8_C( 0), INT8_C( -88), INT8_C( 50), INT8_C( 67), + INT8_C( 31), INT8_C( -87), INT8_C( -18), INT8_C( -64), + INT8_C( -64), INT8_C( 59), INT8_C( 14), INT8_C( -47), + INT8_C( -53), INT8_C( 67), INT8_C( 107), INT8_C( -84)), + 1 , + simde_mm_set_epi8(INT8_C( 49), INT8_C( 79), INT8_C( -38), INT8_C(-108), + INT8_C( -19), INT8_C( 91), INT8_C( -63), INT8_C(-108), + INT8_C( 51), INT8_C( -10), INT8_C( 0), INT8_C( 85), + INT8_C( 0), INT8_C( 103), INT8_C( -1), INT8_C( -39)), + 7 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 130); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 34); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_equalany_16(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi16(INT16_C(-24199), INT16_C(-19535), INT16_C( -6551), INT16_C( 9631), + INT16_C( 17318), INT16_C(-13025), INT16_C( 5037), INT16_C( 32563)), + 6 , + simde_mm_set_epi16(INT16_C(-10588), INT16_C( 21069), INT16_C( 23411), INT16_C( 3124), + INT16_C( 2753), INT16_C( -5904), INT16_C(-12761), INT16_C( 20736)), + 6 , + 0 }, + { simde_mm_set_epi16(INT16_C( 19035), INT16_C( 25946), INT16_C(-27519), INT16_C( 22037), + INT16_C( 26178), INT16_C( 25040), INT16_C( -411), INT16_C( -4892)), + 4 , + simde_mm_set_epi16(INT16_C( 7235), INT16_C( 17214), INT16_C( 927), INT16_C( 28537), + INT16_C(-32142), INT16_C( 5775), INT16_C( 9074), INT16_C( 25708)), + 0 , + 0 }, + { simde_mm_set_epi16(INT16_C( 20527), INT16_C(-17000), INT16_C(-18567), INT16_C( 25747), + INT16_C( -4278), INT16_C( 14480), INT16_C( -9918), INT16_C(-13545)), + 7 , + simde_mm_set_epi16(INT16_C( 12194), INT16_C( 31024), INT16_C(-12590), INT16_C(-23015), + INT16_C( 8997), INT16_C( 7062), INT16_C( 4321), INT16_C( 6173)), + 1 , + 0 }, + { simde_mm_set_epi16(INT16_C( 2217), INT16_C( 5204), INT16_C(-27166), INT16_C( 23426), + INT16_C( 6812), INT16_C( 26947), INT16_C(-24201), INT16_C( 30609)), + 6 , + simde_mm_set_epi16(INT16_C( -9825), INT16_C(-20183), INT16_C( 4911), INT16_C(-29528), + INT16_C( 16251), INT16_C( -415), INT16_C( -6813), INT16_C(-10060)), + 2 , + 0 }, + { simde_mm_set_epi16(INT16_C( 12444), INT16_C( 791), INT16_C( -6179), INT16_C( 10697), + INT16_C(-24368), INT16_C(-12198), INT16_C( -1751), INT16_C( 27866)), + 4 , + simde_mm_set_epi16(INT16_C( 4414), INT16_C( 8326), INT16_C( 21016), INT16_C(-17737), + INT16_C( 14259), INT16_C(-17731), INT16_C(-32114), INT16_C( 10916)), + 0 , + 0 }, + { simde_mm_set_epi16(INT16_C( 5384), INT16_C(-12965), INT16_C( 13105), INT16_C(-27018), + INT16_C(-13574), INT16_C( 6960), INT16_C( 19371), INT16_C( 2501)), + 2 , + simde_mm_set_epi16(INT16_C( -9388), INT16_C( -8440), INT16_C( 2647), INT16_C( 31830), + INT16_C(-31784), INT16_C( 26030), INT16_C(-15221), INT16_C( 32643)), + 8 , + 1 }, + { simde_mm_set_epi16(INT16_C( 22880), INT16_C(-31386), INT16_C(-29408), INT16_C(-16841), + INT16_C( 25902), INT16_C( 12794), INT16_C( 1944), INT16_C(-15869)), + 1 , + simde_mm_set_epi16(INT16_C( 4159), INT16_C(-32442), INT16_C( -5392), INT16_C( 16514), + INT16_C( 2190), INT16_C(-14940), INT16_C( 9287), INT16_C( -7085)), + 3 , + 0 }, + { simde_mm_set_epi16(INT16_C( 168), INT16_C( 12867), INT16_C( 8105), INT16_C( -4416), + INT16_C(-16325), INT16_C( 3793), INT16_C(-13501), INT16_C( 27564)), + 0 , + simde_mm_set_epi16(INT16_C( 12623), INT16_C( -9580), INT16_C( -4773), INT16_C(-15980), + INT16_C( 13302), INT16_C( 85), INT16_C( 103), INT16_C( -39)), + 5 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 131); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 35); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_ranges_8(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi8(INT8_C( -34), INT8_C( 55), INT8_C( 119), INT8_C( 18), + INT8_C( 38), INT8_C( -25), INT8_C( 97), INT8_C( -50), + INT8_C( -6), INT8_C( 22), INT8_C(-124), INT8_C( 112), + INT8_C( 19), INT8_C( -93), INT8_C( 11), INT8_C( -31)), + 13 , + simde_mm_set_epi8(INT8_C( 11), INT8_C( -48), INT8_C( -91), INT8_C(-105), + INT8_C( 89), INT8_C( -32), INT8_C( 51), INT8_C( 75), + INT8_C( -41), INT8_C( -21), INT8_C( 2), INT8_C( -48), + INT8_C( 104), INT8_C(-101), INT8_C( 6), INT8_C(-108)), + 12 , + 0 }, + { simde_mm_set_epi8(INT8_C( -90), INT8_C(-113), INT8_C( 95), INT8_C( -64), + INT8_C( 110), INT8_C( -88), INT8_C( 84), INT8_C(-116), + INT8_C( 13), INT8_C( 123), INT8_C( -37), INT8_C( -24), + INT8_C( -15), INT8_C( 4), INT8_C( -30), INT8_C( 75)), + 16 , + simde_mm_set_epi8(INT8_C( 65), INT8_C( -62), INT8_C( 100), INT8_C( 66), + INT8_C(-121), INT8_C( 57), INT8_C( -73), INT8_C( -13), + INT8_C( 97), INT8_C( -27), INT8_C( 4), INT8_C(-123), + INT8_C( 55), INT8_C( 1), INT8_C( -93), INT8_C( -61)), + 3 , + 0 }, + { simde_mm_set_epi8(INT8_C( -22), INT8_C(-124), INT8_C( 34), INT8_C( -45), + INT8_C(-106), INT8_C( 77), INT8_C(-111), INT8_C( -15), + INT8_C( 12), INT8_C( -65), INT8_C( 59), INT8_C( 62), + INT8_C( 65), INT8_C( -4), INT8_C( 75), INT8_C( -98)), + 1 , + simde_mm_set_epi8(INT8_C( -79), INT8_C( -51), INT8_C( 29), INT8_C( 50), + INT8_C( 2), INT8_C( 108), INT8_C( 48), INT8_C( 26), + INT8_C( 39), INT8_C(-126), INT8_C( 104), INT8_C( -46), + INT8_C( -89), INT8_C( 73), INT8_C( -69), INT8_C( -32)), + 7 , + 0 }, + { simde_mm_set_epi8(INT8_C( 93), INT8_C( 50), INT8_C( -2), INT8_C(-126), + INT8_C( -93), INT8_C( 32), INT8_C( -71), INT8_C( -56), + INT8_C( -99), INT8_C( 24), INT8_C( 50), INT8_C( 125), + INT8_C( -96), INT8_C( -43), INT8_C( -39), INT8_C( 49)), + 1 , + simde_mm_set_epi8(INT8_C( 10), INT8_C(-117), INT8_C(-102), INT8_C( 52), + INT8_C( 103), INT8_C( -70), INT8_C( 39), INT8_C( 103), + INT8_C( 110), INT8_C( 0), INT8_C( -63), INT8_C( 72), + INT8_C( 35), INT8_C( -52), INT8_C( -1), INT8_C( -98)), + 6 , + 0 }, + { simde_mm_set_epi8(INT8_C( -74), INT8_C( 97), INT8_C( -15), INT8_C( -4), + INT8_C( 1), INT8_C( 31), INT8_C( 56), INT8_C(-109), + INT8_C( -34), INT8_C( -16), INT8_C( -40), INT8_C( 21), + INT8_C(-101), INT8_C( -19), INT8_C( 111), INT8_C( 11)), + 6 , + simde_mm_set_epi8(INT8_C( 12), INT8_C(-113), INT8_C(-121), INT8_C( -77), + INT8_C( -51), INT8_C(-101), INT8_C( 46), INT8_C(-119), + INT8_C( 98), INT8_C( -85), INT8_C( 34), INT8_C( -36), + INT8_C( 29), INT8_C( -75), INT8_C( -94), INT8_C(-128)), + 2 , + 0 }, + { simde_mm_set_epi8(INT8_C( -74), INT8_C( 121), INT8_C( -93), INT8_C( -79), + INT8_C( -27), INT8_C( 4), INT8_C(-101), INT8_C( 118), + INT8_C( -20), INT8_C( -91), INT8_C( 64), INT8_C( -42), + INT8_C( 78), INT8_C( 72), INT8_C( -55), INT8_C(-102)), + 7 , + simde_mm_set_epi8(INT8_C( -47), INT8_C( -84), INT8_C( -7), INT8_C( 29), + INT8_C( -19), INT8_C( -39), INT8_C( -83), INT8_C( 55), + INT8_C( -4), INT8_C( 110), INT8_C( 127), INT8_C( 18), + INT8_C( -16), INT8_C( 64), INT8_C( 13), INT8_C( -93)), + 3 , + 0 }, + { simde_mm_set_epi8(INT8_C( 85), INT8_C( 80), INT8_C( 114), INT8_C( 102), + INT8_C( -38), INT8_C( -21), INT8_C( 57), INT8_C( -92), + INT8_C( 43), INT8_C( -80), INT8_C( 79), INT8_C( 81), + INT8_C(-115), INT8_C( 68), INT8_C(-104), INT8_C( 57)), + 15 , + simde_mm_set_epi8(INT8_C( -72), INT8_C( 107), INT8_C(-105), INT8_C( -39), + INT8_C( 65), INT8_C( -90), INT8_C( 61), INT8_C( 83), + INT8_C(-119), INT8_C( 75), INT8_C( -53), INT8_C( 122), + INT8_C( -39), INT8_C( -3), INT8_C( -9), INT8_C( 51)), + 4 , + 0 }, + { simde_mm_set_epi8(INT8_C( -18), INT8_C( 94), INT8_C(-123), INT8_C( -80), + INT8_C( -53), INT8_C( 3), INT8_C( -28), INT8_C( 97), + INT8_C(-103), INT8_C( 50), INT8_C( -36), INT8_C( 121), + INT8_C( 104), INT8_C( -40), INT8_C( -91), INT8_C( 34)), + 16 , + simde_mm_set_epi8(INT8_C(-108), INT8_C( -26), INT8_C( -97), INT8_C( -32), + INT8_C( 48), INT8_C( 39), INT8_C( -10), INT8_C( -64), + INT8_C( 103), INT8_C( -9), INT8_C( 86), INT8_C(-116), + INT8_C( 81), INT8_C(-106), INT8_C( -8), INT8_C(-100)), + 2 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 180); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 166); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_ranges_16(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi16(INT16_C( -8649), INT16_C( 30482), INT16_C( 9959), INT16_C( 25038), + INT16_C( -1514), INT16_C(-31632), INT16_C( 5027), INT16_C( 3041)), + 7 , + simde_mm_set_epi16(INT16_C( 3024), INT16_C(-23145), INT16_C( 23008), INT16_C( 13131), + INT16_C(-10261), INT16_C( 720), INT16_C( 26779), INT16_C( 1684)), + 6 , + 0 }, + { simde_mm_set_epi16(INT16_C(-22897), INT16_C( 24512), INT16_C( 28328), INT16_C( 21644), + INT16_C( 3451), INT16_C( -9240), INT16_C( -3836), INT16_C( -7605)), + 7 , + simde_mm_set_epi16(INT16_C( 16834), INT16_C( 25666), INT16_C(-30919), INT16_C(-18445), + INT16_C( 25061), INT16_C( 1157), INT16_C( 14081), INT16_C(-23613)), + 0 , + 0 }, + { simde_mm_set_epi16(INT16_C( -5500), INT16_C( 8915), INT16_C(-27059), INT16_C(-28175), + INT16_C( 3263), INT16_C( 15166), INT16_C( 16892), INT16_C( 19358)), + 2 , + simde_mm_set_epi16(INT16_C(-20019), INT16_C( 7474), INT16_C( 620), INT16_C( 12314), + INT16_C( 10114), INT16_C( 26834), INT16_C(-22711), INT16_C(-17440)), + 6 , + 0 }, + { simde_mm_set_epi16(INT16_C( 23858), INT16_C( -382), INT16_C(-23776), INT16_C(-17976), + INT16_C(-25320), INT16_C( 12925), INT16_C(-24363), INT16_C( -9935)), + 2 , + simde_mm_set_epi16(INT16_C( 2699), INT16_C(-26060), INT16_C( 26554), INT16_C( 10087), + INT16_C( 28160), INT16_C(-16056), INT16_C( 9164), INT16_C( -98)), + 0 , + 0 }, + { simde_mm_set_epi16(INT16_C(-18847), INT16_C( -3588), INT16_C( 287), INT16_C( 14483), + INT16_C( -8464), INT16_C(-10219), INT16_C(-25619), INT16_C( 28427)), + 8 , + simde_mm_set_epi16(INT16_C( 3215), INT16_C(-30797), INT16_C(-12901), INT16_C( 11913), + INT16_C( 25259), INT16_C( 8924), INT16_C( 7605), INT16_C(-23936)), + 1 , + 0 }, + { simde_mm_set_epi16(INT16_C(-18823), INT16_C(-23631), INT16_C( -6908), INT16_C(-25738), + INT16_C( -4955), INT16_C( 16598), INT16_C( 20040), INT16_C(-13926)), + 1 , + simde_mm_set_epi16(INT16_C(-11860), INT16_C( -1763), INT16_C( -4647), INT16_C(-21193), + INT16_C( -914), INT16_C( 32530), INT16_C( -4032), INT16_C( 3491)), + 1 , + 0 }, + { simde_mm_set_epi16(INT16_C( 21840), INT16_C( 29286), INT16_C( -9493), INT16_C( 14756), + INT16_C( 11184), INT16_C( 20305), INT16_C(-29372), INT16_C(-26567)), + 4 , + simde_mm_set_epi16(INT16_C(-18325), INT16_C(-26663), INT16_C( 16806), INT16_C( 15699), + INT16_C(-30389), INT16_C(-13446), INT16_C( -9731), INT16_C( -2253)), + 5 , + 0 }, + { simde_mm_set_epi16(INT16_C( -4514), INT16_C(-31312), INT16_C(-13565), INT16_C( -7071), + INT16_C(-26318), INT16_C( -9095), INT16_C( 26840), INT16_C(-23262)), + 7 , + simde_mm_set_epi16(INT16_C(-27418), INT16_C(-24608), INT16_C( 12327), INT16_C( -2368), + INT16_C( 26615), INT16_C( 22156), INT16_C( 20886), INT16_C( -1892)), + 1 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 181); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 167); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_equaleach_8(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi8(INT8_C( 104), INT8_C( 45), INT8_C(-103), INT8_C( 60), + INT8_C( 59), INT8_C( -21), INT8_C( -89), INT8_C( 38), + INT8_C( 54), INT8_C( -46), INT8_C( -19), INT8_C( -27), + INT8_C(-110), INT8_C( -10), INT8_C(-116), INT8_C( -14)), + 2 , + simde_mm_set_epi8(INT8_C( 85), INT8_C( -86), INT8_C( -22), INT8_C( 62), + INT8_C( -58), INT8_C( 31), INT8_C( 47), INT8_C(-115), + INT8_C( 33), INT8_C( 51), INT8_C(-126), INT8_C( -9), + INT8_C( 78), INT8_C(-109), INT8_C(-106), INT8_C(-100)), + 3 , + 0 }, + { simde_mm_set_epi8(INT8_C( -99), INT8_C( -76), INT8_C( 46), INT8_C( 124), + INT8_C(-100), INT8_C(-109), INT8_C( -38), INT8_C( 23), + INT8_C( 25), INT8_C(-111), INT8_C( 39), INT8_C( -15), + INT8_C( 31), INT8_C( 79), INT8_C( -73), INT8_C( -37)), + 10 , + simde_mm_set_epi8(INT8_C( -93), INT8_C( -93), INT8_C( -58), INT8_C( -4), + INT8_C( 91), INT8_C( -91), INT8_C(-110), INT8_C( -71), + INT8_C( 2), INT8_C( 70), INT8_C( 6), INT8_C( 33), + INT8_C( -57), INT8_C( 120), INT8_C( 39), INT8_C( -91)), + 3 , + 0 }, + { simde_mm_set_epi8(INT8_C(-106), INT8_C( -72), INT8_C( -66), INT8_C( 85), + INT8_C( 14), INT8_C( 5), INT8_C( 121), INT8_C(-100), + INT8_C( 54), INT8_C( 44), INT8_C(-117), INT8_C( 34), + INT8_C(-128), INT8_C( 108), INT8_C( -35), INT8_C( -66)), + 9 , + simde_mm_set_epi8(INT8_C( -54), INT8_C( 20), INT8_C( -99), INT8_C( 104), + INT8_C( -75), INT8_C( -44), INT8_C( 31), INT8_C( 111), + INT8_C( 6), INT8_C( 118), INT8_C(-125), INT8_C( 98), + INT8_C( 79), INT8_C( -13), INT8_C( 70), INT8_C(-107)), + 7 , + 0 }, + { simde_mm_set_epi8(INT8_C( 87), INT8_C( 38), INT8_C( 37), INT8_C( 45), + INT8_C( -14), INT8_C(-128), INT8_C(-127), INT8_C( -52), + INT8_C( -53), INT8_C(-119), INT8_C( 101), INT8_C( 67), + INT8_C( -64), INT8_C( 2), INT8_C( 18), INT8_C( 14)), + 10 , + simde_mm_set_epi8(INT8_C( 73), INT8_C(-125), INT8_C( -85), INT8_C(-127), + INT8_C( -54), INT8_C( 96), INT8_C( -46), INT8_C( -92), + INT8_C( -88), INT8_C( -50), INT8_C( -90), INT8_C(-114), + INT8_C( -6), INT8_C( 24), INT8_C( 18), INT8_C( -93)), + 6 , + 0 }, + { simde_mm_set_epi8(INT8_C( 84), INT8_C( 20), INT8_C( 43), INT8_C( -23), + INT8_C( 120), INT8_C( -64), INT8_C( 87), INT8_C( 8), + INT8_C( 93), INT8_C( -84), INT8_C( -73), INT8_C( 127), + INT8_C( 3), INT8_C( 77), INT8_C( 55), INT8_C( -4)), + 2 , + simde_mm_set_epi8(INT8_C( -84), INT8_C( -4), INT8_C( 15), INT8_C( -61), + INT8_C( 78), INT8_C(-100), INT8_C( -84), INT8_C( 48), + INT8_C( -11), INT8_C( -55), INT8_C( 4), INT8_C( -62), + INT8_C( 13), INT8_C( -72), INT8_C( 23), INT8_C( 51)), + 8 , + 0 }, + { simde_mm_set_epi8(INT8_C( -48), INT8_C(-107), INT8_C(-122), INT8_C( 83), + INT8_C( -44), INT8_C( 85), INT8_C( 23), INT8_C( -91), + INT8_C( 58), INT8_C( -36), INT8_C( 22), INT8_C( 51), + INT8_C( 125), INT8_C( 127), INT8_C( 84), INT8_C( 89)), + 16 , + simde_mm_set_epi8(INT8_C( 86), INT8_C( 71), INT8_C( 89), INT8_C( -27), + INT8_C( -90), INT8_C( 97), INT8_C( -65), INT8_C( -2), + INT8_C( 97), INT8_C(-100), INT8_C( 124), INT8_C( 64), + INT8_C( 53), INT8_C( 30), INT8_C( 67), INT8_C( 24)), + 14 , + 0 }, + { simde_mm_set_epi8(INT8_C( -70), INT8_C(-102), INT8_C( -95), INT8_C( -58), + INT8_C( 26), INT8_C(-106), INT8_C( -20), INT8_C( -94), + INT8_C( 78), INT8_C( 30), INT8_C( 112), INT8_C( 86), + INT8_C( 33), INT8_C( -9), INT8_C( -10), INT8_C( 45)), + 0 , + simde_mm_set_epi8(INT8_C( -23), INT8_C( 29), INT8_C( 101), INT8_C( -51), + INT8_C( 127), INT8_C( 106), INT8_C( -81), INT8_C( -9), + INT8_C( -63), INT8_C( -64), INT8_C(-124), INT8_C( -53), + INT8_C(-109), INT8_C(-124), INT8_C( 92), INT8_C( 17)), + 12 , + 0 }, + { simde_mm_set_epi8(INT8_C( 59), INT8_C( -32), INT8_C( 53), INT8_C( -45), + INT8_C( -90), INT8_C( 78), INT8_C( -25), INT8_C( -64), + INT8_C( -85), INT8_C( 93), INT8_C( -54), INT8_C( -80), + INT8_C( -30), INT8_C( -12), INT8_C( 117), INT8_C( -17)), + 4 , + simde_mm_set_epi8(INT8_C( 10), INT8_C( 50), INT8_C( -31), INT8_C( 58), + INT8_C( -16), INT8_C( 99), INT8_C( 60), INT8_C( 77), + INT8_C( 86), INT8_C( 98), INT8_C( -78), INT8_C( -60), + INT8_C( 106), INT8_C( -44), INT8_C( 59), INT8_C( -43)), + 2 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 154); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 186); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_equaleach_16(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi16(INT16_C( 26669), INT16_C(-26308), INT16_C( 15339), INT16_C(-22746), + INT16_C( 14034), INT16_C( -4635), INT16_C(-27914), INT16_C(-29454)), + 5 , + simde_mm_set_epi16(INT16_C( 21930), INT16_C( -5570), INT16_C(-14817), INT16_C( 12173), + INT16_C( 8499), INT16_C(-32009), INT16_C( 20115), INT16_C(-26980)), + 2 , + 0 }, + { simde_mm_set_epi16(INT16_C(-25164), INT16_C( 11900), INT16_C(-25453), INT16_C( -9705), + INT16_C( 6545), INT16_C( 10225), INT16_C( 8015), INT16_C(-18469)), + 8 , + simde_mm_set_epi16(INT16_C(-23645), INT16_C(-14596), INT16_C( 23461), INT16_C(-27975), + INT16_C( 582), INT16_C( 1569), INT16_C(-14472), INT16_C( 10149)), + 4 , + 0 }, + { simde_mm_set_epi16(INT16_C(-26952), INT16_C(-16811), INT16_C( 3589), INT16_C( 31132), + INT16_C( 13868), INT16_C(-29918), INT16_C(-32660), INT16_C( -8770)), + 8 , + simde_mm_set_epi16(INT16_C(-13804), INT16_C(-25240), INT16_C(-18988), INT16_C( 8047), + INT16_C( 1654), INT16_C(-31902), INT16_C( 20467), INT16_C( 18069)), + 0 , + 0 }, + { simde_mm_set_epi16(INT16_C( 22310), INT16_C( 9517), INT16_C( -3456), INT16_C(-32308), + INT16_C(-13431), INT16_C( 25923), INT16_C(-16382), INT16_C( 4622)), + 1 , + simde_mm_set_epi16(INT16_C( 18819), INT16_C(-21631), INT16_C(-13728), INT16_C(-11612), + INT16_C(-22322), INT16_C(-22898), INT16_C( -1512), INT16_C( 4771)), + 2 , + 0 }, + { simde_mm_set_epi16(INT16_C( 21524), INT16_C( 11241), INT16_C( 30912), INT16_C( 22280), + INT16_C( 23980), INT16_C(-18561), INT16_C( 845), INT16_C( 14332)), + 2 , + simde_mm_set_epi16(INT16_C(-21252), INT16_C( 4035), INT16_C( 20124), INT16_C(-21456), + INT16_C( -2615), INT16_C( 1218), INT16_C( 3512), INT16_C( 5939)), + 2 , + 0 }, + { simde_mm_set_epi16(INT16_C(-12139), INT16_C(-31149), INT16_C(-11179), INT16_C( 6053), + INT16_C( 15068), INT16_C( 5683), INT16_C( 32127), INT16_C( 21593)), + 8 , + simde_mm_set_epi16(INT16_C( 22087), INT16_C( 23013), INT16_C(-22943), INT16_C(-16386), + INT16_C( 24988), INT16_C( 31808), INT16_C( 13598), INT16_C( 17176)), + 0 , + 0 }, + { simde_mm_set_epi16(INT16_C(-17766), INT16_C(-24122), INT16_C( 6806), INT16_C( -4958), + INT16_C( 19998), INT16_C( 28758), INT16_C( 8695), INT16_C( -2515)), + 6 , + simde_mm_set_epi16(INT16_C( -5859), INT16_C( 26061), INT16_C( 32618), INT16_C(-20489), + INT16_C(-15936), INT16_C(-31541), INT16_C(-27772), INT16_C( 23569)), + 3 , + 0 }, + { simde_mm_set_epi16(INT16_C( 15328), INT16_C( 13779), INT16_C(-22962), INT16_C( -6208), + INT16_C(-21667), INT16_C(-13648), INT16_C( -7436), INT16_C( 30191)), + 1 , + simde_mm_set_epi16(INT16_C( 2610), INT16_C( -7878), INT16_C( -3997), INT16_C( 15437), + INT16_C( 22114), INT16_C(-19772), INT16_C( 27348), INT16_C( 15317)), + 0 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 155); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 187); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_equalordered_8(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi8(INT8_C(-102), INT8_C(-119), INT8_C(-101), INT8_C( 25), + INT8_C( -97), INT8_C( 51), INT8_C( -13), INT8_C( 27), + INT8_C( -59), INT8_C( -13), INT8_C( 104), INT8_C( 72), + INT8_C( -47), INT8_C( -89), INT8_C( -3), INT8_C( 92)), + 7 , + simde_mm_set_epi8(INT8_C( -65), INT8_C( 103), INT8_C( 35), INT8_C( -65), + INT8_C( -44), INT8_C( -77), INT8_C( 71), INT8_C(-110), + INT8_C( -79), INT8_C( 110), INT8_C( -72), INT8_C( 5), + INT8_C( 27), INT8_C( 63), INT8_C(-122), INT8_C( -52)), + 0 , + 0 }, + { simde_mm_set_epi8(INT8_C( 126), INT8_C( 122), INT8_C( 43), INT8_C( 46), + INT8_C( -78), INT8_C(-116), INT8_C( -20), INT8_C( 122), + INT8_C( -15), INT8_C( 54), INT8_C( 16), INT8_C( 80), + INT8_C( 126), INT8_C( -66), INT8_C( -13), INT8_C( -52)), + 2 , + simde_mm_set_epi8(INT8_C( 23), INT8_C( 45), INT8_C( -30), INT8_C( -32), + INT8_C( -70), INT8_C( -11), INT8_C( -82), INT8_C(-100), + INT8_C( -41), INT8_C( 20), INT8_C( -81), INT8_C( 40), + INT8_C( 12), INT8_C( -32), INT8_C( -37), INT8_C( 1)), + 0 , + 0 }, + { simde_mm_set_epi8(INT8_C( -84), INT8_C( 40), INT8_C( 97), INT8_C(-127), + INT8_C( -46), INT8_C( 44), INT8_C( 90), INT8_C( -40), + INT8_C(-117), INT8_C(-116), INT8_C( 31), INT8_C(-114), + INT8_C( -58), INT8_C( -81), INT8_C( 33), INT8_C( -28)), + 5 , + simde_mm_set_epi8(INT8_C(-112), INT8_C( 9), INT8_C( 37), INT8_C( 124), + INT8_C( -60), INT8_C( 98), INT8_C( 71), INT8_C(-101), + INT8_C( -80), INT8_C( 56), INT8_C( -54), INT8_C( 2), + INT8_C( 69), INT8_C( 19), INT8_C( 104), INT8_C( 11)), + 8 , + 0 }, + { simde_mm_set_epi8(INT8_C( -33), INT8_C(-112), INT8_C( -58), INT8_C( 97), + INT8_C( 70), INT8_C( 73), INT8_C( -48), INT8_C( 78), + INT8_C( -31), INT8_C( -77), INT8_C( 95), INT8_C( -11), + INT8_C( 81), INT8_C( 114), INT8_C( 18), INT8_C( -52)), + 14 , + simde_mm_set_epi8(INT8_C( -65), INT8_C( -59), INT8_C(-121), INT8_C( 38), + INT8_C( -91), INT8_C( 122), INT8_C( -65), INT8_C( 83), + INT8_C( -62), INT8_C( -49), INT8_C( -36), INT8_C( 23), + INT8_C( 126), INT8_C( 69), INT8_C( 50), INT8_C(-105)), + 6 , + 0 }, + { simde_mm_set_epi8(INT8_C( -1), INT8_C( 126), INT8_C( 22), INT8_C( -56), + INT8_C( 64), INT8_C( 33), INT8_C( 47), INT8_C( 125), + INT8_C( 111), INT8_C(-101), INT8_C( 40), INT8_C(-110), + INT8_C( 38), INT8_C( 28), INT8_C( -57), INT8_C(-103)), + 13 , + simde_mm_set_epi8(INT8_C( 117), INT8_C(-113), INT8_C(-111), INT8_C(-126), + INT8_C( -26), INT8_C( 93), INT8_C( 33), INT8_C( -8), + INT8_C(-104), INT8_C(-113), INT8_C( -41), INT8_C( 8), + INT8_C(-128), INT8_C(-109), INT8_C( -88), INT8_C( -14)), + 15 , + 0 }, + { simde_mm_set_epi8(INT8_C( -72), INT8_C( 29), INT8_C( 23), INT8_C( -45), + INT8_C( -82), INT8_C( 97), INT8_C( 53), INT8_C( 64), + INT8_C( -92), INT8_C( 22), INT8_C( 89), INT8_C( 107), + INT8_C( 71), INT8_C( 89), INT8_C( 49), INT8_C( -3)), + 2 , + simde_mm_set_epi8(INT8_C( -20), INT8_C(-126), INT8_C( 89), INT8_C( -25), + INT8_C( -3), INT8_C( -23), INT8_C( -76), INT8_C( 24), + INT8_C( -92), INT8_C( 94), INT8_C( -84), INT8_C( 42), + INT8_C( 106), INT8_C( -45), INT8_C( 94), INT8_C( 76)), + 3 , + 0 }, + { simde_mm_set_epi8(INT8_C( 25), INT8_C( -24), INT8_C( 85), INT8_C( 13), + INT8_C( 46), INT8_C( 2), INT8_C( 41), INT8_C( 27), + INT8_C( 58), INT8_C( -15), INT8_C( -58), INT8_C( -32), + INT8_C( 100), INT8_C( 93), INT8_C( 37), INT8_C( 106)), + 2 , + simde_mm_set_epi8(INT8_C( -80), INT8_C( -82), INT8_C( 6), INT8_C( 8), + INT8_C( 117), INT8_C( -76), INT8_C( 125), INT8_C( 8), + INT8_C( -12), INT8_C( 103), INT8_C( 86), INT8_C(-109), + INT8_C( 53), INT8_C( 94), INT8_C(-109), INT8_C( -38)), + 16 , + 1 }, + { simde_mm_set_epi8(INT8_C( -43), INT8_C( -41), INT8_C( -34), INT8_C( 43), + INT8_C( -40), INT8_C( 97), INT8_C( -80), INT8_C( 15), + INT8_C( -23), INT8_C( -9), INT8_C(-115), INT8_C( -24), + INT8_C( 56), INT8_C( 36), INT8_C( -77), INT8_C( 105)), + 10 , + simde_mm_set_epi8(INT8_C( -9), INT8_C(-106), INT8_C( -81), INT8_C( 0), + INT8_C(-123), INT8_C( -15), INT8_C( 126), INT8_C( -6), + INT8_C( 15), INT8_C( -95), INT8_C( -10), INT8_C( 80), + INT8_C( -79), INT8_C( 46), INT8_C(-121), INT8_C(-122)), + 14 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 252); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 62); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_equalordered_16(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi16(INT16_C(-25975), INT16_C(-25831), INT16_C(-24781), INT16_C( -3301), + INT16_C(-14861), INT16_C( 26696), INT16_C(-11865), INT16_C( -676)), + 8 , + simde_mm_set_epi16(INT16_C(-16537), INT16_C( 9151), INT16_C(-11085), INT16_C( 18322), + INT16_C(-20114), INT16_C(-18427), INT16_C( 6975), INT16_C(-31028)), + 7 , + 0 }, + { simde_mm_set_epi16(INT16_C( 32378), INT16_C( 11054), INT16_C(-19828), INT16_C( -4998), + INT16_C( -3786), INT16_C( 4176), INT16_C( 32446), INT16_C( -3124)), + 7 , + simde_mm_set_epi16(INT16_C( 5933), INT16_C( -7456), INT16_C(-17675), INT16_C(-20836), + INT16_C(-10476), INT16_C(-20696), INT16_C( 3296), INT16_C( -9471)), + 8 , + 1 }, + { simde_mm_set_epi16(INT16_C(-21464), INT16_C( 24961), INT16_C(-11732), INT16_C( 23256), + INT16_C(-29812), INT16_C( 8078), INT16_C(-14673), INT16_C( 8676)), + 0 , + simde_mm_set_epi16(INT16_C(-28663), INT16_C( 9596), INT16_C(-15262), INT16_C( 18331), + INT16_C(-20424), INT16_C(-13822), INT16_C( 17683), INT16_C( 26635)), + 8 , + 1 }, + { simde_mm_set_epi16(INT16_C( -8304), INT16_C(-14751), INT16_C( 17993), INT16_C(-12210), + INT16_C( -7757), INT16_C( 24565), INT16_C( 20850), INT16_C( 4812)), + 1 , + simde_mm_set_epi16(INT16_C(-16443), INT16_C(-30938), INT16_C(-23174), INT16_C(-16557), + INT16_C(-15665), INT16_C( -9193), INT16_C( 32325), INT16_C( 12951)), + 8 , + 1 }, + { simde_mm_set_epi16(INT16_C( -130), INT16_C( 5832), INT16_C( 16417), INT16_C( 12157), + INT16_C( 28571), INT16_C( 10386), INT16_C( 9756), INT16_C(-14439)), + 0 , + simde_mm_set_epi16(INT16_C( 30095), INT16_C(-28286), INT16_C( -6563), INT16_C( 8696), + INT16_C(-26481), INT16_C(-10488), INT16_C(-32621), INT16_C(-22286)), + 8 , + 1 }, + { simde_mm_set_epi16(INT16_C(-18403), INT16_C( 6099), INT16_C(-20895), INT16_C( 13632), + INT16_C(-23530), INT16_C( 22891), INT16_C( 18265), INT16_C( 12797)), + 2 , + simde_mm_set_epi16(INT16_C( -4990), INT16_C( 23015), INT16_C( -535), INT16_C(-19432), + INT16_C(-23458), INT16_C(-21462), INT16_C( 27347), INT16_C( 24140)), + 8 , + 1 }, + { simde_mm_set_epi16(INT16_C( 6632), INT16_C( 21773), INT16_C( 11778), INT16_C( 10523), + INT16_C( 15089), INT16_C(-14624), INT16_C( 25693), INT16_C( 9578)), + 6 , + simde_mm_set_epi16(INT16_C(-20306), INT16_C( 1544), INT16_C( 30132), INT16_C( 32008), + INT16_C( -2969), INT16_C( 22163), INT16_C( 13662), INT16_C(-27686)), + 2 , + 0 }, + { simde_mm_set_epi16(INT16_C(-10793), INT16_C( -8661), INT16_C(-10143), INT16_C(-20465), + INT16_C( -5641), INT16_C(-29208), INT16_C( 14372), INT16_C(-19607)), + 2 , + simde_mm_set_epi16(INT16_C( -2154), INT16_C(-20736), INT16_C(-31247), INT16_C( 32506), + INT16_C( 4001), INT16_C( -2480), INT16_C(-20178), INT16_C(-30842)), + 4 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 253); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 63); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_dontnegate_8(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi8(INT8_C( -63), INT8_C( 111), INT8_C(-101), INT8_C( 37), + INT8_C( 25), INT8_C( 2), INT8_C( -58), INT8_C( 59), + INT8_C(-120), INT8_C( 113), INT8_C( -71), INT8_C( -78), + INT8_C( 112), INT8_C( 20), INT8_C( 10), INT8_C( 32)), + 8 , + simde_mm_set_epi8(INT8_C( -13), INT8_C( -95), INT8_C( -96), INT8_C( -92), + INT8_C( 41), INT8_C(-109), INT8_C( 100), INT8_C( -60), + INT8_C( -62), INT8_C( 117), INT8_C( 43), INT8_C(-124), + INT8_C( 19), INT8_C( 13), INT8_C( -54), INT8_C(-115)), + 9 , + 0 }, + { simde_mm_set_epi8(INT8_C( -39), INT8_C( 82), INT8_C( 11), INT8_C( 66), + INT8_C( -42), INT8_C( -56), INT8_C(-101), INT8_C( 92), + INT8_C( -50), INT8_C( -83), INT8_C( -4), INT8_C( -26), + INT8_C( 15), INT8_C( 48), INT8_C( -29), INT8_C( -74)), + 5 , + simde_mm_set_epi8(INT8_C( -17), INT8_C( -18), INT8_C( 58), INT8_C( -13), + INT8_C( 48), INT8_C( 40), INT8_C( -98), INT8_C( -77), + INT8_C( 16), INT8_C(-119), INT8_C( 3), INT8_C( 90), + INT8_C( 49), INT8_C( 59), INT8_C( 91), INT8_C( -83)), + 2 , + 0 }, + { simde_mm_set_epi8(INT8_C( 95), INT8_C( -83), INT8_C( 52), INT8_C( 92), + INT8_C( 26), INT8_C( -59), INT8_C( 47), INT8_C(-113), + INT8_C( 68), INT8_C( 29), INT8_C( 0), INT8_C( -57), + INT8_C( -55), INT8_C( 52), INT8_C( 31), INT8_C( -85)), + 7 , + simde_mm_set_epi8(INT8_C( 66), INT8_C( 34), INT8_C( -78), INT8_C( -31), + INT8_C( 64), INT8_C( 104), INT8_C( 104), INT8_C(-105), + INT8_C( 89), INT8_C( -39), INT8_C( 1), INT8_C( 120), + INT8_C( 7), INT8_C( 123), INT8_C( 8), INT8_C( -33)), + 13 , + 0 }, + { simde_mm_set_epi8(INT8_C(-102), INT8_C( 101), INT8_C(-126), INT8_C( 58), + INT8_C( 65), INT8_C( 18), INT8_C( 6), INT8_C( 71), + INT8_C( 43), INT8_C( 26), INT8_C(-117), INT8_C( 126), + INT8_C( -21), INT8_C( -55), INT8_C( 84), INT8_C(-117)), + 8 , + simde_mm_set_epi8(INT8_C( 16), INT8_C(-128), INT8_C( -62), INT8_C( 24), + INT8_C(-120), INT8_C( 12), INT8_C( 91), INT8_C(-117), + INT8_C( -62), INT8_C(-124), INT8_C( 51), INT8_C( 68), + INT8_C( -85), INT8_C( 37), INT8_C( 12), INT8_C(-109)), + 7 , + 0 }, + { simde_mm_set_epi8(INT8_C( -13), INT8_C( 114), INT8_C( 57), INT8_C( 47), + INT8_C( 121), INT8_C( -3), INT8_C( 77), INT8_C( -95), + INT8_C( -92), INT8_C( 26), INT8_C( -68), INT8_C(-114), + INT8_C(-117), INT8_C( 120), INT8_C( 118), INT8_C( -91)), + 4 , + simde_mm_set_epi8(INT8_C( -32), INT8_C( 61), INT8_C(-127), INT8_C( -80), + INT8_C(-105), INT8_C( 37), INT8_C( 18), INT8_C( -37), + INT8_C( -13), INT8_C( -28), INT8_C( 93), INT8_C( -63), + INT8_C( -83), INT8_C( -67), INT8_C( 86), INT8_C( 35)), + 14 , + 0 }, + { simde_mm_set_epi8(INT8_C( 16), INT8_C( 126), INT8_C( -44), INT8_C( -42), + INT8_C( 82), INT8_C( -38), INT8_C( -5), INT8_C( -74), + INT8_C( -5), INT8_C( -44), INT8_C( 17), INT8_C( 41), + INT8_C( -91), INT8_C( -81), INT8_C( -82), INT8_C( -39)), + 11 , + simde_mm_set_epi8(INT8_C( -99), INT8_C( 19), INT8_C( -27), INT8_C( -91), + INT8_C( 8), INT8_C( -6), INT8_C( 88), INT8_C( 43), + INT8_C( 41), INT8_C( 46), INT8_C( 121), INT8_C( -38), + INT8_C( 33), INT8_C( -96), INT8_C( 12), INT8_C(-109)), + 6 , + 0 }, + { simde_mm_set_epi8(INT8_C( -44), INT8_C( 116), INT8_C( 25), INT8_C(-117), + INT8_C( -24), INT8_C( 95), INT8_C( -55), INT8_C(-118), + INT8_C( 16), INT8_C( 8), INT8_C( -78), INT8_C( 94), + INT8_C( -94), INT8_C( 90), INT8_C( 27), INT8_C( 41)), + 9 , + simde_mm_set_epi8(INT8_C( 124), INT8_C( -31), INT8_C( -11), INT8_C( 9), + INT8_C( -78), INT8_C( -38), INT8_C( 121), INT8_C(-126), + INT8_C( -43), INT8_C(-119), INT8_C( 36), INT8_C(-101), + INT8_C( 73), INT8_C( 1), INT8_C( 88), INT8_C( 59)), + 12 , + 0 }, + { simde_mm_set_epi8(INT8_C( -55), INT8_C( -13), INT8_C( 52), INT8_C( -40), + INT8_C(-124), INT8_C( -43), INT8_C( -28), INT8_C( 79), + INT8_C( -20), INT8_C( 11), INT8_C( 25), INT8_C( 77), + INT8_C( -31), INT8_C( -79), INT8_C( 41), INT8_C( -61)), + 14 , + simde_mm_set_epi8(INT8_C( 24), INT8_C( 103), INT8_C( -54), INT8_C( -31), + INT8_C( 97), INT8_C( -29), INT8_C( -3), INT8_C( -32), + INT8_C( -55), INT8_C( 73), INT8_C( 126), INT8_C( 68), + INT8_C( -79), INT8_C( 11), INT8_C( -48), INT8_C( -32)), + 13 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 96); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 134); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_dontnegate_16(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi16(INT16_C(-16017), INT16_C(-25819), INT16_C( 6402), INT16_C(-14789), + INT16_C(-30607), INT16_C(-17998), INT16_C( 28692), INT16_C( 2592)), + 7 , + simde_mm_set_epi16(INT16_C( -3167), INT16_C(-24412), INT16_C( 10643), INT16_C( 25796), + INT16_C(-15755), INT16_C( 11140), INT16_C( 4877), INT16_C(-13683)), + 8 , + 1 }, + { simde_mm_set_epi16(INT16_C( -9902), INT16_C( 2882), INT16_C(-10552), INT16_C(-25764), + INT16_C(-12627), INT16_C( -794), INT16_C( 3888), INT16_C( -7242)), + 4 , + simde_mm_set_epi16(INT16_C( -4114), INT16_C( 15091), INT16_C( 12328), INT16_C(-24909), + INT16_C( 4233), INT16_C( 858), INT16_C( 12603), INT16_C( 23469)), + 0 , + 0 }, + { simde_mm_set_epi16(INT16_C( 24493), INT16_C( 13404), INT16_C( 6853), INT16_C( 12175), + INT16_C( 17437), INT16_C( 199), INT16_C(-14028), INT16_C( 8107)), + 1 , + simde_mm_set_epi16(INT16_C( 16930), INT16_C(-19743), INT16_C( 16488), INT16_C( 26775), + INT16_C( 23001), INT16_C( 376), INT16_C( 1915), INT16_C( 2271)), + 3 , + 0 }, + { simde_mm_set_epi16(INT16_C(-26011), INT16_C(-32198), INT16_C( 16658), INT16_C( 1607), + INT16_C( 11034), INT16_C(-29826), INT16_C( -5175), INT16_C( 21643)), + 7 , + simde_mm_set_epi16(INT16_C( 4224), INT16_C(-15848), INT16_C(-30708), INT16_C( 23435), + INT16_C(-15740), INT16_C( 13124), INT16_C(-21723), INT16_C( 3219)), + 8 , + 1 }, + { simde_mm_set_epi16(INT16_C( -3214), INT16_C( 14639), INT16_C( 31229), INT16_C( 19873), + INT16_C(-23526), INT16_C(-17266), INT16_C(-29832), INT16_C( 30373)), + 3 , + simde_mm_set_epi16(INT16_C( -8131), INT16_C(-32336), INT16_C(-26843), INT16_C( 4827), + INT16_C( -3100), INT16_C( 24001), INT16_C(-21059), INT16_C( 22051)), + 6 , + 0 }, + { simde_mm_set_epi16(INT16_C( 4222), INT16_C(-11050), INT16_C( 21210), INT16_C( -1098), + INT16_C( -1068), INT16_C( 4393), INT16_C(-23121), INT16_C(-20775)), + 8 , + simde_mm_set_epi16(INT16_C(-25325), INT16_C( -6747), INT16_C( 2298), INT16_C( 22571), + INT16_C( 10542), INT16_C( 31194), INT16_C( 8608), INT16_C( 3219)), + 3 , + 0 }, + { simde_mm_set_epi16(INT16_C(-11148), INT16_C( 6539), INT16_C( -6049), INT16_C(-13942), + INT16_C( 4104), INT16_C(-19874), INT16_C(-23974), INT16_C( 6953)), + 5 , + simde_mm_set_epi16(INT16_C( 31969), INT16_C( -2807), INT16_C(-19750), INT16_C( 31106), + INT16_C(-10871), INT16_C( 9371), INT16_C( 18689), INT16_C( 22587)), + 0 , + 0 }, + { simde_mm_set_epi16(INT16_C(-13837), INT16_C( 13528), INT16_C(-31531), INT16_C( -7089), + INT16_C( -5109), INT16_C( 6477), INT16_C( -7759), INT16_C( 10691)), + 6 , + simde_mm_set_epi16(INT16_C( 6247), INT16_C(-13599), INT16_C( 25059), INT16_C( -544), + INT16_C(-14007), INT16_C( 32324), INT16_C(-20213), INT16_C(-12064)), + 0 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 97); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 135); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_negatevalid_8(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi8(INT8_C( 105), INT8_C( -51), INT8_C( 67), INT8_C( -50), + INT8_C( -16), INT8_C( 21), INT8_C( -10), INT8_C( 17), + INT8_C( -27), INT8_C( -18), INT8_C( 46), INT8_C( -40), + INT8_C(-114), INT8_C(-100), INT8_C( 64), INT8_C( 115)), + 12 , + simde_mm_set_epi8(INT8_C( 25), INT8_C( -3), INT8_C(-126), INT8_C( 66), + INT8_C( -15), INT8_C( -56), INT8_C(-121), INT8_C( -28), + INT8_C( -65), INT8_C( -86), INT8_C( 10), INT8_C( 100), + INT8_C( -73), INT8_C( -67), INT8_C( 67), INT8_C( -87)), + 16 , + 1 }, + { simde_mm_set_epi8(INT8_C(-124), INT8_C( 52), INT8_C( -91), INT8_C( -68), + INT8_C(-119), INT8_C( -52), INT8_C( 81), INT8_C( 38), + INT8_C( -66), INT8_C( 72), INT8_C( 111), INT8_C( 36), + INT8_C( 50), INT8_C(-110), INT8_C( 82), INT8_C( 85)), + 15 , + simde_mm_set_epi8(INT8_C( 126), INT8_C( 110), INT8_C(-109), INT8_C(-116), + INT8_C( -72), INT8_C( -92), INT8_C( 119), INT8_C( -28), + INT8_C( 24), INT8_C( 24), INT8_C( 82), INT8_C( 40), + INT8_C( 15), INT8_C( 93), INT8_C( 109), INT8_C( -68)), + 0 , + 0 }, + { simde_mm_set_epi8(INT8_C( 65), INT8_C( 68), INT8_C( 100), INT8_C( -21), + INT8_C(-128), INT8_C( 105), INT8_C( -98), INT8_C( -65), + INT8_C( -96), INT8_C( -78), INT8_C( 112), INT8_C( 43), + INT8_C(-101), INT8_C( 15), INT8_C(-108), INT8_C( -70)), + 12 , + simde_mm_set_epi8(INT8_C( -2), INT8_C( -34), INT8_C( -9), INT8_C( -32), + INT8_C( -52), INT8_C(-127), INT8_C(-124), INT8_C( 127), + INT8_C( -71), INT8_C(-112), INT8_C( 58), INT8_C( 125), + INT8_C( 60), INT8_C( -78), INT8_C( -99), INT8_C( -62)), + 9 , + 0 }, + { simde_mm_set_epi8(INT8_C( 68), INT8_C( -87), INT8_C( -84), INT8_C( 69), + INT8_C( -79), INT8_C( -24), INT8_C( -86), INT8_C( -49), + INT8_C( 24), INT8_C( 119), INT8_C( -55), INT8_C( -67), + INT8_C( 3), INT8_C(-106), INT8_C( 103), INT8_C( 33)), + 5 , + simde_mm_set_epi8(INT8_C( 126), INT8_C( -29), INT8_C( -26), INT8_C( -70), + INT8_C( 117), INT8_C( 13), INT8_C( 68), INT8_C( 51), + INT8_C( -33), INT8_C( -65), INT8_C( 30), INT8_C( -98), + INT8_C( -31), INT8_C( 111), INT8_C( 69), INT8_C( -86)), + 9 , + 0 }, + { simde_mm_set_epi8(INT8_C( -35), INT8_C( -72), INT8_C( -31), INT8_C( 113), + INT8_C(-125), INT8_C( 53), INT8_C( 66), INT8_C( 102), + INT8_C( -73), INT8_C( -68), INT8_C( -23), INT8_C( 108), + INT8_C( -30), INT8_C( 67), INT8_C( 123), INT8_C(-116)), + 9 , + simde_mm_set_epi8(INT8_C( 97), INT8_C(-120), INT8_C( -66), INT8_C( -85), + INT8_C( -54), INT8_C( -64), INT8_C( 124), INT8_C( 66), + INT8_C( 75), INT8_C( 83), INT8_C(-108), INT8_C( 0), + INT8_C( -17), INT8_C( 59), INT8_C( 102), INT8_C( 47)), + 0 , + 0 }, + { simde_mm_set_epi8(INT8_C( 107), INT8_C( -11), INT8_C( -75), INT8_C( 77), + INT8_C( -31), INT8_C( 64), INT8_C( -49), INT8_C( -48), + INT8_C( 78), INT8_C( -30), INT8_C( -17), INT8_C( -77), + INT8_C( 124), INT8_C( 43), INT8_C( 34), INT8_C( -43)), + 12 , + simde_mm_set_epi8(INT8_C( -27), INT8_C( 7), INT8_C( -44), INT8_C( 76), + INT8_C( -20), INT8_C( 42), INT8_C(-115), INT8_C( -77), + INT8_C( -97), INT8_C( -59), INT8_C( 39), INT8_C( -72), + INT8_C( -28), INT8_C( -16), INT8_C( -81), INT8_C( 76)), + 10 , + 0 }, + { simde_mm_set_epi8(INT8_C( -15), INT8_C( -24), INT8_C(-125), INT8_C( 105), + INT8_C( -84), INT8_C( 63), INT8_C( -35), INT8_C( 29), + INT8_C( -58), INT8_C( 46), INT8_C( 76), INT8_C( 24), + INT8_C( 70), INT8_C( -42), INT8_C( -14), INT8_C( 18)), + 2 , + simde_mm_set_epi8(INT8_C( 60), INT8_C( -10), INT8_C( 15), INT8_C( -41), + INT8_C( -70), INT8_C( -7), INT8_C( 108), INT8_C( -24), + INT8_C(-122), INT8_C( -48), INT8_C( -28), INT8_C(-111), + INT8_C( 61), INT8_C( 43), INT8_C( 69), INT8_C(-127)), + 13 , + 0 }, + { simde_mm_set_epi8(INT8_C(-113), INT8_C( -56), INT8_C( 118), INT8_C( 83), + INT8_C( 42), INT8_C( 26), INT8_C( -77), INT8_C( 38), + INT8_C( 9), INT8_C( 5), INT8_C( -58), INT8_C( 70), + INT8_C( 37), INT8_C( 89), INT8_C( 117), INT8_C( 16)), + 1 , + simde_mm_set_epi8(INT8_C( 72), INT8_C( -22), INT8_C( -75), INT8_C( -97), + INT8_C( 64), INT8_C( 81), INT8_C( -57), INT8_C( -10), + INT8_C( 122), INT8_C(-127), INT8_C( -25), INT8_C( 50), + INT8_C( 102), INT8_C( 2), INT8_C( 106), INT8_C(-116)), + 12 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 182); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 56); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_negatevalid_16(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi16(INT16_C( 27085), INT16_C( 17358), INT16_C( -4075), INT16_C( -2543), + INT16_C( -6674), INT16_C( 11992), INT16_C(-29028), INT16_C( 16499)), + 7 , + simde_mm_set_epi16(INT16_C( 6653), INT16_C(-32190), INT16_C( -3640), INT16_C(-30748), + INT16_C(-16470), INT16_C( 2660), INT16_C(-18499), INT16_C( 17321)), + 3 , + 0 }, + { simde_mm_set_epi16(INT16_C(-31692), INT16_C(-23108), INT16_C(-30260), INT16_C( 20774), + INT16_C(-16824), INT16_C( 28452), INT16_C( 12946), INT16_C( 21077)), + 1 , + simde_mm_set_epi16(INT16_C( 32366), INT16_C(-27764), INT16_C(-18268), INT16_C( 30692), + INT16_C( 6168), INT16_C( 21032), INT16_C( 3933), INT16_C( 28092)), + 1 , + 0 }, + { simde_mm_set_epi16(INT16_C( 16708), INT16_C( 25835), INT16_C(-32663), INT16_C(-24897), + INT16_C(-24398), INT16_C( 28715), INT16_C(-25841), INT16_C(-27462)), + 3 , + simde_mm_set_epi16(INT16_C( -290), INT16_C( -2080), INT16_C(-13183), INT16_C(-31617), + INT16_C(-18032), INT16_C( 14973), INT16_C( 15538), INT16_C(-25150)), + 3 , + 0 }, + { simde_mm_set_epi16(INT16_C( 17577), INT16_C(-21435), INT16_C(-19992), INT16_C(-21809), + INT16_C( 6263), INT16_C(-13891), INT16_C( 918), INT16_C( 26401)), + 3 , + simde_mm_set_epi16(INT16_C( 32483), INT16_C( -6470), INT16_C( 29965), INT16_C( 17459), + INT16_C( -8257), INT16_C( 7838), INT16_C( -7825), INT16_C( 17834)), + 7 , + 0 }, + { simde_mm_set_epi16(INT16_C( -8776), INT16_C( -7823), INT16_C(-31947), INT16_C( 16998), + INT16_C(-18500), INT16_C( -5780), INT16_C( -7613), INT16_C( 31628)), + 8 , + simde_mm_set_epi16(INT16_C( 24968), INT16_C(-16725), INT16_C(-13632), INT16_C( 31810), + INT16_C( 19283), INT16_C(-27648), INT16_C( -4293), INT16_C( 26159)), + 1 , + 0 }, + { simde_mm_set_epi16(INT16_C( 27637), INT16_C(-19123), INT16_C( -7872), INT16_C(-12336), + INT16_C( 20194), INT16_C( -4173), INT16_C( 31787), INT16_C( 8917)), + 4 , + simde_mm_set_epi16(INT16_C( -6905), INT16_C(-11188), INT16_C( -5078), INT16_C(-29261), + INT16_C(-24635), INT16_C( 10168), INT16_C( -6928), INT16_C(-20660)), + 6 , + 0 }, + { simde_mm_set_epi16(INT16_C( -3608), INT16_C(-31895), INT16_C(-21441), INT16_C( -8931), + INT16_C(-14802), INT16_C( 19480), INT16_C( 18134), INT16_C( -3566)), + 3 , + simde_mm_set_epi16(INT16_C( 15606), INT16_C( 4055), INT16_C(-17671), INT16_C( 27880), + INT16_C(-31024), INT16_C( -7023), INT16_C( 15659), INT16_C( 17793)), + 6 , + 0 }, + { simde_mm_set_epi16(INT16_C(-28728), INT16_C( 30291), INT16_C( 10778), INT16_C(-19674), + INT16_C( 2309), INT16_C(-14778), INT16_C( 9561), INT16_C( 29968)), + 3 , + simde_mm_set_epi16(INT16_C( 18666), INT16_C(-19041), INT16_C( 16465), INT16_C(-14346), + INT16_C( 31361), INT16_C( -6350), INT16_C( 26114), INT16_C( 27276)), + 5 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 183); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 57); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_negateall_8(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi8(INT8_C( -44), INT8_C( -72), INT8_C(-110), INT8_C( 6), + INT8_C( 86), INT8_C( 16), INT8_C( 34), INT8_C( -23), + INT8_C(-126), INT8_C( 127), INT8_C( 86), INT8_C( 43), + INT8_C( 17), INT8_C( 25), INT8_C( 6), INT8_C( 123)), + 3 , + simde_mm_set_epi8(INT8_C( 92), INT8_C( 37), INT8_C( 29), INT8_C( -15), + INT8_C( -22), INT8_C( 65), INT8_C( 26), INT8_C( 113), + INT8_C( 73), INT8_C( -75), INT8_C( 31), INT8_C( -19), + INT8_C( -1), INT8_C( 61), INT8_C( 15), INT8_C( 76)), + 16 , + 1 }, + { simde_mm_set_epi8(INT8_C( 58), INT8_C( 72), INT8_C( 56), INT8_C( -65), + INT8_C( 54), INT8_C(-122), INT8_C( -83), INT8_C( 83), + INT8_C( -40), INT8_C(-117), INT8_C( 113), INT8_C( 123), + INT8_C(-110), INT8_C( 13), INT8_C(-125), INT8_C( -24)), + 4 , + simde_mm_set_epi8(INT8_C( 0), INT8_C( 111), INT8_C( 119), INT8_C( -55), + INT8_C( -50), INT8_C(-109), INT8_C( 115), INT8_C( 69), + INT8_C( 81), INT8_C( -57), INT8_C(-127), INT8_C( 10), + INT8_C( -27), INT8_C( 118), INT8_C( 64), INT8_C( -45)), + 9 , + 0 }, + { simde_mm_set_epi8(INT8_C( 45), INT8_C(-111), INT8_C( 56), INT8_C(-110), + INT8_C( -64), INT8_C( 73), INT8_C( 76), INT8_C(-121), + INT8_C( 74), INT8_C( -88), INT8_C( -10), INT8_C( -4), + INT8_C( -89), INT8_C( 14), INT8_C( 30), INT8_C(-124)), + 5 , + simde_mm_set_epi8(INT8_C( 70), INT8_C( 78), INT8_C( 101), INT8_C( 120), + INT8_C( 76), INT8_C( 88), INT8_C( 55), INT8_C( -34), + INT8_C( 20), INT8_C( 86), INT8_C( 112), INT8_C( 15), + INT8_C( 49), INT8_C( 35), INT8_C( 54), INT8_C( -19)), + 15 , + 0 }, + { simde_mm_set_epi8(INT8_C( -85), INT8_C( 99), INT8_C( -75), INT8_C(-120), + INT8_C( 45), INT8_C( 67), INT8_C( -62), INT8_C( -32), + INT8_C( -75), INT8_C( -56), INT8_C( 65), INT8_C( 102), + INT8_C( 123), INT8_C( 99), INT8_C(-128), INT8_C( 103)), + 11 , + simde_mm_set_epi8(INT8_C( 43), INT8_C( -40), INT8_C( 103), INT8_C( 58), + INT8_C( -24), INT8_C( 65), INT8_C( -58), INT8_C( 110), + INT8_C( 120), INT8_C( 38), INT8_C( -13), INT8_C(-111), + INT8_C( -30), INT8_C(-128), INT8_C( 67), INT8_C( 112)), + 7 , + 0 }, + { simde_mm_set_epi8(INT8_C( -20), INT8_C( -24), INT8_C( -93), INT8_C( -37), + INT8_C( 53), INT8_C( -57), INT8_C( 119), INT8_C( 60), + INT8_C( 126), INT8_C( 23), INT8_C( 11), INT8_C( 58), + INT8_C( -24), INT8_C( -8), INT8_C( 27), INT8_C( -38)), + 11 , + simde_mm_set_epi8(INT8_C( 66), INT8_C( -68), INT8_C( 81), INT8_C(-120), + INT8_C( 114), INT8_C( 53), INT8_C( 107), INT8_C( 106), + INT8_C( 119), INT8_C( 111), INT8_C( -50), INT8_C( 51), + INT8_C( -89), INT8_C(-106), INT8_C(-106), INT8_C( 106)), + 8 , + 0 }, + { simde_mm_set_epi8(INT8_C( -26), INT8_C( 16), INT8_C( 59), INT8_C( -18), + INT8_C( -48), INT8_C( 11), INT8_C( -89), INT8_C( 41), + INT8_C(-101), INT8_C( 57), INT8_C( 107), INT8_C( 57), + INT8_C( -13), INT8_C( 122), INT8_C( 2), INT8_C( 115)), + 5 , + simde_mm_set_epi8(INT8_C( 123), INT8_C( -85), INT8_C( 34), INT8_C( 61), + INT8_C( -99), INT8_C( -38), INT8_C( 20), INT8_C( 115), + INT8_C(-111), INT8_C( -63), INT8_C( -25), INT8_C( 64), + INT8_C( -17), INT8_C( 62), INT8_C( -64), INT8_C( 62)), + 0 , + 0 }, + { simde_mm_set_epi8(INT8_C( 50), INT8_C( -77), INT8_C( -94), INT8_C( 30), + INT8_C(-111), INT8_C( -76), INT8_C( 47), INT8_C( -53), + INT8_C( 75), INT8_C( 89), INT8_C(-108), INT8_C( 57), + INT8_C( -14), INT8_C( 83), INT8_C( -73), INT8_C( -4)), + 12 , + simde_mm_set_epi8(INT8_C( 76), INT8_C( 12), INT8_C( -95), INT8_C( 30), + INT8_C( -12), INT8_C( 102), INT8_C(-126), INT8_C( 95), + INT8_C( -67), INT8_C( -71), INT8_C( -51), INT8_C( -86), + INT8_C( 44), INT8_C( 112), INT8_C( 87), INT8_C( -41)), + 2 , + 0 }, + { simde_mm_set_epi8(INT8_C( 119), INT8_C( -62), INT8_C(-108), INT8_C( -95), + INT8_C( 98), INT8_C( 43), INT8_C(-111), INT8_C(-115), + INT8_C( 34), INT8_C( -38), INT8_C( 1), INT8_C( 21), + INT8_C( 88), INT8_C(-125), INT8_C( 29), INT8_C(-104)), + 13 , + simde_mm_set_epi8(INT8_C( -49), INT8_C( -29), INT8_C( 86), INT8_C(-101), + INT8_C( 91), INT8_C( -47), INT8_C( -3), INT8_C( -80), + INT8_C( -47), INT8_C( -36), INT8_C( -74), INT8_C( 3), + INT8_C( 101), INT8_C( -34), INT8_C( 91), INT8_C( 5)), + 9 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 222); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 210); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + +static MunitResult +test_simde_mm_cmpestra_negateall_16(const MunitParameter params[], void* data) { + (void) params; + (void) data; + + const struct { + simde__m128i a; + int la; + simde__m128i b; + int lb; + int r; + } test_vec[8] = { + { simde_mm_set_epi16(INT16_C(-11080), INT16_C(-28154), INT16_C( 22032), INT16_C( 8937), + INT16_C(-32129), INT16_C( 22059), INT16_C( 4377), INT16_C( 1659)), + 3 , + simde_mm_set_epi16(INT16_C( 23589), INT16_C( 7665), INT16_C( -5567), INT16_C( 6769), + INT16_C( 18869), INT16_C( 8173), INT16_C( -195), INT16_C( 3916)), + 4 , + 0 }, + { simde_mm_set_epi16(INT16_C( 14920), INT16_C( 14527), INT16_C( 13958), INT16_C(-21165), + INT16_C(-10101), INT16_C( 29051), INT16_C(-28147), INT16_C(-31768)), + 5 , + simde_mm_set_epi16(INT16_C( 111), INT16_C( 30665), INT16_C(-12653), INT16_C( 29509), + INT16_C( 20935), INT16_C(-32502), INT16_C( -6794), INT16_C( 16595)), + 5 , + 0 }, + { simde_mm_set_epi16(INT16_C( 11665), INT16_C( 14482), INT16_C(-16311), INT16_C( 19591), + INT16_C( 19112), INT16_C( -2308), INT16_C(-22770), INT16_C( 7812)), + 0 , + simde_mm_set_epi16(INT16_C( 17998), INT16_C( 25976), INT16_C( 19544), INT16_C( 14302), + INT16_C( 5206), INT16_C( 28687), INT16_C( 12579), INT16_C( 14061)), + 1 , + 0 }, + { simde_mm_set_epi16(INT16_C(-21661), INT16_C(-19064), INT16_C( 11587), INT16_C(-15648), + INT16_C(-19000), INT16_C( 16742), INT16_C( 31587), INT16_C(-32665)), + 7 , + simde_mm_set_epi16(INT16_C( 11224), INT16_C( 26426), INT16_C( -6079), INT16_C(-14738), + INT16_C( 30758), INT16_C( -3183), INT16_C( -7552), INT16_C( 17264)), + 2 , + 0 }, + { simde_mm_set_epi16(INT16_C( -4888), INT16_C(-23589), INT16_C( 13767), INT16_C( 30524), + INT16_C( 32279), INT16_C( 2874), INT16_C( -5896), INT16_C( 7130)), + 6 , + simde_mm_set_epi16(INT16_C( 17084), INT16_C( 20872), INT16_C( 29237), INT16_C( 27498), + INT16_C( 30575), INT16_C(-12749), INT16_C(-22634), INT16_C(-27030)), + 1 , + 0 }, + { simde_mm_set_epi16(INT16_C( -6640), INT16_C( 15342), INT16_C(-12277), INT16_C(-22743), + INT16_C(-25799), INT16_C( 27449), INT16_C( -3206), INT16_C( 627)), + 1 , + simde_mm_set_epi16(INT16_C( 31659), INT16_C( 8765), INT16_C(-25126), INT16_C( 5235), + INT16_C(-28223), INT16_C( -6336), INT16_C( -4290), INT16_C(-16322)), + 4 , + 0 }, + { simde_mm_set_epi16(INT16_C( 12979), INT16_C(-24034), INT16_C(-28236), INT16_C( 12235), + INT16_C( 19289), INT16_C(-27591), INT16_C( -3501), INT16_C(-18436)), + 8 , + simde_mm_set_epi16(INT16_C( 19468), INT16_C(-24290), INT16_C( -2970), INT16_C(-32161), + INT16_C(-16967), INT16_C(-12886), INT16_C( 11376), INT16_C( 22487)), + 6 , + 0 }, + { simde_mm_set_epi16(INT16_C( 30658), INT16_C(-27487), INT16_C( 25131), INT16_C(-28275), + INT16_C( 8922), INT16_C( 277), INT16_C( 22659), INT16_C( 7576)), + 3 , + simde_mm_set_epi16(INT16_C(-12317), INT16_C( 22171), INT16_C( 23505), INT16_C( -592), + INT16_C(-11812), INT16_C(-18941), INT16_C( 26078), INT16_C( 23301)), + 4 , + 0 } + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])); i++) { + int r; + if(i < 4) + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 223); + else + r = simde_mm_cmpestra(test_vec[i].a, test_vec[i].la, test_vec[i].b, test_vec[i].lb, 211); + munit_assert_int(r, ==, test_vec[i].r); + } + + return MUNIT_OK; +} + static MunitResult test_simde_mm_cmpestrs_8(const MunitParameter params[], void* data) { (void) params; @@ -269,6 +1641,21 @@ HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL static MunitTest test_suite_tests[] = { #if defined(SIMDE_X86_SSE4_2_NATIVE) || defined(SIMDE_NO_NATIVE) || defined(SIMDE_ALWAYS_BUILD_NATIVE_TESTS) + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_equalany_8), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_equalany_16), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_ranges_8), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_ranges_16), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_equaleach_8), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_equaleach_16), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_equalordered_8), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_equalordered_16), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_dontnegate_8), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_dontnegate_16), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_negatevalid_8), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_negatevalid_16), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_negateall_8), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestra_negateall_16), + SIMDE_TESTS_DEFINE_TEST(mm_cmpestrs_8), SIMDE_TESTS_DEFINE_TEST(mm_cmpestrs_16), SIMDE_TESTS_DEFINE_TEST(mm_cmpgt_epi64),