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

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

static int
test_simde_vsubh_f16 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    simde_float16_t a;
    simde_float16_t b;
    simde_float16_t r;
  } test_vec[] = {
    { SIMDE_FLOAT16_VALUE(   167.25),
      SIMDE_FLOAT16_VALUE(   952.00),
      SIMDE_FLOAT16_VALUE(  -785.00) },
    { SIMDE_FLOAT16_VALUE(  -942.50),
      SIMDE_FLOAT16_VALUE(  -623.50),
      SIMDE_FLOAT16_VALUE(  -319.00) },
    { SIMDE_FLOAT16_VALUE(    -1.52),
      SIMDE_FLOAT16_VALUE(   118.88),
      SIMDE_FLOAT16_VALUE(  -120.38) },
    { SIMDE_FLOAT16_VALUE(  -734.00),
      SIMDE_FLOAT16_VALUE(    63.38),
      SIMDE_FLOAT16_VALUE(  -797.50) },
    { SIMDE_FLOAT16_VALUE(  -352.00),
      SIMDE_FLOAT16_VALUE(  -409.00),
      SIMDE_FLOAT16_VALUE(    57.00) },
    { SIMDE_FLOAT16_VALUE(   191.75),
      SIMDE_FLOAT16_VALUE(   388.75),
      SIMDE_FLOAT16_VALUE(  -197.00) },
    { SIMDE_FLOAT16_VALUE(   835.50),
      SIMDE_FLOAT16_VALUE(   550.50),
      SIMDE_FLOAT16_VALUE(   285.00) },
    { SIMDE_FLOAT16_VALUE(  -529.00),
      SIMDE_FLOAT16_VALUE(   873.50),
      SIMDE_FLOAT16_VALUE( -1402.00) }
  };

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

    simde_assert_equal_f16(r, test_vec[i].r, 1);
  }
  return 0;
}

static int
test_simde_vsub_f16 (SIMDE_MUNIT_TEST_ARGS) {
    struct {
      simde_float16_t a[4];
      simde_float16_t b[4];
      simde_float16_t r[4];
    } test_vec[] = {
  { {SIMDE_FLOAT16_VALUE(-49.28), SIMDE_FLOAT16_VALUE(-109.00), SIMDE_FLOAT16_VALUE(-626.50), SIMDE_FLOAT16_VALUE(-567.00)},
    {SIMDE_FLOAT16_VALUE(178.88), SIMDE_FLOAT16_VALUE(-10.22), SIMDE_FLOAT16_VALUE(-976.50), SIMDE_FLOAT16_VALUE(31.19)},
    {SIMDE_FLOAT16_VALUE(-228.12), SIMDE_FLOAT16_VALUE(-98.75), SIMDE_FLOAT16_VALUE(350.00), SIMDE_FLOAT16_VALUE(-598.00)} },
  { {SIMDE_FLOAT16_VALUE(-226.00), SIMDE_FLOAT16_VALUE(-520.50), SIMDE_FLOAT16_VALUE(-252.38), SIMDE_FLOAT16_VALUE(-407.50)},
    {SIMDE_FLOAT16_VALUE(-89.44), SIMDE_FLOAT16_VALUE(200.50), SIMDE_FLOAT16_VALUE(439.75), SIMDE_FLOAT16_VALUE(450.75)},
    {SIMDE_FLOAT16_VALUE(-136.50), SIMDE_FLOAT16_VALUE(-721.00), SIMDE_FLOAT16_VALUE(-692.00), SIMDE_FLOAT16_VALUE(-858.00)} },
  { {SIMDE_FLOAT16_VALUE(-833.00), SIMDE_FLOAT16_VALUE(-714.00), SIMDE_FLOAT16_VALUE(428.50), SIMDE_FLOAT16_VALUE(871.50)},
    {SIMDE_FLOAT16_VALUE(157.12), SIMDE_FLOAT16_VALUE(-972.50), SIMDE_FLOAT16_VALUE(-298.75), SIMDE_FLOAT16_VALUE(919.50)},
    {SIMDE_FLOAT16_VALUE(-990.00), SIMDE_FLOAT16_VALUE(258.50), SIMDE_FLOAT16_VALUE(727.00), SIMDE_FLOAT16_VALUE(-48.00)} },
  { {SIMDE_FLOAT16_VALUE(488.00), SIMDE_FLOAT16_VALUE(112.56), SIMDE_FLOAT16_VALUE(58.66), SIMDE_FLOAT16_VALUE(879.50)},
    {SIMDE_FLOAT16_VALUE(-129.00), SIMDE_FLOAT16_VALUE(858.50), SIMDE_FLOAT16_VALUE(133.88), SIMDE_FLOAT16_VALUE(920.50)},
    {SIMDE_FLOAT16_VALUE(617.00), SIMDE_FLOAT16_VALUE(-746.00), SIMDE_FLOAT16_VALUE(-75.25), SIMDE_FLOAT16_VALUE(-41.00)} },
  { {SIMDE_FLOAT16_VALUE(32.59), SIMDE_FLOAT16_VALUE(239.50), SIMDE_FLOAT16_VALUE(-487.50), SIMDE_FLOAT16_VALUE(853.50)},
    {SIMDE_FLOAT16_VALUE(750.50), SIMDE_FLOAT16_VALUE(510.75), SIMDE_FLOAT16_VALUE(177.50), SIMDE_FLOAT16_VALUE(-23.77)},
    {SIMDE_FLOAT16_VALUE(-718.00), SIMDE_FLOAT16_VALUE(-271.25), SIMDE_FLOAT16_VALUE(-665.00), SIMDE_FLOAT16_VALUE(877.50)} },
  { {SIMDE_FLOAT16_VALUE(-31.45), SIMDE_FLOAT16_VALUE(570.00), SIMDE_FLOAT16_VALUE(616.00), SIMDE_FLOAT16_VALUE(-942.00)},
    {SIMDE_FLOAT16_VALUE(630.50), SIMDE_FLOAT16_VALUE(823.50), SIMDE_FLOAT16_VALUE(392.75), SIMDE_FLOAT16_VALUE(463.25)},
    {SIMDE_FLOAT16_VALUE(-662.00), SIMDE_FLOAT16_VALUE(-253.50), SIMDE_FLOAT16_VALUE(223.25), SIMDE_FLOAT16_VALUE(-1405.00)} },
  { {SIMDE_FLOAT16_VALUE(-537.50), SIMDE_FLOAT16_VALUE(-964.50), SIMDE_FLOAT16_VALUE(-592.00), SIMDE_FLOAT16_VALUE(305.50)},
    {SIMDE_FLOAT16_VALUE(992.00), SIMDE_FLOAT16_VALUE(-707.00), SIMDE_FLOAT16_VALUE(-386.00), SIMDE_FLOAT16_VALUE(-496.00)},
    {SIMDE_FLOAT16_VALUE(-1530.00), SIMDE_FLOAT16_VALUE(-257.50), SIMDE_FLOAT16_VALUE(-206.00), SIMDE_FLOAT16_VALUE(801.50)} },
  { {SIMDE_FLOAT16_VALUE(-180.50), SIMDE_FLOAT16_VALUE(-555.50), SIMDE_FLOAT16_VALUE(375.50), SIMDE_FLOAT16_VALUE(948.50)},
    {SIMDE_FLOAT16_VALUE(413.75), SIMDE_FLOAT16_VALUE(758.50), SIMDE_FLOAT16_VALUE(972.00), SIMDE_FLOAT16_VALUE(-619.00)},
    {SIMDE_FLOAT16_VALUE(-594.00), SIMDE_FLOAT16_VALUE(-1314.00), SIMDE_FLOAT16_VALUE(-596.50), SIMDE_FLOAT16_VALUE(1568.00)} }
    };

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

      a = simde_vld1_f16(test_vec[i].a);
      b = simde_vld1_f16(test_vec[i].b);
      r = simde_vsub_f16(a, b);

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

    return 0;
}

static int
test_simde_vsub_f32 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    simde_float32 a[2];
    simde_float32 b[2];
    simde_float32 r[2];
  } test_vec[] = {
    { { SIMDE_FLOAT32_C(   360.99), SIMDE_FLOAT32_C(   722.92) },
      { SIMDE_FLOAT32_C(   682.14), SIMDE_FLOAT32_C(   426.96) },
      { SIMDE_FLOAT32_C(  -321.15), SIMDE_FLOAT32_C(   295.96) } },
    { { SIMDE_FLOAT32_C(   -11.59), SIMDE_FLOAT32_C(   342.55) },
      { SIMDE_FLOAT32_C(   590.06), SIMDE_FLOAT32_C(   965.15) },
      { SIMDE_FLOAT32_C(  -601.65), SIMDE_FLOAT32_C(  -622.60) } },
    { { SIMDE_FLOAT32_C(   547.91), SIMDE_FLOAT32_C(  -219.14) },
      { SIMDE_FLOAT32_C(  -886.88), SIMDE_FLOAT32_C(   282.47) },
      { SIMDE_FLOAT32_C(  1434.79), SIMDE_FLOAT32_C(  -501.61) } },
    { { SIMDE_FLOAT32_C(    13.06), SIMDE_FLOAT32_C(   946.64) },
      { SIMDE_FLOAT32_C(   963.27), SIMDE_FLOAT32_C(   959.34) },
      { SIMDE_FLOAT32_C(  -950.22), SIMDE_FLOAT32_C(   -12.70) } },
    { { SIMDE_FLOAT32_C(   829.13), SIMDE_FLOAT32_C(  -382.80) },
      { SIMDE_FLOAT32_C(  -854.14), SIMDE_FLOAT32_C(   146.76) },
      { SIMDE_FLOAT32_C(  1683.27), SIMDE_FLOAT32_C(  -529.55) } },
    { { SIMDE_FLOAT32_C(    73.22), SIMDE_FLOAT32_C(  -493.34) },
      { SIMDE_FLOAT32_C(   912.86), SIMDE_FLOAT32_C(   976.77) },
      { SIMDE_FLOAT32_C(  -839.64), SIMDE_FLOAT32_C( -1470.11) } },
    { { SIMDE_FLOAT32_C(   314.03), SIMDE_FLOAT32_C(  -507.33) },
      { SIMDE_FLOAT32_C(   923.09), SIMDE_FLOAT32_C(  -827.02) },
      { SIMDE_FLOAT32_C(  -609.06), SIMDE_FLOAT32_C(   319.69) } },
    { { SIMDE_FLOAT32_C(  -988.72), SIMDE_FLOAT32_C(  -917.98) },
      { SIMDE_FLOAT32_C(  -195.14), SIMDE_FLOAT32_C(   372.28) },
      { SIMDE_FLOAT32_C(  -793.58), SIMDE_FLOAT32_C( -1290.26) } }
  };  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_float32x2_t a, b, r;

    a = simde_vld1_f32(test_vec[i].a);
    b = simde_vld1_f32(test_vec[i].b);
    r = simde_vsub_f32(a, b);

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

  return 0;
}

