1 #define SIMDE_TEST_ARM_NEON_INSN aba
2 
3 #include "test-neon.h"
4 #include "../../../simde/arm/neon/aba.h"
5 
6 /* https://community.intel.com/t5/Intel-C-Compiler/ICC-generates-incorrect-code/td-p/1199261 */
7 #if defined(HEDLEY_INTEL_VERSION)
8 #  define TEST_SIMDE_VABD_NO_TEST_32
9 #endif
10 
11 static int
test_simde_vaba_s8(SIMDE_MUNIT_TEST_ARGS)12 test_simde_vaba_s8 (SIMDE_MUNIT_TEST_ARGS) {
13 #if 1
14   static const struct {
15     int8_t a[8];
16     int8_t b[8];
17     int8_t c[8];
18     int8_t r[8];
19   } test_vec[] = {
20     { { -INT8_C(  63), -INT8_C(  30),  INT8_C(  29), -INT8_C(  57), -INT8_C(  97), -INT8_C(  25), -INT8_C(  66), -INT8_C(  96) },
21       { -INT8_C( 103),  INT8_C(  34),  INT8_C(  89),  INT8_C(   7), -INT8_C(  11),  INT8_C( 119), -INT8_C(  68),  INT8_C(   2) },
22       {  INT8_C(  18),  INT8_C(  15),  INT8_C(  41), -INT8_C(  14), -INT8_C(  24),      INT8_MIN, -INT8_C(  66), -INT8_C( 116) },
23       {  INT8_C(  58), -INT8_C(  11),  INT8_C(  77), -INT8_C(  36), -INT8_C(  84), -INT8_C(  34), -INT8_C(  64),  INT8_C(  22) } },
24     { {  INT8_C(  10), -INT8_C(  95), -INT8_C(  46),  INT8_C(  88),  INT8_C(  46),  INT8_C(  34),  INT8_C(  80), -INT8_C(  17) },
25       {  INT8_C(   4),  INT8_C( 109), -INT8_C(  73), -INT8_C(  93),  INT8_C(  85),  INT8_C( 117),  INT8_C(  67), -INT8_C(  18) },
26       { -INT8_C( 104), -INT8_C(  99), -INT8_C(  10), -INT8_C( 115),  INT8_C(  20), -INT8_C(  78), -INT8_C( 113),  INT8_C(  39) },
27       {  INT8_C( 118),  INT8_C( 113),  INT8_C(  17),  INT8_C( 110),  INT8_C( 111), -INT8_C(  27),  INT8_C(   4),  INT8_C(  40) } },
28     { { -INT8_C(  62), -INT8_C(  71),  INT8_C(  25), -INT8_C(  86),  INT8_C(  57), -INT8_C(  40),  INT8_C(  55),  INT8_C(  67) },
29       {  INT8_C( 121),  INT8_C(   9), -INT8_C( 101), -INT8_C(  89),  INT8_C(  43), -INT8_C(  20), -INT8_C( 105),  INT8_C(  47) },
30       {  INT8_C(  89),  INT8_C(  78), -INT8_C(  45), -INT8_C(  82), -INT8_C(  61),  INT8_C(  22), -INT8_C(  99),  INT8_C(  91) },
31       { -INT8_C(  30), -INT8_C(   2),  INT8_C(  81), -INT8_C(  79), -INT8_C(  95),  INT8_C(   2),  INT8_C(  61),  INT8_C( 111) } },
32     { { -INT8_C(  77), -INT8_C( 109), -INT8_C(  23), -INT8_C(  56),  INT8_C(  69),  INT8_C( 120), -INT8_C(  17),  INT8_C(   7) },
33       {  INT8_C(  49),  INT8_C(   8), -INT8_C(  78),  INT8_C( 106), -INT8_C(  32), -INT8_C(  23), -INT8_C(  83),  INT8_C(  89) },
34       { -INT8_C(  14),  INT8_C(  73),  INT8_C(   1),  INT8_C(  29),  INT8_C(  53), -INT8_C( 104),  INT8_C(  76), -INT8_C( 114) },
35       { -INT8_C(  14), -INT8_C(  44),  INT8_C(  56),  INT8_C(  21), -INT8_C( 102), -INT8_C(  55), -INT8_C( 114), -INT8_C(  46) } },
36     { { -INT8_C(  26),  INT8_C(  31),  INT8_C(  61), -INT8_C(  87),  INT8_C(  54), -INT8_C(  38),  INT8_C(   5), -INT8_C(  23) },
37       {  INT8_C( 109), -INT8_C(  18), -INT8_C(  79), -INT8_C(  78),  INT8_C( 102), -INT8_C(  96), -INT8_C(  70), -INT8_C( 104) },
38       { -INT8_C(  87),  INT8_C( 108),  INT8_C(   2), -INT8_C( 119),  INT8_C(  85), -INT8_C(  80), -INT8_C(  29),  INT8_C(  71) },
39       { -INT8_C(  86), -INT8_C(  99), -INT8_C( 114), -INT8_C(  46),  INT8_C(  71), -INT8_C(  22),  INT8_C(  46), -INT8_C( 104) } },
40     { { -INT8_C(   7), -INT8_C(  28),  INT8_C( 100),  INT8_C(  46),  INT8_C( 124), -INT8_C(  80), -INT8_C(  68),  INT8_C(  98) },
41       { -INT8_C(  48), -INT8_C(   7),  INT8_C(  11),  INT8_C(   6), -INT8_C(  45),  INT8_C(  16), -INT8_C(  17),  INT8_C(  64) },
42       { -INT8_C(   2), -INT8_C(  95), -INT8_C(  13),  INT8_C( 101),  INT8_C(  65), -INT8_C(  83), -INT8_C(   3), -INT8_C(  22) },
43       {  INT8_C(  39),  INT8_C(  60),  INT8_C( 124), -INT8_C( 115), -INT8_C(  22),  INT8_C(  19), -INT8_C(  54), -INT8_C(  72) } },
44     { {  INT8_C(  25), -INT8_C(   1),  INT8_C( 116),  INT8_C( 110), -INT8_C(  81),  INT8_C(  87), -INT8_C(  75), -INT8_C(  88) },
45       {  INT8_C(  59),  INT8_C(  25), -INT8_C(  42), -INT8_C(  73), -INT8_C(  55), -INT8_C( 109),  INT8_C(  25), -INT8_C( 103) },
46       { -INT8_C( 116),  INT8_C(  36), -INT8_C(  97),  INT8_C(  96),  INT8_C(  53), -INT8_C( 113), -INT8_C(  96),  INT8_C(  51) },
47       { -INT8_C(  56),  INT8_C(  10), -INT8_C(  85),  INT8_C(  23),  INT8_C(  27),  INT8_C(  91),  INT8_C(  46),  INT8_C(  66) } },
48     { {  INT8_C(  48), -INT8_C( 109), -INT8_C( 104),  INT8_C( 113),  INT8_C(  64), -INT8_C( 107),  INT8_C(  92),  INT8_C(  89) },
49       { -INT8_C( 107), -INT8_C(  48), -INT8_C(  57),  INT8_C(  68),  INT8_C(  39),  INT8_C( 124), -INT8_C(  19),  INT8_C(  98) },
50       { -INT8_C( 107), -INT8_C(  61),  INT8_C(  25),  INT8_C(  95),  INT8_C(  86),  INT8_C(  50), -INT8_C(   8), -INT8_C(  29) },
51       {  INT8_C(  48), -INT8_C(  96), -INT8_C(  22), -INT8_C( 116),  INT8_C( 111), -INT8_C(  33),  INT8_C( 103), -INT8_C(  40) } }
52   };
53 
54   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
55     simde_int8x8_t a = simde_vld1_s8(test_vec[i].a);
56     simde_int8x8_t b = simde_vld1_s8(test_vec[i].b);
57     simde_int8x8_t c = simde_vld1_s8(test_vec[i].c);
58     simde_int8x8_t r = simde_vaba_s8(a, b, c);
59 
60     simde_test_arm_neon_assert_equal_i8x8(r, simde_vld1_s8(test_vec[i].r));
61   }
62 
63   return 0;
64 #else
65   fputc('\n', stdout);
66   for (int i = 0 ; i < 8 ; i++) {
67     simde_int8x8_t a = simde_test_arm_neon_random_i8x8();
68     simde_int8x8_t b = simde_test_arm_neon_random_i8x8();
69     simde_int8x8_t c = simde_test_arm_neon_random_i8x8();
70     simde_int8x8_t r = simde_vaba_s8(a, b, c);
71 
72     simde_test_arm_neon_write_i8x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
73     simde_test_arm_neon_write_i8x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
74     simde_test_arm_neon_write_i8x8(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
75     simde_test_arm_neon_write_i8x8(2, r, SIMDE_TEST_VEC_POS_LAST);
76   }
77   return 1;
78 #endif
79 }
80 
81 static int
test_simde_vaba_s16(SIMDE_MUNIT_TEST_ARGS)82 test_simde_vaba_s16 (SIMDE_MUNIT_TEST_ARGS) {
83 #if 1
84   static const struct {
85     int16_t a[4];
86     int16_t b[4];
87     int16_t c[4];
88     int16_t r[4];
89   } test_vec[] = {
90     { { -INT16_C( 17843),  INT16_C( 24491), -INT16_C( 27890), -INT16_C( 20171) },
91       { -INT16_C( 23451), -INT16_C(  7916),  INT16_C( 14616),  INT16_C( 19459) },
92       {  INT16_C( 27799), -INT16_C( 19103), -INT16_C( 26200),  INT16_C(  3764) },
93       { -INT16_C( 32129), -INT16_C( 29858),  INT16_C( 12926), -INT16_C(  4476) } },
94     { { -INT16_C( 27609), -INT16_C( 31965), -INT16_C( 14129),  INT16_C(  7408) },
95       { -INT16_C( 25470), -INT16_C( 28549), -INT16_C( 20433), -INT16_C( 27326) },
96       {  INT16_C( 22101),  INT16_C( 28022),  INT16_C( 31120),  INT16_C( 10169) },
97       {  INT16_C( 19962),  INT16_C( 24606), -INT16_C( 28112), -INT16_C( 20633) } },
98     { {  INT16_C(  6886), -INT16_C( 28964), -INT16_C( 28237), -INT16_C(  9571) },
99       { -INT16_C( 16347), -INT16_C(  2978),  INT16_C( 20104),  INT16_C(  2576) },
100       { -INT16_C( 29718),  INT16_C(  6811), -INT16_C(  8901), -INT16_C( 28497) },
101       {  INT16_C( 20257), -INT16_C( 19175),  INT16_C(   768),  INT16_C( 21502) } },
102     { {  INT16_C(  9523), -INT16_C( 15363), -INT16_C( 18785), -INT16_C( 31253) },
103       { -INT16_C( 14383), -INT16_C( 31725), -INT16_C( 20392),  INT16_C( 32095) },
104       { -INT16_C( 17040), -INT16_C(  1935), -INT16_C( 32501), -INT16_C(  2557) },
105       {  INT16_C( 12180),  INT16_C( 14427), -INT16_C(  6676),  INT16_C(  3399) } },
106     { { -INT16_C( 25076),  INT16_C( 18448), -INT16_C( 16517), -INT16_C( 20776) },
107       { -INT16_C( 10524), -INT16_C( 31886),  INT16_C( 23948),  INT16_C( 23816) },
108       {  INT16_C(  7204),  INT16_C( 32226),  INT16_C( 16844),  INT16_C( 15866) },
109       { -INT16_C(  7348),  INT16_C( 17024), -INT16_C(  9413), -INT16_C( 12826) } },
110     { {  INT16_C( 27902),  INT16_C(  2357),  INT16_C( 14573), -INT16_C(  1281) },
111       {  INT16_C(  4054),  INT16_C( 20802),  INT16_C(  6862), -INT16_C( 19712) },
112       {  INT16_C( 29424),  INT16_C( 32054),  INT16_C( 16335), -INT16_C(  3110) },
113       { -INT16_C( 12264),  INT16_C( 13609),  INT16_C( 24046),  INT16_C( 15321) } },
114     { { -INT16_C( 17317),  INT16_C( 10096),  INT16_C( 27645), -INT16_C(  1180) },
115       { -INT16_C( 25897), -INT16_C( 15355),  INT16_C(  1234), -INT16_C( 22082) },
116       {  INT16_C(    20), -INT16_C(  7430), -INT16_C(  1509),  INT16_C(  2965) },
117       {  INT16_C(  8600),  INT16_C( 18021),  INT16_C( 30388),  INT16_C( 23867) } },
118     { { -INT16_C( 13204),  INT16_C( 15240),  INT16_C( 25355),  INT16_C( 26159) },
119       { -INT16_C( 24801),  INT16_C(  7565), -INT16_C(  3574), -INT16_C(  7912) },
120       {  INT16_C(  7564),  INT16_C( 24230),  INT16_C( 25634),  INT16_C( 13831) },
121       {  INT16_C( 19161),  INT16_C( 31905), -INT16_C( 10973), -INT16_C( 17634) } }
122   };
123 
124   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
125     simde_int16x4_t a = simde_vld1_s16(test_vec[i].a);
126     simde_int16x4_t b = simde_vld1_s16(test_vec[i].b);
127     simde_int16x4_t c = simde_vld1_s16(test_vec[i].c);
128     simde_int16x4_t r = simde_vaba_s16(a, b, c);
129 
130     simde_test_arm_neon_assert_equal_i16x4(r, simde_vld1_s16(test_vec[i].r));
131   }
132 
133   return 0;
134 #else
135   fputc('\n', stdout);
136   for (int i = 0 ; i < 8 ; i++) {
137     simde_int16x4_t a = simde_test_arm_neon_random_i16x4();
138     simde_int16x4_t b = simde_test_arm_neon_random_i16x4();
139     simde_int16x4_t c = simde_test_arm_neon_random_i16x4();
140     simde_int16x4_t r = simde_vaba_s16(a, b, c);
141 
142     simde_test_arm_neon_write_i16x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
143     simde_test_arm_neon_write_i16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
144     simde_test_arm_neon_write_i16x4(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
145     simde_test_arm_neon_write_i16x4(2, r, SIMDE_TEST_VEC_POS_LAST);
146   }
147   return 1;
148 #endif
149 }
150 
151 static int
test_simde_vaba_s32(SIMDE_MUNIT_TEST_ARGS)152 test_simde_vaba_s32 (SIMDE_MUNIT_TEST_ARGS) {
153 #if 1
154   static const struct {
155     int32_t a[2];
156     int32_t b[2];
157     int32_t c[2];
158     int32_t r[2];
159   } test_vec[] = {
160     { { -INT32_C(   850247872),  INT32_C(   228627924) },
161       { -INT32_C(  1002407850), -INT32_C(  1479470080) },
162       {  INT32_C(   156520649),  INT32_C(  1948288923) },
163       {  INT32_C(   308680627), -INT32_C(   638580369) } },
164     { {  INT32_C(  1567609108), -INT32_C(  1636072610) },
165       { -INT32_C(  1771254078), -INT32_C(  1163654045) },
166       { -INT32_C(  2072058748), -INT32_C(  1037348615) },
167       {  INT32_C(  1868413778), -INT32_C(  1509767180) } },
168     { {  INT32_C(  1003192480),  INT32_C(   464579591) },
169       {  INT32_C(   477700029),  INT32_C(  1706751138) },
170       {  INT32_C(   653993666), -INT32_C(  1210015950) },
171       {  INT32_C(  1179486117), -INT32_C(   913620617) } },
172     { {  INT32_C(  2101042820),  INT32_C(  1312778158) },
173       { -INT32_C(   292942873), -INT32_C(  1274397961) },
174       { -INT32_C(    70220967),  INT32_C(   979405687) },
175       { -INT32_C(  1971202570), -INT32_C(   728385490) } },
176     { { -INT32_C(   463446863),  INT32_C(  2140881147) },
177       {  INT32_C(  1308415646),  INT32_C(   614153277) },
178       {  INT32_C(  1041442119), -INT32_C(  1192092321) },
179       { -INT32_C(   196473336), -INT32_C(   347840551) } },
180     { {  INT32_C(   397722528), -INT32_C(    11463602) },
181       {  INT32_C(  1826861424), -INT32_C(  1863614735) },
182       { -INT32_C(  1830950827),  INT32_C(  1807185956) },
183       { -INT32_C(   239432517), -INT32_C(   635630207) } },
184     { { -INT32_C(    39204194), -INT32_C(  2018075673) },
185       { -INT32_C(  1398904226), -INT32_C(   273878914) },
186       { -INT32_C(  1822715999),  INT32_C(  1663256078) },
187       {  INT32_C(   384607579), -INT32_C(    80940681) } },
188     { {  INT32_C(  1391788078),  INT32_C(   381529208) },
189       {  INT32_C(  1561618038),  INT32_C(  1625606658) },
190       { -INT32_C(  1307737292),  INT32_C(   346143091) },
191       { -INT32_C(    33823888),  INT32_C(  1660992775) } }
192   };
193 
194   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
195     simde_int32x2_t a = simde_vld1_s32(test_vec[i].a);
196     simde_int32x2_t b = simde_vld1_s32(test_vec[i].b);
197     simde_int32x2_t c = simde_vld1_s32(test_vec[i].c);
198     simde_int32x2_t r = simde_vaba_s32(a, b, c);
199 
200     simde_test_arm_neon_assert_equal_i32x2(r, simde_vld1_s32(test_vec[i].r));
201   }
202 
203   return 0;
204 #else
205   fputc('\n', stdout);
206   for (int i = 0 ; i < 8 ; i++) {
207     simde_int32x2_t a = simde_test_arm_neon_random_i32x2();
208     simde_int32x2_t b = simde_test_arm_neon_random_i32x2();
209     simde_int32x2_t c = simde_test_arm_neon_random_i32x2();
210     simde_int32x2_t r = simde_vaba_s32(a, b, c);
211 
212     simde_test_arm_neon_write_i32x2(2, a, SIMDE_TEST_VEC_POS_FIRST);
213     simde_test_arm_neon_write_i32x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
214     simde_test_arm_neon_write_i32x2(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
215     simde_test_arm_neon_write_i32x2(2, r, SIMDE_TEST_VEC_POS_LAST);
216   }
217   return 1;
218 #endif
219 }
220 
221 static int
test_simde_vaba_u8(SIMDE_MUNIT_TEST_ARGS)222 test_simde_vaba_u8 (SIMDE_MUNIT_TEST_ARGS) {
223 #if 1
224   static const struct {
225     uint8_t a[8];
226     uint8_t b[8];
227     uint8_t c[8];
228     uint8_t r[8];
229   } test_vec[] = {
230     { { UINT8_C( 17), UINT8_C(246), UINT8_C(124), UINT8_C( 27), UINT8_C(  1), UINT8_C( 92), UINT8_C(248), UINT8_C(208) },
231       { UINT8_C(212), UINT8_C(211), UINT8_C(252), UINT8_C( 10), UINT8_C( 66), UINT8_C( 76), UINT8_C( 57), UINT8_C(253) },
232       { UINT8_C( 40), UINT8_C(175), UINT8_C(209), UINT8_C(209), UINT8_C(140), UINT8_C(241), UINT8_C(147), UINT8_C(212) },
233       { UINT8_C(189), UINT8_C( 26), UINT8_C(167), UINT8_C(226), UINT8_C( 75), UINT8_C(  1), UINT8_C( 82), UINT8_C(249) } },
234     { { UINT8_C( 17), UINT8_C(152), UINT8_C(248), UINT8_C( 62), UINT8_C(  2), UINT8_C(241), UINT8_C( 63), UINT8_C( 19) },
235       { UINT8_C(231), UINT8_C(188), UINT8_C( 46), UINT8_C(233), UINT8_C( 24), UINT8_C( 39), UINT8_C(185), UINT8_C(236) },
236       { UINT8_C(250), UINT8_C(181), UINT8_C(247), UINT8_C( 60), UINT8_C(  1), UINT8_C( 48), UINT8_C( 58), UINT8_C( 41) },
237       { UINT8_C( 36), UINT8_C(159), UINT8_C(193), UINT8_C(235), UINT8_C( 25), UINT8_C(250), UINT8_C(190), UINT8_C(214) } },
238     { { UINT8_C(223), UINT8_C( 11), UINT8_C(251), UINT8_C(108), UINT8_C(252), UINT8_C(142), UINT8_C( 64), UINT8_C( 13) },
239       { UINT8_C( 38), UINT8_C( 57), UINT8_C( 75), UINT8_C( 40), UINT8_C( 42), UINT8_C(139), UINT8_C( 60), UINT8_C( 18) },
240       { UINT8_C( 71), UINT8_C(106), UINT8_C(251), UINT8_C( 95), UINT8_C(145), UINT8_C(180), UINT8_C( 76), UINT8_C(140) },
241       { UINT8_C(  0), UINT8_C( 60), UINT8_C(171), UINT8_C(163), UINT8_C( 99), UINT8_C(183), UINT8_C( 80), UINT8_C(135) } },
242     { { UINT8_C(105), UINT8_C( 67), UINT8_C(200), UINT8_C(106), UINT8_C(115), UINT8_C(  2), UINT8_C(148), UINT8_C( 82) },
243       { UINT8_C( 13), UINT8_C(143), UINT8_C(190), UINT8_C(  9), UINT8_C( 29),    UINT8_MAX, UINT8_C( 23), UINT8_C( 67) },
244       { UINT8_C( 56), UINT8_C( 98), UINT8_C(107), UINT8_C( 98), UINT8_C(237), UINT8_C(167), UINT8_C(116), UINT8_C( 52) },
245       { UINT8_C(148), UINT8_C(112), UINT8_C( 27), UINT8_C(195), UINT8_C( 67), UINT8_C( 90), UINT8_C(241), UINT8_C( 97) } },
246     { { UINT8_C( 18), UINT8_C(111), UINT8_C(148), UINT8_C(163), UINT8_C( 35), UINT8_C(224), UINT8_C( 47), UINT8_C(140) },
247       { UINT8_C( 35), UINT8_C(248), UINT8_C(247), UINT8_C(150), UINT8_C(250), UINT8_C(139), UINT8_C(232), UINT8_C(  8) },
248       { UINT8_C( 26), UINT8_C(167), UINT8_C( 17), UINT8_C( 55), UINT8_C(166), UINT8_C( 40), UINT8_C(122), UINT8_C(222) },
249       { UINT8_C( 27), UINT8_C(192), UINT8_C(122), UINT8_C(  2), UINT8_C(119), UINT8_C( 67), UINT8_C(157), UINT8_C( 98) } },
250     { { UINT8_C(139), UINT8_C(229), UINT8_C( 64), UINT8_C(120), UINT8_C(141), UINT8_C(181), UINT8_C(173), UINT8_C(159) },
251       { UINT8_C( 36), UINT8_C( 65), UINT8_C( 66), UINT8_C( 72), UINT8_C( 33), UINT8_C(114), UINT8_C(212), UINT8_C( 68) },
252       { UINT8_C(106), UINT8_C(203), UINT8_C(218), UINT8_C(100), UINT8_C( 86), UINT8_C(194), UINT8_C(108), UINT8_C(112) },
253       { UINT8_C(209), UINT8_C(111), UINT8_C(216), UINT8_C(148), UINT8_C(194), UINT8_C(  5), UINT8_C( 21), UINT8_C(203) } },
254     { { UINT8_C(105), UINT8_C(126), UINT8_C(167), UINT8_C( 15), UINT8_C(166), UINT8_C( 33), UINT8_C(237), UINT8_C( 49) },
255       { UINT8_C(  7), UINT8_C( 46), UINT8_C(170), UINT8_C(148), UINT8_C(227), UINT8_C( 87), UINT8_C( 51), UINT8_C(  7) },
256       { UINT8_C(152), UINT8_C(117), UINT8_C( 79), UINT8_C(185), UINT8_C(231), UINT8_C( 36), UINT8_C(253), UINT8_C( 81) },
257       { UINT8_C(250), UINT8_C(197), UINT8_C(  2), UINT8_C( 52), UINT8_C(170), UINT8_C( 84), UINT8_C(183), UINT8_C(123) } },
258     { { UINT8_C(239), UINT8_C(215), UINT8_C(182), UINT8_C( 70), UINT8_C(153), UINT8_C( 34), UINT8_C(182), UINT8_C(  3) },
259       { UINT8_C(160), UINT8_C( 94), UINT8_C( 18), UINT8_C( 71), UINT8_C(127), UINT8_C(  0), UINT8_C(120), UINT8_C(134) },
260       { UINT8_C( 46), UINT8_C( 34), UINT8_C( 26), UINT8_C( 17), UINT8_C(121), UINT8_C( 77), UINT8_C( 24), UINT8_C( 17) },
261       { UINT8_C( 97), UINT8_C( 19), UINT8_C(190), UINT8_C(124), UINT8_C(159), UINT8_C(111), UINT8_C( 22), UINT8_C(120) } }
262   };
263 
264   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
265     simde_uint8x8_t a = simde_vld1_u8(test_vec[i].a);
266     simde_uint8x8_t b = simde_vld1_u8(test_vec[i].b);
267     simde_uint8x8_t c = simde_vld1_u8(test_vec[i].c);
268     simde_uint8x8_t r = simde_vaba_u8(a, b, c);
269 
270     simde_test_arm_neon_assert_equal_u8x8(r, simde_vld1_u8(test_vec[i].r));
271   }
272 
273   return 0;
274 #else
275   fputc('\n', stdout);
276   for (int i = 0 ; i < 8 ; i++) {
277     simde_uint8x8_t a = simde_test_arm_neon_random_u8x8();
278     simde_uint8x8_t b = simde_test_arm_neon_random_u8x8();
279     simde_uint8x8_t c = simde_test_arm_neon_random_u8x8();
280     simde_uint8x8_t r = simde_vaba_u8(a, b, c);
281 
282     simde_test_arm_neon_write_u8x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
283     simde_test_arm_neon_write_u8x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
284     simde_test_arm_neon_write_u8x8(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
285     simde_test_arm_neon_write_u8x8(2, r, SIMDE_TEST_VEC_POS_LAST);
286   }
287   return 1;
288 #endif
289 }
290 
291 static int
test_simde_vaba_u16(SIMDE_MUNIT_TEST_ARGS)292 test_simde_vaba_u16 (SIMDE_MUNIT_TEST_ARGS) {
293 #if 1
294   static const struct {
295     uint16_t a[4];
296     uint16_t b[4];
297     uint16_t c[4];
298     uint16_t r[4];
299   } test_vec[] = {
300     { { UINT16_C(26819), UINT16_C(43722), UINT16_C(51084), UINT16_C(31740) },
301       { UINT16_C(45726), UINT16_C(14529), UINT16_C(30932), UINT16_C(30011) },
302       { UINT16_C(19926), UINT16_C(21948), UINT16_C(13389), UINT16_C(31708) },
303       { UINT16_C(52619), UINT16_C(51141), UINT16_C( 3091), UINT16_C(33437) } },
304     { { UINT16_C(63063), UINT16_C(53388), UINT16_C(42308), UINT16_C( 2018) },
305       { UINT16_C(44045), UINT16_C(39345), UINT16_C(44404), UINT16_C( 4628) },
306       { UINT16_C(54879), UINT16_C(13386), UINT16_C(34126), UINT16_C( 9385) },
307       { UINT16_C( 8361), UINT16_C(13811), UINT16_C(52586), UINT16_C( 6775) } },
308     { { UINT16_C(26067), UINT16_C( 8313), UINT16_C(21913), UINT16_C(61596) },
309       { UINT16_C(10316), UINT16_C(37057), UINT16_C(41933), UINT16_C(55959) },
310       { UINT16_C(18511), UINT16_C(50035), UINT16_C(35062), UINT16_C(21974) },
311       { UINT16_C(34262), UINT16_C(21291), UINT16_C(28784), UINT16_C(30045) } },
312     { { UINT16_C( 8286), UINT16_C(44169), UINT16_C(12966), UINT16_C(31184) },
313       { UINT16_C(18839), UINT16_C(12697), UINT16_C(13727), UINT16_C(60193) },
314       { UINT16_C(57950), UINT16_C(11131), UINT16_C( 4741), UINT16_C(54534) },
315       { UINT16_C(47397), UINT16_C(45735), UINT16_C(21952), UINT16_C(36843) } },
316     { { UINT16_C(31066), UINT16_C(20632), UINT16_C(28161), UINT16_C(24486) },
317       { UINT16_C(12175), UINT16_C(13579), UINT16_C(56162), UINT16_C(63918) },
318       { UINT16_C(18213), UINT16_C(50218), UINT16_C(19581), UINT16_C(56239) },
319       { UINT16_C(37104), UINT16_C(57271), UINT16_C(64742), UINT16_C(32165) } },
320     { { UINT16_C(10798), UINT16_C(46086), UINT16_C( 3132), UINT16_C(38537) },
321       { UINT16_C( 8582), UINT16_C(34791), UINT16_C(36240), UINT16_C( 8167) },
322       { UINT16_C(62140), UINT16_C( 7764), UINT16_C(  718), UINT16_C(62232) },
323       { UINT16_C(64356), UINT16_C( 7577), UINT16_C(38654), UINT16_C(27066) } },
324     { { UINT16_C(16969), UINT16_C(50871), UINT16_C(26254), UINT16_C(48545) },
325       { UINT16_C(43152), UINT16_C(52337), UINT16_C(64180), UINT16_C(14946) },
326       { UINT16_C(18715), UINT16_C(43970), UINT16_C(43478), UINT16_C(37834) },
327       { UINT16_C(41406), UINT16_C(59238), UINT16_C(46956), UINT16_C( 5897) } },
328     { { UINT16_C( 7835), UINT16_C(27057), UINT16_C(51488), UINT16_C(27228) },
329       { UINT16_C( 4876), UINT16_C(39472), UINT16_C(53881), UINT16_C( 2391) },
330       { UINT16_C(51322), UINT16_C(11989), UINT16_C(14530), UINT16_C(56937) },
331       { UINT16_C(54281), UINT16_C(54540), UINT16_C(25303), UINT16_C(16238) } }
332   };
333 
334   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
335     simde_uint16x4_t a = simde_vld1_u16(test_vec[i].a);
336     simde_uint16x4_t b = simde_vld1_u16(test_vec[i].b);
337     simde_uint16x4_t c = simde_vld1_u16(test_vec[i].c);
338     simde_uint16x4_t r = simde_vaba_u16(a, b, c);
339 
340     simde_test_arm_neon_assert_equal_u16x4(r, simde_vld1_u16(test_vec[i].r));
341   }
342 
343   return 0;
344 #else
345   fputc('\n', stdout);
346   for (int i = 0 ; i < 8 ; i++) {
347     simde_uint16x4_t a = simde_test_arm_neon_random_u16x4();
348     simde_uint16x4_t b = simde_test_arm_neon_random_u16x4();
349     simde_uint16x4_t c = simde_test_arm_neon_random_u16x4();
350     simde_uint16x4_t r = simde_vaba_u16(a, b, c);
351 
352     simde_test_arm_neon_write_u16x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
353     simde_test_arm_neon_write_u16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
354     simde_test_arm_neon_write_u16x4(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
355     simde_test_arm_neon_write_u16x4(2, r, SIMDE_TEST_VEC_POS_LAST);
356   }
357   return 1;
358 #endif
359 }
360 
361 static int
test_simde_vaba_u32(SIMDE_MUNIT_TEST_ARGS)362 test_simde_vaba_u32 (SIMDE_MUNIT_TEST_ARGS) {
363 #if 1
364   static const struct {
365     uint32_t a[2];
366     uint32_t b[2];
367     uint32_t c[2];
368     uint32_t r[2];
369   } test_vec[] = {
370     { { UINT32_C(1485384577), UINT32_C(1877693652) },
371       { UINT32_C(2480512114), UINT32_C(1929196902) },
372       { UINT32_C(3255577929), UINT32_C(2043438335) },
373       { UINT32_C(2260450392), UINT32_C(1991935085) } },
374     { { UINT32_C(4020805932), UINT32_C(1540166105) },
375       { UINT32_C( 280188476), UINT32_C( 494902954) },
376       { UINT32_C(2695911482), UINT32_C(3608325518) },
377       { UINT32_C(2141561642), UINT32_C( 358621373) } },
378     { { UINT32_C(3667468250), UINT32_C(2941478275) },
379       { UINT32_C(3768515335), UINT32_C(1211853580) },
380       { UINT32_C(1817767618), UINT32_C(3347699852) },
381       { UINT32_C(1323248671), UINT32_C( 782357251) } },
382     { { UINT32_C(3194435888), UINT32_C(3247799014) },
383       { UINT32_C( 479932313), UINT32_C(2613833364) },
384       { UINT32_C(4135348970), UINT32_C(2537535445) },
385       { UINT32_C(2554885249), UINT32_C(3324096933) } },
386     { { UINT32_C( 839161766), UINT32_C(2700709231) },
387       { UINT32_C(2908643783), UINT32_C(1953428699) },
388       { UINT32_C(3079670051), UINT32_C(3797113848) },
389       { UINT32_C(1010188034), UINT32_C( 249427084) } },
390     { { UINT32_C(2614677445), UINT32_C( 741480326) },
391       { UINT32_C( 509556399), UINT32_C(2344507588) },
392       { UINT32_C(2486705593), UINT32_C( 872982289) },
393       { UINT32_C( 296859343), UINT32_C(2213005625) } },
394     { { UINT32_C(2834012336), UINT32_C(3112845044) },
395       { UINT32_C(2488558349), UINT32_C( 700483450) },
396       { UINT32_C(2168987581), UINT32_C( 822871672) },
397       { UINT32_C(3153583104), UINT32_C(3235233266) } },
398     { { UINT32_C( 885409059), UINT32_C(2624114412) },
399       { UINT32_C(1531270247), UINT32_C(2685718418) },
400       { UINT32_C(2905893170), UINT32_C(2916545776) },
401       { UINT32_C(2260031982), UINT32_C(2854941770) } }
402   };
403 
404   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
405     simde_uint32x2_t a = simde_vld1_u32(test_vec[i].a);
406     simde_uint32x2_t b = simde_vld1_u32(test_vec[i].b);
407     simde_uint32x2_t c = simde_vld1_u32(test_vec[i].c);
408     simde_uint32x2_t r = simde_vaba_u32(a, b, c);
409 
410     simde_test_arm_neon_assert_equal_u32x2(r, simde_vld1_u32(test_vec[i].r));
411   }
412 
413   return 0;
414 #else
415   fputc('\n', stdout);
416   for (int i = 0 ; i < 8 ; i++) {
417     simde_uint32x2_t a = simde_test_arm_neon_random_u32x2();
418     simde_uint32x2_t b = simde_test_arm_neon_random_u32x2();
419     simde_uint32x2_t c = simde_test_arm_neon_random_u32x2();
420     simde_uint32x2_t r = simde_vaba_u32(a, b, c);
421 
422     simde_test_arm_neon_write_u32x2(2, a, SIMDE_TEST_VEC_POS_FIRST);
423     simde_test_arm_neon_write_u32x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
424     simde_test_arm_neon_write_u32x2(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
425     simde_test_arm_neon_write_u32x2(2, r, SIMDE_TEST_VEC_POS_LAST);
426   }
427   return 1;
428 #endif
429 }
430 
431 static int
test_simde_vabaq_s8(SIMDE_MUNIT_TEST_ARGS)432 test_simde_vabaq_s8 (SIMDE_MUNIT_TEST_ARGS) {
433 #if 1
434   static const struct {
435     int8_t a[16];
436     int8_t b[16];
437     int8_t c[16];
438     int8_t r[16];
439   } test_vec[] = {
440     { {  INT8_C(  74),  INT8_C( 104), -INT8_C(  55),  INT8_C(  64), -INT8_C(  42), -INT8_C(  57),  INT8_C(  12), -INT8_C(  72),
441         -INT8_C(  63),  INT8_C(  99), -INT8_C( 106), -INT8_C(  48),  INT8_C(  72),  INT8_C(  62),  INT8_C(  20),  INT8_C(  88) },
442       {  INT8_C(  87), -INT8_C(  93),  INT8_C( 118), -INT8_C(  53), -INT8_C(  18),  INT8_C(  24),  INT8_C(  78), -INT8_C(  62),
443         -INT8_C(  33), -INT8_C( 104),  INT8_C(  27),  INT8_C(  88),  INT8_C(  68),  INT8_C( 102),  INT8_C( 102), -INT8_C( 114) },
444       { -INT8_C(  50),  INT8_C(  47), -INT8_C(  50), -INT8_C(  92), -INT8_C(   9), -INT8_C(  37),  INT8_C(  93), -INT8_C(  72),
445          INT8_C(  62), -INT8_C(  13), -INT8_C( 120), -INT8_C( 122),  INT8_C(  50), -INT8_C( 100), -INT8_C(  33), -INT8_C( 119) },
446       { -INT8_C(  45), -INT8_C(  12),  INT8_C( 113),  INT8_C( 103), -INT8_C(  33),  INT8_C(   4),  INT8_C(  27), -INT8_C(  62),
447          INT8_C(  32), -INT8_C(  66),  INT8_C(  41), -INT8_C(  94),  INT8_C(  90),  INT8_C(   8), -INT8_C( 101),  INT8_C(  93) } },
448     { {  INT8_C(  63),  INT8_C(  85),  INT8_C(  84),  INT8_C(  45),  INT8_C( 110), -INT8_C(  94), -INT8_C(  16),  INT8_C(  77),
449          INT8_C(  59),  INT8_C(  11), -INT8_C(  91),      INT8_MAX,  INT8_C( 113),  INT8_C(  12),  INT8_C(  13),  INT8_C(  63) },
450       {  INT8_C(  59), -INT8_C(  36), -INT8_C(  28),  INT8_C(  50), -INT8_C(  73),  INT8_C(  65), -INT8_C(  22), -INT8_C(  11),
451          INT8_C(  52),  INT8_C( 115),  INT8_C( 124),  INT8_C( 102),  INT8_C(  15),  INT8_C(  91), -INT8_C(  17),  INT8_C(  79) },
452       { -INT8_C(  80),  INT8_C(  67),  INT8_C( 124),  INT8_C(  30), -INT8_C(  26),  INT8_C( 108),  INT8_C( 107),  INT8_C(  33),
453          INT8_C( 119),  INT8_C(  17), -INT8_C(  96), -INT8_C(  24),  INT8_C(  29), -INT8_C(  83),  INT8_C(  40),  INT8_C(  88) },
454       { -INT8_C(  54), -INT8_C(  68), -INT8_C(  20),  INT8_C(  65), -INT8_C(  99), -INT8_C(  51),  INT8_C( 113),  INT8_C( 121),
455          INT8_C( 126),  INT8_C( 109), -INT8_C( 127), -INT8_C(   3),      INT8_MAX, -INT8_C(  70),  INT8_C(  70),  INT8_C(  72) } },
456     { { -INT8_C( 119),  INT8_C(  12), -INT8_C( 117),  INT8_C(  64),  INT8_C(  77),  INT8_C( 117),  INT8_C(  54), -INT8_C( 127),
457         -INT8_C(  24), -INT8_C(  78), -INT8_C(  24), -INT8_C(   8),  INT8_C(  13), -INT8_C(  41),  INT8_C(  71), -INT8_C(  67) },
458       {  INT8_C(  27), -INT8_C(  61), -INT8_C(  36),  INT8_C(   1),  INT8_C(  48),  INT8_C(  71),  INT8_C(  34), -INT8_C(  89),
459          INT8_C(  88), -INT8_C(  62), -INT8_C( 112),  INT8_C( 117),  INT8_C( 111), -INT8_C(  72), -INT8_C(  50), -INT8_C(   7) },
460       { -INT8_C(  60),  INT8_C(  89),  INT8_C(  57),  INT8_C(  17), -INT8_C(  50),  INT8_C( 111), -INT8_C( 110), -INT8_C(  73),
461          INT8_C(  33),  INT8_C( 122), -INT8_C(  81),  INT8_C(  46),  INT8_C(  82), -INT8_C(  10), -INT8_C(  20),  INT8_C( 109) },
462       { -INT8_C(  32), -INT8_C(  94), -INT8_C(  24),  INT8_C(  80), -INT8_C(  81), -INT8_C(  99), -INT8_C(  58), -INT8_C( 111),
463          INT8_C(  31),  INT8_C( 106),  INT8_C(   7),  INT8_C(  63),  INT8_C(  42),  INT8_C(  21),  INT8_C( 101),  INT8_C(  49) } },
464     { { -INT8_C(  71), -INT8_C(  56),  INT8_C( 110), -INT8_C(  23),  INT8_C(  15), -INT8_C( 112), -INT8_C( 111),  INT8_C( 104),
465          INT8_C(  82),  INT8_C(  33), -INT8_C(  35), -INT8_C(  63), -INT8_C(  39), -INT8_C(  85), -INT8_C(  70), -INT8_C(  99) },
466       {  INT8_C(   4), -INT8_C(  12), -INT8_C(  82), -INT8_C(  45),  INT8_C(  99),  INT8_C(  64), -INT8_C( 118), -INT8_C( 123),
467         -INT8_C(  69),  INT8_C(  57), -INT8_C(  77),  INT8_C(  13),  INT8_C(  47), -INT8_C(  97),  INT8_C( 122), -INT8_C(  24) },
468       {  INT8_C( 103), -INT8_C(  24), -INT8_C(  46),  INT8_C( 119),  INT8_C( 120),  INT8_C(  99), -INT8_C(  33), -INT8_C(  54),
469         -INT8_C( 124), -INT8_C(  68), -INT8_C( 117),  INT8_C(  93),  INT8_C( 104),  INT8_C(  70), -INT8_C(   6),  INT8_C( 108) },
470       {  INT8_C(  28), -INT8_C(  44), -INT8_C( 110), -INT8_C( 115),  INT8_C(  36), -INT8_C(  77), -INT8_C(  26), -INT8_C(  83),
471         -INT8_C( 119), -INT8_C(  98),  INT8_C(   5),  INT8_C(  17),  INT8_C(  18),  INT8_C(  82),  INT8_C(  58),  INT8_C(  33) } },
472     { {  INT8_C(  58), -INT8_C(  88),  INT8_C(  63), -INT8_C(  99), -INT8_C(  24), -INT8_C(  55),  INT8_C(  34), -INT8_C(  93),
473          INT8_C(   2), -INT8_C(  42), -INT8_C(  80),  INT8_C(  49),  INT8_C( 117),  INT8_C(  42),  INT8_C(  26), -INT8_C(  35) },
474       {  INT8_C(  18), -INT8_C(  20),  INT8_C(  84), -INT8_C( 118),  INT8_C(  79),  INT8_C(  51),  INT8_C(  84), -INT8_C(  45),
475         -INT8_C(  17), -INT8_C(  32),  INT8_C(  48),  INT8_C(  87),  INT8_C(  38),  INT8_C(  42), -INT8_C(  60),  INT8_C(  96) },
476       { -INT8_C(  46),  INT8_C(   3), -INT8_C(   3), -INT8_C(  70), -INT8_C(  51),  INT8_C(  32),  INT8_C(  94), -INT8_C(  49),
477         -INT8_C(  10),  INT8_C(  14),  INT8_C(   1),  INT8_C( 107),  INT8_C(  57),  INT8_C(  27),  INT8_C(  72),  INT8_C(  75) },
478       {  INT8_C( 122), -INT8_C(  65), -INT8_C( 106), -INT8_C(  51),  INT8_C( 106), -INT8_C(  36),  INT8_C(  44), -INT8_C(  89),
479          INT8_C(   9),  INT8_C(   4), -INT8_C(  33),  INT8_C(  69), -INT8_C( 120),  INT8_C(  57), -INT8_C(  98), -INT8_C(  14) } },
480     { {  INT8_C(   7), -INT8_C( 100), -INT8_C(  42),  INT8_C(  86), -INT8_C(  49),  INT8_C(  42),  INT8_C(  41), -INT8_C(  65),
481          INT8_C(  10),  INT8_C(  89),  INT8_C(  22),  INT8_C(  48), -INT8_C( 125), -INT8_C(  38), -INT8_C( 112),  INT8_C(  85) },
482       { -INT8_C(  34), -INT8_C( 114),  INT8_C(  15), -INT8_C(  85), -INT8_C(  82),  INT8_C( 109),  INT8_C( 122), -INT8_C(  92),
483          INT8_C( 124),  INT8_C( 123),  INT8_C(  15), -INT8_C(  75), -INT8_C( 106),  INT8_C(  88),  INT8_C(   0), -INT8_C(  99) },
484       { -INT8_C(  12), -INT8_C(  42), -INT8_C(  13), -INT8_C(  60),  INT8_C(   1),  INT8_C(  28), -INT8_C( 125),  INT8_C(  11),
485          INT8_C( 117), -INT8_C( 103),  INT8_C(  60), -INT8_C(   8),  INT8_C( 116), -INT8_C(  52),  INT8_C(  77),  INT8_C(  82) },
486       {  INT8_C(  29), -INT8_C(  28), -INT8_C(  14),  INT8_C( 111),  INT8_C(  34),  INT8_C( 123),  INT8_C(  32),  INT8_C(  38),
487          INT8_C(  17),  INT8_C(  59),  INT8_C(  67),  INT8_C( 115),  INT8_C(  97),  INT8_C( 102), -INT8_C(  35),  INT8_C(  10) } },
488     { {  INT8_C(  90),  INT8_C(  93), -INT8_C(   3),  INT8_C(   8), -INT8_C(  54),  INT8_C( 119), -INT8_C(  84),  INT8_C(  70),
489         -INT8_C(  13), -INT8_C(  68), -INT8_C(   5), -INT8_C( 119),  INT8_C(  20), -INT8_C(   4),  INT8_C(  39),  INT8_C(   8) },
490       { -INT8_C(  46),  INT8_C(  26), -INT8_C(  52), -INT8_C(  45),  INT8_C(  55),  INT8_C(  79), -INT8_C(  33), -INT8_C(  84),
491         -INT8_C(  23),  INT8_C(  27), -INT8_C(  91),  INT8_C(  93), -INT8_C(  25), -INT8_C(  14), -INT8_C(  81),  INT8_C(  66) },
492       {  INT8_C(  79), -INT8_C(  84),  INT8_C(  74),  INT8_C(  26),  INT8_C(  35), -INT8_C(   9),  INT8_C(  96),  INT8_C(  22),
493         -INT8_C(  77),  INT8_C(  92), -INT8_C(  96), -INT8_C(  57),  INT8_C(  88), -INT8_C(  57), -INT8_C(  49),  INT8_C(  42) },
494       { -INT8_C(  41), -INT8_C(  53),  INT8_C( 123),  INT8_C(  79), -INT8_C(  34), -INT8_C(  49),  INT8_C(  45), -INT8_C(  80),
495          INT8_C(  41), -INT8_C(   3),  INT8_C(   0),  INT8_C(  31), -INT8_C( 123),  INT8_C(  39),  INT8_C(  71),  INT8_C(  32) } },
496     { { -INT8_C(  31), -INT8_C( 100), -INT8_C(   2),  INT8_C(  24), -INT8_C(  21), -INT8_C(  35), -INT8_C(  59), -INT8_C(  44),
497         -INT8_C(   8),  INT8_C( 106),  INT8_C(  49), -INT8_C(  33),  INT8_C(  92), -INT8_C(  32),  INT8_C(  33), -INT8_C(  84) },
498       { -INT8_C( 116),  INT8_C( 108), -INT8_C(  58), -INT8_C(  80),  INT8_C(  99),  INT8_C(  38), -INT8_C(  58),  INT8_C(  22),
499         -INT8_C( 126),  INT8_C( 102), -INT8_C(  35), -INT8_C(  38),  INT8_C(  45), -INT8_C(  84),  INT8_C(   5),  INT8_C(  15) },
500       {  INT8_C(  72),  INT8_C(   3),  INT8_C(  39),  INT8_C(  52), -INT8_C(  32), -INT8_C(  20),  INT8_C(   8), -INT8_C(  40),
501          INT8_C(  86),  INT8_C(  58), -INT8_C(  73), -INT8_C(  77),  INT8_C(  26), -INT8_C(  39),  INT8_C(  95), -INT8_C(  89) },
502       { -INT8_C(  99),  INT8_C(   5),  INT8_C(  95), -INT8_C( 100),  INT8_C( 110),  INT8_C(  23),  INT8_C(   7),  INT8_C(  18),
503         -INT8_C(  52), -INT8_C( 106),  INT8_C(  87),  INT8_C(   6),  INT8_C( 111),  INT8_C(  13),  INT8_C( 123),  INT8_C(  20) } }
504   };
505 
506   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
507     simde_int8x16_t a = simde_vld1q_s8(test_vec[i].a);
508     simde_int8x16_t b = simde_vld1q_s8(test_vec[i].b);
509     simde_int8x16_t c = simde_vld1q_s8(test_vec[i].c);
510     simde_int8x16_t r = simde_vabaq_s8(a, b, c);
511 
512     simde_test_arm_neon_assert_equal_i8x16(r, simde_vld1q_s8(test_vec[i].r));
513   }
514 
515   return 0;
516 #else
517   fputc('\n', stdout);
518   for (int i = 0 ; i < 8 ; i++) {
519     simde_int8x16_t a = simde_test_arm_neon_random_i8x16();
520     simde_int8x16_t b = simde_test_arm_neon_random_i8x16();
521     simde_int8x16_t c = simde_test_arm_neon_random_i8x16();
522     simde_int8x16_t r = simde_vabaq_s8(a, b, c);
523 
524     simde_test_arm_neon_write_i8x16(2, a, SIMDE_TEST_VEC_POS_FIRST);
525     simde_test_arm_neon_write_i8x16(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
526     simde_test_arm_neon_write_i8x16(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
527     simde_test_arm_neon_write_i8x16(2, r, SIMDE_TEST_VEC_POS_LAST);
528   }
529   return 1;
530 #endif
531 }
532 
533 static int
test_simde_vabaq_s16(SIMDE_MUNIT_TEST_ARGS)534 test_simde_vabaq_s16 (SIMDE_MUNIT_TEST_ARGS) {
535 #if 1
536   static const struct {
537     int16_t a[8];
538     int16_t b[8];
539     int16_t c[8];
540     int16_t r[8];
541   } test_vec[] = {
542     { {  INT16_C( 30977),  INT16_C( 12491),  INT16_C(  2221), -INT16_C(  1303), -INT16_C( 21084),  INT16_C( 23557), -INT16_C( 31169), -INT16_C( 24084) },
543       {  INT16_C( 24241), -INT16_C( 32243), -INT16_C(  7993),  INT16_C( 14763), -INT16_C( 29538), -INT16_C(  2390), -INT16_C( 29998), -INT16_C( 11061) },
544       { -INT16_C( 27132), -INT16_C( 20220), -INT16_C(  4449),  INT16_C( 17323), -INT16_C( 20325), -INT16_C(  9569), -INT16_C( 29897), -INT16_C(  6021) },
545       {  INT16_C( 16814),  INT16_C( 24514),  INT16_C(  5765),  INT16_C(  1257), -INT16_C( 11871),  INT16_C( 30736), -INT16_C( 31068), -INT16_C( 19044) } },
546     { { -INT16_C( 30487), -INT16_C( 20118),  INT16_C(  5480),  INT16_C(  2026), -INT16_C( 27487),  INT16_C( 29949), -INT16_C( 14306),  INT16_C(  8776) },
547       {  INT16_C( 19551), -INT16_C(   300),  INT16_C( 32570), -INT16_C( 10943), -INT16_C(  8144),  INT16_C( 26544),  INT16_C( 11116),  INT16_C( 21839) },
548       { -INT16_C( 17996),  INT16_C(  7174), -INT16_C(  3890),  INT16_C( 28707),  INT16_C(  8580), -INT16_C( 23580),  INT16_C( 11497),  INT16_C( 18629) },
549       {  INT16_C(  7060), -INT16_C( 12644), -INT16_C( 23596), -INT16_C( 23860), -INT16_C( 10763),  INT16_C( 14537), -INT16_C( 13925),  INT16_C( 11986) } },
550     { { -INT16_C( 26248), -INT16_C( 19642), -INT16_C( 30951),  INT16_C( 18824),  INT16_C( 14440), -INT16_C( 11088), -INT16_C(   156),  INT16_C(  6185) },
551       {  INT16_C( 12472), -INT16_C( 31180),  INT16_C( 22560), -INT16_C( 23050), -INT16_C(  9607),  INT16_C( 25160),  INT16_C(  3334),  INT16_C( 32683) },
552       { -INT16_C(  3673), -INT16_C( 16334), -INT16_C( 17799), -INT16_C(  7927), -INT16_C( 17933),  INT16_C( 22453), -INT16_C(  8520),  INT16_C( 28783) },
553       { -INT16_C( 10103), -INT16_C(  4796),  INT16_C(  9408), -INT16_C( 31589),  INT16_C( 22766), -INT16_C(  8381),  INT16_C( 11698),  INT16_C( 10085) } },
554     { { -INT16_C( 23794),  INT16_C( 12278), -INT16_C(  4613),  INT16_C( 29908),  INT16_C(  7367), -INT16_C( 12585), -INT16_C( 32215), -INT16_C( 12211) },
555       {  INT16_C( 32627), -INT16_C(  4976), -INT16_C( 26311),  INT16_C( 11469), -INT16_C( 32174),  INT16_C(  2691), -INT16_C(  3487),  INT16_C( 28538) },
556       {  INT16_C( 29078), -INT16_C( 28258),  INT16_C( 29278),  INT16_C(  9478), -INT16_C(  8818), -INT16_C( 18189),  INT16_C( 16479), -INT16_C( 11640) },
557       { -INT16_C( 20245), -INT16_C( 29976), -INT16_C( 14560),  INT16_C( 31899),  INT16_C( 30723),  INT16_C(  8295), -INT16_C( 12249),  INT16_C( 27967) } },
558     { {  INT16_C(  6591), -INT16_C(  1601), -INT16_C( 29518),  INT16_C(  1317), -INT16_C( 22257),  INT16_C( 28687), -INT16_C( 30053),  INT16_C( 12767) },
559       {  INT16_C( 32507),  INT16_C( 22979), -INT16_C( 13840),  INT16_C( 32638),  INT16_C( 29350),  INT16_C(  1335), -INT16_C( 16462),  INT16_C( 29399) },
560       { -INT16_C( 26920), -INT16_C( 29845), -INT16_C( 28637),  INT16_C( 12944), -INT16_C( 24775), -INT16_C( 10846), -INT16_C( 32471),  INT16_C(  9222) },
561       {  INT16_C(   482), -INT16_C( 14313), -INT16_C( 14721),  INT16_C( 21011),  INT16_C( 31868), -INT16_C( 24668), -INT16_C( 14044), -INT16_C( 32592) } },
562     { { -INT16_C( 13825), -INT16_C(  3971), -INT16_C(   878),  INT16_C( 14447), -INT16_C( 22930),  INT16_C(  8253),  INT16_C(  5477),  INT16_C( 16018) },
563       { -INT16_C(   597), -INT16_C( 12599),  INT16_C( 22926), -INT16_C( 14592), -INT16_C( 23816),  INT16_C(  8860), -INT16_C( 23772),  INT16_C(  9030) },
564       { -INT16_C( 15252), -INT16_C(   237), -INT16_C( 32064),  INT16_C( 11831),  INT16_C( 29992), -INT16_C( 29106), -INT16_C(  7798),  INT16_C( 13772) },
565       {  INT16_C(   830),  INT16_C(  8391), -INT16_C( 11424), -INT16_C( 24666),  INT16_C( 30878), -INT16_C( 19317),  INT16_C( 21451),  INT16_C( 20760) } },
566     { { -INT16_C( 27170),  INT16_C( 27652),  INT16_C(  1262), -INT16_C(  6604), -INT16_C( 12121), -INT16_C( 13560),  INT16_C( 20339), -INT16_C(  7954) },
567       {  INT16_C(   531), -INT16_C( 11297),  INT16_C(  5764), -INT16_C( 21247),  INT16_C( 20363),  INT16_C(  5435),  INT16_C(  1840),  INT16_C(  3915) },
568       {  INT16_C( 20380), -INT16_C( 30085), -INT16_C( 20653), -INT16_C(  1424),  INT16_C( 31104), -INT16_C(  3131), -INT16_C( 19256), -INT16_C(  9261) },
569       { -INT16_C(  7321), -INT16_C( 19096),  INT16_C( 27679),  INT16_C( 13219), -INT16_C(  1380), -INT16_C(  4994), -INT16_C( 24101),  INT16_C(  5222) } },
570     { { -INT16_C( 19786),  INT16_C( 15022), -INT16_C( 20535),  INT16_C( 21735),  INT16_C(  8958),  INT16_C( 12138), -INT16_C( 19159), -INT16_C( 15042) },
571       { -INT16_C( 18172),  INT16_C( 22351), -INT16_C( 16279), -INT16_C(  5806),  INT16_C(  5945),  INT16_C(   476), -INT16_C( 20277), -INT16_C( 32292) },
572       { -INT16_C( 30110),  INT16_C( 11196), -INT16_C( 23751),  INT16_C( 14208), -INT16_C(  5434), -INT16_C(  4250), -INT16_C( 23393), -INT16_C( 23627) },
573       { -INT16_C(  7848),  INT16_C( 26177), -INT16_C( 13063), -INT16_C( 23787),  INT16_C( 20337),  INT16_C( 16864), -INT16_C( 16043), -INT16_C(  6377) } }
574   };
575 
576   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
577     simde_int16x8_t a = simde_vld1q_s16(test_vec[i].a);
578     simde_int16x8_t b = simde_vld1q_s16(test_vec[i].b);
579     simde_int16x8_t c = simde_vld1q_s16(test_vec[i].c);
580     simde_int16x8_t r = simde_vabaq_s16(a, b, c);
581 
582     simde_test_arm_neon_assert_equal_i16x8(r, simde_vld1q_s16(test_vec[i].r));
583   }
584 
585   return 0;
586 #else
587   fputc('\n', stdout);
588   for (int i = 0 ; i < 8 ; i++) {
589     simde_int16x8_t a = simde_test_arm_neon_random_i16x8();
590     simde_int16x8_t b = simde_test_arm_neon_random_i16x8();
591     simde_int16x8_t c = simde_test_arm_neon_random_i16x8();
592     simde_int16x8_t r = simde_vabaq_s16(a, b, c);
593 
594     simde_test_arm_neon_write_i16x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
595     simde_test_arm_neon_write_i16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
596     simde_test_arm_neon_write_i16x8(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
597     simde_test_arm_neon_write_i16x8(2, r, SIMDE_TEST_VEC_POS_LAST);
598   }
599   return 1;
600 #endif
601 }
602 
603 #if !defined(TEST_SIMDE_VABD_NO_TEST_32)
604 static int
test_simde_vabaq_s32(SIMDE_MUNIT_TEST_ARGS)605 test_simde_vabaq_s32 (SIMDE_MUNIT_TEST_ARGS) {
606 #if 1
607   static const struct {
608     int32_t a[4];
609     int32_t b[4];
610     int32_t c[4];
611     int32_t r[4];
612   } test_vec[] = {
613     { { -INT32_C(   939916194), -INT32_C(    38777660),  INT32_C(   805211236), -INT32_C(  1615734212) },
614       { -INT32_C(  1647678108), -INT32_C(   690664944), -INT32_C(   741983436),  INT32_C(  1047952352) },
615       {  INT32_C(  1141207423),  INT32_C(   557954493),  INT32_C(  2119254081),  INT32_C(  2132607514) },
616       {  INT32_C(  1848969337),  INT32_C(  1209841777), -INT32_C(   628518543), -INT32_C(   531079050) } },
617     { {  INT32_C(  2132600687),  INT32_C(  1716973874),  INT32_C(   221912109),  INT32_C(   374059159) },
618       { -INT32_C(   547729375),  INT32_C(  1174445061), -INT32_C(   154906148), -INT32_C(  1032461997) },
619       { -INT32_C(    79523127), -INT32_C(  1335781245),  INT32_C(  1270717364),  INT32_C(  1835075660) },
620       { -INT32_C(  1694160361), -INT32_C(    67767116),  INT32_C(  1647535621), -INT32_C(  1053370480) } },
621     { {  INT32_C(  1565310040),  INT32_C(   883182936), -INT32_C(   232101730),  INT32_C(   330604618) },
622       { -INT32_C(  1257310670),  INT32_C(  1114009486),  INT32_C(  1468867339), -INT32_C(  2067468500) },
623       {  INT32_C(    65147307), -INT32_C(    63469986),  INT32_C(   955146734),  INT32_C(   860594945) },
624       { -INT32_C(  1407199279),  INT32_C(  2060662408),  INT32_C(   281618875), -INT32_C(  1036299233) } },
625     { {  INT32_C(   686381465), -INT32_C(   731230263), -INT32_C(  1641285518), -INT32_C(  1843138585) },
626       {  INT32_C(  1586824448),  INT32_C(  2036059275),  INT32_C(   800213293), -INT32_C(  2040332820) },
627       {  INT32_C(   548293463),  INT32_C(   234100890), -INT32_C(   139780336),  INT32_C(   260689422) },
628       {  INT32_C(  1724912450),  INT32_C(  1070728122), -INT32_C(   701291889),  INT32_C(   457883657) } },
629     { {  INT32_C(  1584209619),  INT32_C(   416860394), -INT32_C(    28866030), -INT32_C(   561731193) },
630       { -INT32_C(  1879166219),  INT32_C(  1537012299),  INT32_C(   542328849), -INT32_C(   365962218) },
631       { -INT32_C(   448226053),  INT32_C(  2013077605),  INT32_C(   846546090), -INT32_C(   485426450) },
632       { -INT32_C(  1279817511),  INT32_C(   892925700),  INT32_C(   275351211), -INT32_C(   442266961) } },
633     { {  INT32_C(  2003963692),  INT32_C(   332599041),  INT32_C(  1832068695), -INT32_C(    44604926) },
634       {  INT32_C(  1675862270),  INT32_C(  1809506496),  INT32_C(   329076773),  INT32_C(  1995877706) },
635       { -INT32_C(  1091671876), -INT32_C(   825114249), -INT32_C(   381942553),  INT32_C(  1692898150) },
636       {  INT32_C(   476530542), -INT32_C(  1327747510), -INT32_C(  1751879275),  INT32_C(   258374630) } },
637     { { -INT32_C(   188167629), -INT32_C(   815816022),  INT32_C(  1021508850),  INT32_C(  1723062441) },
638       { -INT32_C(  1205558975),  INT32_C(  1233646946),  INT32_C(  1597162489), -INT32_C(  1966925482) },
639       { -INT32_C(  1904309277),  INT32_C(   543022382), -INT32_C(  2107817767),  INT32_C(  1508380696) },
640       {  INT32_C(   510582673), -INT32_C(   125191458),  INT32_C(   431521810),  INT32_C(   903401323) } },
641     { {  INT32_C(   319950001), -INT32_C(    94594815), -INT32_C(  1302753700), -INT32_C(  1958994520) },
642       { -INT32_C(   702956888),  INT32_C(  1895266199), -INT32_C(   806136649),  INT32_C(   355064676) },
643       { -INT32_C(   383239192),  INT32_C(   820282580), -INT32_C(  1159578350),  INT32_C(    54927194) },
644       {  INT32_C(   639667697),  INT32_C(   980388804), -INT32_C(   949311999), -INT32_C(  1658857038) } }
645   };
646 
647   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
648     simde_int32x4_t a = simde_vld1q_s32(test_vec[i].a);
649     simde_int32x4_t b = simde_vld1q_s32(test_vec[i].b);
650     simde_int32x4_t c = simde_vld1q_s32(test_vec[i].c);
651     simde_int32x4_t r = simde_vabaq_s32(a, b, c);
652 
653     simde_test_arm_neon_assert_equal_i32x4(r, simde_vld1q_s32(test_vec[i].r));
654   }
655 
656   return 0;
657 #else
658   fputc('\n', stdout);
659   for (int i = 0 ; i < 8 ; i++) {
660     simde_int32x4_t a = simde_test_arm_neon_random_i32x4();
661     simde_int32x4_t b = simde_test_arm_neon_random_i32x4();
662     simde_int32x4_t c = simde_test_arm_neon_random_i32x4();
663     simde_int32x4_t r = simde_vabaq_s32(a, b, c);
664 
665     simde_test_arm_neon_write_i32x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
666     simde_test_arm_neon_write_i32x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
667     simde_test_arm_neon_write_i32x4(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
668     simde_test_arm_neon_write_i32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
669   }
670   return 1;
671 #endif
672 }
673 #endif
674 
675 static int
test_simde_vabaq_u8(SIMDE_MUNIT_TEST_ARGS)676 test_simde_vabaq_u8 (SIMDE_MUNIT_TEST_ARGS) {
677 #if 1
678   static const struct {
679     uint8_t a[16];
680     uint8_t b[16];
681     uint8_t c[16];
682     uint8_t r[16];
683   } test_vec[] = {
684     { { UINT8_C(216), UINT8_C( 11), UINT8_C( 40), UINT8_C(228), UINT8_C(187), UINT8_C(225), UINT8_C( 32), UINT8_C(216),
685         UINT8_C( 90), UINT8_C(133), UINT8_C(229), UINT8_C( 30), UINT8_C(182), UINT8_C( 36), UINT8_C(239), UINT8_C(187) },
686       { UINT8_C(110), UINT8_C( 19), UINT8_C( 78), UINT8_C(165), UINT8_C(167), UINT8_C(104), UINT8_C(134), UINT8_C( 18),
687         UINT8_C( 94), UINT8_C(254), UINT8_C(151), UINT8_C( 42), UINT8_C(254), UINT8_C(121), UINT8_C(219), UINT8_C(215) },
688       { UINT8_C(132), UINT8_C(  3), UINT8_C(187), UINT8_C( 63), UINT8_C(228), UINT8_C(220), UINT8_C( 24), UINT8_C( 62),
689         UINT8_C( 97), UINT8_C(253), UINT8_C( 93), UINT8_C( 23), UINT8_C( 33), UINT8_C( 76), UINT8_C(211), UINT8_C(144) },
690       { UINT8_C(238), UINT8_C( 27), UINT8_C(149), UINT8_C( 74), UINT8_C(248), UINT8_C( 85), UINT8_C(142), UINT8_C(  4),
691         UINT8_C( 93), UINT8_C(134), UINT8_C( 31), UINT8_C( 49), UINT8_C(147), UINT8_C( 81), UINT8_C(247), UINT8_C(  2) } },
692     { { UINT8_C( 95), UINT8_C( 33), UINT8_C( 53), UINT8_C(  6), UINT8_C(138), UINT8_C(187), UINT8_C( 24), UINT8_C(232),
693         UINT8_C(186), UINT8_C(175), UINT8_C( 18), UINT8_C(184), UINT8_C( 40), UINT8_C(237), UINT8_C(143), UINT8_C(173) },
694       { UINT8_C(240), UINT8_C( 75), UINT8_C(236), UINT8_C(212), UINT8_C( 39), UINT8_C(  4), UINT8_C( 18), UINT8_C(136),
695         UINT8_C(  2), UINT8_C(111), UINT8_C(160), UINT8_C( 35), UINT8_C(187), UINT8_C(115), UINT8_C(179), UINT8_C( 27) },
696       { UINT8_C(148), UINT8_C(232), UINT8_C( 33), UINT8_C( 30), UINT8_C(164), UINT8_C( 58), UINT8_C(  6), UINT8_C( 94),
697         UINT8_C(233), UINT8_C( 24), UINT8_C( 22), UINT8_C( 18), UINT8_C(  5), UINT8_C(166), UINT8_C(191), UINT8_C(245) },
698       { UINT8_C(187), UINT8_C(190), UINT8_C(  0), UINT8_C(188), UINT8_C(  7), UINT8_C(241), UINT8_C( 36), UINT8_C( 18),
699         UINT8_C(161), UINT8_C(  6), UINT8_C(156), UINT8_C(201), UINT8_C(222), UINT8_C( 32), UINT8_C(155), UINT8_C(135) } },
700     { { UINT8_C(241), UINT8_C(171), UINT8_C(201), UINT8_C( 24), UINT8_C(176), UINT8_C(220), UINT8_C(160), UINT8_C(178),
701         UINT8_C( 75), UINT8_C( 64), UINT8_C(213), UINT8_C(  7), UINT8_C(179), UINT8_C(137), UINT8_C( 34), UINT8_C( 72) },
702       { UINT8_C(113), UINT8_C( 67), UINT8_C(102), UINT8_C( 21), UINT8_C(125), UINT8_C(109), UINT8_C(115), UINT8_C(103),
703         UINT8_C(133), UINT8_C(138), UINT8_C(121), UINT8_C(139), UINT8_C( 48), UINT8_C( 56), UINT8_C(128), UINT8_C( 33) },
704       { UINT8_C(227), UINT8_C( 74), UINT8_C( 57), UINT8_C(147), UINT8_C( 38), UINT8_C(217), UINT8_C( 69), UINT8_C(113),
705         UINT8_C( 26), UINT8_C( 27), UINT8_C(120), UINT8_C(205), UINT8_C(164), UINT8_C(154), UINT8_C( 21), UINT8_C( 21) },
706       { UINT8_C( 99), UINT8_C(178), UINT8_C(246), UINT8_C(150), UINT8_C(  7), UINT8_C( 72), UINT8_C(206), UINT8_C(188),
707         UINT8_C(182), UINT8_C(175), UINT8_C(214), UINT8_C( 73), UINT8_C( 39), UINT8_C(235), UINT8_C(141), UINT8_C( 84) } },
708     { { UINT8_C(222), UINT8_C(124), UINT8_C( 43), UINT8_C( 91), UINT8_C(233), UINT8_C(158), UINT8_C(194), UINT8_C(110),
709         UINT8_C( 40), UINT8_C( 59), UINT8_C(249), UINT8_C( 88), UINT8_C(115), UINT8_C(122), UINT8_C(121), UINT8_C( 87) },
710       { UINT8_C(196), UINT8_C(178), UINT8_C(234), UINT8_C(234), UINT8_C(140), UINT8_C( 48), UINT8_C( 91), UINT8_C(166),
711         UINT8_C( 75), UINT8_C(212), UINT8_C(115), UINT8_C(239), UINT8_C(110), UINT8_C(137), UINT8_C(  4), UINT8_C( 76) },
712       { UINT8_C(  5), UINT8_C( 47), UINT8_C(168), UINT8_C(238), UINT8_C(206), UINT8_C(106), UINT8_C( 92), UINT8_C(246),
713         UINT8_C(166), UINT8_C( 86), UINT8_C( 79), UINT8_C( 25), UINT8_C(208), UINT8_C(200), UINT8_C(112), UINT8_C(148) },
714       { UINT8_C(157),    UINT8_MAX, UINT8_C(109), UINT8_C( 95), UINT8_C( 43), UINT8_C(216), UINT8_C(195), UINT8_C(190),
715         UINT8_C(131), UINT8_C(185), UINT8_C( 29), UINT8_C( 46), UINT8_C(213), UINT8_C(185), UINT8_C(229), UINT8_C(159) } },
716     { { UINT8_C(123), UINT8_C( 91), UINT8_C(126), UINT8_C(  7), UINT8_C(139), UINT8_C(217), UINT8_C(173), UINT8_C(214),
717         UINT8_C(173), UINT8_C( 32), UINT8_C(197), UINT8_C( 28), UINT8_C(169), UINT8_C(201), UINT8_C(104), UINT8_C(174) },
718       { UINT8_C(249), UINT8_C( 16), UINT8_C(156), UINT8_C(199), UINT8_C(123), UINT8_C(249), UINT8_C(189), UINT8_C( 33),
719         UINT8_C( 79), UINT8_C( 12), UINT8_C( 58), UINT8_C( 31), UINT8_C(213), UINT8_C(171), UINT8_C(179), UINT8_C( 80) },
720       { UINT8_C(  6), UINT8_C( 49), UINT8_C( 87), UINT8_C(145), UINT8_C( 10), UINT8_C(  4), UINT8_C(103), UINT8_C(184),
721         UINT8_C( 36), UINT8_C( 44), UINT8_C(212), UINT8_C(206), UINT8_C(245), UINT8_C( 60), UINT8_C(124), UINT8_C(238) },
722       { UINT8_C(110), UINT8_C(124), UINT8_C(195), UINT8_C( 61), UINT8_C(252), UINT8_C(206), UINT8_C(  3), UINT8_C(109),
723         UINT8_C(216), UINT8_C( 64), UINT8_C( 95), UINT8_C(203), UINT8_C(201), UINT8_C( 56), UINT8_C(159), UINT8_C( 76) } },
724     { { UINT8_C( 77), UINT8_C( 25), UINT8_C(181), UINT8_C(200), UINT8_C( 18), UINT8_C(115), UINT8_C(233), UINT8_C( 97),
725         UINT8_C(127), UINT8_C( 35), UINT8_C(128), UINT8_C( 84), UINT8_C(206), UINT8_C( 51), UINT8_C(164), UINT8_C(212) },
726       { UINT8_C(100), UINT8_C(251), UINT8_C(101), UINT8_C(110),    UINT8_MAX, UINT8_C(204), UINT8_C( 38), UINT8_C( 36),
727         UINT8_C(248), UINT8_C(250), UINT8_C(242), UINT8_C(238), UINT8_C( 55), UINT8_C(110), UINT8_C(220), UINT8_C(132) },
728       { UINT8_C(135), UINT8_C(146), UINT8_C( 76), UINT8_C(153), UINT8_C(  5), UINT8_C( 53), UINT8_C(250), UINT8_C(132),
729         UINT8_C( 88), UINT8_C(122), UINT8_C(217), UINT8_C( 39), UINT8_C(173), UINT8_C(125), UINT8_C(251), UINT8_C( 17) },
730       { UINT8_C(112), UINT8_C(130), UINT8_C(206), UINT8_C(243), UINT8_C( 12), UINT8_C( 10), UINT8_C(189), UINT8_C(193),
731         UINT8_C( 31), UINT8_C(163), UINT8_C(153), UINT8_C( 27), UINT8_C( 68), UINT8_C( 66), UINT8_C(195), UINT8_C( 71) } },
732     { { UINT8_C(121), UINT8_C( 97), UINT8_C(128), UINT8_C(120), UINT8_C( 45), UINT8_C(166), UINT8_C(156), UINT8_C( 38),
733         UINT8_C(161), UINT8_C(142), UINT8_C( 20), UINT8_C(216), UINT8_C(253), UINT8_C(240), UINT8_C( 92), UINT8_C(132) },
734       { UINT8_C(130), UINT8_C(168), UINT8_C( 30), UINT8_C(135), UINT8_C(221), UINT8_C( 24), UINT8_C( 12), UINT8_C( 53),
735         UINT8_C(147), UINT8_C(229), UINT8_C( 92), UINT8_C( 64), UINT8_C( 98), UINT8_C( 88), UINT8_C( 82), UINT8_C(219) },
736       { UINT8_C(185), UINT8_C(210), UINT8_C( 84), UINT8_C(230), UINT8_C(120), UINT8_C(240), UINT8_C( 12), UINT8_C( 25),
737         UINT8_C(127), UINT8_C( 32), UINT8_C(241), UINT8_C(124), UINT8_C( 17), UINT8_C( 77), UINT8_C(  0), UINT8_C(147) },
738       { UINT8_C(176), UINT8_C(139), UINT8_C(182), UINT8_C(215), UINT8_C(146), UINT8_C(126), UINT8_C(156), UINT8_C( 66),
739         UINT8_C(181), UINT8_C( 83), UINT8_C(169), UINT8_C( 20), UINT8_C( 78), UINT8_C(251), UINT8_C(174), UINT8_C(204) } },
740     { { UINT8_C(245), UINT8_C( 30), UINT8_C( 27), UINT8_C(210), UINT8_C( 55), UINT8_C( 39), UINT8_C(  8), UINT8_C(202),
741         UINT8_C( 12), UINT8_C(100), UINT8_C( 10), UINT8_C(110), UINT8_C(188), UINT8_C( 92), UINT8_C( 74), UINT8_C(117) },
742       { UINT8_C( 46), UINT8_C(158), UINT8_C( 92), UINT8_C(167), UINT8_C(142), UINT8_C(104), UINT8_C(192), UINT8_C( 13),
743         UINT8_C(137), UINT8_C(178), UINT8_C(137), UINT8_C(154),    UINT8_MAX, UINT8_C(138), UINT8_C( 45), UINT8_C(245) },
744       { UINT8_C(168), UINT8_C( 72), UINT8_C(199), UINT8_C(223), UINT8_C(111), UINT8_C(207), UINT8_C(169), UINT8_C(123),
745         UINT8_C( 52), UINT8_C(180), UINT8_C(234), UINT8_C(240), UINT8_C( 16), UINT8_C( 52), UINT8_C(102), UINT8_C( 63) },
746       { UINT8_C(111), UINT8_C(116), UINT8_C(134), UINT8_C( 10), UINT8_C( 86), UINT8_C(142), UINT8_C( 31), UINT8_C( 56),
747         UINT8_C( 97), UINT8_C(102), UINT8_C(107), UINT8_C(196), UINT8_C(171), UINT8_C(178), UINT8_C(131), UINT8_C( 43) } }
748   };
749 
750   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
751     simde_uint8x16_t a = simde_vld1q_u8(test_vec[i].a);
752     simde_uint8x16_t b = simde_vld1q_u8(test_vec[i].b);
753     simde_uint8x16_t c = simde_vld1q_u8(test_vec[i].c);
754     simde_uint8x16_t r = simde_vabaq_u8(a, b, c);
755 
756     simde_test_arm_neon_assert_equal_u8x16(r, simde_vld1q_u8(test_vec[i].r));
757   }
758 
759   return 0;
760 #else
761   fputc('\n', stdout);
762   for (int i = 0 ; i < 8 ; i++) {
763     simde_uint8x16_t a = simde_test_arm_neon_random_u8x16();
764     simde_uint8x16_t b = simde_test_arm_neon_random_u8x16();
765     simde_uint8x16_t c = simde_test_arm_neon_random_u8x16();
766     simde_uint8x16_t r = simde_vabaq_u8(a, b, c);
767 
768     simde_test_arm_neon_write_u8x16(2, a, SIMDE_TEST_VEC_POS_FIRST);
769     simde_test_arm_neon_write_u8x16(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
770     simde_test_arm_neon_write_u8x16(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
771     simde_test_arm_neon_write_u8x16(2, r, SIMDE_TEST_VEC_POS_LAST);
772   }
773   return 1;
774 #endif
775 }
776 
777 static int
test_simde_vabaq_u16(SIMDE_MUNIT_TEST_ARGS)778 test_simde_vabaq_u16 (SIMDE_MUNIT_TEST_ARGS) {
779 #if 1
780   static const struct {
781     uint16_t a[8];
782     uint16_t b[8];
783     uint16_t c[8];
784     uint16_t r[8];
785   } test_vec[] = {
786     { { UINT16_C(49874), UINT16_C(24806), UINT16_C(42538), UINT16_C(45934), UINT16_C(63320), UINT16_C(22605), UINT16_C(31617), UINT16_C(10829) },
787       { UINT16_C( 5315), UINT16_C(13065), UINT16_C(46052), UINT16_C( 6318), UINT16_C(39015), UINT16_C(30472), UINT16_C(28364), UINT16_C(40630) },
788       { UINT16_C(39984), UINT16_C(23551), UINT16_C(27971), UINT16_C(39694), UINT16_C(23652), UINT16_C(59123), UINT16_C(16599), UINT16_C(39440) },
789       { UINT16_C(19007), UINT16_C(35292), UINT16_C(60619), UINT16_C(13774), UINT16_C(13147), UINT16_C(51256), UINT16_C(43382), UINT16_C(12019) } },
790     { { UINT16_C( 6485), UINT16_C(14797), UINT16_C(31948), UINT16_C(13137), UINT16_C(22804), UINT16_C(57771), UINT16_C(25032), UINT16_C(63615) },
791       { UINT16_C(32510), UINT16_C(16723), UINT16_C(25323), UINT16_C(20700), UINT16_C(53438), UINT16_C(38198), UINT16_C(17936), UINT16_C(25903) },
792       { UINT16_C(64863), UINT16_C(11422), UINT16_C(61305), UINT16_C(36191), UINT16_C( 2633), UINT16_C( 4462), UINT16_C(61036), UINT16_C(27145) },
793       { UINT16_C(38838), UINT16_C(20098), UINT16_C( 2394), UINT16_C(28628), UINT16_C( 8073), UINT16_C(25971), UINT16_C( 2596), UINT16_C(64857) } },
794     { { UINT16_C(23916), UINT16_C(22699), UINT16_C(34751), UINT16_C(32168), UINT16_C(56919), UINT16_C(26642), UINT16_C(16676), UINT16_C(33741) },
795       { UINT16_C(27710), UINT16_C(47023), UINT16_C( 3931), UINT16_C(42053), UINT16_C(45849), UINT16_C(34229), UINT16_C(49057), UINT16_C( 3823) },
796       { UINT16_C(39452), UINT16_C(56166), UINT16_C( 3618), UINT16_C(31064), UINT16_C(27372), UINT16_C( 4321), UINT16_C(44971), UINT16_C(60051) },
797       { UINT16_C(35658), UINT16_C(31842), UINT16_C(35064), UINT16_C(43157), UINT16_C( 9860), UINT16_C(56550), UINT16_C(20762), UINT16_C(24433) } },
798     { { UINT16_C(17179), UINT16_C(30369), UINT16_C(58962), UINT16_C(27419), UINT16_C(53402), UINT16_C(15345), UINT16_C(57487), UINT16_C(43849) },
799       { UINT16_C(44923), UINT16_C(40326), UINT16_C(57021), UINT16_C(43286), UINT16_C(63560), UINT16_C(62649), UINT16_C(19879), UINT16_C(49886) },
800       { UINT16_C(32656), UINT16_C(57912), UINT16_C(21350), UINT16_C(   77), UINT16_C(15908), UINT16_C(45883), UINT16_C(34079), UINT16_C(39519) },
801       { UINT16_C(29446), UINT16_C(47955), UINT16_C(29097), UINT16_C( 5092), UINT16_C(35518), UINT16_C(32111), UINT16_C( 6151), UINT16_C(54216) } },
802     { { UINT16_C(58676), UINT16_C(62007), UINT16_C(19908), UINT16_C( 3227), UINT16_C(21829), UINT16_C(60416), UINT16_C(56994), UINT16_C(12974) },
803       { UINT16_C(59230), UINT16_C(50196), UINT16_C(24890), UINT16_C(24260), UINT16_C(65440), UINT16_C(48914), UINT16_C(29060), UINT16_C(47449) },
804       { UINT16_C(36950), UINT16_C( 6827), UINT16_C(18141), UINT16_C( 8999), UINT16_C(10139), UINT16_C(15631), UINT16_C(48646), UINT16_C(25711) },
805       { UINT16_C(15420), UINT16_C(39840), UINT16_C(26657), UINT16_C(18488), UINT16_C(11594), UINT16_C(28163), UINT16_C(11044), UINT16_C(34712) } },
806     { { UINT16_C(33701), UINT16_C(57128), UINT16_C(60645), UINT16_C(34110), UINT16_C(20715), UINT16_C(28740), UINT16_C(40385), UINT16_C( 5929) },
807       { UINT16_C(54317), UINT16_C( 2610), UINT16_C(22810), UINT16_C(46637), UINT16_C(15744), UINT16_C(34547), UINT16_C(25595), UINT16_C(41194) },
808       { UINT16_C( 4838), UINT16_C(52095), UINT16_C(48638), UINT16_C(59984), UINT16_C(37901), UINT16_C(52826), UINT16_C(33585), UINT16_C(24294) },
809       { UINT16_C(17644), UINT16_C(41077), UINT16_C(20937), UINT16_C(47457), UINT16_C(42872), UINT16_C(47019), UINT16_C(48375), UINT16_C(22829) } },
810     { { UINT16_C( 6231), UINT16_C(29033), UINT16_C(38513), UINT16_C(61735), UINT16_C( 7123), UINT16_C(52856), UINT16_C(25214), UINT16_C(25710) },
811       { UINT16_C(61045), UINT16_C(29488), UINT16_C(32939), UINT16_C(47453), UINT16_C(46869), UINT16_C(18055), UINT16_C(27962), UINT16_C(37285) },
812       { UINT16_C( 3717), UINT16_C(62979), UINT16_C(10916), UINT16_C(30952), UINT16_C(24645), UINT16_C(49990), UINT16_C(46530), UINT16_C(14120) },
813       { UINT16_C(63559), UINT16_C(62524), UINT16_C(60536), UINT16_C(12700), UINT16_C(29347), UINT16_C(19255), UINT16_C(43782), UINT16_C(48875) } },
814     { { UINT16_C(22691), UINT16_C(20139), UINT16_C( 2264), UINT16_C(60679), UINT16_C(36800), UINT16_C(64052), UINT16_C(55804), UINT16_C(33420) },
815       { UINT16_C(36839), UINT16_C(35704), UINT16_C(24761), UINT16_C(65283), UINT16_C(19136), UINT16_C(33730), UINT16_C(60159), UINT16_C(41658) },
816       { UINT16_C(25922), UINT16_C( 7152), UINT16_C(63598), UINT16_C(11784), UINT16_C(15495), UINT16_C(33576), UINT16_C(46101), UINT16_C(64517) },
817       { UINT16_C(33608), UINT16_C(48691), UINT16_C(41101), UINT16_C(48642), UINT16_C(40441), UINT16_C(64206), UINT16_C( 4326), UINT16_C(56279) } }
818   };
819 
820   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
821     simde_uint16x8_t a = simde_vld1q_u16(test_vec[i].a);
822     simde_uint16x8_t b = simde_vld1q_u16(test_vec[i].b);
823     simde_uint16x8_t c = simde_vld1q_u16(test_vec[i].c);
824     simde_uint16x8_t r = simde_vabaq_u16(a, b, c);
825 
826     simde_test_arm_neon_assert_equal_u16x8(r, simde_vld1q_u16(test_vec[i].r));
827   }
828 
829   return 0;
830 #else
831   fputc('\n', stdout);
832   for (int i = 0 ; i < 8 ; i++) {
833     simde_uint16x8_t a = simde_test_arm_neon_random_u16x8();
834     simde_uint16x8_t b = simde_test_arm_neon_random_u16x8();
835     simde_uint16x8_t c = simde_test_arm_neon_random_u16x8();
836     simde_uint16x8_t r = simde_vabaq_u16(a, b, c);
837 
838     simde_test_arm_neon_write_u16x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
839     simde_test_arm_neon_write_u16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
840     simde_test_arm_neon_write_u16x8(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
841     simde_test_arm_neon_write_u16x8(2, r, SIMDE_TEST_VEC_POS_LAST);
842   }
843   return 1;
844 #endif
845 }
846 
847 #if !defined(TEST_SIMDE_VABD_NO_TEST_32)
848 static int
test_simde_vabaq_u32(SIMDE_MUNIT_TEST_ARGS)849 test_simde_vabaq_u32 (SIMDE_MUNIT_TEST_ARGS) {
850 #if 1
851   static const struct {
852     uint32_t a[4];
853     uint32_t b[4];
854     uint32_t c[4];
855     uint32_t r[4];
856   } test_vec[] = {
857     { { UINT32_C(4253580867), UINT32_C(2684128222), UINT32_C(3559046869), UINT32_C(3950435497) },
858       { UINT32_C(2953209666), UINT32_C(3873312607), UINT32_C(1634272843), UINT32_C(4267536315) },
859       { UINT32_C(3422283245), UINT32_C(1181415281), UINT32_C(1595641014), UINT32_C(2873790825) },
860       { UINT32_C( 427687150), UINT32_C(1081058252), UINT32_C(3597678698), UINT32_C(1049213691) } },
861     { { UINT32_C(1465602552), UINT32_C(2872916320), UINT32_C(4195133247), UINT32_C(  66677270) },
862       { UINT32_C(3234788431), UINT32_C(2718382572), UINT32_C( 771826373), UINT32_C(2899921843) },
863       { UINT32_C(4228068508), UINT32_C(2913485165), UINT32_C(4272403688), UINT32_C(1845600286) },
864       { UINT32_C(2458882629), UINT32_C(3068018913), UINT32_C(3400743266), UINT32_C(1120998827) } },
865     { { UINT32_C(2167328661), UINT32_C(3458413832), UINT32_C( 201073751), UINT32_C( 213374575) },
866       { UINT32_C(2013837834), UINT32_C(3810898171), UINT32_C(2212613221), UINT32_C(  49406573) },
867       { UINT32_C(3129155762), UINT32_C(2911413845), UINT32_C( 968394186), UINT32_C(1699049307) },
868       { UINT32_C(3282646589), UINT32_C(  62930862), UINT32_C(1445292786), UINT32_C(1863017309) } },
869     { { UINT32_C( 635260457), UINT32_C(1661469438), UINT32_C(1021831887), UINT32_C(2118047948) },
870       { UINT32_C(1312408056), UINT32_C( 838582631), UINT32_C(2708124486), UINT32_C(1258795042) },
871       { UINT32_C(4235257086), UINT32_C(3059775975), UINT32_C( 804407139), UINT32_C( 414068767) },
872       { UINT32_C(3558109487), UINT32_C(3882662782), UINT32_C(2925549234), UINT32_C(2962774223) } },
873     { { UINT32_C(1483139057), UINT32_C(4018758056), UINT32_C( 915469076), UINT32_C(2709624739) },
874       { UINT32_C(1671361148), UINT32_C(3457810027), UINT32_C(1694305093), UINT32_C( 746367803) },
875       { UINT32_C( 998564498), UINT32_C(1462373699), UINT32_C(2760751616), UINT32_C(3460632402) },
876       { UINT32_C(2155935707), UINT32_C(1719227088), UINT32_C(1981915599), UINT32_C(1128922042) } },
877     { { UINT32_C(1815208705), UINT32_C( 641354465), UINT32_C(2425042773), UINT32_C(1975257059) },
878       { UINT32_C( 766525674), UINT32_C(1300617805), UINT32_C(3891335829), UINT32_C( 582301473) },
879       { UINT32_C(4237223450), UINT32_C(2233649200), UINT32_C(3809848576), UINT32_C(2673398197) },
880       { UINT32_C( 990939185), UINT32_C(1574385860), UINT32_C(2506530026), UINT32_C(4066353783) } },
881     { { UINT32_C(1590429969), UINT32_C(2024493539), UINT32_C(2237635940), UINT32_C(4003992788) },
882       { UINT32_C( 719992570), UINT32_C(4289662463), UINT32_C(1877132474), UINT32_C(2785950357) },
883       { UINT32_C( 654629699), UINT32_C(2426384428), UINT32_C( 555155277), UINT32_C( 235912723) },
884       { UINT32_C(1655792840), UINT32_C(3887771574), UINT32_C(3559613137), UINT32_C(2259063126) } },
885     { { UINT32_C(4080597748), UINT32_C(3253921799), UINT32_C(1110561964), UINT32_C(1390952207) },
886       { UINT32_C(1199172890), UINT32_C(3939965341), UINT32_C( 722201880), UINT32_C(2688096939) },
887       { UINT32_C( 462647828), UINT32_C( 115181146), UINT32_C(1766329946), UINT32_C(1757163853) },
888       { UINT32_C( 522155514), UINT32_C(2783738698), UINT32_C(2154690030), UINT32_C(2321885293) } }
889   };
890 
891   for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
892     simde_uint32x4_t a = simde_vld1q_u32(test_vec[i].a);
893     simde_uint32x4_t b = simde_vld1q_u32(test_vec[i].b);
894     simde_uint32x4_t c = simde_vld1q_u32(test_vec[i].c);
895     simde_uint32x4_t r = simde_vabaq_u32(a, b, c);
896 
897     simde_test_arm_neon_assert_equal_u32x4(r, simde_vld1q_u32(test_vec[i].r));
898   }
899 
900   return 0;
901 #else
902   fputc('\n', stdout);
903   for (int i = 0 ; i < 8 ; i++) {
904     simde_uint32x4_t a = simde_test_arm_neon_random_u32x4();
905     simde_uint32x4_t b = simde_test_arm_neon_random_u32x4();
906     simde_uint32x4_t c = simde_test_arm_neon_random_u32x4();
907     simde_uint32x4_t r = simde_vabaq_u32(a, b, c);
908 
909     simde_test_arm_neon_write_u32x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
910     simde_test_arm_neon_write_u32x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
911     simde_test_arm_neon_write_u32x4(2, c, SIMDE_TEST_VEC_POS_MIDDLE);
912     simde_test_arm_neon_write_u32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
913   }
914   return 1;
915 #endif
916 }
917 #endif
918 
919 SIMDE_TEST_FUNC_LIST_BEGIN
920 SIMDE_TEST_FUNC_LIST_ENTRY(vaba_s8)
921 SIMDE_TEST_FUNC_LIST_ENTRY(vaba_s16)
922 SIMDE_TEST_FUNC_LIST_ENTRY(vaba_u8)
923 SIMDE_TEST_FUNC_LIST_ENTRY(vaba_u16)
924 SIMDE_TEST_FUNC_LIST_ENTRY(vaba_u32)
925 SIMDE_TEST_FUNC_LIST_ENTRY(vabaq_s8)
926 SIMDE_TEST_FUNC_LIST_ENTRY(vabaq_s16)
927 SIMDE_TEST_FUNC_LIST_ENTRY(vabaq_u8)
928 SIMDE_TEST_FUNC_LIST_ENTRY(vabaq_u16)
929 #if !defined(TEST_SIMDE_VABD_NO_TEST_32)
930   SIMDE_TEST_FUNC_LIST_ENTRY(vabaq_s32)
931   SIMDE_TEST_FUNC_LIST_ENTRY(vabaq_u32)
932 #endif
933 SIMDE_TEST_FUNC_LIST_END
934 
935 #include "test-neon-footer.h"
936