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

#include "test-neon.h"
#include "../../../simde/arm/neon/ext.h"

HEDLEY_DIAGNOSTIC_PUSH
SIMDE_DIAGNOSTIC_DISABLE_UNREACHABLE_

static int
test_simde_vext_f16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    simde_float16_t a[4];
    simde_float16_t b[4];
    int n;
    simde_float16_t r[4];
  } test_vec[] = {
    { { SIMDE_FLOAT16_VALUE(-13.7), SIMDE_FLOAT16_VALUE(-11.7), SIMDE_FLOAT16_VALUE(-14.2), SIMDE_FLOAT16_VALUE(-6.9) },
      { SIMDE_FLOAT16_VALUE(-1.5), SIMDE_FLOAT16_VALUE(-6.5), SIMDE_FLOAT16_VALUE(-12.9), SIMDE_FLOAT16_VALUE(7.6) },
        INT32_C(3),
      { SIMDE_FLOAT16_VALUE(-6.9), SIMDE_FLOAT16_VALUE(-1.5), SIMDE_FLOAT16_VALUE(-6.5), SIMDE_FLOAT16_VALUE(-12.9) } },
    { { SIMDE_FLOAT16_VALUE(-11.0), SIMDE_FLOAT16_VALUE(0.5), SIMDE_FLOAT16_VALUE(0.4), SIMDE_FLOAT16_VALUE(-9.1) },
      { SIMDE_FLOAT16_VALUE(8.7), SIMDE_FLOAT16_VALUE(-5.3), SIMDE_FLOAT16_VALUE(5.4), SIMDE_FLOAT16_VALUE(5.8) },
        INT32_C(0),
      { SIMDE_FLOAT16_VALUE(-11.0), SIMDE_FLOAT16_VALUE(0.5), SIMDE_FLOAT16_VALUE(0.4), SIMDE_FLOAT16_VALUE(-9.1) } },
    { { SIMDE_FLOAT16_VALUE(-6.9), SIMDE_FLOAT16_VALUE(-14.8), SIMDE_FLOAT16_VALUE(13.5), SIMDE_FLOAT16_VALUE(-10.6) },
      { SIMDE_FLOAT16_VALUE(11.1), SIMDE_FLOAT16_VALUE(12.9), SIMDE_FLOAT16_VALUE(2.9), SIMDE_FLOAT16_VALUE(-7.8) },
        INT32_C(0),
      { SIMDE_FLOAT16_VALUE(-6.9), SIMDE_FLOAT16_VALUE(-14.8), SIMDE_FLOAT16_VALUE(13.5), SIMDE_FLOAT16_VALUE(-10.6) } },
    { { SIMDE_FLOAT16_VALUE(0.5), SIMDE_FLOAT16_VALUE(12.8), SIMDE_FLOAT16_VALUE(6.3), SIMDE_FLOAT16_VALUE(11.0) },
      { SIMDE_FLOAT16_VALUE(11.2), SIMDE_FLOAT16_VALUE(8.6), SIMDE_FLOAT16_VALUE(8.6), SIMDE_FLOAT16_VALUE(-0.5) },
        INT32_C(2),
      { SIMDE_FLOAT16_VALUE(6.3), SIMDE_FLOAT16_VALUE(11.0), SIMDE_FLOAT16_VALUE(11.2), SIMDE_FLOAT16_VALUE(8.6) } },
    { { SIMDE_FLOAT16_VALUE(-6.9), SIMDE_FLOAT16_VALUE(-7.3), SIMDE_FLOAT16_VALUE(10.8), SIMDE_FLOAT16_VALUE(-5.3) },
      { SIMDE_FLOAT16_VALUE(10.8), SIMDE_FLOAT16_VALUE(-6.5), SIMDE_FLOAT16_VALUE(11.4), SIMDE_FLOAT16_VALUE(2.7) },
        INT32_C(2),
      { SIMDE_FLOAT16_VALUE(10.8), SIMDE_FLOAT16_VALUE(-5.3), SIMDE_FLOAT16_VALUE(10.8), SIMDE_FLOAT16_VALUE(-6.5) } },
    { { SIMDE_FLOAT16_VALUE(-8.3), SIMDE_FLOAT16_VALUE(-14.3), SIMDE_FLOAT16_VALUE(14.6), SIMDE_FLOAT16_VALUE(-0.7) },
      { SIMDE_FLOAT16_VALUE(-1.5), SIMDE_FLOAT16_VALUE(14.2), SIMDE_FLOAT16_VALUE(-14.9), SIMDE_FLOAT16_VALUE(8.1) },
        INT32_C(1),
      { SIMDE_FLOAT16_VALUE(-14.3), SIMDE_FLOAT16_VALUE(14.6), SIMDE_FLOAT16_VALUE(-0.7), SIMDE_FLOAT16_VALUE(-1.5) } },
    { { SIMDE_FLOAT16_VALUE(15.0), SIMDE_FLOAT16_VALUE(1.1), SIMDE_FLOAT16_VALUE(11.7), SIMDE_FLOAT16_VALUE(-13.5) },
      { SIMDE_FLOAT16_VALUE(-0.2), SIMDE_FLOAT16_VALUE(-4.4), SIMDE_FLOAT16_VALUE(-9.7), SIMDE_FLOAT16_VALUE(6.9) },
        INT32_C(0),
      { SIMDE_FLOAT16_VALUE(15.0), SIMDE_FLOAT16_VALUE(1.1), SIMDE_FLOAT16_VALUE(11.7), SIMDE_FLOAT16_VALUE(-13.5) } },
    { { SIMDE_FLOAT16_VALUE(1.0), SIMDE_FLOAT16_VALUE(9.5), SIMDE_FLOAT16_VALUE(-12.1), SIMDE_FLOAT16_VALUE(-3.7) },
      { SIMDE_FLOAT16_VALUE(8.1), SIMDE_FLOAT16_VALUE(2.0), SIMDE_FLOAT16_VALUE(-12.1), SIMDE_FLOAT16_VALUE(8.3) },
        INT32_C(1),
      { SIMDE_FLOAT16_VALUE(9.5), SIMDE_FLOAT16_VALUE(-12.1), SIMDE_FLOAT16_VALUE(-3.7), SIMDE_FLOAT16_VALUE(8.1) } },
    { { SIMDE_FLOAT16_VALUE(-0.4), SIMDE_FLOAT16_VALUE(-12.9), SIMDE_FLOAT16_VALUE(-7.7), SIMDE_FLOAT16_VALUE(0.4) },
      { SIMDE_FLOAT16_VALUE(-3.6), SIMDE_FLOAT16_VALUE(-0.0), SIMDE_FLOAT16_VALUE(-0.1), SIMDE_FLOAT16_VALUE(2.6) },
        INT32_C(3),
      { SIMDE_FLOAT16_VALUE(0.4), SIMDE_FLOAT16_VALUE(-3.6), SIMDE_FLOAT16_VALUE(-0.0), SIMDE_FLOAT16_VALUE(-0.1) } },
    { { SIMDE_FLOAT16_VALUE(-8.6), SIMDE_FLOAT16_VALUE(9.3), SIMDE_FLOAT16_VALUE(2.0), SIMDE_FLOAT16_VALUE(-9.2) },
      { SIMDE_FLOAT16_VALUE(2.4), SIMDE_FLOAT16_VALUE(14.3), SIMDE_FLOAT16_VALUE(-3.8), SIMDE_FLOAT16_VALUE(-12.6) },
        INT32_C(1),
      { SIMDE_FLOAT16_VALUE(9.3), SIMDE_FLOAT16_VALUE(2.0), SIMDE_FLOAT16_VALUE(-9.2), SIMDE_FLOAT16_VALUE(2.4) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float16x4_t a = simde_vld1_f16(test_vec[i].a);
    simde_float16x4_t b = simde_vld1_f16(test_vec[i].b);
    int n = test_vec[i].n;
    simde_float16x4_t r;
    SIMDE_CONSTIFY_4_(simde_vext_f16, r, (HEDLEY_UNREACHABLE(), a), n, a, b);

    simde_test_arm_neon_assert_equal_f16x4(r, simde_vld1_f16(test_vec[i].r), 1);
  }

  return 0;

#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_float16x4_t a = simde_test_arm_neon_random_f16x4(-100.0f, 100.0f);
    simde_float16x4_t b = simde_test_arm_neon_random_f16x4(-100.0f, 100.0f);
    simde_int32_t n = simde_test_codegen_random_i32();
    simde_float16x4_t r = simde_vext_f16(a, b, n);

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

static int
test_simde_vext_f32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    simde_float32 a[2];
    simde_float32 b[2];
    int n;
    simde_float32 r[2];
  } test_vec[] = {
    { { SIMDE_FLOAT32_C(  -687.45), SIMDE_FLOAT32_C(   362.88) },
      { SIMDE_FLOAT32_C(   244.11), SIMDE_FLOAT32_C(   675.58) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C(  -687.45), SIMDE_FLOAT32_C(   362.88) } },
    { { SIMDE_FLOAT32_C(   707.43), SIMDE_FLOAT32_C(   -78.71) },
      { SIMDE_FLOAT32_C(   610.46), SIMDE_FLOAT32_C(  -912.57) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C(   -78.71), SIMDE_FLOAT32_C(   610.46) } },
    { { SIMDE_FLOAT32_C(   754.89), SIMDE_FLOAT32_C(   993.62) },
      { SIMDE_FLOAT32_C(  -570.81), SIMDE_FLOAT32_C(  -534.46) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C(   754.89), SIMDE_FLOAT32_C(   993.62) } },
    { { SIMDE_FLOAT32_C(  -147.63), SIMDE_FLOAT32_C(  -385.01) },
      { SIMDE_FLOAT32_C(   570.33), SIMDE_FLOAT32_C(  -977.64) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C(  -385.01), SIMDE_FLOAT32_C(   570.33) } },
    { { SIMDE_FLOAT32_C(  -414.19), SIMDE_FLOAT32_C(  -824.34) },
      { SIMDE_FLOAT32_C(  -892.91), SIMDE_FLOAT32_C(  -280.78) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C(  -414.19), SIMDE_FLOAT32_C(  -824.34) } },
    { { SIMDE_FLOAT32_C(  -659.90), SIMDE_FLOAT32_C(   892.24) },
      { SIMDE_FLOAT32_C(  -796.45), SIMDE_FLOAT32_C(  -383.54) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C(   892.24), SIMDE_FLOAT32_C(  -796.45) } },
    { { SIMDE_FLOAT32_C(   -29.63), SIMDE_FLOAT32_C(  -636.99) },
      { SIMDE_FLOAT32_C(   -37.62), SIMDE_FLOAT32_C(   -62.96) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C(   -29.63), SIMDE_FLOAT32_C(  -636.99) } },
    { { SIMDE_FLOAT32_C(  -107.40), SIMDE_FLOAT32_C(   234.54) },
      { SIMDE_FLOAT32_C(   866.55), SIMDE_FLOAT32_C(   205.15) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C(   234.54), SIMDE_FLOAT32_C(   866.55) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float32x2_t a = simde_vld1_f32(test_vec[i].a);
    simde_float32x2_t b = simde_vld1_f32(test_vec[i].b);
    int n = test_vec[i].n;
    simde_float32x2_t r;
    SIMDE_CONSTIFY_2_(simde_vext_f32, r, (HEDLEY_UNREACHABLE(), a), n, a, b);

    simde_test_arm_neon_assert_equal_f32x2(r, simde_vld1_f32(test_vec[i].r), 1);
  }

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 0, 1, 0, 1, 0, 1 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_float32x2_t a = simde_test_arm_neon_random_f32x2(-1000.0f, 1000.0f);
    simde_float32x2_t b = simde_test_arm_neon_random_f32x2(-1000.0f, 1000.0f);
    simde_float32x2_t r = simde_vext_f32(a, b, lanes[i]);

    simde_test_arm_neon_write_f32x2(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_f32x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lanes[i], SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_f32x2(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vext_f64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    simde_float64 a[1];
    simde_float64 b[1];
    simde_float64 r[1];
  } test_vec[] = {
    { { SIMDE_FLOAT64_C(  -680.82) },
      { SIMDE_FLOAT64_C(    28.23) },
      { SIMDE_FLOAT64_C(  -680.82) } },
    { { SIMDE_FLOAT64_C(   422.94) },
      { SIMDE_FLOAT64_C(  -433.13) },
      { SIMDE_FLOAT64_C(   422.94) } },
    { { SIMDE_FLOAT64_C(  -224.72) },
      { SIMDE_FLOAT64_C(  -962.86) },
      { SIMDE_FLOAT64_C(  -224.72) } },
    { { SIMDE_FLOAT64_C(   366.48) },
      { SIMDE_FLOAT64_C(  -406.43) },
      { SIMDE_FLOAT64_C(   366.48) } },
    { { SIMDE_FLOAT64_C(   712.41) },
      { SIMDE_FLOAT64_C(   528.86) },
      { SIMDE_FLOAT64_C(   712.41) } },
    { { SIMDE_FLOAT64_C(   609.88) },
      { SIMDE_FLOAT64_C(  -935.77) },
      { SIMDE_FLOAT64_C(   609.88) } },
    { { SIMDE_FLOAT64_C(   202.19) },
      { SIMDE_FLOAT64_C(   313.38) },
      { SIMDE_FLOAT64_C(   202.19) } },
    { { SIMDE_FLOAT64_C(  -424.80) },
      { SIMDE_FLOAT64_C(   680.39) },
      { SIMDE_FLOAT64_C(  -424.80) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float64x1_t a = simde_vld1_f64(test_vec[i].a);
    simde_float64x1_t b = simde_vld1_f64(test_vec[i].b);
    simde_float64x1_t r = simde_vext_f64(a, b, 0);

    simde_test_arm_neon_assert_equal_f64x1(r, simde_vld1_f64(test_vec[i].r), 1);
  }

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_float64x1_t a = simde_test_arm_neon_random_f64x1(-1000.0, 1000.0);
    simde_float64x1_t b = simde_test_arm_neon_random_f64x1(-1000.0, 1000.0);
    simde_float64x1_t r = simde_vext_f64(a, b, 0);

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

static int
test_simde_vext_s8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int8_t a[8];
    int8_t b[8];
    int n;
    int8_t r[8];
  } test_vec[] = {
    { { -INT8_C(  97), -INT8_C(  53), -INT8_C(  60),  INT8_C(  90),      INT8_MIN, -INT8_C( 105),  INT8_C(  27), -INT8_C(  34) },
      { -INT8_C(  25), -INT8_C(  82), -INT8_C(  56),  INT8_C(  95), -INT8_C(  75),  INT8_C(   9), -INT8_C(   5), -INT8_C( 102) },
       INT32_C(           0),
      { -INT8_C(  97), -INT8_C(  53), -INT8_C(  60),  INT8_C(  90),      INT8_MIN, -INT8_C( 105),  INT8_C(  27), -INT8_C(  34) } },
    { {  INT8_C(  76),  INT8_C( 122), -INT8_C(  21), -INT8_C(  77), -INT8_C(  52),  INT8_C(  88), -INT8_C( 109), -INT8_C(  51) },
      { -INT8_C(  91),  INT8_C(  82), -INT8_C(  77), -INT8_C(  45),  INT8_C(  24), -INT8_C(  52), -INT8_C(  41), -INT8_C(  73) },
       INT32_C(           1),
      {  INT8_C( 122), -INT8_C(  21), -INT8_C(  77), -INT8_C(  52),  INT8_C(  88), -INT8_C( 109), -INT8_C(  51), -INT8_C(  91) } },
    { { -INT8_C( 104), -INT8_C( 101),  INT8_C(  17),  INT8_C(  24),  INT8_C(  50),  INT8_C(  44), -INT8_C(  10),  INT8_C(  25) },
      { -INT8_C(  37), -INT8_C(  66),  INT8_C( 121), -INT8_C( 112), -INT8_C(  57),  INT8_C( 116),  INT8_C(  42),  INT8_C(  19) },
       INT32_C(           2),
      {  INT8_C(  17),  INT8_C(  24),  INT8_C(  50),  INT8_C(  44), -INT8_C(  10),  INT8_C(  25), -INT8_C(  37), -INT8_C(  66) } },
    { { -INT8_C(  18),  INT8_C(  22), -INT8_C(  58), -INT8_C(  69),  INT8_C( 110),  INT8_C(  90), -INT8_C( 120),  INT8_C(  20) },
      { -INT8_C(  84),  INT8_C(  59), -INT8_C(  25), -INT8_C(  60),  INT8_C(   8), -INT8_C(  66),  INT8_C( 123), -INT8_C(  96) },
       INT32_C(           3),
      { -INT8_C(  69),  INT8_C( 110),  INT8_C(  90), -INT8_C( 120),  INT8_C(  20), -INT8_C(  84),  INT8_C(  59), -INT8_C(  25) } },
    { {  INT8_C(  90), -INT8_C( 116), -INT8_C(  72), -INT8_C( 116), -INT8_C(  72), -INT8_C(  82), -INT8_C(  90), -INT8_C( 109) },
      {  INT8_C( 108),  INT8_C(  31),  INT8_C(  35),  INT8_C(  52), -INT8_C( 109),  INT8_C(  78),  INT8_C(  71), -INT8_C( 126) },
       INT32_C(           4),
      { -INT8_C(  72), -INT8_C(  82), -INT8_C(  90), -INT8_C( 109),  INT8_C( 108),  INT8_C(  31),  INT8_C(  35),  INT8_C(  52) } },
    { {  INT8_C( 100),  INT8_C(  14),  INT8_C(  61), -INT8_C(  46),  INT8_C( 104), -INT8_C(  59), -INT8_C(  26),  INT8_C(  20) },
      {  INT8_C(   0), -INT8_C(  50), -INT8_C(  40),  INT8_C(   8), -INT8_C( 116),  INT8_C(  83), -INT8_C(  88), -INT8_C(  26) },
       INT32_C(           5),
      { -INT8_C(  59), -INT8_C(  26),  INT8_C(  20),  INT8_C(   0), -INT8_C(  50), -INT8_C(  40),  INT8_C(   8), -INT8_C( 116) } },
    { { -INT8_C(  33),  INT8_C(  96),  INT8_C( 115), -INT8_C( 105),  INT8_C(  14),  INT8_C(  25),  INT8_C(  43),  INT8_C( 123) },
      {  INT8_C(  56),  INT8_C(  78), -INT8_C(  81), -INT8_C(  53), -INT8_C( 100), -INT8_C(  10),  INT8_C(  77),  INT8_C(   0) },
       INT32_C(           6),
      {  INT8_C(  43),  INT8_C( 123),  INT8_C(  56),  INT8_C(  78), -INT8_C(  81), -INT8_C(  53), -INT8_C( 100), -INT8_C(  10) } },
    { {  INT8_C(   4), -INT8_C( 118), -INT8_C(  45),  INT8_C( 108),  INT8_C(  79), -INT8_C(  71),      INT8_MIN,  INT8_C(  80) },
      { -INT8_C( 121),  INT8_C(  88),  INT8_C(  88),  INT8_C(  20), -INT8_C(  85),  INT8_C(   1), -INT8_C(   6), -INT8_C( 118) },
       INT32_C(           7),
      {  INT8_C(  80), -INT8_C( 121),  INT8_C(  88),  INT8_C(  88),  INT8_C(  20), -INT8_C(  85),  INT8_C(   1), -INT8_C(   6) } },

  };

  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);
    int n = test_vec[i].n;
    simde_int8x8_t r;
    SIMDE_CONSTIFY_8_(simde_vext_s8, r, (HEDLEY_UNREACHABLE(), a), n, a, b);

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

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_int8x8_t a = simde_test_arm_neon_random_i8x8();
    simde_int8x8_t b = simde_test_arm_neon_random_i8x8();
    simde_int8x8_t r = simde_vext_s8(a, b, lanes[i]);

    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_codegen_write_i32(2, lanes[i], 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_vext_s16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int16_t a[4];
    int16_t b[4];
    int n;
    int16_t r[4];
  } test_vec[] = {
    { {  INT16_C( 30207), -INT16_C(  2757),  INT16_C( 19340), -INT16_C( 16644) },
      { -INT16_C( 30278),  INT16_C( 18083),  INT16_C(  5855), -INT16_C( 26433) },
       INT32_C(           0),
      {  INT16_C( 30207), -INT16_C(  2757),  INT16_C( 19340), -INT16_C( 16644) } },
    { { -INT16_C( 11351), -INT16_C(   407), -INT16_C( 17343), -INT16_C(  8726) },
      {  INT16_C( 11508), -INT16_C(  2305),  INT16_C(  3599),  INT16_C(  3665) },
       INT32_C(           1),
      { -INT16_C(   407), -INT16_C( 17343), -INT16_C(  8726),  INT16_C( 11508) } },
    { { -INT16_C( 29565),  INT16_C(  3843), -INT16_C(    41), -INT16_C( 28210) },
      {  INT16_C( 29065),  INT16_C( 26839), -INT16_C( 27000),  INT16_C( 12544) },
       INT32_C(           2),
      { -INT16_C(    41), -INT16_C( 28210),  INT16_C( 29065),  INT16_C( 26839) } },
    { {  INT16_C( 26985), -INT16_C( 21712),  INT16_C(  6694),  INT16_C(  6792) },
      { -INT16_C( 30906),  INT16_C( 22032),  INT16_C( 24981),  INT16_C(  6244) },
       INT32_C(           3),
      {  INT16_C(  6792), -INT16_C( 30906),  INT16_C( 22032),  INT16_C( 24981) } },
    { {  INT16_C( 26861), -INT16_C( 15064), -INT16_C(  2457), -INT16_C(  4010) },
      {  INT16_C( 11879), -INT16_C(  4263),  INT16_C( 22980),  INT16_C( 11809) },
       INT32_C(           0),
      {  INT16_C( 26861), -INT16_C( 15064), -INT16_C(  2457), -INT16_C(  4010) } },
    { {  INT16_C( 20931), -INT16_C(  5671),  INT16_C( 24939), -INT16_C( 19965) },
      {  INT16_C(  5352),  INT16_C( 32264),  INT16_C( 27765),  INT16_C( 25494) },
       INT32_C(           1),
      { -INT16_C(  5671),  INT16_C( 24939), -INT16_C( 19965),  INT16_C(  5352) } },
    { { -INT16_C( 16684),  INT16_C( 15400),  INT16_C( 32436),  INT16_C(  7212) },
      { -INT16_C( 31316),  INT16_C( 28939),  INT16_C( 11487), -INT16_C( 23905) },
       INT32_C(           2),
      {  INT16_C( 32436),  INT16_C(  7212), -INT16_C( 31316),  INT16_C( 28939) } },
    { {  INT16_C( 30845), -INT16_C(  5749), -INT16_C( 28967), -INT16_C( 15973) },
      { -INT16_C( 23646),  INT16_C(  6207), -INT16_C( 10737), -INT16_C(  7045) },
       INT32_C(           3),
      { -INT16_C( 15973), -INT16_C( 23646),  INT16_C(  6207), -INT16_C( 10737) } },

  };

  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);
    int n = test_vec[i].n;
    simde_int16x4_t r;
    SIMDE_CONSTIFY_4_(simde_vext_s16, r, (HEDLEY_UNREACHABLE(), a), n, a, b);

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

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 2, 3, 0, 1, 2, 3 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_int16x4_t a = simde_test_arm_neon_random_i16x4();
    simde_int16x4_t b = simde_test_arm_neon_random_i16x4();
    simde_int16x4_t r = simde_vext_s16(a, b, lanes[i]);

    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_codegen_write_i32(2, lanes[i], 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_vext_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int32_t a[2];
    int32_t b[2];
    int n;
    int32_t r[2];
  } test_vec[] = {
    { {  INT32_C(   957350431), -INT32_C(   603021787) },
      { -INT32_C(  1074644418),  INT32_C(   794553918) },
       INT32_C(           0),
      {  INT32_C(   957350431), -INT32_C(   603021787) } },
    { {  INT32_C(   443957338), -INT32_C(  1718071061) },
      {  INT32_C(  1279020983), -INT32_C(  1469355383) },
       INT32_C(           1),
      { -INT32_C(  1718071061),  INT32_C(  1279020983) } },
    { { -INT32_C(  1847493524),  INT32_C(  1483599898) },
      {  INT32_C(  1746362154), -INT32_C(  1483181491) },
       INT32_C(           0),
      { -INT32_C(  1847493524),  INT32_C(  1483599898) } },
    { { -INT32_C(  1631449422),  INT32_C(   372726367) },
      {  INT32_C(   862090154),  INT32_C(  1239207389) },
       INT32_C(           1),
      {  INT32_C(   372726367),  INT32_C(   862090154) } },
    { {  INT32_C(  1675279689), -INT32_C(   675526739) },
      { -INT32_C(   197078105), -INT32_C(   123938746) },
       INT32_C(           0),
      {  INT32_C(  1675279689), -INT32_C(   675526739) } },
    { {  INT32_C(  1167482598),  INT32_C(  1650183608) },
      {  INT32_C(   513195329), -INT32_C(   731352437) },
       INT32_C(           1),
      {  INT32_C(  1650183608),  INT32_C(   513195329) } },
    { { -INT32_C(   583515601),  INT32_C(   833942666) },
      {  INT32_C(   220591303), -INT32_C(  1291402804) },
       INT32_C(           0),
      { -INT32_C(   583515601),  INT32_C(   833942666) } },
    { { -INT32_C(   654795745), -INT32_C(  1422240662) },
      { -INT32_C(  1664495599),  INT32_C(  1920020802) },
       INT32_C(           1),
      { -INT32_C(  1422240662), -INT32_C(  1664495599) } },

  };

  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);
    int n = test_vec[i].n;
    simde_int32x2_t r;
    SIMDE_CONSTIFY_2_(simde_vext_s32, r, (HEDLEY_UNREACHABLE(), a), n, a, b);

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

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 0, 1, 0, 1, 0, 1 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_int32x2_t a = simde_test_arm_neon_random_i32x2();
    simde_int32x2_t b = simde_test_arm_neon_random_i32x2();
    simde_int32x2_t r = simde_vext_s32(a, b, lanes[i]);

    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_codegen_write_i32(2, lanes[i], 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_vext_s64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int64_t a[1];
    int64_t b[1];
    int64_t r[1];
  } test_vec[] = {
    { {  INT64_C( 6639490098744952062) },
      { -INT64_C(  906714779595733515) },
      {  INT64_C( 6639490098744952062) } },
    { { -INT64_C( 1175976699607320186) },
      {  INT64_C( 8022877348809296326) },
      { -INT64_C( 1175976699607320186) } },
    { { -INT64_C( 1373935476923645568) },
      { -INT64_C( 4541150998765402287) },
      { -INT64_C( 1373935476923645568) } },
    { { -INT64_C( 7139179752814035311) },
      { -INT64_C( 5281588533336655149) },
      { -INT64_C( 7139179752814035311) } },
    { {  INT64_C( 8839218246575480008) },
      {  INT64_C(  123985814383417533) },
      {  INT64_C( 8839218246575480008) } },
    { { -INT64_C( 1103968923059055813) },
      {  INT64_C( 3319971401639943717) },
      { -INT64_C( 1103968923059055813) } },
    { {  INT64_C( 5613904681621084741) },
      {  INT64_C( 2513849614873160305) },
      {  INT64_C( 5613904681621084741) } },
    { { -INT64_C( 1180540366207328112) },
      { -INT64_C(   12563317733469889) },
      { -INT64_C( 1180540366207328112) } },

  };

  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_vext_s64(a, b, 0);

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

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

    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_codegen_write_i32(2, 0, 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_vext_u8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint8_t a[8];
    uint8_t b[8];
    int n;
    uint8_t r[8];
  } test_vec[] = {
    { { UINT8_C( 41), UINT8_C(252), UINT8_C( 40), UINT8_C( 64), UINT8_C(135), UINT8_C(135), UINT8_C(244), UINT8_C(115) },
      { UINT8_C(156), UINT8_C(144), UINT8_C( 83), UINT8_C(200), UINT8_C(190), UINT8_C( 18), UINT8_C(166), UINT8_C(155) },
       INT32_C(           0),
      { UINT8_C( 41), UINT8_C(252), UINT8_C( 40), UINT8_C( 64), UINT8_C(135), UINT8_C(135), UINT8_C(244), UINT8_C(115) } },
    { { UINT8_C(  9), UINT8_C(208), UINT8_C(167), UINT8_C( 64), UINT8_C(179), UINT8_C( 73), UINT8_C(177), UINT8_C(189) },
      { UINT8_C(152), UINT8_C( 56), UINT8_C(227), UINT8_C(221), UINT8_C(232), UINT8_C(138), UINT8_C(102), UINT8_C( 17) },
       INT32_C(           1),
      { UINT8_C(208), UINT8_C(167), UINT8_C( 64), UINT8_C(179), UINT8_C( 73), UINT8_C(177), UINT8_C(189), UINT8_C(152) } },
    { { UINT8_C(135), UINT8_C(142), UINT8_C( 81), UINT8_C( 14), UINT8_C( 21), UINT8_C( 70), UINT8_C(129), UINT8_C(177) },
      { UINT8_C(214), UINT8_C(212), UINT8_C(122), UINT8_C(148), UINT8_C(230), UINT8_C( 32), UINT8_C( 47), UINT8_C(239) },
       INT32_C(           2),
      { UINT8_C( 81), UINT8_C( 14), UINT8_C( 21), UINT8_C( 70), UINT8_C(129), UINT8_C(177), UINT8_C(214), UINT8_C(212) } },
    { { UINT8_C(241), UINT8_C(215), UINT8_C( 48), UINT8_C(164), UINT8_C( 32), UINT8_C(225), UINT8_C( 98), UINT8_C(184) },
      { UINT8_C( 25), UINT8_C( 69), UINT8_C(149), UINT8_C(  1), UINT8_C(208), UINT8_C(251), UINT8_C( 18), UINT8_C( 87) },
       INT32_C(           3),
      { UINT8_C(164), UINT8_C( 32), UINT8_C(225), UINT8_C( 98), UINT8_C(184), UINT8_C( 25), UINT8_C( 69), UINT8_C(149) } },
    { { UINT8_C(137), UINT8_C(100), UINT8_C(101), UINT8_C(159), UINT8_C(170), UINT8_C(231), UINT8_C( 80), UINT8_C(128) },
      { UINT8_C(187), UINT8_C(202), UINT8_C( 21), UINT8_C(162), UINT8_C(235), UINT8_C( 68), UINT8_C(145), UINT8_C(220) },
       INT32_C(           4),
      { UINT8_C(170), UINT8_C(231), UINT8_C( 80), UINT8_C(128), UINT8_C(187), UINT8_C(202), UINT8_C( 21), UINT8_C(162) } },
    { { UINT8_C( 27), UINT8_C(193), UINT8_C(128), UINT8_C( 60), UINT8_C(163), UINT8_C(226), UINT8_C(244), UINT8_C(188) },
      { UINT8_C( 40), UINT8_C(138), UINT8_C(190), UINT8_C(248), UINT8_C(133), UINT8_C(208), UINT8_C( 79), UINT8_C( 15) },
       INT32_C(           5),
      { UINT8_C(226), UINT8_C(244), UINT8_C(188), UINT8_C( 40), UINT8_C(138), UINT8_C(190), UINT8_C(248), UINT8_C(133) } },
    { { UINT8_C( 52), UINT8_C(180), UINT8_C(174), UINT8_C(222), UINT8_C(155), UINT8_C(254), UINT8_C( 95), UINT8_C( 87) },
      { UINT8_C(201), UINT8_C(116), UINT8_C(249), UINT8_C(180), UINT8_C(184), UINT8_C(138), UINT8_C(144), UINT8_C(212) },
       INT32_C(           6),
      { UINT8_C( 95), UINT8_C( 87), UINT8_C(201), UINT8_C(116), UINT8_C(249), UINT8_C(180), UINT8_C(184), UINT8_C(138) } },
    { { UINT8_C( 76), UINT8_C( 16), UINT8_C( 16), UINT8_C(239), UINT8_C(243), UINT8_C(  4), UINT8_C(171), UINT8_C( 27) },
      { UINT8_C(142), UINT8_C(105), UINT8_C( 19), UINT8_C( 20), UINT8_C( 58), UINT8_C( 98), UINT8_C( 35), UINT8_C(110) },
       INT32_C(           7),
      { UINT8_C( 27), UINT8_C(142), UINT8_C(105), UINT8_C( 19), UINT8_C( 20), UINT8_C( 58), UINT8_C( 98), UINT8_C( 35) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint8x8_t a = simde_vld1_u8(test_vec[i].a);
    simde_uint8x8_t b = simde_vld1_u8(test_vec[i].b);
    int n = test_vec[i].n;
    simde_uint8x8_t r;
    SIMDE_CONSTIFY_8_(simde_vext_u8, r, (HEDLEY_UNREACHABLE(), a), n, a, b);

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

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_uint8x8_t a = simde_test_arm_neon_random_u8x8();
    simde_uint8x8_t b = simde_test_arm_neon_random_u8x8();
    simde_uint8x8_t r = simde_vext_u8(a, b, lanes[i]);

    simde_test_arm_neon_write_u8x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u8x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lanes[i], 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_vext_u16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint16_t a[4];
    uint16_t b[4];
    int n;
    uint16_t r[4];
  } test_vec[] = {
    { { UINT16_C(16781), UINT16_C(   83), UINT16_C(49358), UINT16_C(43895) },
      { UINT16_C(63669), UINT16_C(33927), UINT16_C(10175), UINT16_C(15472) },
       INT32_C(           0),
      { UINT16_C(16781), UINT16_C(   83), UINT16_C(49358), UINT16_C(43895) } },
    { { UINT16_C(10362), UINT16_C(59736), UINT16_C(10921), UINT16_C(40640) },
      { UINT16_C(39613), UINT16_C(56230), UINT16_C(57753), UINT16_C( 9976) },
       INT32_C(           1),
      { UINT16_C(59736), UINT16_C(10921), UINT16_C(40640), UINT16_C(39613) } },
    { { UINT16_C(19490), UINT16_C(61734), UINT16_C(40204), UINT16_C(49564) },
      { UINT16_C( 9109), UINT16_C(21829), UINT16_C(46411), UINT16_C(50577) },
       INT32_C(           2),
      { UINT16_C(40204), UINT16_C(49564), UINT16_C( 9109), UINT16_C(21829) } },
    { { UINT16_C(59869), UINT16_C(34478), UINT16_C(28180), UINT16_C(53540) },
      { UINT16_C(51721), UINT16_C(41644), UINT16_C(42411), UINT16_C(52936) },
       INT32_C(           3),
      { UINT16_C(53540), UINT16_C(51721), UINT16_C(41644), UINT16_C(42411) } },
    { { UINT16_C(61425), UINT16_C(64959), UINT16_C(23436), UINT16_C( 8894) },
      { UINT16_C(  894), UINT16_C(51575), UINT16_C( 2233), UINT16_C(38542) },
       INT32_C(           0),
      { UINT16_C(61425), UINT16_C(64959), UINT16_C(23436), UINT16_C( 8894) } },
    { { UINT16_C(15601), UINT16_C( 1309), UINT16_C(16811), UINT16_C(46294) },
      { UINT16_C(33548), UINT16_C(46934), UINT16_C( 7720), UINT16_C( 6533) },
       INT32_C(           1),
      { UINT16_C( 1309), UINT16_C(16811), UINT16_C(46294), UINT16_C(33548) } },
    { { UINT16_C(17421), UINT16_C(39446), UINT16_C(54431), UINT16_C( 7868) },
      { UINT16_C(13271), UINT16_C(37095), UINT16_C(30267), UINT16_C(11303) },
       INT32_C(           2),
      { UINT16_C(54431), UINT16_C( 7868), UINT16_C(13271), UINT16_C(37095) } },
    { { UINT16_C(17586), UINT16_C(23858), UINT16_C( 2181), UINT16_C(37137) },
      { UINT16_C(26507), UINT16_C(45897), UINT16_C(52870), UINT16_C(37836) },
       INT32_C(           3),
      { UINT16_C(37137), UINT16_C(26507), UINT16_C(45897), UINT16_C(52870) } },

  };

  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_uint16x4_t b = simde_vld1_u16(test_vec[i].b);
    int n = test_vec[i].n;
    simde_uint16x4_t r;
    SIMDE_CONSTIFY_4_(simde_vext_u16, r, (HEDLEY_UNREACHABLE(), a), n, a, b);
    simde_test_arm_neon_assert_equal_u16x4(r, simde_vld1_u16(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 2, 3, 0, 1, 2, 3 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_uint16x4_t a = simde_test_arm_neon_random_u16x4();
    simde_uint16x4_t b = simde_test_arm_neon_random_u16x4();
    simde_uint16x4_t r = simde_vext_u16(a, b, lanes[i]);

    simde_test_arm_neon_write_u16x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lanes[i], 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_vext_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint32_t a[2];
    uint32_t b[2];
    int n;
    uint32_t r[2];
  } test_vec[] = {
    { { UINT32_C(2921936545), UINT32_C(1836714120) },
      { UINT32_C(3960998402), UINT32_C(1184252007) },
       INT32_C(           0),
      { UINT32_C(2921936545), UINT32_C(1836714120) } },
    { { UINT32_C(1465699894), UINT32_C(1555702821) },
      { UINT32_C( 496622738), UINT32_C(3470628141) },
       INT32_C(           1),
      { UINT32_C(1555702821), UINT32_C( 496622738) } },
    { { UINT32_C(1400702923), UINT32_C( 297858831) },
      { UINT32_C(1778309378), UINT32_C(1336906777) },
       INT32_C(           0),
      { UINT32_C(1400702923), UINT32_C( 297858831) } },
    { { UINT32_C(2275806050), UINT32_C(3269681200) },
      { UINT32_C(1793031485), UINT32_C(3711482898) },
       INT32_C(           1),
      { UINT32_C(3269681200), UINT32_C(1793031485) } },
    { { UINT32_C(3526407619), UINT32_C(2951016877) },
      { UINT32_C(3810058954), UINT32_C(3627206518) },
       INT32_C(           0),
      { UINT32_C(3526407619), UINT32_C(2951016877) } },
    { { UINT32_C(  56678611), UINT32_C(1992639289) },
      { UINT32_C(3537937600), UINT32_C( 615454816) },
       INT32_C(           1),
      { UINT32_C(1992639289), UINT32_C(3537937600) } },
    { { UINT32_C(2079776974), UINT32_C(2603277009) },
      { UINT32_C( 847135420), UINT32_C(3691753481) },
       INT32_C(           0),
      { UINT32_C(2079776974), UINT32_C(2603277009) } },
    { { UINT32_C(3252644744), UINT32_C(1865917614) },
      { UINT32_C(2839615304), UINT32_C(4274909488) },
       INT32_C(           1),
      { UINT32_C(1865917614), UINT32_C(2839615304) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint32x2_t a = simde_vld1_u32(test_vec[i].a);
    simde_uint32x2_t b = simde_vld1_u32(test_vec[i].b);
    int n = test_vec[i].n;
    simde_uint32x2_t r;
    SIMDE_CONSTIFY_2_(simde_vext_u32, r, (HEDLEY_UNREACHABLE(), a), n, a, b);
    simde_test_arm_neon_assert_equal_u32x2(r, simde_vld1_u32(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 0, 1, 0, 1, 0, 1 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_uint32x2_t a = simde_test_arm_neon_random_u32x2();
    simde_uint32x2_t b = simde_test_arm_neon_random_u32x2();
    simde_uint32x2_t r = simde_vext_u32(a, b, lanes[i]);

    simde_test_arm_neon_write_u32x2(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u32x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lanes[i], 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_vext_u64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint64_t a[1];
    uint64_t b[1];
    uint64_t r[1];
  } test_vec[] = {
    { { UINT64_C( 4775218924999393801) },
      { UINT64_C(14341243545373652668) },
      { UINT64_C( 4775218924999393801) } },
    { { UINT64_C( 9139095911556337710) },
      { UINT64_C( 1794718599694819428) },
      { UINT64_C( 9139095911556337710) } },
    { { UINT64_C(17254207385035945953) },
      { UINT64_C( 6000040611349516152) },
      { UINT64_C(17254207385035945953) } },
    { { UINT64_C(14523168050340220606) },
      { UINT64_C( 2697498136351876169) },
      { UINT64_C(14523168050340220606) } },
    { { UINT64_C( 2867607344887786920) },
      { UINT64_C( 6706397092927255193) },
      { UINT64_C( 2867607344887786920) } },
    { { UINT64_C(15556831202562008502) },
      { UINT64_C( 9620707902598573083) },
      { UINT64_C(15556831202562008502) } },
    { { UINT64_C( 4386835494242146571) },
      { UINT64_C( 2547361106271831389) },
      { UINT64_C( 4386835494242146571) } },
    { { UINT64_C(15516627759135639025) },
      { UINT64_C( 3310630758589564047) },
      { UINT64_C(15516627759135639025) } },

  };

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

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

    simde_test_arm_neon_write_u64x1(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u64x1(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, 0, 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_vextq_f16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    simde_float16_t a[8];
    simde_float16_t b[8];
    int n;
    simde_float16_t r[8];
  } test_vec[] = {
    { { SIMDE_FLOAT16_VALUE(   441.00), SIMDE_FLOAT16_VALUE(   861.50), SIMDE_FLOAT16_VALUE(    98.06), SIMDE_FLOAT16_VALUE(   896.00),
        SIMDE_FLOAT16_VALUE(  -918.50), SIMDE_FLOAT16_VALUE(  -717.00), SIMDE_FLOAT16_VALUE(  -823.00), SIMDE_FLOAT16_VALUE(  -581.00) },
      { SIMDE_FLOAT16_VALUE(   684.00), SIMDE_FLOAT16_VALUE(   563.00), SIMDE_FLOAT16_VALUE(    15.31), SIMDE_FLOAT16_VALUE(  -786.50),
        SIMDE_FLOAT16_VALUE(   891.00), SIMDE_FLOAT16_VALUE(   859.50), SIMDE_FLOAT16_VALUE(   387.25), SIMDE_FLOAT16_VALUE(   969.00) },
        INT32_C(           0),
      { SIMDE_FLOAT16_VALUE(   441.00), SIMDE_FLOAT16_VALUE(   861.50), SIMDE_FLOAT16_VALUE(    98.06), SIMDE_FLOAT16_VALUE(   896.00),
        SIMDE_FLOAT16_VALUE(  -918.50), SIMDE_FLOAT16_VALUE(  -717.00), SIMDE_FLOAT16_VALUE(  -823.00), SIMDE_FLOAT16_VALUE(  -581.00) }},
    { { SIMDE_FLOAT16_VALUE(    -6.45), SIMDE_FLOAT16_VALUE(    29.20), SIMDE_FLOAT16_VALUE(  -856.00), SIMDE_FLOAT16_VALUE(   267.25),
        SIMDE_FLOAT16_VALUE(  -302.00), SIMDE_FLOAT16_VALUE(   526.50), SIMDE_FLOAT16_VALUE(   713.00), SIMDE_FLOAT16_VALUE(   -14.83) },
      { SIMDE_FLOAT16_VALUE(  -848.00), SIMDE_FLOAT16_VALUE(   815.50), SIMDE_FLOAT16_VALUE(  -672.50), SIMDE_FLOAT16_VALUE(   274.50),
        SIMDE_FLOAT16_VALUE(   933.00), SIMDE_FLOAT16_VALUE(  -952.50), SIMDE_FLOAT16_VALUE(   426.00), SIMDE_FLOAT16_VALUE(   373.75) },
        INT32_C(           1),
      { SIMDE_FLOAT16_VALUE(    29.20), SIMDE_FLOAT16_VALUE(  -856.00), SIMDE_FLOAT16_VALUE(   267.25), SIMDE_FLOAT16_VALUE(  -302.00),
        SIMDE_FLOAT16_VALUE(   526.50), SIMDE_FLOAT16_VALUE(   713.00), SIMDE_FLOAT16_VALUE(   -14.83), SIMDE_FLOAT16_VALUE(  -848.00) }},
    { { SIMDE_FLOAT16_VALUE(   909.00), SIMDE_FLOAT16_VALUE(  -475.75), SIMDE_FLOAT16_VALUE(   269.75), SIMDE_FLOAT16_VALUE(   991.00),
        SIMDE_FLOAT16_VALUE(  -192.62), SIMDE_FLOAT16_VALUE(   446.50), SIMDE_FLOAT16_VALUE(  -590.00), SIMDE_FLOAT16_VALUE(  -508.50) },
      { SIMDE_FLOAT16_VALUE(     9.56), SIMDE_FLOAT16_VALUE(   425.25), SIMDE_FLOAT16_VALUE(  -294.75), SIMDE_FLOAT16_VALUE(   -99.19),
        SIMDE_FLOAT16_VALUE(   284.50), SIMDE_FLOAT16_VALUE(  -907.50), SIMDE_FLOAT16_VALUE(  -130.00), SIMDE_FLOAT16_VALUE(  -722.00) },
        INT32_C(           2),
      { SIMDE_FLOAT16_VALUE(   269.75), SIMDE_FLOAT16_VALUE(   991.00), SIMDE_FLOAT16_VALUE(  -192.62), SIMDE_FLOAT16_VALUE(   446.50),
        SIMDE_FLOAT16_VALUE(  -590.00), SIMDE_FLOAT16_VALUE(  -508.50), SIMDE_FLOAT16_VALUE(     9.56), SIMDE_FLOAT16_VALUE(   425.25) }},
    { { SIMDE_FLOAT16_VALUE(   121.69), SIMDE_FLOAT16_VALUE(    14.28), SIMDE_FLOAT16_VALUE(   545.00), SIMDE_FLOAT16_VALUE(   819.50),
        SIMDE_FLOAT16_VALUE(  -459.00), SIMDE_FLOAT16_VALUE(   258.50), SIMDE_FLOAT16_VALUE(  -195.12), SIMDE_FLOAT16_VALUE(  -307.00) },
      { SIMDE_FLOAT16_VALUE(    73.81), SIMDE_FLOAT16_VALUE(   132.25), SIMDE_FLOAT16_VALUE(   967.50), SIMDE_FLOAT16_VALUE(     6.60),
        SIMDE_FLOAT16_VALUE(   179.88), SIMDE_FLOAT16_VALUE(   393.50), SIMDE_FLOAT16_VALUE(  -619.50), SIMDE_FLOAT16_VALUE(    89.12) },
        INT32_C(           3),
      { SIMDE_FLOAT16_VALUE(   819.50), SIMDE_FLOAT16_VALUE(  -459.00), SIMDE_FLOAT16_VALUE(   258.50), SIMDE_FLOAT16_VALUE(  -195.12),
        SIMDE_FLOAT16_VALUE(  -307.00), SIMDE_FLOAT16_VALUE(    73.81), SIMDE_FLOAT16_VALUE(   132.25), SIMDE_FLOAT16_VALUE(   967.50) }},
    { { SIMDE_FLOAT16_VALUE(   918.00), SIMDE_FLOAT16_VALUE(   650.00), SIMDE_FLOAT16_VALUE(    80.00), SIMDE_FLOAT16_VALUE(  -275.00),
        SIMDE_FLOAT16_VALUE(    96.56), SIMDE_FLOAT16_VALUE(   489.75), SIMDE_FLOAT16_VALUE(   216.50), SIMDE_FLOAT16_VALUE(  -894.00) },
      { SIMDE_FLOAT16_VALUE(   -85.06), SIMDE_FLOAT16_VALUE(   921.50), SIMDE_FLOAT16_VALUE(     6.98), SIMDE_FLOAT16_VALUE(  -800.50),
        SIMDE_FLOAT16_VALUE(  -986.00), SIMDE_FLOAT16_VALUE(   877.00), SIMDE_FLOAT16_VALUE(  -522.50), SIMDE_FLOAT16_VALUE(   135.75) },
        INT32_C(           4),
      { SIMDE_FLOAT16_VALUE(    96.56), SIMDE_FLOAT16_VALUE(   489.75), SIMDE_FLOAT16_VALUE(   216.50), SIMDE_FLOAT16_VALUE(  -894.00),
        SIMDE_FLOAT16_VALUE(   -85.06), SIMDE_FLOAT16_VALUE(   921.50), SIMDE_FLOAT16_VALUE(     6.98), SIMDE_FLOAT16_VALUE(  -800.50) }},
    { { SIMDE_FLOAT16_VALUE(  -108.69), SIMDE_FLOAT16_VALUE(  -977.50), SIMDE_FLOAT16_VALUE(   -44.56), SIMDE_FLOAT16_VALUE(   432.25),
        SIMDE_FLOAT16_VALUE(   281.00), SIMDE_FLOAT16_VALUE(   760.00), SIMDE_FLOAT16_VALUE(  -874.50), SIMDE_FLOAT16_VALUE(  -645.00) },
      { SIMDE_FLOAT16_VALUE(  -107.50), SIMDE_FLOAT16_VALUE(  -907.00), SIMDE_FLOAT16_VALUE(   361.50), SIMDE_FLOAT16_VALUE(  -927.50),
        SIMDE_FLOAT16_VALUE(   486.50), SIMDE_FLOAT16_VALUE(   742.00), SIMDE_FLOAT16_VALUE(   161.50), SIMDE_FLOAT16_VALUE(   404.25) },
        INT32_C(           5),
      { SIMDE_FLOAT16_VALUE(   760.00), SIMDE_FLOAT16_VALUE(  -874.50), SIMDE_FLOAT16_VALUE(  -645.00), SIMDE_FLOAT16_VALUE(  -107.50),
        SIMDE_FLOAT16_VALUE(  -907.00), SIMDE_FLOAT16_VALUE(   361.50), SIMDE_FLOAT16_VALUE(  -927.50), SIMDE_FLOAT16_VALUE(   486.50) }},
    { { SIMDE_FLOAT16_VALUE(   392.00), SIMDE_FLOAT16_VALUE(  -758.50), SIMDE_FLOAT16_VALUE(  -870.50), SIMDE_FLOAT16_VALUE(  -511.25),
        SIMDE_FLOAT16_VALUE(   731.50), SIMDE_FLOAT16_VALUE(   345.75), SIMDE_FLOAT16_VALUE(  -405.25), SIMDE_FLOAT16_VALUE(  -353.75) },
      { SIMDE_FLOAT16_VALUE(   267.50), SIMDE_FLOAT16_VALUE(   602.00), SIMDE_FLOAT16_VALUE(  -154.25), SIMDE_FLOAT16_VALUE(   281.75),
        SIMDE_FLOAT16_VALUE(   478.75), SIMDE_FLOAT16_VALUE(   323.25), SIMDE_FLOAT16_VALUE(  -582.50), SIMDE_FLOAT16_VALUE(  -630.00) },
        INT32_C(           6),
      { SIMDE_FLOAT16_VALUE(  -405.25), SIMDE_FLOAT16_VALUE(  -353.75), SIMDE_FLOAT16_VALUE(   267.50), SIMDE_FLOAT16_VALUE(   602.00),
        SIMDE_FLOAT16_VALUE(  -154.25), SIMDE_FLOAT16_VALUE(   281.75), SIMDE_FLOAT16_VALUE(   478.75), SIMDE_FLOAT16_VALUE(   323.25) }},
    { { SIMDE_FLOAT16_VALUE(   345.75), SIMDE_FLOAT16_VALUE(   372.75), SIMDE_FLOAT16_VALUE(   802.50), SIMDE_FLOAT16_VALUE(  -373.00),
        SIMDE_FLOAT16_VALUE(   133.12), SIMDE_FLOAT16_VALUE(   928.00), SIMDE_FLOAT16_VALUE(   -18.17), SIMDE_FLOAT16_VALUE(  -974.50) },
      { SIMDE_FLOAT16_VALUE(  -979.50), SIMDE_FLOAT16_VALUE(  -656.50), SIMDE_FLOAT16_VALUE(  -902.00), SIMDE_FLOAT16_VALUE(   507.00),
        SIMDE_FLOAT16_VALUE(  -914.50), SIMDE_FLOAT16_VALUE(   259.50), SIMDE_FLOAT16_VALUE(   -88.69), SIMDE_FLOAT16_VALUE(   477.25) },
        INT32_C(           7),
      { SIMDE_FLOAT16_VALUE(  -974.50), SIMDE_FLOAT16_VALUE(  -979.50), SIMDE_FLOAT16_VALUE(  -656.50), SIMDE_FLOAT16_VALUE(  -902.00),
        SIMDE_FLOAT16_VALUE(   507.00), SIMDE_FLOAT16_VALUE(  -914.50), SIMDE_FLOAT16_VALUE(   259.50), SIMDE_FLOAT16_VALUE(   -88.69) }},
    };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float16x8_t a = simde_vld1q_f16(test_vec[i].a);
    simde_float16x8_t b = simde_vld1q_f16(test_vec[i].b);
    int n = test_vec[i].n;
    simde_float16x8_t r;
    switch(n) {
      case 0: r = simde_vextq_f16(a, b, 0); break;
      case 1: r = simde_vextq_f16(a, b, 1); break;
      case 2: r = simde_vextq_f16(a, b, 2); break;
      case 3: r = simde_vextq_f16(a, b, 3); break;
      case 4: r = simde_vextq_f16(a, b, 4); break;
      case 5: r = simde_vextq_f16(a, b, 5); break;
      case 6: r = simde_vextq_f16(a, b, 6); break;
      case 7: r = simde_vextq_f16(a, b, 7); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }
    simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1);
  }

  return 0;

#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_float16x8_t a = simde_test_arm_neon_random_f16x8(-100.0f, 100.0f);
    simde_float16x8_t b = simde_test_arm_neon_random_f16x8(-100.0f, 100.0f);
    simde_int32_t n = simde_test_codegen_random_i32();
    simde_float16x8_t r = simde_vextq_f16(a, b, n);

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

static int
test_simde_vextq_f32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    simde_float32 a[4];
    simde_float32 b[4];
    int n;
    simde_float32 r[4];
  } test_vec[] = {
    { { SIMDE_FLOAT32_C(   -11.82), SIMDE_FLOAT32_C(  -542.24), SIMDE_FLOAT32_C(   904.95), SIMDE_FLOAT32_C(   599.34) },
      { SIMDE_FLOAT32_C(  -323.53), SIMDE_FLOAT32_C(   591.26), SIMDE_FLOAT32_C(  -753.72), SIMDE_FLOAT32_C(    19.62) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C(   -11.82), SIMDE_FLOAT32_C(  -542.24), SIMDE_FLOAT32_C(   904.95), SIMDE_FLOAT32_C(   599.34) } },
    { { SIMDE_FLOAT32_C(  -246.51), SIMDE_FLOAT32_C(  -600.23), SIMDE_FLOAT32_C(  -164.99), SIMDE_FLOAT32_C(  -616.01) },
      { SIMDE_FLOAT32_C(  -788.95), SIMDE_FLOAT32_C(  -648.59), SIMDE_FLOAT32_C(   630.30), SIMDE_FLOAT32_C(   886.86) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C(  -600.23), SIMDE_FLOAT32_C(  -164.99), SIMDE_FLOAT32_C(  -616.01), SIMDE_FLOAT32_C(  -788.95) } },
    { { SIMDE_FLOAT32_C(   -83.54), SIMDE_FLOAT32_C(  -412.91), SIMDE_FLOAT32_C(   -86.28), SIMDE_FLOAT32_C(   790.95) },
      { SIMDE_FLOAT32_C(   194.71), SIMDE_FLOAT32_C(  -239.80), SIMDE_FLOAT32_C(  -880.77), SIMDE_FLOAT32_C(  -974.84) },
       INT32_C(           2),
      { SIMDE_FLOAT32_C(   -86.28), SIMDE_FLOAT32_C(   790.95), SIMDE_FLOAT32_C(   194.71), SIMDE_FLOAT32_C(  -239.80) } },
    { { SIMDE_FLOAT32_C(   572.07), SIMDE_FLOAT32_C(   171.25), SIMDE_FLOAT32_C(   700.50), SIMDE_FLOAT32_C(  -266.41) },
      { SIMDE_FLOAT32_C(   107.61), SIMDE_FLOAT32_C(  -395.18), SIMDE_FLOAT32_C(  -409.82), SIMDE_FLOAT32_C(  -904.21) },
       INT32_C(           3),
      { SIMDE_FLOAT32_C(  -266.41), SIMDE_FLOAT32_C(   107.61), SIMDE_FLOAT32_C(  -395.18), SIMDE_FLOAT32_C(  -409.82) } },
    { { SIMDE_FLOAT32_C(    62.58), SIMDE_FLOAT32_C(  -504.88), SIMDE_FLOAT32_C(   695.13), SIMDE_FLOAT32_C(   739.05) },
      { SIMDE_FLOAT32_C(  -913.62), SIMDE_FLOAT32_C(   941.41), SIMDE_FLOAT32_C(  -241.33), SIMDE_FLOAT32_C(  -160.12) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C(    62.58), SIMDE_FLOAT32_C(  -504.88), SIMDE_FLOAT32_C(   695.13), SIMDE_FLOAT32_C(   739.05) } },
    { { SIMDE_FLOAT32_C(  -658.83), SIMDE_FLOAT32_C(   593.68), SIMDE_FLOAT32_C(   223.86), SIMDE_FLOAT32_C(  -447.78) },
      { SIMDE_FLOAT32_C(   945.09), SIMDE_FLOAT32_C(  -145.84), SIMDE_FLOAT32_C(  -560.91), SIMDE_FLOAT32_C(  -138.45) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C(   593.68), SIMDE_FLOAT32_C(   223.86), SIMDE_FLOAT32_C(  -447.78), SIMDE_FLOAT32_C(   945.09) } },
    { { SIMDE_FLOAT32_C(   441.26), SIMDE_FLOAT32_C(   352.81), SIMDE_FLOAT32_C(  -347.49), SIMDE_FLOAT32_C(  -364.04) },
      { SIMDE_FLOAT32_C(  -887.00), SIMDE_FLOAT32_C(  -228.26), SIMDE_FLOAT32_C(  -338.88), SIMDE_FLOAT32_C(   685.07) },
       INT32_C(           2),
      { SIMDE_FLOAT32_C(  -347.49), SIMDE_FLOAT32_C(  -364.04), SIMDE_FLOAT32_C(  -887.00), SIMDE_FLOAT32_C(  -228.26) } },
    { { SIMDE_FLOAT32_C(   942.99), SIMDE_FLOAT32_C(  -638.38), SIMDE_FLOAT32_C(  -581.34), SIMDE_FLOAT32_C(    50.60) },
      { SIMDE_FLOAT32_C(   -33.56), SIMDE_FLOAT32_C(     8.84), SIMDE_FLOAT32_C(   146.38), SIMDE_FLOAT32_C(  -970.98) },
       INT32_C(           3),
      { SIMDE_FLOAT32_C(    50.60), SIMDE_FLOAT32_C(   -33.56), SIMDE_FLOAT32_C(     8.84), SIMDE_FLOAT32_C(   146.38) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float32x4_t a = simde_vld1q_f32(test_vec[i].a);
    simde_float32x4_t b = simde_vld1q_f32(test_vec[i].b);
    int n = test_vec[i].n;
    simde_float32x4_t r;
    switch(n) {
      case 0: r = simde_vextq_f32(a, b, 0); break;
      case 1: r = simde_vextq_f32(a, b, 1); break;
      case 2: r = simde_vextq_f32(a, b, 2); break;
      case 3: r = simde_vextq_f32(a, b, 3); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }
    simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1);
  }

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 2, 3, 0, 1, 2, 3, };
  for (int i = 0 ; i < 8 ; i++) {
    simde_float32x4_t a = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f);
    simde_float32x4_t b = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f);
    simde_float32x4_t r = simde_vextq_f32(a, b, lanes[i]);

    simde_test_arm_neon_write_f32x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_f32x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lanes[i], SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vextq_f64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    simde_float64 a[2];
    simde_float64 b[2];
    int n;
    simde_float64 r[2];
  } test_vec[] = {
    { { SIMDE_FLOAT64_C(   223.42), SIMDE_FLOAT64_C(  -836.30) },
      { SIMDE_FLOAT64_C(  -552.33), SIMDE_FLOAT64_C(   -75.69) },
       INT32_C(           0),
      { SIMDE_FLOAT64_C(   223.42), SIMDE_FLOAT64_C(  -836.30) } },
    { { SIMDE_FLOAT64_C(   756.82), SIMDE_FLOAT64_C(  -550.05) },
      { SIMDE_FLOAT64_C(   687.41), SIMDE_FLOAT64_C(   804.17) },
       INT32_C(           0),
      { SIMDE_FLOAT64_C(   756.82), SIMDE_FLOAT64_C(  -550.05) } },
    { { SIMDE_FLOAT64_C(  -230.29), SIMDE_FLOAT64_C(  -327.40) },
      { SIMDE_FLOAT64_C(   614.24), SIMDE_FLOAT64_C(  -107.90) },
       INT32_C(           0),
      { SIMDE_FLOAT64_C(  -230.29), SIMDE_FLOAT64_C(  -327.40) } },
    { { SIMDE_FLOAT64_C(  -177.24), SIMDE_FLOAT64_C(  -842.50) },
      { SIMDE_FLOAT64_C(   773.97), SIMDE_FLOAT64_C(   644.31) },
       INT32_C(           0),
      { SIMDE_FLOAT64_C(  -177.24), SIMDE_FLOAT64_C(  -842.50) } },
    { { SIMDE_FLOAT64_C(  -485.54), SIMDE_FLOAT64_C(  -253.40) },
      { SIMDE_FLOAT64_C(  -930.32), SIMDE_FLOAT64_C(   677.29) },
       INT32_C(           0),
      { SIMDE_FLOAT64_C(  -485.54), SIMDE_FLOAT64_C(  -253.40) } },
    { { SIMDE_FLOAT64_C(   819.98), SIMDE_FLOAT64_C(   883.30) },
      { SIMDE_FLOAT64_C(  -760.51), SIMDE_FLOAT64_C(   669.54) },
       INT32_C(           0),
      { SIMDE_FLOAT64_C(   819.98), SIMDE_FLOAT64_C(   883.30) } },
    { { SIMDE_FLOAT64_C(  -349.64), SIMDE_FLOAT64_C(   465.41) },
      { SIMDE_FLOAT64_C(  -828.45), SIMDE_FLOAT64_C(  -240.64) },
       INT32_C(           0),
      { SIMDE_FLOAT64_C(  -349.64), SIMDE_FLOAT64_C(   465.41) } },
    { { SIMDE_FLOAT64_C(  -629.75), SIMDE_FLOAT64_C(   891.13) },
      { SIMDE_FLOAT64_C(  -550.52), SIMDE_FLOAT64_C(   593.67) },
       INT32_C(           0),
      { SIMDE_FLOAT64_C(  -629.75), SIMDE_FLOAT64_C(   891.13) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float64x2_t a = simde_vld1q_f64(test_vec[i].a);
    simde_float64x2_t b = simde_vld1q_f64(test_vec[i].b);
    int n = test_vec[i].n;
    simde_float64x2_t r;
    switch(n) {
      case 0: r = simde_vextq_f64(a, b, 0); break;
      case 1: r = simde_vextq_f64(a, b, 1); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }

    simde_test_arm_neon_assert_equal_f64x2(r, simde_vld1q_f64(test_vec[i].r), 1);
  }

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_float64x2_t a = simde_test_arm_neon_random_f64x2(-1000.0, 1000.0);
    simde_float64x2_t b = simde_test_arm_neon_random_f64x2(-1000.0, 1000.0);
    simde_float64x2_t r = simde_vextq_f64(a, b, 0);

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

static int
test_simde_vextq_s8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int8_t a[16];
    int8_t b[16];
    int n;
    int8_t r[16];
  } test_vec[] = {
    { { -INT8_C(  97), -INT8_C(   4), -INT8_C(  92),  INT8_C(  56),  INT8_C(  19),  INT8_C(  14), -INT8_C(  53),  INT8_C(  19),
         INT8_C( 106),  INT8_C(  24), -INT8_C(  46), -INT8_C(  86), -INT8_C( 103),  INT8_C( 115),  INT8_C(  96), -INT8_C(  67) },
      { -INT8_C(  10), -INT8_C(   2),  INT8_C(  82),  INT8_C(  65), -INT8_C(  30),  INT8_C(  34),  INT8_C(  93), -INT8_C(  78),
        -INT8_C(  68), -INT8_C(  13), -INT8_C(  43),  INT8_C(  71), -INT8_C(  27), -INT8_C(   5),  INT8_C(  39), -INT8_C( 123) },
       INT32_C(           2),
      { -INT8_C(  92),  INT8_C(  56),  INT8_C(  19),  INT8_C(  14), -INT8_C(  53),  INT8_C(  19),  INT8_C( 106),  INT8_C(  24),
        -INT8_C(  46), -INT8_C(  86), -INT8_C( 103),  INT8_C( 115),  INT8_C(  96), -INT8_C(  67), -INT8_C(  10), -INT8_C(   2) } },
    { { -INT8_C(   9), -INT8_C(  53), -INT8_C(  67),  INT8_C(  10), -INT8_C(  39), -INT8_C( 120),  INT8_C(  30),  INT8_C(  67),
        -INT8_C(  96), -INT8_C(  16), -INT8_C(  19),  INT8_C(  57),  INT8_C(  99),  INT8_C(  77), -INT8_C(   9),  INT8_C(  90) },
      {  INT8_C(  75),  INT8_C(  73), -INT8_C( 101),  INT8_C(  46),  INT8_C( 107), -INT8_C(   8), -INT8_C(  32),  INT8_C(  39),
        -INT8_C(  20), -INT8_C(  75),  INT8_C( 110), -INT8_C(  47), -INT8_C(  79), -INT8_C( 107),  INT8_C(  86), -INT8_C(  88) },
       INT32_C(           4),
      { -INT8_C(  39), -INT8_C( 120),  INT8_C(  30),  INT8_C(  67), -INT8_C(  96), -INT8_C(  16), -INT8_C(  19),  INT8_C(  57),
         INT8_C(  99),  INT8_C(  77), -INT8_C(   9),  INT8_C(  90),  INT8_C(  75),  INT8_C(  73), -INT8_C( 101),  INT8_C(  46) } },
    { {  INT8_C(  96),  INT8_C(  20), -INT8_C(  77),  INT8_C(  57), -INT8_C( 100), -INT8_C(  47),  INT8_C( 125),  INT8_C(  61),
        -INT8_C(  63),  INT8_C( 106),  INT8_C( 118),  INT8_C(  36), -INT8_C(  72),  INT8_C( 109),  INT8_C( 126),  INT8_C(   3) },
      { -INT8_C(  73),  INT8_C(  25),  INT8_C(  49),  INT8_C(  34),  INT8_C(  18),  INT8_C(  17),  INT8_C(  74), -INT8_C(   2),
        -INT8_C(  57), -INT8_C(  72), -INT8_C(  49),  INT8_C( 120),  INT8_C(  78),  INT8_C(  38),  INT8_C(  32), -INT8_C(  82) },
       INT32_C(           6),
      {  INT8_C( 125),  INT8_C(  61), -INT8_C(  63),  INT8_C( 106),  INT8_C( 118),  INT8_C(  36), -INT8_C(  72),  INT8_C( 109),
         INT8_C( 126),  INT8_C(   3), -INT8_C(  73),  INT8_C(  25),  INT8_C(  49),  INT8_C(  34),  INT8_C(  18),  INT8_C(  17) } },
    { {  INT8_C(  58), -INT8_C(  45), -INT8_C(  24), -INT8_C(  42), -INT8_C(  92),  INT8_C( 101),  INT8_C(  19),  INT8_C( 101),
        -INT8_C(  49), -INT8_C( 118), -INT8_C( 118), -INT8_C( 121), -INT8_C(   9),  INT8_C(   8), -INT8_C( 117), -INT8_C(  82) },
      {  INT8_C(  34), -INT8_C(  68), -INT8_C(  47),  INT8_C(  52), -INT8_C(  50),  INT8_C(  27),  INT8_C(  50), -INT8_C( 107),
        -INT8_C(  45),  INT8_C(   1),  INT8_C(  13),  INT8_C(  33),  INT8_C(  39),  INT8_C(  45), -INT8_C(  48),  INT8_C(  97) },
       INT32_C(           8),
      { -INT8_C(  49), -INT8_C( 118), -INT8_C( 118), -INT8_C( 121), -INT8_C(   9),  INT8_C(   8), -INT8_C( 117), -INT8_C(  82),
         INT8_C(  34), -INT8_C(  68), -INT8_C(  47),  INT8_C(  52), -INT8_C(  50),  INT8_C(  27),  INT8_C(  50), -INT8_C( 107) } },
    { {  INT8_C(   1), -INT8_C(  72),  INT8_C(  56), -INT8_C(  91),  INT8_C(  29),  INT8_C(  75),  INT8_C(  11), -INT8_C(  20),
        -INT8_C(  43), -INT8_C( 107),  INT8_C( 116), -INT8_C(  51), -INT8_C(  99), -INT8_C(   1),  INT8_C( 123), -INT8_C(  65) },
      { -INT8_C(  69),  INT8_C(  76), -INT8_C(  13), -INT8_C( 119),  INT8_C( 103),  INT8_C(  37),  INT8_C(  30),  INT8_C(  59),
         INT8_C(  39),  INT8_C(  43),  INT8_C(  92),  INT8_C(  78),  INT8_C(  89),  INT8_C(  44), -INT8_C(  80),  INT8_C(  90) },
       INT32_C(          10),
      {  INT8_C( 116), -INT8_C(  51), -INT8_C(  99), -INT8_C(   1),  INT8_C( 123), -INT8_C(  65), -INT8_C(  69),  INT8_C(  76),
        -INT8_C(  13), -INT8_C( 119),  INT8_C( 103),  INT8_C(  37),  INT8_C(  30),  INT8_C(  59),  INT8_C(  39),  INT8_C(  43) } },
    { { -INT8_C(  28), -INT8_C(  24), -INT8_C(   1),  INT8_C(   1),  INT8_C(  51),  INT8_C(  10), -INT8_C(  18),  INT8_C(   9),
        -INT8_C(  97),  INT8_C(  98), -INT8_C(  42),  INT8_C(  61),  INT8_C(  97),  INT8_C(  81), -INT8_C(   4),  INT8_C(  28) },
      { -INT8_C(  98), -INT8_C(  16), -INT8_C(  90),  INT8_C(   5),  INT8_C(  21), -INT8_C(  60),  INT8_C(  64),  INT8_C(  60),
        -INT8_C(  16), -INT8_C(  99), -INT8_C( 117),  INT8_C(  73), -INT8_C(  55),  INT8_C(  59), -INT8_C(  93), -INT8_C(  82) },
       INT32_C(          12),
      {  INT8_C(  97),  INT8_C(  81), -INT8_C(   4),  INT8_C(  28), -INT8_C(  98), -INT8_C(  16), -INT8_C(  90),  INT8_C(   5),
         INT8_C(  21), -INT8_C(  60),  INT8_C(  64),  INT8_C(  60), -INT8_C(  16), -INT8_C(  99), -INT8_C( 117),  INT8_C(  73) } },
    { {  INT8_C(  35), -INT8_C(  94), -INT8_C(  81),  INT8_C(  86), -INT8_C(  83), -INT8_C(  99),  INT8_C(  95),  INT8_C(  76),
        -INT8_C(   1),  INT8_C(  53), -INT8_C( 119),  INT8_C(  96), -INT8_C( 121), -INT8_C( 122),  INT8_C( 125),  INT8_C(  37) },
      {  INT8_C( 118),  INT8_C(  35),  INT8_C(  42), -INT8_C( 117), -INT8_C(  25),  INT8_C( 107), -INT8_C(  56), -INT8_C(  41),
         INT8_C(   8),  INT8_C(  83),  INT8_C(  32), -INT8_C(  47), -INT8_C( 114), -INT8_C(  61),      INT8_MAX, -INT8_C(  79) },
       INT32_C(          14),
      {  INT8_C( 125),  INT8_C(  37),  INT8_C( 118),  INT8_C(  35),  INT8_C(  42), -INT8_C( 117), -INT8_C(  25),  INT8_C( 107),
        -INT8_C(  56), -INT8_C(  41),  INT8_C(   8),  INT8_C(  83),  INT8_C(  32), -INT8_C(  47), -INT8_C( 114), -INT8_C(  61) } },
    { {  INT8_C( 102),  INT8_C(  47),  INT8_C(   7),  INT8_C(  19), -INT8_C(  52),  INT8_C( 103),  INT8_C(  95), -INT8_C(  52),
        -INT8_C( 100), -INT8_C(  23),  INT8_C(  44),  INT8_C(  35),  INT8_C( 111), -INT8_C(  87),  INT8_C(  72), -INT8_C(  27) },
      { -INT8_C(  52),  INT8_C( 115),  INT8_C( 112), -INT8_C(  76), -INT8_C(  34),  INT8_C(  56), -INT8_C( 117), -INT8_C(  26),
        -INT8_C( 117), -INT8_C(  84), -INT8_C(  73),  INT8_C(  25),  INT8_C( 111),  INT8_C(  55), -INT8_C(  54), -INT8_C(  43) },
       INT32_C(          15),
      { -INT8_C(  27), -INT8_C(  52),  INT8_C( 115),  INT8_C( 112), -INT8_C(  76), -INT8_C(  34),  INT8_C(  56), -INT8_C( 117),
        -INT8_C(  26), -INT8_C( 117), -INT8_C(  84), -INT8_C(  73),  INT8_C(  25),  INT8_C( 111),  INT8_C(  55), -INT8_C(  54) } },

  };

  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);
    int n = test_vec[i].n;
    simde_int8x16_t r;
    switch(n) {
      case 0: r = simde_vextq_s8(a, b, 0); break;
      case 1: r = simde_vextq_s8(a, b, 1); break;
      case 2: r = simde_vextq_s8(a, b, 2); break;
      case 3: r = simde_vextq_s8(a, b, 3); break;
      case 4: r = simde_vextq_s8(a, b, 4); break;
      case 5: r = simde_vextq_s8(a, b, 5); break;
      case 6: r = simde_vextq_s8(a, b, 6); break;
      case 7: r = simde_vextq_s8(a, b, 7); break;
      case 8: r = simde_vextq_s8(a, b, 8); break;
      case 9: r = simde_vextq_s8(a, b, 9); break;
      case 10: r = simde_vextq_s8(a, b, 10); break;
      case 11: r = simde_vextq_s8(a, b, 11); break;
      case 12: r = simde_vextq_s8(a, b, 12); break;
      case 13: r = simde_vextq_s8(a, b, 13); break;
      case 14: r = simde_vextq_s8(a, b, 14); break;
      case 15: r = simde_vextq_s8(a, b, 15); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }

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

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 2, 4, 6, 8, 10, 12, 14, 15 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_int8x16_t a = simde_test_arm_neon_random_i8x16();
    simde_int8x16_t b = simde_test_arm_neon_random_i8x16();
    simde_int8x16_t r = simde_vextq_s8(a, b, lanes[i]);

    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_codegen_write_i32(2, lanes[i], 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_vextq_s16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int16_t a[8];
    int16_t b[8];
    int n;
    int16_t r[8];
  } test_vec[] = {
    { { -INT16_C(  5517),  INT16_C( 11597), -INT16_C( 20136),  INT16_C( 32730), -INT16_C( 15613), -INT16_C( 13999), -INT16_C( 10256), -INT16_C( 12873) },
      {  INT16_C( 23318), -INT16_C( 23493),  INT16_C(  6269), -INT16_C( 11894), -INT16_C( 14678), -INT16_C(   567), -INT16_C( 20668), -INT16_C( 18497) },
       INT32_C(           0),
      { -INT16_C(  5517),  INT16_C( 11597), -INT16_C( 20136),  INT16_C( 32730), -INT16_C( 15613), -INT16_C( 13999), -INT16_C( 10256), -INT16_C( 12873) } },
    { {  INT16_C(  3481), -INT16_C(  3612), -INT16_C( 16706), -INT16_C( 16015), -INT16_C( 15742),  INT16_C( 29322),  INT16_C( 17049), -INT16_C( 20673) },
      {  INT16_C( 31389),  INT16_C(  6739), -INT16_C(  8813),  INT16_C( 15852), -INT16_C( 19037), -INT16_C(  6341), -INT16_C(  1436), -INT16_C(   354) },
       INT32_C(           1),
      { -INT16_C(  3612), -INT16_C( 16706), -INT16_C( 16015), -INT16_C( 15742),  INT16_C( 29322),  INT16_C( 17049), -INT16_C( 20673),  INT16_C( 31389) } },
    { { -INT16_C( 31993), -INT16_C( 14609),  INT16_C( 24641), -INT16_C( 15481),  INT16_C(  4642), -INT16_C( 17611),  INT16_C( 29780), -INT16_C(  3734) },
      { -INT16_C( 16913), -INT16_C( 32244), -INT16_C(  1894),  INT16_C( 15807), -INT16_C(  1363),  INT16_C(  4388), -INT16_C( 15371), -INT16_C(  1009) },
       INT32_C(           2),
      {  INT16_C( 24641), -INT16_C( 15481),  INT16_C(  4642), -INT16_C( 17611),  INT16_C( 29780), -INT16_C(  3734), -INT16_C( 16913), -INT16_C( 32244) } },
    { { -INT16_C(   186), -INT16_C( 30782),  INT16_C( 19039), -INT16_C( 32181), -INT16_C( 32676), -INT16_C( 20419), -INT16_C( 22283), -INT16_C(  7007) },
      { -INT16_C( 21147),  INT16_C(   102),  INT16_C(  9637),  INT16_C( 21053),  INT16_C( 25120),  INT16_C(  5476),  INT16_C( 29477),  INT16_C( 27409) },
       INT32_C(           3),
      { -INT16_C( 32181), -INT16_C( 32676), -INT16_C( 20419), -INT16_C( 22283), -INT16_C(  7007), -INT16_C( 21147),  INT16_C(   102),  INT16_C(  9637) } },
    { { -INT16_C( 11150), -INT16_C( 11534),  INT16_C( 15646),  INT16_C( 31316), -INT16_C( 28226), -INT16_C( 19670), -INT16_C( 13511), -INT16_C( 24681) },
      { -INT16_C(   647),  INT16_C(  7839), -INT16_C(  9182),  INT16_C( 17009), -INT16_C( 10946),  INT16_C( 25431),  INT16_C( 26952), -INT16_C( 17458) },
       INT32_C(           4),
      { -INT16_C( 28226), -INT16_C( 19670), -INT16_C( 13511), -INT16_C( 24681), -INT16_C(   647),  INT16_C(  7839), -INT16_C(  9182),  INT16_C( 17009) } },
    { { -INT16_C( 16067),  INT16_C( 23437), -INT16_C(  7682), -INT16_C( 17195), -INT16_C(   142), -INT16_C( 21393),  INT16_C(  1738),  INT16_C( 17227) },
      { -INT16_C(  5629),  INT16_C(  9826), -INT16_C( 11322),  INT16_C(  1384), -INT16_C( 16216), -INT16_C(  3992),  INT16_C( 14121),  INT16_C( 26283) },
       INT32_C(           5),
      { -INT16_C( 21393),  INT16_C(  1738),  INT16_C( 17227), -INT16_C(  5629),  INT16_C(  9826), -INT16_C( 11322),  INT16_C(  1384), -INT16_C( 16216) } },
    { {  INT16_C( 14584), -INT16_C(  2367), -INT16_C( 27111), -INT16_C( 29517),  INT16_C(  8853),  INT16_C( 24376), -INT16_C( 31959),  INT16_C( 11427) },
      {  INT16_C(  1389),  INT16_C( 13138), -INT16_C( 17448), -INT16_C( 32712), -INT16_C( 24197), -INT16_C( 23440),  INT16_C(  7384), -INT16_C( 12278) },
       INT32_C(           6),
      { -INT16_C( 31959),  INT16_C( 11427),  INT16_C(  1389),  INT16_C( 13138), -INT16_C( 17448), -INT16_C( 32712), -INT16_C( 24197), -INT16_C( 23440) } },
    { { -INT16_C( 13484),  INT16_C( 28358),  INT16_C( 31073), -INT16_C(  2310),  INT16_C( 12956), -INT16_C( 15019), -INT16_C(  1867),  INT16_C(  8945) },
      {  INT16_C( 17661), -INT16_C( 10923), -INT16_C( 28929),  INT16_C( 31317), -INT16_C( 14801),  INT16_C(  1822),  INT16_C( 10466),  INT16_C( 14039) },
       INT32_C(           7),
      {  INT16_C(  8945),  INT16_C( 17661), -INT16_C( 10923), -INT16_C( 28929),  INT16_C( 31317), -INT16_C( 14801),  INT16_C(  1822),  INT16_C( 10466) } },

  };

  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);
    int n = test_vec[i].n;
    simde_int16x8_t r;
    switch(n) {
      case 0: r = simde_vextq_s16(a, b, 0); break;
      case 1: r = simde_vextq_s16(a, b, 1); break;
      case 2: r = simde_vextq_s16(a, b, 2); break;
      case 3: r = simde_vextq_s16(a, b, 3); break;
      case 4: r = simde_vextq_s16(a, b, 4); break;
      case 5: r = simde_vextq_s16(a, b, 5); break;
      case 6: r = simde_vextq_s16(a, b, 6); break;
      case 7: r = simde_vextq_s16(a, b, 7); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }

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

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_int16x8_t a = simde_test_arm_neon_random_i16x8();
    simde_int16x8_t b = simde_test_arm_neon_random_i16x8();
    simde_int16x8_t r = simde_vextq_s16(a, b, lanes[i]);

    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_codegen_write_i32(2, lanes[i], 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_vextq_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int32_t a[4];
    int32_t b[4];
    int n;
    int32_t r[4];
  } test_vec[] = {
    { { -INT32_C(   145520176), -INT32_C(  1239517348),  INT32_C(  1536889979),  INT32_C(   771985900) },
      { -INT32_C(  1757387936),  INT32_C(  2023341027), -INT32_C(   369368052), -INT32_C(  2043944522) },
       INT32_C(           0),
      { -INT32_C(   145520176), -INT32_C(  1239517348),  INT32_C(  1536889979),  INT32_C(   771985900) } },
    { { -INT32_C(   948011413),  INT32_C(  1887280373), -INT32_C(  1664345936),  INT32_C(   164286377) },
      {  INT32_C(   362875442), -INT32_C(   762496314), -INT32_C(   709064674), -INT32_C(   715397270) },
       INT32_C(           1),
      {  INT32_C(  1887280373), -INT32_C(  1664345936),  INT32_C(   164286377),  INT32_C(   362875442) } },
    { {  INT32_C(  1537005925),  INT32_C(   650844534), -INT32_C(   624715983), -INT32_C(  1729917594) },
      {  INT32_C(  1588429976), -INT32_C(   584041538),  INT32_C(   766700739),  INT32_C(   956435923) },
       INT32_C(           2),
      { -INT32_C(   624715983), -INT32_C(  1729917594),  INT32_C(  1588429976), -INT32_C(   584041538) } },
    { {  INT32_C(  1570021095), -INT32_C(   394043465),  INT32_C(  1573013239),  INT32_C(  1828103892) },
      { -INT32_C(   372595926), -INT32_C(  1564017954), -INT32_C(  1160808217),  INT32_C(  1827918469) },
       INT32_C(           3),
      {  INT32_C(  1828103892), -INT32_C(   372595926), -INT32_C(  1564017954), -INT32_C(  1160808217) } },
    { {  INT32_C(   684296048), -INT32_C(   569356825),  INT32_C(  1731974035), -INT32_C(  1546440327) },
      { -INT32_C(  1282630187),  INT32_C(  2136298136),  INT32_C(  1345922506),  INT32_C(  1740385783) },
       INT32_C(           0),
      {  INT32_C(   684296048), -INT32_C(   569356825),  INT32_C(  1731974035), -INT32_C(  1546440327) } },
    { { -INT32_C(  1685092684),  INT32_C(  1719247059), -INT32_C(   321997453), -INT32_C(  1148214810) },
      { -INT32_C(   680584129),  INT32_C(   961987694), -INT32_C(   527855639),  INT32_C(  1900561852) },
       INT32_C(           1),
      {  INT32_C(  1719247059), -INT32_C(   321997453), -INT32_C(  1148214810), -INT32_C(   680584129) } },
    { { -INT32_C(  1643325493), -INT32_C(   368736649),  INT32_C(   567726907), -INT32_C(  1277335948) },
      { -INT32_C(   259371902), -INT32_C(    97918960),  INT32_C(   752530032), -INT32_C(  1013112072) },
       INT32_C(           2),
      {  INT32_C(   567726907), -INT32_C(  1277335948), -INT32_C(   259371902), -INT32_C(    97918960) } },
    { {  INT32_C(  1902291706),  INT32_C(  1801217840), -INT32_C(  1366543814),  INT32_C(   442657176) },
      { -INT32_C(   972297035),  INT32_C(  1036006605), -INT32_C(   546727193), -INT32_C(  1214117955) },
       INT32_C(           3),
      {  INT32_C(   442657176), -INT32_C(   972297035),  INT32_C(  1036006605), -INT32_C(   546727193) } },

  };

  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);
    int n = test_vec[i].n;
    simde_int32x4_t r;
    switch(n) {
      case 0: r = simde_vextq_s32(a, b, 0); break;
      case 1: r = simde_vextq_s32(a, b, 1); break;
      case 2: r = simde_vextq_s32(a, b, 2); break;
      case 3: r = simde_vextq_s32(a, b, 3); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }
    simde_test_arm_neon_assert_equal_i32x4(r, simde_vld1q_s32(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 2, 3, 0, 1, 2, 3 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_int32x4_t a = simde_test_arm_neon_random_i32x4();
    simde_int32x4_t b = simde_test_arm_neon_random_i32x4();
    simde_int32x4_t r = simde_vextq_s32(a, b, lanes[i]);

    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_codegen_write_i32(2, lanes[i], 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_vextq_s64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int64_t a[2];
    int64_t b[2];
    int n;
    int64_t r[2];
  } test_vec[] = {
    { {  INT64_C( 8417013950001805874),  INT64_C( 3633663084360530521) },
      {  INT64_C( 1943148483586602984),  INT64_C( 3816659953121660075) },
       INT32_C(           0),
      {  INT64_C( 8417013950001805874),  INT64_C( 3633663084360530521) } },
    { { -INT64_C( 1439284280502823430),  INT64_C( 1054151440654452764) },
      { -INT64_C( 4311023356637567279), -INT64_C( 1374377497113431369) },
       INT32_C(           1),
      {  INT64_C( 1054151440654452764), -INT64_C( 4311023356637567279) } },
    { {  INT64_C( 9155400649511190671), -INT64_C( 6593111716141286836) },
      { -INT64_C( 7488392302349077195),  INT64_C( 2320267026713630292) },
       INT32_C(           0),
      {  INT64_C( 9155400649511190671), -INT64_C( 6593111716141286836) } },
    { { -INT64_C( 9016399738793971202), -INT64_C( 7889614551166694134) },
      {  INT64_C( 8044261376637614122),  INT64_C( 3458176489256055627) },
       INT32_C(           1),
      { -INT64_C( 7889614551166694134),  INT64_C( 8044261376637614122) } },
    { { -INT64_C( 7326670976013287525), -INT64_C( 1860835758546860227) },
      {  INT64_C( 5673852747975233075), -INT64_C(  583453248029232250) },
       INT32_C(           0),
      { -INT64_C( 7326670976013287525), -INT64_C( 1860835758546860227) } },
    { {  INT64_C( 2635198315562039143),  INT64_C( 4108384592786754145) },
      {  INT64_C(  957653221600916728),  INT64_C(  291517491048707511) },
       INT32_C(           1),
      {  INT64_C( 4108384592786754145),  INT64_C(  957653221600916728) } },
    { {  INT64_C( 5705936401661219620), -INT64_C( 3398123318154564200) },
      {  INT64_C( 6482956552596381284), -INT64_C( 8129991925187166581) },
       INT32_C(           0),
      {  INT64_C( 5705936401661219620), -INT64_C( 3398123318154564200) } },
    { {  INT64_C( 5730771934834796618), -INT64_C( 4080045330485349448) },
      { -INT64_C( 3666586218353513438),  INT64_C( 5432222966802123113) },
       INT32_C(           1),
      { -INT64_C( 4080045330485349448), -INT64_C( 3666586218353513438) } },

  };

  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);
    int n = test_vec[i].n;
    simde_int64x2_t r;
    switch(n) {
      case 0: r = simde_vextq_s64(a, b, 0); break;
      case 1: r = simde_vextq_s64(a, b, 1); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }
    simde_test_arm_neon_assert_equal_i64x2(r, simde_vld1q_s64(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 0, 1, 0, 1, 0, 1 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_int64x2_t a = simde_test_arm_neon_random_i64x2();
    simde_int64x2_t b = simde_test_arm_neon_random_i64x2();
    simde_int64x2_t r = simde_vextq_s64(a, b, lanes[i]);

    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_codegen_write_i32(2, lanes[i], 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_vextq_u8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint8_t a[16];
    uint8_t b[16];
    int n;
    uint8_t r[16];
  } test_vec[] = {
    { { UINT8_C(236), UINT8_C( 12), UINT8_C(220), UINT8_C( 76), UINT8_C(149), UINT8_C(102), UINT8_C(190), UINT8_C(154),
        UINT8_C(190), UINT8_C( 97), UINT8_C( 26), UINT8_C(  0), UINT8_C(104), UINT8_C(  4), UINT8_C(242), UINT8_C( 16) },
      { UINT8_C( 85), UINT8_C(127), UINT8_C(245), UINT8_C( 30), UINT8_C(177), UINT8_C(132), UINT8_C( 67), UINT8_C(107),
        UINT8_C(115), UINT8_C( 46), UINT8_C(225), UINT8_C( 35), UINT8_C( 67), UINT8_C( 16), UINT8_C( 83), UINT8_C( 47) },
       INT32_C(           0),
      { UINT8_C(236), UINT8_C( 12), UINT8_C(220), UINT8_C( 76), UINT8_C(149), UINT8_C(102), UINT8_C(190), UINT8_C(154),
        UINT8_C(190), UINT8_C( 97), UINT8_C( 26), UINT8_C(  0), UINT8_C(104), UINT8_C(  4), UINT8_C(242), UINT8_C( 16) } },
    { { UINT8_C( 28), UINT8_C( 47), UINT8_C(124), UINT8_C(177), UINT8_C(149), UINT8_C( 58), UINT8_C( 76), UINT8_C( 83),
        UINT8_C(156), UINT8_C(102), UINT8_C( 84), UINT8_C(  4), UINT8_C(106), UINT8_C( 70), UINT8_C( 20), UINT8_C(191) },
      { UINT8_C(197), UINT8_C(  9), UINT8_C(221), UINT8_C(118), UINT8_C(141), UINT8_C( 33), UINT8_C(225), UINT8_C(  0),
        UINT8_C( 79), UINT8_C(194), UINT8_C( 35), UINT8_C(147), UINT8_C(210), UINT8_C(118), UINT8_C(194), UINT8_C(239) },
       INT32_C(           2),
      { UINT8_C(124), UINT8_C(177), UINT8_C(149), UINT8_C( 58), UINT8_C( 76), UINT8_C( 83), UINT8_C(156), UINT8_C(102),
        UINT8_C( 84), UINT8_C(  4), UINT8_C(106), UINT8_C( 70), UINT8_C( 20), UINT8_C(191), UINT8_C(197), UINT8_C(  9) } },
    { { UINT8_C(166), UINT8_C( 62), UINT8_C(160), UINT8_C( 59), UINT8_C(121), UINT8_C(236), UINT8_C(143), UINT8_C( 21),
        UINT8_C( 82), UINT8_C(227), UINT8_C( 25), UINT8_C(188), UINT8_C( 41), UINT8_C( 45), UINT8_C(123), UINT8_C(238) },
      { UINT8_C( 54), UINT8_C( 89), UINT8_C(100), UINT8_C(196), UINT8_C(122), UINT8_C( 69), UINT8_C(196), UINT8_C(201),
        UINT8_C(  7), UINT8_C(232), UINT8_C( 92), UINT8_C(218), UINT8_C( 94), UINT8_C( 31), UINT8_C(201), UINT8_C(  4) },
       INT32_C(           4),
      { UINT8_C(121), UINT8_C(236), UINT8_C(143), UINT8_C( 21), UINT8_C( 82), UINT8_C(227), UINT8_C( 25), UINT8_C(188),
        UINT8_C( 41), UINT8_C( 45), UINT8_C(123), UINT8_C(238), UINT8_C( 54), UINT8_C( 89), UINT8_C(100), UINT8_C(196) } },
    { { UINT8_C( 93), UINT8_C(105), UINT8_C( 64), UINT8_C(214), UINT8_C( 86), UINT8_C(207), UINT8_C(235), UINT8_C(168),
        UINT8_C(178), UINT8_C(  4), UINT8_C(101), UINT8_C(219), UINT8_C( 49), UINT8_C(224), UINT8_C(201), UINT8_C(104) },
      { UINT8_C( 57), UINT8_C( 45), UINT8_C( 44), UINT8_C(179), UINT8_C(114), UINT8_C(240), UINT8_C(125), UINT8_C(121),
        UINT8_C(216), UINT8_C(217), UINT8_C( 83), UINT8_C( 55), UINT8_C(248), UINT8_C( 28), UINT8_C( 59), UINT8_C( 86) },
       INT32_C(           6),
      { UINT8_C(235), UINT8_C(168), UINT8_C(178), UINT8_C(  4), UINT8_C(101), UINT8_C(219), UINT8_C( 49), UINT8_C(224),
        UINT8_C(201), UINT8_C(104), UINT8_C( 57), UINT8_C( 45), UINT8_C( 44), UINT8_C(179), UINT8_C(114), UINT8_C(240) } },
    { { UINT8_C(134), UINT8_C(123), UINT8_C( 44), UINT8_C(220), UINT8_C( 74), UINT8_C( 24), UINT8_C(132), UINT8_C(252),
        UINT8_C( 28), UINT8_C(233), UINT8_C(215), UINT8_C( 78), UINT8_C(202), UINT8_C(160), UINT8_C(182), UINT8_C(  3) },
      { UINT8_C(205), UINT8_C(226), UINT8_C(183), UINT8_C( 63), UINT8_C(210), UINT8_C( 52), UINT8_C(185), UINT8_C(171),
        UINT8_C( 13), UINT8_C( 12), UINT8_C(226), UINT8_C(  6), UINT8_C( 41), UINT8_C( 29), UINT8_C( 92), UINT8_C(175) },
       INT32_C(           8),
      { UINT8_C( 28), UINT8_C(233), UINT8_C(215), UINT8_C( 78), UINT8_C(202), UINT8_C(160), UINT8_C(182), UINT8_C(  3),
        UINT8_C(205), UINT8_C(226), UINT8_C(183), UINT8_C( 63), UINT8_C(210), UINT8_C( 52), UINT8_C(185), UINT8_C(171) } },
    { { UINT8_C(153), UINT8_C(136), UINT8_C(139), UINT8_C(227), UINT8_C(160), UINT8_C( 15), UINT8_C(224), UINT8_C(189),
        UINT8_C(249), UINT8_C(183), UINT8_C( 11), UINT8_C(195), UINT8_C( 88), UINT8_C(193), UINT8_C(198), UINT8_C( 37) },
      { UINT8_C(163), UINT8_C(125), UINT8_C(101), UINT8_C(117), UINT8_C(177), UINT8_C( 30), UINT8_C( 32), UINT8_C(191),
        UINT8_C( 42), UINT8_C(  2), UINT8_C(197), UINT8_C( 83), UINT8_C( 32), UINT8_C( 33), UINT8_C(  2), UINT8_C(185) },
       INT32_C(          10),
      { UINT8_C( 11), UINT8_C(195), UINT8_C( 88), UINT8_C(193), UINT8_C(198), UINT8_C( 37), UINT8_C(163), UINT8_C(125),
        UINT8_C(101), UINT8_C(117), UINT8_C(177), UINT8_C( 30), UINT8_C( 32), UINT8_C(191), UINT8_C( 42), UINT8_C(  2) } },
    { { UINT8_C(169), UINT8_C(141), UINT8_C(156), UINT8_C( 74), UINT8_C(157), UINT8_C(124), UINT8_C(  7), UINT8_C(150),
        UINT8_C( 52), UINT8_C( 18), UINT8_C( 89), UINT8_C(140), UINT8_C(211), UINT8_C( 31), UINT8_C(177), UINT8_C(118) },
      { UINT8_C(157), UINT8_C( 22), UINT8_C(235), UINT8_C( 78), UINT8_C( 52), UINT8_C( 12), UINT8_C( 13), UINT8_C( 95),
        UINT8_C( 14), UINT8_C(210), UINT8_C(178), UINT8_C( 46), UINT8_C(243), UINT8_C(181), UINT8_C(231), UINT8_C(157) },
       INT32_C(          12),
      { UINT8_C(211), UINT8_C( 31), UINT8_C(177), UINT8_C(118), UINT8_C(157), UINT8_C( 22), UINT8_C(235), UINT8_C( 78),
        UINT8_C( 52), UINT8_C( 12), UINT8_C( 13), UINT8_C( 95), UINT8_C( 14), UINT8_C(210), UINT8_C(178), UINT8_C( 46) } },
    { { UINT8_C( 66), UINT8_C(132), UINT8_C(231), UINT8_C(223), UINT8_C(  0), UINT8_C(238), UINT8_C(117), UINT8_C( 52),
        UINT8_C(  0), UINT8_C(206), UINT8_C(192), UINT8_C(211), UINT8_C(238), UINT8_C(114), UINT8_C( 73), UINT8_C(139) },
      { UINT8_C(136), UINT8_C( 52), UINT8_C(217), UINT8_C(189), UINT8_C( 64), UINT8_C(231), UINT8_C( 28), UINT8_C( 79),
        UINT8_C(185), UINT8_C(206), UINT8_C(125), UINT8_C(173), UINT8_C(131), UINT8_C(101), UINT8_C( 74), UINT8_C(198) },
       INT32_C(          14),
      { UINT8_C( 73), UINT8_C(139), UINT8_C(136), UINT8_C( 52), UINT8_C(217), UINT8_C(189), UINT8_C( 64), UINT8_C(231),
        UINT8_C( 28), UINT8_C( 79), UINT8_C(185), UINT8_C(206), UINT8_C(125), UINT8_C(173), UINT8_C(131), UINT8_C(101) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint8x16_t a = simde_vld1q_u8(test_vec[i].a);
    simde_uint8x16_t b = simde_vld1q_u8(test_vec[i].b);
    int n = test_vec[i].n;
    simde_uint8x16_t r;
    switch(n) {
      case 0: r = simde_vextq_u8(a, b, 0); break;
      case 1: r = simde_vextq_u8(a, b, 1); break;
      case 2: r = simde_vextq_u8(a, b, 2); break;
      case 3: r = simde_vextq_u8(a, b, 3); break;
      case 4: r = simde_vextq_u8(a, b, 4); break;
      case 5: r = simde_vextq_u8(a, b, 5); break;
      case 6: r = simde_vextq_u8(a, b, 6); break;
      case 7: r = simde_vextq_u8(a, b, 7); break;
      case 8: r = simde_vextq_u8(a, b, 8); break;
      case 9: r = simde_vextq_u8(a, b, 9); break;
      case 10: r = simde_vextq_u8(a, b, 10); break;
      case 11: r = simde_vextq_u8(a, b, 11); break;
      case 12: r = simde_vextq_u8(a, b, 12); break;
      case 13: r = simde_vextq_u8(a, b, 13); break;
      case 14: r = simde_vextq_u8(a, b, 14); break;
      case 15: r = simde_vextq_u8(a, b, 15); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }

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

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 2, 4, 6, 8, 10, 12, 14 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_uint8x16_t a = simde_test_arm_neon_random_u8x16();
    simde_uint8x16_t b = simde_test_arm_neon_random_u8x16();
    simde_uint8x16_t r = simde_vextq_u8(a, b, lanes[i]);

    simde_test_arm_neon_write_u8x16(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u8x16(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lanes[i], 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_vextq_u16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint16_t a[8];
    uint16_t b[8];
    int n;
    uint16_t r[8];
  } test_vec[] = {
    { { UINT16_C(24754), UINT16_C(42838), UINT16_C(61167), UINT16_C(61004), UINT16_C(44235), UINT16_C(29361), UINT16_C(52240), UINT16_C(47002) },
      { UINT16_C(58649), UINT16_C(62180), UINT16_C(35996), UINT16_C(45949), UINT16_C(27671), UINT16_C(46444), UINT16_C(49652), UINT16_C(42653) },
       INT32_C(           0),
      { UINT16_C(24754), UINT16_C(42838), UINT16_C(61167), UINT16_C(61004), UINT16_C(44235), UINT16_C(29361), UINT16_C(52240), UINT16_C(47002) } },
    { { UINT16_C(62241), UINT16_C( 4173), UINT16_C(39393), UINT16_C(44543), UINT16_C(45125), UINT16_C(21791), UINT16_C(47740), UINT16_C(38413) },
      { UINT16_C(61855), UINT16_C(15496), UINT16_C( 1405), UINT16_C(38383), UINT16_C(23410), UINT16_C(26186), UINT16_C(59165), UINT16_C(15884) },
       INT32_C(           1),
      { UINT16_C( 4173), UINT16_C(39393), UINT16_C(44543), UINT16_C(45125), UINT16_C(21791), UINT16_C(47740), UINT16_C(38413), UINT16_C(61855) } },
    { { UINT16_C(23002), UINT16_C(48207), UINT16_C(20210), UINT16_C(14185), UINT16_C(35070), UINT16_C(31628), UINT16_C(39234), UINT16_C(57873) },
      { UINT16_C(39307), UINT16_C( 2078), UINT16_C( 3487), UINT16_C( 4509), UINT16_C(59241), UINT16_C(34423), UINT16_C(33742), UINT16_C(43460) },
       INT32_C(           2),
      { UINT16_C(20210), UINT16_C(14185), UINT16_C(35070), UINT16_C(31628), UINT16_C(39234), UINT16_C(57873), UINT16_C(39307), UINT16_C( 2078) } },
    { { UINT16_C( 5084), UINT16_C(52837), UINT16_C(52833), UINT16_C(24581), UINT16_C(37206), UINT16_C(39387), UINT16_C(60459), UINT16_C(46715) },
      { UINT16_C(39301), UINT16_C( 9406), UINT16_C(23718), UINT16_C( 3893), UINT16_C(44099), UINT16_C( 4757), UINT16_C(23087), UINT16_C( 3003) },
       INT32_C(           3),
      { UINT16_C(24581), UINT16_C(37206), UINT16_C(39387), UINT16_C(60459), UINT16_C(46715), UINT16_C(39301), UINT16_C( 9406), UINT16_C(23718) } },
    { { UINT16_C( 8301), UINT16_C(53209), UINT16_C(57070), UINT16_C(17455), UINT16_C( 2672), UINT16_C(39901), UINT16_C(22774), UINT16_C(31569) },
      { UINT16_C( 4081), UINT16_C(39072), UINT16_C(54635), UINT16_C(44967), UINT16_C(15746), UINT16_C(45505), UINT16_C(31895), UINT16_C( 1213) },
       INT32_C(           4),
      { UINT16_C( 2672), UINT16_C(39901), UINT16_C(22774), UINT16_C(31569), UINT16_C( 4081), UINT16_C(39072), UINT16_C(54635), UINT16_C(44967) } },
    { { UINT16_C(38556), UINT16_C(35539), UINT16_C(  629), UINT16_C(58830), UINT16_C(44044), UINT16_C(  640), UINT16_C(53508), UINT16_C(63102) },
      { UINT16_C( 7904), UINT16_C(19598), UINT16_C(13811), UINT16_C(30203), UINT16_C(48242), UINT16_C( 2343), UINT16_C(58424), UINT16_C(54286) },
       INT32_C(           5),
      { UINT16_C(  640), UINT16_C(53508), UINT16_C(63102), UINT16_C( 7904), UINT16_C(19598), UINT16_C(13811), UINT16_C(30203), UINT16_C(48242) } },
    { { UINT16_C(57722), UINT16_C(61278), UINT16_C(11492), UINT16_C(61652), UINT16_C(21720), UINT16_C(56819), UINT16_C(28965), UINT16_C( 1747) },
      { UINT16_C(24975), UINT16_C(33362), UINT16_C(19862), UINT16_C( 2552), UINT16_C( 7945), UINT16_C(16658), UINT16_C( 8195), UINT16_C(32021) },
       INT32_C(           6),
      { UINT16_C(28965), UINT16_C( 1747), UINT16_C(24975), UINT16_C(33362), UINT16_C(19862), UINT16_C( 2552), UINT16_C( 7945), UINT16_C(16658) } },
    { { UINT16_C(29442), UINT16_C(58989), UINT16_C(16799), UINT16_C(30934), UINT16_C(51606), UINT16_C(47957), UINT16_C(10298), UINT16_C(51649) },
      { UINT16_C( 5001), UINT16_C( 8012), UINT16_C(17504), UINT16_C(26920), UINT16_C(15203), UINT16_C(26282), UINT16_C(48987), UINT16_C(24035) },
       INT32_C(           7),
      { UINT16_C(51649), UINT16_C( 5001), UINT16_C( 8012), UINT16_C(17504), UINT16_C(26920), UINT16_C(15203), UINT16_C(26282), UINT16_C(48987) } },

  };

  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_uint16x8_t b = simde_vld1q_u16(test_vec[i].b);
    int n = test_vec[i].n;
    simde_uint16x8_t r;
    switch(n) {
      case 0: r = simde_vextq_u16(a, b, 0); break;
      case 1: r = simde_vextq_u16(a, b, 1); break;
      case 2: r = simde_vextq_u16(a, b, 2); break;
      case 3: r = simde_vextq_u16(a, b, 3); break;
      case 4: r = simde_vextq_u16(a, b, 4); break;
      case 5: r = simde_vextq_u16(a, b, 5); break;
      case 6: r = simde_vextq_u16(a, b, 6); break;
      case 7: r = simde_vextq_u16(a, b, 7); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }
    simde_test_arm_neon_assert_equal_u16x8(r, simde_vld1q_u16(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_uint16x8_t a = simde_test_arm_neon_random_u16x8();
    simde_uint16x8_t b = simde_test_arm_neon_random_u16x8();
    simde_uint16x8_t r = simde_vextq_u16(a, b, lanes[i]);

    simde_test_arm_neon_write_u16x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lanes[i], 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_vextq_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint32_t a[4];
    uint32_t b[4];
    int n;
    uint32_t r[4];
  } test_vec[] = {
    { { UINT32_C(2900247930), UINT32_C( 249084522), UINT32_C(3367049666), UINT32_C(2305880858) },
      { UINT32_C(1681122816), UINT32_C( 807407232), UINT32_C(3769075986), UINT32_C(2554260254) },
       INT32_C(           0),
      { UINT32_C(2900247930), UINT32_C( 249084522), UINT32_C(3367049666), UINT32_C(2305880858) } },
    { { UINT32_C(2588155184), UINT32_C(2577931479), UINT32_C(1348557109), UINT32_C(1306120525) },
      { UINT32_C( 934350007), UINT32_C( 761778458), UINT32_C(2030898778), UINT32_C( 688999417) },
       INT32_C(           1),
      { UINT32_C(2577931479), UINT32_C(1348557109), UINT32_C(1306120525), UINT32_C( 934350007) } },
    { { UINT32_C(1086609000), UINT32_C(2832821362), UINT32_C( 335035334), UINT32_C(3294679308) },
      { UINT32_C(4160426461), UINT32_C(1009017826), UINT32_C(1807036785), UINT32_C(3851732861) },
       INT32_C(           2),
      { UINT32_C( 335035334), UINT32_C(3294679308), UINT32_C(4160426461), UINT32_C(1009017826) } },
    { { UINT32_C(2401589277), UINT32_C(2335702981), UINT32_C(1184771898), UINT32_C(3708485120) },
      { UINT32_C(4057269775), UINT32_C(3660446057), UINT32_C(2823152427), UINT32_C(3347962538) },
       INT32_C(           3),
      { UINT32_C(3708485120), UINT32_C(4057269775), UINT32_C(3660446057), UINT32_C(2823152427) } },
    { { UINT32_C(4149654322), UINT32_C(3967979186), UINT32_C(3190956221), UINT32_C( 765148446) },
      { UINT32_C(2887675971), UINT32_C(2508606570), UINT32_C(3644705839), UINT32_C(3634416294) },
       INT32_C(           0),
      { UINT32_C(4149654322), UINT32_C(3967979186), UINT32_C(3190956221), UINT32_C( 765148446) } },
    { { UINT32_C( 802223741), UINT32_C(1109086852), UINT32_C(2432716403), UINT32_C(3468663691) },
      { UINT32_C(1987763468), UINT32_C(1477115945), UINT32_C(1915832524), UINT32_C(2420887826) },
       INT32_C(           1),
      { UINT32_C(1109086852), UINT32_C(2432716403), UINT32_C(3468663691), UINT32_C(1987763468) } },
    { { UINT32_C(1287592904), UINT32_C(3767458669), UINT32_C(3027406377), UINT32_C( 914501930) },
      { UINT32_C( 950860814), UINT32_C(3381704700), UINT32_C( 289129215), UINT32_C(1537312403) },
       INT32_C(           2),
      { UINT32_C(3027406377), UINT32_C( 914501930), UINT32_C( 950860814), UINT32_C(3381704700) } },
    { { UINT32_C( 262693281), UINT32_C(1710175804), UINT32_C(4011418053), UINT32_C(2703596434) },
      { UINT32_C(2480525719), UINT32_C(2270980488), UINT32_C(3214448683), UINT32_C(3222944286) },
       INT32_C(           3),
      { UINT32_C(2703596434), UINT32_C(2480525719), UINT32_C(2270980488), UINT32_C(3214448683) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint32x4_t a = simde_vld1q_u32(test_vec[i].a);
    simde_uint32x4_t b = simde_vld1q_u32(test_vec[i].b);
    int n = test_vec[i].n;
    simde_uint32x4_t r;
    switch(n) {
      case 0: r = simde_vextq_u32(a, b, 0); break;
      case 1: r = simde_vextq_u32(a, b, 1); break;
      case 2: r = simde_vextq_u32(a, b, 2); break;
      case 3: r = simde_vextq_u32(a, b, 3); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }

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

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 2, 3, 0, 1, 2, 3 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_uint32x4_t a = simde_test_arm_neon_random_u32x4();
    simde_uint32x4_t b = simde_test_arm_neon_random_u32x4();
    simde_uint32x4_t r = simde_vextq_u32(a, b, lanes[i]);

    simde_test_arm_neon_write_u32x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u32x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lanes[i], 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_vextq_u64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint64_t a[2];
    uint64_t b[2];
    int n;
    uint64_t r[2];
  } test_vec[] = {
    { { UINT64_C( 7730985752149231055), UINT64_C(16691050437685090889) },
      { UINT64_C(15296917467191559588), UINT64_C( 4953153054590983161) },
       INT32_C(           0),
      { UINT64_C( 7730985752149231055), UINT64_C(16691050437685090889) } },
    { { UINT64_C( 8585916073411621671), UINT64_C(12195681843175063656) },
      { UINT64_C( 3873588522413173385), UINT64_C( 1501322571122461211) },
       INT32_C(           1),
      { UINT64_C(12195681843175063656), UINT64_C( 3873588522413173385) } },
    { { UINT64_C(10348416691789093623), UINT64_C(  731032852088995190) },
      { UINT64_C( 8665691342820056273), UINT64_C(  397124965935696258) },
       INT32_C(           0),
      { UINT64_C(10348416691789093623), UINT64_C(  731032852088995190) } },
    { { UINT64_C(13794743674936644281), UINT64_C( 5696877048505194371) },
      { UINT64_C( 4670688828940093180), UINT64_C( 8357046737594997736) },
       INT32_C(           1),
      { UINT64_C( 5696877048505194371), UINT64_C( 4670688828940093180) } },
    { { UINT64_C( 7965675779152618627), UINT64_C( 2443345895848396059) },
      { UINT64_C(14593998027727979657), UINT64_C(17029159575628035878) },
       INT32_C(           0),
      { UINT64_C( 7965675779152618627), UINT64_C( 2443345895848396059) } },
    { { UINT64_C( 9599215256693417951), UINT64_C(13136443954186594824) },
      { UINT64_C( 4249011095164799050), UINT64_C( 5841571628204144572) },
       INT32_C(           1),
      { UINT64_C(13136443954186594824), UINT64_C( 4249011095164799050) } },
    { { UINT64_C( 1442649469284436245), UINT64_C( 8493665932999271676) },
      { UINT64_C( 2280960384311680345), UINT64_C( 5049754754406990417) },
       INT32_C(           0),
      { UINT64_C( 1442649469284436245), UINT64_C( 8493665932999271676) } },
    { { UINT64_C( 9024875554142563870), UINT64_C( 7678503297709670640) },
      { UINT64_C( 2081928341414687075), UINT64_C(11220986191717279809) },
       INT32_C(           1),
      { UINT64_C( 7678503297709670640), UINT64_C( 2081928341414687075) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint64x2_t a = simde_vld1q_u64(test_vec[i].a);
    simde_uint64x2_t b = simde_vld1q_u64(test_vec[i].b);
    int n = test_vec[i].n;
    simde_uint64x2_t r;
    switch(n) {
      case 0: r = simde_vextq_u64(a, b, 0); break;
      case 1: r = simde_vextq_u64(a, b, 1); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }
    simde_test_arm_neon_assert_equal_u64x2(r, simde_vld1q_u64(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);
  const int lanes[] = { 0, 1, 0, 1, 0, 1, 0, 1 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_uint64x2_t a = simde_test_arm_neon_random_u64x2();
    simde_uint64x2_t b = simde_test_arm_neon_random_u64x2();
    simde_uint64x2_t r = simde_vextq_u64(a, b, lanes[i]);

    simde_test_arm_neon_write_u64x2(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u64x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lanes[i], 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_vext_p8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    simde_poly8_t a[8];
    simde_poly8_t b[8];
    int n;
    simde_poly8_t r[8];
  } test_vec[] = {
    { { SIMDE_POLY8_C( 41), SIMDE_POLY8_C(252), SIMDE_POLY8_C( 40), SIMDE_POLY8_C( 64), SIMDE_POLY8_C(135), SIMDE_POLY8_C(135), SIMDE_POLY8_C(244), SIMDE_POLY8_C(115) },
      { SIMDE_POLY8_C(156), SIMDE_POLY8_C(144), SIMDE_POLY8_C( 83), SIMDE_POLY8_C(200), SIMDE_POLY8_C(190), SIMDE_POLY8_C( 18), SIMDE_POLY8_C(166), SIMDE_POLY8_C(155) },
       INT32_C(           0),
      { SIMDE_POLY8_C( 41), SIMDE_POLY8_C(252), SIMDE_POLY8_C( 40), SIMDE_POLY8_C( 64), SIMDE_POLY8_C(135), SIMDE_POLY8_C(135), SIMDE_POLY8_C(244), SIMDE_POLY8_C(115) } },
    { { SIMDE_POLY8_C(  9), SIMDE_POLY8_C(208), SIMDE_POLY8_C(167), SIMDE_POLY8_C( 64), SIMDE_POLY8_C(179), SIMDE_POLY8_C( 73), SIMDE_POLY8_C(177), SIMDE_POLY8_C(189) },
      { SIMDE_POLY8_C(152), SIMDE_POLY8_C( 56), SIMDE_POLY8_C(227), SIMDE_POLY8_C(221), SIMDE_POLY8_C(232), SIMDE_POLY8_C(138), SIMDE_POLY8_C(102), SIMDE_POLY8_C( 17) },
       INT32_C(           1),
      { SIMDE_POLY8_C(208), SIMDE_POLY8_C(167), SIMDE_POLY8_C( 64), SIMDE_POLY8_C(179), SIMDE_POLY8_C( 73), SIMDE_POLY8_C(177), SIMDE_POLY8_C(189), SIMDE_POLY8_C(152) } },
    { { SIMDE_POLY8_C(135), SIMDE_POLY8_C(142), SIMDE_POLY8_C( 81), SIMDE_POLY8_C( 14), SIMDE_POLY8_C( 21), SIMDE_POLY8_C( 70), SIMDE_POLY8_C(129), SIMDE_POLY8_C(177) },
      { SIMDE_POLY8_C(214), SIMDE_POLY8_C(212), SIMDE_POLY8_C(122), SIMDE_POLY8_C(148), SIMDE_POLY8_C(230), SIMDE_POLY8_C( 32), SIMDE_POLY8_C( 47), SIMDE_POLY8_C(239) },
       INT32_C(           2),
      { SIMDE_POLY8_C( 81), SIMDE_POLY8_C( 14), SIMDE_POLY8_C( 21), SIMDE_POLY8_C( 70), SIMDE_POLY8_C(129), SIMDE_POLY8_C(177), SIMDE_POLY8_C(214), SIMDE_POLY8_C(212) } },
    { { SIMDE_POLY8_C(241), SIMDE_POLY8_C(215), SIMDE_POLY8_C( 48), SIMDE_POLY8_C(164), SIMDE_POLY8_C( 32), SIMDE_POLY8_C(225), SIMDE_POLY8_C( 98), SIMDE_POLY8_C(184) },
      { SIMDE_POLY8_C( 25), SIMDE_POLY8_C( 69), SIMDE_POLY8_C(149), SIMDE_POLY8_C(  1), SIMDE_POLY8_C(208), SIMDE_POLY8_C(251), SIMDE_POLY8_C( 18), SIMDE_POLY8_C( 87) },
       INT32_C(           3),
      { SIMDE_POLY8_C(164), SIMDE_POLY8_C( 32), SIMDE_POLY8_C(225), SIMDE_POLY8_C( 98), SIMDE_POLY8_C(184), SIMDE_POLY8_C( 25), SIMDE_POLY8_C( 69), SIMDE_POLY8_C(149) } },
    { { SIMDE_POLY8_C(137), SIMDE_POLY8_C(100), SIMDE_POLY8_C(101), SIMDE_POLY8_C(159), SIMDE_POLY8_C(170), SIMDE_POLY8_C(231), SIMDE_POLY8_C( 80), SIMDE_POLY8_C(128) },
      { SIMDE_POLY8_C(187), SIMDE_POLY8_C(202), SIMDE_POLY8_C( 21), SIMDE_POLY8_C(162), SIMDE_POLY8_C(235), SIMDE_POLY8_C( 68), SIMDE_POLY8_C(145), SIMDE_POLY8_C(220) },
       INT32_C(           4),
      { SIMDE_POLY8_C(170), SIMDE_POLY8_C(231), SIMDE_POLY8_C( 80), SIMDE_POLY8_C(128), SIMDE_POLY8_C(187), SIMDE_POLY8_C(202), SIMDE_POLY8_C( 21), SIMDE_POLY8_C(162) } },
    { { SIMDE_POLY8_C( 27), SIMDE_POLY8_C(193), SIMDE_POLY8_C(128), SIMDE_POLY8_C( 60), SIMDE_POLY8_C(163), SIMDE_POLY8_C(226), SIMDE_POLY8_C(244), SIMDE_POLY8_C(188) },
      { SIMDE_POLY8_C( 40), SIMDE_POLY8_C(138), SIMDE_POLY8_C(190), SIMDE_POLY8_C(248), SIMDE_POLY8_C(133), SIMDE_POLY8_C(208), SIMDE_POLY8_C( 79), SIMDE_POLY8_C( 15) },
       INT32_C(           5),
      { SIMDE_POLY8_C(226), SIMDE_POLY8_C(244), SIMDE_POLY8_C(188), SIMDE_POLY8_C( 40), SIMDE_POLY8_C(138), SIMDE_POLY8_C(190), SIMDE_POLY8_C(248), SIMDE_POLY8_C(133) } },
    { { SIMDE_POLY8_C( 52), SIMDE_POLY8_C(180), SIMDE_POLY8_C(174), SIMDE_POLY8_C(222), SIMDE_POLY8_C(155), SIMDE_POLY8_C(254), SIMDE_POLY8_C( 95), SIMDE_POLY8_C( 87) },
      { SIMDE_POLY8_C(201), SIMDE_POLY8_C(116), SIMDE_POLY8_C(249), SIMDE_POLY8_C(180), SIMDE_POLY8_C(184), SIMDE_POLY8_C(138), SIMDE_POLY8_C(144), SIMDE_POLY8_C(212) },
       INT32_C(           6),
      { SIMDE_POLY8_C( 95), SIMDE_POLY8_C( 87), SIMDE_POLY8_C(201), SIMDE_POLY8_C(116), SIMDE_POLY8_C(249), SIMDE_POLY8_C(180), SIMDE_POLY8_C(184), SIMDE_POLY8_C(138) } },
    { { SIMDE_POLY8_C( 76), SIMDE_POLY8_C( 16), SIMDE_POLY8_C( 16), SIMDE_POLY8_C(239), SIMDE_POLY8_C(243), SIMDE_POLY8_C(  4), SIMDE_POLY8_C(171), SIMDE_POLY8_C( 27) },
      { SIMDE_POLY8_C(142), SIMDE_POLY8_C(105), SIMDE_POLY8_C( 19), SIMDE_POLY8_C( 20), SIMDE_POLY8_C( 58), SIMDE_POLY8_C( 98), SIMDE_POLY8_C( 35), SIMDE_POLY8_C(110) },
       INT32_C(           7),
      { SIMDE_POLY8_C( 27), SIMDE_POLY8_C(142), SIMDE_POLY8_C(105), SIMDE_POLY8_C( 19), SIMDE_POLY8_C( 20), SIMDE_POLY8_C( 58), SIMDE_POLY8_C( 98), SIMDE_POLY8_C( 35) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_poly8x8_t a = simde_vld1_p8(test_vec[i].a);
    simde_poly8x8_t b = simde_vld1_p8(test_vec[i].b);
    int n = test_vec[i].n;
    simde_poly8x8_t r;
    SIMDE_CONSTIFY_8_(simde_vext_p8, r, (HEDLEY_UNREACHABLE(), a), n, a, b);

    simde_test_arm_neon_assert_equal_p8x8(r, simde_vld1_p8(test_vec[i].r));
  }

  return 0;

#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_poly8x8_t a = simde_test_arm_neon_random_p8x8();
    simde_poly8x8_t b = simde_test_arm_neon_random_p8x8();
    simde_int32_t n = simde_test_codegen_random_i32();
    simde_poly8x8_t r = simde_vext_p8(a, b, n);

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

static int
test_simde_vext_p16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    simde_poly16_t a[4];
    simde_poly16_t b[4];
    int n;
    simde_poly16_t r[4];
  } test_vec[] = {
    { { SIMDE_POLY16_C(16781), SIMDE_POLY16_C(   83), SIMDE_POLY16_C(49358), SIMDE_POLY16_C(43895) },
      { SIMDE_POLY16_C(63669), SIMDE_POLY16_C(33927), SIMDE_POLY16_C(10175), SIMDE_POLY16_C(15472) },
       INT32_C(           0),
      { SIMDE_POLY16_C(16781), SIMDE_POLY16_C(   83), SIMDE_POLY16_C(49358), SIMDE_POLY16_C(43895) } },
    { { SIMDE_POLY16_C(10362), SIMDE_POLY16_C(59736), SIMDE_POLY16_C(10921), SIMDE_POLY16_C(40640) },
      { SIMDE_POLY16_C(39613), SIMDE_POLY16_C(56230), SIMDE_POLY16_C(57753), SIMDE_POLY16_C( 9976) },
       INT32_C(           1),
      { SIMDE_POLY16_C(59736), SIMDE_POLY16_C(10921), SIMDE_POLY16_C(40640), SIMDE_POLY16_C(39613) } },
    { { SIMDE_POLY16_C(19490), SIMDE_POLY16_C(61734), SIMDE_POLY16_C(40204), SIMDE_POLY16_C(49564) },
      { SIMDE_POLY16_C( 9109), SIMDE_POLY16_C(21829), SIMDE_POLY16_C(46411), SIMDE_POLY16_C(50577) },
       INT32_C(           2),
      { SIMDE_POLY16_C(40204), SIMDE_POLY16_C(49564), SIMDE_POLY16_C( 9109), SIMDE_POLY16_C(21829) } },
    { { SIMDE_POLY16_C(59869), SIMDE_POLY16_C(34478), SIMDE_POLY16_C(28180), SIMDE_POLY16_C(53540) },
      { SIMDE_POLY16_C(51721), SIMDE_POLY16_C(41644), SIMDE_POLY16_C(42411), SIMDE_POLY16_C(52936) },
       INT32_C(           3),
      { SIMDE_POLY16_C(53540), SIMDE_POLY16_C(51721), SIMDE_POLY16_C(41644), SIMDE_POLY16_C(42411) } },
    { { SIMDE_POLY16_C(61425), SIMDE_POLY16_C(64959), SIMDE_POLY16_C(23436), SIMDE_POLY16_C( 8894) },
      { SIMDE_POLY16_C(  894), SIMDE_POLY16_C(51575), SIMDE_POLY16_C( 2233), SIMDE_POLY16_C(38542) },
       INT32_C(           0),
      { SIMDE_POLY16_C(61425), SIMDE_POLY16_C(64959), SIMDE_POLY16_C(23436), SIMDE_POLY16_C( 8894) } },
    { { SIMDE_POLY16_C(15601), SIMDE_POLY16_C( 1309), SIMDE_POLY16_C(16811), SIMDE_POLY16_C(46294) },
      { SIMDE_POLY16_C(33548), SIMDE_POLY16_C(46934), SIMDE_POLY16_C( 7720), SIMDE_POLY16_C( 6533) },
       INT32_C(           1),
      { SIMDE_POLY16_C( 1309), SIMDE_POLY16_C(16811), SIMDE_POLY16_C(46294), SIMDE_POLY16_C(33548) } },
    { { SIMDE_POLY16_C(17421), SIMDE_POLY16_C(39446), SIMDE_POLY16_C(54431), SIMDE_POLY16_C( 7868) },
      { SIMDE_POLY16_C(13271), SIMDE_POLY16_C(37095), SIMDE_POLY16_C(30267), SIMDE_POLY16_C(11303) },
       INT32_C(           2),
      { SIMDE_POLY16_C(54431), SIMDE_POLY16_C( 7868), SIMDE_POLY16_C(13271), SIMDE_POLY16_C(37095) } },
    { { SIMDE_POLY16_C(17586), SIMDE_POLY16_C(23858), SIMDE_POLY16_C( 2181), SIMDE_POLY16_C(37137) },
      { SIMDE_POLY16_C(26507), SIMDE_POLY16_C(45897), SIMDE_POLY16_C(52870), SIMDE_POLY16_C(37836) },
       INT32_C(           3),
      { SIMDE_POLY16_C(37137), SIMDE_POLY16_C(26507), SIMDE_POLY16_C(45897), SIMDE_POLY16_C(52870) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_poly16x4_t a = simde_vld1_p16(test_vec[i].a);
    simde_poly16x4_t b = simde_vld1_p16(test_vec[i].b);
    int n = test_vec[i].n;
    simde_poly16x4_t r;
    SIMDE_CONSTIFY_4_(simde_vext_p16, r, (HEDLEY_UNREACHABLE(), a), n, a, b);
    simde_test_arm_neon_assert_equal_p16x4(r, simde_vld1_p16(test_vec[i].r));
  }

  return 0;

#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_poly16x4_t a = simde_test_arm_neon_random_p16x4();
    simde_poly16x4_t b = simde_test_arm_neon_random_p16x4();
    simde_int32_t n = simde_test_codegen_random_i32();
    simde_poly16x4_t r = simde_vext_p16(a, b, n);

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

static int
test_simde_vext_p64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    simde_poly64_t a[1];
    simde_poly64_t b[1];
    simde_poly64_t r[1];
  } test_vec[] = {
    { { SIMDE_POLY64_C( 4775218924999393801) },
      { SIMDE_POLY64_C(14341243545373652668) },
      { SIMDE_POLY64_C( 4775218924999393801) } },
    { { SIMDE_POLY64_C( 9139095911556337710) },
      { SIMDE_POLY64_C( 1794718599694819428) },
      { SIMDE_POLY64_C( 9139095911556337710) } },
    { { SIMDE_POLY64_C(17254207385035945953) },
      { SIMDE_POLY64_C( 6000040611349516152) },
      { SIMDE_POLY64_C(17254207385035945953) } },
    { { SIMDE_POLY64_C(14523168050340220606) },
      { SIMDE_POLY64_C( 2697498136351876169) },
      { SIMDE_POLY64_C(14523168050340220606) } },
    { { SIMDE_POLY64_C( 2867607344887786920) },
      { SIMDE_POLY64_C( 6706397092927255193) },
      { SIMDE_POLY64_C( 2867607344887786920) } },
    { { SIMDE_POLY64_C(15556831202562008502) },
      { SIMDE_POLY64_C( 9620707902598573083) },
      { SIMDE_POLY64_C(15556831202562008502) } },
    { { SIMDE_POLY64_C( 4386835494242146571) },
      { SIMDE_POLY64_C( 2547361106271831389) },
      { SIMDE_POLY64_C( 4386835494242146571) } },
    { { SIMDE_POLY64_C(15516627759135639025) },
      { SIMDE_POLY64_C( 3310630758589564047) },
      { SIMDE_POLY64_C(15516627759135639025) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_poly64x1_t a = simde_vld1_p64(test_vec[i].a);
    simde_poly64x1_t b = simde_vld1_p64(test_vec[i].b);
    simde_poly64x1_t r = simde_vext_p64(a, b, 0);
    simde_test_arm_neon_assert_equal_p64x1(r, simde_vld1_p64(test_vec[i].r));
  }

  return 0;

#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_poly64x1_t a = simde_test_arm_neon_random_p64x1();
    simde_poly64x1_t b = simde_test_arm_neon_random_p64x1();
    simde_poly64x1_t r = simde_vext_p64(a, b);

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

static int
test_simde_vextq_p8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    simde_poly8_t a[16];
    simde_poly8_t b[16];
    int n;
    simde_poly8_t r[16];
  } test_vec[] = {
    { { SIMDE_POLY8_C(236), SIMDE_POLY8_C( 12), SIMDE_POLY8_C(220), SIMDE_POLY8_C( 76), SIMDE_POLY8_C(149), SIMDE_POLY8_C(102), SIMDE_POLY8_C(190), SIMDE_POLY8_C(154),
        SIMDE_POLY8_C(190), SIMDE_POLY8_C( 97), SIMDE_POLY8_C( 26), SIMDE_POLY8_C(  0), SIMDE_POLY8_C(104), SIMDE_POLY8_C(  4), SIMDE_POLY8_C(242), SIMDE_POLY8_C( 16) },
      { SIMDE_POLY8_C( 85), SIMDE_POLY8_C(127), SIMDE_POLY8_C(245), SIMDE_POLY8_C( 30), SIMDE_POLY8_C(177), SIMDE_POLY8_C(132), SIMDE_POLY8_C( 67), SIMDE_POLY8_C(107),
        SIMDE_POLY8_C(115), SIMDE_POLY8_C( 46), SIMDE_POLY8_C(225), SIMDE_POLY8_C( 35), SIMDE_POLY8_C( 67), SIMDE_POLY8_C( 16), SIMDE_POLY8_C( 83), SIMDE_POLY8_C( 47) },
       INT32_C(           0),
      { SIMDE_POLY8_C(236), SIMDE_POLY8_C( 12), SIMDE_POLY8_C(220), SIMDE_POLY8_C( 76), SIMDE_POLY8_C(149), SIMDE_POLY8_C(102), SIMDE_POLY8_C(190), SIMDE_POLY8_C(154),
        SIMDE_POLY8_C(190), SIMDE_POLY8_C( 97), SIMDE_POLY8_C( 26), SIMDE_POLY8_C(  0), SIMDE_POLY8_C(104), SIMDE_POLY8_C(  4), SIMDE_POLY8_C(242), SIMDE_POLY8_C( 16) } },
    { { SIMDE_POLY8_C( 28), SIMDE_POLY8_C( 47), SIMDE_POLY8_C(124), SIMDE_POLY8_C(177), SIMDE_POLY8_C(149), SIMDE_POLY8_C( 58), SIMDE_POLY8_C( 76), SIMDE_POLY8_C( 83),
        SIMDE_POLY8_C(156), SIMDE_POLY8_C(102), SIMDE_POLY8_C( 84), SIMDE_POLY8_C(  4), SIMDE_POLY8_C(106), SIMDE_POLY8_C( 70), SIMDE_POLY8_C( 20), SIMDE_POLY8_C(191) },
      { SIMDE_POLY8_C(197), SIMDE_POLY8_C(  9), SIMDE_POLY8_C(221), SIMDE_POLY8_C(118), SIMDE_POLY8_C(141), SIMDE_POLY8_C( 33), SIMDE_POLY8_C(225), SIMDE_POLY8_C(  0),
        SIMDE_POLY8_C( 79), SIMDE_POLY8_C(194), SIMDE_POLY8_C( 35), SIMDE_POLY8_C(147), SIMDE_POLY8_C(210), SIMDE_POLY8_C(118), SIMDE_POLY8_C(194), SIMDE_POLY8_C(239) },
       INT32_C(           2),
      { SIMDE_POLY8_C(124), SIMDE_POLY8_C(177), SIMDE_POLY8_C(149), SIMDE_POLY8_C( 58), SIMDE_POLY8_C( 76), SIMDE_POLY8_C( 83), SIMDE_POLY8_C(156), SIMDE_POLY8_C(102),
        SIMDE_POLY8_C( 84), SIMDE_POLY8_C(  4), SIMDE_POLY8_C(106), SIMDE_POLY8_C( 70), SIMDE_POLY8_C( 20), SIMDE_POLY8_C(191), SIMDE_POLY8_C(197), SIMDE_POLY8_C(  9) } },
    { { SIMDE_POLY8_C(166), SIMDE_POLY8_C( 62), SIMDE_POLY8_C(160), SIMDE_POLY8_C( 59), SIMDE_POLY8_C(121), SIMDE_POLY8_C(236), SIMDE_POLY8_C(143), SIMDE_POLY8_C( 21),
        SIMDE_POLY8_C( 82), SIMDE_POLY8_C(227), SIMDE_POLY8_C( 25), SIMDE_POLY8_C(188), SIMDE_POLY8_C( 41), SIMDE_POLY8_C( 45), SIMDE_POLY8_C(123), SIMDE_POLY8_C(238) },
      { SIMDE_POLY8_C( 54), SIMDE_POLY8_C( 89), SIMDE_POLY8_C(100), SIMDE_POLY8_C(196), SIMDE_POLY8_C(122), SIMDE_POLY8_C( 69), SIMDE_POLY8_C(196), SIMDE_POLY8_C(201),
        SIMDE_POLY8_C(  7), SIMDE_POLY8_C(232), SIMDE_POLY8_C( 92), SIMDE_POLY8_C(218), SIMDE_POLY8_C( 94), SIMDE_POLY8_C( 31), SIMDE_POLY8_C(201), SIMDE_POLY8_C(  4) },
       INT32_C(           4),
      { SIMDE_POLY8_C(121), SIMDE_POLY8_C(236), SIMDE_POLY8_C(143), SIMDE_POLY8_C( 21), SIMDE_POLY8_C( 82), SIMDE_POLY8_C(227), SIMDE_POLY8_C( 25), SIMDE_POLY8_C(188),
        SIMDE_POLY8_C( 41), SIMDE_POLY8_C( 45), SIMDE_POLY8_C(123), SIMDE_POLY8_C(238), SIMDE_POLY8_C( 54), SIMDE_POLY8_C( 89), SIMDE_POLY8_C(100), SIMDE_POLY8_C(196) } },
    { { SIMDE_POLY8_C( 93), SIMDE_POLY8_C(105), SIMDE_POLY8_C( 64), SIMDE_POLY8_C(214), SIMDE_POLY8_C( 86), SIMDE_POLY8_C(207), SIMDE_POLY8_C(235), SIMDE_POLY8_C(168),
        SIMDE_POLY8_C(178), SIMDE_POLY8_C(  4), SIMDE_POLY8_C(101), SIMDE_POLY8_C(219), SIMDE_POLY8_C( 49), SIMDE_POLY8_C(224), SIMDE_POLY8_C(201), SIMDE_POLY8_C(104) },
      { SIMDE_POLY8_C( 57), SIMDE_POLY8_C( 45), SIMDE_POLY8_C( 44), SIMDE_POLY8_C(179), SIMDE_POLY8_C(114), SIMDE_POLY8_C(240), SIMDE_POLY8_C(125), SIMDE_POLY8_C(121),
        SIMDE_POLY8_C(216), SIMDE_POLY8_C(217), SIMDE_POLY8_C( 83), SIMDE_POLY8_C( 55), SIMDE_POLY8_C(248), SIMDE_POLY8_C( 28), SIMDE_POLY8_C( 59), SIMDE_POLY8_C( 86) },
       INT32_C(           6),
      { SIMDE_POLY8_C(235), SIMDE_POLY8_C(168), SIMDE_POLY8_C(178), SIMDE_POLY8_C(  4), SIMDE_POLY8_C(101), SIMDE_POLY8_C(219), SIMDE_POLY8_C( 49), SIMDE_POLY8_C(224),
        SIMDE_POLY8_C(201), SIMDE_POLY8_C(104), SIMDE_POLY8_C( 57), SIMDE_POLY8_C( 45), SIMDE_POLY8_C( 44), SIMDE_POLY8_C(179), SIMDE_POLY8_C(114), SIMDE_POLY8_C(240) } },
    { { SIMDE_POLY8_C(134), SIMDE_POLY8_C(123), SIMDE_POLY8_C( 44), SIMDE_POLY8_C(220), SIMDE_POLY8_C( 74), SIMDE_POLY8_C( 24), SIMDE_POLY8_C(132), SIMDE_POLY8_C(252),
        SIMDE_POLY8_C( 28), SIMDE_POLY8_C(233), SIMDE_POLY8_C(215), SIMDE_POLY8_C( 78), SIMDE_POLY8_C(202), SIMDE_POLY8_C(160), SIMDE_POLY8_C(182), SIMDE_POLY8_C(  3) },
      { SIMDE_POLY8_C(205), SIMDE_POLY8_C(226), SIMDE_POLY8_C(183), SIMDE_POLY8_C( 63), SIMDE_POLY8_C(210), SIMDE_POLY8_C( 52), SIMDE_POLY8_C(185), SIMDE_POLY8_C(171),
        SIMDE_POLY8_C( 13), SIMDE_POLY8_C( 12), SIMDE_POLY8_C(226), SIMDE_POLY8_C(  6), SIMDE_POLY8_C( 41), SIMDE_POLY8_C( 29), SIMDE_POLY8_C( 92), SIMDE_POLY8_C(175) },
       INT32_C(           8),
      { SIMDE_POLY8_C( 28), SIMDE_POLY8_C(233), SIMDE_POLY8_C(215), SIMDE_POLY8_C( 78), SIMDE_POLY8_C(202), SIMDE_POLY8_C(160), SIMDE_POLY8_C(182), SIMDE_POLY8_C(  3),
        SIMDE_POLY8_C(205), SIMDE_POLY8_C(226), SIMDE_POLY8_C(183), SIMDE_POLY8_C( 63), SIMDE_POLY8_C(210), SIMDE_POLY8_C( 52), SIMDE_POLY8_C(185), SIMDE_POLY8_C(171) } },
    { { SIMDE_POLY8_C(153), SIMDE_POLY8_C(136), SIMDE_POLY8_C(139), SIMDE_POLY8_C(227), SIMDE_POLY8_C(160), SIMDE_POLY8_C( 15), SIMDE_POLY8_C(224), SIMDE_POLY8_C(189),
        SIMDE_POLY8_C(249), SIMDE_POLY8_C(183), SIMDE_POLY8_C( 11), SIMDE_POLY8_C(195), SIMDE_POLY8_C( 88), SIMDE_POLY8_C(193), SIMDE_POLY8_C(198), SIMDE_POLY8_C( 37) },
      { SIMDE_POLY8_C(163), SIMDE_POLY8_C(125), SIMDE_POLY8_C(101), SIMDE_POLY8_C(117), SIMDE_POLY8_C(177), SIMDE_POLY8_C( 30), SIMDE_POLY8_C( 32), SIMDE_POLY8_C(191),
        SIMDE_POLY8_C( 42), SIMDE_POLY8_C(  2), SIMDE_POLY8_C(197), SIMDE_POLY8_C( 83), SIMDE_POLY8_C( 32), SIMDE_POLY8_C( 33), SIMDE_POLY8_C(  2), SIMDE_POLY8_C(185) },
       INT32_C(          10),
      { SIMDE_POLY8_C( 11), SIMDE_POLY8_C(195), SIMDE_POLY8_C( 88), SIMDE_POLY8_C(193), SIMDE_POLY8_C(198), SIMDE_POLY8_C( 37), SIMDE_POLY8_C(163), SIMDE_POLY8_C(125),
        SIMDE_POLY8_C(101), SIMDE_POLY8_C(117), SIMDE_POLY8_C(177), SIMDE_POLY8_C( 30), SIMDE_POLY8_C( 32), SIMDE_POLY8_C(191), SIMDE_POLY8_C( 42), SIMDE_POLY8_C(  2) } },
    { { SIMDE_POLY8_C(169), SIMDE_POLY8_C(141), SIMDE_POLY8_C(156), SIMDE_POLY8_C( 74), SIMDE_POLY8_C(157), SIMDE_POLY8_C(124), SIMDE_POLY8_C(  7), SIMDE_POLY8_C(150),
        SIMDE_POLY8_C( 52), SIMDE_POLY8_C( 18), SIMDE_POLY8_C( 89), SIMDE_POLY8_C(140), SIMDE_POLY8_C(211), SIMDE_POLY8_C( 31), SIMDE_POLY8_C(177), SIMDE_POLY8_C(118) },
      { SIMDE_POLY8_C(157), SIMDE_POLY8_C( 22), SIMDE_POLY8_C(235), SIMDE_POLY8_C( 78), SIMDE_POLY8_C( 52), SIMDE_POLY8_C( 12), SIMDE_POLY8_C( 13), SIMDE_POLY8_C( 95),
        SIMDE_POLY8_C( 14), SIMDE_POLY8_C(210), SIMDE_POLY8_C(178), SIMDE_POLY8_C( 46), SIMDE_POLY8_C(243), SIMDE_POLY8_C(181), SIMDE_POLY8_C(231), SIMDE_POLY8_C(157) },
       INT32_C(          12),
      { SIMDE_POLY8_C(211), SIMDE_POLY8_C( 31), SIMDE_POLY8_C(177), SIMDE_POLY8_C(118), SIMDE_POLY8_C(157), SIMDE_POLY8_C( 22), SIMDE_POLY8_C(235), SIMDE_POLY8_C( 78),
        SIMDE_POLY8_C( 52), SIMDE_POLY8_C( 12), SIMDE_POLY8_C( 13), SIMDE_POLY8_C( 95), SIMDE_POLY8_C( 14), SIMDE_POLY8_C(210), SIMDE_POLY8_C(178), SIMDE_POLY8_C( 46) } },
    { { SIMDE_POLY8_C( 66), SIMDE_POLY8_C(132), SIMDE_POLY8_C(231), SIMDE_POLY8_C(223), SIMDE_POLY8_C(  0), SIMDE_POLY8_C(238), SIMDE_POLY8_C(117), SIMDE_POLY8_C( 52),
        SIMDE_POLY8_C(  0), SIMDE_POLY8_C(206), SIMDE_POLY8_C(192), SIMDE_POLY8_C(211), SIMDE_POLY8_C(238), SIMDE_POLY8_C(114), SIMDE_POLY8_C( 73), SIMDE_POLY8_C(139) },
      { SIMDE_POLY8_C(136), SIMDE_POLY8_C( 52), SIMDE_POLY8_C(217), SIMDE_POLY8_C(189), SIMDE_POLY8_C( 64), SIMDE_POLY8_C(231), SIMDE_POLY8_C( 28), SIMDE_POLY8_C( 79),
        SIMDE_POLY8_C(185), SIMDE_POLY8_C(206), SIMDE_POLY8_C(125), SIMDE_POLY8_C(173), SIMDE_POLY8_C(131), SIMDE_POLY8_C(101), SIMDE_POLY8_C( 74), SIMDE_POLY8_C(198) },
       INT32_C(          14),
      { SIMDE_POLY8_C( 73), SIMDE_POLY8_C(139), SIMDE_POLY8_C(136), SIMDE_POLY8_C( 52), SIMDE_POLY8_C(217), SIMDE_POLY8_C(189), SIMDE_POLY8_C( 64), SIMDE_POLY8_C(231),
        SIMDE_POLY8_C( 28), SIMDE_POLY8_C( 79), SIMDE_POLY8_C(185), SIMDE_POLY8_C(206), SIMDE_POLY8_C(125), SIMDE_POLY8_C(173), SIMDE_POLY8_C(131), SIMDE_POLY8_C(101) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_poly8x16_t a = simde_vld1q_p8(test_vec[i].a);
    simde_poly8x16_t b = simde_vld1q_p8(test_vec[i].b);
    int n = test_vec[i].n;
    simde_poly8x16_t r;
    switch(n) {
      case 0: r = simde_vextq_p8(a, b, 0); break;
      case 1: r = simde_vextq_p8(a, b, 1); break;
      case 2: r = simde_vextq_p8(a, b, 2); break;
      case 3: r = simde_vextq_p8(a, b, 3); break;
      case 4: r = simde_vextq_p8(a, b, 4); break;
      case 5: r = simde_vextq_p8(a, b, 5); break;
      case 6: r = simde_vextq_p8(a, b, 6); break;
      case 7: r = simde_vextq_p8(a, b, 7); break;
      case 8: r = simde_vextq_p8(a, b, 8); break;
      case 9: r = simde_vextq_p8(a, b, 9); break;
      case 10: r = simde_vextq_p8(a, b, 10); break;
      case 11: r = simde_vextq_p8(a, b, 11); break;
      case 12: r = simde_vextq_p8(a, b, 12); break;
      case 13: r = simde_vextq_p8(a, b, 13); break;
      case 14: r = simde_vextq_p8(a, b, 14); break;
      case 15: r = simde_vextq_p8(a, b, 15); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }

    simde_test_arm_neon_assert_equal_p8x16(r, simde_vld1q_p8(test_vec[i].r));
  }

  return 0;

#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_poly8x16_t a = simde_test_arm_neon_random_p8x16();
    simde_poly8x16_t b = simde_test_arm_neon_random_p8x16();
    simde_int32_t n = simde_test_codegen_random_i32();
    simde_poly8x16_t r = simde_vextq_p8(a, b, n);

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

static int
test_simde_vextq_p16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    simde_poly16_t a[8];
    simde_poly16_t b[8];
    int n;
    simde_poly16_t r[8];
  } test_vec[] = {
    { { SIMDE_POLY16_C(24754), SIMDE_POLY16_C(42838), SIMDE_POLY16_C(61167), SIMDE_POLY16_C(61004), SIMDE_POLY16_C(44235), SIMDE_POLY16_C(29361), SIMDE_POLY16_C(52240), SIMDE_POLY16_C(47002) },
      { SIMDE_POLY16_C(58649), SIMDE_POLY16_C(62180), SIMDE_POLY16_C(35996), SIMDE_POLY16_C(45949), SIMDE_POLY16_C(27671), SIMDE_POLY16_C(46444), SIMDE_POLY16_C(49652), SIMDE_POLY16_C(42653) },
       INT32_C(           0),
      { SIMDE_POLY16_C(24754), SIMDE_POLY16_C(42838), SIMDE_POLY16_C(61167), SIMDE_POLY16_C(61004), SIMDE_POLY16_C(44235), SIMDE_POLY16_C(29361), SIMDE_POLY16_C(52240), SIMDE_POLY16_C(47002) } },
    { { SIMDE_POLY16_C(62241), SIMDE_POLY16_C( 4173), SIMDE_POLY16_C(39393), SIMDE_POLY16_C(44543), SIMDE_POLY16_C(45125), SIMDE_POLY16_C(21791), SIMDE_POLY16_C(47740), SIMDE_POLY16_C(38413) },
      { SIMDE_POLY16_C(61855), SIMDE_POLY16_C(15496), SIMDE_POLY16_C( 1405), SIMDE_POLY16_C(38383), SIMDE_POLY16_C(23410), SIMDE_POLY16_C(26186), SIMDE_POLY16_C(59165), SIMDE_POLY16_C(15884) },
       INT32_C(           1),
      { SIMDE_POLY16_C( 4173), SIMDE_POLY16_C(39393), SIMDE_POLY16_C(44543), SIMDE_POLY16_C(45125), SIMDE_POLY16_C(21791), SIMDE_POLY16_C(47740), SIMDE_POLY16_C(38413), SIMDE_POLY16_C(61855) } },
    { { SIMDE_POLY16_C(23002), SIMDE_POLY16_C(48207), SIMDE_POLY16_C(20210), SIMDE_POLY16_C(14185), SIMDE_POLY16_C(35070), SIMDE_POLY16_C(31628), SIMDE_POLY16_C(39234), SIMDE_POLY16_C(57873) },
      { SIMDE_POLY16_C(39307), SIMDE_POLY16_C( 2078), SIMDE_POLY16_C( 3487), SIMDE_POLY16_C( 4509), SIMDE_POLY16_C(59241), SIMDE_POLY16_C(34423), SIMDE_POLY16_C(33742), SIMDE_POLY16_C(43460) },
       INT32_C(           2),
      { SIMDE_POLY16_C(20210), SIMDE_POLY16_C(14185), SIMDE_POLY16_C(35070), SIMDE_POLY16_C(31628), SIMDE_POLY16_C(39234), SIMDE_POLY16_C(57873), SIMDE_POLY16_C(39307), SIMDE_POLY16_C( 2078) } },
    { { SIMDE_POLY16_C( 5084), SIMDE_POLY16_C(52837), SIMDE_POLY16_C(52833), SIMDE_POLY16_C(24581), SIMDE_POLY16_C(37206), SIMDE_POLY16_C(39387), SIMDE_POLY16_C(60459), SIMDE_POLY16_C(46715) },
      { SIMDE_POLY16_C(39301), SIMDE_POLY16_C( 9406), SIMDE_POLY16_C(23718), SIMDE_POLY16_C( 3893), SIMDE_POLY16_C(44099), SIMDE_POLY16_C( 4757), SIMDE_POLY16_C(23087), SIMDE_POLY16_C( 3003) },
       INT32_C(           3),
      { SIMDE_POLY16_C(24581), SIMDE_POLY16_C(37206), SIMDE_POLY16_C(39387), SIMDE_POLY16_C(60459), SIMDE_POLY16_C(46715), SIMDE_POLY16_C(39301), SIMDE_POLY16_C( 9406), SIMDE_POLY16_C(23718) } },
    { { SIMDE_POLY16_C( 8301), SIMDE_POLY16_C(53209), SIMDE_POLY16_C(57070), SIMDE_POLY16_C(17455), SIMDE_POLY16_C( 2672), SIMDE_POLY16_C(39901), SIMDE_POLY16_C(22774), SIMDE_POLY16_C(31569) },
      { SIMDE_POLY16_C( 4081), SIMDE_POLY16_C(39072), SIMDE_POLY16_C(54635), SIMDE_POLY16_C(44967), SIMDE_POLY16_C(15746), SIMDE_POLY16_C(45505), SIMDE_POLY16_C(31895), SIMDE_POLY16_C( 1213) },
       INT32_C(           4),
      { SIMDE_POLY16_C( 2672), SIMDE_POLY16_C(39901), SIMDE_POLY16_C(22774), SIMDE_POLY16_C(31569), SIMDE_POLY16_C( 4081), SIMDE_POLY16_C(39072), SIMDE_POLY16_C(54635), SIMDE_POLY16_C(44967) } },
    { { SIMDE_POLY16_C(38556), SIMDE_POLY16_C(35539), SIMDE_POLY16_C(  629), SIMDE_POLY16_C(58830), SIMDE_POLY16_C(44044), SIMDE_POLY16_C(  640), SIMDE_POLY16_C(53508), SIMDE_POLY16_C(63102) },
      { SIMDE_POLY16_C( 7904), SIMDE_POLY16_C(19598), SIMDE_POLY16_C(13811), SIMDE_POLY16_C(30203), SIMDE_POLY16_C(48242), SIMDE_POLY16_C( 2343), SIMDE_POLY16_C(58424), SIMDE_POLY16_C(54286) },
       INT32_C(           5),
      { SIMDE_POLY16_C(  640), SIMDE_POLY16_C(53508), SIMDE_POLY16_C(63102), SIMDE_POLY16_C( 7904), SIMDE_POLY16_C(19598), SIMDE_POLY16_C(13811), SIMDE_POLY16_C(30203), SIMDE_POLY16_C(48242) } },
    { { SIMDE_POLY16_C(57722), SIMDE_POLY16_C(61278), SIMDE_POLY16_C(11492), SIMDE_POLY16_C(61652), SIMDE_POLY16_C(21720), SIMDE_POLY16_C(56819), SIMDE_POLY16_C(28965), SIMDE_POLY16_C( 1747) },
      { SIMDE_POLY16_C(24975), SIMDE_POLY16_C(33362), SIMDE_POLY16_C(19862), SIMDE_POLY16_C( 2552), SIMDE_POLY16_C( 7945), SIMDE_POLY16_C(16658), SIMDE_POLY16_C( 8195), SIMDE_POLY16_C(32021) },
       INT32_C(           6),
      { SIMDE_POLY16_C(28965), SIMDE_POLY16_C( 1747), SIMDE_POLY16_C(24975), SIMDE_POLY16_C(33362), SIMDE_POLY16_C(19862), SIMDE_POLY16_C( 2552), SIMDE_POLY16_C( 7945), SIMDE_POLY16_C(16658) } },
    { { SIMDE_POLY16_C(29442), SIMDE_POLY16_C(58989), SIMDE_POLY16_C(16799), SIMDE_POLY16_C(30934), SIMDE_POLY16_C(51606), SIMDE_POLY16_C(47957), SIMDE_POLY16_C(10298), SIMDE_POLY16_C(51649) },
      { SIMDE_POLY16_C( 5001), SIMDE_POLY16_C( 8012), SIMDE_POLY16_C(17504), SIMDE_POLY16_C(26920), SIMDE_POLY16_C(15203), SIMDE_POLY16_C(26282), SIMDE_POLY16_C(48987), SIMDE_POLY16_C(24035) },
       INT32_C(           7),
      { SIMDE_POLY16_C(51649), SIMDE_POLY16_C( 5001), SIMDE_POLY16_C( 8012), SIMDE_POLY16_C(17504), SIMDE_POLY16_C(26920), SIMDE_POLY16_C(15203), SIMDE_POLY16_C(26282), SIMDE_POLY16_C(48987) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_poly16x8_t a = simde_vld1q_p16(test_vec[i].a);
    simde_poly16x8_t b = simde_vld1q_p16(test_vec[i].b);
    int n = test_vec[i].n;
    simde_poly16x8_t r;
    switch(n) {
      case 0: r = simde_vextq_p16(a, b, 0); break;
      case 1: r = simde_vextq_p16(a, b, 1); break;
      case 2: r = simde_vextq_p16(a, b, 2); break;
      case 3: r = simde_vextq_p16(a, b, 3); break;
      case 4: r = simde_vextq_p16(a, b, 4); break;
      case 5: r = simde_vextq_p16(a, b, 5); break;
      case 6: r = simde_vextq_p16(a, b, 6); break;
      case 7: r = simde_vextq_p16(a, b, 7); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }
    simde_test_arm_neon_assert_equal_p16x8(r, simde_vld1q_p16(test_vec[i].r));
  }

  return 0;

#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_poly16x8_t a = simde_test_arm_neon_random_p16x8();
    simde_poly16x8_t b = simde_test_arm_neon_random_p16x8();
    simde_int32_t n = simde_test_codegen_random_i32();
    simde_poly16x8_t r = simde_vextq_p16(a, b, n);

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

static int
test_simde_vextq_p64 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    simde_poly64_t a[2];
    simde_poly64_t b[2];
    int n;
    simde_poly64_t r[2];
  } test_vec[] = {
    { { SIMDE_POLY64_C( 7730985752149231055), SIMDE_POLY64_C(16691050437685090889) },
      { SIMDE_POLY64_C(15296917467191559588), SIMDE_POLY64_C( 4953153054590983161) },
       INT32_C(           0),
      { SIMDE_POLY64_C( 7730985752149231055), SIMDE_POLY64_C(16691050437685090889) } },
    { { SIMDE_POLY64_C( 8585916073411621671), SIMDE_POLY64_C(12195681843175063656) },
      { SIMDE_POLY64_C( 3873588522413173385), SIMDE_POLY64_C( 1501322571122461211) },
       INT32_C(           1),
      { SIMDE_POLY64_C(12195681843175063656), SIMDE_POLY64_C( 3873588522413173385) } },
    { { SIMDE_POLY64_C(10348416691789093623), SIMDE_POLY64_C(  731032852088995190) },
      { SIMDE_POLY64_C( 8665691342820056273), SIMDE_POLY64_C(  397124965935696258) },
       INT32_C(           0),
      { SIMDE_POLY64_C(10348416691789093623), SIMDE_POLY64_C(  731032852088995190) } },
    { { SIMDE_POLY64_C(13794743674936644281), SIMDE_POLY64_C( 5696877048505194371) },
      { SIMDE_POLY64_C( 4670688828940093180), SIMDE_POLY64_C( 8357046737594997736) },
       INT32_C(           1),
      { SIMDE_POLY64_C( 5696877048505194371), SIMDE_POLY64_C( 4670688828940093180) } },
    { { SIMDE_POLY64_C( 7965675779152618627), SIMDE_POLY64_C( 2443345895848396059) },
      { SIMDE_POLY64_C(14593998027727979657), SIMDE_POLY64_C(17029159575628035878) },
       INT32_C(           0),
      { SIMDE_POLY64_C( 7965675779152618627), SIMDE_POLY64_C( 2443345895848396059) } },
    { { SIMDE_POLY64_C( 9599215256693417951), SIMDE_POLY64_C(13136443954186594824) },
      { SIMDE_POLY64_C( 4249011095164799050), SIMDE_POLY64_C( 5841571628204144572) },
       INT32_C(           1),
      { SIMDE_POLY64_C(13136443954186594824), SIMDE_POLY64_C( 4249011095164799050) } },
    { { SIMDE_POLY64_C( 1442649469284436245), SIMDE_POLY64_C( 8493665932999271676) },
      { SIMDE_POLY64_C( 2280960384311680345), SIMDE_POLY64_C( 5049754754406990417) },
       INT32_C(           0),
      { SIMDE_POLY64_C( 1442649469284436245), SIMDE_POLY64_C( 8493665932999271676) } },
    { { SIMDE_POLY64_C( 9024875554142563870), SIMDE_POLY64_C( 7678503297709670640) },
      { SIMDE_POLY64_C( 2081928341414687075), SIMDE_POLY64_C(11220986191717279809) },
       INT32_C(           1),
      { SIMDE_POLY64_C( 7678503297709670640), SIMDE_POLY64_C( 2081928341414687075) } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_poly64x2_t a = simde_vld1q_p64(test_vec[i].a);
    simde_poly64x2_t b = simde_vld1q_p64(test_vec[i].b);
    int n = test_vec[i].n;
    simde_poly64x2_t r;
    switch(n) {
      case 0: r = simde_vextq_p64(a, b, 0); break;
      case 1: r = simde_vextq_p64(a, b, 1); break;
      default: HEDLEY_UNREACHABLE(); r = a; break;
    }
    simde_test_arm_neon_assert_equal_p64x2(r, simde_vld1q_p64(test_vec[i].r));
  }

  return 0;

#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_poly64x2_t a = simde_test_arm_neon_random_p64x2();
    simde_poly64x2_t b = simde_test_arm_neon_random_p64x2();
    simde_int32_t n = simde_test_codegen_random_i32();
    simde_poly64x2_t r = simde_vextq_p64(a, b, n);

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

HEDLEY_DIAGNOSTIC_POP

SIMDE_TEST_FUNC_LIST_BEGIN
SIMDE_TEST_FUNC_LIST_ENTRY(vext_f16)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_f32)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_f64)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_s8)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_s16)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_s64)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_u8)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_u16)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_u32)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_u64)

SIMDE_TEST_FUNC_LIST_ENTRY(vextq_f16)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_f32)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_f64)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_s8)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_s16)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_s64)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_u8)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_u16)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_u32)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_u64)

SIMDE_TEST_FUNC_LIST_ENTRY(vext_p8)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_p16)
SIMDE_TEST_FUNC_LIST_ENTRY(vext_p64)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_p8)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_p16)
SIMDE_TEST_FUNC_LIST_ENTRY(vextq_p64)
SIMDE_TEST_FUNC_LIST_END

#include "test-neon-footer.h"