File: hsub.c

package info (click to toggle)
simde 0.8.2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie, trixie-backports
  • size: 58,264 kB
  • sloc: ansic: 817,393; sh: 315; makefile: 45; python: 26
file content (763 lines) | stat: -rw-r--r-- 49,098 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
#define SIMDE_TEST_ARM_NEON_INSN hsub

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

static int
test_simde_vhsub_s8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int8_t a[8];
    int8_t b[8];
    int8_t r[8];
  } test_vec[] = {
    { {  INT8_C(  82),  INT8_C( 111),  INT8_C(  70), -INT8_C(  31), -INT8_C(  51), -INT8_C(  22),  INT8_C( 109),  INT8_C(  85) },
      {  INT8_C( 126),  INT8_C(  89),  INT8_C(  38),  INT8_C(  58), -INT8_C(  56),  INT8_C(  28),  INT8_C(  49), -INT8_C(  21) },
      { -INT8_C(  22),  INT8_C(  11),  INT8_C(  16), -INT8_C(  45),  INT8_C(   2), -INT8_C(  25),  INT8_C(  30),  INT8_C(  53) } },
    { { -INT8_C(  63), -INT8_C( 107), -INT8_C( 109), -INT8_C(  28),  INT8_C(  68),  INT8_C(  51),  INT8_C(  14), -INT8_C( 100) },
      {  INT8_C(  29),  INT8_C(  41), -INT8_C(  53), -INT8_C( 109), -INT8_C( 102),  INT8_C(  28),  INT8_C(  36), -INT8_C(  19) },
      { -INT8_C(  46), -INT8_C(  74), -INT8_C(  28),  INT8_C(  40),  INT8_C(  85),  INT8_C(  11), -INT8_C(  11), -INT8_C(  41) } },
    { { -INT8_C( 117),  INT8_C( 106), -INT8_C(  50),  INT8_C(  89),  INT8_C(  84),  INT8_C(  59), -INT8_C(  82), -INT8_C(  46) },
      { -INT8_C( 107), -INT8_C(  44),  INT8_C(  13),  INT8_C(  93), -INT8_C(  16),  INT8_C(  62),  INT8_C(  72), -INT8_C(  78) },
      { -INT8_C(   5),  INT8_C(  75), -INT8_C(  32), -INT8_C(   2),  INT8_C(  50), -INT8_C(   2), -INT8_C(  77),  INT8_C(  16) } },
    { { -INT8_C(  45), -INT8_C(  37), -INT8_C( 106),  INT8_C(  23),  INT8_C(  15), -INT8_C(  91), -INT8_C(  77),  INT8_C(  44) },
      { -INT8_C(  50),  INT8_C( 126), -INT8_C(  64),  INT8_C( 105), -INT8_C( 101), -INT8_C(  28),  INT8_C(  86),  INT8_C(  38) },
      {  INT8_C(   2), -INT8_C(  82), -INT8_C(  21), -INT8_C(  41),  INT8_C(  58), -INT8_C(  32), -INT8_C(  82),  INT8_C(   3) } },
    { {  INT8_C(  79),  INT8_C(  36),      INT8_MAX, -INT8_C(  93),  INT8_C(  95),  INT8_C(  46),  INT8_C( 118), -INT8_C(  12) },
      {  INT8_C(   2), -INT8_C( 125),  INT8_C(  81), -INT8_C(  13), -INT8_C(  63), -INT8_C( 102), -INT8_C(  91), -INT8_C( 107) },
      {  INT8_C(  38),  INT8_C(  80),  INT8_C(  23), -INT8_C(  40),  INT8_C(  79),  INT8_C(  74),  INT8_C( 104),  INT8_C(  47) } },
    { {  INT8_C( 117),  INT8_C(  59), -INT8_C(  84), -INT8_C( 124), -INT8_C(  32),  INT8_C(  96), -INT8_C(  79), -INT8_C(  81) },
      { -INT8_C(  34),  INT8_C( 113),  INT8_C(  24),  INT8_C( 121),  INT8_C(  85),  INT8_C( 110), -INT8_C(  96), -INT8_C(  92) },
      {  INT8_C(  75), -INT8_C(  27), -INT8_C(  54), -INT8_C( 123), -INT8_C(  59), -INT8_C(   7),  INT8_C(   8),  INT8_C(   5) } },
    { { -INT8_C( 110),  INT8_C(  31),  INT8_C(  72), -INT8_C(  15),  INT8_C(  77), -INT8_C(  66), -INT8_C(  26),  INT8_C(  80) },
      {  INT8_C(  65),  INT8_C(  55),  INT8_C(  67),  INT8_C(   2), -INT8_C(  47), -INT8_C(  24), -INT8_C( 105),  INT8_C(  71) },
      { -INT8_C(  88), -INT8_C(  12),  INT8_C(   2), -INT8_C(   9),  INT8_C(  62), -INT8_C(  21),  INT8_C(  39),  INT8_C(   4) } },
    { {  INT8_C(  35),  INT8_C(  68), -INT8_C(  53),  INT8_C(   4), -INT8_C(  92),  INT8_C( 124), -INT8_C(  77), -INT8_C( 126) },
      { -INT8_C(  19), -INT8_C(  53), -INT8_C(   4),  INT8_C(  67),  INT8_C(  57), -INT8_C( 100), -INT8_C(  25), -INT8_C(  53) },
      {  INT8_C(  27),  INT8_C(  60), -INT8_C(  25), -INT8_C(  32), -INT8_C(  75),  INT8_C( 112), -INT8_C(  26), -INT8_C(  37) } }
  };

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

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

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

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