static int
test_simde_vsub_f64 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    simde_float64 a[1];
    simde_float64 b[1];
    simde_float64 r[1];
  } test_vec[] = {
    { { SIMDE_FLOAT64_C(  -464.36) },
      { SIMDE_FLOAT64_C(   759.96) },
      { SIMDE_FLOAT64_C( -1224.33) } },
    { { SIMDE_FLOAT64_C(   959.10) },
      { SIMDE_FLOAT64_C(   297.97) },
      { SIMDE_FLOAT64_C(   661.13) } },
    { { SIMDE_FLOAT64_C(   736.45) },
      { SIMDE_FLOAT64_C(  -164.58) },
      { SIMDE_FLOAT64_C(   901.03) } },
    { { SIMDE_FLOAT64_C(   849.22) },
      { SIMDE_FLOAT64_C(   985.27) },
      { SIMDE_FLOAT64_C(  -136.05) } },
    { { SIMDE_FLOAT64_C(   917.24) },
      { SIMDE_FLOAT64_C(   640.75) },
      { SIMDE_FLOAT64_C(   276.49) } },
    { { SIMDE_FLOAT64_C(   422.18) },
      { SIMDE_FLOAT64_C(   767.10) },
      { SIMDE_FLOAT64_C(  -344.92) } },
    { { SIMDE_FLOAT64_C(  -365.38) },
      { SIMDE_FLOAT64_C(   691.56) },
      { SIMDE_FLOAT64_C( -1056.93) } },
    { { SIMDE_FLOAT64_C(   655.10) },
      { SIMDE_FLOAT64_C(   559.29) },
      { SIMDE_FLOAT64_C(    95.82) } }
  };

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

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

  return 0;
}

static int
test_simde_vsub_s8 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    int8_t a[8];
    int8_t b[8];
    int8_t r[8];
  } test_vec[] = {
    { { -INT8_C(  86),  INT8_C(  59), -INT8_C( 116), -INT8_C( 123), -INT8_C(  44), -INT8_C( 120),  INT8_C(  28), -INT8_C( 104) },
      { -INT8_C( 122),  INT8_C( 123), -INT8_C(  26),  INT8_C(  51),  INT8_C(  71), -INT8_C(  64),  INT8_C( 123),  INT8_C(  12) },
      {  INT8_C(  36), -INT8_C(  64), -INT8_C(  90),  INT8_C(  82), -INT8_C( 115), -INT8_C(  56), -INT8_C(  95), -INT8_C( 116) } },
    { { -INT8_C(  23), -INT8_C(   9), -INT8_C(  81), -INT8_C(  94),  INT8_C(  57), -INT8_C(  16), -INT8_C(  81), -INT8_C( 110) },
      { -INT8_C(  28),  INT8_C( 125), -INT8_C(  21), -INT8_C(  64),  INT8_C(  43),  INT8_C(  80),  INT8_C(  73), -INT8_C(  43) },
      {  INT8_C(   5),  INT8_C( 122), -INT8_C(  60), -INT8_C(  30),  INT8_C(  14), -INT8_C(  96),  INT8_C( 102), -INT8_C(  67) } },
    { { -INT8_C( 116), -INT8_C(  43),  INT8_C(  91),  INT8_C(  96),  INT8_C(  94),  INT8_C( 119), -INT8_C(   8), -INT8_C(  28) },
      { -INT8_C(  14), -INT8_C(  34),  INT8_C(  24),  INT8_C(  57), -INT8_C(  98), -INT8_C( 109),  INT8_C(  69), -INT8_C( 121) },
      { -INT8_C( 102), -INT8_C(   9),  INT8_C(  67),  INT8_C(  39), -INT8_C(  64), -INT8_C(  28), -INT8_C(  77),  INT8_C(  93) } },
    { { -INT8_C( 118), -INT8_C(  12),  INT8_C(  42), -INT8_C(  60), -INT8_C(  28), -INT8_C(  39),  INT8_C(  86), -INT8_C(  55) },
      {  INT8_C(  86),  INT8_C(  65), -INT8_C( 119), -INT8_C( 126), -INT8_C( 110), -INT8_C(  46),  INT8_C(  87),  INT8_C(  30) },
      {  INT8_C(  52), -INT8_C(  77), -INT8_C(  95),  INT8_C(  66),  INT8_C(  82),  INT8_C(   7), -INT8_C(   1), -INT8_C(  85) } },
    { { -INT8_C(  89), -INT8_C(  78),  INT8_C( 126),  INT8_C(   5),  INT8_C(  41),  INT8_C( 118), -INT8_C(  22),  INT8_C(  27) },
      {  INT8_C(  84),  INT8_C(   2),  INT8_C(  84), -INT8_C(  13), -INT8_C( 107), -INT8_C( 102),  INT8_C( 122),  INT8_C(  31) },
      {  INT8_C(  83), -INT8_C(  80),  INT8_C(  42),  INT8_C(  18), -INT8_C( 108), -INT8_C(  36),  INT8_C( 112), -INT8_C(   4) } },
    { { -INT8_C( 114), -INT8_C(  92), -INT8_C(  29),  INT8_C( 115),  INT8_C( 126),  INT8_C(  57),  INT8_C(  60), -INT8_C(  44) },
      {  INT8_C( 123), -INT8_C(  59),  INT8_C(  86),  INT8_C(  13), -INT8_C( 105), -INT8_C(  82),  INT8_C(  43),  INT8_C(  62) },
      {  INT8_C(  19), -INT8_C(  33), -INT8_C( 115),  INT8_C( 102), -INT8_C(  25), -INT8_C( 117),  INT8_C(  17), -INT8_C( 106) } },
    { {  INT8_C(  96), -INT8_C(  87),  INT8_C(  68), -INT8_C( 118),  INT8_C(  31),  INT8_C(  46), -INT8_C(  91),  INT8_C( 115) },
      {  INT8_C(  48), -INT8_C(   6),  INT8_C( 102), -INT8_C(  59), -INT8_C( 108), -INT8_C(  31), -INT8_C(  28),  INT8_C(  34) },
      {  INT8_C(  48), -INT8_C(  81), -INT8_C(  34), -INT8_C(  59), -INT8_C( 117),  INT8_C(  77), -INT8_C(  63),  INT8_C(  81) } },
    { { -INT8_C( 123), -INT8_C(  56), -INT8_C( 107),  INT8_C(   3),  INT8_C(   1), -INT8_C(  47), -INT8_C(  40),  INT8_C( 124) },
      { -INT8_C( 106),  INT8_C(  46), -INT8_C( 119),  INT8_C(  45), -INT8_C(  36), -INT8_C(  76),  INT8_C( 108),  INT8_C(  61) },
      { -INT8_C(  17), -INT8_C( 102),  INT8_C(  12), -INT8_C(  42),  INT8_C(  37),  INT8_C(  29),  INT8_C( 108),  INT8_C(  63) } }
  };

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

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

  return 0;
}

static int
test_simde_vsub_s16 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    int16_t a[4];
    int16_t b[4];
    int16_t r[4];
  } test_vec[] = {
    { { -INT16_C( 24371),  INT16_C( 25777), -INT16_C(  6138), -INT16_C( 26958) },
      {  INT16_C( 31782), -INT16_C( 21475), -INT16_C( 30815),  INT16_C( 16870) },
      {  INT16_C(  9383), -INT16_C( 18284),  INT16_C( 24677),  INT16_C( 21708) } },
    { {  INT16_C( 30389),  INT16_C(  1729), -INT16_C( 20391),  INT16_C(  4694) },
      {  INT16_C( 28093), -INT16_C(  9420),  INT16_C( 22129),  INT16_C( 16024) },
      {  INT16_C(  2296),  INT16_C( 11149),  INT16_C( 23016), -INT16_C( 11330) } },
    { {  INT16_C( 19190), -INT16_C(   606),  INT16_C( 21810),  INT16_C( 22675) },
      { -INT16_C( 20271),  INT16_C( 29444), -INT16_C(  5321), -INT16_C(  4684) },
      { -INT16_C( 26075), -INT16_C( 30050),  INT16_C( 27131),  INT16_C( 27359) } },
    { {  INT16_C( 30049), -INT16_C( 17677),  INT16_C( 18982), -INT16_C(  7220) },
      {  INT16_C(   183),  INT16_C( 10686),  INT16_C( 22358),  INT16_C( 19815) },
      {  INT16_C( 29866), -INT16_C( 28363), -INT16_C(  3376), -INT16_C( 27035) } },
    { {  INT16_C(  2721), -INT16_C( 11446), -INT16_C(  8865),  INT16_C( 12331) },
      {  INT16_C( 12429), -INT16_C( 15197),  INT16_C( 22555),  INT16_C( 31921) },
      { -INT16_C(  9708),  INT16_C(  3751), -INT16_C( 31420), -INT16_C( 19590) } },
    { { -INT16_C( 23091), -INT16_C(  3274),  INT16_C(   751), -INT16_C( 22825) },
      { -INT16_C( 27389),  INT16_C( 22991),  INT16_C( 14316), -INT16_C( 29274) },
      {  INT16_C(  4298), -INT16_C( 26265), -INT16_C( 13565),  INT16_C(  6449) } },
    { { -INT16_C(  4031), -INT16_C( 24480), -INT16_C( 29491),  INT16_C( 23248) },
      {  INT16_C( 29884), -INT16_C( 10465), -INT16_C( 12084), -INT16_C( 26285) },
      {  INT16_C( 31621), -INT16_C( 14015), -INT16_C( 17407), -INT16_C( 16003) } },
    { { -INT16_C( 30347),  INT16_C( 25741),  INT16_C( 25739), -INT16_C( 29173) },
      { -INT16_C(  9479), -INT16_C(  6424), -INT16_C( 29167),  INT16_C( 21107) },
      { -INT16_C( 20868),  INT16_C( 32165), -INT16_C( 10630),  INT16_C( 15256) } }
  };

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

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

  return 0;
}

