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

#include "test-neon.h"
#include "../../../simde/arm/neon/dot_lane.h"
#include "../../../simde/arm/neon/dup_n.h"

static int
test_simde_vdot_lane_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int32_t r_[2];
    int8_t a[8];
    int8_t b[8];
    const int lane;
    int32_t r[2];
  } test_vec[] = {
    { { -INT32_C(  1695142189),  INT32_C(   606253494) },
      { -INT8_C(   8),  INT8_C( 126), -INT8_C(  89), -INT8_C(   2),  INT8_C(  86),  INT8_C(  74),  INT8_C( 126),  INT8_C(  50) },
      { -INT8_C(  85), -INT8_C(  18), -INT8_C( 109),  INT8_C(  56),      INT8_MIN, -INT8_C( 104), -INT8_C(  65), -INT8_C(  22) },
       INT32_C(           0),
      { -INT32_C(  1695134188),  INT32_C(   606233918) } },
    { { -INT32_C(   475476306), -INT32_C(  1248166687) },
      { -INT8_C(  86), -INT8_C( 112),  INT8_C(  79),  INT8_C(  96),  INT8_C(  66),  INT8_C( 113), -INT8_C( 123),  INT8_C(  58) },
      { -INT8_C(  17),  INT8_C(  44),  INT8_C(  56),  INT8_C(  69),  INT8_C( 119), -INT8_C(  74),  INT8_C( 119),  INT8_C(  34) },
       INT32_C(           1),
      { -INT32_C(   475465587), -INT32_C(  1248179860) } },
    { {  INT32_C(   609880740),  INT32_C(  1359944354) },
      { -INT8_C(  24), -INT8_C(  73),  INT8_C(  52), -INT8_C(  54),  INT8_C(  51), -INT8_C(  50),      INT8_MAX, -INT8_C(  34) },
      {  INT8_C(  95), -INT8_C(  50),  INT8_C(  62), -INT8_C(  95),  INT8_C(  63), -INT8_C(  61), -INT8_C(  37),  INT8_C(  46) },
       INT32_C(           0),
      {  INT32_C(   609890464),  INT32_C(  1359962803) } },
    { {  INT32_C(  1735660528),  INT32_C(  1837755337) },
      { -INT8_C(  10), -INT8_C(  28), -INT8_C( 110), -INT8_C( 104), -INT8_C(   2), -INT8_C(  95), -INT8_C(  23), -INT8_C(  26) },
      {  INT8_C(  88),  INT8_C(  29), -INT8_C(  80), -INT8_C( 117), -INT8_C(  20),  INT8_C(  47),  INT8_C( 105),  INT8_C(  75) },
       INT32_C(           1),
      {  INT32_C(  1735640062),  INT32_C(  1837746547) } },
    { {  INT32_C(  1022142717),  INT32_C(  1533790059) },
      { -INT8_C(  38), -INT8_C(  33), -INT8_C(  62), -INT8_C(  93), -INT8_C(  54),  INT8_C(  76),  INT8_C(  16), -INT8_C(  64) },
      {  INT8_C(  48), -INT8_C(  94),  INT8_C(  89),  INT8_C(  46),  INT8_C(  67),  INT8_C(  66),  INT8_C(  20), -INT8_C( 101) },
       INT32_C(           0),
      {  INT32_C(  1022134199),  INT32_C(  1533778803) } },
    { {  INT32_C(  1277674848), -INT32_C(   224947980) },
      {  INT8_C(  56), -INT8_C( 125),  INT8_C(  46), -INT8_C(  92),  INT8_C(  74), -INT8_C( 103), -INT8_C(   1),  INT8_C(  36) },
      {  INT8_C( 120), -INT8_C(  62), -INT8_C(  57),  INT8_C(  67),  INT8_C(  14), -INT8_C(  41),  INT8_C(   3),  INT8_C(  62) },
       INT32_C(           1),
      {  INT32_C(  1277675191), -INT32_C(   224940492) } },
    { { -INT32_C(  1116971910), -INT32_C(    10911585) },
      {  INT8_C(  69),      INT8_MIN,  INT8_C(  75),  INT8_C(  58),  INT8_C(  16), -INT8_C(  30),  INT8_C(  44),  INT8_C(  73) },
      {  INT8_C( 101),  INT8_C(  90), -INT8_C(  19), -INT8_C(  81), -INT8_C(  12), -INT8_C(  20), -INT8_C(  45),  INT8_C( 108) },
       INT32_C(           0),
      { -INT32_C(  1116982584), -INT32_C(    10919418) } },
    { { -INT32_C(  1129342290), -INT32_C(   335891599) },
      {  INT8_C(  15),  INT8_C( 102), -INT8_C(  87), -INT8_C(  82), -INT8_C(  25),  INT8_C(   2), -INT8_C(  83),  INT8_C(  44) },
      { -INT8_C( 126), -INT8_C(   8),  INT8_C( 102), -INT8_C( 110), -INT8_C(  38), -INT8_C( 110), -INT8_C(  37),  INT8_C(  63) },
       INT32_C(           1),
      { -INT32_C(  1129356027), -INT32_C(   335885026) } }
  };

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

    SIMDE_CONSTIFY_2_(simde_vdot_lane_s32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_s32(INT32_C(0))), test_vec[i].lane, r_, 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 r_ = simde_test_arm_neon_random_i32x2();
    simde_int8x8_t a = simde_test_arm_neon_random_i8x8();
    simde_int8x8_t b = simde_test_arm_neon_random_i8x8();
    simde_int32x2_t r = simde_vdot_lane_s32(r_, a, b, lanes[i]);

    simde_test_arm_neon_write_i32x2(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i8x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    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_i32x2(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vdot_lane_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint32_t r_[2];
    uint8_t a[8];
    uint8_t b[8];
    const int lane;
    uint32_t r[2];
  } test_vec[] = {
    { { UINT32_C(2004636215), UINT32_C(1447988795) },
      { UINT8_C(252), UINT8_C( 39), UINT8_C( 82), UINT8_C( 17), UINT8_C(244), UINT8_C(247), UINT8_C( 33), UINT8_C( 22) },
      { UINT8_C(166), UINT8_C(124), UINT8_C(170), UINT8_C(109), UINT8_C(174), UINT8_C( 87), UINT8_C(102), UINT8_C( 37) },
       INT32_C(           0),
      { UINT32_C(2004698676), UINT32_C(1448067935) } },
    { { UINT32_C(1203385153), UINT32_C( 129883856) },
      { UINT8_C( 48), UINT8_C( 58), UINT8_C(127), UINT8_C(107), UINT8_C(200), UINT8_C(205), UINT8_C(193), UINT8_C(196) },
      { UINT8_C(244), UINT8_C( 19), UINT8_C(213), UINT8_C(232), UINT8_C( 10), UINT8_C(247), UINT8_C(254), UINT8_C(177) },
       INT32_C(           1),
      { UINT32_C(1203451156), UINT32_C( 130020205) } },
    { { UINT32_C( 555657587), UINT32_C(1095205888) },
      { UINT8_C(183), UINT8_C(  1), UINT8_C(136), UINT8_C(136), UINT8_C(223), UINT8_C( 70), UINT8_C(143), UINT8_C( 15) },
      { UINT8_C(128), UINT8_C( 14), UINT8_C(123), UINT8_C( 72), UINT8_C(219), UINT8_C( 60), UINT8_C( 12), UINT8_C(207) },
       INT32_C(           0),
      { UINT32_C( 555707545), UINT32_C(1095254081) } },
    { { UINT32_C(1522000208), UINT32_C(1259058904) },
      { UINT8_C( 95), UINT8_C( 41), UINT8_C(109), UINT8_C( 95), UINT8_C(173), UINT8_C(180), UINT8_C(160), UINT8_C(101) },
      { UINT8_C(181), UINT8_C( 40), UINT8_C(237), UINT8_C(149), UINT8_C(110), UINT8_C(124), UINT8_C(164), UINT8_C(238) },
       INT32_C(           1),
      { UINT32_C(1522056228), UINT32_C(1259150532) } },
    { { UINT32_C(1714823051), UINT32_C(2889237084) },
      { UINT8_C( 36), UINT8_C(237), UINT8_C(  6), UINT8_C(252), UINT8_C(163), UINT8_C( 18), UINT8_C( 72), UINT8_C(  2) },
      { UINT8_C( 59), UINT8_C(181), UINT8_C( 97), UINT8_C(233), UINT8_C(105), UINT8_C(  1), UINT8_C( 78), UINT8_C( 30) },
       INT32_C(           0),
      { UINT32_C(1714927370), UINT32_C(2889257409) } },
    { { UINT32_C(2561882922), UINT32_C(1116166327) },
      { UINT8_C(119), UINT8_C(189), UINT8_C(169), UINT8_C(211), UINT8_C(  0), UINT8_C(223), UINT8_C(127), UINT8_C( 36) },
      { UINT8_C(204), UINT8_C(134), UINT8_C( 32), UINT8_C(112), UINT8_C(152), UINT8_C(104), UINT8_C(114), UINT8_C(211) },
       INT32_C(           1),
      { UINT32_C(2561984453), UINT32_C(1116211593) } },
    { { UINT32_C(2260522013), UINT32_C(4289006293) },
      { UINT8_C( 69), UINT8_C( 88), UINT8_C(152), UINT8_C(253), UINT8_C(176), UINT8_C( 31), UINT8_C( 63), UINT8_C( 40) },
      { UINT8_C(220), UINT8_C(232), UINT8_C(251), UINT8_C(220), UINT8_C(199), UINT8_C(123), UINT8_C(  0), UINT8_C(148) },
       INT32_C(           0),
      { UINT32_C(2260651421), UINT32_C(4289076818) } },
    { { UINT32_C(2567184641), UINT32_C(2808903305) },
      { UINT8_C( 74), UINT8_C( 41), UINT8_C( 45), UINT8_C( 32), UINT8_C( 51), UINT8_C(210), UINT8_C( 31), UINT8_C(121) },
      { UINT8_C( 43), UINT8_C(183), UINT8_C(118), UINT8_C(219), UINT8_C(214), UINT8_C(181), UINT8_C(  3), UINT8_C(179) },
       INT32_C(           1),
      { UINT32_C(2567213761), UINT32_C(2808973981) } }
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint32x2_t r_ = simde_vld1_u32(test_vec[i].r_);
    simde_uint8x8_t a = simde_vld1_u8(test_vec[i].a);
    simde_uint8x8_t b = simde_vld1_u8(test_vec[i].b);
    simde_uint32x2_t r;

    SIMDE_CONSTIFY_2_(simde_vdot_lane_u32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_u32(UINT32_C(0))), test_vec[i].lane, r_, 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 r_ = simde_test_arm_neon_random_u32x2();
    simde_uint8x8_t a = simde_test_arm_neon_random_u8x8();
    simde_uint8x8_t b = simde_test_arm_neon_random_u8x8();
    simde_uint32x2_t r = simde_vdot_lane_u32(r_, a, b, lanes[i]);

    simde_test_arm_neon_write_u32x2(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u8x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    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_u32x2(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vdot_laneq_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int32_t r_[2];
    int8_t a[8];
    int8_t b[16];
    const int lane;
    int32_t r[2];
  } test_vec[] = {
    { { -INT32_C(  1265596150),  INT32_C(  1757209770) },
      {  INT8_C(   2), -INT8_C(  13),  INT8_C( 103), -INT8_C(  48),  INT8_C(  83), -INT8_C(  69),  INT8_C(  75), -INT8_C( 110) },
      {  INT8_C(  77), -INT8_C( 127),  INT8_C(  43), -INT8_C( 101),  INT8_C(  73),  INT8_C(  30), -INT8_C( 106),  INT8_C(  50),
        -INT8_C(   7), -INT8_C(  72), -INT8_C( 114),  INT8_C( 102),  INT8_C(  94),  INT8_C( 122),  INT8_C(  21),  INT8_C( 104) },
       INT32_C(           0),
      { -INT32_C(  1265585068),  INT32_C(  1757239259) } },
    { { -INT32_C(  1390566141), -INT32_C(  1944659575) },
      { -INT8_C(  52),  INT8_C( 125),  INT8_C(  92),  INT8_C(  32),  INT8_C(  56), -INT8_C(  89), -INT8_C(  78), -INT8_C( 123) },
      {  INT8_C(  40), -INT8_C(  35),  INT8_C(  32),  INT8_C( 114), -INT8_C(   5), -INT8_C(  74), -INT8_C(  92), -INT8_C(  11),
         INT8_C( 111),  INT8_C(  50),  INT8_C(  91), -INT8_C(  51), -INT8_C(  84),  INT8_C( 112),  INT8_C(  54), -INT8_C(  80) },
       INT32_C(           1),
      { -INT32_C(  1390583947), -INT32_C(  1944644740) } },
    { { -INT32_C(  1621273834), -INT32_C(   131370196) },
      { -INT8_C(  15), -INT8_C( 120),  INT8_C(  24),  INT8_C(  41),  INT8_C(  47), -INT8_C(  53), -INT8_C(  81),  INT8_C(  88) },
      { -INT8_C(  88), -INT8_C(  49), -INT8_C(  54), -INT8_C(  92), -INT8_C( 122),  INT8_C( 110), -INT8_C( 103), -INT8_C(  11),
        -INT8_C(  96), -INT8_C(  12), -INT8_C(  62),  INT8_C(  77),  INT8_C( 100), -INT8_C(   8), -INT8_C(   3),  INT8_C( 122) },
       INT32_C(           2),
      { -INT32_C(  1621269285), -INT32_C(   131362274) } },
    { {  INT32_C(  1998215755), -INT32_C(  1083161138) },
      { -INT8_C(  51), -INT8_C( 120), -INT8_C(  24), -INT8_C(   3),  INT8_C(  83), -INT8_C( 105),  INT8_C(  85), -INT8_C(   4) },
      {  INT8_C( 103),  INT8_C(  31), -INT8_C(  96), -INT8_C(  19), -INT8_C( 115),  INT8_C(  57), -INT8_C(  30),  INT8_C(  45),
         INT8_C(  45), -INT8_C(  92),  INT8_C( 122), -INT8_C( 111), -INT8_C(  99),  INT8_C( 119),  INT8_C(  12), -INT8_C(  24) },
       INT32_C(           3),
      {  INT32_C(  1998206308), -INT32_C(  1083180734) } },
    { { -INT32_C(  1604311342),  INT32_C(   962580587) },
      {  INT8_C(  88),  INT8_C(  71),  INT8_C(  54), -INT8_C(  84), -INT8_C(  33), -INT8_C( 117), -INT8_C(  88),  INT8_C(  70) },
      { -INT8_C(  86),  INT8_C(  72),  INT8_C(  51),  INT8_C(  55), -INT8_C( 127),  INT8_C(  21),  INT8_C( 100), -INT8_C(  82),
        -INT8_C(  71), -INT8_C(  33),  INT8_C(  63),  INT8_C(  86),  INT8_C(  86),  INT8_C(  75),  INT8_C(  63),  INT8_C(  40) },
       INT32_C(           0),
      { -INT32_C(  1604315664),  INT32_C(   962574363) } },
    { { -INT32_C(   574054543), -INT32_C(   954849425) },
      {  INT8_C( 111),  INT8_C(  76),  INT8_C( 115),  INT8_C(  78), -INT8_C(  41),  INT8_C(  27), -INT8_C( 108), -INT8_C( 127) },
      {  INT8_C(  99), -INT8_C(  57), -INT8_C(  72), -INT8_C(  28), -INT8_C(  36),  INT8_C(  28), -INT8_C( 110), -INT8_C( 107),
        -INT8_C(   5), -INT8_C(  46), -INT8_C(  20),  INT8_C(  82),  INT8_C(  29),  INT8_C(  43),  INT8_C( 122), -INT8_C( 113) },
       INT32_C(           1),
      { -INT32_C(   574077407), -INT32_C(   954821724) } },
    { {  INT32_C(   963396554), -INT32_C(   654278038) },
      { -INT8_C(  50),  INT8_C( 116),  INT8_C(  39), -INT8_C(  91), -INT8_C( 113), -INT8_C(  69),  INT8_C(  38), -INT8_C(  13) },
      { -INT8_C( 126), -INT8_C(  34), -INT8_C(  41),  INT8_C(  94), -INT8_C(   6),  INT8_C( 106), -INT8_C(  12), -INT8_C(  10),
         INT8_C(  60), -INT8_C(  32),  INT8_C(  72),  INT8_C(  89),  INT8_C(  11), -INT8_C(  62), -INT8_C(  24), -INT8_C(  43) },
       INT32_C(           2),
      {  INT32_C(   963384551), -INT32_C(   654281031) } },
    { {  INT32_C(  1879987205), -INT32_C(  1538715946) },
      { -INT8_C( 126),  INT8_C( 113),  INT8_C(  73),  INT8_C(  18),  INT8_C(  44),  INT8_C( 111),  INT8_C(   5), -INT8_C(  81) },
      {  INT8_C(  77), -INT8_C(  36),  INT8_C(  13),  INT8_C(  72),  INT8_C(  70),  INT8_C(   1),  INT8_C(  62), -INT8_C( 126),
        -INT8_C(  31), -INT8_C( 122), -INT8_C(  36), -INT8_C(  20),  INT8_C(  72), -INT8_C(  60), -INT8_C(  63),  INT8_C(  78) },
       INT32_C(           3),
      {  INT32_C(  1879968158), -INT32_C(  1538726071) } }
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int32x2_t r_ = simde_vld1_s32(test_vec[i].r_);
    simde_int8x8_t a = simde_vld1_s8(test_vec[i].a);
    simde_int8x16_t b = simde_vld1q_s8(test_vec[i].b);
    simde_int32x2_t r;

    SIMDE_CONSTIFY_4_(simde_vdot_laneq_s32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_s32(INT32_C(0))), test_vec[i].lane, r_, 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, 2, 3, 0, 1, 2, 3 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_int32x2_t r_ = simde_test_arm_neon_random_i32x2();
    simde_int8x8_t a = simde_test_arm_neon_random_i8x8();
    simde_int8x16_t b = simde_test_arm_neon_random_i8x16();
    simde_int32x2_t r = simde_vdot_laneq_s32(r_, a, b, lanes[i]);

    simde_test_arm_neon_write_i32x2(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i8x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    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_i32x2(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vdot_laneq_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint32_t r_[2];
    uint8_t a[8];
    uint8_t b[16];
    const int lane;
    uint32_t r[2];
  } test_vec[] = {
    { { UINT32_C(4212112153), UINT32_C(2140133093) },
      { UINT8_C(219), UINT8_C( 10), UINT8_C(230), UINT8_C( 71), UINT8_C( 87), UINT8_C( 27), UINT8_C(218), UINT8_C(104) },
      { UINT8_C(119), UINT8_C(112), UINT8_C(148), UINT8_C( 58), UINT8_C(217), UINT8_C(247), UINT8_C(231), UINT8_C( 79),
        UINT8_C(162), UINT8_C(164), UINT8_C( 33), UINT8_C(182), UINT8_C(172), UINT8_C(196), UINT8_C( 77), UINT8_C(197) },
       INT32_C(           0),
      { UINT32_C(4212177492), UINT32_C(2140184766) } },
    { { UINT32_C(1707105408), UINT32_C( 249843507) },
      { UINT8_C( 89), UINT8_C(202), UINT8_C( 85), UINT8_C(177), UINT8_C(229), UINT8_C( 48), UINT8_C( 25), UINT8_C( 92) },
      { UINT8_C(160), UINT8_C(174), UINT8_C(150), UINT8_C(121), UINT8_C(165), UINT8_C(125), UINT8_C(201), UINT8_C( 71),
        UINT8_C( 33), UINT8_C(234), UINT8_C(253), UINT8_C(205), UINT8_C(175), UINT8_C( 75), UINT8_C(146), UINT8_C( 47) },
       INT32_C(           1),
      { UINT32_C(1707174995), UINT32_C( 249898849) } },
    { { UINT32_C(3667153575), UINT32_C(4226381985) },
      { UINT8_C( 66), UINT8_C( 62), UINT8_C(172), UINT8_C( 39), UINT8_C(110), UINT8_C(197), UINT8_C(132), UINT8_C( 14) },
      { UINT8_C(115), UINT8_C( 26), UINT8_C(136), UINT8_C( 25), UINT8_C(152), UINT8_C( 81), UINT8_C( 96), UINT8_C(185),
        UINT8_C( 59), UINT8_C( 94), UINT8_C(135), UINT8_C(234), UINT8_C(169), UINT8_C( 25), UINT8_C( 25), UINT8_C( 80) },
       INT32_C(           2),
      { UINT32_C(3667195643), UINT32_C(4226428089) } },
    { { UINT32_C( 220966252), UINT32_C(1728582693) },
      { UINT8_C( 82), UINT8_C(180), UINT8_C(143), UINT8_C(193), UINT8_C(122), UINT8_C( 19), UINT8_C(207), UINT8_C(237) },
      { UINT8_C( 45), UINT8_C( 87), UINT8_C(  6), UINT8_C(197), UINT8_C(168), UINT8_C(103), UINT8_C(127), UINT8_C(228),
        UINT8_C(197), UINT8_C(  6), UINT8_C(206), UINT8_C(110), UINT8_C( 31), UINT8_C(232), UINT8_C(190), UINT8_C(139) },
       INT32_C(           3),
      { UINT32_C( 221064551), UINT32_C(1728663156) } },
    { { UINT32_C(3147426197), UINT32_C(1344446973) },
      { UINT8_C( 86), UINT8_C(177), UINT8_C( 17), UINT8_C(208), UINT8_C(196), UINT8_C(224), UINT8_C(189), UINT8_C(242) },
      { UINT8_C( 56), UINT8_C(196), UINT8_C(183), UINT8_C(224), UINT8_C( 43), UINT8_C( 54), UINT8_C(196), UINT8_C(240),
        UINT8_C( 60), UINT8_C(147), UINT8_C( 94), UINT8_C( 92), UINT8_C(123), UINT8_C( 28), UINT8_C(231), UINT8_C( 16) },
       INT32_C(           0),
      { UINT32_C(3147515408), UINT32_C(1344590648) } },
    { { UINT32_C(  63668230), UINT32_C(2018766370) },
      { UINT8_C(159), UINT8_C(100), UINT8_C( 72), UINT8_C(100), UINT8_C( 69), UINT8_C(  5), UINT8_C( 86), UINT8_C(125) },
      { UINT8_C(201), UINT8_C( 13), UINT8_C( 93), UINT8_C(244), UINT8_C( 68), UINT8_C( 34), UINT8_C(228), UINT8_C(128),
        UINT8_C(181), UINT8_C( 66), UINT8_C(220), UINT8_C( 48), UINT8_C( 95), UINT8_C(196), UINT8_C( 64), UINT8_C(101) },
       INT32_C(           1),
      { UINT32_C(  63711658), UINT32_C(2018806840) } },
    { { UINT32_C(1718094916), UINT32_C(2581511418) },
      { UINT8_C( 32), UINT8_C( 38), UINT8_C(253), UINT8_C(101), UINT8_C( 44), UINT8_C( 83), UINT8_C(226), UINT8_C(245) },
      { UINT8_C( 97), UINT8_C( 64), UINT8_C(234), UINT8_C(165), UINT8_C( 98), UINT8_C(206), UINT8_C( 37), UINT8_C( 23),
        UINT8_C( 17), UINT8_C(  2), UINT8_C( 71), UINT8_C(112), UINT8_C(198), UINT8_C(135), UINT8_C(213), UINT8_C( 10) },
       INT32_C(           2),
      { UINT32_C(1718124811), UINT32_C(2581555818) } },
    { { UINT32_C(2373008787), UINT32_C( 438783993) },
      { UINT8_C(118), UINT8_C( 36), UINT8_C(127), UINT8_C(162), UINT8_C(120), UINT8_C( 98), UINT8_C(151), UINT8_C(217) },
      { UINT8_C(162), UINT8_C(129), UINT8_C(126), UINT8_C(  4), UINT8_C( 80), UINT8_C(163), UINT8_C( 27), UINT8_C( 97),
        UINT8_C(165), UINT8_C( 98), UINT8_C(209), UINT8_C(107), UINT8_C(233), UINT8_C(166), UINT8_C(118), UINT8_C(125) },
       INT32_C(           3),
      { UINT32_C(2373077493), UINT32_C( 438873164) } }
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint32x2_t r_ = simde_vld1_u32(test_vec[i].r_);
    simde_uint8x8_t a = simde_vld1_u8(test_vec[i].a);
    simde_uint8x16_t b = simde_vld1q_u8(test_vec[i].b);
    simde_uint32x2_t r;

    SIMDE_CONSTIFY_4_(simde_vdot_laneq_u32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_u32(INT32_C(0))), test_vec[i].lane, r_, 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, 2, 3, 0, 1, 2, 3 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_uint32x2_t r_ = simde_test_arm_neon_random_u32x2();
    simde_uint8x8_t a = simde_test_arm_neon_random_u8x8();
    simde_uint8x16_t b = simde_test_arm_neon_random_u8x16();
    simde_uint32x2_t r = simde_vdot_laneq_u32(r_, a, b, lanes[i]);

    simde_test_arm_neon_write_u32x2(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u8x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    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_u32x2(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vdotq_laneq_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint32_t r_[4];
    uint8_t a[16];
    uint8_t b[16];
    const int lane;
    uint32_t r[4];
  } test_vec[] = {
    { { UINT32_C(2956088052), UINT32_C(1116959597), UINT32_C(3659309628), UINT32_C(3973020989) },
      { UINT8_C( 92), UINT8_C( 11), UINT8_C( 40), UINT8_C(102), UINT8_C(141), UINT8_C(244), UINT8_C(135), UINT8_C( 11),
        UINT8_C(208), UINT8_C( 58), UINT8_C( 94), UINT8_C( 83), UINT8_C( 85), UINT8_C(137), UINT8_C(213), UINT8_C( 73) },
      { UINT8_C(220), UINT8_C(  8), UINT8_C(250), UINT8_C( 73), UINT8_C(123), UINT8_C(141), UINT8_C(139), UINT8_C(183),
        UINT8_C( 47), UINT8_C(168), UINT8_C(145), UINT8_C(108), UINT8_C( 37), UINT8_C( 97), UINT8_C( 88), UINT8_C(129) },
       INT32_C(           0),
      { UINT32_C(2956125826), UINT32_C(1117027122), UINT32_C(3659385411), UINT32_C(3973099364) } },
    { { UINT32_C(4192764012), UINT32_C(1141141364), UINT32_C(4271334057), UINT32_C(3360189932) },
      { UINT8_C(117), UINT8_C( 66), UINT8_C( 17), UINT8_C(240), UINT8_C(207), UINT8_C(156), UINT8_C(167), UINT8_C(254),
        UINT8_C( 68), UINT8_C( 56), UINT8_C(106), UINT8_C(106), UINT8_C(153), UINT8_C(194), UINT8_C(235), UINT8_C(  5) },
      { UINT8_C( 66), UINT8_C(211), UINT8_C(254), UINT8_C(182), UINT8_C( 66), UINT8_C(  3), UINT8_C(250), UINT8_C(235),
        UINT8_C(101), UINT8_C(145), UINT8_C(234), UINT8_C( 81), UINT8_C(254), UINT8_C( 50), UINT8_C( 25), UINT8_C(115) },
       INT32_C(           1),
      { UINT32_C(4192832582), UINT32_C(1141256934), UINT32_C(4271390123), UINT32_C(3360260537) } },
    { { UINT32_C(1130572404), UINT32_C( 188811975), UINT32_C(3698699075), UINT32_C(2950848877) },
      { UINT8_C( 52), UINT8_C(224), UINT8_C(101), UINT8_C(119), UINT8_C(227), UINT8_C( 95), UINT8_C( 98), UINT8_C( 73),
        UINT8_C(240), UINT8_C( 76), UINT8_C(154), UINT8_C(239), UINT8_C(126), UINT8_C(180), UINT8_C( 98), UINT8_C(242) },
      { UINT8_C(222), UINT8_C(198), UINT8_C( 53), UINT8_C(165), UINT8_C(208), UINT8_C(118), UINT8_C(177), UINT8_C( 19),
        UINT8_C( 33), UINT8_C( 38), UINT8_C(240), UINT8_C(142), UINT8_C(135), UINT8_C(210), UINT8_C( 61), UINT8_C(188) },
       INT32_C(           2),
      { UINT32_C(1130623770), UINT32_C( 188856962), UINT32_C(3698780781), UINT32_C(2950917759) } },
    { { UINT32_C(2519966386), UINT32_C(4074738945), UINT32_C(1625389538), UINT32_C( 206783277) },
      { UINT8_C(  9), UINT8_C(136), UINT8_C(177), UINT8_C(218),    UINT8_MAX, UINT8_C( 98), UINT8_C(237), UINT8_C( 32),
        UINT8_C(137), UINT8_C(221), UINT8_C(175), UINT8_C( 16), UINT8_C(175), UINT8_C(236), UINT8_C(204), UINT8_C( 98) },
      { UINT8_C(143),    UINT8_MAX, UINT8_C(248), UINT8_C(144), UINT8_C(149), UINT8_C(215), UINT8_C(130), UINT8_C(119),
        UINT8_C( 80), UINT8_C( 99), UINT8_C(215), UINT8_C(126), UINT8_C(167), UINT8_C( 42), UINT8_C(138), UINT8_C(176) },
       INT32_C(           3),
      { UINT32_C(2520036395), UINT32_C(4074823984), UINT32_C(1625448665), UINT32_C( 206867814) } },
    { { UINT32_C(2995403699), UINT32_C( 668104862), UINT32_C(  87523669), UINT32_C(4251386990) },
      { UINT8_C(  3), UINT8_C( 95), UINT8_C(141), UINT8_C(152), UINT8_C( 54), UINT8_C( 16), UINT8_C( 15), UINT8_C(134),
        UINT8_C(115), UINT8_C(231), UINT8_C(  4), UINT8_C( 26), UINT8_C( 17), UINT8_C(142), UINT8_C(203), UINT8_C(196) },
      { UINT8_C(202), UINT8_C( 85), UINT8_C(118), UINT8_C(104), UINT8_C(205), UINT8_C( 73), UINT8_C(143), UINT8_C( 35),
        UINT8_C(202), UINT8_C(198), UINT8_C( 40), UINT8_C( 56), UINT8_C(202), UINT8_C(143), UINT8_C( 53), UINT8_C(206) },
       INT32_C(           0),
      { UINT32_C(2995444826), UINT32_C( 668132836), UINT32_C(  87569710), UINT32_C(4251446832) } },
    { { UINT32_C( 610714606), UINT32_C(1185576659), UINT32_C(1851895645), UINT32_C( 120794173) },
      { UINT8_C(129), UINT8_C(169), UINT8_C(111), UINT8_C( 79), UINT8_C(242), UINT8_C(254), UINT8_C(114), UINT8_C(189),
        UINT8_C(197), UINT8_C(154), UINT8_C(245), UINT8_C(143), UINT8_C( 41), UINT8_C( 43), UINT8_C( 93), UINT8_C( 23) },
      { UINT8_C(238), UINT8_C(196), UINT8_C( 59), UINT8_C(193), UINT8_C( 58), UINT8_C(229), UINT8_C(  7), UINT8_C(151),
        UINT8_C(148), UINT8_C(104), UINT8_C(  5), UINT8_C(210), UINT8_C(148), UINT8_C( 56), UINT8_C(217), UINT8_C( 22) },
       INT32_C(           1),
      { UINT32_C( 610773495), UINT32_C(1185678198), UINT32_C(1851965645), UINT32_C( 120810522) } },
    { { UINT32_C(3563407842), UINT32_C( 210884423), UINT32_C(2593949553), UINT32_C(2696018354) },
      { UINT8_C(189), UINT8_C(236), UINT8_C( 97), UINT8_C(247), UINT8_C(209), UINT8_C(104), UINT8_C(142), UINT8_C(102),
        UINT8_C(209), UINT8_C(148), UINT8_C( 56), UINT8_C(101), UINT8_C(204), UINT8_C( 17), UINT8_C(123), UINT8_C(174) },
      { UINT8_C( 90), UINT8_C(224), UINT8_C(131), UINT8_C(162), UINT8_C(183), UINT8_C( 20), UINT8_C(174), UINT8_C( 40),
        UINT8_C(155), UINT8_C( 74), UINT8_C(194), UINT8_C( 77), UINT8_C( 68), UINT8_C(115), UINT8_C(237), UINT8_C(  1) },
       INT32_C(           2),
      { UINT32_C(3563492438), UINT32_C( 210959916), UINT32_C(2594011541), UINT32_C(2696088492) } },
    { { UINT32_C( 838422111), UINT32_C(2291632055), UINT32_C(3907899163), UINT32_C( 999713248) },
      { UINT8_C( 73), UINT8_C( 25), UINT8_C(221), UINT8_C(  1), UINT8_C( 46), UINT8_C(139), UINT8_C( 41), UINT8_C(201),
        UINT8_C(214), UINT8_C(236), UINT8_C( 23), UINT8_C( 26), UINT8_C( 95), UINT8_C(  4), UINT8_C( 27), UINT8_C(191) },
      { UINT8_C( 83), UINT8_C( 20), UINT8_C(240), UINT8_C( 10), UINT8_C(156), UINT8_C(135), UINT8_C(146), UINT8_C(183),
        UINT8_C( 86), UINT8_C(127), UINT8_C(159), UINT8_C( 54), UINT8_C(232), UINT8_C( 54), UINT8_C(113), UINT8_C( 50) },
       INT32_C(           3),
      { UINT32_C( 838465420), UINT32_C(2291664916), UINT32_C(3907965454), UINT32_C( 999748105) } }
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint32x4_t r_ = simde_vld1q_u32(test_vec[i].r_);
    simde_uint8x16_t a = simde_vld1q_u8(test_vec[i].a);
    simde_uint8x16_t b = simde_vld1q_u8(test_vec[i].b);
    simde_uint32x4_t r;

    SIMDE_CONSTIFY_4_(simde_vdotq_laneq_u32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_u32(INT32_C(0))), test_vec[i].lane, r_, a, b);

    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 r_ = simde_test_arm_neon_random_u32x4();
    simde_uint8x16_t a = simde_test_arm_neon_random_u8x16();
    simde_uint8x16_t b = simde_test_arm_neon_random_u8x16();
    simde_uint32x4_t r = simde_vdotq_laneq_u32(r_, a, b, lanes[i]);

    simde_test_arm_neon_write_u32x4(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u8x16(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    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_u32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vdotq_laneq_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int32_t r_[4];
    int8_t a[16];
    int8_t b[16];
    const int lane;
    int32_t r[4];
  } test_vec[] = {
    { {  INT32_C(   168480566), -INT32_C(   719353915),  INT32_C(  1211341351),  INT32_C(    28884669) },
      { -INT8_C(  77),  INT8_C(  48), -INT8_C(  79), -INT8_C( 120),  INT8_C(  30), -INT8_C(  48),  INT8_C(  20), -INT8_C(  69),
        -INT8_C(  77),  INT8_C( 111), -INT8_C(  25),  INT8_C(   4),  INT8_C(  87),  INT8_C( 108), -INT8_C(  33), -INT8_C( 115) },
      {  INT8_C(  59), -INT8_C(  23), -INT8_C( 105),  INT8_C(   1),  INT8_C( 112), -INT8_C(  73), -INT8_C(  42), -INT8_C( 104),
         INT8_C(  81),  INT8_C(   9), -INT8_C(  32),  INT8_C(  14), -INT8_C(  57), -INT8_C( 104),  INT8_C(  15),  INT8_C( 122) },
       INT32_C(           0),
      {  INT32_C(   168483094), -INT32_C(   719353210),  INT32_C(  1211336884),  INT32_C(    28890668) } },
    { { -INT32_C(   436027192),  INT32_C(  1134630800), -INT32_C(   582514298),  INT32_C(   829105909) },
      {  INT8_C(  16),  INT8_C(   2),  INT8_C(  50),      INT8_MIN, -INT8_C(  71),  INT8_C(   8),  INT8_C(  24),  INT8_C(  10),
         INT8_C(  17), -INT8_C(   7),  INT8_C(  25), -INT8_C(  40), -INT8_C( 111),  INT8_C(  40),  INT8_C(  82),  INT8_C(  90) },
      { -INT8_C(  23),  INT8_C(  84),  INT8_C(  64),  INT8_C( 121),  INT8_C( 107), -INT8_C(  30), -INT8_C(  67), -INT8_C(  15),
         INT8_C( 107),  INT8_C(   4), -INT8_C(  49),  INT8_C(  96),  INT8_C(  43),  INT8_C(  58), -INT8_C( 111),  INT8_C(  59) },
       INT32_C(           1),
      { -INT32_C(   436026970),  INT32_C(  1134621205), -INT32_C(   582513344),  INT32_C(   829085988) } },
    { { -INT32_C(   155466948), -INT32_C(   603925301),  INT32_C(  1588861389),  INT32_C(   733480514) },
      {  INT8_C(  91), -INT8_C(   7), -INT8_C(  92), -INT8_C(  58), -INT8_C(  37),  INT8_C(  97), -INT8_C(  72),  INT8_C(  70),
         INT8_C( 102), -INT8_C( 121), -INT8_C(  90), -INT8_C( 111), -INT8_C(  63),  INT8_C(  56), -INT8_C(  52), -INT8_C(   3) },
      { -INT8_C(   5), -INT8_C( 121), -INT8_C(  13), -INT8_C(  57),  INT8_C(  91), -INT8_C(  12), -INT8_C(  93),  INT8_C(  40),
         INT8_C(  13),  INT8_C(  88), -INT8_C( 121),  INT8_C(  79),  INT8_C(  94),  INT8_C(  63),  INT8_C( 122), -INT8_C(  71) },
       INT32_C(           2),
      { -INT32_C(   155459831), -INT32_C(   603903004),  INT32_C(  1588854188),  INT32_C(   733490678) } },
    { {  INT32_C(   327163704), -INT32_C(   430360448), -INT32_C(  2139684673),  INT32_C(   863847224) },
      { -INT8_C(  53),  INT8_C( 113), -INT8_C(   6),  INT8_C(  38),  INT8_C( 101), -INT8_C(  98),  INT8_C(  79),  INT8_C( 114),
        -INT8_C(  10), -INT8_C(  42), -INT8_C(  62),  INT8_C(  84),  INT8_C(  21),  INT8_C(  60),  INT8_C(  14),  INT8_C(  78) },
      {  INT8_C(  91), -INT8_C( 114),  INT8_C(  97), -INT8_C(  36), -INT8_C(  58), -INT8_C(  69), -INT8_C(  62), -INT8_C( 123),
        -INT8_C(  69),  INT8_C(  58),  INT8_C(   5), -INT8_C(  13),  INT8_C( 125), -INT8_C( 126),  INT8_C(  38),  INT8_C(  72) },
       INT32_C(           3),
      {  INT32_C(   327145349), -INT32_C(   430324265), -INT32_C(  2139676939),  INT32_C(   863848437) } },
    { {  INT32_C(  1483678195), -INT32_C(  1244938561), -INT32_C(  1458991724),  INT32_C(   636950473) },
      { -INT8_C(  91),  INT8_C(  89),  INT8_C(   1),  INT8_C( 107),  INT8_C(  20), -INT8_C(  61), -INT8_C(  16), -INT8_C(  49),
        -INT8_C(   3), -INT8_C(  11), -INT8_C(  62),  INT8_C( 123),  INT8_C( 120), -INT8_C(  24), -INT8_C(  61),  INT8_C( 107) },
      {  INT8_C(   9),  INT8_C(  50), -INT8_C(  60), -INT8_C(  56), -INT8_C(  16), -INT8_C( 113),  INT8_C( 125), -INT8_C( 124),
         INT8_C(  28), -INT8_C( 121),  INT8_C(  46), -INT8_C(  27), -INT8_C(  98),  INT8_C(  37),  INT8_C(  10),  INT8_C(  68) },
       INT32_C(           0),
      {  INT32_C(  1483675774), -INT32_C(  1244937727), -INT32_C(  1458995469),  INT32_C(   636948021) } },
    { { -INT32_C(  1834022018), -INT32_C(   866017073),  INT32_C(   222765973),  INT32_C(   360254220) },
      {  INT8_C(  61),  INT8_C(  61), -INT8_C(  34),  INT8_C(  46), -INT8_C(  52),  INT8_C(  91), -INT8_C(  78), -INT8_C(  24),
        -INT8_C(  30), -INT8_C(  32), -INT8_C(  51), -INT8_C( 127),  INT8_C(   6), -INT8_C(  40), -INT8_C(  59), -INT8_C( 124) },
      { -INT8_C(  29),  INT8_C( 116),  INT8_C(  23), -INT8_C(  78),  INT8_C(  20),  INT8_C( 120),      INT8_MAX, -INT8_C(  86),
        -INT8_C( 100), -INT8_C(  58), -INT8_C(  73), -INT8_C(  88), -INT8_C(  47),  INT8_C(  48), -INT8_C(  67),  INT8_C(  15) },
       INT32_C(           1),
      { -INT32_C(  1834021752), -INT32_C(   866015035),  INT32_C(   222765978),  INT32_C(   360252711) } },
    { {  INT32_C(   960338797), -INT32_C(   652087305), -INT32_C(   698683440), -INT32_C(  1436934201) },
      { -INT8_C( 108),  INT8_C( 113),  INT8_C(  93), -INT8_C(  88), -INT8_C(  22), -INT8_C(  36),  INT8_C(  82), -INT8_C( 122),
        -INT8_C(  94),  INT8_C(  10),  INT8_C(  46),  INT8_C( 116),  INT8_C(  58), -INT8_C(  21), -INT8_C( 125), -INT8_C(  88) },
      { -INT8_C( 121), -INT8_C(  64), -INT8_C(  31),  INT8_C( 126), -INT8_C(  81),  INT8_C(   3),  INT8_C(  87),      INT8_MAX,
        -INT8_C(  14), -INT8_C(  78),  INT8_C(  85), -INT8_C(  71), -INT8_C(  47), -INT8_C(  80),  INT8_C(  99),  INT8_C( 101) },
       INT32_C(           2),
      {  INT32_C(   960345648), -INT32_C(   652068557), -INT32_C(   698687230), -INT32_C(  1436937752) } },
    { {  INT32_C(   185516065),  INT32_C(  1066492060), -INT32_C(  1514946710),  INT32_C(   843921067) },
      { -INT8_C(  10),  INT8_C(  46), -INT8_C(  80), -INT8_C(  91),  INT8_C(  49),  INT8_C(   7),  INT8_C(  37),  INT8_C(  35),
        -INT8_C(  71),  INT8_C( 122), -INT8_C(  36), -INT8_C( 117),  INT8_C(  42),  INT8_C(  64), -INT8_C(  16),  INT8_C(  76) },
      {  INT8_C(   0), -INT8_C(   2),  INT8_C(  87), -INT8_C(  99),  INT8_C(  95), -INT8_C(  23), -INT8_C(  36), -INT8_C(  55),
        -INT8_C(  88), -INT8_C( 113),  INT8_C( 110),  INT8_C(  83), -INT8_C(  59), -INT8_C(  69), -INT8_C( 123), -INT8_C(  69) },
       INT32_C(           3),
      {  INT32_C(   185529600),  INT32_C(  1066481720), -INT32_C(  1514938438),  INT32_C(   843910897) } }
  };

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

    SIMDE_CONSTIFY_4_(simde_vdotq_laneq_s32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_s32(INT32_C(0))), test_vec[i].lane, r_, a, b);

    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 r_ = simde_test_arm_neon_random_i32x4();
    simde_int8x16_t a = simde_test_arm_neon_random_i8x16();
    simde_int8x16_t b = simde_test_arm_neon_random_i8x16();
    simde_int32x4_t r = simde_vdotq_laneq_s32(r_, a, b, lanes[i]);

    simde_test_arm_neon_write_i32x4(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i8x16(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    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_i32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vdotq_lane_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint32_t r_[4];
    uint8_t a[16];
    uint8_t b[8];
    const int lane;
    uint32_t r[4];
  } test_vec[] = {
    { { UINT32_C(2812064822), UINT32_C(1375818988), UINT32_C( 796998341), UINT32_C(2929194909) },
      { UINT8_C( 16), UINT8_C(147), UINT8_C(  6), UINT8_C(216), UINT8_C( 64), UINT8_C(164), UINT8_C(180), UINT8_C(112),
        UINT8_C(122), UINT8_C(229), UINT8_C(173), UINT8_C(175), UINT8_C( 70), UINT8_C( 55), UINT8_C(200), UINT8_C(124) },
      { UINT8_C(235), UINT8_C(100), UINT8_C( 35), UINT8_C(215), UINT8_C(185), UINT8_C( 36), UINT8_C( 41), UINT8_C(126) },
       INT32_C(           0),
      { UINT32_C(2812129932), UINT32_C(1375880808), UINT32_C( 797093591), UINT32_C(2929250519) } },
    { { UINT32_C(4222528094), UINT32_C(2980660641), UINT32_C( 411676632), UINT32_C(3465035092) },
      { UINT8_C( 35), UINT8_C( 53), UINT8_C(125), UINT8_C(105), UINT8_C(109), UINT8_C( 69), UINT8_C(229), UINT8_C( 88),
        UINT8_C(170), UINT8_C(  8), UINT8_C( 48), UINT8_C( 99), UINT8_C( 44), UINT8_C( 89), UINT8_C(225), UINT8_C(138) },
      { UINT8_C(  4), UINT8_C(143), UINT8_C(133), UINT8_C(165), UINT8_C(212), UINT8_C( 46), UINT8_C( 87), UINT8_C(172) },
       INT32_C(           1),
      { UINT32_C(4222566887), UINT32_C(2980721982), UINT32_C( 411734244), UINT32_C(3465091825) } },
    { { UINT32_C( 835051741), UINT32_C(1107250462), UINT32_C(4037704835), UINT32_C(1816694722) },
      { UINT8_C(151), UINT8_C(120), UINT8_C(207), UINT8_C(195), UINT8_C(210), UINT8_C(176), UINT8_C( 77), UINT8_C(214),
        UINT8_C( 64), UINT8_C(210), UINT8_C(123), UINT8_C( 20), UINT8_C(  0), UINT8_C(210), UINT8_C(193), UINT8_C(221) },
      { UINT8_C(179), UINT8_C(134), UINT8_C( 15), UINT8_C(209), UINT8_C(211), UINT8_C( 14), UINT8_C( 18), UINT8_C( 86) },
       INT32_C(           0),
      { UINT32_C( 835138710), UINT32_C(1107357517), UINT32_C(4037750456), UINT32_C(1816771946) } },
    { { UINT32_C(1296481419), UINT32_C(3803811659), UINT32_C(3651504135), UINT32_C(2024796728) },
      { UINT8_C(196), UINT8_C( 43), UINT8_C(141), UINT8_C(196), UINT8_C(253), UINT8_C( 78), UINT8_C(161), UINT8_C(176),
        UINT8_C(212), UINT8_C(176), UINT8_C(129), UINT8_C(167), UINT8_C(191), UINT8_C(147), UINT8_C(254), UINT8_C( 74) },
      { UINT8_C( 79), UINT8_C( 68), UINT8_C(151), UINT8_C(154), UINT8_C(211), UINT8_C( 80), UINT8_C(124), UINT8_C(219) },
       INT32_C(           1),
      { UINT32_C(1296586623), UINT32_C(3803929790), UINT32_C(3651615516), UINT32_C(2024896491) } },
    { { UINT32_C( 280240600), UINT32_C(3616105491), UINT32_C(2358974095), UINT32_C( 943537508) },
      { UINT8_C(237), UINT8_C(190), UINT8_C(223), UINT8_C(172), UINT8_C( 82), UINT8_C(221), UINT8_C(246), UINT8_C(161),
        UINT8_C( 34), UINT8_C(141), UINT8_C( 60), UINT8_C(245), UINT8_C(221), UINT8_C(184), UINT8_C(208), UINT8_C(181) },
      { UINT8_C(218), UINT8_C(133), UINT8_C(198), UINT8_C(237), UINT8_C(233), UINT8_C( 79), UINT8_C(197), UINT8_C(120) },
       INT32_C(           0),
      { UINT32_C( 280402454), UINT32_C(3616239625), UINT32_C(2359070205), UINT32_C( 943694239) } },
    { { UINT32_C(3372507237), UINT32_C(2332115357), UINT32_C(1379393536), UINT32_C(3774033598) },
      { UINT8_C(187), UINT8_C( 47), UINT8_C(213), UINT8_C(153), UINT8_C(232), UINT8_C(166), UINT8_C( 78), UINT8_C(194),
        UINT8_C( 43), UINT8_C( 20), UINT8_C(175), UINT8_C( 20), UINT8_C( 99), UINT8_C(116), UINT8_C(140), UINT8_C(200) },
      { UINT8_C(213), UINT8_C(144), UINT8_C(145), UINT8_C(114), UINT8_C(210), UINT8_C(146), UINT8_C(253), UINT8_C(210) },
       INT32_C(           1),
      { UINT32_C(3372639388), UINT32_C(2332248787), UINT32_C(1379453961), UINT32_C(3774148744) } },
    { { UINT32_C( 824456563), UINT32_C( 504436579), UINT32_C( 800581191), UINT32_C(3086026380) },
      { UINT8_C( 26), UINT8_C(160), UINT8_C(203), UINT8_C(126), UINT8_C( 21), UINT8_C( 87), UINT8_C( 70), UINT8_C(234),
        UINT8_C(232), UINT8_C(216), UINT8_C( 92), UINT8_C(186), UINT8_C(106), UINT8_C( 90), UINT8_C(140), UINT8_C(221) },
      { UINT8_C(143), UINT8_C(176), UINT8_C( 14), UINT8_C(242), UINT8_C(199), UINT8_C( 31), UINT8_C( 16), UINT8_C( 14) },
       INT32_C(           0),
      { UINT32_C( 824521775), UINT32_C( 504512502), UINT32_C( 800698683), UINT32_C(3086112820) } },
    { { UINT32_C(2453522438), UINT32_C(3897175758), UINT32_C(3831895503), UINT32_C(1439608173) },
      { UINT8_C(133), UINT8_C( 42), UINT8_C( 15), UINT8_C(239), UINT8_C(132), UINT8_C(155), UINT8_C(205), UINT8_C( 19),
        UINT8_C( 75), UINT8_C(219), UINT8_C(  5), UINT8_C( 18), UINT8_C(251), UINT8_C( 22), UINT8_C( 33), UINT8_C(  1) },
      { UINT8_C(222), UINT8_C( 94), UINT8_C(147), UINT8_C(172), UINT8_C(141), UINT8_C(221), UINT8_C(148), UINT8_C( 92) },
       INT32_C(           1),
      { UINT32_C(2453574681), UINT32_C(3897260713), UINT32_C(3831956873), UINT32_C(1439653402) } }
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_uint32x4_t r_ = simde_vld1q_u32(test_vec[i].r_);
    simde_uint8x16_t a = simde_vld1q_u8(test_vec[i].a);
    simde_uint8x8_t b = simde_vld1_u8(test_vec[i].b);
    simde_uint32x4_t r;

    SIMDE_CONSTIFY_2_(simde_vdotq_lane_u32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_u32(UINT32_C(0))), test_vec[i].lane, r_, a, b);

    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, 0, 1, 0, 1, 0, 1 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_uint32x4_t r_ = simde_test_arm_neon_random_u32x4();
    simde_uint8x16_t a = simde_test_arm_neon_random_u8x16();
    simde_uint8x8_t b = simde_test_arm_neon_random_u8x8();
    simde_uint32x4_t r = simde_vdotq_lane_u32(r_, a, b, lanes[i]);

    simde_test_arm_neon_write_u32x4(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u8x16(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    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_u32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vdotq_lane_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int32_t r_[4];
    int8_t a[16];
    int8_t b[8];
    const int lane;
    int32_t r[4];
  } test_vec[] = {
    { { -INT32_C(   559749449),  INT32_C(  1621946015),  INT32_C(   274963624), -INT32_C(  1961097564) },
      { -INT8_C(  96),  INT8_C( 126),  INT8_C(  57), -INT8_C(  27),  INT8_C( 119), -INT8_C(  49),  INT8_C(  55), -INT8_C( 117),
         INT8_C( 117),  INT8_C( 112), -INT8_C(  87), -INT8_C(  32), -INT8_C(  43),  INT8_C(  25),  INT8_C(   9), -INT8_C( 116) },
      { -INT8_C(   1), -INT8_C(  85),  INT8_C( 106), -INT8_C(  98), -INT8_C( 102),  INT8_C(  22), -INT8_C(   1),  INT8_C(  66) },
       INT32_C(           0),
      { -INT32_C(   559751375),  INT32_C(  1621967357),  INT32_C(   274947901), -INT32_C(  1961087324) } },
    { {  INT32_C(  1465017011),  INT32_C(   165834345),  INT32_C(  1676549100),  INT32_C(  1609443050) },
      { -INT8_C( 106), -INT8_C( 104),  INT8_C(  63),  INT8_C( 107), -INT8_C(  79),  INT8_C(  72), -INT8_C(   8), -INT8_C(  80),
        -INT8_C(  12),  INT8_C(  98),  INT8_C(  78), -INT8_C( 114),  INT8_C( 121),  INT8_C(  77), -INT8_C(  48),  INT8_C(  44) },
      { -INT8_C(  80),  INT8_C(  35), -INT8_C( 125),  INT8_C(  25), -INT8_C( 111),  INT8_C( 101),  INT8_C(  34),  INT8_C( 126) },
       INT32_C(           1),
      {  INT32_C(  1465033897),  INT32_C(   165840034),  INT32_C(  1676548618),  INT32_C(  1609441308) } },
    { {  INT32_C(  1809911937), -INT32_C(   859058122),  INT32_C(   423103080),  INT32_C(  1204367443) },
      { -INT8_C( 110),  INT8_C(  23), -INT8_C(  43),  INT8_C(  11),  INT8_C( 101), -INT8_C(  91),  INT8_C(  55),  INT8_C(  21),
        -INT8_C(  56), -INT8_C(  70),  INT8_C(  46),  INT8_C(  90),  INT8_C(  32),  INT8_C(  80), -INT8_C(  40), -INT8_C(  95) },
      {  INT8_C(  96), -INT8_C(  71),  INT8_C(  12), -INT8_C( 105), -INT8_C( 119), -INT8_C(  41),  INT8_C(  99), -INT8_C(  15) },
       INT32_C(           0),
      {  INT32_C(  1809898073), -INT32_C(   859043510),  INT32_C(   423093776),  INT32_C(  1204374330) } },
    { {  INT32_C(   889887714),  INT32_C(  1585238987),  INT32_C(  1349079531), -INT32_C(  1083858442) },
      {  INT8_C(  91), -INT8_C( 109),  INT8_C(  25),  INT8_C( 123), -INT8_C(  29), -INT8_C(  15),  INT8_C(  28),  INT8_C(  67),
        -INT8_C(  86),  INT8_C(  41), -INT8_C(  38),  INT8_C(  52),  INT8_C(   0),  INT8_C(  62),  INT8_C(  37), -INT8_C(  30) },
      { -INT8_C(  39),  INT8_C(  48),  INT8_C(  23), -INT8_C(  91),  INT8_C(   3), -INT8_C( 109),  INT8_C(   3), -INT8_C(  18) },
       INT32_C(           1),
      {  INT32_C(   889897729),  INT32_C(  1585239413),  INT32_C(  1349073754), -INT32_C(  1083864549) } },
    { { -INT32_C(   616665884),  INT32_C(  1771741965),  INT32_C(   434418486),  INT32_C(  1314718116) },
      {  INT8_C(  42),  INT8_C(  55), -INT8_C( 126),  INT8_C(  42),  INT8_C( 117), -INT8_C(  88),  INT8_C(  13),  INT8_C(  79),
        -INT8_C(  40),  INT8_C(  36), -INT8_C(  12), -INT8_C(  37), -INT8_C(  72), -INT8_C(   9), -INT8_C(  54), -INT8_C( 100) },
      {  INT8_C(  99),  INT8_C(   8),  INT8_C( 119),  INT8_C( 113), -INT8_C(  84),  INT8_C(  17), -INT8_C(  38), -INT8_C(  30) },
       INT32_C(           0),
      { -INT32_C(   616671534),  INT32_C(  1771763318),  INT32_C(   434409205),  INT32_C(  1314693190) } },
    { {  INT32_C(  1761394372), -INT32_C(   373859905),  INT32_C(   101988752), -INT32_C(  1185603103) },
      {  INT8_C(  69),  INT8_C(  73), -INT8_C( 107), -INT8_C(   3),  INT8_C(  64),  INT8_C(  95), -INT8_C( 102), -INT8_C(  93),
         INT8_C( 103),  INT8_C(  17),  INT8_C(  20),  INT8_C(  19),  INT8_C(  35), -INT8_C(  18), -INT8_C(  10), -INT8_C(  25) },
      { -INT8_C(  83), -INT8_C(  14),  INT8_C(  80),  INT8_C( 108),  INT8_C(  75),  INT8_C(   7),  INT8_C(  86), -INT8_C(  37) },
       INT32_C(           1),
      {  INT32_C(  1761390967), -INT32_C(   373859771),  INT32_C(   101997613), -INT32_C(  1185600539) } },
    { {  INT32_C(   585198144), -INT32_C(   790940021), -INT32_C(  1076989825),  INT32_C(   929261775) },
      {  INT8_C( 121),  INT8_C( 119),  INT8_C(  74), -INT8_C( 100),  INT8_C( 102),  INT8_C(  64), -INT8_C( 124),  INT8_C(  19),
         INT8_C(  50), -INT8_C(  44),      INT8_MAX,  INT8_C( 125), -INT8_C(  37), -INT8_C(  43),  INT8_C(  89),  INT8_C(  27) },
      {  INT8_C(  63),  INT8_C(  58),  INT8_C(  61), -INT8_C(  54),  INT8_C( 113),  INT8_C(  25), -INT8_C( 101), -INT8_C(  16) },
       INT32_C(           0),
      {  INT32_C(   585222583), -INT32_C(   790938473), -INT32_C(  1076988230),  INT32_C(   929260921) } },
    { {  INT32_C(  1504733577),  INT32_C(  1250956241), -INT32_C(   253240694),  INT32_C(  1292069659) },
      {  INT8_C(  63), -INT8_C( 125), -INT8_C(  53),  INT8_C(  26),  INT8_C(  88),  INT8_C(  36),  INT8_C(  53), -INT8_C( 104),
         INT8_C(  94),  INT8_C( 115),  INT8_C(  98), -INT8_C(  49), -INT8_C( 116), -INT8_C(   3), -INT8_C(  64),  INT8_C(  21) },
      {  INT8_C( 102),  INT8_C( 112),  INT8_C( 110),  INT8_C(  55), -INT8_C( 125), -INT8_C(   2), -INT8_C( 126),  INT8_C(  13) },
       INT32_C(           1),
      {  INT32_C(  1504732968),  INT32_C(  1250937139), -INT32_C(   253265659),  INT32_C(  1292092502) } }
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int32x4_t r_ = simde_vld1q_s32(test_vec[i].r_);
    simde_int8x16_t a = simde_vld1q_s8(test_vec[i].a);
    simde_int8x8_t b = simde_vld1_s8(test_vec[i].b);
    simde_int32x4_t r;

    SIMDE_CONSTIFY_2_(simde_vdotq_lane_s32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_s32(INT32_C(0))), test_vec[i].lane, r_, a, b);

    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, 0, 1, 0, 1, 0, 1 };
  for (int i = 0 ; i < 8 ; i++) {
    simde_int32x4_t r_ = simde_test_arm_neon_random_i32x4();
    simde_int8x16_t a = simde_test_arm_neon_random_i8x16();
    simde_int8x8_t b = simde_test_arm_neon_random_i8x8();
    simde_int32x4_t r = simde_vdotq_lane_s32(r_, a, b, lanes[i]);

    simde_test_arm_neon_write_i32x4(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i8x16(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    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_i32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vbfdot_lane_f32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    simde_float32_t r_[2];
    simde_bfloat16_t a[4];
    simde_bfloat16_t b[4];
    const int lane;
    simde_float32_t r[2];
  } test_vec[] = {
    { { SIMDE_FLOAT32_C(  -149.82), SIMDE_FLOAT32_C(   786.97) },
      { SIMDE_BFLOAT16_VALUE(    91.00), SIMDE_BFLOAT16_VALUE(   -20.75), SIMDE_BFLOAT16_VALUE(    39.50), SIMDE_BFLOAT16_VALUE(   -76.50) },
      { SIMDE_BFLOAT16_VALUE(    11.75), SIMDE_BFLOAT16_VALUE(    81.00), SIMDE_BFLOAT16_VALUE(    -1.40), SIMDE_BFLOAT16_VALUE(   -54.25) },
      INT32_C(           0),
      { SIMDE_FLOAT32_C(  -761.32), SIMDE_FLOAT32_C( -4945.41) } },
    { { SIMDE_FLOAT32_C(   -27.31), SIMDE_FLOAT32_C(   520.43) },
      { SIMDE_BFLOAT16_VALUE(   -23.12), SIMDE_BFLOAT16_VALUE(   -58.00), SIMDE_BFLOAT16_VALUE(    19.50), SIMDE_BFLOAT16_VALUE(    62.00) },
      { SIMDE_BFLOAT16_VALUE(     9.44), SIMDE_BFLOAT16_VALUE(   -14.56), SIMDE_BFLOAT16_VALUE(   -38.50), SIMDE_BFLOAT16_VALUE(   -84.00) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C(  5735.00), SIMDE_FLOAT32_C( -5438.32) } },
    { { SIMDE_FLOAT32_C(  -132.86), SIMDE_FLOAT32_C(   -52.12) },
      { SIMDE_BFLOAT16_VALUE(    -8.50), SIMDE_BFLOAT16_VALUE(    -9.56), SIMDE_BFLOAT16_VALUE(   -36.75), SIMDE_BFLOAT16_VALUE(    11.19) },
      { SIMDE_BFLOAT16_VALUE(    61.50), SIMDE_BFLOAT16_VALUE(   -45.75), SIMDE_BFLOAT16_VALUE(   -15.81), SIMDE_BFLOAT16_VALUE(   -53.25) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C(   510.75), SIMDE_FLOAT32_C(   -66.74) } },
    { { SIMDE_FLOAT32_C(  -246.78), SIMDE_FLOAT32_C(   258.80) },
      { SIMDE_BFLOAT16_VALUE(    72.50), SIMDE_BFLOAT16_VALUE(    -1.24), SIMDE_BFLOAT16_VALUE(   -62.25), SIMDE_BFLOAT16_VALUE(    53.25) },
      { SIMDE_BFLOAT16_VALUE(    97.50), SIMDE_BFLOAT16_VALUE(   -16.62), SIMDE_BFLOAT16_VALUE(    81.50), SIMDE_BFLOAT16_VALUE(    -5.38) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C(  6842.62), SIMDE_FLOAT32_C( -6695.86) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float32x2_t r_ = simde_vld1_f32(test_vec[i].r_);
    simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a);
    simde_bfloat16x4_t b = simde_vld1_bf16(test_vec[i].b);
    simde_float32x2_t r;

    SIMDE_CONSTIFY_2_(simde_vbfdot_lane_f32, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, r_, a, b);

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

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 4 ; i++) {
    simde_float32x2_t r_ = simde_test_arm_neon_random_f32x2(-1000.0, 1000.0);
    simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0));
    simde_bfloat16x4_t b = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0));
    int lane = simde_test_codegen_random_i8() & 1;
    simde_float32x2_t r;
    SIMDE_CONSTIFY_2_(simde_vbfdot_lane_f32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_f32(0.0f)), lane, r_, a, b);

    simde_test_arm_neon_write_f32x2(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_bf16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lane, 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_vbfdotq_lane_f32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    simde_float32_t r_[4];
    simde_bfloat16_t a[8];
    simde_bfloat16_t b[4];
    const int lane;
    simde_float32_t r[4];
  } test_vec[] = {
    { { SIMDE_FLOAT32_C(  -716.46), SIMDE_FLOAT32_C(   325.35), SIMDE_FLOAT32_C(  -139.56), SIMDE_FLOAT32_C(   137.36) },
      { SIMDE_BFLOAT16_VALUE(   -91.50), SIMDE_BFLOAT16_VALUE(    14.94), SIMDE_BFLOAT16_VALUE(     1.34), SIMDE_BFLOAT16_VALUE(   -28.50),
        SIMDE_BFLOAT16_VALUE(    99.50), SIMDE_BFLOAT16_VALUE(    -2.69), SIMDE_BFLOAT16_VALUE(   -48.50), SIMDE_BFLOAT16_VALUE(     5.62) },
      { SIMDE_BFLOAT16_VALUE(   -39.75), SIMDE_BFLOAT16_VALUE(   -89.00), SIMDE_BFLOAT16_VALUE(    20.75), SIMDE_BFLOAT16_VALUE(   -19.00) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C(  1591.23), SIMDE_FLOAT32_C(  2808.44), SIMDE_FLOAT32_C( -3855.50), SIMDE_FLOAT32_C(  1564.61) } },
    { { SIMDE_FLOAT32_C(  -555.68), SIMDE_FLOAT32_C(  -136.93), SIMDE_FLOAT32_C(  -701.24), SIMDE_FLOAT32_C(   181.13) },
      { SIMDE_BFLOAT16_VALUE(     0.85), SIMDE_BFLOAT16_VALUE(   -36.75), SIMDE_BFLOAT16_VALUE(    43.50), SIMDE_BFLOAT16_VALUE(    38.50),
        SIMDE_BFLOAT16_VALUE(    -7.00), SIMDE_BFLOAT16_VALUE(    75.00), SIMDE_BFLOAT16_VALUE(   -23.25), SIMDE_BFLOAT16_VALUE(   -58.00) },
      { SIMDE_BFLOAT16_VALUE(   -59.75), SIMDE_BFLOAT16_VALUE(   -74.50), SIMDE_BFLOAT16_VALUE(   -29.75), SIMDE_BFLOAT16_VALUE(    72.50) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C(  2131.31), SIMDE_FLOAT32_C( -5604.30), SIMDE_FLOAT32_C( -5870.49), SIMDE_FLOAT32_C(  5891.32) } },
    { { SIMDE_FLOAT32_C(   839.64), SIMDE_FLOAT32_C(   812.75), SIMDE_FLOAT32_C(  -737.26), SIMDE_FLOAT32_C(  -146.98) },
      { SIMDE_BFLOAT16_VALUE(   -47.25), SIMDE_BFLOAT16_VALUE(   -74.00), SIMDE_BFLOAT16_VALUE(    82.50), SIMDE_BFLOAT16_VALUE(     4.28),
        SIMDE_BFLOAT16_VALUE(    31.50), SIMDE_BFLOAT16_VALUE(   -57.00), SIMDE_BFLOAT16_VALUE(    15.19), SIMDE_BFLOAT16_VALUE(   -47.75) },
      { SIMDE_BFLOAT16_VALUE(    24.00), SIMDE_BFLOAT16_VALUE(    74.50), SIMDE_BFLOAT16_VALUE(    -3.28), SIMDE_BFLOAT16_VALUE(   -89.50) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C( -5807.36), SIMDE_FLOAT32_C(  3111.70), SIMDE_FLOAT32_C( -4227.76), SIMDE_FLOAT32_C( -3339.85) } },
    { { SIMDE_FLOAT32_C(  -851.72), SIMDE_FLOAT32_C(   111.17), SIMDE_FLOAT32_C(  -320.42), SIMDE_FLOAT32_C(   583.32) },
      { SIMDE_BFLOAT16_VALUE(   -50.25), SIMDE_BFLOAT16_VALUE(    61.00), SIMDE_BFLOAT16_VALUE(    33.25), SIMDE_BFLOAT16_VALUE(    26.38),
        SIMDE_BFLOAT16_VALUE(   -97.00), SIMDE_BFLOAT16_VALUE(    73.50), SIMDE_BFLOAT16_VALUE(    51.75), SIMDE_BFLOAT16_VALUE(   -26.88) },
      { SIMDE_BFLOAT16_VALUE(    46.25), SIMDE_BFLOAT16_VALUE(   -37.00), SIMDE_BFLOAT16_VALUE(   -43.00), SIMDE_BFLOAT16_VALUE(    27.38) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C( -5432.78), SIMDE_FLOAT32_C(   673.11), SIMDE_FLOAT32_C( -7526.17), SIMDE_FLOAT32_C(  3971.13) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float32x4_t r_ = simde_vld1q_f32(test_vec[i].r_);
    simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a);
    simde_bfloat16x4_t b = simde_vld1_bf16(test_vec[i].b);
    simde_float32x4_t r;

    SIMDE_CONSTIFY_2_(simde_vbfdotq_lane_f32, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, r_, a, b);

    simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1);
  }

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 4 ; i++) {
    simde_float32x4_t r_ = simde_test_arm_neon_random_f32x4(-1000.0, 1000.0);
    simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0));
    simde_bfloat16x4_t b = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0));
    int lane = simde_test_codegen_random_i8() & 1;
    simde_float32x4_t r;
    SIMDE_CONSTIFY_2_(simde_vbfdotq_lane_f32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_f32(0.0f)), lane, r_, a, b);

    simde_test_arm_neon_write_f32x4(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_bf16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lane, 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_vbfdot_laneq_f32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    simde_float32_t r_[2];
    simde_bfloat16_t a[4];
    simde_bfloat16_t b[8];
    const int lane;
    simde_float32_t r[2];
  } test_vec[] = {
    { { SIMDE_FLOAT32_C(   587.89), SIMDE_FLOAT32_C(   435.61) },
      { SIMDE_BFLOAT16_VALUE(   -74.00), SIMDE_BFLOAT16_VALUE(   -43.50), SIMDE_BFLOAT16_VALUE(    57.75), SIMDE_BFLOAT16_VALUE(   -15.00) },
      { SIMDE_BFLOAT16_VALUE(    46.75), SIMDE_BFLOAT16_VALUE(   -85.00), SIMDE_BFLOAT16_VALUE(   -13.88), SIMDE_BFLOAT16_VALUE(   -56.25),
        SIMDE_BFLOAT16_VALUE(   -48.25), SIMDE_BFLOAT16_VALUE(   -97.50), SIMDE_BFLOAT16_VALUE(   -33.50), SIMDE_BFLOAT16_VALUE(   -22.38) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C(  4061.52), SIMDE_FLOAT32_C(   478.08) } },
    { { SIMDE_FLOAT32_C(   950.19), SIMDE_FLOAT32_C(   622.60) },
      { SIMDE_BFLOAT16_VALUE(    29.75), SIMDE_BFLOAT16_VALUE(   -47.50), SIMDE_BFLOAT16_VALUE(   -95.00), SIMDE_BFLOAT16_VALUE(    57.75) },
      { SIMDE_BFLOAT16_VALUE(   -76.50), SIMDE_BFLOAT16_VALUE(    10.38), SIMDE_BFLOAT16_VALUE(   -58.75), SIMDE_BFLOAT16_VALUE(     9.19),
        SIMDE_BFLOAT16_VALUE(   -18.62), SIMDE_BFLOAT16_VALUE(   -96.50), SIMDE_BFLOAT16_VALUE(    70.00), SIMDE_BFLOAT16_VALUE(    79.00) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C( -1818.50), SIMDE_FLOAT32_C(  8489.26) } },
    { { SIMDE_FLOAT32_C(  -621.37), SIMDE_FLOAT32_C(   377.94) },
      { SIMDE_BFLOAT16_VALUE(    81.50), SIMDE_BFLOAT16_VALUE(   -36.00), SIMDE_BFLOAT16_VALUE(    94.50), SIMDE_BFLOAT16_VALUE(    39.25) },
      { SIMDE_BFLOAT16_VALUE(    49.00), SIMDE_BFLOAT16_VALUE(    41.25), SIMDE_BFLOAT16_VALUE(    54.00), SIMDE_BFLOAT16_VALUE(   -65.00),
        SIMDE_BFLOAT16_VALUE(    85.00), SIMDE_BFLOAT16_VALUE(   -94.50), SIMDE_BFLOAT16_VALUE(   -62.50), SIMDE_BFLOAT16_VALUE(   -48.75) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C(  6119.63), SIMDE_FLOAT32_C(  2929.69) } },
    { { SIMDE_FLOAT32_C(  -384.17), SIMDE_FLOAT32_C(  -536.21) },
      { SIMDE_BFLOAT16_VALUE(   -54.50), SIMDE_BFLOAT16_VALUE(    91.50), SIMDE_BFLOAT16_VALUE(    -1.21), SIMDE_BFLOAT16_VALUE(   -49.25) },
      { SIMDE_BFLOAT16_VALUE(    49.25), SIMDE_BFLOAT16_VALUE(    22.00), SIMDE_BFLOAT16_VALUE(    61.25), SIMDE_BFLOAT16_VALUE(    90.50),
        SIMDE_BFLOAT16_VALUE(   -69.00), SIMDE_BFLOAT16_VALUE(   -57.50), SIMDE_BFLOAT16_VALUE(    94.00), SIMDE_BFLOAT16_VALUE(   -98.50) },
       INT32_C(           2),
      { SIMDE_FLOAT32_C( -1884.92), SIMDE_FLOAT32_C(  2379.22) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float32x2_t r_ = simde_vld1_f32(test_vec[i].r_);
    simde_bfloat16x4_t a = simde_vld1_bf16(test_vec[i].a);
    simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b);
    simde_float32x2_t r;

    SIMDE_CONSTIFY_4_(simde_vbfdot_laneq_f32, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, r_, a, b);

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

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 4 ; i++) {
    simde_float32x2_t r_ = simde_test_arm_neon_random_f32x2(-1000.0, 1000.0);
    simde_bfloat16x4_t a = simde_test_arm_neon_random_bf16x4(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0));
    simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0));
    int lane = simde_test_codegen_random_i8() & 3;
    simde_float32x2_t r;
    SIMDE_CONSTIFY_4_(simde_vbfdot_laneq_f32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_f32(0.0f)), lane, r_, a, b);

    simde_test_arm_neon_write_f32x2(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_bf16x4(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lane, 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_vbfdotq_laneq_f32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    simde_float32_t r_[4];
    simde_bfloat16_t a[8];
    simde_bfloat16_t b[8];
    const int lane;
    simde_float32_t r[4];
  } test_vec[] = {
    { { SIMDE_FLOAT32_C(   227.56), SIMDE_FLOAT32_C(   208.46), SIMDE_FLOAT32_C(   840.03), SIMDE_FLOAT32_C(   133.04) },
      { SIMDE_BFLOAT16_VALUE(   -86.50), SIMDE_BFLOAT16_VALUE(    76.50), SIMDE_BFLOAT16_VALUE(    32.25), SIMDE_BFLOAT16_VALUE(    88.00),
        SIMDE_BFLOAT16_VALUE(     0.74), SIMDE_BFLOAT16_VALUE(    12.81), SIMDE_BFLOAT16_VALUE(    55.25), SIMDE_BFLOAT16_VALUE(    80.50) },
      { SIMDE_BFLOAT16_VALUE(   -37.50), SIMDE_BFLOAT16_VALUE(   -28.50), SIMDE_BFLOAT16_VALUE(     6.06), SIMDE_BFLOAT16_VALUE(    -3.45),
        SIMDE_BFLOAT16_VALUE(   -88.00), SIMDE_BFLOAT16_VALUE(    61.50), SIMDE_BFLOAT16_VALUE(   -89.50), SIMDE_BFLOAT16_VALUE(   -29.25) },
       INT32_C(           2),
      { SIMDE_FLOAT32_C( 12544.31), SIMDE_FLOAT32_C(  2782.46), SIMDE_FLOAT32_C(  1563.03), SIMDE_FLOAT32_C(   221.79) } },
    { { SIMDE_FLOAT32_C(  -671.68), SIMDE_FLOAT32_C(   569.68), SIMDE_FLOAT32_C(  -658.75), SIMDE_FLOAT32_C(  -929.73) },
      { SIMDE_BFLOAT16_VALUE(    -9.44), SIMDE_BFLOAT16_VALUE(   -41.75), SIMDE_BFLOAT16_VALUE(   -50.50), SIMDE_BFLOAT16_VALUE(    38.50),
        SIMDE_BFLOAT16_VALUE(   -83.00), SIMDE_BFLOAT16_VALUE(    70.00), SIMDE_BFLOAT16_VALUE(   -38.50), SIMDE_BFLOAT16_VALUE(    37.75) },
      { SIMDE_BFLOAT16_VALUE(    54.00), SIMDE_BFLOAT16_VALUE(    74.50), SIMDE_BFLOAT16_VALUE(    51.25), SIMDE_BFLOAT16_VALUE(    30.50),
        SIMDE_BFLOAT16_VALUE(     7.00), SIMDE_BFLOAT16_VALUE(    39.00), SIMDE_BFLOAT16_VALUE(   -68.50), SIMDE_BFLOAT16_VALUE(   -80.00) },
       INT32_C(           1),
      { SIMDE_FLOAT32_C( -2428.73), SIMDE_FLOAT32_C(  -844.20), SIMDE_FLOAT32_C( -2777.50), SIMDE_FLOAT32_C( -1751.48) } },
    { { SIMDE_FLOAT32_C(  -883.22), SIMDE_FLOAT32_C(  -177.38), SIMDE_FLOAT32_C(   657.38), SIMDE_FLOAT32_C(   177.35) },
      { SIMDE_BFLOAT16_VALUE(    79.00), SIMDE_BFLOAT16_VALUE(    78.00), SIMDE_BFLOAT16_VALUE(   -20.75), SIMDE_BFLOAT16_VALUE(    89.50),
        SIMDE_BFLOAT16_VALUE(   -51.25), SIMDE_BFLOAT16_VALUE(    40.50), SIMDE_BFLOAT16_VALUE(   -78.00), SIMDE_BFLOAT16_VALUE(   -94.50) },
      { SIMDE_BFLOAT16_VALUE(    74.50), SIMDE_BFLOAT16_VALUE(   -71.00), SIMDE_BFLOAT16_VALUE(    -3.77), SIMDE_BFLOAT16_VALUE(   -67.00),
        SIMDE_BFLOAT16_VALUE(   -21.38), SIMDE_BFLOAT16_VALUE(   -65.00), SIMDE_BFLOAT16_VALUE(   -50.00), SIMDE_BFLOAT16_VALUE(   -51.25) },
       INT32_C(           2),
      { SIMDE_FLOAT32_C( -7641.84), SIMDE_FLOAT32_C( -5551.35), SIMDE_FLOAT32_C(  -879.65), SIMDE_FLOAT32_C(  7987.10) } },
    { { SIMDE_FLOAT32_C(   876.90), SIMDE_FLOAT32_C(  -971.55), SIMDE_FLOAT32_C(  -290.86), SIMDE_FLOAT32_C(   389.10) },
      { SIMDE_BFLOAT16_VALUE(    33.50), SIMDE_BFLOAT16_VALUE(    78.00), SIMDE_BFLOAT16_VALUE(   -22.12), SIMDE_BFLOAT16_VALUE(    64.50),
        SIMDE_BFLOAT16_VALUE(    97.50), SIMDE_BFLOAT16_VALUE(    72.00), SIMDE_BFLOAT16_VALUE(    76.50), SIMDE_BFLOAT16_VALUE(   -20.00) },
      { SIMDE_BFLOAT16_VALUE(    37.75), SIMDE_BFLOAT16_VALUE(    -5.91), SIMDE_BFLOAT16_VALUE(   -41.25), SIMDE_BFLOAT16_VALUE(    15.75),
        SIMDE_BFLOAT16_VALUE(    73.50), SIMDE_BFLOAT16_VALUE(   -52.00), SIMDE_BFLOAT16_VALUE(    64.50), SIMDE_BFLOAT16_VALUE(    13.88) },
       INT32_C(           0),
      { SIMDE_FLOAT32_C(  1680.84), SIMDE_FLOAT32_C( -2187.72), SIMDE_FLOAT32_C(  2964.52), SIMDE_FLOAT32_C(  3395.10) } },
  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float32x4_t r_ = simde_vld1q_f32(test_vec[i].r_);
    simde_bfloat16x8_t a = simde_vld1q_bf16(test_vec[i].a);
    simde_bfloat16x8_t b = simde_vld1q_bf16(test_vec[i].b);
    simde_float32x4_t r;

    SIMDE_CONSTIFY_4_(simde_vbfdotq_laneq_f32, r, (HEDLEY_UNREACHABLE(), r), test_vec[i].lane, r_, a, b);

    simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1);
  }

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 4 ; i++) {
    simde_float32x4_t r_ = simde_test_arm_neon_random_f32x4(-1000.0, 1000.0);
    simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0));
    simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0));
    int lane = simde_test_codegen_random_i8() & 3;
    simde_float32x4_t r;
    SIMDE_CONSTIFY_4_(simde_vbfdotq_laneq_f32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_f32(0.0f)), lane, r_, a, b);

    simde_test_arm_neon_write_f32x4(2, r_, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_bf16x8(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_bf16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_codegen_write_i32(2, lane, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

SIMDE_TEST_FUNC_LIST_BEGIN
SIMDE_TEST_FUNC_LIST_ENTRY(vdot_lane_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vdot_lane_u32)

SIMDE_TEST_FUNC_LIST_ENTRY(vdot_laneq_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vdot_laneq_u32)

SIMDE_TEST_FUNC_LIST_ENTRY(vdotq_laneq_u32)
SIMDE_TEST_FUNC_LIST_ENTRY(vdotq_laneq_s32)

SIMDE_TEST_FUNC_LIST_ENTRY(vdotq_lane_u32)
SIMDE_TEST_FUNC_LIST_ENTRY(vdotq_lane_s32)

SIMDE_TEST_FUNC_LIST_ENTRY(vbfdot_lane_f32)
SIMDE_TEST_FUNC_LIST_ENTRY(vbfdotq_lane_f32)
SIMDE_TEST_FUNC_LIST_ENTRY(vbfdot_laneq_f32)
SIMDE_TEST_FUNC_LIST_ENTRY(vbfdotq_laneq_f32)
SIMDE_TEST_FUNC_LIST_END

#include "test-neon-footer.h"