static int
test_simde_vhsub_s16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int16_t a[4];
    int16_t b[4];
    int16_t r[4];
  } test_vec[] = {
    { {  INT16_C( 12219),  INT16_C(  2492), -INT16_C( 23827),  INT16_C( 11865) },
      { -INT16_C( 25382), -INT16_C( 21711), -INT16_C( 14204), -INT16_C( 22542) },
      {  INT16_C( 18800),  INT16_C( 12101), -INT16_C(  4812),  INT16_C( 17203) } },
    { { -INT16_C( 16884), -INT16_C( 20309),  INT16_C( 24122),  INT16_C( 10291) },
      {  INT16_C( 12073),  INT16_C( 25195),  INT16_C( 21195), -INT16_C( 31187) },
      { -INT16_C( 14479), -INT16_C( 22752),  INT16_C(  1463),  INT16_C( 20739) } },
    { { -INT16_C(  5502),  INT16_C( 28559), -INT16_C(  6004),  INT16_C( 26270) },
      { -INT16_C( 12412),  INT16_C(  2066),  INT16_C(  1175), -INT16_C( 23376) },
      {  INT16_C(  3455),  INT16_C( 13246), -INT16_C(  3590),  INT16_C( 24823) } },
    { {  INT16_C( 23490), -INT16_C(   684), -INT16_C( 30790), -INT16_C(  7387) },
      { -INT16_C( 28490), -INT16_C( 32442),  INT16_C( 29666),  INT16_C( 25608) },
      {  INT16_C( 25990),  INT16_C( 15879), -INT16_C( 30228), -INT16_C( 16498) } },
    { { -INT16_C( 26787), -INT16_C(  5420),  INT16_C( 29312),  INT16_C(  1104) },
      {  INT16_C( 25153), -INT16_C( 10227), -INT16_C( 17049),  INT16_C( 10620) },
      { -INT16_C( 25970),  INT16_C(  2403),  INT16_C( 23180), -INT16_C(  4758) } },
    { { -INT16_C( 12008), -INT16_C( 11738),  INT16_C( 19288),  INT16_C(  4022) },
      { -INT16_C(   805), -INT16_C( 16752), -INT16_C( 26513), -INT16_C( 13022) },
      { -INT16_C(  5602),  INT16_C(  2507),  INT16_C( 22900),  INT16_C(  8522) } },
    { { -INT16_C(  2512), -INT16_C( 20297),  INT16_C(  1896), -INT16_C( 22092) },
      { -INT16_C( 16022), -INT16_C( 11902), -INT16_C(   386), -INT16_C( 26630) },
      {  INT16_C(  6755), -INT16_C(  4198),  INT16_C(  1141),  INT16_C(  2269) } },
    { {  INT16_C(  8655),  INT16_C( 10345),  INT16_C(  8044),  INT16_C( 18487) },
      { -INT16_C( 14565), -INT16_C( 29946),  INT16_C( 10336), -INT16_C( 28584) },
      {  INT16_C( 11610),  INT16_C( 20145), -INT16_C(  1146),  INT16_C( 23535) } }
  };

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

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

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

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

#if !defined(TEST_SIMDE_VABD_NO_TEST_32)
static int
test_simde_vhsub_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int32_t a[2];
    int32_t b[2];
    int32_t r[2];
  } test_vec[] = {
    { { -INT32_C(  2025844961), -INT32_C(  2144209898) },
      {  INT32_C(   877769654), -INT32_C(  2117382991) },
      { -INT32_C(  1451807308), -INT32_C(    13413454) } },
    { { -INT32_C(   643222163),  INT32_C(  1881268308) },
      {  INT32_C(   133900199),  INT32_C(  1872188240) },
      { -INT32_C(   388561181),  INT32_C(     4540034) } },
    { {  INT32_C(  2029442914), -INT32_C(  2097600564) },
      { -INT32_C(  1934210342),  INT32_C(    51217046) },
      {  INT32_C(  1981826628), -INT32_C(  1074408805) } },
    { {  INT32_C(   199079607),  INT32_C(  1031536278) },
      {  INT32_C(  1984263718),  INT32_C(   736484553) },
      { -INT32_C(   892592056),  INT32_C(   147525862) } },
    { { -INT32_C(  2136679500), -INT32_C(   587031293) },
      {  INT32_C(  2120857831), -INT32_C(   243173830) },
      { -INT32_C(  2128768666), -INT32_C(   171928732) } },
    { { -INT32_C(  1023582676), -INT32_C(  2097121187) },
      { -INT32_C(  1191623185), -INT32_C(   706421215) },
      {  INT32_C(    84020254), -INT32_C(   695349986) } },
    { { -INT32_C(  1135245127),  INT32_C(   211441445) },
      {  INT32_C(  1250558736), -INT32_C(  1506014086) },
      { -INT32_C(  1192901932),  INT32_C(   858727765) } },
    { { -INT32_C(   949405334), -INT32_C(  1605736015) },
      { -INT32_C(   816233554), -INT32_C(   609927903) },
      { -INT32_C(    66585890), -INT32_C(   497904056) } }
  };

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

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

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

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