static int
test_simde_vsub_s32 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    int32_t a[2];
    int32_t b[2];
    int32_t r[2];
  } test_vec[] = {
    { { -INT32_C(  2124589663), -INT32_C(   360776502) },
      {  INT32_C(  2043609956), -INT32_C(  1270893877) },
      {  INT32_C(   126767677),  INT32_C(   910117375) } },
    { {  INT32_C(   343997614),  INT32_C(   705859580) },
      {  INT32_C(  1578649653),  INT32_C(   517998717) },
      { -INT32_C(  1234652039),  INT32_C(   187860863) } },
    { {  INT32_C(   664747613), -INT32_C(  1642980038) },
      { -INT32_C(   350756576),  INT32_C(  1100961427) },
      {  INT32_C(  1015504189),  INT32_C(  1551025831) } },
    { {  INT32_C(  1314267218), -INT32_C(   461870929) },
      {  INT32_C(   759337136), -INT32_C(   162847847) },
      {  INT32_C(   554930082), -INT32_C(   299023082) } },
    { { -INT32_C(  1692472479),  INT32_C(   691613704) },
      { -INT32_C(  1525395439), -INT32_C(   102320986) },
      { -INT32_C(   167077040),  INT32_C(   793934690) } },
    { { -INT32_C(  2092483372),  INT32_C(  1432862885) },
      { -INT32_C(   377247152),  INT32_C(   786484941) },
      { -INT32_C(  1715236220),  INT32_C(   646377944) } },
    { { -INT32_C(  1026949447),  INT32_C(  1072366126) },
      { -INT32_C(   119210158), -INT32_C(  2014196813) },
      { -INT32_C(   907739289), -INT32_C(  1208404357) } },
    { { -INT32_C(  1408616185),  INT32_C(  1224897273) },
      { -INT32_C(   382499556),  INT32_C(   219616083) },
      { -INT32_C(  1026116629),  INT32_C(  1005281190) } }
  };

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

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

  return 0;
}

static int
test_simde_vsub_s64 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    int64_t a[1];
    int64_t b[1];
    int64_t r[1];
  } test_vec[] = {
    { { -INT64_C(  657685634693326830) },
      { -INT64_C( 8547862028071945079) },
      {  INT64_C( 7890176393378618249) } },
    { {  INT64_C(  410282319565482483) },
      { -INT64_C( 8894323999304500444) },
      { -INT64_C( 9142137754839568689) } },
    { { -INT64_C( 4433867253433316581) },
      {  INT64_C(  561055581874761594) },
      { -INT64_C( 4994922835308078175) } },
    { { -INT64_C( 2464801910170707154) },
      {  INT64_C( 2554893422116537470) },
      { -INT64_C( 5019695332287244624) } },
    { { -INT64_C( 8461106941343280231) },
      { -INT64_C( 1340220289429308853) },
      { -INT64_C( 7120886651913971378) } },
    { { -INT64_C( 4952413417304229456) },
      { -INT64_C( 1464478769234607229) },
      { -INT64_C( 3487934648069622227) } },
    { { -INT64_C( 5112057892408831373) },
      {  INT64_C( 2123587332767078860) },
      { -INT64_C( 7235645225175910233) } },
    { {  INT64_C( 3202283264815803256) },
      { -INT64_C( 5869487482085106866) },
      {  INT64_C( 9071770746900910122) } }
  };

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

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

  return 0;
}

static int
test_simde_vsub_u8 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    uint8_t a[16];
    uint8_t b[16];
    uint8_t r[16];
  } test_vec[] = {
    { { UINT8_C(226), UINT8_C(152), UINT8_C(175), UINT8_C( 29), UINT8_C(233), UINT8_C( 81), UINT8_C( 65), UINT8_C(  7) },
      { UINT8_C(166), UINT8_C(215), UINT8_C(155), UINT8_C( 54), UINT8_C(226), UINT8_C(113), UINT8_C( 20), UINT8_C(177) },
      { UINT8_C( 60), UINT8_C(193), UINT8_C( 20), UINT8_C(231), UINT8_C(  7), UINT8_C(224), UINT8_C( 45), UINT8_C( 86) } },
    { { UINT8_C( 32), UINT8_C(227), UINT8_C( 13), UINT8_C(184), UINT8_C(211), UINT8_C(108), UINT8_C(142), UINT8_C( 85) },
      { UINT8_C( 75), UINT8_C(149), UINT8_C( 97), UINT8_C( 87), UINT8_C(227), UINT8_C(174), UINT8_C(  4), UINT8_C(197) },
      { UINT8_C(213), UINT8_C( 78), UINT8_C(172), UINT8_C( 97), UINT8_C(240), UINT8_C(190), UINT8_C(138), UINT8_C(144) } },
    { { UINT8_C( 70), UINT8_C(180), UINT8_C(227), UINT8_C( 48), UINT8_C(  5), UINT8_C( 36), UINT8_C( 55), UINT8_C(171) },
      { UINT8_C(251), UINT8_C(210), UINT8_C(226), UINT8_C(222), UINT8_C( 67), UINT8_C(246), UINT8_C(143), UINT8_C(100) },
      { UINT8_C( 75), UINT8_C(226), UINT8_C(  1), UINT8_C( 82), UINT8_C(194), UINT8_C( 46), UINT8_C(168), UINT8_C( 71) } },
    { { UINT8_C(218), UINT8_C(156), UINT8_C( 28), UINT8_C(173), UINT8_C(  9), UINT8_C(171), UINT8_C(  2), UINT8_C( 84) },
      { UINT8_C( 64), UINT8_C( 99), UINT8_C(171), UINT8_C( 36), UINT8_C( 17), UINT8_C(175), UINT8_C(233), UINT8_C( 88) },
      { UINT8_C(154), UINT8_C( 57), UINT8_C(113), UINT8_C(137), UINT8_C(248), UINT8_C(252), UINT8_C( 25), UINT8_C(252) } },
    { { UINT8_C( 99), UINT8_C(204), UINT8_C(136), UINT8_C(105), UINT8_C(240), UINT8_C(191), UINT8_C( 20), UINT8_C(236) },
      { UINT8_C(145), UINT8_C(246), UINT8_C(202), UINT8_C(212), UINT8_C(237), UINT8_C( 89), UINT8_C( 56), UINT8_C(199) },
      { UINT8_C(210), UINT8_C(214), UINT8_C(190), UINT8_C(149), UINT8_C(  3), UINT8_C(102), UINT8_C(220), UINT8_C( 37) } },
    { { UINT8_C(246), UINT8_C( 85), UINT8_C(116), UINT8_C(255), UINT8_C(  0), UINT8_C(118), UINT8_C( 83), UINT8_C( 64) },
      { UINT8_C(218), UINT8_C(254), UINT8_C(100), UINT8_C(235), UINT8_C(173), UINT8_C( 78), UINT8_C( 67), UINT8_C( 17) },
      { UINT8_C( 28), UINT8_C( 87), UINT8_C( 16), UINT8_C( 20), UINT8_C( 83), UINT8_C( 40), UINT8_C( 16), UINT8_C( 47) } },
    { { UINT8_C( 26), UINT8_C(203), UINT8_C(122), UINT8_C( 11), UINT8_C(138), UINT8_C(142), UINT8_C(247), UINT8_C( 27) },
      { UINT8_C(133), UINT8_C(193), UINT8_C(240), UINT8_C(114), UINT8_C( 26), UINT8_C( 40), UINT8_C( 57), UINT8_C( 16) },
      { UINT8_C(149), UINT8_C( 10), UINT8_C(138), UINT8_C(153), UINT8_C(112), UINT8_C(102), UINT8_C(190), UINT8_C( 11) } },
    { { UINT8_C(125), UINT8_C(173), UINT8_C( 15), UINT8_C(125), UINT8_C( 35), UINT8_C( 98), UINT8_C(190), UINT8_C(253) },
      { UINT8_C( 96), UINT8_C( 34), UINT8_C(233), UINT8_C( 14), UINT8_C(112), UINT8_C( 44), UINT8_C( 31), UINT8_C(139) },
      { UINT8_C( 29), UINT8_C(139), UINT8_C( 38), UINT8_C(111), UINT8_C(179), UINT8_C( 54), UINT8_C(159), UINT8_C(114) } }
  };

  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);
    simde_uint8x8_t r = simde_vsub_u8(a, b);

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

  return 0;
}

