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),