static int
test_simde_vhsub_u8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint8_t a[8];
    uint8_t b[8];
    uint8_t r[8];
  } test_vec[] = {
    { { UINT8_C(197), UINT8_C(250), UINT8_C(151), UINT8_C(234), UINT8_C( 82), UINT8_C( 49), UINT8_C(246), UINT8_C( 98) },
      { UINT8_C( 53), UINT8_C(129), UINT8_C(172), UINT8_C(175), UINT8_C(141), UINT8_C(232), UINT8_C( 85), UINT8_C(247) },
      { UINT8_C( 72), UINT8_C( 60), UINT8_C(245), UINT8_C( 29), UINT8_C(226), UINT8_C(164), UINT8_C( 80), UINT8_C(181) } },
    { { UINT8_C( 33), UINT8_C(190), UINT8_C(191), UINT8_C(211), UINT8_C( 39), UINT8_C(  9), UINT8_C(115), UINT8_C(213) },
      { UINT8_C( 77), UINT8_C(204), UINT8_C(165), UINT8_C(110), UINT8_C(  9), UINT8_C( 74), UINT8_C( 73), UINT8_C(206) },
      { UINT8_C(234), UINT8_C(249), UINT8_C( 13), UINT8_C( 50), UINT8_C( 15), UINT8_C(223), UINT8_C( 21), UINT8_C(  3) } },
    { { UINT8_C( 68), UINT8_C(225), UINT8_C(184), UINT8_C(150), UINT8_C( 18), UINT8_C(175), UINT8_C(248), UINT8_C( 71) },
      { UINT8_C( 48), UINT8_C(165), UINT8_C(246), UINT8_C(189), UINT8_C(141), UINT8_C( 76), UINT8_C(180), UINT8_C(175) },
      { UINT8_C( 10), UINT8_C( 30), UINT8_C(225), UINT8_C(236), UINT8_C(194), UINT8_C( 49), UINT8_C( 34), UINT8_C(204) } },
    { { UINT8_C( 10), UINT8_C(115), UINT8_C(130), UINT8_C( 50), UINT8_C(125), UINT8_C(245), UINT8_C(  7), UINT8_C(202) },
      { UINT8_C(194), UINT8_C(172), UINT8_C( 56), UINT8_C(203), UINT8_C(246), UINT8_C(130), UINT8_C(154), UINT8_C( 59) },
      { UINT8_C(164), UINT8_C(227), UINT8_C( 37), UINT8_C(179), UINT8_C(195), UINT8_C( 57), UINT8_C(182), UINT8_C( 71) } },
    { { UINT8_C( 99), UINT8_C( 82), UINT8_C(209), UINT8_C(117), UINT8_C(  1), UINT8_C(202), UINT8_C(189), UINT8_C( 49) },
      { UINT8_C(111), UINT8_C(179), UINT8_C(238), UINT8_C(252),    UINT8_MAX, UINT8_C(163), UINT8_C(171), UINT8_C( 10) },
      { UINT8_C(250), UINT8_C(207), UINT8_C(241), UINT8_C(188), UINT8_C(129), UINT8_C( 19), UINT8_C(  9), UINT8_C( 19) } },
    { { UINT8_C( 22), UINT8_C( 45), UINT8_C( 60), UINT8_C(147), UINT8_C( 35), UINT8_C( 67), UINT8_C( 93), UINT8_C(229) },
      { UINT8_C(240), UINT8_C(150), UINT8_C(176), UINT8_C(230), UINT8_C( 24), UINT8_C( 74), UINT8_C( 33), UINT8_C(123) },
      { UINT8_C(147), UINT8_C(203), UINT8_C(198), UINT8_C(214), UINT8_C(  5), UINT8_C(252), UINT8_C( 30), UINT8_C( 53) } },
    { { UINT8_C(157), UINT8_C(243), UINT8_C(240), UINT8_C(158), UINT8_C(189), UINT8_C(173), UINT8_C(208), UINT8_C( 44) },
      { UINT8_C( 97), UINT8_C(190), UINT8_C( 40), UINT8_C( 96), UINT8_C( 97), UINT8_C(212), UINT8_C(106), UINT8_C(120) },
      { UINT8_C( 30), UINT8_C( 26), UINT8_C(100), UINT8_C( 31), UINT8_C( 46), UINT8_C(236), UINT8_C( 51), UINT8_C(218) } },
    { { UINT8_C(  1), UINT8_C(166), UINT8_C( 11), UINT8_C( 36), UINT8_C(234), UINT8_C(105), UINT8_C(  9), UINT8_C(218) },
      {    UINT8_MAX, UINT8_C(186), UINT8_C(192), UINT8_C( 23), UINT8_C(  4), UINT8_C(226), UINT8_C(146), UINT8_C(161) },
      { UINT8_C(129), UINT8_C(246), UINT8_C(165), UINT8_C(  6), UINT8_C(115), UINT8_C(195), UINT8_C(187), UINT8_C( 28) } }
  };

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

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

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

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

static int
test_simde_vhsub_u16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint16_t a[4];
    uint16_t b[4];
    uint16_t r[4];
  } test_vec[] = {
    { { UINT16_C(33493), UINT16_C(37440), UINT16_C( 4144), UINT16_C(37310) },
      { UINT16_C(59086), UINT16_C(12529), UINT16_C(23738), UINT16_C(48296) },
      { UINT16_C(52739), UINT16_C(12455), UINT16_C(55739), UINT16_C(60043) } },
    { { UINT16_C(45826), UINT16_C(60640), UINT16_C(59932), UINT16_C( 7110) },
      { UINT16_C(34724), UINT16_C(43058), UINT16_C(50281), UINT16_C(15946) },
      { UINT16_C( 5551), UINT16_C( 8791), UINT16_C( 4825), UINT16_C(61118) } },
    { { UINT16_C(35399), UINT16_C(30672), UINT16_C(36506), UINT16_C(26632) },
      { UINT16_C(63860), UINT16_C(12184), UINT16_C(16469), UINT16_C(22763) },
      { UINT16_C(51305), UINT16_C( 9244), UINT16_C(10018), UINT16_C( 1934) } },
    { { UINT16_C(52212), UINT16_C( 4164), UINT16_C( 2997), UINT16_C(22828) },
      { UINT16_C(24210), UINT16_C(64258), UINT16_C(19491), UINT16_C(27193) },
      { UINT16_C(14001), UINT16_C(35489), UINT16_C(57289), UINT16_C(63353) } },
    { { UINT16_C( 2518), UINT16_C(28897), UINT16_C(59799), UINT16_C( 3032) },
      { UINT16_C(29154), UINT16_C(14394), UINT16_C( 9649), UINT16_C(42384) },
      { UINT16_C(52218), UINT16_C( 7251), UINT16_C(25075), UINT16_C(45860) } },
    { { UINT16_C(54513), UINT16_C(42678), UINT16_C(58079), UINT16_C(28928) },
      { UINT16_C(  576), UINT16_C(25452), UINT16_C(42318), UINT16_C( 9421) },
      { UINT16_C(26968), UINT16_C( 8613), UINT16_C( 7880), UINT16_C( 9753) } },
    { { UINT16_C(44718), UINT16_C(17812), UINT16_C(27799), UINT16_C(31313) },
      { UINT16_C(35805), UINT16_C(36786), UINT16_C(17073), UINT16_C(41524) },
      { UINT16_C( 4456), UINT16_C(56049), UINT16_C( 5363), UINT16_C(60430) } },
    { { UINT16_C(59926), UINT16_C(63048), UINT16_C(18636), UINT16_C( 3431) },
      { UINT16_C(54346), UINT16_C(39024), UINT16_C(15993), UINT16_C(10428) },
      { UINT16_C( 2790), UINT16_C(12012), UINT16_C( 1321), UINT16_C(62037) } }
  };

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

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

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