static int
test_simde_vsub_u16 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    uint16_t a[4];
    uint16_t b[4];
    uint16_t r[4];
  } test_vec[] = {
    { { UINT16_C(39416), UINT16_C(33430), UINT16_C(36135), UINT16_C(44190) },
      { UINT16_C(36430), UINT16_C(26654), UINT16_C(22454), UINT16_C(13433) },
      { UINT16_C( 2986), UINT16_C( 6776), UINT16_C(13681), UINT16_C(30757) } },
    { { UINT16_C(34820), UINT16_C(10417), UINT16_C(28651), UINT16_C(19237) },
      { UINT16_C( 3730), UINT16_C(  601), UINT16_C(30779), UINT16_C(13197) },
      { UINT16_C(31090), UINT16_C( 9816), UINT16_C(63408), UINT16_C( 6040) } },
    { { UINT16_C( 8977), UINT16_C(14773), UINT16_C(21424), UINT16_C(65253) },
      { UINT16_C( 1249), UINT16_C(39015), UINT16_C(57435), UINT16_C(24780) },
      { UINT16_C( 7728), UINT16_C(41294), UINT16_C(29525), UINT16_C(40473) } },
    { { UINT16_C(32104), UINT16_C(21384), UINT16_C(44525), UINT16_C(32671) },
      { UINT16_C(63676), UINT16_C(63361), UINT16_C( 3953), UINT16_C(33322) },
      { UINT16_C(33964), UINT16_C(23559), UINT16_C(40572), UINT16_C(64885) } },
    { { UINT16_C(57138), UINT16_C(58299), UINT16_C(41267), UINT16_C( 5345) },
      { UINT16_C(18597), UINT16_C(  172), UINT16_C(30760), UINT16_C(37216) },
      { UINT16_C(38541), UINT16_C(58127), UINT16_C(10507), UINT16_C(33665) } },
    { { UINT16_C(59638), UINT16_C(58340), UINT16_C(33686), UINT16_C(21090) },
      { UINT16_C(58236), UINT16_C(60745), UINT16_C(29682), UINT16_C( 9583) },
      { UINT16_C( 1402), UINT16_C(63131), UINT16_C( 4004), UINT16_C(11507) } },
    { { UINT16_C(11090), UINT16_C(34056), UINT16_C(59852), UINT16_C(29082) },
      { UINT16_C(17970), UINT16_C(23153), UINT16_C(53951), UINT16_C(46571) },
      { UINT16_C(58656), UINT16_C(10903), UINT16_C( 5901), UINT16_C(48047) } },
    { { UINT16_C(53434), UINT16_C(20632), UINT16_C(64083), UINT16_C(53154) },
      { UINT16_C(60381), UINT16_C(53436), UINT16_C(11358), UINT16_C(45557) },
      { UINT16_C(58589), UINT16_C(32732), UINT16_C(52725), UINT16_C( 7597) } }
  };

  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);
    simde_uint16x4_t r = simde_vsub_u16(a, b);
    simde_test_arm_neon_assert_equal_u16x4(r, simde_vld1_u16(test_vec[i].r));
  }

  return 0;
}

static int
test_simde_vsub_u32 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    uint32_t a[2];
    uint32_t b[2];
    uint32_t r[2];
  } test_vec[] = {
    { { UINT32_C( 590806359), UINT32_C( 412405990) },
      { UINT32_C(3597862167), UINT32_C(2458607319) },
      { UINT32_C(1287911488), UINT32_C(2248765967) } },
    { { UINT32_C(2195858222), UINT32_C(4199646493) },
      { UINT32_C(3486125680), UINT32_C(2441133882) },
      { UINT32_C(3004699838), UINT32_C(1758512611) } },
    { { UINT32_C(2746529468), UINT32_C(2663073927) },
      { UINT32_C( 628371021), UINT32_C(3149397901) },
      { UINT32_C(2118158447), UINT32_C(3808643322) } },
    { { UINT32_C(1061001506), UINT32_C(2402914078) },
      { UINT32_C(3613263005), UINT32_C(2154356419) },
      { UINT32_C(1742705797), UINT32_C( 248557659) } },
    { { UINT32_C( 455285908), UINT32_C(2981748324) },
      { UINT32_C(2597727501), UINT32_C(1314229548) },
      { UINT32_C(2152525703), UINT32_C(1667518776) } },
    { { UINT32_C(1166906151), UINT32_C(3218392866) },
      { UINT32_C(2392208075), UINT32_C(2769223184) },
      { UINT32_C(3069665372), UINT32_C( 449169682) } },
    { { UINT32_C(2126524698), UINT32_C( 489650704) },
      { UINT32_C(3568764583), UINT32_C(3122793619) },
      { UINT32_C(2852727411), UINT32_C(1661824381) } },
    { { UINT32_C(3238047903), UINT32_C(1115739255) },
      { UINT32_C( 399513095), UINT32_C( 784129812) },
      { UINT32_C(2838534808), UINT32_C( 331609443) } }
  };

  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);
    simde_uint32x2_t r = simde_vsub_u32(a, b);
    simde_test_arm_neon_assert_equal_u32x2(r, simde_vld1_u32(test_vec[i].r));
  }

  return 0;
}

static int
test_simde_vsub_u64 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    uint64_t a[1];
    uint64_t b[1];
    uint64_t r[1];
  } test_vec[] = {
    { { UINT64_C(11402512785535171856) },
      { UINT64_C(11542889678448555234) },
      { UINT64_C(18306367180796168238) } },
    { { UINT64_C(  864376688470011973) },
      { UINT64_C(13708077300151734009) },
      { UINT64_C( 5603043462027829580) } },
    { { UINT64_C(12029709184206301276) },
      { UINT64_C( 4517758008823669776) },
      { UINT64_C( 7511951175382631500) } },
    { { UINT64_C(17261445209413784700) },
      { UINT64_C(16947671631759519687) },
      { UINT64_C(  313773577654265013) } },
    { { UINT64_C( 4434972706747584801) },
      { UINT64_C( 8128155052344846485) },
      { UINT64_C(14753561728112289932) } },
    { { UINT64_C( 9798563678062233365) },
      { UINT64_C( 5955216873392699436) },
      { UINT64_C( 3843346804669533929) } },
    { { UINT64_C(12225519354979607615) },
      { UINT64_C( 1067922630293125229) },
      { UINT64_C(11157596724686482386) } },
    { { UINT64_C( 7787591547626374092) },
      { UINT64_C( 8975898620757217037) },
      { UINT64_C(17258437000578708671) } }
  };

  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_vsub_u64(a, b);
    simde_test_arm_neon_assert_equal_u64x1(r, simde_vld1_u64(test_vec[i].r));
  }

  return 0;
}

static int
test_simde_vsubq_f16 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    simde_float16_t a[8];
    simde_float16_t b[8];
    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) },
  { SIMDE_FLOAT16_VALUE(  1125.00), SIMDE_FLOAT16_VALUE(  1424.00), SIMDE_FLOAT16_VALUE(   113.38), SIMDE_FLOAT16_VALUE(   109.50),
    SIMDE_FLOAT16_VALUE(   -27.50), SIMDE_FLOAT16_VALUE(   142.50), SIMDE_FLOAT16_VALUE(  -435.75), SIMDE_FLOAT16_VALUE(   388.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) },
  { SIMDE_FLOAT16_VALUE(  -854.50), SIMDE_FLOAT16_VALUE(   844.50), SIMDE_FLOAT16_VALUE( -1528.00), SIMDE_FLOAT16_VALUE(   542.00),
    SIMDE_FLOAT16_VALUE(   631.00), SIMDE_FLOAT16_VALUE(  -426.00), SIMDE_FLOAT16_VALUE(  1139.00), SIMDE_FLOAT16_VALUE(   359.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) },
  { SIMDE_FLOAT16_VALUE(   918.50), SIMDE_FLOAT16_VALUE(   -50.50), SIMDE_FLOAT16_VALUE(   -25.00), SIMDE_FLOAT16_VALUE(   892.00),
    SIMDE_FLOAT16_VALUE(    91.88), SIMDE_FLOAT16_VALUE(  -461.00), SIMDE_FLOAT16_VALUE(  -720.00), SIMDE_FLOAT16_VALUE( -1230.00) } },
{ { 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) },
  { SIMDE_FLOAT16_VALUE(   195.50), SIMDE_FLOAT16_VALUE(   146.50), SIMDE_FLOAT16_VALUE(  1512.00), SIMDE_FLOAT16_VALUE(   826.00),
    SIMDE_FLOAT16_VALUE(  -279.00), SIMDE_FLOAT16_VALUE(   652.00), SIMDE_FLOAT16_VALUE(  -814.50), SIMDE_FLOAT16_VALUE(  -217.88) } },
{ { 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) },
  { SIMDE_FLOAT16_VALUE(   833.00), SIMDE_FLOAT16_VALUE(  1572.00), SIMDE_FLOAT16_VALUE(    87.00), SIMDE_FLOAT16_VALUE( -1076.00),
    SIMDE_FLOAT16_VALUE(  -889.50), SIMDE_FLOAT16_VALUE(  1367.00), SIMDE_FLOAT16_VALUE(  -306.00), SIMDE_FLOAT16_VALUE(  -758.00) } },
{ { 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) },
  { SIMDE_FLOAT16_VALUE(  -216.25), SIMDE_FLOAT16_VALUE( -1884.00), SIMDE_FLOAT16_VALUE(   317.00), SIMDE_FLOAT16_VALUE(  -495.25),
    SIMDE_FLOAT16_VALUE(   767.50), SIMDE_FLOAT16_VALUE(  1502.00), SIMDE_FLOAT16_VALUE(  -713.00), SIMDE_FLOAT16_VALUE(  -240.75) } },
{ { 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) },
  { SIMDE_FLOAT16_VALUE(   659.50), SIMDE_FLOAT16_VALUE(  -156.50), SIMDE_FLOAT16_VALUE( -1025.00), SIMDE_FLOAT16_VALUE(  -229.50),
    SIMDE_FLOAT16_VALUE(  1210.00), SIMDE_FLOAT16_VALUE(   669.00), SIMDE_FLOAT16_VALUE(  -988.00), SIMDE_FLOAT16_VALUE(  -984.00) } },
{ { 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) },
  { SIMDE_FLOAT16_VALUE(  -634.00), SIMDE_FLOAT16_VALUE(  -283.75), SIMDE_FLOAT16_VALUE(   -99.50), SIMDE_FLOAT16_VALUE(   134.00),
    SIMDE_FLOAT16_VALUE(  -781.50), SIMDE_FLOAT16_VALUE(  1188.00), SIMDE_FLOAT16_VALUE(  -106.88), SIMDE_FLOAT16_VALUE(  -497.25) } }
  };

  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);
    simde_float16x8_t r = simde_vsubq_f16(a, b);
    simde_test_arm_neon_assert_equal_f16x8(r, simde_vld1q_f16(test_vec[i].r), 1);
  }

  return 0;
}

