5241f43e创建于 2024年7月31日历史提交
#define SIMDE_TEST_ARM_NEON_INSN rshl

#include "test-neon.h"

/* Check that both of these work */
#if defined(__cplusplus)
  #include "../../../simde/arm/neon/rshl.h"
#else
  #include "../../../simde/arm/neon.h"
#endif

#if 0
#define PROBABILITY 80
#define probability(p) (rand() < (((int64_t) RAND_MAX * (p)) / 100))
#endif

static int
test_simde_vrshl_s8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int8_t a[8];
    int8_t b[8];
    int8_t r[8];
  } test_vec[] = {
    { { -INT8_C(   1), -INT8_C(  80),  INT8_C( 102),  INT8_C(  17),  INT8_C(  10),  INT8_C(  22),  INT8_C(  87), -INT8_C( 121) },
      {  INT8_C(   8),  INT8_C(   6),  INT8_C(   0),  INT8_C(   7), -INT8_C(   8),  INT8_C(   7),  INT8_C(  49), -INT8_C(   7) },
      {  INT8_C(   0),  INT8_C(   0),  INT8_C( 102),      INT8_MIN,  INT8_C(   0),  INT8_C(   0),  INT8_C(   0), -INT8_C(   1) } },
    { { -INT8_C(   1),  INT8_C(  26),  INT8_C(  68),  INT8_C(  57),  INT8_C(  29),  INT8_C(  19), -INT8_C(  63), -INT8_C( 107) },
      { -INT8_C(   8),  INT8_C(   5), -INT8_C(   6), -INT8_C(   7),  INT8_C(  62), -INT8_C(   2),  INT8_C(   5),  INT8_C(   5) },
      {  INT8_C(   0),  INT8_C(  64),  INT8_C(   1),  INT8_C(   0),  INT8_C(   0),  INT8_C(   5),  INT8_C(  32), -INT8_C(  96) } },
    { { -INT8_C(  31), -INT8_C(  21), -INT8_C( 103),  INT8_C(  75),  INT8_C( 114),  INT8_C(  33), -INT8_C(  81), -INT8_C(  75) },
      {  INT8_C(   7), -INT8_C(   7), -INT8_C(  17),  INT8_C(   5),  INT8_C(   6), -INT8_C(   5), -INT8_C(   5), -INT8_C(   7) },
      {      INT8_MIN,  INT8_C(   0),  INT8_C(   0),  INT8_C(  96),      INT8_MIN,  INT8_C(   1), -INT8_C(   3), -INT8_C(   1) } },
    { {  INT8_C(  65), -INT8_C(  49), -INT8_C(  12), -INT8_C(  43),  INT8_C(  99),  INT8_C(  26),  INT8_C(  31),  INT8_C(  68) },
      {  INT8_C(   6), -INT8_C(   5), -INT8_C(   7),  INT8_C(   7), -INT8_C(   5),  INT8_C(   7),  INT8_C(   5),  INT8_C(  21) },
      {  INT8_C(  64), -INT8_C(   2),  INT8_C(   0),      INT8_MIN,  INT8_C(   3),  INT8_C(   0), -INT8_C(  32),  INT8_C(   0) } },
    { { -INT8_C(  16), -INT8_C( 102), -INT8_C(  68), -INT8_C( 125), -INT8_C( 121),  INT8_C(  39),  INT8_C(  74), -INT8_C(  56) },
      { -INT8_C(  10),  INT8_C(  62), -INT8_C(  98),  INT8_C(  90),  INT8_C(   5), -INT8_C(   5), -INT8_C(   7),  INT8_C(  94) },
      {  INT8_C(   0),  INT8_C(   0),  INT8_C(   0),  INT8_C(   0), -INT8_C(  32),  INT8_C(   1),  INT8_C(   1),  INT8_C(   0) } },
    { {  INT8_C(  32), -INT8_C(  46), -INT8_C(  39), -INT8_C(  19),  INT8_C(  46), -INT8_C(  36), -INT8_C( 109),  INT8_C(  30) },
      {  INT8_C( 118),  INT8_C(  79), -INT8_C(   6), -INT8_C(   3),  INT8_C(   7), -INT8_C(   6), -INT8_C(   8),  INT8_C(   6) },
      {  INT8_C(   0),  INT8_C(   0), -INT8_C(   1), -INT8_C(   2),  INT8_C(   0), -INT8_C(   1),  INT8_C(   0),      INT8_MIN } },
    { { -INT8_C( 108), -INT8_C(  73), -INT8_C(  27),  INT8_C(   1), -INT8_C(  69),  INT8_C(  73), -INT8_C(  95), -INT8_C(  37) },
      {  INT8_C(  27),  INT8_C( 122), -INT8_C(   7),  INT8_C(   4),  INT8_C(   5),  INT8_C(   5),  INT8_C(   6), -INT8_C(   7) },
      {  INT8_C(   0),  INT8_C(   0),  INT8_C(   0),  INT8_C(  16),  INT8_C(  96),  INT8_C(  32),  INT8_C(  64),  INT8_C(   0) } },
    { { -INT8_C(  12),  INT8_C(  85), -INT8_C(  96),  INT8_C(  21), -INT8_C(  69), -INT8_C( 127), -INT8_C(  84),  INT8_C(  79) },
      {  INT8_C(   7), -INT8_C(   7),  INT8_C(   5), -INT8_C(   7), -INT8_C(  37), -INT8_C(   7), -INT8_C(   7), -INT8_C(  10) },
      {  INT8_C(   0),  INT8_C(   1),  INT8_C(   0),  INT8_C(   0),  INT8_C(   0), -INT8_C(   1), -INT8_C(   1),  INT8_C(   0) } },
#if !defined(SIMDE_X86_SSE_NATIVE) && !defined(SIMDE_X86_MMX_NATIVE)
    { {      INT8_MAX,      INT8_MAX,      INT8_MAX,      INT8_MAX,     INT8_MAX,       INT8_MAX,      INT8_MAX,      INT8_MAX },
      { -INT8_C(   1), -INT8_C(   1), -INT8_C(   1), -INT8_C(   1), -INT8_C(  1),  -INT8_C(   1), -INT8_C(   1), -INT8_C(   1) },
      {  INT8_C(  64),  INT8_C(  64),  INT8_C(  64),  INT8_C(  64),  INT8_C( 64),   INT8_C(  64),  INT8_C(  64),  INT8_C(  64) } },
#endif
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int8x8_t a = simde_vld1_s8(test_vec[i].a);
    simde_int8x8_t b = simde_vld1_s8(test_vec[i].b);
    simde_int8x8_t r = simde_vrshl_s8(a, b);

    simde_test_arm_neon_assert_equal_i8x8(r, simde_vld1_s8(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  int8_t a_patch[] = { -INT8_C(1), -INT8_C(1) };
  int8_t b_patch[] = {          8,         -8 };

  for (int i = 0 ; i < 8 ; i++) {
    simde_int8x8_private a_ = simde_int8x8_to_private(simde_test_arm_neon_random_i8x8());
    simde_int8x8_private b_ = simde_int8x8_to_private(simde_test_arm_neon_random_i8x8());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 8) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_int8x8_t a = simde_int8x8_from_private(a_);
    simde_int8x8_t b = simde_int8x8_from_private(b_);

    simde_int8x8_t r = simde_vrshl_s8(a, b);
    simde_test_arm_neon_write_i8x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i8x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i8x8(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshl_s16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int16_t a[4];
    int16_t b[4];
    int16_t r[4];
  } test_vec[] = {
    { { -INT16_C(     1),  INT16_C( 16127),  INT16_C(  7767),  INT16_C( 21548) },
      {  INT16_C(    16),  INT16_C(    11),  INT16_C(    15), -INT16_C(    16) },
      {  INT16_C(     0), -INT16_C(  2048),       INT16_MIN,  INT16_C(     0) } },
    { { -INT16_C(     1),  INT16_C(   155),  INT16_C( 26190), -INT16_C( 23334) },
      { -INT16_C(    16),  INT16_C(    14),  INT16_C(    14), -INT16_C(    12) },
      {  INT16_C(     0), -INT16_C( 16384),       INT16_MIN, -INT16_C(     6) } },
    { { -INT16_C( 12578),  INT16_C( 28010), -INT16_C( 16565),  INT16_C( 31821) },
      {  INT16_C(    11),  INT16_C(    12),  INT16_C(    11),  INT16_C(  7269) },
      { -INT16_C(  4096), -INT16_C( 24576),  INT16_C( 22528),  INT16_C(     0) } },
    { { -INT16_C(  1065),  INT16_C( 21373),  INT16_C( 12341), -INT16_C( 29402) },
      {  INT16_C(     9), -INT16_C(     9),  INT16_C(    13),  INT16_C(    12) },
      { -INT16_C( 20992),  INT16_C(    42), -INT16_C( 24576),  INT16_C( 24576) } },
    { { -INT16_C( 22525), -INT16_C( 11632), -INT16_C(  2809), -INT16_C( 12818) },
      { -INT16_C( 20684),  INT16_C(    11),  INT16_C(    10), -INT16_C(    16) },
      {  INT16_C(     0),       INT16_MIN,  INT16_C(  7168),  INT16_C(     0) } },
    { {  INT16_C( 14547), -INT16_C(  4223), -INT16_C(  9107),  INT16_C( 25175) },
      {  INT16_C(    14), -INT16_C(    15),  INT16_C(    14), -INT16_C(    11) },
      { -INT16_C( 16384),  INT16_C(     0),  INT16_C( 16384),  INT16_C(    12) } },
    { { -INT16_C( 29192), -INT16_C( 23726), -INT16_C( 20257),  INT16_C( 24964) },
      { -INT16_C(    14),  INT16_C(     8),  INT16_C(    14), -INT16_C( 26376) },
      { -INT16_C(     2),  INT16_C( 20992), -INT16_C( 16384),  INT16_C(    98) } },
    { { -INT16_C( 30838),  INT16_C( 27999), -INT16_C( 18012), -INT16_C( 18857) },
      {  INT16_C(    15), -INT16_C(     9),  INT16_C(     9),  INT16_C( 31646) },
      {  INT16_C(     0),  INT16_C(    55),  INT16_C( 18432),  INT16_C(     0) } },
#if !defined(SIMDE_X86_SSE_NATIVE) && !defined(SIMDE_X86_MMX_NATIVE)
    { {        INT16_MAX,        INT16_MAX,        INT16_MAX,         INT16_MAX},
      { -INT16_C(     1), -INT16_C(     1), -INT16_C(     1), -INT16_C(     1) },
      {  INT16_C( 16384),  INT16_C( 16384),  INT16_C( 16384),  INT16_C( 16384) } },
#endif
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int16x4_t a = simde_vld1_s16(test_vec[i].a);
    simde_int16x4_t b = simde_vld1_s16(test_vec[i].b);
    simde_int16x4_t r = simde_vrshl_s16(a, b);

    simde_test_arm_neon_assert_equal_i16x4(r, simde_vld1_s16(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  int16_t a_patch[] = { -INT16_C(1), -INT16_C(1) };
  int16_t b_patch[] = {          16,         -16 };

  for (int i = 0 ; i < 8 ; i++) {
    simde_int16x4_private a_ = simde_int16x4_to_private(simde_test_arm_neon_random_i16x4());
    simde_int16x4_private b_ = simde_int16x4_to_private(simde_test_arm_neon_random_i16x4());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 16) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_int16x4_t a = simde_int16x4_from_private(a_);
    simde_int16x4_t b = simde_int16x4_from_private(b_);

    simde_int16x4_t r = simde_vrshl_s16(a, b);

    simde_test_arm_neon_write_i16x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i16x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshl_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int32_t a[2];
    int32_t b[2];
    int32_t r[2];
  } test_vec[] = {
    { { -INT32_C(           1), -INT32_C(  1425395738) },
      {  INT32_C(          32), -INT32_C(          32) },
      {  INT32_C(           0),  INT32_C(           0) } },
    { { -INT32_C(           1),  INT32_C(  1217089360) },
      { -INT32_C(          32),  INT32_C(          20) },
      {  INT32_C(           0), -INT32_C(   184549376) } },
    { { -INT32_C(  1741455487), -INT32_C(   478087585) },
      { -INT32_C(  1033648548),  INT32_C(          25) },
      {  INT32_C(           0), -INT32_C(  1107296256) } },
    { { -INT32_C(  1102370122),  INT32_C(  1878396110) },
      { -INT32_C(          32),  INT32_C(          20) },
      {  INT32_C(           0), -INT32_C(   857735168) } },
    { { -INT32_C(  1522312632), -INT32_C(   915953887) },
      {  INT32_C(          26),  INT32_C(  1737811484) },
      {  INT32_C(   536870912),  INT32_C(   268435456) } },
    { {  INT32_C(  2144508531),  INT32_C(  1342214961) },
      { -INT32_C(          21), -INT32_C(          23) },
      {  INT32_C(        1023),  INT32_C(         160) } },
    { {  INT32_C(   385152843),  INT32_C(   746660880) },
      { -INT32_C(          21),  INT32_C(  1246234488) },
      {  INT32_C(         184),  INT32_C(           0) } },
    { { -INT32_C(  1295350051), -INT32_C(   413045626) },
      { -INT32_C(          25), -INT32_C(          30) },
      { -INT32_C(          39),  INT32_C(           0) } },
#if !defined(SIMDE_X86_SSE_NATIVE) && !defined(SIMDE_X86_MMX_NATIVE)
    { {              INT32_MAX,              INT32_MAX },
      { -INT32_C(           1), -INT32_C(           1) },
      {  INT32_C(  1073741824),  INT32_C(  1073741824) } },
#endif
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int32x2_t a = simde_vld1_s32(test_vec[i].a);
    simde_int32x2_t b = simde_vld1_s32(test_vec[i].b);
    simde_int32x2_t r = simde_vrshl_s32(a, b);

    simde_test_arm_neon_assert_equal_i32x2(r, simde_vld1_s32(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  int32_t a_patch[] = { -INT32_C(1), -INT32_C(1) };
  int32_t b_patch[] = {          32,         -32 };


  for (int i = 0 ; i < 8 ; i++) {
    simde_int32x2_private a_ = simde_int32x2_to_private(simde_test_arm_neon_random_i32x2());
    simde_int32x2_private b_ = simde_int32x2_to_private(simde_test_arm_neon_random_i32x2());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 32) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_int32x2_t a = simde_int32x2_from_private(a_);
    simde_int32x2_t b = simde_int32x2_from_private(b_);

    simde_int32x2_t r = simde_vrshl_s32(a, b);

    simde_test_arm_neon_write_i32x2(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i32x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i32x2(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshl_s64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int64_t a[1];
    int64_t b[1];
    int64_t r[1];
  } test_vec[] = {
    { { -INT64_C(                   1) },
      {  INT64_C(                  64) },
      {  INT64_C(                   0) } },
    { { -INT64_C(                   1) },
      { -INT64_C(                  64) },
      {  INT64_C(                   0) } },
    { { -INT64_C( 5783365166398861937) },
      { -INT64_C( 1682183429783586356) },
      { -INT64_C(                1284) } },
    { {  INT64_C( 1136283642200280026) },
      { -INT64_C(                  57) },
      {  INT64_C(                   8) } },
    { {  INT64_C( 3453319167247895989) },
      {  INT64_C(                  53) },
      { -INT64_C( 5287225962532962304) } },
    { { -INT64_C( 3754790191149012930) },
      { -INT64_C(                  39) },
      { -INT64_C(             6829924) } },
    { {  INT64_C( 4367597038114582190) },
      { -INT64_C(                  56) },
      {  INT64_C(                  61) } },
    { { -INT64_C( 4313522761509692639) },
      { -INT64_C(                  43) },
      { -INT64_C(              490391) } },
#if !defined(SIMDE_X86_SSE_NATIVE) && !defined(SIMDE_X86_MMX_NATIVE)
    { {                      INT64_MAX },
      { -INT64_C(                   1) },
      {  INT64_C( 4611686018427387904) } },
#endif
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int64x1_t a = simde_vld1_s64(test_vec[i].a);
    simde_int64x1_t b = simde_vld1_s64(test_vec[i].b);
    simde_int64x1_t r = simde_vrshl_s64(a, b);

    simde_test_arm_neon_assert_equal_i64x1(r, simde_vld1_s64(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  int64_t a_patch[] = { -INT64_C(1), -INT64_C(1) };
  int64_t b_patch[] = {          64,         -64 };


  for (int i = 0 ; i < 8 ; i++) {
    simde_int64x1_private a_ = simde_int64x1_to_private(simde_test_arm_neon_random_i64x1());
    simde_int64x1_private b_ = simde_int64x1_to_private(simde_test_arm_neon_random_i64x1());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_llabs(b_.values[j]) > 64) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_int64x1_t a = simde_int64x1_from_private(a_);
    simde_int64x1_t b = simde_int64x1_from_private(b_);

    simde_int64x1_t r = simde_vrshl_s64(a, b);

    simde_test_arm_neon_write_i64x1(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i64x1(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i64x1(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshl_u8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    uint8_t a[8];
    int8_t b[8];
    uint8_t r[8];
  } test_vec[] = {
    { {    UINT8_MAX, UINT8_C( 91), UINT8_C(231), UINT8_C(221), UINT8_C( 49), UINT8_C(217), UINT8_C(178), UINT8_C(160) },
      {  INT8_C(   8), -INT8_C( 123), -INT8_C(  39),  INT8_C(   6), -INT8_C(   5), -INT8_C(   8), -INT8_C(   7),  INT8_C(   6) },
      { UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C( 64), UINT8_C(  2), UINT8_C(  1), UINT8_C(  1), UINT8_C(  0) } },
    { { UINT8_C(128), UINT8_C( 86), UINT8_C( 67), UINT8_C( 16), UINT8_C(186), UINT8_C(233), UINT8_C(204), UINT8_C( 62) },
      { -INT8_C(   8), -INT8_C(   5),  INT8_C(  28),  INT8_C(   7), -INT8_C(   8), -INT8_C(   7),  INT8_C(  22), -INT8_C(  82) },
      { UINT8_C(  1), UINT8_C(  3), UINT8_C(  0), UINT8_C(  0), UINT8_C(  1), UINT8_C(  2), UINT8_C(  0), UINT8_C(  0) } },
    { {    UINT8_MAX, UINT8_C(141), UINT8_C( 43), UINT8_C(127), UINT8_C( 75), UINT8_C(120), UINT8_C( 48), UINT8_C(178) },
      { -INT8_C(   9),  INT8_C(   7), -INT8_C(  62), -INT8_C(   8),  INT8_C(   5), -INT8_C(   8), -INT8_C(   8), -INT8_C(   6) },
      { UINT8_C(  0), UINT8_C(128), UINT8_C(  0), UINT8_C(  0), UINT8_C( 96), UINT8_C(  0), UINT8_C(  0), UINT8_C(  3) } },
    { { UINT8_C( 28), UINT8_C(141), UINT8_C( 24), UINT8_C(204), UINT8_C( 54), UINT8_C( 93), UINT8_C(123), UINT8_C(187) },
      { -INT8_C(   6), -INT8_C(  89),  INT8_C(   7),  INT8_C(   6),  INT8_C(   7),  INT8_C(   6), -INT8_C(   6), -INT8_C(   5) },
      { UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C( 64), UINT8_C(  2), UINT8_C(  6) } },
    { { UINT8_C( 30), UINT8_C(244), UINT8_C( 74), UINT8_C(207), UINT8_C( 33), UINT8_C(200), UINT8_C(212), UINT8_C( 62) },
      {  INT8_C(   5), -INT8_C(   5),  INT8_C(   5), -INT8_C(   8),  INT8_C(  73), -INT8_C(   8),  INT8_C(   8),  INT8_C(  51) },
      { UINT8_C(192), UINT8_C(  8), UINT8_C( 64), UINT8_C(  1), UINT8_C(  0), UINT8_C(  1), UINT8_C(  0), UINT8_C(  0) } },
    { { UINT8_C(251), UINT8_C(173), UINT8_C(  4), UINT8_C( 52), UINT8_C(233), UINT8_C(224), UINT8_C(175), UINT8_C(  7) },
      { -INT8_C(   6), -INT8_C(   7), -INT8_C(   6), -INT8_C(   5), -INT8_C(   8), -INT8_C(   6),  INT8_C(  52),  INT8_C(  22) },
      { UINT8_C(  4), UINT8_C(  1), UINT8_C(  0), UINT8_C(  2), UINT8_C(  1), UINT8_C(  4), UINT8_C(  0), UINT8_C(  0) } },
    { { UINT8_C(104), UINT8_C(124), UINT8_C( 59), UINT8_C( 83), UINT8_C(205), UINT8_C(116), UINT8_C( 28), UINT8_C(201) },
      {  INT8_C(   8),  INT8_C(   8), -INT8_C(   3),  INT8_C(   5),  INT8_C(   0), -INT8_C(   6),  INT8_C(   8), -INT8_C(   6) },
      { UINT8_C(  0), UINT8_C(  0), UINT8_C(  7), UINT8_C( 96), UINT8_C(205), UINT8_C(  2), UINT8_C(  0), UINT8_C(  3) } },
    { { UINT8_C( 61), UINT8_C( 31), UINT8_C(  6), UINT8_C(  0), UINT8_C(  6), UINT8_C( 25), UINT8_C(240), UINT8_C(110) },
      { -INT8_C(   7),  INT8_C(   5), -INT8_C(   8),  INT8_C(   6), -INT8_C(  96), -INT8_C(  35),  INT8_C(  43), -INT8_C(   8) },
      { UINT8_C(  0), UINT8_C(224), UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C(  0) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint8x8_t a = simde_vld1_u8(test_vec[i].a);
    simde_int8x8_t b = simde_vld1_s8(test_vec[i].b);
    simde_uint8x8_t r = simde_vrshl_u8(a, b);

    simde_test_arm_neon_assert_equal_u8x8(r, simde_vld1_u8(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  uint8_t a_patch[] = { UINT8_MAX, UINT8_C(1) << (8 - 1), UINT8_MAX };
  int8_t  b_patch[] = {         8,                    -8,    -8 - 1 };

  for (int i = 0 ; i < 8 ; i++) {
    simde_uint8x8_private a_ = simde_uint8x8_to_private(simde_test_arm_neon_random_u8x8());
    simde_int8x8_private b_ = simde_int8x8_to_private(simde_test_arm_neon_random_i8x8());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 8) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_uint8x8_t a = simde_uint8x8_from_private(a_);
    simde_int8x8_t b = simde_int8x8_from_private(b_);

    simde_uint8x8_t r = simde_vrshl_u8(a, b);

    simde_test_arm_neon_write_u8x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i8x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_u8x8(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshl_u16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    uint16_t a[4];
    int16_t b[4];
    uint16_t r[4];
  } test_vec[] = {
    { {      UINT16_MAX, UINT16_C(44116), UINT16_C(39019), UINT16_C(40834) },
      {  INT16_C(    16), -INT16_C(     9), -INT16_C(     9), -INT16_C(    16) },
      { UINT16_C(    0), UINT16_C(   86), UINT16_C(   76), UINT16_C(    1) } },
    { { UINT16_C(32768), UINT16_C(25689), UINT16_C(49174), UINT16_C(56283) },
      { -INT16_C(    16), -INT16_C(    13), -INT16_C(     9), -INT16_C(    16) },
      { UINT16_C(    1), UINT16_C(    3), UINT16_C(   96), UINT16_C(    1) } },
    { {      UINT16_MAX, UINT16_C(61016), UINT16_C(54701), UINT16_C(28590) },
      { -INT16_C(    17), -INT16_C(    14), -INT16_C(    12), -INT16_C(  5560) },
      { UINT16_C(    0), UINT16_C(    4), UINT16_C(   13), UINT16_C(    0) } },
    { { UINT16_C(12257), UINT16_C(64032), UINT16_C(39150), UINT16_C(17534) },
      { -INT16_C(    12),  INT16_C(     9),  INT16_C(    13),  INT16_C(    16) },
      { UINT16_C(    3), UINT16_C(16384), UINT16_C(49152), UINT16_C(    0) } },
    { { UINT16_C(10277), UINT16_C(63613), UINT16_C(50682), UINT16_C(36066) },
      { -INT16_C(    12), -INT16_C(    14),  INT16_C(    13), -INT16_C(    15) },
      { UINT16_C(    3), UINT16_C(    4), UINT16_C(16384), UINT16_C(    1) } },
    { { UINT16_C(59108), UINT16_C(30269), UINT16_C(15643), UINT16_C( 9910) },
      {  INT16_C(    12),  INT16_C(     8),  INT16_C(    14), -INT16_C(    15) },
      { UINT16_C(16384), UINT16_C(15616), UINT16_C(49152), UINT16_C(    0) } },
    { { UINT16_C(62868), UINT16_C(27572), UINT16_C(31221), UINT16_C(36400) },
      {  INT16_C(    14), -INT16_C( 24647), -INT16_C(    10),  INT16_C(    14) },
      { UINT16_C(    0), UINT16_C(    0), UINT16_C(   30), UINT16_C(    0) } },
    { { UINT16_C( 8242), UINT16_C(49201), UINT16_C(15195), UINT16_C(23624) },
      {  INT16_C(    11), -INT16_C( 17338), -INT16_C(    10),  INT16_C( 18215) },
      { UINT16_C(36864), UINT16_C(    0), UINT16_C(   15), UINT16_C(    0) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint16x4_t a = simde_vld1_u16(test_vec[i].a);
    simde_int16x4_t b = simde_vld1_s16(test_vec[i].b);
    simde_uint16x4_t r = simde_vrshl_u16(a, b);
    simde_test_arm_neon_assert_equal_u16x4(r, simde_vld1_u16(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  uint16_t a_patch[] = { UINT16_MAX, UINT16_C(1) << (16 - 1), UINT16_MAX };
  int16_t  b_patch[] = {         16,                     -16,    -16 - 1 };

  for (int i = 0 ; i < 8 ; i++) {
    simde_uint16x4_private a_ = simde_uint16x4_to_private(simde_test_arm_neon_random_u16x4());
    simde_int16x4_private b_ = simde_int16x4_to_private(simde_test_arm_neon_random_i16x4());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 16) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_uint16x4_t a = simde_uint16x4_from_private(a_);
    simde_int16x4_t b = simde_int16x4_from_private(b_);

    simde_uint16x4_t r = simde_vrshl_u16(a, b);

    simde_test_arm_neon_write_u16x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_u16x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshl_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    uint32_t a[2];
    int32_t b[2];
    uint32_t r[2];
  } test_vec[] = {
    { {           UINT32_MAX, UINT32_C(4251222520) },
      {  INT32_C(          32),  INT32_C(          19) },
      { UINT32_C(         0), UINT32_C( 264241152) } },
    { { UINT32_C(2147483648), UINT32_C(1560478732) },
      { -INT32_C(          32), -INT32_C(   947062820) },
      { UINT32_C(         1), UINT32_C(         0) } },
    { {           UINT32_MAX, UINT32_C(2957451979) },
      { -INT32_C(          33),  INT32_C(  1240703795) },
      { UINT32_C(         0), UINT32_C(         0) } },
    { { UINT32_C(2136813645), UINT32_C(3441609201) },
      {  INT32_C(          25), -INT32_C(          20) },
      { UINT32_C(2583691264), UINT32_C(      3282) } },
    { { UINT32_C(  49107157), UINT32_C( 877904641) },
      { -INT32_C(          28), -INT32_C(          24) },
      { UINT32_C(         0), UINT32_C(        52) } },
    { { UINT32_C( 763522156), UINT32_C(1284773402) },
      { -INT32_C(    33618445),  INT32_C(          23) },
      { UINT32_C(     93203), UINT32_C( 218103808) } },
    { { UINT32_C(1501702642), UINT32_C(3052142703) },
      {  INT32_C(   358068427), -INT32_C(          26) },
      { UINT32_C(         0), UINT32_C(        45) } },
    { { UINT32_C(4041704701), UINT32_C(3421365897) },
      { -INT32_C(          28),  INT32_C(          25) },
      { UINT32_C(        15), UINT32_C( 301989888) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint32x2_t a = simde_vld1_u32(test_vec[i].a);
    simde_int32x2_t b = simde_vld1_s32(test_vec[i].b);
    simde_uint32x2_t r = simde_vrshl_u32(a, b);
    simde_test_arm_neon_assert_equal_u32x2(r, simde_vld1_u32(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  uint32_t a_patch[] = { UINT32_MAX, UINT32_C(1) << (32 - 1), UINT32_MAX };
  int32_t  b_patch[] = {         32,                     -32,    -32 - 1 };

  for (int i = 0 ; i < 8 ; i++) {
    simde_uint32x2_private a_ = simde_uint32x2_to_private(simde_test_arm_neon_random_u32x2());
    simde_int32x2_private b_ = simde_int32x2_to_private(simde_test_arm_neon_random_i32x2());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 32) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_uint32x2_t a = simde_uint32x2_from_private(a_);
    simde_int32x2_t b = simde_int32x2_from_private(b_);

    simde_uint32x2_t r = simde_vrshl_u32(a, b);

    simde_test_arm_neon_write_u32x2(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i32x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_u32x2(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshl_u64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    uint64_t a[1];
    int64_t b[1];
    uint64_t r[1];
  } test_vec[] = {
    { {                    UINT64_MAX },
      {  INT64_C(                  64) },
      { UINT64_C(                   0) } },
    { { UINT64_C( 9223372036854775808) },
      { -INT64_C(                  64) },
      { UINT64_C(                   1) } },
    { {                    UINT64_MAX },
      { -INT64_C(                  65) },
      { UINT64_C(                   0) } },
    { { UINT64_C(10532064071281456190) },
      { -INT64_C(                  62) },
      { UINT64_C(                   2) } },
    { { UINT64_C(  199871928094595380) },
      { -INT64_C(                  34) },
      { UINT64_C(            11634077) } },
    { { UINT64_C( 4091501470598780608) },
      {  INT64_C(                  61) },
      { UINT64_C(                   0) } },
    { { UINT64_C(17991294013086143349) },
      {  INT64_C(                  53) },
      { UINT64_C( 7971371340445777920) } },
    { { UINT64_C(11884907251678901604) },
      {  INT64_C(                  38) },
      { UINT64_C( 3620147532010618880) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint64x1_t a = simde_vld1_u64(test_vec[i].a);
    simde_int64x1_t b = simde_vld1_s64(test_vec[i].b);
    simde_uint64x1_t r = simde_vrshl_u64(a, b);
    simde_test_arm_neon_assert_equal_u64x1(r, simde_vld1_u64(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  uint64_t a_patch[] = { UINT64_MAX, UINT64_C(1) << (64 - 1), UINT64_MAX };
  int64_t  b_patch[] = {         64,                     -64,    -64 - 1 };

  for (int i = 0 ; i < 8 ; i++) {
    simde_uint64x1_private a_ = simde_uint64x1_to_private(simde_test_arm_neon_random_u64x1());
    simde_int64x1_private b_ = simde_int64x1_to_private(simde_test_arm_neon_random_i64x1());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_llabs(b_.values[j]) > 64) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_uint64x1_t a = simde_uint64x1_from_private(a_);
    simde_int64x1_t b = simde_int64x1_from_private(b_);

    simde_uint64x1_t r = simde_vrshl_u64(a, b);

    simde_test_arm_neon_write_u64x1(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i64x1(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_u64x1(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshlq_s8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int8_t a[16];
    int8_t b[16];
    int8_t r[16];
  } test_vec[] = {
    { { -INT8_C(   1),  INT8_C(  67), -INT8_C(  65), -INT8_C(  26), -INT8_C(  36), -INT8_C(  38), -INT8_C(  38),  INT8_C(   6),
        -INT8_C(  85),  INT8_C(  72),  INT8_C(  19), -INT8_C( 102),  INT8_C(  13), -INT8_C( 105), -INT8_C(  35), -INT8_C(  22) },
      {  INT8_C(   8), -INT8_C( 127), -INT8_C(   7),  INT8_C(  51),  INT8_C(   5), -INT8_C(   6), -INT8_C(   6),  INT8_C(   6),
         INT8_C(  79), -INT8_C(   8),  INT8_C(   7), -INT8_C(   6), -INT8_C(   7), -INT8_C(   5),  INT8_C(   5),  INT8_C(   8) },
      {  INT8_C(   0),  INT8_C(   0), -INT8_C(   1),  INT8_C(   0),      INT8_MIN, -INT8_C(   1), -INT8_C(   1),      INT8_MIN,
         INT8_C(   0),  INT8_C(   0),      INT8_MIN, -INT8_C(   2),  INT8_C(   0), -INT8_C(   3), -INT8_C(  96),  INT8_C(   0) } },
    { { -INT8_C(   1), -INT8_C(  99),  INT8_C(  23), -INT8_C(  95), -INT8_C( 121), -INT8_C(  57), -INT8_C(  71), -INT8_C(  42),
         INT8_C(  73),  INT8_C(  42), -INT8_C(  63), -INT8_C(  30),  INT8_C(   6), -INT8_C(  58), -INT8_C(  22),  INT8_C(  37) },
      { -INT8_C(   8), -INT8_C(   5),  INT8_C(   8),  INT8_C(   5), -INT8_C(   6),  INT8_C(   8),  INT8_C( 115), -INT8_C(   5),
         INT8_C(   6),  INT8_C(   5), -INT8_C(   6), -INT8_C(  28),  INT8_C(   6), -INT8_C(   5), -INT8_C(   7),  INT8_C(   5) },
      {  INT8_C(   0), -INT8_C(   3),  INT8_C(   0),  INT8_C(  32), -INT8_C(   2),  INT8_C(   0),  INT8_C(   0), -INT8_C(   1),
         INT8_C(  64),  INT8_C(  64), -INT8_C(   1),  INT8_C(   0),      INT8_MIN, -INT8_C(   2),  INT8_C(   0), -INT8_C(  96) } },
    { { -INT8_C( 108),  INT8_C(  45),  INT8_C(  16),  INT8_C(  53),  INT8_C(  79), -INT8_C( 125), -INT8_C(  25), -INT8_C( 121),
        -INT8_C(  37), -INT8_C(  73),  INT8_C( 107), -INT8_C(  11), -INT8_C( 111),  INT8_C(  51),  INT8_C(  83),  INT8_C(   7) },
      {  INT8_C(   4),  INT8_C(   5),  INT8_C(   5), -INT8_C(   5),  INT8_C(   4), -INT8_C(   5), -INT8_C(   6), -INT8_C(  22),
         INT8_C(   6),  INT8_C(   7), -INT8_C(  46), -INT8_C(   7),  INT8_C(   6), -INT8_C(  34), -INT8_C(   5), -INT8_C(   7) },
      {  INT8_C(  64), -INT8_C(  96),  INT8_C(   0),  INT8_C(   2), -INT8_C(  16), -INT8_C(   4),  INT8_C(   0),  INT8_C(   0),
        -INT8_C(  64),      INT8_MIN,  INT8_C(   0),  INT8_C(   0),  INT8_C(  64),  INT8_C(   0),  INT8_C(   3),  INT8_C(   0) } },
    { { -INT8_C(  71),  INT8_C(  58),  INT8_C(  75), -INT8_C(  62),  INT8_C(  19), -INT8_C(  12), -INT8_C(  84), -INT8_C( 127),
         INT8_C( 110),  INT8_C( 126),  INT8_C(  75), -INT8_C(  93),  INT8_C(  93), -INT8_C(   5),  INT8_C( 109),  INT8_C( 104) },
      { -INT8_C(   5),  INT8_C(   6), -INT8_C(   8), -INT8_C(   2),  INT8_C(   5), -INT8_C(   6),  INT8_C(   7), -INT8_C(   5),
        -INT8_C(  14),  INT8_C(  50),  INT8_C(   7),  INT8_C( 114), -INT8_C(   7),  INT8_C(   5),  INT8_C(   5),  INT8_C(   5) },
      { -INT8_C(   2),      INT8_MIN,  INT8_C(   0), -INT8_C(  15),  INT8_C(  96),  INT8_C(   0),  INT8_C(   0), -INT8_C(   4),
         INT8_C(   0),  INT8_C(   0),      INT8_MIN,  INT8_C(   0),  INT8_C(   1),  INT8_C(  96), -INT8_C(  96),  INT8_C(   0) } },
    { {  INT8_C(  46), -INT8_C(  56),  INT8_C(  32),      INT8_MAX,  INT8_C( 110),  INT8_C(  62),  INT8_C( 109),  INT8_C(  96),
         INT8_C( 112), -INT8_C( 119), -INT8_C(  45),  INT8_C(   9), -INT8_C(  37), -INT8_C(  40),  INT8_C(  92),  INT8_C( 103) },
      {  INT8_C(  40),  INT8_C(   7),  INT8_C(   6),  INT8_C( 109),  INT8_C(   6),  INT8_C(  39),  INT8_C(   7),  INT8_C(   7),
        -INT8_C( 109),  INT8_C(   7),  INT8_C(   6), -INT8_C(   6),  INT8_C(   7),  INT8_C(  18),  INT8_C(  28),  INT8_C(   6) },
      {  INT8_C(   0),  INT8_C(   0),  INT8_C(   0),  INT8_C(   0),      INT8_MIN,  INT8_C(   0),      INT8_MIN,  INT8_C(   0),
         INT8_C(   0),      INT8_MIN, -INT8_C(  64),  INT8_C(   0),      INT8_MIN,  INT8_C(   0),  INT8_C(   0), -INT8_C(  64) } },
    { { -INT8_C(  63),  INT8_C(  38), -INT8_C(  22), -INT8_C(  14),  INT8_C(  77),  INT8_C(   9),  INT8_C(  99), -INT8_C(  31),
             INT8_MAX,  INT8_C( 113), -INT8_C(  37), -INT8_C(  73), -INT8_C( 125), -INT8_C(   8),  INT8_C(  30),  INT8_C(  94) },
      {  INT8_C(  53),  INT8_C(   5), -INT8_C(   6), -INT8_C(   5),  INT8_C(  89),  INT8_C(   5), -INT8_C(   7),  INT8_C(   6),
        -INT8_C(   7), -INT8_C(   8), -INT8_C(  17),  INT8_C(   8), -INT8_C(  32),  INT8_C(   7), -INT8_C(   7), -INT8_C(   6) },
      {  INT8_C(   0), -INT8_C(  64),  INT8_C(   0),  INT8_C(   0),  INT8_C(   0),  INT8_C(  32),  INT8_C(   1),  INT8_C(  64),
         INT8_C(   1),  INT8_C(   0),  INT8_C(   0),  INT8_C(   0),  INT8_C(   0),  INT8_C(   0),  INT8_C(   0),  INT8_C(   1) } },
    { { -INT8_C(  20), -INT8_C(  15),  INT8_C(  27),  INT8_C(  69),  INT8_C(  66), -INT8_C(  74),  INT8_C( 124),  INT8_C(  16),
         INT8_C(  70),  INT8_C( 107),  INT8_C(  50),  INT8_C(  38),  INT8_C( 121), -INT8_C(  47), -INT8_C(  57), -INT8_C(  82) },
      {  INT8_C(   5),  INT8_C(   5),  INT8_C(   6), -INT8_C(   5),  INT8_C(   5), -INT8_C(   7), -INT8_C(   2), -INT8_C(   5),
        -INT8_C(  47), -INT8_C(   8), -INT8_C(   6),  INT8_C(   8), -INT8_C(   6), -INT8_C(  17),  INT8_C( 115), -INT8_C( 101) },
      {      INT8_MIN,  INT8_C(  32), -INT8_C(  64),  INT8_C(   2),  INT8_C(  64), -INT8_C(   1),  INT8_C(  31),  INT8_C(   1),
         INT8_C(   0),  INT8_C(   0),  INT8_C(   1),  INT8_C(   0),  INT8_C(   2),  INT8_C(   0),  INT8_C(   0),  INT8_C(   0) } },
    { { -INT8_C(  45),  INT8_C(  31),  INT8_C( 124),  INT8_C(  36), -INT8_C(  78),  INT8_C( 122), -INT8_C(  34), -INT8_C( 125),
         INT8_C(  65), -INT8_C( 125), -INT8_C( 117), -INT8_C(  16),  INT8_C( 114), -INT8_C(   1), -INT8_C( 117),  INT8_C(  82) },
      { -INT8_C(   8),  INT8_C(   6),  INT8_C( 117), -INT8_C(  45), -INT8_C(   7), -INT8_C(   6),  INT8_C(   5), -INT8_C(   8),
         INT8_C(   6),  INT8_C(   8), -INT8_C(   6),  INT8_C(   8), -INT8_C(   8), -INT8_C(   5), -INT8_C(   6),  INT8_C(   5) },
      {  INT8_C(   0), -INT8_C(  64),  INT8_C(   0),  INT8_C(   0), -INT8_C(   1),  INT8_C(   2), -INT8_C(  64),  INT8_C(   0),
         INT8_C(  64),  INT8_C(   0), -INT8_C(   2),  INT8_C(   0),  INT8_C(   0),  INT8_C(   0), -INT8_C(   2),  INT8_C(  64) } },
#if !defined(SIMDE_X86_SSE_NATIVE) && !defined(SIMDE_X86_MMX_NATIVE)
    { {      INT8_MAX,      INT8_MAX,      INT8_MAX,      INT8_MAX,     INT8_MAX,       INT8_MAX,      INT8_MAX,      INT8_MAX,
             INT8_MAX,      INT8_MAX,      INT8_MAX,      INT8_MAX,     INT8_MAX,       INT8_MAX,      INT8_MAX,      INT8_MAX },
      { -INT8_C(   1), -INT8_C(   1), -INT8_C(   1), -INT8_C(   1), -INT8_C(  1),  -INT8_C(   1), -INT8_C(   1), -INT8_C(   1),
        -INT8_C(   1), -INT8_C(   1), -INT8_C(   1), -INT8_C(   1), -INT8_C(  1),  -INT8_C(   1), -INT8_C(   1), -INT8_C(   1) },
      {  INT8_C(  64),  INT8_C(  64),  INT8_C(  64),  INT8_C(  64),  INT8_C( 64),   INT8_C(  64),  INT8_C(  64),  INT8_C(  64),
         INT8_C(  64),  INT8_C(  64),  INT8_C(  64),  INT8_C(  64),  INT8_C( 64),   INT8_C(  64),  INT8_C(  64),  INT8_C(  64) } },
#endif
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int8x16_t a = simde_vld1q_s8(test_vec[i].a);
    simde_int8x16_t b = simde_vld1q_s8(test_vec[i].b);
    simde_int8x16_t r = simde_vrshlq_s8(a, b);

    simde_test_arm_neon_assert_equal_i8x16(r, simde_vld1q_s8(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  int8_t a_patch[] = { -INT8_C(1), -INT8_C(1) };
  int8_t b_patch[] = {          8,         -8 };


  for (int i = 0 ; i < 8 ; i++) {
    simde_int8x16_private a_ = simde_int8x16_to_private(simde_test_arm_neon_random_i8x16());
    simde_int8x16_private b_ = simde_int8x16_to_private(simde_test_arm_neon_random_i8x16());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 8) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_int8x16_t a = simde_int8x16_from_private(a_);
    simde_int8x16_t b = simde_int8x16_from_private(b_);

    simde_int8x16_t r = simde_vrshlq_s8(a, b);

    simde_test_arm_neon_write_i8x16(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i8x16(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i8x16(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshlq_s16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int16_t a[8];
    int16_t b[8];
    int16_t r[8];
  } test_vec[] = {
    { { -INT16_C(     1), -INT16_C( 24733), -INT16_C( 31663), -INT16_C( 14535), -INT16_C( 12245), -INT16_C( 20602), -INT16_C( 20992), -INT16_C( 32646) },
      {  INT16_C(    16), -INT16_C(  5416),  INT16_C(    15), -INT16_C(    16), -INT16_C(    13),  INT16_C(    13),  INT16_C(    15), -INT16_C(    15) },
      {  INT16_C(     0),  INT16_C(     0),       INT16_MIN,  INT16_C(     0), -INT16_C(     1), -INT16_C( 16384),  INT16_C(     0), -INT16_C(     1) } },
    { { -INT16_C(     1),  INT16_C( 28375),  INT16_C( 21093),  INT16_C( 11758), -INT16_C( 14819),  INT16_C( 23319), -INT16_C(  3519),  INT16_C(  5852) },
      { -INT16_C(    16), -INT16_C(    14), -INT16_C(    13), -INT16_C(    14), -INT16_C(  3822),  INT16_C(  4095),  INT16_C(    12), -INT16_C(    12) },
      {  INT16_C(     0),  INT16_C(     2),  INT16_C(     3),  INT16_C(     1),  INT16_C(     0),  INT16_C( 11660),  INT16_C(  4096),  INT16_C(     1) } },
    { { -INT16_C( 28383),  INT16_C( 25305), -INT16_C( 18813),  INT16_C(  5240), -INT16_C(  1004), -INT16_C( 28452),  INT16_C( 27030), -INT16_C( 22491) },
      {  INT16_C(     9), -INT16_C(    11), -INT16_C(     9),  INT16_C(    15),  INT16_C(    10),  INT16_C(    11),  INT16_C(    11), -INT16_C(    13) },
      {  INT16_C( 16896),  INT16_C(    12), -INT16_C(    37),  INT16_C(     0),  INT16_C( 20480), -INT16_C(  8192), -INT16_C( 20480), -INT16_C(     3) } },
    { {  INT16_C(  2726),  INT16_C( 15377),  INT16_C( 14195), -INT16_C( 12827), -INT16_C( 25253), -INT16_C( 20297), -INT16_C( 24692), -INT16_C( 29715) },
      {  INT16_C(    15), -INT16_C(    12), -INT16_C( 14211),  INT16_C(     9), -INT16_C(    12), -INT16_C(    10),  INT16_C(    11), -INT16_C(    15) },
      {  INT16_C(     0),  INT16_C(     4),  INT16_C(     0), -INT16_C( 13824), -INT16_C(     6), -INT16_C(    20),  INT16_C( 24576), -INT16_C(     1) } },
    { {  INT16_C( 23984),  INT16_C( 15553), -INT16_C( 20484), -INT16_C(  4153), -INT16_C( 19929), -INT16_C( 23409), -INT16_C(   134), -INT16_C(  1609) },
      { -INT16_C(    14), -INT16_C(  5147),  INT16_C(    10), -INT16_C(    12),  INT16_C(    10), -INT16_C( 31106),  INT16_C(     9), -INT16_C(    13) },
      {  INT16_C(     1),  INT16_C(     0), -INT16_C(  4096), -INT16_C(     1), -INT16_C( 25600),  INT16_C(     0), -INT16_C(  3072),  INT16_C(     0) } },
    { { -INT16_C(   637), -INT16_C(   558), -INT16_C( 29956), -INT16_C( 25354), -INT16_C(  9361), -INT16_C( 20601),  INT16_C( 25389), -INT16_C(   427) },
      { -INT16_C( 11154), -INT16_C(    15),  INT16_C(    13),  INT16_C( 31321),  INT16_C( 25459),  INT16_C( 31737),  INT16_C(    12), -INT16_C( 18263) },
      {  INT16_C(     0),  INT16_C(     0),       INT16_MIN,  INT16_C(     0),  INT16_C(     0), -INT16_C(   161), -INT16_C( 12288),  INT16_C(     0) } },
    { { -INT16_C( 32121), -INT16_C( 19164),  INT16_C( 31462),  INT16_C( 21683),  INT16_C( 14158),  INT16_C( 18143),  INT16_C( 14418), -INT16_C( 14911) },
      { -INT16_C(     9), -INT16_C(    12), -INT16_C(  5600), -INT16_C(    16),  INT16_C( 15718),  INT16_C(    13), -INT16_C(  8215),  INT16_C(    14) },
      { -INT16_C(    63), -INT16_C(     5),  INT16_C(     0),  INT16_C(     0),  INT16_C(     0), -INT16_C(  8192),  INT16_C(     0),  INT16_C( 16384) } },
    { {  INT16_C( 31504),  INT16_C( 25108), -INT16_C( 10829),  INT16_C( 20263),  INT16_C( 26767), -INT16_C( 20705), -INT16_C( 22702), -INT16_C( 18381) },
      {  INT16_C(    11), -INT16_C(    13),  INT16_C(    11),  INT16_C(    10),  INT16_C(    12), -INT16_C(    15),  INT16_C(    14),  INT16_C( 20055) },
      {       INT16_MIN,  INT16_C(     3), -INT16_C( 26624), -INT16_C( 25600), -INT16_C(  4096), -INT16_C(     1),       INT16_MIN,  INT16_C(     0) } },
#if !defined(SIMDE_X86_SSE_NATIVE) && !defined(SIMDE_X86_MMX_NATIVE)
    { {        INT16_MAX,        INT16_MAX,        INT16_MAX,         INT16_MAX,       INT16_MAX,        INT16_MAX,        INT16_MAX,        INT16_MAX },
      { -INT16_C(     1), -INT16_C(     1), -INT16_C(     1), -INT16_C(     1), -INT16_C(     1), -INT16_C(     1), -INT16_C(     1), -INT16_C(     1) },
      {  INT16_C( 16384),  INT16_C( 16384),  INT16_C( 16384),  INT16_C( 16384),  INT16_C( 16384),  INT16_C( 16384),  INT16_C( 16384),  INT16_C( 16384) } },
#endif
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int16x8_t a = simde_vld1q_s16(test_vec[i].a);
    simde_int16x8_t b = simde_vld1q_s16(test_vec[i].b);
    simde_int16x8_t r = simde_vrshlq_s16(a, b);

    simde_test_arm_neon_assert_equal_i16x8(r, simde_vld1q_s16(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  int16_t a_patch[] = { -INT16_C(1), -INT16_C(1) };
  int16_t b_patch[] = {          16,         -16 };


  for (int i = 0 ; i < 8 ; i++) {
    simde_int16x8_private a_ = simde_int16x8_to_private(simde_test_arm_neon_random_i16x8());
    simde_int16x8_private b_ = simde_int16x8_to_private(simde_test_arm_neon_random_i16x8());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 16) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_int16x8_t a = simde_int16x8_from_private(a_);
    simde_int16x8_t b = simde_int16x8_from_private(b_);

    simde_int16x8_t r = simde_vrshlq_s16(a, b);

    simde_test_arm_neon_write_i16x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i16x8(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshlq_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int32_t a[4];
    int32_t b[4];
    int32_t r[4];
  } test_vec[] = {
    { { -INT32_C(           1),  INT32_C(   261209098),  INT32_C(   688353192), -INT32_C(  1311148258) },
      {  INT32_C(          32),  INT32_C(   794913842),  INT32_C(          18), -INT32_C(  1422236320) },
      {  INT32_C(           0),  INT32_C(           0), -INT32_C(  1096810496),  INT32_C(           0) } },
    { { -INT32_C(           1),  INT32_C(   796745233), -INT32_C(   924821802),  INT32_C(  1238788374) },
      { -INT32_C(          32),  INT32_C(  1787446282), -INT32_C(          24),  INT32_C(          24) },
      {  INT32_C(           0), -INT32_C(   176667648), -INT32_C(          55),  INT32_C(   369098752) } },
    { { -INT32_C(  1140379162), -INT32_C(  1652234361),  INT32_C(   652630864), -INT32_C(  1654235245) },
      {  INT32_C(  1292431523),  INT32_C(          26),  INT32_C(          21), -INT32_C(          23) },
      {  INT32_C(           0),  INT32_C(   469762048),  INT32_C(  1778384896), -INT32_C(         197) } },
    { {  INT32_C(   567415760),  INT32_C(    21477742), -INT32_C(  1147163368),  INT32_C(  1393141662) },
      {  INT32_C(          30), -INT32_C(          28), -INT32_C(          20), -INT32_C(  1377438756) },
      {  INT32_C(           0),  INT32_C(           0), -INT32_C(        1094),  INT32_C(           0) } },
    { { -INT32_C(  2005527184),  INT32_C(  1615074754), -INT32_C(  2118955588),  INT32_C(   797470603) },
      { -INT32_C(          19),  INT32_C(  1789273229),  INT32_C(          30), -INT32_C(  1282153149) },
      { -INT32_C(        3825),  INT32_C(           0),  INT32_C(           0),  INT32_C(           0) } },
    { { -INT32_C(   618823649),  INT32_C(  1482477773),  INT32_C(   881386816),  INT32_C(   204163199) },
      { -INT32_C(  2072587923), -INT32_C(          24),  INT32_C(          27),  INT32_C(          23) },
      {  INT32_C(           0),  INT32_C(          88),  INT32_C(           0),  INT32_C(  1065353216) } },
    { {  INT32_C(  1446352406), -INT32_C(    91505285),  INT32_C(  1913042437), -INT32_C(   453542521) },
      {  INT32_C(          31),  INT32_C(          29),  INT32_C(          29),  INT32_C(          27) },
      {  INT32_C(           0),  INT32_C(  1610612736), -INT32_C(  1610612736),  INT32_C(   939524096) } },
    { {  INT32_C(  1269846085), -INT32_C(  1900169466),  INT32_C(  1047704628),  INT32_C(   498857806) },
      {  INT32_C(          27),  INT32_C(          16),  INT32_C(          30), -INT32_C(          25) },
      {  INT32_C(   671088640), -INT32_C(  1224343552),  INT32_C(           0),  INT32_C(          15) } },
#if !defined(SIMDE_X86_SSE_NATIVE) && !defined(SIMDE_X86_MMX_NATIVE)
    { {              INT32_MAX,              INT32_MAX,              INT32_MAX,              INT32_MAX },
      { -INT32_C(           1), -INT32_C(           1), -INT32_C(           1), -INT32_C(           1) },
      {  INT32_C(  1073741824),  INT32_C(  1073741824),  INT32_C(  1073741824),  INT32_C(  1073741824) } },
#endif
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int32x4_t a = simde_vld1q_s32(test_vec[i].a);
    simde_int32x4_t b = simde_vld1q_s32(test_vec[i].b);
    simde_int32x4_t r = simde_vrshlq_s32(a, b);
    simde_test_arm_neon_assert_equal_i32x4(r, simde_vld1q_s32(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  int32_t a_patch[] = { -INT32_C(1), -INT32_C(1) };
  int32_t b_patch[] = {          32,         -32 };


  for (int i = 0 ; i < 8 ; i++) {
    simde_int32x4_private a_ = simde_int32x4_to_private(simde_test_arm_neon_random_i32x4());
    simde_int32x4_private b_ = simde_int32x4_to_private(simde_test_arm_neon_random_i32x4());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 32) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_int32x4_t a = simde_int32x4_from_private(a_);
    simde_int32x4_t b = simde_int32x4_from_private(b_);

    simde_int32x4_t r = simde_vrshlq_s32(a, b);

    simde_test_arm_neon_write_i32x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i32x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshlq_s64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int64_t a[2];
    int64_t b[2];
    int64_t r[2];
  } test_vec[] = {
    { { -INT64_C(                   1),  INT64_C( 8313170098058778935) },
      {  INT64_C(                  64), -INT64_C(                  58) },
      {  INT64_C(                   0),  INT64_C(                  29) } },
    { { -INT64_C(                   1),  INT64_C( 7179860541365923026) },
      { -INT64_C(                  64),  INT64_C( 5674951681768987017) },
      {  INT64_C(                   0),  INT64_C(                   0) } },
    { { -INT64_C( 5284824899776078983),  INT64_C( 2324443633642883256) },
      {  INT64_C(                  59), -INT64_C( 3278735591420720609) },
      { -INT64_C( 4035225266123964416), -INT64_C( 5919449151413682176) } },
    { { -INT64_C( 2576212740381314098),  INT64_C( 6562733711055481552) },
      { -INT64_C(                  52),  INT64_C(                  41) },
      { -INT64_C(                 572), -INT64_C( 2101597729238024192) } },
    { {  INT64_C( 5416257340365700737), -INT64_C( 4269616889089575813) },
      {  INT64_C( 3370466030787258188), -INT64_C(                  58) },
      {  INT64_C(                   0), -INT64_C(                  15) } },
    { {  INT64_C( 6209211028984577356), -INT64_C( 7547495314914264550) },
      {  INT64_C(                  63), -INT64_C(                  60) },
      {  INT64_C(                   0), -INT64_C(                   7) } },
    { { -INT64_C( 9093408780739309977),  INT64_C( 5121628945022307474) },
      { -INT64_C(                  53), -INT64_C(                  37) },
      { -INT64_C(                1010),  INT64_C(            37264755) } },
    { {  INT64_C( 1082637037262742893),  INT64_C( 6751871869302762015) },
      {  INT64_C( 5088688905005675581),  INT64_C(                  45) },
      { -INT64_C( 6917529027641081856), -INT64_C( 3655832181890088960) } },
#if !defined(SIMDE_X86_SSE_NATIVE) && !defined(SIMDE_X86_MMX_NATIVE)
    { {                      INT64_MAX,                      INT64_MAX },
      { -INT64_C(                   1), -INT64_C(                   1) },
      {  INT64_C( 4611686018427387904),  INT64_C( 4611686018427387904) } },
#endif
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int64x2_t a = simde_vld1q_s64(test_vec[i].a);
    simde_int64x2_t b = simde_vld1q_s64(test_vec[i].b);
    simde_int64x2_t r = simde_vrshlq_s64(a, b);
    simde_test_arm_neon_assert_equal_i64x2(r, simde_vld1q_s64(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  int64_t a_patch[] = { -INT64_C(1), -INT64_C(1) };
  int64_t b_patch[] = {          64,         -64 };


  for (int i = 0 ; i < 8 ; i++) {
    simde_int64x2_private a_ = simde_int64x2_to_private(simde_test_arm_neon_random_i64x2());
    simde_int64x2_private b_ = simde_int64x2_to_private(simde_test_arm_neon_random_i64x2());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_llabs(b_.values[j]) > 64) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_int64x2_t a = simde_int64x2_from_private(a_);
    simde_int64x2_t b = simde_int64x2_from_private(b_);

    simde_int64x2_t r = simde_vrshlq_s64(a, b);

    simde_test_arm_neon_write_i64x2(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i64x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i64x2(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshlq_u8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    uint8_t a[16];
    int8_t b[16];
    uint8_t r[16];
  } test_vec[] = {
    { {    UINT8_MAX, UINT8_C( 26), UINT8_C( 19), UINT8_C(248), UINT8_C(135), UINT8_C( 38), UINT8_C( 72), UINT8_C(139),
        UINT8_C(117), UINT8_C( 87), UINT8_C(157), UINT8_C(107), UINT8_C(117), UINT8_C( 60), UINT8_C(214), UINT8_C( 38) },
      {  INT8_C(   8), -INT8_C(  24), -INT8_C(   5), -INT8_C(   5),  INT8_C(  32),  INT8_C(  48),  INT8_C(  95), -INT8_C(   5),
         INT8_C(   6),  INT8_C(   7),  INT8_C(   4), -INT8_C(  95), -INT8_C(  53),  INT8_C(   7),  INT8_C(   6),  INT8_C(   5) },
      { UINT8_C(  0), UINT8_C(  0), UINT8_C(  1), UINT8_C(  8), UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C(  4),
        UINT8_C( 64), UINT8_C(128), UINT8_C(208), UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C(128), UINT8_C(192) } },
    { { UINT8_C(128), UINT8_C(251), UINT8_C(187), UINT8_C(102), UINT8_C( 43), UINT8_C( 26), UINT8_C( 66), UINT8_C( 92),
        UINT8_C(138), UINT8_C( 75), UINT8_C(253), UINT8_C( 86), UINT8_C(135), UINT8_C(105), UINT8_C( 97), UINT8_C(222) },
      { -INT8_C(   8),  INT8_C(   6), -INT8_C(   5), -INT8_C(   8), -INT8_C(   5),  INT8_C(   4), -INT8_C(   6),  INT8_C(  84),
         INT8_C(  41),  INT8_C(   6),  INT8_C(   6),  INT8_C(   6), -INT8_C(   8), -INT8_C(   6),  INT8_C(   8), -INT8_C(   6) },
      { UINT8_C(  1), UINT8_C(192), UINT8_C(  6), UINT8_C(  0), UINT8_C(  1), UINT8_C(160), UINT8_C(  1), UINT8_C(  0),
        UINT8_C(  0), UINT8_C(192), UINT8_C( 64), UINT8_C(128), UINT8_C(  1), UINT8_C(  2), UINT8_C(  0), UINT8_C(  3) } },
    { {    UINT8_MAX, UINT8_C(233), UINT8_C( 14), UINT8_C(114), UINT8_C( 13), UINT8_C(185), UINT8_C(198), UINT8_C( 54),
        UINT8_C(234), UINT8_C( 51), UINT8_C(161), UINT8_C(121), UINT8_C(223), UINT8_C(232), UINT8_C( 78), UINT8_C(135) },
      { -INT8_C(   9), -INT8_C(   8),  INT8_C(   5),  INT8_C(   5),  INT8_C(   6), -INT8_C(   8), -INT8_C(   6), -INT8_C(   7),
        -INT8_C(   5), -INT8_C(   6),  INT8_C(  30),  INT8_C(   4),  INT8_C(   4),  INT8_C(   4), -INT8_C(   7), -INT8_C(  59) },
      { UINT8_C(  0), UINT8_C(  1), UINT8_C(192), UINT8_C( 64), UINT8_C( 64), UINT8_C(  1), UINT8_C(  3), UINT8_C(  0),
        UINT8_C(  7), UINT8_C(  1), UINT8_C(  0), UINT8_C(144), UINT8_C(240), UINT8_C(128), UINT8_C(  1), UINT8_C(  0) } },
    { { UINT8_C(209), UINT8_C(242), UINT8_C(240), UINT8_C(215), UINT8_C(125), UINT8_C(155), UINT8_C(166), UINT8_C( 52),
        UINT8_C( 66), UINT8_C(196), UINT8_C(130), UINT8_C( 70), UINT8_C( 15), UINT8_C( 80), UINT8_C( 11), UINT8_C( 68) },
      {  INT8_C(  44),  INT8_C(   8), -INT8_C(   8), -INT8_C(  63),  INT8_C(   8), -INT8_C(   3),  INT8_C(   8),  INT8_C(   7),
         INT8_C(  23),  INT8_C(  57), -INT8_C(   8),  INT8_C(   6), -INT8_C(   8),  INT8_C(   6),  INT8_C(   3),  INT8_C(   5) },
      { UINT8_C(  0), UINT8_C(  0), UINT8_C(  1), UINT8_C(  0), UINT8_C(  0), UINT8_C( 19), UINT8_C(  0), UINT8_C(  0),
        UINT8_C(  0), UINT8_C(  0), UINT8_C(  1), UINT8_C(128), UINT8_C(  0), UINT8_C(  0), UINT8_C( 88), UINT8_C(128) } },
    { { UINT8_C(101), UINT8_C(108), UINT8_C(124), UINT8_C(165), UINT8_C(106), UINT8_C(188), UINT8_C( 22), UINT8_C(129),
        UINT8_C(246), UINT8_C(151), UINT8_C(153), UINT8_C(119), UINT8_C(176), UINT8_C(157), UINT8_C(201), UINT8_C(187) },
      { -INT8_C(   7), -INT8_C(   7),  INT8_C(   8),  INT8_C(   7), -INT8_C(   8), -INT8_C(   1), -INT8_C(   5),  INT8_C(   5),
         INT8_C(  62),  INT8_C(   6), -INT8_C(   8), -INT8_C(   7),  INT8_C(   5), -INT8_C(   5), -INT8_C(   8), -INT8_C(   8) },
      { UINT8_C(  1), UINT8_C(  1), UINT8_C(  0), UINT8_C(128), UINT8_C(  0), UINT8_C( 94), UINT8_C(  1), UINT8_C( 32),
        UINT8_C(  0), UINT8_C(192), UINT8_C(  1), UINT8_C(  1), UINT8_C(  0), UINT8_C(  5), UINT8_C(  1), UINT8_C(  1) } },
    { { UINT8_C(233), UINT8_C(142), UINT8_C( 29), UINT8_C(171), UINT8_C(142), UINT8_C( 12), UINT8_C(  1), UINT8_C(204),
        UINT8_C( 18), UINT8_C(249), UINT8_C(154), UINT8_C( 58), UINT8_C(217), UINT8_C( 34), UINT8_C(199), UINT8_C( 37) },
      {  INT8_C(   4), -INT8_C(   6), -INT8_C(   5), -INT8_C(   6),  INT8_C(   8),  INT8_C(   4), -INT8_C(   7),  INT8_C(  35),
        -INT8_C(  30), -INT8_C(   7), -INT8_C(   5),  INT8_C(  80), -INT8_C(   8), -INT8_C(   1),  INT8_C(   4), -INT8_C(   6) },
      { UINT8_C(144), UINT8_C(  2), UINT8_C(  1), UINT8_C(  3), UINT8_C(  0), UINT8_C(192), UINT8_C(  0), UINT8_C(  0),
        UINT8_C(  0), UINT8_C(  2), UINT8_C(  5), UINT8_C(  0), UINT8_C(  1), UINT8_C( 17), UINT8_C(112), UINT8_C(  1) } },
    { { UINT8_C(134), UINT8_C( 44), UINT8_C(180), UINT8_C(201), UINT8_C( 62), UINT8_C( 83), UINT8_C(236), UINT8_C( 33),
        UINT8_C( 32), UINT8_C(160), UINT8_C(113), UINT8_C(228), UINT8_C(160), UINT8_C(191), UINT8_C(145), UINT8_C( 46) },
      {  INT8_C(   5), -INT8_C(   6),  INT8_C(  74), -INT8_C(   6),  INT8_C(   8),  INT8_C(   6),  INT8_C(   5), -INT8_C(   7),
        -INT8_C(   5), -INT8_C(  16), -INT8_C(   8),  INT8_C(  90),  INT8_C(   7),  INT8_C(   5),  INT8_C(  38),  INT8_C(   2) },
      { UINT8_C(192), UINT8_C(  1), UINT8_C(  0), UINT8_C(  3), UINT8_C(  0), UINT8_C(192), UINT8_C(128), UINT8_C(  0),
        UINT8_C(  1), UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C(  0), UINT8_C(224), UINT8_C(  0), UINT8_C(184) } },
    { { UINT8_C(173), UINT8_C(112), UINT8_C(157), UINT8_C(241), UINT8_C(162), UINT8_C(201), UINT8_C(137), UINT8_C( 87),
        UINT8_C(185), UINT8_C( 78), UINT8_C(177), UINT8_C( 53), UINT8_C(100), UINT8_C(215), UINT8_C( 55), UINT8_C(166) },
      { -INT8_C(   5),  INT8_C(   2),  INT8_C(   4), -INT8_C(   5), -INT8_C(  71), -INT8_C(   7),  INT8_C(   5),  INT8_C(  17),
        -INT8_C(   5),  INT8_C(   5),  INT8_C(   4), -INT8_C(   6),  INT8_C(   7),  INT8_C(   5), -INT8_C(   6), -INT8_C(   7) },
      { UINT8_C(  5), UINT8_C(192), UINT8_C(208), UINT8_C(  8), UINT8_C(  0), UINT8_C(  2), UINT8_C( 32), UINT8_C(  0),
        UINT8_C(  6), UINT8_C(192), UINT8_C( 16), UINT8_C(  1), UINT8_C(  0), UINT8_C(224), UINT8_C(  1), UINT8_C(  1) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint8x16_t a = simde_vld1q_u8(test_vec[i].a);
    simde_int8x16_t b = simde_vld1q_s8(test_vec[i].b);
    simde_uint8x16_t r = simde_vrshlq_u8(a, b);

    simde_test_arm_neon_assert_equal_u8x16(r, simde_vld1q_u8(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  uint8_t a_patch[] = { UINT8_MAX, UINT8_C(1) << (8 - 1), UINT8_MAX };
  int8_t  b_patch[] = {         8,                    -8,    -8 - 1 };

  for (int i = 0 ; i < 8 ; i++) {
    simde_uint8x16_private a_ = simde_uint8x16_to_private(simde_test_arm_neon_random_u8x16());
    simde_int8x16_private b_ = simde_int8x16_to_private(simde_test_arm_neon_random_i8x16());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 8) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_uint8x16_t a = simde_uint8x16_from_private(a_);
    simde_int8x16_t b = simde_int8x16_from_private(b_);

    simde_uint8x16_t r = simde_vrshlq_u8(a, b);

    simde_test_arm_neon_write_u8x16(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i8x16(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_u8x16(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshlq_u16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    uint16_t a[8];
    int16_t b[8];
    uint16_t r[8];
  } test_vec[] = {
    { {      UINT16_MAX, UINT16_C(58570), UINT16_C(15575), UINT16_C( 8935), UINT16_C( 7529), UINT16_C(51329), UINT16_C(30589), UINT16_C(20900) },
      {  INT16_C(    16),  INT16_C(    13),  INT16_C(    14),  INT16_C(    14),  INT16_C(    11),  INT16_C(    12), -INT16_C(  6158),  INT16_C(    14) },
      { UINT16_C(    0), UINT16_C(16384), UINT16_C(49152), UINT16_C(49152), UINT16_C(18432), UINT16_C( 4096), UINT16_C(    2), UINT16_C(    0) } },
    { { UINT16_C(32768), UINT16_C(40539), UINT16_C(  126), UINT16_C(43759), UINT16_C(13621), UINT16_C(32734), UINT16_C(33340), UINT16_C(61827) },
      { -INT16_C(    16),  INT16_C(    14),  INT16_C( 31151),  INT16_C( 15277), -INT16_C(    14), -INT16_C( 28257),  INT16_C(     9), -INT16_C(  4060) },
      { UINT16_C(    1), UINT16_C(49152), UINT16_C(    0), UINT16_C(    0), UINT16_C(    1), UINT16_C(    0), UINT16_C(30720), UINT16_C(    0) } },
    { {      UINT16_MAX, UINT16_C(61493), UINT16_C(47284), UINT16_C(14305), UINT16_C(14208), UINT16_C(12203), UINT16_C(22704), UINT16_C( 5995) },
      { -INT16_C(    17), -INT16_C(    15), -INT16_C(    13),  INT16_C(    11),  INT16_C(    13), -INT16_C( 13308),  INT16_C( 22765), -INT16_C( 24190) },
      { UINT16_C(    0), UINT16_C(    2), UINT16_C(    6), UINT16_C( 2048), UINT16_C(    0), UINT16_C(64176), UINT16_C(    0), UINT16_C(    0) } },
    { { UINT16_C( 8617), UINT16_C(22814), UINT16_C(35193), UINT16_C(40048), UINT16_C( 6291), UINT16_C(49805), UINT16_C(28389), UINT16_C(12572) },
      {  INT16_C(    16), -INT16_C(    14), -INT16_C(    16),  INT16_C(     9), -INT16_C(    12), -INT16_C(    12), -INT16_C(    10),  INT16_C(    12) },
      { UINT16_C(    0), UINT16_C(    1), UINT16_C(    1), UINT16_C(57344), UINT16_C(    2), UINT16_C(   12), UINT16_C(   28), UINT16_C(49152) } },
    { { UINT16_C(31227), UINT16_C(57490), UINT16_C(44775), UINT16_C(50450), UINT16_C( 4302), UINT16_C(18064), UINT16_C(64656), UINT16_C(51016) },
      { -INT16_C(    15),  INT16_C(    13),  INT16_C(     8),  INT16_C(    11), -INT16_C(    12), -INT16_C(    14),  INT16_C(    10), -INT16_C(    12) },
      { UINT16_C(    1), UINT16_C(16384), UINT16_C(59136), UINT16_C(36864), UINT16_C(    1), UINT16_C(    1), UINT16_C(16384), UINT16_C(   12) } },
    { { UINT16_C( 2517), UINT16_C(25881), UINT16_C(24837), UINT16_C(65068), UINT16_C(39402), UINT16_C(10598), UINT16_C(59547), UINT16_C(20543) },
      { -INT16_C( 22820), -INT16_C(    10),  INT16_C(    13), -INT16_C(    15),  INT16_C(    14),  INT16_C(    11), -INT16_C(  3331), -INT16_C( 11726) },
      { UINT16_C(    0), UINT16_C(   25), UINT16_C(40960), UINT16_C(    2), UINT16_C(32768), UINT16_C(12288), UINT16_C( 7443), UINT16_C(    0) } },
    { { UINT16_C(26108), UINT16_C(38848), UINT16_C(   77), UINT16_C(10728), UINT16_C(11174), UINT16_C(40924), UINT16_C(24881), UINT16_C(35940) },
      { -INT16_C(     9), -INT16_C( 26644),  INT16_C(    15), -INT16_C(    13), -INT16_C( 24215),  INT16_C(    10), -INT16_C(    14),  INT16_C(   428) },
      { UINT16_C(   51), UINT16_C(    0), UINT16_C(32768), UINT16_C(    1), UINT16_C(    0), UINT16_C(28672), UINT16_C(    2), UINT16_C(    0) } },
    { { UINT16_C(33452), UINT16_C(56754), UINT16_C( 5859), UINT16_C(32105), UINT16_C(22004), UINT16_C(50453), UINT16_C(32627), UINT16_C(56465) },
      {  INT16_C(    11),  INT16_C(     9), -INT16_C(    13),  INT16_C(    11), -INT16_C(    16),  INT16_C(    15),  INT16_C(    15), -INT16_C(    10) },
      { UINT16_C(24576), UINT16_C(25600), UINT16_C(    1), UINT16_C(18432), UINT16_C(    0), UINT16_C(32768), UINT16_C(32768), UINT16_C(   55) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint16x8_t a = simde_vld1q_u16(test_vec[i].a);
    simde_int16x8_t b = simde_vld1q_s16(test_vec[i].b);
    simde_uint16x8_t r = simde_vrshlq_u16(a, b);
    simde_test_arm_neon_assert_equal_u16x8(r, simde_vld1q_u16(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  uint16_t a_patch[] = { UINT16_MAX, UINT16_C(1) << (16 - 1), UINT16_MAX };
  int16_t  b_patch[] = {         16,                     -16,    -16 - 1 };

  for (int i = 0 ; i < 8 ; i++) {
    simde_uint16x8_private a_ = simde_uint16x8_to_private(simde_test_arm_neon_random_u16x8());
    simde_int16x8_private b_ = simde_int16x8_to_private(simde_test_arm_neon_random_i16x8());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 16) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_uint16x8_t a = simde_uint16x8_from_private(a_);
    simde_int16x8_t b = simde_int16x8_from_private(b_);

    simde_uint16x8_t r = simde_vrshlq_u16(a, b);

    simde_test_arm_neon_write_u16x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_u16x8(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshlq_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    uint32_t a[4];
    int32_t b[4];
    uint32_t r[4];
  } test_vec[] = {
    { {           UINT32_MAX, UINT32_C(3316255323), UINT32_C( 187098578), UINT32_C(3195457013) },
      {  INT32_C(          32), -INT32_C(          29), -INT32_C(          22),  INT32_C(          27) },
      { UINT32_C(         0), UINT32_C(         6), UINT32_C(        45), UINT32_C(2818572288) } },
    { { UINT32_C(2147483648), UINT32_C(2776245168), UINT32_C( 425980144), UINT32_C(1793817973) },
      { -INT32_C(          32), -INT32_C(   894871393),  INT32_C(          19),  INT32_C(          20) },
      { UINT32_C(         1), UINT32_C(         0), UINT32_C(2273312768), UINT32_C(3612344320) } },
    { {           UINT32_MAX, UINT32_C(2662521640), UINT32_C(2131271000), UINT32_C( 612199301) },
      { -INT32_C(          33), -INT32_C(          18), -INT32_C(          24),  INT32_C(          28) },
      { UINT32_C(         0), UINT32_C(     10157), UINT32_C(       127), UINT32_C(1342177280) } },
    { { UINT32_C( 503939782), UINT32_C(2778534176), UINT32_C(1086921341), UINT32_C(2306259009) },
      {  INT32_C(          23), -INT32_C(  1778331642),  INT32_C(          28),  INT32_C(          19) },
      { UINT32_C(1660944384), UINT32_C(1732528128), UINT32_C(3489660928), UINT32_C(3255304192) } },
    { { UINT32_C( 535224994), UINT32_C(1029681148), UINT32_C(1204213096), UINT32_C(3601222608) },
      { -INT32_C(          22),  INT32_C(          30), -INT32_C(          26), -INT32_C(          27) },
      { UINT32_C(       128), UINT32_C(         0), UINT32_C(        18), UINT32_C(        27) } },
    { { UINT32_C( 939543248), UINT32_C(4018128415), UINT32_C( 751117585), UINT32_C(3844157899) },
      {  INT32_C(          17), -INT32_C(          22), -INT32_C(          22),  INT32_C(  1751886744) },
      { UINT32_C(2510290944), UINT32_C(       958), UINT32_C(       179), UINT32_C(         0) } },
    { { UINT32_C(1124343857), UINT32_C( 292538949), UINT32_C(1744212475), UINT32_C(2427147716) },
      {  INT32_C(          27), -INT32_C(          25), -INT32_C(          25), -INT32_C(   419691851) },
      { UINT32_C(2281701376), UINT32_C(         9), UINT32_C(        52), UINT32_C(         0) } },
    { { UINT32_C(3329792459), UINT32_C(3995954986), UINT32_C( 410966212), UINT32_C( 558826433) },
      {  INT32_C(          30),  INT32_C(          22), -INT32_C(          24), -INT32_C(   335069919) },
      { UINT32_C(3221225472), UINT32_C(3397386240), UINT32_C(        24), UINT32_C(         0) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint32x4_t a = simde_vld1q_u32(test_vec[i].a);
    simde_int32x4_t b = simde_vld1q_s32(test_vec[i].b);
    simde_uint32x4_t r = simde_vrshlq_u32(a, b);

    simde_test_arm_neon_assert_equal_u32x4(r, simde_vld1q_u32(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  uint32_t a_patch[] = { UINT32_MAX, UINT32_C(1) << (32 - 1), UINT32_MAX };
  int32_t  b_patch[] = {         32,                     -32,    -32 - 1 };

  for (int i = 0 ; i < 8 ; i++) {
    simde_uint32x4_private a_ = simde_uint32x4_to_private(simde_test_arm_neon_random_u32x4());
    simde_int32x4_private b_ = simde_int32x4_to_private(simde_test_arm_neon_random_i32x4());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_abs(b_.values[j]) > 32) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_uint32x4_t a = simde_uint32x4_from_private(a_);
    simde_int32x4_t b = simde_int32x4_from_private(b_);

    simde_uint32x4_t r = simde_vrshlq_u32(a, b);

    simde_test_arm_neon_write_u32x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i32x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_u32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshlq_u64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    uint64_t a[2];
    int64_t b[2];
    uint64_t r[2];
  } test_vec[] = {
    { {                    UINT64_MAX, UINT64_C(16294151362500260038) },
      {  INT64_C(                  64),  INT64_C(                  58) },
      { UINT64_C(                   0), UINT64_C( 1729382256910270464) } },
    { { UINT64_C( 9223372036854775808), UINT64_C(16863135901910622191) },
      { -INT64_C(                  64), -INT64_C(                  47) },
      { UINT64_C(                   1), UINT64_C(              119820) } },
    { {                    UINT64_MAX, UINT64_C( 2005102394293229065) },
      { -INT64_C(                  65), -INT64_C(                  47) },
      { UINT64_C(                   0), UINT64_C(               14247) } },
    { { UINT64_C( 1572984371782268265), UINT64_C(10542706757663446378) },
      { -INT64_C(                  47), -INT64_C(                  59) },
      { UINT64_C(               11177), UINT64_C(                  18) } },
    { { UINT64_C( 9387779671739714207), UINT64_C(14053309784719439957) },
      {  INT64_C(                  44), -INT64_C(                  47) },
      { UINT64_C(15900503842198913024), UINT64_C(               99855) } },
    { { UINT64_C( 3933560557134412309), UINT64_C(10367074293171904885) },
      { -INT64_C(                  54), -INT64_C( 2073254729651704801) },
      { UINT64_C(                 218), UINT64_C( 4489016506151075840) } },
    { { UINT64_C(10824960247039706945), UINT64_C( 4497186091603156343) },
      { -INT64_C(                  33), -INT64_C(                  60) },
      { UINT64_C(          1260191231), UINT64_C(                   4) } },
    { { UINT64_C(13544247016243875936), UINT64_C( 1686370601464357418) },
      {  INT64_C( 5733672828602753178), -INT64_C(                  64) },
      { UINT64_C(                   0), UINT64_C(                   0) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint64x2_t a = simde_vld1q_u64(test_vec[i].a);
    simde_int64x2_t b = simde_vld1q_s64(test_vec[i].b);
    simde_uint64x2_t r = simde_vrshlq_u64(a, b);
    simde_test_arm_neon_assert_equal_u64x2(r, simde_vld1q_u64(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);

  uint64_t a_patch[] = { UINT64_MAX, UINT64_C(1) << (64 - 1), UINT64_MAX };
  int64_t  b_patch[] = {         64,                     -64,    -64 - 1 };

  for (int i = 0 ; i < 8 ; i++) {
    simde_uint64x2_private a_ = simde_uint64x2_to_private(simde_test_arm_neon_random_u64x2());
    simde_int64x2_private b_ = simde_int64x2_to_private(simde_test_arm_neon_random_i64x2());

    for (size_t j = 0 ; j < (sizeof(b_.values) / sizeof(b_.values[0])) ; j++) {
      if (probability(PROBABILITY)) {
        while (simde_math_llabs(b_.values[j]) > 64) {
          b_.values[j] >>= 1;
        }
      }
    }

    if ((size_t) i < (sizeof(a_patch) / sizeof(a_patch[0]))) {
      a_.values[0] = a_patch[i];
      b_.values[0] = b_patch[i];
    }

    simde_uint64x2_t a = simde_uint64x2_from_private(a_);
    simde_int64x2_t b = simde_int64x2_from_private(b_);

    simde_uint64x2_t r = simde_vrshlq_u64(a, b);

    simde_test_arm_neon_write_u64x2(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i64x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_u64x2(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vrshld_s64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int64_t a;
    int64_t b;
    int64_t r;
  } test_vec[] = {
    {  INT64_C( 7235246673386222188),
      -INT64_C( 6802743124129050522),
       INT64_C(                   0) },
    {  INT64_C( 2374865386728665409),
      -INT64_C( 5279494975934354335),
       INT64_C(                   0) },
    {  INT64_C( 7462768052823343018),
      -INT64_C( 5876693465748496476),
       INT64_C(                   0) },
    {  INT64_C( 6888037920171935739),
      -INT64_C( 5591869810952335003),
       INT64_C(                   0) },
    { -INT64_C( 3938554941343329809),
       INT64_C( 5704947285483948560),
       INT64_C( 8153187541293400064) },
    {  INT64_C( 1022139723881607378),
      -INT64_C( 4347624192171236113),
       INT64_C(       7798307219556) },
    {  INT64_C(  802215758266599987),
      -INT64_C( 7478308790315926636),
       INT64_C(                   0) },
    {  INT64_C( 5538469170421235237),
      -INT64_C( 1201353086719452740),
       INT64_C(                   0) }
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    int64_t r = simde_vrshld_s64(test_vec[i].a, test_vec[i].b);
    simde_assert_equal_i64(r, test_vec[i].r);
  }

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    int64_t a = simde_test_codegen_random_i64();
    int64_t b = simde_test_codegen_random_i64();
    int64_t r = simde_vrshld_s64(a, b);

    simde_test_codegen_write_i64(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_codegen_write_i64(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i64(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

SIMDE_TEST_FUNC_LIST_BEGIN
SIMDE_TEST_FUNC_LIST_ENTRY(vrshl_s8)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshl_s16)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshl_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshl_s64)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshl_u8)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshl_u16)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshl_u32)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshl_u64)

SIMDE_TEST_FUNC_LIST_ENTRY(vrshlq_s8)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshlq_s16)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshlq_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshlq_s64)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshlq_u8)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshlq_u16)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshlq_u32)
SIMDE_TEST_FUNC_LIST_ENTRY(vrshlq_u64)

SIMDE_TEST_FUNC_LIST_ENTRY(vrshld_s64)
SIMDE_TEST_FUNC_LIST_END

#include "test-neon-footer.h"