static int
test_simde_vhsub_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint32_t a[2];
    uint32_t b[2];
    uint32_t r[2];
  } test_vec[] = {
    { { UINT32_C(2221756652), UINT32_C(2600386237) },
      { UINT32_C(4213813322), UINT32_C( 144531186) },
      { UINT32_C(3298938961), UINT32_C(1227927525) } },
    { { UINT32_C( 369026376), UINT32_C(2015520302) },
      { UINT32_C(3004273210), UINT32_C(3185298896) },
      { UINT32_C(2977343879), UINT32_C(3710077999) } },
    { { UINT32_C(3678488862), UINT32_C(1366638343) },
      { UINT32_C(3779895279), UINT32_C(1172957693) },
      { UINT32_C(4244264087), UINT32_C(  96840325) } },
    { { UINT32_C(4250593487), UINT32_C(2289400910) },
      { UINT32_C(3745220111), UINT32_C(1922832212) },
      { UINT32_C( 252686688), UINT32_C( 183284349) } },
    { { UINT32_C(1733156192), UINT32_C( 196723228) },
      { UINT32_C(1592526177), UINT32_C(3198473967) },
      { UINT32_C(  70315007), UINT32_C(2794091926) } },
    { { UINT32_C( 213647038), UINT32_C(2324967547) },
      { UINT32_C( 191483831), UINT32_C(1182598886) },
      { UINT32_C(  11081603), UINT32_C( 571184330) } },
    { { UINT32_C(  11455203), UINT32_C(3993724812) },
      { UINT32_C(1531770988), UINT32_C(2350510286) },
      { UINT32_C(3534809403), UINT32_C( 821607263) } },
    { { UINT32_C(1788400879), UINT32_C(3170118661) },
      { UINT32_C(3804716539), UINT32_C(1193821283) },
      { UINT32_C(3286809466), UINT32_C( 988148689) } }
  };

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

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

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

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

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

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

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

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

static int
test_simde_vhsubq_s16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int16_t a[8];
    int16_t b[8];
    int16_t r[8];
  } test_vec[] = {
    { {  INT16_C( 16405),  INT16_C( 12036), -INT16_C( 21517),  INT16_C( 29601),  INT16_C(  3136), -INT16_C( 13382),  INT16_C(  4677), -INT16_C( 27269) },
      { -INT16_C( 13592), -INT16_C( 10014),  INT16_C(  8611), -INT16_C( 32558), -INT16_C( 30492),  INT16_C( 14047),  INT16_C( 24056),  INT16_C(  3392) },
      {  INT16_C( 14998),  INT16_C( 11025), -INT16_C( 15064),  INT16_C( 31079),  INT16_C( 16814), -INT16_C( 13715), -INT16_C(  9690), -INT16_C( 15331) } },
    { {  INT16_C( 17565), -INT16_C( 28612), -INT16_C(  8720),  INT16_C( 12292), -INT16_C( 16663),  INT16_C( 12027),  INT16_C( 30672), -INT16_C( 17980) },
      { -INT16_C( 22975), -INT16_C(  7023),  INT16_C( 25544), -INT16_C( 21404),  INT16_C( 17387), -INT16_C(  7198),  INT16_C(  9120),  INT16_C( 16112) },
      {  INT16_C( 20270), -INT16_C( 10795), -INT16_C( 17132),  INT16_C( 16848), -INT16_C( 17025),  INT16_C(  9612),  INT16_C( 10776), -INT16_C( 17046) } },
    { {  INT16_C( 11367),  INT16_C( 22478), -INT16_C( 11767), -INT16_C(  3193), -INT16_C( 31856),  INT16_C( 24865), -INT16_C(  6662),  INT16_C( 15130) },
      { -INT16_C( 21620),  INT16_C( 21535), -INT16_C( 31986), -INT16_C(  1536), -INT16_C(  7481),  INT16_C( 26589), -INT16_C( 12795),  INT16_C( 28069) },
      {  INT16_C( 16493),  INT16_C(   471),  INT16_C( 10109), -INT16_C(   829), -INT16_C( 12188), -INT16_C(   862),  INT16_C(  3066), -INT16_C(  6470) } },
    { {  INT16_C( 29946),  INT16_C(  1220),  INT16_C( 19526), -INT16_C( 10249),  INT16_C(  6351), -INT16_C( 14024),  INT16_C( 21246), -INT16_C( 30204) },
      {  INT16_C(  9213),  INT16_C(  3038), -INT16_C(  8538),  INT16_C( 27909), -INT16_C(  7232), -INT16_C( 14635),  INT16_C( 31409), -INT16_C( 21709) },
      {  INT16_C( 10366), -INT16_C(   909),  INT16_C( 14032), -INT16_C( 19079),  INT16_C(  6791),  INT16_C(   305), -INT16_C(  5082), -INT16_C(  4248) } },
    { { -INT16_C(  2066),  INT16_C( 13743), -INT16_C( 22973),  INT16_C(  4620),  INT16_C( 17599), -INT16_C( 16933), -INT16_C(  8298), -INT16_C( 27833) },
      {  INT16_C(  9474), -INT16_C( 22114), -INT16_C( 23549), -INT16_C( 15594), -INT16_C(  5241),  INT16_C( 14473), -INT16_C( 17306),  INT16_C( 21731) },
      { -INT16_C(  5770),  INT16_C( 17928),  INT16_C(   288),  INT16_C( 10107),  INT16_C( 11420), -INT16_C( 15703),  INT16_C(  4504), -INT16_C( 24782) } },
    { { -INT16_C( 27724), -INT16_C(  2167), -INT16_C( 27335), -INT16_C(  2038), -INT16_C(  6695),  INT16_C( 28597), -INT16_C(   827), -INT16_C( 14590) },
      { -INT16_C( 24287),  INT16_C(  9328), -INT16_C( 30907), -INT16_C( 13080),  INT16_C( 29042), -INT16_C( 10236), -INT16_C(  6354), -INT16_C(  7635) },
      { -INT16_C(  1719), -INT16_C(  5748),  INT16_C(  1786),  INT16_C(  5521), -INT16_C( 17869),  INT16_C( 19416),  INT16_C(  2763), -INT16_C(  3478) } },
    { { -INT16_C( 18822), -INT16_C( 19239), -INT16_C(  7348),  INT16_C(  9644),  INT16_C( 25289), -INT16_C( 29035), -INT16_C( 26786), -INT16_C( 32683) },
      { -INT16_C( 14792),  INT16_C( 32164), -INT16_C( 29619), -INT16_C( 16567),  INT16_C( 19966),  INT16_C( 11416), -INT16_C( 15051), -INT16_C( 20722) },
      { -INT16_C(  2015), -INT16_C( 25702),  INT16_C( 11135),  INT16_C( 13105),  INT16_C(  2661), -INT16_C( 20226), -INT16_C(  5868), -INT16_C(  5981) } },
    { { -INT16_C(  6277), -INT16_C( 14493),  INT16_C(  4299), -INT16_C( 27411), -INT16_C( 32142), -INT16_C( 12254),  INT16_C( 30489),  INT16_C( 21072) },
      { -INT16_C(  2755), -INT16_C( 30001),  INT16_C(  6529),  INT16_C( 32586), -INT16_C(  7578), -INT16_C( 25685), -INT16_C( 18009),  INT16_C(  8779) },
      { -INT16_C(  1761),  INT16_C(  7754), -INT16_C(  1115), -INT16_C( 29999), -INT16_C( 12282),  INT16_C(  6715),  INT16_C( 24249),  INT16_C(  6146) } }
  };

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

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

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

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