static int
test_simde_vsubq_f32 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    simde_float32 a[4];
    simde_float32 b[4];
    simde_float32 r[4];
  } test_vec[] = {
    { { SIMDE_FLOAT32_C(   313.36), SIMDE_FLOAT32_C(   130.95), SIMDE_FLOAT32_C(   558.01), SIMDE_FLOAT32_C(  -224.30) },
      { SIMDE_FLOAT32_C(  -431.17), SIMDE_FLOAT32_C(  -838.29), SIMDE_FLOAT32_C(   973.18), SIMDE_FLOAT32_C(  -249.71) },
      { SIMDE_FLOAT32_C(   744.52), SIMDE_FLOAT32_C(   969.24), SIMDE_FLOAT32_C(  -415.17), SIMDE_FLOAT32_C(    25.41) } },
    { { SIMDE_FLOAT32_C(  -619.93), SIMDE_FLOAT32_C(  -195.67), SIMDE_FLOAT32_C(   784.76), SIMDE_FLOAT32_C(   593.47) },
      { SIMDE_FLOAT32_C(  -109.46), SIMDE_FLOAT32_C(   -51.93), SIMDE_FLOAT32_C(  -685.95), SIMDE_FLOAT32_C(    54.63) },
      { SIMDE_FLOAT32_C(  -510.46), SIMDE_FLOAT32_C(  -143.74), SIMDE_FLOAT32_C(  1470.70), SIMDE_FLOAT32_C(   538.84) } },
    { { SIMDE_FLOAT32_C(   238.71), SIMDE_FLOAT32_C(  -726.25), SIMDE_FLOAT32_C(  -693.46), SIMDE_FLOAT32_C(   265.88) },
      { SIMDE_FLOAT32_C(   740.54), SIMDE_FLOAT32_C(   826.68), SIMDE_FLOAT32_C(  -296.56), SIMDE_FLOAT32_C(   -34.22) },
      { SIMDE_FLOAT32_C(  -501.83), SIMDE_FLOAT32_C( -1552.93), SIMDE_FLOAT32_C(  -396.90), SIMDE_FLOAT32_C(   300.10) } },
    { { SIMDE_FLOAT32_C(   788.21), SIMDE_FLOAT32_C(   906.36), SIMDE_FLOAT32_C(  -290.22), SIMDE_FLOAT32_C(    38.77) },
      { SIMDE_FLOAT32_C(   692.11), SIMDE_FLOAT32_C(   669.99), SIMDE_FLOAT32_C(    83.43), SIMDE_FLOAT32_C(     5.46) },
      { SIMDE_FLOAT32_C(    96.10), SIMDE_FLOAT32_C(   236.38), SIMDE_FLOAT32_C(  -373.65), SIMDE_FLOAT32_C(    33.31) } },
    { { SIMDE_FLOAT32_C(  -199.06), SIMDE_FLOAT32_C(  -358.56), SIMDE_FLOAT32_C(   781.16), SIMDE_FLOAT32_C(   369.77) },
      { SIMDE_FLOAT32_C(  -196.85), SIMDE_FLOAT32_C(   754.34), SIMDE_FLOAT32_C(  -879.94), SIMDE_FLOAT32_C(   183.22) },
      { SIMDE_FLOAT32_C(    -2.21), SIMDE_FLOAT32_C( -1112.90), SIMDE_FLOAT32_C(  1661.10), SIMDE_FLOAT32_C(   186.55) } },
    { { SIMDE_FLOAT32_C(  -441.33), SIMDE_FLOAT32_C(   904.82), SIMDE_FLOAT32_C(  -223.31), SIMDE_FLOAT32_C(   449.20) },
      { SIMDE_FLOAT32_C(  -147.11), SIMDE_FLOAT32_C(    90.74), SIMDE_FLOAT32_C(  -496.16), SIMDE_FLOAT32_C(  -908.40) },
      { SIMDE_FLOAT32_C(  -294.22), SIMDE_FLOAT32_C(   814.08), SIMDE_FLOAT32_C(   272.85), SIMDE_FLOAT32_C(  1357.61) } },
    { { SIMDE_FLOAT32_C(   364.49), SIMDE_FLOAT32_C(  -189.62), SIMDE_FLOAT32_C(   357.48), SIMDE_FLOAT32_C(   105.03) },
      { SIMDE_FLOAT32_C(  -362.94), SIMDE_FLOAT32_C(  -939.08), SIMDE_FLOAT32_C(  -929.19), SIMDE_FLOAT32_C(  -574.73) },
      { SIMDE_FLOAT32_C(   727.43), SIMDE_FLOAT32_C(   749.46), SIMDE_FLOAT32_C(  1286.67), SIMDE_FLOAT32_C(   679.76) } },
    { { SIMDE_FLOAT32_C(   967.28), SIMDE_FLOAT32_C(  -219.41), SIMDE_FLOAT32_C(   464.05), SIMDE_FLOAT32_C(   659.39) },
      { SIMDE_FLOAT32_C(  -549.43), SIMDE_FLOAT32_C(  -452.53), SIMDE_FLOAT32_C(  -335.15), SIMDE_FLOAT32_C(   251.51) },
      { SIMDE_FLOAT32_C(  1516.71), SIMDE_FLOAT32_C(   233.11), SIMDE_FLOAT32_C(   799.20), SIMDE_FLOAT32_C(   407.88) } }
  };

  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);
    simde_float32x4_t r = simde_vsubq_f32(a, b);
    simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1);
  }

  return 0;
}

static int
test_simde_vsubq_f64 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    simde_float64 a[2];
    simde_float64 b[2];
    simde_float64 r[2];
  } test_vec[] = {
    { { SIMDE_FLOAT64_C(   188.91), SIMDE_FLOAT64_C(  -553.99) },
      { SIMDE_FLOAT64_C(  -378.72), SIMDE_FLOAT64_C(   992.06) },
      { SIMDE_FLOAT64_C(   567.63), SIMDE_FLOAT64_C( -1546.05) } },
    { { SIMDE_FLOAT64_C(  -799.65), SIMDE_FLOAT64_C(  -258.66) },
      { SIMDE_FLOAT64_C(   175.28), SIMDE_FLOAT64_C(  -240.98) },
      { SIMDE_FLOAT64_C(  -974.93), SIMDE_FLOAT64_C(   -17.68) } },
    { { SIMDE_FLOAT64_C(  -353.84), SIMDE_FLOAT64_C(   951.96) },
      { SIMDE_FLOAT64_C(  -791.78), SIMDE_FLOAT64_C(   499.05) },
      { SIMDE_FLOAT64_C(   437.94), SIMDE_FLOAT64_C(   452.91) } },
    { { SIMDE_FLOAT64_C(    42.70), SIMDE_FLOAT64_C(  -287.94) },
      { SIMDE_FLOAT64_C(   590.65), SIMDE_FLOAT64_C(  -592.80) },
      { SIMDE_FLOAT64_C(  -547.94), SIMDE_FLOAT64_C(   304.86) } },
    { { SIMDE_FLOAT64_C(   522.44), SIMDE_FLOAT64_C(   -51.88) },
      { SIMDE_FLOAT64_C(   512.22), SIMDE_FLOAT64_C(  -840.50) },
      { SIMDE_FLOAT64_C(    10.21), SIMDE_FLOAT64_C(   788.62) } },
    { { SIMDE_FLOAT64_C(     9.04), SIMDE_FLOAT64_C(   583.04) },
      { SIMDE_FLOAT64_C(  -415.23), SIMDE_FLOAT64_C(   -23.68) },
      { SIMDE_FLOAT64_C(   424.27), SIMDE_FLOAT64_C(   606.72) } },
    { { SIMDE_FLOAT64_C(  -636.38), SIMDE_FLOAT64_C(  -951.18) },
      { SIMDE_FLOAT64_C(  -364.30), SIMDE_FLOAT64_C(  -185.81) },
      { SIMDE_FLOAT64_C(  -272.08), SIMDE_FLOAT64_C(  -765.37) } },
    { { SIMDE_FLOAT64_C(  -403.71), SIMDE_FLOAT64_C(   300.55) },
      { SIMDE_FLOAT64_C(  -934.30), SIMDE_FLOAT64_C(   785.21) },
      { SIMDE_FLOAT64_C(   530.59), SIMDE_FLOAT64_C(  -484.65) } }
  };

  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);
    simde_float64x2_t r = simde_vsubq_f64(a, b);

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

  return 0;
}

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

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

  return 0;
}

