File: mmlaq.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 (444 lines) | stat: -rw-r--r-- 31,725 bytes parent folder | download | duplicates (3)
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
#define SIMDE_TEST_ARM_NEON_INSN mmlaq

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

static int
test_simde_vmmlaq_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int32_t buf[4];
    int8_t a[16];
    int8_t b[16];
    int32_t r[4];
  } test_vec[] = {
    { {  INT32_C( 121502931), -INT32_C( 890699054), -INT32_C(  95896074),  INT32_C( 723091284) },
      {  INT8_C(        64),  INT8_C(       101),  INT8_C(        95), -INT8_C(       112),
         INT8_C(        88),  INT8_C(        47), -INT8_C(        78), -INT8_C(        71),
         INT8_C(        17),  INT8_C(       106), -INT8_C(        47), -INT8_C(        99),
        -INT8_C(       108), -INT8_C(         8), -INT8_C(       120),  INT8_C(       124) },
      { -INT8_C(       127),  INT8_C(        58),  INT8_C(         2), -INT8_C(        74),
        -INT8_C(        17), -INT8_C(        35), -INT8_C(        41), -INT8_C(        97),
        -INT8_C(        73), -INT8_C(        83), -INT8_C(        42), -INT8_C(        60),
        -INT8_C(        99),  INT8_C(         4),  INT8_C(        16), -INT8_C(        84) },
      {  INT32_C( 121516083), -INT32_C( 890713187), -INT32_C(  95889845),  INT32_C( 723087483) } },
    { {  INT32_C(2010683425), -INT32_C( 396314720), -INT32_C(1398672425), -INT32_C(1179818951) },
      { -INT8_C(        81),  INT8_C(        92), -INT8_C(        94), -INT8_C(       126),
        -INT8_C(        92), -INT8_C(        38),  INT8_C(        48),  INT8_C(        10),
         INT8_C(        70),  INT8_C(        37), -INT8_C(        97), -INT8_C(         4),
         INT8_C(        22),  INT8_C(        13),  INT8_C(        15),  INT8_C(       107) },
      { -INT8_C(        90), -INT8_C(       117),  INT8_C(        81), -INT8_C(        86),
        -INT8_C(        15),  INT8_C(        15), -INT8_C(       121),  INT8_C(        12),
        -INT8_C(        60),  INT8_C(        57),  INT8_C(         5),  INT8_C(        74),
        -INT8_C(       125), -INT8_C(        32),  INT8_C(       121),  INT8_C(       123) },
      {  INT32_C(2010678295), -INT32_C( 396294656), -INT32_C(1398691233), -INT32_C(1179810013) } },
    { {  INT32_C(2059892279), -INT32_C( 783670737), -INT32_C( 989147536), -INT32_C(1192615628) },
      {  INT8_C(        41), -INT8_C(        17),  INT8_C(        32), -INT8_C(        95),
         INT8_C(        85), -INT8_C(        51),  INT8_C(        58),  INT8_C(        59),
         INT8_C(        49), -INT8_C(         9), -INT8_C(        36), -INT8_C(        90),
         INT8_C(         6),  INT8_C(        85), -INT8_C(       111), -INT8_C(        25) },
      { -INT8_C(        52), -INT8_C(        96),  INT8_C(       108),  INT8_C(        78),
         INT8_C(        43),  INT8_C(        25),  INT8_C(        79),  INT8_C(        55),
        -INT8_C(       112),  INT8_C(         0),  INT8_C(        14),  INT8_C(       123),
        -INT8_C(         2),  INT8_C(        26), -INT8_C(       108), -INT8_C(        65) },
      {  INT32_C(2059898032), -INT32_C( 783698161), -INT32_C( 989167889), -INT32_C(1192616879) } },
    { { -INT32_C( 429681119), -INT32_C(1933958892),  INT32_C(1007925534),  INT32_C( 634944359) },
      { -INT8_C(       105),  INT8_C(        66), -INT8_C(        87),  INT8_C(        94),
         INT8_C(        68),  INT8_C(       120), -INT8_C(       101), -INT8_C(        13),
         INT8_C(        52), -INT8_C(       123),  INT8_C(        13),  INT8_C(       122),
        -INT8_C(        98),  INT8_C(       110),  INT8_C(        10),  INT8_C(        59) },
      { -INT8_C(       127), -INT8_C(        49),  INT8_C(        92),  INT8_C(        81),
        -INT8_C(        56), -INT8_C(        55), -INT8_C(        82),  INT8_C(        60),
         INT8_C(        95), -INT8_C(         8), -INT8_C(       124),  INT8_C(        85),
         INT8_C(        73), -INT8_C(       103), -INT8_C(       107), -INT8_C(        54) },
      { -INT32_C( 429674314), -INT32_C(1933946504),  INT32_C(1007938193),  INT32_C( 634936301) } },
    { {  INT32_C(1275300771),  INT32_C( 832023400), -INT32_C( 388824074),  INT32_C( 904630208) },
      { -INT8_C(        69),  INT8_C(        33),  INT8_C(        41), -INT8_C(        14),
         INT8_C(        16),  INT8_C(        68), -INT8_C(        20),  INT8_C(       119),
        -INT8_C(        38), -INT8_C(        47),  INT8_C(        16), -INT8_C(        57),
         INT8_C(        13), -INT8_C(        33), -INT8_C(        82),  INT8_C(         9) },
      { -INT8_C(        17), -INT8_C(        91),  INT8_C(       124),  INT8_C(        42),
         INT8_C(        56), -INT8_C(       124), -INT8_C(        24),  INT8_C(        96),
         INT8_C(        78),  INT8_C(       110), -INT8_C(        21), -INT8_C(        98),
         INT8_C(        15),  INT8_C(       105),  INT8_C(        74),  INT8_C(        38) },
      {  INT32_C(1275307805),  INT32_C( 832032581), -INT32_C( 388811909),  INT32_C( 904618328) } },
    { { -INT32_C(1213504456),  INT32_C(2140022657), -INT32_C(  60484053),  INT32_C( 515033698) },
      { -INT8_C(        84), -INT8_C(        66), -INT8_C(        33),  INT8_C(         7),
         INT8_C(        15), -INT8_C(       126),  INT8_C(        23),  INT8_C(        73),
         INT8_C(        96),  INT8_C(        75),  INT8_C(        84), -INT8_C(       121),
        -INT8_C(        23), -INT8_C(        43),  INT8_C(        42), -INT8_C(        82) },
      { -INT8_C(        29),  INT8_C(       105), -INT8_C(       106),  INT8_C(        74),
         INT8_C(        59), -INT8_C(        29), -INT8_C(       101), -INT8_C(        89),
         INT8_C(        76), -INT8_C(        98),  INT8_C(        47), -INT8_C(        66),
        -INT8_C(        49), -INT8_C(       109), -INT8_C(        44),  INT8_C(        30) },
      { -INT32_C(1213509215),  INT32_C(2140034905), -INT32_C(  60493874),  INT32_C( 515047084) } },
    { { -INT32_C(1641610373), -INT32_C(1466453215), -INT32_C(  28364830), -INT32_C( 889593873) },
      { -INT8_C(        19),  INT8_C(        98), -INT8_C(        90),  INT8_C(        53),
        -INT8_C(       117), -INT8_C(        79),  INT8_C(       101),  INT8_C(       113),
         INT8_C(         3),  INT8_C(        14), -INT8_C(        11), -INT8_C(        60),
        -INT8_C(        69),  INT8_C(        85), -INT8_C(       125), -INT8_C(        66) },
      {  INT8_C(         2), -INT8_C(        76),  INT8_C(        17), -INT8_C(        47),
         INT8_C(        63),  INT8_C(       105),  INT8_C(        86),  INT8_C(        96),
        -INT8_C(       127),  INT8_C(        72), -INT8_C(        52),  INT8_C(        41),
        -INT8_C(       100), -INT8_C(        25), -INT8_C(       113), -INT8_C(        12) },
      { -INT32_C(1641618012), -INT32_C(1466435987), -INT32_C(  28375763), -INT32_C( 889575442) } },
    { {  INT32_C(1433638094), -INT32_C(1717027586), -INT32_C(1630567070), -INT32_C( 713664607) },
      {  INT8_C(       121),  INT8_C(        16),  INT8_C(        83),  INT8_C(        72),
        -INT8_C(       121), -INT8_C(        73),  INT8_C(       125),  INT8_C(       106),
         INT8_C(        36),  INT8_C(        85), -INT8_C(        62),  INT8_C(        64),
         INT8_C(        81), -INT8_C(        64),  INT8_C(        83),  INT8_C(         1) },
      {  INT8_C(        48), -INT8_C(        98),  INT8_C(       117),  INT8_C(        24),
         INT8_C(       105),  INT8_C(        16),  INT8_C(       125),  INT8_C(        56),
        -INT8_C(        19), -INT8_C(        61),  INT8_C(        49), -INT8_C(        99),
        -INT8_C(        66), -INT8_C(        58),  INT8_C(        81), -INT8_C(       119) },
      {  INT32_C(1433661461), -INT32_C(1717024191), -INT32_C(1630561478), -INT32_C( 713674880) } },
  };

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

    buf = simde_vld1q_s32(test_vec[i].buf);
    a = simde_vld1q_s8(test_vec[i].a);
    b = simde_vld1q_s8(test_vec[i].b);
    r = simde_vmmlaq_s32(buf, 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 buf = simde_test_arm_neon_random_i32x4();
    simde_int8x16_t a = simde_test_arm_neon_random_i8x16();
    simde_int8x16_t b = simde_test_arm_neon_random_i8x16();
    simde_int32x4_t r = simde_vmmlaq_s32(buf, a, b);

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

static int
test_simde_vmmlaq_u32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    uint32_t buf[4];
    uint8_t a[16];
    uint8_t b[16];
    uint32_t r[4];
  } test_vec[] = {
    { {  UINT32_C(3573028203),  UINT32_C(2211440563),  UINT32_C(2074392575),  UINT32_C(3833030654) },
      {  UINT32_C(       112),  UINT32_C(        35),  UINT32_C(       195),  UINT32_C(       239),
         UINT32_C(       192),  UINT32_C(       160),  UINT32_C(       242),  UINT32_C(        43),
         UINT32_C(       242),  UINT32_C(       123),  UINT32_C(       212),  UINT32_C(       153),
         UINT32_C(        78),  UINT32_C(       123),  UINT32_C(       154),  UINT32_C(       157) },
      {  UINT32_C(       137),  UINT32_C(        21),  UINT32_C(       223),  UINT32_C(       185),
         UINT32_C(       252),  UINT32_C(       177),  UINT32_C(        68),  UINT32_C(       193),
         UINT32_C(       243),  UINT32_C(        21),  UINT32_C(        49),  UINT32_C(       192),
         UINT32_C(       146),  UINT32_C(       191),  UINT32_C(       253),  UINT32_C(       196) },
      {  UINT32_C(3573233441),  UINT32_C(2211652203),  UINT32_C(2074586093),  UINT32_C(3833236422) } },
    { {  UINT32_C(2859674552),  UINT32_C(1539856971),  UINT32_C(2699298204),  UINT32_C(2528880215) },
      {  UINT32_C(        23),  UINT32_C(       213),  UINT32_C(        27),  UINT32_C(       160),
         UINT32_C(       242),  UINT32_C(        71),  UINT32_C(        48),  UINT32_C(         8),
         UINT32_C(       111),  UINT32_C(        43),  UINT32_C(        99),  UINT32_C(       124),
         UINT32_C(       131),  UINT32_C(        76),  UINT32_C(        38),  UINT32_C(        83) },
      {  UINT32_C(       144),  UINT32_C(       223),  UINT32_C(       241),  UINT32_C(       116),
         UINT32_C(        43),  UINT32_C(       211),  UINT32_C(        99),  UINT32_C(       237),
         UINT32_C(       123),  UINT32_C(        24),  UINT32_C(       184),  UINT32_C(       106),
         UINT32_C(       139),  UINT32_C(       135),  UINT32_C(       186),  UINT32_C(        89) },
      {  UINT32_C(2859782465),  UINT32_C(1539939703),  UINT32_C(2699407122),  UINT32_C(2528969184) } },
    { {  UINT32_C(3931292241),  UINT32_C(4113871089),  UINT32_C(1798782129),  UINT32_C(1190871807) },
      {  UINT32_C(       199),  UINT32_C(        64),  UINT32_C(       171),  UINT32_C(       168),
         UINT32_C(         5),  UINT32_C(       188),  UINT32_C(       169),  UINT32_C(       246),
         UINT32_C(        68),  UINT32_C(       228),  UINT32_C(       111),  UINT32_C(        32),
         UINT32_C(       252),  UINT32_C(       196),  UINT32_C(        29),  UINT32_C(       196) },
      {  UINT32_C(       236),  UINT32_C(       138),  UINT32_C(       180),  UINT32_C(       188),
         UINT32_C(       109),  UINT32_C(       216),  UINT32_C(         8),  UINT32_C(       183),
         UINT32_C(       242),  UINT32_C(       243),  UINT32_C(       197),  UINT32_C(       145),
         UINT32_C(       234),  UINT32_C(       215),  UINT32_C(       153),  UINT32_C(       205) },
      {  UINT32_C(3931497924),  UINT32_C(4114110723),  UINT32_C(1798961541),  UINT32_C(1191115899) } },
    { {  UINT32_C(3341979120),  UINT32_C(2624308177),  UINT32_C(2403712828),  UINT32_C(1901110978) },
      {  UINT32_C(       136),  UINT32_C(         2),  UINT32_C(       240),  UINT32_C(       141),
         UINT32_C(        76),  UINT32_C(        70),  UINT32_C(        27),  UINT32_C(       144),
         UINT32_C(        41),  UINT32_C(        91),  UINT32_C(       155),  UINT32_C(        97),
         UINT32_C(        33),  UINT32_C(       229),  UINT32_C(       118),  UINT32_C(       229) },
      {  UINT32_C(       183),  UINT32_C(        97),  UINT32_C(       160),  UINT32_C(       207),
         UINT32_C(        91),  UINT32_C(       124),  UINT32_C(       157),  UINT32_C(       218),
         UINT32_C(       129),  UINT32_C(       255),  UINT32_C(       123),  UINT32_C(         5),
         UINT32_C(        98),  UINT32_C(       133),  UINT32_C(       122),  UINT32_C(       172) },
      {  UINT32_C(3342123016),  UINT32_C(2624401276),  UINT32_C(2403873884),  UINT32_C(1901246497) } },
    { {  UINT32_C(1715212178),  UINT32_C(1906210618),  UINT32_C(3294143216),  UINT32_C(2469394651) },
      {  UINT32_C(       104),  UINT32_C(        95),  UINT32_C(       148),  UINT32_C(       233),
         UINT32_C(       106),  UINT32_C(       197),  UINT32_C(       133),  UINT32_C(       135),
         UINT32_C(       107),  UINT32_C(       232),  UINT32_C(       111),  UINT32_C(         8),
         UINT32_C(       191),  UINT32_C(        72),  UINT32_C(        64),  UINT32_C(        41) },
      {  UINT32_C(       151),  UINT32_C(        34),  UINT32_C(        28),  UINT32_C(        19),
         UINT32_C(       224),  UINT32_C(       127),  UINT32_C(       230),  UINT32_C(       145),
         UINT32_C(       217),  UINT32_C(       116),  UINT32_C(       237),  UINT32_C(       157),
         UINT32_C(       245),  UINT32_C(       162),  UINT32_C(       143),  UINT32_C(       157) },
      {  UINT32_C(1715338611),  UINT32_C(1906413961),  UINT32_C(3294243114),  UINT32_C(2469546393) } },
    { {  UINT32_C(2314557007),  UINT32_C(1759686670),  UINT32_C(3008047373),  UINT32_C(4258641448) },
      {  UINT32_C(       219),  UINT32_C(        28),  UINT32_C(       184),  UINT32_C(       203),
         UINT32_C(        41),  UINT32_C(       239),  UINT32_C(         6),  UINT32_C(       150),
         UINT32_C(       175),  UINT32_C(       116),  UINT32_C(       108),  UINT32_C(       181),
         UINT32_C(       183),  UINT32_C(       129),  UINT32_C(        92),  UINT32_C(       197) },
      {  UINT32_C(       166),  UINT32_C(       128),  UINT32_C(        56),  UINT32_C(        93),
         UINT32_C(       194),  UINT32_C(        13),  UINT32_C(       157),  UINT32_C(        93),
         UINT32_C(       239),  UINT32_C(       101),  UINT32_C(        82),  UINT32_C(       173),
         UINT32_C(       241),  UINT32_C(       121),  UINT32_C(       161),  UINT32_C(       222) },
      {  UINT32_C(2314652081),  UINT32_C(1759865112),  UINT32_C(3008184096),  UINT32_C(4258853416) } },
    { {  UINT32_C(4108229792),  UINT32_C( 194604719),  UINT32_C(2198988510),  UINT32_C(3815486737) },
      {  UINT32_C(        68),  UINT32_C(       218),  UINT32_C(        25),  UINT32_C(       100),
         UINT32_C(       221),  UINT32_C(       183),  UINT32_C(        27),  UINT32_C(       230),
         UINT32_C(       154),  UINT32_C(       187),  UINT32_C(       149),  UINT32_C(        94),
         UINT32_C(        58),  UINT32_C(       115),  UINT32_C(       131),  UINT32_C(       184) },
      {  UINT32_C(       154),  UINT32_C(         5),  UINT32_C(       203),  UINT32_C(         7),
         UINT32_C(         9),  UINT32_C(        18),  UINT32_C(        37),  UINT32_C(       243),
         UINT32_C(       163),  UINT32_C(       240),  UINT32_C(       221),  UINT32_C(       253),
         UINT32_C(        77),  UINT32_C(        82),  UINT32_C(       179),  UINT32_C(       125) },
      {  UINT32_C(4108309301),  UINT32_C( 194764554),  UINT32_C(2199096217),  UINT32_C(3815673775) } },
    { {  UINT32_C(3605971860),  UINT32_C(3049958308),  UINT32_C(4195630357),  UINT32_C(2144920430) },
      {  UINT32_C(       218),  UINT32_C(       178),  UINT32_C(       118),  UINT32_C(       105),
         UINT32_C(       131),  UINT32_C(        64),  UINT32_C(        86),  UINT32_C(       156),
         UINT32_C(       139),  UINT32_C(       131),  UINT32_C(       161),  UINT32_C(        33),
         UINT32_C(       241),  UINT32_C(       239),  UINT32_C(        52),  UINT32_C(       140) },
      {  UINT32_C(        44),  UINT32_C(        58),  UINT32_C(       226),  UINT32_C(       228),
         UINT32_C(       164),  UINT32_C(       117),  UINT32_C(       224),  UINT32_C(       176),
         UINT32_C(        69),  UINT32_C(       183),  UINT32_C(       218),  UINT32_C(        99),
         UINT32_C(        50),  UINT32_C(        59),  UINT32_C(       181),  UINT32_C(        53) },
      {  UINT32_C(3606118076),  UINT32_C(3050076203),  UINT32_C(4195791756),  UINT32_C(2145035342) } },
  };

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

    buf = simde_vld1q_u32(test_vec[i].buf);
    a = simde_vld1q_u8(test_vec[i].a);
    b = simde_vld1q_u8(test_vec[i].b);
    r = simde_vmmlaq_u32(buf, 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 buf = simde_test_arm_neon_random_u32x4();
    simde_uint8x16_t a = simde_test_arm_neon_random_u8x16();
    simde_uint8x16_t b = simde_test_arm_neon_random_u8x16();
    simde_uint32x4_t r = simde_vmmlaq_u32(buf, a, b);

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

static int
test_simde_vusmmlaq_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    int32_t buf[4];
    uint8_t a[16];
    int8_t b[16];
    int32_t r[4];
  } test_vec[] = {
    { {  INT32_C(1792180012),  INT32_C(1148859016),  INT32_C( 208301555),  INT32_C(1161483939) },
      {  UINT8_C(       116),  UINT8_C(       154),  UINT8_C(        70),  UINT8_C(       246),
         UINT8_C(       131),  UINT8_C(         7),  UINT8_C(       126),  UINT8_C(       189),
         UINT8_C(       207),  UINT8_C(        98),  UINT8_C(       164),  UINT8_C(         4),
         UINT8_C(       125),  UINT8_C(       116),  UINT8_C(       222),  UINT8_C(       116) },
      {  INT8_C(         9),  INT8_C(        71),  INT8_C(       109), -INT8_C(        33),
         INT8_C(        46), -INT8_C(        26),  INT8_C(        54),  INT8_C(        82),
         INT8_C(        30),  INT8_C(        20), -INT8_C(        41), -INT8_C(        93),
         INT8_C(        66),  INT8_C(        60), -INT8_C(        94),  INT8_C(        59) },
      {  INT32_C(1792219648),  INT32_C(1148848201),  INT32_C( 208352354),  INT32_C(1161486199) } },
    { { -INT32_C(1524177270),  INT32_C( 924172100), -INT32_C(1008754356),  INT32_C( 923529599) },
      {  UINT8_C(        59),  UINT8_C(       232),  UINT8_C(        26),  UINT8_C(         2),
         UINT8_C(        16),  UINT8_C(        63),  UINT8_C(        62),  UINT8_C(       251),
         UINT8_C(        39),  UINT8_C(       117),  UINT8_C(         2),  UINT8_C(       234),
         UINT8_C(       164),  UINT8_C(       173),  UINT8_C(        88),  UINT8_C(       194) },
      { -INT8_C(        85),  INT8_C(        63), -INT8_C(       124),  INT8_C(        39),
         INT8_C(        56), -INT8_C(        97), -INT8_C(        87), -INT8_C(        33),
        -INT8_C(        35),  INT8_C(       102), -INT8_C(        86),  INT8_C(       109),
         INT8_C(       109),  INT8_C(        93), -INT8_C(        70),  INT8_C(        53) },
      { -INT32_C(1524189707),  INT32_C( 924208247), -INT32_C(1008763077),  INT32_C( 923603589) } },
    { { -INT32_C(1681029339),  INT32_C(1843819007), -INT32_C(1109910199), -INT32_C(1593911054) },
      {  UINT8_C(        43),  UINT8_C(        17),  UINT8_C(       234),  UINT8_C(       118),
         UINT8_C(        19),  UINT8_C(       119),  UINT8_C(        51),  UINT8_C(       193),
         UINT8_C(        93),  UINT8_C(       153),  UINT8_C(        54),  UINT8_C(       220),
         UINT8_C(       248),  UINT8_C(       131),  UINT8_C(       116),  UINT8_C(        90) },
      { -INT8_C(        78), -INT8_C(        65),  INT8_C(        30), -INT8_C(        27),
         INT8_C(        12), -INT8_C(       102), -INT8_C(        11),  INT8_C(       101),
        -INT8_C(        39), -INT8_C(        19), -INT8_C(        90), -INT8_C(        28),
         INT8_C(        25),  INT8_C(        32), -INT8_C(        91), -INT8_C(        92) },
      { -INT32_C(1681022942),  INT32_C(1843774529), -INT32_C(1109934290), -INT32_C(1593937052) } },
    { {  INT32_C( 528222871), -INT32_C(  61520001), -INT32_C(1221837601), -INT32_C( 787543656) },
      {  UINT8_C(       106),  UINT8_C(        69),  UINT8_C(       229),  UINT8_C(       149),
         UINT8_C(        91),  UINT8_C(        80),  UINT8_C(       150),  UINT8_C(       123),
         UINT8_C(       193),  UINT8_C(       130),  UINT8_C(        35),  UINT8_C(       233),
         UINT8_C(        20),  UINT8_C(        52),  UINT8_C(       197),  UINT8_C(       166) },
      {  INT8_C(       121), -INT8_C(        93),  INT8_C(        90),  INT8_C(       114),
         INT8_C(        33), -INT8_C(       121),  INT8_C(         6),  INT8_C(        59),
         INT8_C(       121),  INT8_C(         5), -INT8_C(       118),  INT8_C(        57),
        -INT8_C(        26),  INT8_C(        93), -INT8_C(       104),  INT8_C(       118) },
      {  INT32_C( 528268356), -INT32_C(  61521371), -INT32_C(1221791282), -INT32_C( 787507086) } },
    { { -INT32_C( 652248189), -INT32_C( 783769658),  INT32_C( 734319654), -INT32_C( 101709057) },
      {  UINT8_C(       249),  UINT8_C(         1),  UINT8_C(       207),  UINT8_C(        92),
         UINT8_C(        22),  UINT8_C(       233),  UINT8_C(       145),  UINT8_C(       231),
         UINT8_C(        13),  UINT8_C(       144),  UINT8_C(       229),  UINT8_C(       231),
         UINT8_C(       247),  UINT8_C(        27),  UINT8_C(        56),  UINT8_C(        82) },
      { -INT8_C(        42), -INT8_C(        99),  INT8_C(        82),  INT8_C(         5),
        -INT8_C(        24),  INT8_C(        61),  INT8_C(       124), -INT8_C(        11),
        -INT8_C(       109), -INT8_C(        26),  INT8_C(        17), -INT8_C(       128),
        -INT8_C(        21),  INT8_C(         2),  INT8_C(         0),  INT8_C(       109) },
      { -INT32_C( 652212188), -INT32_C( 783779899),  INT32_C( 734326546), -INT32_C( 101736088) } },
    { {  INT32_C(2085784010), -INT32_C(1427931760), -INT32_C( 369978285),  INT32_C( 497167080) },
      {  UINT8_C(         9),  UINT8_C(       192),  UINT8_C(       231),  UINT8_C(        69),
         UINT8_C(       125),  UINT8_C(        88),  UINT8_C(       183),  UINT8_C(        55),
         UINT8_C(       139),  UINT8_C(       143),  UINT8_C(        35),  UINT8_C(        75),
         UINT8_C(       197),  UINT8_C(       116),  UINT8_C(        71),  UINT8_C(       169) },
      { -INT8_C(        34), -INT8_C(        41),  INT8_C(        78),  INT8_C(        12),
         INT8_C(        39),  INT8_C(        24), -INT8_C(        77),  INT8_C(       101),
        -INT8_C(        23),  INT8_C(        95),  INT8_C(        54),  INT8_C(       108),
        -INT8_C(       102),  INT8_C(         4), -INT8_C(        16), -INT8_C(        66) },
      {  INT32_C(2085793129), -INT32_C(1427912757), -INT32_C( 369963175),  INT32_C( 497155538) } },
    { { -INT32_C(1792908550), -INT32_C(1481162987),  INT32_C(1046363483),  INT32_C(1628578091) },
      {  UINT8_C(       159),  UINT8_C(        29),  UINT8_C(        86),  UINT8_C(        19),
         UINT8_C(       249),  UINT8_C(       163),  UINT8_C(       250),  UINT8_C(        12),
         UINT8_C(       235),  UINT8_C(       189),  UINT8_C(       140),  UINT8_C(        97),
         UINT8_C(       117),  UINT8_C(        61),  UINT8_C(       255),  UINT8_C(       102) },
      { -INT8_C(         3), -INT8_C(       102), -INT8_C(         2),  INT8_C(        67),
         INT8_C(       105), -INT8_C(        34), -INT8_C(         5), -INT8_C(       122),
         INT8_C(        40), -INT8_C(        90), -INT8_C(        70), -INT8_C(       117),
         INT8_C(        76), -INT8_C(       121),  INT8_C(        97),  INT8_C(        13) },
      { -INT32_C(1792892995), -INT32_C(1481143873),  INT32_C(1046346211),  INT32_C(1628576904) } },
    { {  INT32_C(  86937068), -INT32_C(1590406855), -INT32_C( 509274194),  INT32_C( 511096590) },
      {  UINT8_C(       171),  UINT8_C(       185),  UINT8_C(        25),  UINT8_C(       215),
         UINT8_C(       150),  UINT8_C(        25),  UINT8_C(       124),  UINT8_C(       234),
         UINT8_C(        17),  UINT8_C(        42),  UINT8_C(       229),  UINT8_C(        71),
         UINT8_C(        96),  UINT8_C(       248),  UINT8_C(        55),  UINT8_C(       207) },
      { -INT8_C(        77), -INT8_C(        97), -INT8_C(       103), -INT8_C(        96),
         INT8_C(        80),  INT8_C(        89), -INT8_C(         7),  INT8_C(        30),
        -INT8_C(        29), -INT8_C(        26),  INT8_C(         7),  INT8_C(       117),
         INT8_C(       109),  INT8_C(        55), -INT8_C(        71), -INT8_C(        63) },
      {  INT32_C(  86903118), -INT32_C(1590397115), -INT32_C( 509274403),  INT32_C( 511112073) } },
  };

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

    buf = simde_vld1q_s32(test_vec[i].buf);
    a = simde_vld1q_u8(test_vec[i].a);
    b = simde_vld1q_s8(test_vec[i].b);
    r = simde_vusmmlaq_s32(buf, 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 buf = simde_test_arm_neon_random_i32x4();
    simde_uint8x16_t a = simde_test_arm_neon_random_u8x16();
    simde_int8x16_t b = simde_test_arm_neon_random_i8x16();
    simde_int32x4_t r = simde_vusmmlaq_s32(buf, a, b);

    simde_test_arm_neon_write_i32x4(2, buf, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_u8x16(2, a, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i8x16(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_vbfmmlaq_f32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  struct {
    simde_float32_t buf[4];
    simde_bfloat16_t a[8];
    simde_bfloat16_t b[8];
    simde_float32_t r[4];
  } test_vec[] = {
    { { SIMDE_FLOAT32_C(  -663.97), SIMDE_FLOAT32_C(   103.85), SIMDE_FLOAT32_C(   383.97), SIMDE_FLOAT32_C(  -387.23) },
      { SIMDE_BFLOAT16_VALUE(   -15.12), SIMDE_BFLOAT16_VALUE(    89.00), SIMDE_BFLOAT16_VALUE(    86.00), SIMDE_BFLOAT16_VALUE(    35.00),
        SIMDE_BFLOAT16_VALUE(   -28.50), SIMDE_BFLOAT16_VALUE(    42.75), SIMDE_BFLOAT16_VALUE(   -44.00), SIMDE_BFLOAT16_VALUE(    52.75) },
      { SIMDE_BFLOAT16_VALUE(    95.50), SIMDE_BFLOAT16_VALUE(   -28.00), SIMDE_BFLOAT16_VALUE(    73.00), SIMDE_BFLOAT16_VALUE(    59.50),
        SIMDE_BFLOAT16_VALUE(    76.50), SIMDE_BFLOAT16_VALUE(    -7.16), SIMDE_BFLOAT16_VALUE(   -58.00), SIMDE_BFLOAT16_VALUE(   -14.06) },
      { SIMDE_FLOAT32_C(  3760.09), SIMDE_FLOAT32_C( -7170.31), SIMDE_FLOAT32_C( -3608.16), SIMDE_FLOAT32_C( -1063.21) } },
    { { SIMDE_FLOAT32_C(  -688.33), SIMDE_FLOAT32_C(  -782.95), SIMDE_FLOAT32_C(  -613.46), SIMDE_FLOAT32_C(   710.46) },
      { SIMDE_BFLOAT16_VALUE(    92.00), SIMDE_BFLOAT16_VALUE(    69.00), SIMDE_BFLOAT16_VALUE(   -26.75), SIMDE_BFLOAT16_VALUE(   -40.50),
        SIMDE_BFLOAT16_VALUE(   -99.50), SIMDE_BFLOAT16_VALUE(   -83.50), SIMDE_BFLOAT16_VALUE(    19.88), SIMDE_BFLOAT16_VALUE(   -66.00) },
      { SIMDE_BFLOAT16_VALUE(    26.88), SIMDE_BFLOAT16_VALUE(   -41.75), SIMDE_BFLOAT16_VALUE(    -4.53), SIMDE_BFLOAT16_VALUE(   -88.00),
        SIMDE_BFLOAT16_VALUE(   -52.50), SIMDE_BFLOAT16_VALUE(   -18.50), SIMDE_BFLOAT16_VALUE(    47.00), SIMDE_BFLOAT16_VALUE(    18.88) },
      { SIMDE_FLOAT32_C(  2588.63), SIMDE_FLOAT32_C( -8911.14), SIMDE_FLOAT32_C(  5916.54), SIMDE_FLOAT32_C(  7167.33) } },
    { { SIMDE_FLOAT32_C(  -757.49), SIMDE_FLOAT32_C(  -970.43), SIMDE_FLOAT32_C(  -283.88), SIMDE_FLOAT32_C(  -804.46) },
      { SIMDE_BFLOAT16_VALUE(   -25.12), SIMDE_BFLOAT16_VALUE(   -55.50), SIMDE_BFLOAT16_VALUE(    79.00), SIMDE_BFLOAT16_VALUE(   -48.75),
        SIMDE_BFLOAT16_VALUE(    37.50), SIMDE_BFLOAT16_VALUE(   -79.00), SIMDE_BFLOAT16_VALUE(    37.25), SIMDE_BFLOAT16_VALUE(    68.50) },
      { SIMDE_BFLOAT16_VALUE(   -57.25), SIMDE_BFLOAT16_VALUE(    76.00), SIMDE_BFLOAT16_VALUE(    39.75), SIMDE_BFLOAT16_VALUE(   -65.50),
        SIMDE_BFLOAT16_VALUE(    45.25), SIMDE_BFLOAT16_VALUE(   -87.00), SIMDE_BFLOAT16_VALUE(    -5.84), SIMDE_BFLOAT16_VALUE(    45.75) },
      { SIMDE_FLOAT32_C(  2796.29), SIMDE_FLOAT32_C(    29.20), SIMDE_FLOAT32_C(-11440.82), SIMDE_FLOAT32_C( 10681.61) } },
    { { SIMDE_FLOAT32_C(  -705.94), SIMDE_FLOAT32_C(  -859.67), SIMDE_FLOAT32_C(   799.23), SIMDE_FLOAT32_C(   563.15) },
      { SIMDE_BFLOAT16_VALUE(   -27.75), SIMDE_BFLOAT16_VALUE(   -24.62), SIMDE_BFLOAT16_VALUE(    68.00), SIMDE_BFLOAT16_VALUE(    19.75),
        SIMDE_BFLOAT16_VALUE(    56.75), SIMDE_BFLOAT16_VALUE(    15.06), SIMDE_BFLOAT16_VALUE(   -61.50), SIMDE_BFLOAT16_VALUE(    81.00) },
      { SIMDE_BFLOAT16_VALUE(    18.00), SIMDE_BFLOAT16_VALUE(    10.19), SIMDE_BFLOAT16_VALUE(   -99.50), SIMDE_BFLOAT16_VALUE(    93.00),
        SIMDE_BFLOAT16_VALUE(    54.75), SIMDE_BFLOAT16_VALUE(    79.50), SIMDE_BFLOAT16_VALUE(   -55.75), SIMDE_BFLOAT16_VALUE(    -7.81) },
      { SIMDE_FLOAT32_C( -6385.56), SIMDE_FLOAT32_C( -8281.97), SIMDE_FLOAT32_C( 15626.43), SIMDE_FLOAT32_C(  7663.49) } },
  };

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

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

  return 0;

#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_float32x4_t buf = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f);
    simde_bfloat16x8_t a = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0));
    simde_bfloat16x8_t b = simde_test_arm_neon_random_bf16x8(SIMDE_BFLOAT16_VALUE(-100.0), SIMDE_BFLOAT16_VALUE(100.0));
    simde_float32x4_t r = simde_vbfmmlaq_f32(buf, a, b);

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

SIMDE_TEST_FUNC_LIST_BEGIN
SIMDE_TEST_FUNC_LIST_ENTRY(vmmlaq_s32)
SIMDE_TEST_FUNC_LIST_ENTRY(vmmlaq_u32)
SIMDE_TEST_FUNC_LIST_ENTRY(vusmmlaq_s32)

SIMDE_TEST_FUNC_LIST_ENTRY(vbfmmlaq_f32)
SIMDE_TEST_FUNC_LIST_END

#include "test-neon-footer.h"