static int
test_simde_vhsubq_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int32_t a[4];
    int32_t b[4];
    int32_t r[4];
  } test_vec[] = {
    { {  INT32_C(  1827319457),  INT32_C(   805361598),  INT32_C(  1912676953), -INT32_C(   674999911) },
      { -INT32_C(   933129146),  INT32_C(   323464109),  INT32_C(   883946381),  INT32_C(  1297611436) },
      {  INT32_C(  1380224301),  INT32_C(   240948744),  INT32_C(   514365286), -INT32_C(   986305674) } },
    { {  INT32_C(  1740194216),  INT32_C(  1905768728),  INT32_C(  1977850075),  INT32_C(   810330346) },
      { -INT32_C(   369578692), -INT32_C(   419676071), -INT32_C(   551834829),  INT32_C(  1311601317) },
      {  INT32_C(  1054886454),  INT32_C(  1162722399),  INT32_C(  1264842452), -INT32_C(   250635486) } },
    { { -INT32_C(   877271373),  INT32_C(  2067549344), -INT32_C(   806346779),  INT32_C(    67058887) },
      {  INT32_C(  1139603690),  INT32_C(  1797908792),  INT32_C(   977945748),  INT32_C(  1770551222) },
      { -INT32_C(  1008437532),  INT32_C(   134820276), -INT32_C(   892146264), -INT32_C(   851746168) } },
    { { -INT32_C(    30130850),  INT32_C(  1853452425),  INT32_C(  1463642768), -INT32_C(  1873068634) },
      {  INT32_C(  1842562869), -INT32_C(   975635152), -INT32_C(   117497279), -INT32_C(   127826022) },
      { -INT32_C(   936346860),  INT32_C(  1414543788),  INT32_C(   790570023), -INT32_C(   872621306) } },
    { {  INT32_C(  1308006084), -INT32_C(  1766035706), -INT32_C(  2131822119),  INT32_C(  1796229430) },
      { -INT32_C(  1042750320),  INT32_C(   579252449),  INT32_C(  1830454739), -INT32_C(   798655476) },
      {  INT32_C(  1175378202), -INT32_C(  1172644078), -INT32_C(  1981138429),  INT32_C(  1297442453) } },
    { {  INT32_C(   404577042), -INT32_C(  1531979318),  INT32_C(   153394643),  INT32_C(  1987392742) },
      { -INT32_C(   113816296), -INT32_C(   786645506),  INT32_C(  1312699970), -INT32_C(  1004624974) },
      {  INT32_C(   259196669), -INT32_C(   372666906), -INT32_C(   579652664),  INT32_C(  1496008858) } },
    { { -INT32_C(   925025026), -INT32_C(   395539435),  INT32_C(   267554857), -INT32_C(   578459707) },
      { -INT32_C(  1294484044), -INT32_C(  1115425926), -INT32_C(   603209431),  INT32_C(  1654663780) },
      {  INT32_C(   184729509),  INT32_C(   359943245),  INT32_C(   435382144), -INT32_C(  1116561744) } },
    { {  INT32_C(  2066447718),  INT32_C(   845453065), -INT32_C(   314485208),  INT32_C(  1909114813) },
      { -INT32_C(    31153788), -INT32_C(  1094998124), -INT32_C(   845494423),  INT32_C(  1462778609) },
      {  INT32_C(  1048800753),  INT32_C(   970225594),  INT32_C(   265504607),  INT32_C(   223168102) } }
  };

  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_vhsubq_s32(a, b);
    simde_test_arm_neon_assert_equal_i32x4(r, simde_vld1q_s32(test_vec[i].r));
  }

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

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