static int
test_simde_vsubq_s16 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    int16_t a[8];
    int16_t b[8];
    int16_t r[8];
  } test_vec[] = {
    { {  INT16_C( 31318),  INT16_C(  4134), -INT16_C(  6723),  INT16_C( 21335), -INT16_C( 25763),  INT16_C( 17298), -INT16_C(  9065),  INT16_C(  1079) },
      {  INT16_C( 19197),  INT16_C(  1228), -INT16_C(  7522), -INT16_C(  5302), -INT16_C(  1743), -INT16_C( 13071),  INT16_C(  8924),  INT16_C( 13041) },
      {  INT16_C( 12121),  INT16_C(  2906),  INT16_C(   799),  INT16_C( 26637), -INT16_C( 24020),  INT16_C( 30369), -INT16_C( 17989), -INT16_C( 11962) } },
    { {  INT16_C(  6045),  INT16_C( 23106), -INT16_C( 25859),  INT16_C( 23213),  INT16_C( 16437), -INT16_C( 13155), -INT16_C( 10980),  INT16_C(  6608) },
      { -INT16_C( 25569), -INT16_C( 17123),  INT16_C( 26495), -INT16_C( 20312), -INT16_C( 26016),  INT16_C( 15740),  INT16_C( 28348),  INT16_C( 22895) },
      {  INT16_C( 31614), -INT16_C( 25307),  INT16_C( 13182), -INT16_C( 22011), -INT16_C( 23083), -INT16_C( 28895),  INT16_C( 26208), -INT16_C( 16287) } },
    { { -INT16_C( 19835), -INT16_C( 32077),  INT16_C( 24908), -INT16_C( 32291),  INT16_C( 31393), -INT16_C( 17075),  INT16_C(  7503),  INT16_C( 28374) },
      { -INT16_C(  3143),  INT16_C( 14379), -INT16_C( 11174), -INT16_C( 17431),  INT16_C( 25966),  INT16_C( 11000),  INT16_C( 26579),  INT16_C( 22916) },
      { -INT16_C( 16692),  INT16_C( 19080), -INT16_C( 29454), -INT16_C( 14860),  INT16_C(  5427), -INT16_C( 28075), -INT16_C( 19076),  INT16_C(  5458) } },
    { {  INT16_C( 14105),  INT16_C( 26075), -INT16_C( 18280),  INT16_C( 14822),  INT16_C( 13107), -INT16_C( 32010), -INT16_C( 13232),  INT16_C(  2801) },
      {  INT16_C(  7359),  INT16_C(  6722),  INT16_C( 11248),  INT16_C( 24277), -INT16_C( 12911),  INT16_C( 25737),  INT16_C(  3380),  INT16_C( 20157) },
      {  INT16_C(  6746),  INT16_C( 19353), -INT16_C( 29528), -INT16_C(  9455),  INT16_C( 26018),  INT16_C(  7789), -INT16_C( 16612), -INT16_C( 17356) } },
    { { -INT16_C( 26300), -INT16_C(  8781), -INT16_C( 26031), -INT16_C( 31722),  INT16_C(  3533),  INT16_C(  7687), -INT16_C(  1831), -INT16_C( 26328) },
      {  INT16_C( 27156),  INT16_C(  1459), -INT16_C( 30570),  INT16_C( 10083), -INT16_C(  5035), -INT16_C( 30325),  INT16_C( 18937),  INT16_C( 16087) },
      {  INT16_C( 12080), -INT16_C( 10240),  INT16_C(  4539),  INT16_C( 23731),  INT16_C(  8568), -INT16_C( 27524), -INT16_C( 20768),  INT16_C( 23121) } },
    { { -INT16_C( 29726),  INT16_C( 13083),  INT16_C( 12581), -INT16_C(  3400), -INT16_C( 16578),  INT16_C(  6160),  INT16_C( 14519), -INT16_C( 13391) },
      {  INT16_C( 25763),  INT16_C( 14800),  INT16_C( 13548),  INT16_C( 16736), -INT16_C(  5344),  INT16_C(  6858), -INT16_C( 24012),  INT16_C(  5720) },
      {  INT16_C( 10047), -INT16_C(  1717), -INT16_C(   967), -INT16_C( 20136), -INT16_C( 11234), -INT16_C(   698), -INT16_C( 27005), -INT16_C( 19111) } },
    { {  INT16_C( 29485),  INT16_C( 21066),  INT16_C(   676), -INT16_C(  7356),  INT16_C( 21953),  INT16_C( 30971), -INT16_C( 21363),  INT16_C( 12355) },
      {  INT16_C(  5136), -INT16_C(   919), -INT16_C( 14008),  INT16_C( 26685),  INT16_C(  1973), -INT16_C(  5758), -INT16_C(  9559), -INT16_C( 10752) },
      {  INT16_C( 24349),  INT16_C( 21985),  INT16_C( 14684),  INT16_C( 31495),  INT16_C( 19980), -INT16_C( 28807), -INT16_C( 11804),  INT16_C( 23107) } },
    { {  INT16_C( 19021), -INT16_C(  3544),  INT16_C( 27980),  INT16_C(  3541), -INT16_C( 12094),  INT16_C( 20357), -INT16_C( 14212), -INT16_C( 29568) },
      { -INT16_C(  5668),  INT16_C(  9352), -INT16_C( 14925),  INT16_C( 26765),  INT16_C(  4044),  INT16_C( 30289),  INT16_C( 20970),  INT16_C( 14156) },
      {  INT16_C( 24689), -INT16_C( 12896), -INT16_C( 22631), -INT16_C( 23224), -INT16_C( 16138), -INT16_C(  9932),  INT16_C( 30354),  INT16_C( 21812) } }
  };

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

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

  return 0;
}

static int
test_simde_vsubq_s32 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    int32_t a[4];
    int32_t b[4];
    int32_t r[4];
  } test_vec[] = {
    { { -INT32_C(   416713317), -INT32_C(  1527447838),  INT32_C(  1257470414),  INT32_C(   517370690) },
      {  INT32_C(   272850525), -INT32_C(   260517853), -INT32_C(   916010529), -INT32_C(  1241402853) },
      { -INT32_C(   689563842), -INT32_C(  1266929985), -INT32_C(  2121486353),  INT32_C(  1758773543) } },
    { {  INT32_C(   161360423), -INT32_C(   139619799),  INT32_C(  1312989452),  INT32_C(  1902909460) },
      { -INT32_C(  1702776969),  INT32_C(  1602943359), -INT32_C(   567742269), -INT32_C(   896259677) },
      {  INT32_C(  1864137392), -INT32_C(  1742563158),  INT32_C(  1880731721), -INT32_C(  1495798159) } },
    { {  INT32_C(  2111058516), -INT32_C(   780893755),  INT32_C(   924825122),  INT32_C(  1185450959) },
      { -INT32_C(  1159714245), -INT32_C(   434541789), -INT32_C(    20692389), -INT32_C(  1077323413) },
      { -INT32_C(  1024194535), -INT32_C(   346351966),  INT32_C(   945517511), -INT32_C(  2032192924) } },
    { {  INT32_C(  1346149771),  INT32_C(  1092727070),  INT32_C(   913850471),  INT32_C(   125575372) },
      {  INT32_C(  1858166090),  INT32_C(   592763848), -INT32_C(  2011031267), -INT32_C(    45552782) },
      { -INT32_C(   512016319),  INT32_C(   499963222), -INT32_C(  1370085558),  INT32_C(   171128154) } },
    { { -INT32_C(  1504803704), -INT32_C(  1645777099),  INT32_C(  2094227376), -INT32_C(   897363840) },
      {  INT32_C(  1966621869),  INT32_C(  1016630559),  INT32_C(   415611558),  INT32_C(   756354469) },
      {  INT32_C(   823541723),  INT32_C(  1632559638),  INT32_C(  1678615818), -INT32_C(  1653718309) } },
    { { -INT32_C(   942382191), -INT32_C(  2090550317), -INT32_C(  1677773029),  INT32_C(   879067783) },
      { -INT32_C(   425091386), -INT32_C(   786283989), -INT32_C(  1561729028), -INT32_C(  2033189132) },
      { -INT32_C(   517290805), -INT32_C(  1304266328), -INT32_C(   116044001), -INT32_C(  1382710381) } },
    { {  INT32_C(   894280546),  INT32_C(  2058924383),  INT32_C(  1880471528), -INT32_C(     5998023) },
      {  INT32_C(  1139101208), -INT32_C(  1944844144), -INT32_C(   466682385),  INT32_C(  1584070396) },
      { -INT32_C(   244820662), -INT32_C(   291198769), -INT32_C(  1947813383), -INT32_C(  1590068419) } },
    { {  INT32_C(     9680801),  INT32_C(  1350191976),  INT32_C(  1002475266),  INT32_C(   574252298) },
      {  INT32_C(  1130766515),  INT32_C(   399473192),  INT32_C(  1962671736), -INT32_C(  1647155716) },
      { -INT32_C(  1121085714),  INT32_C(   950718784), -INT32_C(   960196470), -INT32_C(  2073559282) } }
  };

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

  return 0;
}

static int
test_simde_vsubq_s64 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    int64_t a[2];
    int64_t b[2];
    int64_t r[2];
  } test_vec[] = {
    { { -INT64_C( 5560511018500725476), -INT64_C( 5921063652388137560) },
      {  INT64_C( 3280802739062323783),  INT64_C(  312846142526292670) },
      { -INT64_C( 8841313757563049259), -INT64_C( 6233909794914430230) } },
    { { -INT64_C( 5315832993644153384), -INT64_C( 7594410036925290509) },
      {  INT64_C(  745781472090492023),  INT64_C( 5042654366893668879) },
      { -INT64_C( 6061614465734645407),  INT64_C( 5809679669890592228) } },
    { { -INT64_C( 2966456111776037871), -INT64_C( 1147749979637138130) },
      { -INT64_C( 5530009519274583829),  INT64_C( 3612351040494110063) },
      {  INT64_C( 2563553407498545958), -INT64_C( 4760101020131248193) } },
    { {  INT64_C( 2585953444973112874), -INT64_C(  950908203764242589) },
      { -INT64_C( 3593191495057151542), -INT64_C( 7078589392559026832) },
      {  INT64_C( 6179144940030264416),  INT64_C( 6127681188794784243) } },
    { { -INT64_C( 7073873831480650565), -INT64_C( 1068119307084729292) },
      {  INT64_C( 3629482117552952880), -INT64_C( 8043279582318360241) },
      {  INT64_C( 7743388124675948171),  INT64_C( 6975160275233630949) } },
    { { -INT64_C( 3714601521476728165),  INT64_C( 7322910394983902601) },
      { -INT64_C( 3279092754793889653),  INT64_C( 7260354318767047259) },
      { -INT64_C(  435508766682838512),  INT64_C(   62556076216855342) } },
    { { -INT64_C( 6889190113625373953),  INT64_C( 3113659290876930971) },
      { -INT64_C( 2934387092794955279), -INT64_C( 3430112546453398728) },
      { -INT64_C( 3954803020830418674),  INT64_C( 6543771837330329699) } },
    { { -INT64_C( 1619946426246651700), -INT64_C( 5331436475357998025) },
      { -INT64_C( 6382884422338053864),  INT64_C(  787019694814557260) },
      {  INT64_C( 4762937996091402164), -INT64_C( 6118456170172555285) } }
  };

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

  return 0;
}