static int
test_simde_vhsubq_u8 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint8_t a[16];
    uint8_t b[16];
    uint8_t r[16];
  } test_vec[] = {
    { { UINT8_C(184), UINT8_C( 91), UINT8_C(210), UINT8_C(193), UINT8_C(242), UINT8_C( 54), UINT8_C(244), UINT8_C( 26),
        UINT8_C(140), UINT8_C( 53), UINT8_C(  7), UINT8_C( 73), UINT8_C(252), UINT8_C(210), UINT8_C(187), UINT8_C(128) },
      { UINT8_C(115), UINT8_C(223), UINT8_C(127), UINT8_C(  8), UINT8_C(134), UINT8_C( 58), UINT8_C(198), UINT8_C(239),
        UINT8_C(  1), UINT8_C( 96), UINT8_C(189), UINT8_C(242), UINT8_C(154), UINT8_C(237), UINT8_C( 73), UINT8_C( 82) },
      { UINT8_C( 34), UINT8_C(190), UINT8_C( 41), UINT8_C( 92), UINT8_C( 54), UINT8_C(254), UINT8_C( 23), UINT8_C(149),
        UINT8_C( 69), UINT8_C(234), UINT8_C(165), UINT8_C(171), UINT8_C( 49), UINT8_C(242), UINT8_C( 57), UINT8_C( 23) } },
    { { UINT8_C( 72), UINT8_C( 28), UINT8_C( 20), UINT8_C( 58), UINT8_C( 82), UINT8_C(  8), UINT8_C( 85), UINT8_C(223),
        UINT8_C( 61), UINT8_C( 92), UINT8_C( 40), UINT8_C( 58), UINT8_C( 46), UINT8_C(227), UINT8_C(186), UINT8_C(162) },
      { UINT8_C(194), UINT8_C( 57), UINT8_C(170), UINT8_C( 73), UINT8_C(116), UINT8_C(112), UINT8_C( 56), UINT8_C(117),
        UINT8_C(208), UINT8_C(245), UINT8_C(104), UINT8_C(106), UINT8_C(226), UINT8_C(177), UINT8_C(189), UINT8_C( 42) },
      { UINT8_C(195), UINT8_C(241), UINT8_C(181), UINT8_C(248), UINT8_C(239), UINT8_C(204), UINT8_C( 14), UINT8_C( 53),
        UINT8_C(182), UINT8_C(179), UINT8_C(224), UINT8_C(232), UINT8_C(166), UINT8_C( 25), UINT8_C(254), UINT8_C( 60) } },
    { { UINT8_C(205), UINT8_C(209), UINT8_C(101), UINT8_C( 32), UINT8_C(217), UINT8_C(186),    UINT8_MAX, UINT8_C( 22),
        UINT8_C( 22), UINT8_C( 39), UINT8_C( 80), UINT8_C( 69), UINT8_C( 11), UINT8_C( 11), UINT8_C(231), UINT8_C(205) },
      { UINT8_C( 68), UINT8_C(145), UINT8_C( 22), UINT8_C(184), UINT8_C(  1), UINT8_C( 79), UINT8_C( 46), UINT8_C(209),
        UINT8_C( 68), UINT8_C(150), UINT8_C( 59), UINT8_C( 39), UINT8_C( 71), UINT8_C(248), UINT8_C( 81), UINT8_C( 21) },
      { UINT8_C( 68), UINT8_C( 32), UINT8_C( 39), UINT8_C(180), UINT8_C(108), UINT8_C( 53), UINT8_C(104), UINT8_C(162),
        UINT8_C(233), UINT8_C(200), UINT8_C( 10), UINT8_C( 15), UINT8_C(226), UINT8_C(137), UINT8_C( 75), UINT8_C( 92) } },
    { { UINT8_C(201), UINT8_C(182), UINT8_C( 53), UINT8_C(162), UINT8_C(112), UINT8_C( 52), UINT8_C(185), UINT8_C(135),
        UINT8_C( 91), UINT8_C(  9), UINT8_C(204), UINT8_C(102), UINT8_C( 20), UINT8_C(179), UINT8_C( 52), UINT8_C( 89) },
      { UINT8_C( 68), UINT8_C( 74), UINT8_C( 17), UINT8_C( 69), UINT8_C(153), UINT8_C( 63), UINT8_C( 22), UINT8_C(222),
        UINT8_C(213), UINT8_C( 81), UINT8_C(  5), UINT8_C( 29), UINT8_C( 74), UINT8_C( 86), UINT8_C( 50), UINT8_C( 19) },
      { UINT8_C( 66), UINT8_C( 54), UINT8_C( 18), UINT8_C( 46), UINT8_C(235), UINT8_C(250), UINT8_C( 81), UINT8_C(212),
        UINT8_C(195), UINT8_C(220), UINT8_C( 99), UINT8_C( 36), UINT8_C(229), UINT8_C( 46), UINT8_C(  1), UINT8_C( 35) } },
    { { UINT8_C( 13), UINT8_C(103), UINT8_C(182), UINT8_C(125), UINT8_C(155), UINT8_C(111), UINT8_C(  4), UINT8_C(246),
        UINT8_C(120), UINT8_C(208), UINT8_C( 93), UINT8_C(141), UINT8_C(131), UINT8_C(145), UINT8_C(230), UINT8_C(199) },
      { UINT8_C(219), UINT8_C(247), UINT8_C( 12), UINT8_C(117), UINT8_C( 55), UINT8_C( 34), UINT8_C( 83), UINT8_C( 12),
        UINT8_C(116), UINT8_C( 88), UINT8_C( 41), UINT8_C(190), UINT8_C(174), UINT8_C( 91), UINT8_C(209), UINT8_C(187) },
      { UINT8_C(153), UINT8_C(184), UINT8_C( 85), UINT8_C(  4), UINT8_C( 50), UINT8_C( 38), UINT8_C(216), UINT8_C(117),
        UINT8_C(  2), UINT8_C( 60), UINT8_C( 26), UINT8_C(231), UINT8_C(234), UINT8_C( 27), UINT8_C( 10), UINT8_C(  6) } },
    { { UINT8_C(194), UINT8_C(135), UINT8_C( 57), UINT8_C( 93), UINT8_C(246), UINT8_C( 61), UINT8_C( 84), UINT8_C(111),
        UINT8_C( 14), UINT8_C(177), UINT8_C(252), UINT8_C(145), UINT8_C( 66), UINT8_C(226), UINT8_C( 89), UINT8_C( 29) },
      { UINT8_C(217), UINT8_C(101), UINT8_C(146), UINT8_C( 16), UINT8_C(136), UINT8_C(229), UINT8_C( 29), UINT8_C(252),
        UINT8_C( 61), UINT8_C( 70), UINT8_C(186), UINT8_C(236), UINT8_C(162), UINT8_C(139), UINT8_C(167), UINT8_C(100) },
      { UINT8_C(244), UINT8_C( 17), UINT8_C(211), UINT8_C( 38), UINT8_C( 55), UINT8_C(172), UINT8_C( 27), UINT8_C(185),
        UINT8_C(232), UINT8_C( 53), UINT8_C( 33), UINT8_C(210), UINT8_C(208), UINT8_C( 43), UINT8_C(217), UINT8_C(220) } },
    { { UINT8_C( 19), UINT8_C(224), UINT8_C(194), UINT8_C(  9), UINT8_C( 30), UINT8_C( 22), UINT8_C(120), UINT8_C( 44),
        UINT8_C(199), UINT8_C(116), UINT8_C(189), UINT8_C(  9), UINT8_C( 86), UINT8_C( 22), UINT8_C( 38), UINT8_C( 48) },
      { UINT8_C(124), UINT8_C(185), UINT8_C( 64), UINT8_C(  4), UINT8_C(158), UINT8_C( 93), UINT8_C(  0), UINT8_C(220),
        UINT8_C(164), UINT8_C(186), UINT8_C(200), UINT8_C( 70), UINT8_C( 69), UINT8_C(111), UINT8_C(170), UINT8_C( 88) },
      { UINT8_C(203), UINT8_C( 19), UINT8_C( 65), UINT8_C(  2), UINT8_C(192), UINT8_C(220), UINT8_C( 60), UINT8_C(168),
        UINT8_C( 17), UINT8_C(221), UINT8_C(250), UINT8_C(225), UINT8_C(  8), UINT8_C(211), UINT8_C(190), UINT8_C(236) } },
    { { UINT8_C( 80), UINT8_C(108), UINT8_C( 98), UINT8_C(110), UINT8_C(130), UINT8_C(218), UINT8_C(154), UINT8_C( 73),
        UINT8_C( 79), UINT8_C( 87), UINT8_C( 82), UINT8_C(165), UINT8_C(110), UINT8_C(121), UINT8_C(213), UINT8_C(234) },
      { UINT8_C( 50), UINT8_C( 22), UINT8_C(238), UINT8_C(208), UINT8_C(115), UINT8_C(238), UINT8_C(172), UINT8_C( 23),
        UINT8_C(168), UINT8_C(116), UINT8_C( 93), UINT8_C(237), UINT8_C(228), UINT8_C(  8), UINT8_C( 70), UINT8_C( 52) },
      { UINT8_C( 15), UINT8_C( 43), UINT8_C(186), UINT8_C(207), UINT8_C(  7), UINT8_C(246), UINT8_C(247), UINT8_C( 25),
        UINT8_C(211), UINT8_C(241), UINT8_C(250), UINT8_C(220), UINT8_C(197), UINT8_C( 56), UINT8_C( 71), UINT8_C( 91) } }
  };

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

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

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

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