static int
test_simde_vsubq_u8 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    uint8_t a[16];
    uint8_t b[16];
    uint8_t r[16];
  } test_vec[] = {
    { { UINT8_C( 46), UINT8_C(195), UINT8_C( 10), UINT8_C(219), UINT8_C(166), UINT8_C( 78), UINT8_C(182), UINT8_C(237),
        UINT8_C(213), UINT8_C(145), UINT8_C( 21), UINT8_C(119), UINT8_C(125), UINT8_C(251), UINT8_C( 49), UINT8_C(192) },
      { UINT8_C( 82), UINT8_C(167), UINT8_C( 39), UINT8_C(113), UINT8_C( 53), UINT8_C(  0), UINT8_C(195), UINT8_C( 43),
        UINT8_C( 66), UINT8_C(194), UINT8_C( 13), UINT8_C(182), UINT8_C( 87), UINT8_C( 48), UINT8_C( 39), UINT8_C(134) },
      { UINT8_C(220), UINT8_C( 28), UINT8_C(227), UINT8_C(106), UINT8_C(113), UINT8_C( 78), UINT8_C(243), UINT8_C(194),
        UINT8_C(147), UINT8_C(207), UINT8_C(  8), UINT8_C(193), UINT8_C( 38), UINT8_C(203), UINT8_C( 10), UINT8_C( 58) } },
    { { UINT8_C(243), UINT8_C( 49), UINT8_C( 97), UINT8_C(154), UINT8_C(127), UINT8_C( 23), UINT8_C(135), UINT8_C( 84),
        UINT8_C(169), UINT8_C(156), UINT8_C(203), UINT8_C( 38), UINT8_C(152), UINT8_C(252), UINT8_C(231), UINT8_C(234) },
      { UINT8_C(163), UINT8_C( 14), UINT8_C( 91), UINT8_C(217), UINT8_C( 15), UINT8_C( 30), UINT8_C(  4), UINT8_C( 81),
        UINT8_C(225), UINT8_C( 17), UINT8_C(  7), UINT8_C( 56), UINT8_C( 65), UINT8_C( 46), UINT8_C(190), UINT8_C( 53) },
      { UINT8_C( 80), UINT8_C( 35), UINT8_C(  6), UINT8_C(193), UINT8_C(112), UINT8_C(249), UINT8_C(131), UINT8_C(  3),
        UINT8_C(200), UINT8_C(139), UINT8_C(196), UINT8_C(238), UINT8_C( 87), UINT8_C(206), UINT8_C( 41), UINT8_C(181) } },
    { { UINT8_C( 95), UINT8_C( 32), UINT8_C(207), UINT8_C(223), UINT8_C( 55), UINT8_C( 86), UINT8_C( 51), UINT8_C(224),
        UINT8_C(243),    UINT8_MAX, UINT8_C(  7), UINT8_C(139), UINT8_C(251), UINT8_C(238), UINT8_C(117), UINT8_C(159) },
      { UINT8_C(252), UINT8_C(208), UINT8_C(120), UINT8_C( 11), UINT8_C(238), UINT8_C(124), UINT8_C( 93), UINT8_C(207),
        UINT8_C(141), UINT8_C(100), UINT8_C(  8), UINT8_C(206), UINT8_C(147), UINT8_C(198), UINT8_C(  3), UINT8_C(242) },
      { UINT8_C( 99), UINT8_C( 80), UINT8_C( 87), UINT8_C(212), UINT8_C( 73), UINT8_C(218), UINT8_C(214), UINT8_C( 17),
        UINT8_C(102), UINT8_C(155),    UINT8_MAX, UINT8_C(189), UINT8_C(104), UINT8_C( 40), UINT8_C(114), UINT8_C(173) } },
    { { UINT8_C(230), UINT8_C(210), UINT8_C(209), UINT8_C( 30), UINT8_C( 41), UINT8_C(  5), UINT8_C(254), UINT8_C( 28),
        UINT8_C(  4), UINT8_C(  5), UINT8_C(167),    UINT8_MAX, UINT8_C(243), UINT8_C( 28), UINT8_C(158), UINT8_C(240) },
      { UINT8_C(236), UINT8_C( 22), UINT8_C(251), UINT8_C(218), UINT8_C(146), UINT8_C( 88), UINT8_C(170), UINT8_C( 31),
        UINT8_C(189), UINT8_C(178), UINT8_C(238), UINT8_C( 80), UINT8_C(120), UINT8_C(241), UINT8_C( 66), UINT8_C( 95) },
      { UINT8_C(250), UINT8_C(188), UINT8_C(214), UINT8_C( 68), UINT8_C(151), UINT8_C(173), UINT8_C( 84), UINT8_C(253),
        UINT8_C( 71), UINT8_C( 83), UINT8_C(185), UINT8_C(175), UINT8_C(123), UINT8_C( 43), UINT8_C( 92), UINT8_C(145) } },
    { { UINT8_C(196), UINT8_C( 20), UINT8_C(125), UINT8_C(237), UINT8_C( 25), UINT8_C(123), UINT8_C(  9), UINT8_C( 29),
        UINT8_C(129), UINT8_C(176), UINT8_C( 28), UINT8_C(116), UINT8_C(204), UINT8_C(187), UINT8_C(100), UINT8_C(184) },
      { UINT8_C(209), UINT8_C( 96), UINT8_C(146), UINT8_C(100), UINT8_C(184), UINT8_C( 60), UINT8_C(131), UINT8_C(117),
        UINT8_C(238), UINT8_C(113), UINT8_C(197), UINT8_C(103), UINT8_C( 99), UINT8_C(  8), UINT8_C(198), UINT8_C( 39) },
      { UINT8_C(243), UINT8_C(180), UINT8_C(235), UINT8_C(137), UINT8_C( 97), UINT8_C( 63), UINT8_C(134), UINT8_C(168),
        UINT8_C(147), UINT8_C( 63), UINT8_C( 87), UINT8_C( 13), UINT8_C(105), UINT8_C(179), UINT8_C(158), UINT8_C(145) } },
    { { UINT8_C( 28), UINT8_C( 67), UINT8_C( 20), UINT8_C( 53), UINT8_C(190), UINT8_C( 29), UINT8_C( 82), UINT8_C( 63),
        UINT8_C(205), UINT8_C(110), UINT8_C(180), UINT8_C(153), UINT8_C( 41), UINT8_C( 24), UINT8_C( 81), UINT8_C(251) },
      { UINT8_C(120), UINT8_C(227), UINT8_C( 95), UINT8_C( 49), UINT8_C( 32), UINT8_C(226), UINT8_C(166), UINT8_C( 14),
        UINT8_C( 84), UINT8_C(108), UINT8_C(117), UINT8_C(183), UINT8_C(116), UINT8_C( 59), UINT8_C(222), UINT8_C(144) },
      { UINT8_C(164), UINT8_C( 96), UINT8_C(181), UINT8_C(  4), UINT8_C(158), UINT8_C( 59), UINT8_C(172), UINT8_C( 49),
        UINT8_C(121), UINT8_C(  2), UINT8_C( 63), UINT8_C(226), UINT8_C(181), UINT8_C(221), UINT8_C(115), UINT8_C(107) } },
    { { UINT8_C(126), UINT8_C(242), UINT8_C(197), UINT8_C( 61), UINT8_C( 15), UINT8_C( 23), UINT8_C(124), UINT8_C(220),
        UINT8_C(133), UINT8_C( 48), UINT8_C(117), UINT8_C(175), UINT8_C( 73), UINT8_C(198), UINT8_C(170), UINT8_C(193) },
      { UINT8_C(169), UINT8_C(  9), UINT8_C(242), UINT8_C(201), UINT8_C(235), UINT8_C(153), UINT8_C(216), UINT8_C( 63),
        UINT8_C(  5), UINT8_C( 77), UINT8_C(246), UINT8_C(121), UINT8_C(137), UINT8_C(212), UINT8_C(  9), UINT8_C(  7) },
      { UINT8_C(213), UINT8_C(233), UINT8_C(211), UINT8_C(116), UINT8_C( 36), UINT8_C(126), UINT8_C(164), UINT8_C(157),
        UINT8_C(128), UINT8_C(227), UINT8_C(127), UINT8_C( 54), UINT8_C(192), UINT8_C(242), UINT8_C(161), UINT8_C(186) } },
    { { UINT8_C(198), UINT8_C(206), UINT8_C( 68), UINT8_C(213), UINT8_C(229), UINT8_C(193), UINT8_C(177), UINT8_C(106),
        UINT8_C(241), UINT8_C( 38), UINT8_C( 25), UINT8_C( 58), UINT8_C(236), UINT8_C(195), UINT8_C(252), UINT8_C(150) },
      { UINT8_C(204), UINT8_C(238), UINT8_C( 95), UINT8_C(184), UINT8_C(135), UINT8_C( 55), UINT8_C(247), UINT8_C(140),
        UINT8_C(133), UINT8_C(238), UINT8_C(  5), UINT8_C( 14), UINT8_C(194), UINT8_C( 14), UINT8_C( 21), UINT8_C(137) },
      { UINT8_C(250), UINT8_C(224), UINT8_C(229), UINT8_C( 29), UINT8_C( 94), UINT8_C(138), UINT8_C(186), UINT8_C(222),
        UINT8_C(108), UINT8_C( 56), UINT8_C( 20), UINT8_C( 44), UINT8_C( 42), UINT8_C(181), UINT8_C(231), UINT8_C( 13) } }
  };

  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);
    simde_uint8x16_t r = simde_vsubq_u8(a, b);

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

  return 0;
}

static int
test_simde_vsubq_u16 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    uint16_t a[8];
    uint16_t b[8];
    uint16_t r[8];
  } test_vec[] = {
    { { UINT16_C(43750), UINT16_C(51981), UINT16_C(43836), UINT16_C(49690), UINT16_C(27185), UINT16_C(26458), UINT16_C(47312), UINT16_C(58715) },
      { UINT16_C( 9265), UINT16_C(46000), UINT16_C(44438), UINT16_C( 9529), UINT16_C(38462), UINT16_C(62869), UINT16_C(57124), UINT16_C( 2719) },
      { UINT16_C(34485), UINT16_C( 5981), UINT16_C(64934), UINT16_C(40161), UINT16_C(54259), UINT16_C(29125), UINT16_C(55724), UINT16_C(55996) } },
    { { UINT16_C(44170), UINT16_C(50902), UINT16_C(61527), UINT16_C(34952), UINT16_C(57946), UINT16_C(11248), UINT16_C(19354), UINT16_C(52240) },
      { UINT16_C(49519), UINT16_C( 1407), UINT16_C(47214), UINT16_C(44331), UINT16_C(49231), UINT16_C(29602), UINT16_C(16800), UINT16_C(10877) },
      { UINT16_C(60187), UINT16_C(49495), UINT16_C(14313), UINT16_C(56157), UINT16_C( 8715), UINT16_C(47182), UINT16_C( 2554), UINT16_C(41363) } },
    { { UINT16_C(21485), UINT16_C(17648), UINT16_C(30787), UINT16_C(40653), UINT16_C(48474), UINT16_C(62665), UINT16_C(55560), UINT16_C(30656) },
      { UINT16_C(16282), UINT16_C( 2429), UINT16_C(43256), UINT16_C(18358), UINT16_C(22632), UINT16_C( 2234), UINT16_C(14233), UINT16_C(34354) },
      { UINT16_C( 5203), UINT16_C(15219), UINT16_C(53067), UINT16_C(22295), UINT16_C(25842), UINT16_C(60431), UINT16_C(41327), UINT16_C(61838) } },
    { { UINT16_C( 8843), UINT16_C(52938), UINT16_C(38810), UINT16_C(62572), UINT16_C(13652), UINT16_C(23785), UINT16_C(43279), UINT16_C(43476) },
      { UINT16_C(20969), UINT16_C(57778), UINT16_C(26873), UINT16_C(24872), UINT16_C(58048), UINT16_C(22890), UINT16_C(39961), UINT16_C(42207) },
      { UINT16_C(53410), UINT16_C(60696), UINT16_C(11937), UINT16_C(37700), UINT16_C(21140), UINT16_C(  895), UINT16_C( 3318), UINT16_C( 1269) } },
    { { UINT16_C(43711), UINT16_C(22899), UINT16_C(57153), UINT16_C(38478), UINT16_C(14101), UINT16_C( 9458), UINT16_C(50912), UINT16_C(51661) },
      { UINT16_C(32791), UINT16_C( 4266), UINT16_C(53992), UINT16_C(43378), UINT16_C(56500), UINT16_C(52738), UINT16_C(57976), UINT16_C(14194) },
      { UINT16_C(10920), UINT16_C(18633), UINT16_C( 3161), UINT16_C(60636), UINT16_C(23137), UINT16_C(22256), UINT16_C(58472), UINT16_C(37467) } },
    { { UINT16_C(58764), UINT16_C(52625), UINT16_C(57285), UINT16_C(55907), UINT16_C(22038), UINT16_C(63230), UINT16_C(51996), UINT16_C(13504) },
      { UINT16_C(27211), UINT16_C(13380), UINT16_C(46653), UINT16_C(61917), UINT16_C(57234), UINT16_C( 3007), UINT16_C(12993), UINT16_C(19778) },
      { UINT16_C(31553), UINT16_C(39245), UINT16_C(10632), UINT16_C(59526), UINT16_C(30340), UINT16_C(60223), UINT16_C(39003), UINT16_C(59262) } },
    { { UINT16_C(54039), UINT16_C(56347), UINT16_C(32434), UINT16_C(51382), UINT16_C(46292), UINT16_C(61887), UINT16_C(32640), UINT16_C(52005) },
      { UINT16_C(27113), UINT16_C( 9983), UINT16_C(56352), UINT16_C(45592), UINT16_C(55228), UINT16_C(32189), UINT16_C(    9), UINT16_C( 8651) },
      { UINT16_C(26926), UINT16_C(46364), UINT16_C(41618), UINT16_C( 5790), UINT16_C(56600), UINT16_C(29698), UINT16_C(32631), UINT16_C(43354) } },
    { { UINT16_C(59091), UINT16_C(34557), UINT16_C(46180), UINT16_C(14670), UINT16_C( 3432), UINT16_C(59434), UINT16_C(20364), UINT16_C(30388) },
      { UINT16_C(46008), UINT16_C(55452), UINT16_C(46224), UINT16_C(19595), UINT16_C(18572), UINT16_C(38345), UINT16_C(37960), UINT16_C( 7350) },
      { UINT16_C(13083), UINT16_C(44641), UINT16_C(65492), UINT16_C(60611), UINT16_C(50396), UINT16_C(21089), UINT16_C(47940), UINT16_C(23038) } }
  };

  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);
    simde_uint16x8_t r = simde_vsubq_u16(a, b);
    simde_test_arm_neon_assert_equal_u16x8(r, simde_vld1q_u16(test_vec[i].r));
  }

  return 0;
}

static int
test_simde_vsubq_u32 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    uint32_t a[4];
    uint32_t b[4];
    uint32_t r[4];
  } test_vec[] = {
    { { UINT32_C(3751982202), UINT32_C(3491295336), UINT32_C(2327397118), UINT32_C(1224764817) },
      { UINT32_C(2955058464), UINT32_C(3724324177), UINT32_C(1047774965), UINT32_C(3579455834) },
      { UINT32_C( 796923738), UINT32_C(4061938455), UINT32_C(1279622153), UINT32_C(1940276279) } },
    { { UINT32_C(1169489117), UINT32_C(3927362796), UINT32_C(2675298062), UINT32_C(1558738236) },
      { UINT32_C(1678576146), UINT32_C(2906720695), UINT32_C( 720090319), UINT32_C(3154068958) },
      { UINT32_C(3785880267), UINT32_C(1020642101), UINT32_C(1955207743), UINT32_C(2699636574) } },
    { { UINT32_C( 755086145), UINT32_C(2367166335), UINT32_C( 573345254), UINT32_C( 360584194) },
      { UINT32_C(3598289695), UINT32_C(1686354581), UINT32_C(1301180015), UINT32_C(4094201267) },
      { UINT32_C(1451763746), UINT32_C( 680811754), UINT32_C(3567132535), UINT32_C( 561350223) } },
    { { UINT32_C(3206678848), UINT32_C( 105658912), UINT32_C(3374872775), UINT32_C(2900273037) },
      { UINT32_C(3347207986), UINT32_C(2167146002), UINT32_C( 684636788), UINT32_C(2283591240) },
      { UINT32_C(4154438158), UINT32_C(2233480206), UINT32_C(2690235987), UINT32_C( 616681797) } },
    { { UINT32_C(   4734688), UINT32_C(1057461368), UINT32_C(2584293133), UINT32_C( 155641814) },
      { UINT32_C(1372637247), UINT32_C(1137900750), UINT32_C(4285243575), UINT32_C(1451722614) },
      { UINT32_C(2927064737), UINT32_C(4214527914), UINT32_C(2594016854), UINT32_C(2998886496) } },
    { { UINT32_C(1045942214), UINT32_C(1904107108), UINT32_C(1678477197), UINT32_C(2909622638) },
      { UINT32_C(3908975897), UINT32_C(4046180410), UINT32_C(3891304048), UINT32_C(3812456221) },
      { UINT32_C(1431933613), UINT32_C(2152893994), UINT32_C(2082140445), UINT32_C(3392133713) } },
    { { UINT32_C(2871170119), UINT32_C(2149359858), UINT32_C(2514757415), UINT32_C(2437108088) },
      { UINT32_C(3363389838), UINT32_C(2193204242), UINT32_C(1483319610), UINT32_C(1748739873) },
      { UINT32_C(3802747577), UINT32_C(4251122912), UINT32_C(1031437805), UINT32_C( 688368215) } },
    { { UINT32_C( 773020987), UINT32_C( 615395325), UINT32_C(3468333654), UINT32_C(1902116323) },
      { UINT32_C(1346033982), UINT32_C(3100898173), UINT32_C(3188735133), UINT32_C( 522603491) },
      { UINT32_C(3721954301), UINT32_C(1809464448), UINT32_C( 279598521), UINT32_C(1379512832) } }
  };

  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);
    simde_uint32x4_t r = simde_vsubq_u32(a, b);

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

  return 0;
}

static int
test_simde_vsubq_u64 (SIMDE_MUNIT_TEST_ARGS) {
  struct {
    uint64_t a[2];
    uint64_t b[2];
    uint64_t r[2];
  } test_vec[] = {
    { { UINT64_C(13748358714363820457), UINT64_C(13898648870508594573) },
      { UINT64_C(12464525672885328836), UINT64_C(18312639204639246880) },
      { UINT64_C( 1283833041478491621), UINT64_C(14032753739578899309) } },
    { { UINT64_C(17937679446536712393), UINT64_C( 3114038371788815349) },
      { UINT64_C( 5557555380804733029), UINT64_C(16412652075366845041) },
      { UINT64_C(12380124065731979364), UINT64_C( 5148130370131521924) } },
    { { UINT64_C(14935910925362031332), UINT64_C( 6705716878113156990) },
      { UINT64_C( 6070836784052403398), UINT64_C(16751385124290662523) },
      { UINT64_C( 8865074141309627934), UINT64_C( 8401075827532046083) } },
    { { UINT64_C( 1005286295086795850), UINT64_C( 8972016764501244205) },
      { UINT64_C(14030593306424989054), UINT64_C(18099070462252798271) },
      { UINT64_C( 5421437062371358412), UINT64_C( 9319690375957997550) } },
    { { UINT64_C( 1150971945603261276), UINT64_C( 7745832836702530379) },
      { UINT64_C(15714891553410182414), UINT64_C(11168727231119650387) },
      { UINT64_C( 3882824465902630478), UINT64_C(15023849679292431608) } },
    { { UINT64_C( 8907979534016847533), UINT64_C(11224091280831009899) },
      { UINT64_C( 7376339916272210152), UINT64_C( 8308414289197825140) },
      { UINT64_C( 1531639617744637381), UINT64_C( 2915676991633184759) } },
    { { UINT64_C(13777815640503210888), UINT64_C(10709519970759848310) },
      { UINT64_C(  784601148808531819), UINT64_C( 4623801230915620594) },
      { UINT64_C(12993214491694679069), UINT64_C( 6085718739844227716) } },
    { { UINT64_C( 5183694642829930205), UINT64_C( 5557700198912427999) },
      { UINT64_C(11536725458092243066), UINT64_C(13832107935466575868) },
      { UINT64_C(12093713258447238755), UINT64_C(10172336337155403747) } }
  };

  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);
    simde_uint64x2_t r = simde_vsubq_u64(a, b);
    simde_test_arm_neon_assert_equal_u64x2(r, simde_vld1q_u64(test_vec[i].r));
  }

  return 0;
}

SIMDE_TEST_FUNC_LIST_BEGIN
SIMDE_TEST_FUNC_LIST_ENTRY(vsubh_f16)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_f16)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_f32)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_f64)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_s8)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_s16)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_s64)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_u8)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_u16)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_u32)
SIMDE_TEST_FUNC_LIST_ENTRY(vsub_u64)

SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_f16)
SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_f32)
SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_f64)
SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_s8)
SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_s16)
SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_s64)
SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_u8)
SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_u16)
SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_u32)
SIMDE_TEST_FUNC_LIST_ENTRY(vsubq_u64)
SIMDE_TEST_FUNC_LIST_END

#include "test-neon-footer.h"