static int
test_simde_vhsubq_u16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint16_t a[8];
    uint16_t b[8];
    uint16_t r[8];
  } test_vec[] = {
    { { UINT16_C(43124), UINT16_C(63394), UINT16_C(15490), UINT16_C(53568), UINT16_C(37779), UINT16_C(  375), UINT16_C(19468), UINT16_C(16107) },
      { UINT16_C(55650), UINT16_C(54798), UINT16_C(48071), UINT16_C(28653), UINT16_C(19247), UINT16_C( 4957), UINT16_C(41811), UINT16_C(51015) },
      { UINT16_C(59273), UINT16_C( 4298), UINT16_C(49245), UINT16_C(12457), UINT16_C( 9266), UINT16_C(63245), UINT16_C(54364), UINT16_C(48082) } },
    { { UINT16_C(59723), UINT16_C(52670), UINT16_C(65317), UINT16_C(47519), UINT16_C( 5778), UINT16_C(40634), UINT16_C(42594), UINT16_C(50652) },
      { UINT16_C(60031), UINT16_C(18331), UINT16_C(34981), UINT16_C(54710), UINT16_C( 5075), UINT16_C( 9960), UINT16_C(12470), UINT16_C(  494) },
      { UINT16_C(65382), UINT16_C(17169), UINT16_C(15168), UINT16_C(61940), UINT16_C(  351), UINT16_C(15337), UINT16_C(15062), UINT16_C(25079) } },
    { { UINT16_C(44057), UINT16_C(16335), UINT16_C(28331), UINT16_C(15864), UINT16_C(45700), UINT16_C(59099), UINT16_C(46936), UINT16_C(55467) },
      { UINT16_C(18082), UINT16_C(18207), UINT16_C(54735), UINT16_C(41500), UINT16_C( 1513), UINT16_C(40905), UINT16_C(46901), UINT16_C(20129) },
      { UINT16_C(12987), UINT16_C(64600), UINT16_C(52334), UINT16_C(52718), UINT16_C(22093), UINT16_C( 9097), UINT16_C(   17), UINT16_C(17669) } },
    { { UINT16_C(28771), UINT16_C( 3981), UINT16_C(34270), UINT16_C(25164), UINT16_C(10296), UINT16_C(36936), UINT16_C(62687), UINT16_C(33128) },
      { UINT16_C(34618), UINT16_C( 2505), UINT16_C(58717), UINT16_C(18092), UINT16_C(30186), UINT16_C( 8165), UINT16_C(34348), UINT16_C(36718) },
      { UINT16_C(62612), UINT16_C(  738), UINT16_C(53312), UINT16_C( 3536), UINT16_C(55591), UINT16_C(14385), UINT16_C(14169), UINT16_C(63741) } },
    { { UINT16_C(64502), UINT16_C(54430), UINT16_C(60289), UINT16_C(47414), UINT16_C(32531), UINT16_C(62025), UINT16_C(45683), UINT16_C(44404) },
      { UINT16_C(15673), UINT16_C(38583), UINT16_C(25378), UINT16_C( 3548), UINT16_C(49880), UINT16_C( 1068), UINT16_C(39496), UINT16_C(16275) },
      { UINT16_C(24414), UINT16_C( 7923), UINT16_C(17455), UINT16_C(21933), UINT16_C(56861), UINT16_C(30478), UINT16_C( 3093), UINT16_C(14064) } },
    { { UINT16_C(12950), UINT16_C( 5907), UINT16_C(18973), UINT16_C(12496), UINT16_C( 6601), UINT16_C(15394), UINT16_C(38603), UINT16_C( 1513) },
      { UINT16_C(41171), UINT16_C(63131), UINT16_C(30723), UINT16_C(56067), UINT16_C(12090), UINT16_C(33503), UINT16_C(29642), UINT16_C(24769) },
      { UINT16_C(51425), UINT16_C(36924), UINT16_C(59661), UINT16_C(43750), UINT16_C(62791), UINT16_C(56481), UINT16_C( 4480), UINT16_C(53908) } },
    { { UINT16_C(54693), UINT16_C(49783), UINT16_C(18207), UINT16_C(59634), UINT16_C( 5216), UINT16_C(11300), UINT16_C( 3499), UINT16_C(32305) },
      { UINT16_C(52398), UINT16_C(45428), UINT16_C(30532), UINT16_C(32397), UINT16_C(27815), UINT16_C(28929), UINT16_C(49887), UINT16_C(34001) },
      { UINT16_C( 1147), UINT16_C( 2177), UINT16_C(59373), UINT16_C(13618), UINT16_C(54236), UINT16_C(56721), UINT16_C(42342), UINT16_C(64688) } },
    { { UINT16_C(18583), UINT16_C(46662), UINT16_C(14479), UINT16_C(61342), UINT16_C(49741), UINT16_C(63515), UINT16_C(19664), UINT16_C(32374) },
      { UINT16_C(60185), UINT16_C(23855), UINT16_C(48226), UINT16_C( 2524), UINT16_C(56617), UINT16_C( 2170), UINT16_C(19359), UINT16_C(14221) },
      { UINT16_C(44735), UINT16_C(11403), UINT16_C(48662), UINT16_C(29409), UINT16_C(62098), UINT16_C(30672), UINT16_C(  152), UINT16_C( 9076) } }
  };

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

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

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

static int
test_simde_vhsubq_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    uint32_t a[4];
    uint32_t b[4];
    uint32_t r[4];
  } test_vec[] = {
    { { UINT32_C( 586011539), UINT32_C(1494387724), UINT32_C( 508636494), UINT32_C(2476525434) },
      { UINT32_C( 368102578), UINT32_C(2971585672), UINT32_C(1236965801), UINT32_C(2021672932) },
      { UINT32_C( 108954480), UINT32_C(3556368322), UINT32_C(3930802642), UINT32_C( 227426251) } },
    { { UINT32_C( 647654682), UINT32_C(1216326905), UINT32_C(1416024282), UINT32_C(1256653720) },
      { UINT32_C(1465898959), UINT32_C(1292467876), UINT32_C(4220961559), UINT32_C( 611522058) },
      { UINT32_C(3885845157), UINT32_C(4256896810), UINT32_C(2892498657), UINT32_C( 322565831) } },
    { { UINT32_C(2102070916), UINT32_C(2495990458), UINT32_C( 870853787), UINT32_C(4269657903) },
      { UINT32_C(1263918503), UINT32_C(1922588251), UINT32_C( 728575777), UINT32_C(3377520965) },
      { UINT32_C( 419076206), UINT32_C( 286701103), UINT32_C(  71139005), UINT32_C( 446068469) } },
    { { UINT32_C(2840042479), UINT32_C(   4066405), UINT32_C(1731405368), UINT32_C(2640687606) },
      { UINT32_C(3924343694), UINT32_C( 995852313), UINT32_C(4117153967), UINT32_C(2562635433) },
      { UINT32_C(3752816688), UINT32_C(3799074342), UINT32_C(3102092996), UINT32_C(  39026086) } },
    { { UINT32_C(3074557265), UINT32_C(1253539858), UINT32_C(2628971430), UINT32_C( 708384668) },
      { UINT32_C(3960676818), UINT32_C(1361538722), UINT32_C(3762720054), UINT32_C(2507670852) },
      { UINT32_C(3851907519), UINT32_C(4240967864), UINT32_C(3728092984), UINT32_C(3395324204) } },
    { { UINT32_C( 474790410), UINT32_C(3781624890), UINT32_C(2340231663), UINT32_C(  62240560) },
      { UINT32_C(2062534872), UINT32_C(1825314358), UINT32_C(3880522403), UINT32_C( 578667799) },
      { UINT32_C(3501095065), UINT32_C( 978155266), UINT32_C(3524821926), UINT32_C(4036753676) } },
    { { UINT32_C(3124676991), UINT32_C(3164317133), UINT32_C(4014414014), UINT32_C(2834496719) },
      { UINT32_C(4196590020), UINT32_C(2590502647), UINT32_C( 411218689), UINT32_C(4164616056) },
      { UINT32_C(3759010781), UINT32_C( 286907243), UINT32_C(1801597662), UINT32_C(3629907627) } },
    { { UINT32_C(2528278984), UINT32_C(3713158430), UINT32_C( 902601317), UINT32_C(1541258902) },
      { UINT32_C(2522218399), UINT32_C(4012948718), UINT32_C(3892818544), UINT32_C(2061517489) },
      { UINT32_C(   3030292), UINT32_C(4145072152), UINT32_C(2799858682), UINT32_C(4034838002) } }
  };

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

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

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

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

SIMDE_TEST_FUNC_LIST_BEGIN
SIMDE_TEST_FUNC_LIST_ENTRY(vhsub_s8)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsub_s16)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsub_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsub_u8)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsub_u16)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsub_u32)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsubq_s8)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsubq_s16)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsubq_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsubq_u8)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsubq_u16)
SIMDE_TEST_FUNC_LIST_ENTRY(vhsubq_u32)
SIMDE_TEST_FUNC_LIST_END

#include "test-neon-footer.h"