xref: /aosp_15_r20/external/XNNPACK/test/f32-gemm-minmax-2.cc (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1 // Copyright (c) Facebook, Inc. and its affiliates.
2 // All rights reserved.
3 //
4 // Copyright 2019 Google LLC
5 //
6 // This source code is licensed under the BSD-style license found in the
7 // LICENSE file in the root directory of this source tree.
8 //
9 // Auto-generated file. Do not edit!
10 //   Specification: test/f32-gemm-minmax.yaml
11 //   Generator: tools/generate-gemm-test.py
12 
13 
14 #include <gtest/gtest.h>
15 
16 #include <xnnpack/allocator.h>
17 #include <xnnpack/common.h>
18 #include <xnnpack/isa-checks.h>
19 #include <xnnpack/microparams-init.h>
20 
21 #include <xnnpack/gemm.h>
22 #include <xnnpack/igemm.h>
23 #include <xnnpack/ppmm.h>
24 #include "gemm-microkernel-tester.h"
25 
26 
27 #if XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_eq_2)28   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_eq_2) {
29     GemmMicrokernelTester()
30       .mr(4)
31       .nr(4)
32       .kr(1)
33       .sr(1)
34       .m(4)
35       .n(4)
36       .k(2)
37       .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
38   }
39 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,strided_cn)40   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, strided_cn) {
41     GemmMicrokernelTester()
42       .mr(4)
43       .nr(4)
44       .kr(1)
45       .sr(1)
46       .m(4)
47       .n(4)
48       .k(2)
49       .cn_stride(7)
50       .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
51   }
52 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_eq_2_strided_a)53   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_eq_2_strided_a) {
54     GemmMicrokernelTester()
55       .mr(4)
56       .nr(4)
57       .kr(1)
58       .sr(1)
59       .m(4)
60       .n(4)
61       .k(2)
62       .a_stride(5)
63       .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
64   }
65 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_eq_2_subtile)66   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_eq_2_subtile) {
67     for (uint32_t n = 1; n <= 4; n++) {
68       for (uint32_t m = 1; m <= 4; m++) {
69         GemmMicrokernelTester()
70           .mr(4)
71           .nr(4)
72           .kr(1)
73           .sr(1)
74           .m(m)
75           .n(n)
76           .k(2)
77           .iterations(1)
78           .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
79       }
80     }
81   }
82 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_eq_2_subtile_m)83   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_eq_2_subtile_m) {
84     for (uint32_t m = 1; m <= 4; m++) {
85       GemmMicrokernelTester()
86         .mr(4)
87         .nr(4)
88         .kr(1)
89         .sr(1)
90         .m(m)
91         .n(4)
92         .k(2)
93         .iterations(1)
94         .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
95     }
96   }
97 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_eq_2_subtile_n)98   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_eq_2_subtile_n) {
99     for (uint32_t n = 1; n <= 4; n++) {
100       GemmMicrokernelTester()
101         .mr(4)
102         .nr(4)
103         .kr(1)
104         .sr(1)
105         .m(4)
106         .n(n)
107         .k(2)
108         .iterations(1)
109         .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
110     }
111   }
112 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_lt_2)113   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_lt_2) {
114     for (size_t k = 1; k < 2; k++) {
115       GemmMicrokernelTester()
116         .mr(4)
117         .nr(4)
118         .kr(1)
119         .sr(1)
120         .m(4)
121         .n(4)
122         .k(k)
123         .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
124     }
125   }
126 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_lt_2_strided_a)127   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_lt_2_strided_a) {
128     for (size_t k = 1; k < 2; k++) {
129       GemmMicrokernelTester()
130         .mr(4)
131         .nr(4)
132         .kr(1)
133         .sr(1)
134         .m(4)
135         .n(4)
136         .k(k)
137         .a_stride(5)
138         .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
139     }
140   }
141 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_lt_2_subtile)142   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_lt_2_subtile) {
143     for (size_t k = 1; k < 2; k++) {
144       for (uint32_t n = 1; n <= 4; n++) {
145         for (uint32_t m = 1; m <= 4; m++) {
146           GemmMicrokernelTester()
147             .mr(4)
148             .nr(4)
149             .kr(1)
150             .sr(1)
151             .m(m)
152             .n(n)
153             .k(k)
154             .iterations(1)
155             .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
156         }
157       }
158     }
159   }
160 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_gt_2)161   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_gt_2) {
162     for (size_t k = 3; k < 4; k++) {
163       GemmMicrokernelTester()
164         .mr(4)
165         .nr(4)
166         .kr(1)
167         .sr(1)
168         .m(4)
169         .n(4)
170         .k(k)
171         .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
172     }
173   }
174 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_gt_2_strided_a)175   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_gt_2_strided_a) {
176     for (size_t k = 3; k < 4; k++) {
177       GemmMicrokernelTester()
178         .mr(4)
179         .nr(4)
180         .kr(1)
181         .sr(1)
182         .m(4)
183         .n(4)
184         .k(k)
185         .a_stride(7)
186         .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
187     }
188   }
189 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_gt_2_subtile)190   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_gt_2_subtile) {
191     for (size_t k = 3; k < 4; k++) {
192       for (uint32_t n = 1; n <= 4; n++) {
193         for (uint32_t m = 1; m <= 4; m++) {
194           GemmMicrokernelTester()
195             .mr(4)
196             .nr(4)
197             .kr(1)
198             .sr(1)
199             .m(m)
200             .n(n)
201             .k(k)
202             .iterations(1)
203             .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
204         }
205       }
206     }
207   }
208 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_div_2)209   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_div_2) {
210     for (size_t k = 4; k <= 20; k += 2) {
211       GemmMicrokernelTester()
212         .mr(4)
213         .nr(4)
214         .kr(1)
215         .sr(1)
216         .m(4)
217         .n(4)
218         .k(k)
219         .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
220     }
221   }
222 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_div_2_strided_a)223   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_div_2_strided_a) {
224     for (size_t k = 4; k <= 20; k += 2) {
225       GemmMicrokernelTester()
226         .mr(4)
227         .nr(4)
228         .kr(1)
229         .sr(1)
230         .m(4)
231         .n(4)
232         .k(k)
233         .a_stride(23)
234         .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
235     }
236   }
237 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,k_div_2_subtile)238   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, k_div_2_subtile) {
239     for (size_t k = 4; k <= 20; k += 2) {
240       for (uint32_t n = 1; n <= 4; n++) {
241         for (uint32_t m = 1; m <= 4; m++) {
242           GemmMicrokernelTester()
243             .mr(4)
244             .nr(4)
245             .kr(1)
246             .sr(1)
247             .m(m)
248             .n(n)
249             .k(k)
250             .iterations(1)
251             .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
252         }
253       }
254     }
255   }
256 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,n_gt_4)257   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, n_gt_4) {
258     for (uint32_t n = 5; n < 8; n++) {
259       for (size_t k = 1; k <= 10; k += 3) {
260         GemmMicrokernelTester()
261           .mr(4)
262           .nr(4)
263           .kr(1)
264           .sr(1)
265           .m(4)
266           .n(n)
267           .k(k)
268           .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
269       }
270     }
271   }
272 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,n_gt_4_strided_cn)273   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, n_gt_4_strided_cn) {
274     for (uint32_t n = 5; n < 8; n++) {
275       for (size_t k = 1; k <= 10; k += 3) {
276         GemmMicrokernelTester()
277           .mr(4)
278           .nr(4)
279           .kr(1)
280           .sr(1)
281           .m(4)
282           .n(n)
283           .k(k)
284           .cn_stride(7)
285           .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
286       }
287     }
288   }
289 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,n_gt_4_strided_a)290   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, n_gt_4_strided_a) {
291     for (uint32_t n = 5; n < 8; n++) {
292       for (size_t k = 1; k <= 10; k += 3) {
293         GemmMicrokernelTester()
294           .mr(4)
295           .nr(4)
296           .kr(1)
297           .sr(1)
298           .m(4)
299           .n(n)
300           .k(k)
301           .a_stride(13)
302           .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
303       }
304     }
305   }
306 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,n_gt_4_subtile)307   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, n_gt_4_subtile) {
308     for (uint32_t n = 5; n < 8; n++) {
309       for (size_t k = 1; k <= 10; k += 3) {
310         for (uint32_t m = 1; m <= 4; m++) {
311           GemmMicrokernelTester()
312             .mr(4)
313             .nr(4)
314             .kr(1)
315             .sr(1)
316             .m(m)
317             .n(n)
318             .k(k)
319             .iterations(1)
320             .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
321         }
322       }
323     }
324   }
325 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,n_div_4)326   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, n_div_4) {
327     for (uint32_t n = 8; n <= 12; n += 4) {
328       for (size_t k = 1; k <= 10; k += 3) {
329         GemmMicrokernelTester()
330           .mr(4)
331           .nr(4)
332           .kr(1)
333           .sr(1)
334           .m(4)
335           .n(n)
336           .k(k)
337           .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
338       }
339     }
340   }
341 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,n_div_4_strided_cn)342   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, n_div_4_strided_cn) {
343     for (uint32_t n = 8; n <= 12; n += 4) {
344       for (size_t k = 1; k <= 10; k += 3) {
345         GemmMicrokernelTester()
346           .mr(4)
347           .nr(4)
348           .kr(1)
349           .sr(1)
350           .m(4)
351           .n(n)
352           .k(k)
353           .cn_stride(7)
354           .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
355       }
356     }
357   }
358 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,n_div_4_strided_a)359   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, n_div_4_strided_a) {
360     for (uint32_t n = 8; n <= 12; n += 4) {
361       for (size_t k = 1; k <= 10; k += 3) {
362         GemmMicrokernelTester()
363           .mr(4)
364           .nr(4)
365           .kr(1)
366           .sr(1)
367           .m(4)
368           .n(n)
369           .k(k)
370           .a_stride(13)
371           .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
372       }
373     }
374   }
375 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,n_div_4_subtile)376   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, n_div_4_subtile) {
377     for (uint32_t n = 8; n <= 12; n += 4) {
378       for (size_t k = 1; k <= 10; k += 3) {
379         for (uint32_t m = 1; m <= 4; m++) {
380           GemmMicrokernelTester()
381             .mr(4)
382             .nr(4)
383             .kr(1)
384             .sr(1)
385             .m(m)
386             .n(n)
387             .k(k)
388             .iterations(1)
389             .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
390         }
391       }
392     }
393   }
394 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,strided_cm_subtile)395   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, strided_cm_subtile) {
396     for (size_t k = 1; k <= 10; k += 3) {
397       for (uint32_t n = 1; n <= 4; n++) {
398         for (uint32_t m = 1; m <= 4; m++) {
399           GemmMicrokernelTester()
400             .mr(4)
401             .nr(4)
402             .kr(1)
403             .sr(1)
404             .m(m)
405             .n(n)
406             .k(k)
407             .cm_stride(7)
408             .iterations(1)
409             .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
410         }
411       }
412     }
413   }
414 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,qmin)415   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, qmin) {
416     GemmMicrokernelTester()
417       .mr(4)
418       .nr(4)
419       .kr(1)
420       .sr(1)
421       .m(4)
422       .n(4)
423       .k(2)
424       .qmin(128)
425       .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
426   }
427 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,qmax)428   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, qmax) {
429     GemmMicrokernelTester()
430       .mr(4)
431       .nr(4)
432       .kr(1)
433       .sr(1)
434       .m(4)
435       .n(4)
436       .k(2)
437       .qmax(128)
438       .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
439   }
440 
TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64,strided_cm)441   TEST(F32_GEMM_MINMAX_4X4__AARCH32_VFP_LD64, strided_cm) {
442     GemmMicrokernelTester()
443       .mr(4)
444       .nr(4)
445       .kr(1)
446       .sr(1)
447       .m(4)
448       .n(4)
449       .k(2)
450       .cm_stride(7)
451       .Test(xnn_f32_gemm_minmax_ukernel_4x4__aarch32_vfp_ld64, xnn_init_f32_minmax_scalar_params);
452   }
453 #endif  // XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY
454 
455 
456 #if XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_eq_2)457   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_eq_2) {
458     TEST_REQUIRES_ARM_NEON;
459     GemmMicrokernelTester()
460       .mr(4)
461       .nr(8)
462       .kr(1)
463       .sr(1)
464       .m(4)
465       .n(8)
466       .k(2)
467       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
468   }
469 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,strided_cn)470   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, strided_cn) {
471     TEST_REQUIRES_ARM_NEON;
472     GemmMicrokernelTester()
473       .mr(4)
474       .nr(8)
475       .kr(1)
476       .sr(1)
477       .m(4)
478       .n(8)
479       .k(2)
480       .cn_stride(11)
481       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
482   }
483 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_eq_2_strided_a)484   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_eq_2_strided_a) {
485     TEST_REQUIRES_ARM_NEON;
486     GemmMicrokernelTester()
487       .mr(4)
488       .nr(8)
489       .kr(1)
490       .sr(1)
491       .m(4)
492       .n(8)
493       .k(2)
494       .a_stride(5)
495       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
496   }
497 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_eq_2_subtile)498   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_eq_2_subtile) {
499     TEST_REQUIRES_ARM_NEON;
500     for (uint32_t n = 1; n <= 8; n++) {
501       for (uint32_t m = 1; m <= 4; m++) {
502         GemmMicrokernelTester()
503           .mr(4)
504           .nr(8)
505           .kr(1)
506           .sr(1)
507           .m(m)
508           .n(n)
509           .k(2)
510           .iterations(1)
511           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
512       }
513     }
514   }
515 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_eq_2_subtile_m)516   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_eq_2_subtile_m) {
517     TEST_REQUIRES_ARM_NEON;
518     for (uint32_t m = 1; m <= 4; m++) {
519       GemmMicrokernelTester()
520         .mr(4)
521         .nr(8)
522         .kr(1)
523         .sr(1)
524         .m(m)
525         .n(8)
526         .k(2)
527         .iterations(1)
528         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
529     }
530   }
531 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_eq_2_subtile_n)532   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_eq_2_subtile_n) {
533     TEST_REQUIRES_ARM_NEON;
534     for (uint32_t n = 1; n <= 8; n++) {
535       GemmMicrokernelTester()
536         .mr(4)
537         .nr(8)
538         .kr(1)
539         .sr(1)
540         .m(4)
541         .n(n)
542         .k(2)
543         .iterations(1)
544         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
545     }
546   }
547 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_lt_2)548   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_lt_2) {
549     TEST_REQUIRES_ARM_NEON;
550     for (size_t k = 1; k < 2; k++) {
551       GemmMicrokernelTester()
552         .mr(4)
553         .nr(8)
554         .kr(1)
555         .sr(1)
556         .m(4)
557         .n(8)
558         .k(k)
559         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
560     }
561   }
562 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_lt_2_strided_a)563   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_lt_2_strided_a) {
564     TEST_REQUIRES_ARM_NEON;
565     for (size_t k = 1; k < 2; k++) {
566       GemmMicrokernelTester()
567         .mr(4)
568         .nr(8)
569         .kr(1)
570         .sr(1)
571         .m(4)
572         .n(8)
573         .k(k)
574         .a_stride(5)
575         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
576     }
577   }
578 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_lt_2_subtile)579   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_lt_2_subtile) {
580     TEST_REQUIRES_ARM_NEON;
581     for (size_t k = 1; k < 2; k++) {
582       for (uint32_t n = 1; n <= 8; n++) {
583         for (uint32_t m = 1; m <= 4; m++) {
584           GemmMicrokernelTester()
585             .mr(4)
586             .nr(8)
587             .kr(1)
588             .sr(1)
589             .m(m)
590             .n(n)
591             .k(k)
592             .iterations(1)
593             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
594         }
595       }
596     }
597   }
598 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_gt_2)599   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_gt_2) {
600     TEST_REQUIRES_ARM_NEON;
601     for (size_t k = 3; k < 4; k++) {
602       GemmMicrokernelTester()
603         .mr(4)
604         .nr(8)
605         .kr(1)
606         .sr(1)
607         .m(4)
608         .n(8)
609         .k(k)
610         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
611     }
612   }
613 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_gt_2_strided_a)614   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_gt_2_strided_a) {
615     TEST_REQUIRES_ARM_NEON;
616     for (size_t k = 3; k < 4; k++) {
617       GemmMicrokernelTester()
618         .mr(4)
619         .nr(8)
620         .kr(1)
621         .sr(1)
622         .m(4)
623         .n(8)
624         .k(k)
625         .a_stride(7)
626         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
627     }
628   }
629 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_gt_2_subtile)630   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_gt_2_subtile) {
631     TEST_REQUIRES_ARM_NEON;
632     for (size_t k = 3; k < 4; k++) {
633       for (uint32_t n = 1; n <= 8; n++) {
634         for (uint32_t m = 1; m <= 4; m++) {
635           GemmMicrokernelTester()
636             .mr(4)
637             .nr(8)
638             .kr(1)
639             .sr(1)
640             .m(m)
641             .n(n)
642             .k(k)
643             .iterations(1)
644             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
645         }
646       }
647     }
648   }
649 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_div_2)650   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_div_2) {
651     TEST_REQUIRES_ARM_NEON;
652     for (size_t k = 4; k <= 20; k += 2) {
653       GemmMicrokernelTester()
654         .mr(4)
655         .nr(8)
656         .kr(1)
657         .sr(1)
658         .m(4)
659         .n(8)
660         .k(k)
661         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
662     }
663   }
664 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_div_2_strided_a)665   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_div_2_strided_a) {
666     TEST_REQUIRES_ARM_NEON;
667     for (size_t k = 4; k <= 20; k += 2) {
668       GemmMicrokernelTester()
669         .mr(4)
670         .nr(8)
671         .kr(1)
672         .sr(1)
673         .m(4)
674         .n(8)
675         .k(k)
676         .a_stride(23)
677         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
678     }
679   }
680 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,k_div_2_subtile)681   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, k_div_2_subtile) {
682     TEST_REQUIRES_ARM_NEON;
683     for (size_t k = 4; k <= 20; k += 2) {
684       for (uint32_t n = 1; n <= 8; n++) {
685         for (uint32_t m = 1; m <= 4; m++) {
686           GemmMicrokernelTester()
687             .mr(4)
688             .nr(8)
689             .kr(1)
690             .sr(1)
691             .m(m)
692             .n(n)
693             .k(k)
694             .iterations(1)
695             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
696         }
697       }
698     }
699   }
700 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,n_gt_8)701   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, n_gt_8) {
702     TEST_REQUIRES_ARM_NEON;
703     for (uint32_t n = 9; n < 16; n++) {
704       for (size_t k = 1; k <= 10; k += 3) {
705         GemmMicrokernelTester()
706           .mr(4)
707           .nr(8)
708           .kr(1)
709           .sr(1)
710           .m(4)
711           .n(n)
712           .k(k)
713           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
714       }
715     }
716   }
717 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,n_gt_8_strided_cn)718   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, n_gt_8_strided_cn) {
719     TEST_REQUIRES_ARM_NEON;
720     for (uint32_t n = 9; n < 16; n++) {
721       for (size_t k = 1; k <= 10; k += 3) {
722         GemmMicrokernelTester()
723           .mr(4)
724           .nr(8)
725           .kr(1)
726           .sr(1)
727           .m(4)
728           .n(n)
729           .k(k)
730           .cn_stride(11)
731           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
732       }
733     }
734   }
735 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,n_gt_8_strided_a)736   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, n_gt_8_strided_a) {
737     TEST_REQUIRES_ARM_NEON;
738     for (uint32_t n = 9; n < 16; n++) {
739       for (size_t k = 1; k <= 10; k += 3) {
740         GemmMicrokernelTester()
741           .mr(4)
742           .nr(8)
743           .kr(1)
744           .sr(1)
745           .m(4)
746           .n(n)
747           .k(k)
748           .a_stride(13)
749           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
750       }
751     }
752   }
753 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,n_gt_8_subtile)754   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, n_gt_8_subtile) {
755     TEST_REQUIRES_ARM_NEON;
756     for (uint32_t n = 9; n < 16; n++) {
757       for (size_t k = 1; k <= 10; k += 3) {
758         for (uint32_t m = 1; m <= 4; m++) {
759           GemmMicrokernelTester()
760             .mr(4)
761             .nr(8)
762             .kr(1)
763             .sr(1)
764             .m(m)
765             .n(n)
766             .k(k)
767             .iterations(1)
768             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
769         }
770       }
771     }
772   }
773 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,n_div_8)774   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, n_div_8) {
775     TEST_REQUIRES_ARM_NEON;
776     for (uint32_t n = 16; n <= 24; n += 8) {
777       for (size_t k = 1; k <= 10; k += 3) {
778         GemmMicrokernelTester()
779           .mr(4)
780           .nr(8)
781           .kr(1)
782           .sr(1)
783           .m(4)
784           .n(n)
785           .k(k)
786           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
787       }
788     }
789   }
790 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,n_div_8_strided_cn)791   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, n_div_8_strided_cn) {
792     TEST_REQUIRES_ARM_NEON;
793     for (uint32_t n = 16; n <= 24; n += 8) {
794       for (size_t k = 1; k <= 10; k += 3) {
795         GemmMicrokernelTester()
796           .mr(4)
797           .nr(8)
798           .kr(1)
799           .sr(1)
800           .m(4)
801           .n(n)
802           .k(k)
803           .cn_stride(11)
804           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
805       }
806     }
807   }
808 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,n_div_8_strided_a)809   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, n_div_8_strided_a) {
810     TEST_REQUIRES_ARM_NEON;
811     for (uint32_t n = 16; n <= 24; n += 8) {
812       for (size_t k = 1; k <= 10; k += 3) {
813         GemmMicrokernelTester()
814           .mr(4)
815           .nr(8)
816           .kr(1)
817           .sr(1)
818           .m(4)
819           .n(n)
820           .k(k)
821           .a_stride(13)
822           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
823       }
824     }
825   }
826 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,n_div_8_subtile)827   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, n_div_8_subtile) {
828     TEST_REQUIRES_ARM_NEON;
829     for (uint32_t n = 16; n <= 24; n += 8) {
830       for (size_t k = 1; k <= 10; k += 3) {
831         for (uint32_t m = 1; m <= 4; m++) {
832           GemmMicrokernelTester()
833             .mr(4)
834             .nr(8)
835             .kr(1)
836             .sr(1)
837             .m(m)
838             .n(n)
839             .k(k)
840             .iterations(1)
841             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
842         }
843       }
844     }
845   }
846 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,strided_cm_subtile)847   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, strided_cm_subtile) {
848     TEST_REQUIRES_ARM_NEON;
849     for (size_t k = 1; k <= 10; k += 3) {
850       for (uint32_t n = 1; n <= 8; n++) {
851         for (uint32_t m = 1; m <= 4; m++) {
852           GemmMicrokernelTester()
853             .mr(4)
854             .nr(8)
855             .kr(1)
856             .sr(1)
857             .m(m)
858             .n(n)
859             .k(k)
860             .cm_stride(11)
861             .iterations(1)
862             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
863         }
864       }
865     }
866   }
867 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,qmin)868   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, qmin) {
869     TEST_REQUIRES_ARM_NEON;
870     GemmMicrokernelTester()
871       .mr(4)
872       .nr(8)
873       .kr(1)
874       .sr(1)
875       .m(4)
876       .n(8)
877       .k(2)
878       .qmin(128)
879       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
880   }
881 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,qmax)882   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, qmax) {
883     TEST_REQUIRES_ARM_NEON;
884     GemmMicrokernelTester()
885       .mr(4)
886       .nr(8)
887       .kr(1)
888       .sr(1)
889       .m(4)
890       .n(8)
891       .k(2)
892       .qmax(128)
893       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
894   }
895 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7,strided_cm)896   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A7, strided_cm) {
897     TEST_REQUIRES_ARM_NEON;
898     GemmMicrokernelTester()
899       .mr(4)
900       .nr(8)
901       .kr(1)
902       .sr(1)
903       .m(4)
904       .n(8)
905       .k(2)
906       .cm_stride(11)
907       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a7, xnn_init_f32_minmax_scalar_params);
908   }
909 #endif  // XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY
910 
911 
912 #if XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_eq_4)913   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_eq_4) {
914     TEST_REQUIRES_ARM_NEON;
915     GemmMicrokernelTester()
916       .mr(4)
917       .nr(8)
918       .kr(1)
919       .sr(1)
920       .m(4)
921       .n(8)
922       .k(4)
923       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
924   }
925 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,strided_cn)926   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, strided_cn) {
927     TEST_REQUIRES_ARM_NEON;
928     GemmMicrokernelTester()
929       .mr(4)
930       .nr(8)
931       .kr(1)
932       .sr(1)
933       .m(4)
934       .n(8)
935       .k(4)
936       .cn_stride(11)
937       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
938   }
939 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_eq_4_strided_a)940   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_eq_4_strided_a) {
941     TEST_REQUIRES_ARM_NEON;
942     GemmMicrokernelTester()
943       .mr(4)
944       .nr(8)
945       .kr(1)
946       .sr(1)
947       .m(4)
948       .n(8)
949       .k(4)
950       .a_stride(7)
951       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
952   }
953 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_eq_4_subtile)954   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_eq_4_subtile) {
955     TEST_REQUIRES_ARM_NEON;
956     for (uint32_t n = 1; n <= 8; n++) {
957       for (uint32_t m = 1; m <= 4; m++) {
958         GemmMicrokernelTester()
959           .mr(4)
960           .nr(8)
961           .kr(1)
962           .sr(1)
963           .m(m)
964           .n(n)
965           .k(4)
966           .iterations(1)
967           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
968       }
969     }
970   }
971 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_eq_4_subtile_m)972   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_eq_4_subtile_m) {
973     TEST_REQUIRES_ARM_NEON;
974     for (uint32_t m = 1; m <= 4; m++) {
975       GemmMicrokernelTester()
976         .mr(4)
977         .nr(8)
978         .kr(1)
979         .sr(1)
980         .m(m)
981         .n(8)
982         .k(4)
983         .iterations(1)
984         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
985     }
986   }
987 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_eq_4_subtile_n)988   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_eq_4_subtile_n) {
989     TEST_REQUIRES_ARM_NEON;
990     for (uint32_t n = 1; n <= 8; n++) {
991       GemmMicrokernelTester()
992         .mr(4)
993         .nr(8)
994         .kr(1)
995         .sr(1)
996         .m(4)
997         .n(n)
998         .k(4)
999         .iterations(1)
1000         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1001     }
1002   }
1003 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_eq_8)1004   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_eq_8) {
1005     TEST_REQUIRES_ARM_NEON;
1006     GemmMicrokernelTester()
1007       .mr(4)
1008       .nr(8)
1009       .kr(1)
1010       .sr(1)
1011       .m(4)
1012       .n(8)
1013       .k(8)
1014       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1015   }
1016 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_eq_8_strided_a)1017   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_eq_8_strided_a) {
1018     TEST_REQUIRES_ARM_NEON;
1019     GemmMicrokernelTester()
1020       .mr(4)
1021       .nr(8)
1022       .kr(1)
1023       .sr(1)
1024       .m(4)
1025       .n(8)
1026       .k(8)
1027       .a_stride(11)
1028       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1029   }
1030 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_eq_8_subtile)1031   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_eq_8_subtile) {
1032     TEST_REQUIRES_ARM_NEON;
1033     for (uint32_t n = 1; n <= 8; n++) {
1034       for (uint32_t m = 1; m <= 4; m++) {
1035         GemmMicrokernelTester()
1036           .mr(4)
1037           .nr(8)
1038           .kr(1)
1039           .sr(1)
1040           .m(m)
1041           .n(n)
1042           .k(8)
1043           .iterations(1)
1044           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1045       }
1046     }
1047   }
1048 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_lt_8)1049   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_lt_8) {
1050     TEST_REQUIRES_ARM_NEON;
1051     for (size_t k = 1; k < 8; k++) {
1052       GemmMicrokernelTester()
1053         .mr(4)
1054         .nr(8)
1055         .kr(1)
1056         .sr(1)
1057         .m(4)
1058         .n(8)
1059         .k(k)
1060         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1061     }
1062   }
1063 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_lt_8_strided_a)1064   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_lt_8_strided_a) {
1065     TEST_REQUIRES_ARM_NEON;
1066     for (size_t k = 1; k < 8; k++) {
1067       GemmMicrokernelTester()
1068         .mr(4)
1069         .nr(8)
1070         .kr(1)
1071         .sr(1)
1072         .m(4)
1073         .n(8)
1074         .k(k)
1075         .a_stride(11)
1076         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1077     }
1078   }
1079 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_lt_8_subtile)1080   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_lt_8_subtile) {
1081     TEST_REQUIRES_ARM_NEON;
1082     for (size_t k = 1; k < 8; k++) {
1083       for (uint32_t n = 1; n <= 8; n++) {
1084         for (uint32_t m = 1; m <= 4; m++) {
1085           GemmMicrokernelTester()
1086             .mr(4)
1087             .nr(8)
1088             .kr(1)
1089             .sr(1)
1090             .m(m)
1091             .n(n)
1092             .k(k)
1093             .iterations(1)
1094             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1095         }
1096       }
1097     }
1098   }
1099 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_gt_8)1100   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_gt_8) {
1101     TEST_REQUIRES_ARM_NEON;
1102     for (size_t k = 9; k < 16; k++) {
1103       GemmMicrokernelTester()
1104         .mr(4)
1105         .nr(8)
1106         .kr(1)
1107         .sr(1)
1108         .m(4)
1109         .n(8)
1110         .k(k)
1111         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1112     }
1113   }
1114 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_gt_8_strided_a)1115   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_gt_8_strided_a) {
1116     TEST_REQUIRES_ARM_NEON;
1117     for (size_t k = 9; k < 16; k++) {
1118       GemmMicrokernelTester()
1119         .mr(4)
1120         .nr(8)
1121         .kr(1)
1122         .sr(1)
1123         .m(4)
1124         .n(8)
1125         .k(k)
1126         .a_stride(19)
1127         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1128     }
1129   }
1130 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_gt_8_subtile)1131   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_gt_8_subtile) {
1132     TEST_REQUIRES_ARM_NEON;
1133     for (size_t k = 9; k < 16; k++) {
1134       for (uint32_t n = 1; n <= 8; n++) {
1135         for (uint32_t m = 1; m <= 4; m++) {
1136           GemmMicrokernelTester()
1137             .mr(4)
1138             .nr(8)
1139             .kr(1)
1140             .sr(1)
1141             .m(m)
1142             .n(n)
1143             .k(k)
1144             .iterations(1)
1145             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1146         }
1147       }
1148     }
1149   }
1150 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_div_4)1151   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_div_4) {
1152     TEST_REQUIRES_ARM_NEON;
1153     for (size_t k = 12; k <= 40; k += 4) {
1154       GemmMicrokernelTester()
1155         .mr(4)
1156         .nr(8)
1157         .kr(1)
1158         .sr(1)
1159         .m(4)
1160         .n(8)
1161         .k(k)
1162         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1163     }
1164   }
1165 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_div_4_strided_a)1166   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_div_4_strided_a) {
1167     TEST_REQUIRES_ARM_NEON;
1168     for (size_t k = 12; k <= 40; k += 4) {
1169       GemmMicrokernelTester()
1170         .mr(4)
1171         .nr(8)
1172         .kr(1)
1173         .sr(1)
1174         .m(4)
1175         .n(8)
1176         .k(k)
1177         .a_stride(43)
1178         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1179     }
1180   }
1181 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,k_div_4_subtile)1182   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, k_div_4_subtile) {
1183     TEST_REQUIRES_ARM_NEON;
1184     for (size_t k = 12; k <= 40; k += 4) {
1185       for (uint32_t n = 1; n <= 8; n++) {
1186         for (uint32_t m = 1; m <= 4; m++) {
1187           GemmMicrokernelTester()
1188             .mr(4)
1189             .nr(8)
1190             .kr(1)
1191             .sr(1)
1192             .m(m)
1193             .n(n)
1194             .k(k)
1195             .iterations(1)
1196             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1197         }
1198       }
1199     }
1200   }
1201 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,n_gt_8)1202   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, n_gt_8) {
1203     TEST_REQUIRES_ARM_NEON;
1204     for (uint32_t n = 9; n < 16; n++) {
1205       for (size_t k = 1; k <= 20; k += 5) {
1206         GemmMicrokernelTester()
1207           .mr(4)
1208           .nr(8)
1209           .kr(1)
1210           .sr(1)
1211           .m(4)
1212           .n(n)
1213           .k(k)
1214           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1215       }
1216     }
1217   }
1218 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,n_gt_8_strided_cn)1219   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, n_gt_8_strided_cn) {
1220     TEST_REQUIRES_ARM_NEON;
1221     for (uint32_t n = 9; n < 16; n++) {
1222       for (size_t k = 1; k <= 20; k += 5) {
1223         GemmMicrokernelTester()
1224           .mr(4)
1225           .nr(8)
1226           .kr(1)
1227           .sr(1)
1228           .m(4)
1229           .n(n)
1230           .k(k)
1231           .cn_stride(11)
1232           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1233       }
1234     }
1235   }
1236 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,n_gt_8_strided_a)1237   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, n_gt_8_strided_a) {
1238     TEST_REQUIRES_ARM_NEON;
1239     for (uint32_t n = 9; n < 16; n++) {
1240       for (size_t k = 1; k <= 20; k += 5) {
1241         GemmMicrokernelTester()
1242           .mr(4)
1243           .nr(8)
1244           .kr(1)
1245           .sr(1)
1246           .m(4)
1247           .n(n)
1248           .k(k)
1249           .a_stride(23)
1250           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1251       }
1252     }
1253   }
1254 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,n_gt_8_subtile)1255   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, n_gt_8_subtile) {
1256     TEST_REQUIRES_ARM_NEON;
1257     for (uint32_t n = 9; n < 16; n++) {
1258       for (size_t k = 1; k <= 20; k += 5) {
1259         for (uint32_t m = 1; m <= 4; m++) {
1260           GemmMicrokernelTester()
1261             .mr(4)
1262             .nr(8)
1263             .kr(1)
1264             .sr(1)
1265             .m(m)
1266             .n(n)
1267             .k(k)
1268             .iterations(1)
1269             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1270         }
1271       }
1272     }
1273   }
1274 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,n_div_8)1275   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, n_div_8) {
1276     TEST_REQUIRES_ARM_NEON;
1277     for (uint32_t n = 16; n <= 24; n += 8) {
1278       for (size_t k = 1; k <= 20; k += 5) {
1279         GemmMicrokernelTester()
1280           .mr(4)
1281           .nr(8)
1282           .kr(1)
1283           .sr(1)
1284           .m(4)
1285           .n(n)
1286           .k(k)
1287           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1288       }
1289     }
1290   }
1291 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,n_div_8_strided_cn)1292   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, n_div_8_strided_cn) {
1293     TEST_REQUIRES_ARM_NEON;
1294     for (uint32_t n = 16; n <= 24; n += 8) {
1295       for (size_t k = 1; k <= 20; k += 5) {
1296         GemmMicrokernelTester()
1297           .mr(4)
1298           .nr(8)
1299           .kr(1)
1300           .sr(1)
1301           .m(4)
1302           .n(n)
1303           .k(k)
1304           .cn_stride(11)
1305           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1306       }
1307     }
1308   }
1309 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,n_div_8_strided_a)1310   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, n_div_8_strided_a) {
1311     TEST_REQUIRES_ARM_NEON;
1312     for (uint32_t n = 16; n <= 24; n += 8) {
1313       for (size_t k = 1; k <= 20; k += 5) {
1314         GemmMicrokernelTester()
1315           .mr(4)
1316           .nr(8)
1317           .kr(1)
1318           .sr(1)
1319           .m(4)
1320           .n(n)
1321           .k(k)
1322           .a_stride(23)
1323           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1324       }
1325     }
1326   }
1327 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,n_div_8_subtile)1328   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, n_div_8_subtile) {
1329     TEST_REQUIRES_ARM_NEON;
1330     for (uint32_t n = 16; n <= 24; n += 8) {
1331       for (size_t k = 1; k <= 20; k += 5) {
1332         for (uint32_t m = 1; m <= 4; m++) {
1333           GemmMicrokernelTester()
1334             .mr(4)
1335             .nr(8)
1336             .kr(1)
1337             .sr(1)
1338             .m(m)
1339             .n(n)
1340             .k(k)
1341             .iterations(1)
1342             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1343         }
1344       }
1345     }
1346   }
1347 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,strided_cm_subtile)1348   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, strided_cm_subtile) {
1349     TEST_REQUIRES_ARM_NEON;
1350     for (size_t k = 1; k <= 20; k += 5) {
1351       for (uint32_t n = 1; n <= 8; n++) {
1352         for (uint32_t m = 1; m <= 4; m++) {
1353           GemmMicrokernelTester()
1354             .mr(4)
1355             .nr(8)
1356             .kr(1)
1357             .sr(1)
1358             .m(m)
1359             .n(n)
1360             .k(k)
1361             .cm_stride(11)
1362             .iterations(1)
1363             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1364         }
1365       }
1366     }
1367   }
1368 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,qmin)1369   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, qmin) {
1370     TEST_REQUIRES_ARM_NEON;
1371     GemmMicrokernelTester()
1372       .mr(4)
1373       .nr(8)
1374       .kr(1)
1375       .sr(1)
1376       .m(4)
1377       .n(8)
1378       .k(4)
1379       .qmin(128)
1380       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1381   }
1382 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,qmax)1383   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, qmax) {
1384     TEST_REQUIRES_ARM_NEON;
1385     GemmMicrokernelTester()
1386       .mr(4)
1387       .nr(8)
1388       .kr(1)
1389       .sr(1)
1390       .m(4)
1391       .n(8)
1392       .k(4)
1393       .qmax(128)
1394       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1395   }
1396 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53,strided_cm)1397   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_CORTEX_A53, strided_cm) {
1398     TEST_REQUIRES_ARM_NEON;
1399     GemmMicrokernelTester()
1400       .mr(4)
1401       .nr(8)
1402       .kr(1)
1403       .sr(1)
1404       .m(4)
1405       .n(8)
1406       .k(4)
1407       .cm_stride(11)
1408       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
1409   }
1410 #endif  // XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY
1411 
1412 
1413 #if XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_eq_2)1414   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_eq_2) {
1415     TEST_REQUIRES_ARM_NEON;
1416     GemmMicrokernelTester()
1417       .mr(4)
1418       .nr(8)
1419       .kr(1)
1420       .sr(1)
1421       .m(4)
1422       .n(8)
1423       .k(2)
1424       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1425   }
1426 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,strided_cn)1427   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, strided_cn) {
1428     TEST_REQUIRES_ARM_NEON;
1429     GemmMicrokernelTester()
1430       .mr(4)
1431       .nr(8)
1432       .kr(1)
1433       .sr(1)
1434       .m(4)
1435       .n(8)
1436       .k(2)
1437       .cn_stride(11)
1438       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1439   }
1440 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_eq_2_strided_a)1441   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_eq_2_strided_a) {
1442     TEST_REQUIRES_ARM_NEON;
1443     GemmMicrokernelTester()
1444       .mr(4)
1445       .nr(8)
1446       .kr(1)
1447       .sr(1)
1448       .m(4)
1449       .n(8)
1450       .k(2)
1451       .a_stride(5)
1452       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1453   }
1454 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_eq_2_subtile)1455   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_eq_2_subtile) {
1456     TEST_REQUIRES_ARM_NEON;
1457     for (uint32_t n = 1; n <= 8; n++) {
1458       for (uint32_t m = 1; m <= 4; m++) {
1459         GemmMicrokernelTester()
1460           .mr(4)
1461           .nr(8)
1462           .kr(1)
1463           .sr(1)
1464           .m(m)
1465           .n(n)
1466           .k(2)
1467           .iterations(1)
1468           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1469       }
1470     }
1471   }
1472 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_eq_2_subtile_m)1473   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_eq_2_subtile_m) {
1474     TEST_REQUIRES_ARM_NEON;
1475     for (uint32_t m = 1; m <= 4; m++) {
1476       GemmMicrokernelTester()
1477         .mr(4)
1478         .nr(8)
1479         .kr(1)
1480         .sr(1)
1481         .m(m)
1482         .n(8)
1483         .k(2)
1484         .iterations(1)
1485         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1486     }
1487   }
1488 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_eq_2_subtile_n)1489   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_eq_2_subtile_n) {
1490     TEST_REQUIRES_ARM_NEON;
1491     for (uint32_t n = 1; n <= 8; n++) {
1492       GemmMicrokernelTester()
1493         .mr(4)
1494         .nr(8)
1495         .kr(1)
1496         .sr(1)
1497         .m(4)
1498         .n(n)
1499         .k(2)
1500         .iterations(1)
1501         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1502     }
1503   }
1504 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_lt_2)1505   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_lt_2) {
1506     TEST_REQUIRES_ARM_NEON;
1507     for (size_t k = 1; k < 2; k++) {
1508       GemmMicrokernelTester()
1509         .mr(4)
1510         .nr(8)
1511         .kr(1)
1512         .sr(1)
1513         .m(4)
1514         .n(8)
1515         .k(k)
1516         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1517     }
1518   }
1519 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_lt_2_strided_a)1520   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_lt_2_strided_a) {
1521     TEST_REQUIRES_ARM_NEON;
1522     for (size_t k = 1; k < 2; k++) {
1523       GemmMicrokernelTester()
1524         .mr(4)
1525         .nr(8)
1526         .kr(1)
1527         .sr(1)
1528         .m(4)
1529         .n(8)
1530         .k(k)
1531         .a_stride(5)
1532         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1533     }
1534   }
1535 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_lt_2_subtile)1536   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_lt_2_subtile) {
1537     TEST_REQUIRES_ARM_NEON;
1538     for (size_t k = 1; k < 2; k++) {
1539       for (uint32_t n = 1; n <= 8; n++) {
1540         for (uint32_t m = 1; m <= 4; m++) {
1541           GemmMicrokernelTester()
1542             .mr(4)
1543             .nr(8)
1544             .kr(1)
1545             .sr(1)
1546             .m(m)
1547             .n(n)
1548             .k(k)
1549             .iterations(1)
1550             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1551         }
1552       }
1553     }
1554   }
1555 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_gt_2)1556   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_gt_2) {
1557     TEST_REQUIRES_ARM_NEON;
1558     for (size_t k = 3; k < 4; k++) {
1559       GemmMicrokernelTester()
1560         .mr(4)
1561         .nr(8)
1562         .kr(1)
1563         .sr(1)
1564         .m(4)
1565         .n(8)
1566         .k(k)
1567         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1568     }
1569   }
1570 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_gt_2_strided_a)1571   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_gt_2_strided_a) {
1572     TEST_REQUIRES_ARM_NEON;
1573     for (size_t k = 3; k < 4; k++) {
1574       GemmMicrokernelTester()
1575         .mr(4)
1576         .nr(8)
1577         .kr(1)
1578         .sr(1)
1579         .m(4)
1580         .n(8)
1581         .k(k)
1582         .a_stride(7)
1583         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1584     }
1585   }
1586 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_gt_2_subtile)1587   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_gt_2_subtile) {
1588     TEST_REQUIRES_ARM_NEON;
1589     for (size_t k = 3; k < 4; k++) {
1590       for (uint32_t n = 1; n <= 8; n++) {
1591         for (uint32_t m = 1; m <= 4; m++) {
1592           GemmMicrokernelTester()
1593             .mr(4)
1594             .nr(8)
1595             .kr(1)
1596             .sr(1)
1597             .m(m)
1598             .n(n)
1599             .k(k)
1600             .iterations(1)
1601             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1602         }
1603       }
1604     }
1605   }
1606 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_div_2)1607   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_div_2) {
1608     TEST_REQUIRES_ARM_NEON;
1609     for (size_t k = 4; k <= 20; k += 2) {
1610       GemmMicrokernelTester()
1611         .mr(4)
1612         .nr(8)
1613         .kr(1)
1614         .sr(1)
1615         .m(4)
1616         .n(8)
1617         .k(k)
1618         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1619     }
1620   }
1621 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_div_2_strided_a)1622   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_div_2_strided_a) {
1623     TEST_REQUIRES_ARM_NEON;
1624     for (size_t k = 4; k <= 20; k += 2) {
1625       GemmMicrokernelTester()
1626         .mr(4)
1627         .nr(8)
1628         .kr(1)
1629         .sr(1)
1630         .m(4)
1631         .n(8)
1632         .k(k)
1633         .a_stride(23)
1634         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1635     }
1636   }
1637 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,k_div_2_subtile)1638   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, k_div_2_subtile) {
1639     TEST_REQUIRES_ARM_NEON;
1640     for (size_t k = 4; k <= 20; k += 2) {
1641       for (uint32_t n = 1; n <= 8; n++) {
1642         for (uint32_t m = 1; m <= 4; m++) {
1643           GemmMicrokernelTester()
1644             .mr(4)
1645             .nr(8)
1646             .kr(1)
1647             .sr(1)
1648             .m(m)
1649             .n(n)
1650             .k(k)
1651             .iterations(1)
1652             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1653         }
1654       }
1655     }
1656   }
1657 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,n_gt_8)1658   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, n_gt_8) {
1659     TEST_REQUIRES_ARM_NEON;
1660     for (uint32_t n = 9; n < 16; n++) {
1661       for (size_t k = 1; k <= 10; k += 3) {
1662         GemmMicrokernelTester()
1663           .mr(4)
1664           .nr(8)
1665           .kr(1)
1666           .sr(1)
1667           .m(4)
1668           .n(n)
1669           .k(k)
1670           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1671       }
1672     }
1673   }
1674 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,n_gt_8_strided_cn)1675   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, n_gt_8_strided_cn) {
1676     TEST_REQUIRES_ARM_NEON;
1677     for (uint32_t n = 9; n < 16; n++) {
1678       for (size_t k = 1; k <= 10; k += 3) {
1679         GemmMicrokernelTester()
1680           .mr(4)
1681           .nr(8)
1682           .kr(1)
1683           .sr(1)
1684           .m(4)
1685           .n(n)
1686           .k(k)
1687           .cn_stride(11)
1688           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1689       }
1690     }
1691   }
1692 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,n_gt_8_strided_a)1693   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, n_gt_8_strided_a) {
1694     TEST_REQUIRES_ARM_NEON;
1695     for (uint32_t n = 9; n < 16; n++) {
1696       for (size_t k = 1; k <= 10; k += 3) {
1697         GemmMicrokernelTester()
1698           .mr(4)
1699           .nr(8)
1700           .kr(1)
1701           .sr(1)
1702           .m(4)
1703           .n(n)
1704           .k(k)
1705           .a_stride(13)
1706           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1707       }
1708     }
1709   }
1710 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,n_gt_8_subtile)1711   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, n_gt_8_subtile) {
1712     TEST_REQUIRES_ARM_NEON;
1713     for (uint32_t n = 9; n < 16; n++) {
1714       for (size_t k = 1; k <= 10; k += 3) {
1715         for (uint32_t m = 1; m <= 4; m++) {
1716           GemmMicrokernelTester()
1717             .mr(4)
1718             .nr(8)
1719             .kr(1)
1720             .sr(1)
1721             .m(m)
1722             .n(n)
1723             .k(k)
1724             .iterations(1)
1725             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1726         }
1727       }
1728     }
1729   }
1730 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,n_div_8)1731   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, n_div_8) {
1732     TEST_REQUIRES_ARM_NEON;
1733     for (uint32_t n = 16; n <= 24; n += 8) {
1734       for (size_t k = 1; k <= 10; k += 3) {
1735         GemmMicrokernelTester()
1736           .mr(4)
1737           .nr(8)
1738           .kr(1)
1739           .sr(1)
1740           .m(4)
1741           .n(n)
1742           .k(k)
1743           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1744       }
1745     }
1746   }
1747 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,n_div_8_strided_cn)1748   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, n_div_8_strided_cn) {
1749     TEST_REQUIRES_ARM_NEON;
1750     for (uint32_t n = 16; n <= 24; n += 8) {
1751       for (size_t k = 1; k <= 10; k += 3) {
1752         GemmMicrokernelTester()
1753           .mr(4)
1754           .nr(8)
1755           .kr(1)
1756           .sr(1)
1757           .m(4)
1758           .n(n)
1759           .k(k)
1760           .cn_stride(11)
1761           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1762       }
1763     }
1764   }
1765 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,n_div_8_strided_a)1766   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, n_div_8_strided_a) {
1767     TEST_REQUIRES_ARM_NEON;
1768     for (uint32_t n = 16; n <= 24; n += 8) {
1769       for (size_t k = 1; k <= 10; k += 3) {
1770         GemmMicrokernelTester()
1771           .mr(4)
1772           .nr(8)
1773           .kr(1)
1774           .sr(1)
1775           .m(4)
1776           .n(n)
1777           .k(k)
1778           .a_stride(13)
1779           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1780       }
1781     }
1782   }
1783 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,n_div_8_subtile)1784   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, n_div_8_subtile) {
1785     TEST_REQUIRES_ARM_NEON;
1786     for (uint32_t n = 16; n <= 24; n += 8) {
1787       for (size_t k = 1; k <= 10; k += 3) {
1788         for (uint32_t m = 1; m <= 4; m++) {
1789           GemmMicrokernelTester()
1790             .mr(4)
1791             .nr(8)
1792             .kr(1)
1793             .sr(1)
1794             .m(m)
1795             .n(n)
1796             .k(k)
1797             .iterations(1)
1798             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1799         }
1800       }
1801     }
1802   }
1803 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,strided_cm_subtile)1804   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, strided_cm_subtile) {
1805     TEST_REQUIRES_ARM_NEON;
1806     for (size_t k = 1; k <= 10; k += 3) {
1807       for (uint32_t n = 1; n <= 8; n++) {
1808         for (uint32_t m = 1; m <= 4; m++) {
1809           GemmMicrokernelTester()
1810             .mr(4)
1811             .nr(8)
1812             .kr(1)
1813             .sr(1)
1814             .m(m)
1815             .n(n)
1816             .k(k)
1817             .cm_stride(11)
1818             .iterations(1)
1819             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1820         }
1821       }
1822     }
1823   }
1824 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,qmin)1825   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, qmin) {
1826     TEST_REQUIRES_ARM_NEON;
1827     GemmMicrokernelTester()
1828       .mr(4)
1829       .nr(8)
1830       .kr(1)
1831       .sr(1)
1832       .m(4)
1833       .n(8)
1834       .k(2)
1835       .qmin(128)
1836       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1837   }
1838 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,qmax)1839   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, qmax) {
1840     TEST_REQUIRES_ARM_NEON;
1841     GemmMicrokernelTester()
1842       .mr(4)
1843       .nr(8)
1844       .kr(1)
1845       .sr(1)
1846       .m(4)
1847       .n(8)
1848       .k(2)
1849       .qmax(128)
1850       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1851   }
1852 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64,strided_cm)1853   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_LD64, strided_cm) {
1854     TEST_REQUIRES_ARM_NEON;
1855     GemmMicrokernelTester()
1856       .mr(4)
1857       .nr(8)
1858       .kr(1)
1859       .sr(1)
1860       .m(4)
1861       .n(8)
1862       .k(2)
1863       .cm_stride(11)
1864       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
1865   }
1866 #endif  // XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY
1867 
1868 
1869 #if XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_eq_4)1870   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_eq_4) {
1871     TEST_REQUIRES_ARM_NEON;
1872     GemmMicrokernelTester()
1873       .mr(4)
1874       .nr(8)
1875       .kr(1)
1876       .sr(1)
1877       .m(4)
1878       .n(8)
1879       .k(4)
1880       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
1881   }
1882 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,strided_cn)1883   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, strided_cn) {
1884     TEST_REQUIRES_ARM_NEON;
1885     GemmMicrokernelTester()
1886       .mr(4)
1887       .nr(8)
1888       .kr(1)
1889       .sr(1)
1890       .m(4)
1891       .n(8)
1892       .k(4)
1893       .cn_stride(11)
1894       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
1895   }
1896 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_eq_4_strided_a)1897   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_eq_4_strided_a) {
1898     TEST_REQUIRES_ARM_NEON;
1899     GemmMicrokernelTester()
1900       .mr(4)
1901       .nr(8)
1902       .kr(1)
1903       .sr(1)
1904       .m(4)
1905       .n(8)
1906       .k(4)
1907       .a_stride(7)
1908       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
1909   }
1910 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_eq_4_subtile)1911   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_eq_4_subtile) {
1912     TEST_REQUIRES_ARM_NEON;
1913     for (uint32_t n = 1; n <= 8; n++) {
1914       for (uint32_t m = 1; m <= 4; m++) {
1915         GemmMicrokernelTester()
1916           .mr(4)
1917           .nr(8)
1918           .kr(1)
1919           .sr(1)
1920           .m(m)
1921           .n(n)
1922           .k(4)
1923           .iterations(1)
1924           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
1925       }
1926     }
1927   }
1928 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_eq_4_subtile_m)1929   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_eq_4_subtile_m) {
1930     TEST_REQUIRES_ARM_NEON;
1931     for (uint32_t m = 1; m <= 4; m++) {
1932       GemmMicrokernelTester()
1933         .mr(4)
1934         .nr(8)
1935         .kr(1)
1936         .sr(1)
1937         .m(m)
1938         .n(8)
1939         .k(4)
1940         .iterations(1)
1941         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
1942     }
1943   }
1944 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_eq_4_subtile_n)1945   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_eq_4_subtile_n) {
1946     TEST_REQUIRES_ARM_NEON;
1947     for (uint32_t n = 1; n <= 8; n++) {
1948       GemmMicrokernelTester()
1949         .mr(4)
1950         .nr(8)
1951         .kr(1)
1952         .sr(1)
1953         .m(4)
1954         .n(n)
1955         .k(4)
1956         .iterations(1)
1957         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
1958     }
1959   }
1960 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_eq_8)1961   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_eq_8) {
1962     TEST_REQUIRES_ARM_NEON;
1963     GemmMicrokernelTester()
1964       .mr(4)
1965       .nr(8)
1966       .kr(1)
1967       .sr(1)
1968       .m(4)
1969       .n(8)
1970       .k(8)
1971       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
1972   }
1973 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_eq_8_strided_a)1974   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_eq_8_strided_a) {
1975     TEST_REQUIRES_ARM_NEON;
1976     GemmMicrokernelTester()
1977       .mr(4)
1978       .nr(8)
1979       .kr(1)
1980       .sr(1)
1981       .m(4)
1982       .n(8)
1983       .k(8)
1984       .a_stride(11)
1985       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
1986   }
1987 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_eq_8_subtile)1988   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_eq_8_subtile) {
1989     TEST_REQUIRES_ARM_NEON;
1990     for (uint32_t n = 1; n <= 8; n++) {
1991       for (uint32_t m = 1; m <= 4; m++) {
1992         GemmMicrokernelTester()
1993           .mr(4)
1994           .nr(8)
1995           .kr(1)
1996           .sr(1)
1997           .m(m)
1998           .n(n)
1999           .k(8)
2000           .iterations(1)
2001           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2002       }
2003     }
2004   }
2005 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_lt_8)2006   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_lt_8) {
2007     TEST_REQUIRES_ARM_NEON;
2008     for (size_t k = 1; k < 8; k++) {
2009       GemmMicrokernelTester()
2010         .mr(4)
2011         .nr(8)
2012         .kr(1)
2013         .sr(1)
2014         .m(4)
2015         .n(8)
2016         .k(k)
2017         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2018     }
2019   }
2020 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_lt_8_strided_a)2021   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_lt_8_strided_a) {
2022     TEST_REQUIRES_ARM_NEON;
2023     for (size_t k = 1; k < 8; k++) {
2024       GemmMicrokernelTester()
2025         .mr(4)
2026         .nr(8)
2027         .kr(1)
2028         .sr(1)
2029         .m(4)
2030         .n(8)
2031         .k(k)
2032         .a_stride(11)
2033         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2034     }
2035   }
2036 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_lt_8_subtile)2037   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_lt_8_subtile) {
2038     TEST_REQUIRES_ARM_NEON;
2039     for (size_t k = 1; k < 8; k++) {
2040       for (uint32_t n = 1; n <= 8; n++) {
2041         for (uint32_t m = 1; m <= 4; m++) {
2042           GemmMicrokernelTester()
2043             .mr(4)
2044             .nr(8)
2045             .kr(1)
2046             .sr(1)
2047             .m(m)
2048             .n(n)
2049             .k(k)
2050             .iterations(1)
2051             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2052         }
2053       }
2054     }
2055   }
2056 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_gt_8)2057   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_gt_8) {
2058     TEST_REQUIRES_ARM_NEON;
2059     for (size_t k = 9; k < 16; k++) {
2060       GemmMicrokernelTester()
2061         .mr(4)
2062         .nr(8)
2063         .kr(1)
2064         .sr(1)
2065         .m(4)
2066         .n(8)
2067         .k(k)
2068         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2069     }
2070   }
2071 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_gt_8_strided_a)2072   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_gt_8_strided_a) {
2073     TEST_REQUIRES_ARM_NEON;
2074     for (size_t k = 9; k < 16; k++) {
2075       GemmMicrokernelTester()
2076         .mr(4)
2077         .nr(8)
2078         .kr(1)
2079         .sr(1)
2080         .m(4)
2081         .n(8)
2082         .k(k)
2083         .a_stride(19)
2084         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2085     }
2086   }
2087 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_gt_8_subtile)2088   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_gt_8_subtile) {
2089     TEST_REQUIRES_ARM_NEON;
2090     for (size_t k = 9; k < 16; k++) {
2091       for (uint32_t n = 1; n <= 8; n++) {
2092         for (uint32_t m = 1; m <= 4; m++) {
2093           GemmMicrokernelTester()
2094             .mr(4)
2095             .nr(8)
2096             .kr(1)
2097             .sr(1)
2098             .m(m)
2099             .n(n)
2100             .k(k)
2101             .iterations(1)
2102             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2103         }
2104       }
2105     }
2106   }
2107 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_div_4)2108   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_div_4) {
2109     TEST_REQUIRES_ARM_NEON;
2110     for (size_t k = 12; k <= 40; k += 4) {
2111       GemmMicrokernelTester()
2112         .mr(4)
2113         .nr(8)
2114         .kr(1)
2115         .sr(1)
2116         .m(4)
2117         .n(8)
2118         .k(k)
2119         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2120     }
2121   }
2122 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_div_4_strided_a)2123   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_div_4_strided_a) {
2124     TEST_REQUIRES_ARM_NEON;
2125     for (size_t k = 12; k <= 40; k += 4) {
2126       GemmMicrokernelTester()
2127         .mr(4)
2128         .nr(8)
2129         .kr(1)
2130         .sr(1)
2131         .m(4)
2132         .n(8)
2133         .k(k)
2134         .a_stride(43)
2135         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2136     }
2137   }
2138 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,k_div_4_subtile)2139   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, k_div_4_subtile) {
2140     TEST_REQUIRES_ARM_NEON;
2141     for (size_t k = 12; k <= 40; k += 4) {
2142       for (uint32_t n = 1; n <= 8; n++) {
2143         for (uint32_t m = 1; m <= 4; m++) {
2144           GemmMicrokernelTester()
2145             .mr(4)
2146             .nr(8)
2147             .kr(1)
2148             .sr(1)
2149             .m(m)
2150             .n(n)
2151             .k(k)
2152             .iterations(1)
2153             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2154         }
2155       }
2156     }
2157   }
2158 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,n_gt_8)2159   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, n_gt_8) {
2160     TEST_REQUIRES_ARM_NEON;
2161     for (uint32_t n = 9; n < 16; n++) {
2162       for (size_t k = 1; k <= 20; k += 5) {
2163         GemmMicrokernelTester()
2164           .mr(4)
2165           .nr(8)
2166           .kr(1)
2167           .sr(1)
2168           .m(4)
2169           .n(n)
2170           .k(k)
2171           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2172       }
2173     }
2174   }
2175 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,n_gt_8_strided_cn)2176   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, n_gt_8_strided_cn) {
2177     TEST_REQUIRES_ARM_NEON;
2178     for (uint32_t n = 9; n < 16; n++) {
2179       for (size_t k = 1; k <= 20; k += 5) {
2180         GemmMicrokernelTester()
2181           .mr(4)
2182           .nr(8)
2183           .kr(1)
2184           .sr(1)
2185           .m(4)
2186           .n(n)
2187           .k(k)
2188           .cn_stride(11)
2189           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2190       }
2191     }
2192   }
2193 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,n_gt_8_strided_a)2194   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, n_gt_8_strided_a) {
2195     TEST_REQUIRES_ARM_NEON;
2196     for (uint32_t n = 9; n < 16; n++) {
2197       for (size_t k = 1; k <= 20; k += 5) {
2198         GemmMicrokernelTester()
2199           .mr(4)
2200           .nr(8)
2201           .kr(1)
2202           .sr(1)
2203           .m(4)
2204           .n(n)
2205           .k(k)
2206           .a_stride(23)
2207           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2208       }
2209     }
2210   }
2211 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,n_gt_8_subtile)2212   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, n_gt_8_subtile) {
2213     TEST_REQUIRES_ARM_NEON;
2214     for (uint32_t n = 9; n < 16; n++) {
2215       for (size_t k = 1; k <= 20; k += 5) {
2216         for (uint32_t m = 1; m <= 4; m++) {
2217           GemmMicrokernelTester()
2218             .mr(4)
2219             .nr(8)
2220             .kr(1)
2221             .sr(1)
2222             .m(m)
2223             .n(n)
2224             .k(k)
2225             .iterations(1)
2226             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2227         }
2228       }
2229     }
2230   }
2231 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,n_div_8)2232   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, n_div_8) {
2233     TEST_REQUIRES_ARM_NEON;
2234     for (uint32_t n = 16; n <= 24; n += 8) {
2235       for (size_t k = 1; k <= 20; k += 5) {
2236         GemmMicrokernelTester()
2237           .mr(4)
2238           .nr(8)
2239           .kr(1)
2240           .sr(1)
2241           .m(4)
2242           .n(n)
2243           .k(k)
2244           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2245       }
2246     }
2247   }
2248 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,n_div_8_strided_cn)2249   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, n_div_8_strided_cn) {
2250     TEST_REQUIRES_ARM_NEON;
2251     for (uint32_t n = 16; n <= 24; n += 8) {
2252       for (size_t k = 1; k <= 20; k += 5) {
2253         GemmMicrokernelTester()
2254           .mr(4)
2255           .nr(8)
2256           .kr(1)
2257           .sr(1)
2258           .m(4)
2259           .n(n)
2260           .k(k)
2261           .cn_stride(11)
2262           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2263       }
2264     }
2265   }
2266 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,n_div_8_strided_a)2267   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, n_div_8_strided_a) {
2268     TEST_REQUIRES_ARM_NEON;
2269     for (uint32_t n = 16; n <= 24; n += 8) {
2270       for (size_t k = 1; k <= 20; k += 5) {
2271         GemmMicrokernelTester()
2272           .mr(4)
2273           .nr(8)
2274           .kr(1)
2275           .sr(1)
2276           .m(4)
2277           .n(n)
2278           .k(k)
2279           .a_stride(23)
2280           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2281       }
2282     }
2283   }
2284 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,n_div_8_subtile)2285   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, n_div_8_subtile) {
2286     TEST_REQUIRES_ARM_NEON;
2287     for (uint32_t n = 16; n <= 24; n += 8) {
2288       for (size_t k = 1; k <= 20; k += 5) {
2289         for (uint32_t m = 1; m <= 4; m++) {
2290           GemmMicrokernelTester()
2291             .mr(4)
2292             .nr(8)
2293             .kr(1)
2294             .sr(1)
2295             .m(m)
2296             .n(n)
2297             .k(k)
2298             .iterations(1)
2299             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2300         }
2301       }
2302     }
2303   }
2304 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,strided_cm_subtile)2305   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, strided_cm_subtile) {
2306     TEST_REQUIRES_ARM_NEON;
2307     for (size_t k = 1; k <= 20; k += 5) {
2308       for (uint32_t n = 1; n <= 8; n++) {
2309         for (uint32_t m = 1; m <= 4; m++) {
2310           GemmMicrokernelTester()
2311             .mr(4)
2312             .nr(8)
2313             .kr(1)
2314             .sr(1)
2315             .m(m)
2316             .n(n)
2317             .k(k)
2318             .cm_stride(11)
2319             .iterations(1)
2320             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2321         }
2322       }
2323     }
2324   }
2325 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,qmin)2326   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, qmin) {
2327     TEST_REQUIRES_ARM_NEON;
2328     GemmMicrokernelTester()
2329       .mr(4)
2330       .nr(8)
2331       .kr(1)
2332       .sr(1)
2333       .m(4)
2334       .n(8)
2335       .k(4)
2336       .qmin(128)
2337       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2338   }
2339 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,qmax)2340   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, qmax) {
2341     TEST_REQUIRES_ARM_NEON;
2342     GemmMicrokernelTester()
2343       .mr(4)
2344       .nr(8)
2345       .kr(1)
2346       .sr(1)
2347       .m(4)
2348       .n(8)
2349       .k(4)
2350       .qmax(128)
2351       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2352   }
2353 
TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75,strided_cm)2354   TEST(F32_GEMM_MINMAX_4X8__AARCH32_NEON_PRFM_CORTEX_A75, strided_cm) {
2355     TEST_REQUIRES_ARM_NEON;
2356     GemmMicrokernelTester()
2357       .mr(4)
2358       .nr(8)
2359       .kr(1)
2360       .sr(1)
2361       .m(4)
2362       .n(8)
2363       .k(4)
2364       .cm_stride(11)
2365       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch32_neon_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2366   }
2367 #endif  // XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY
2368 
2369 
2370 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8)2371   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8) {
2372     TEST_REQUIRES_ARM_NEON_FMA;
2373     GemmMicrokernelTester()
2374       .mr(1)
2375       .nr(8)
2376       .kr(1)
2377       .sr(1)
2378       .m(1)
2379       .n(8)
2380       .k(8)
2381       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2382   }
2383 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,strided_cn)2384   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, strided_cn) {
2385     TEST_REQUIRES_ARM_NEON_FMA;
2386     GemmMicrokernelTester()
2387       .mr(1)
2388       .nr(8)
2389       .kr(1)
2390       .sr(1)
2391       .m(1)
2392       .n(8)
2393       .k(8)
2394       .cn_stride(11)
2395       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2396   }
2397 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_strided_a)2398   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_strided_a) {
2399     TEST_REQUIRES_ARM_NEON_FMA;
2400     GemmMicrokernelTester()
2401       .mr(1)
2402       .nr(8)
2403       .kr(1)
2404       .sr(1)
2405       .m(1)
2406       .n(8)
2407       .k(8)
2408       .a_stride(11)
2409       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2410   }
2411 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile)2412   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile) {
2413     TEST_REQUIRES_ARM_NEON_FMA;
2414     for (uint32_t n = 1; n <= 8; n++) {
2415       for (uint32_t m = 1; m <= 1; m++) {
2416         GemmMicrokernelTester()
2417           .mr(1)
2418           .nr(8)
2419           .kr(1)
2420           .sr(1)
2421           .m(m)
2422           .n(n)
2423           .k(8)
2424           .iterations(1)
2425           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2426       }
2427     }
2428   }
2429 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile_m)2430   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile_m) {
2431     TEST_REQUIRES_ARM_NEON_FMA;
2432     for (uint32_t m = 1; m <= 1; m++) {
2433       GemmMicrokernelTester()
2434         .mr(1)
2435         .nr(8)
2436         .kr(1)
2437         .sr(1)
2438         .m(m)
2439         .n(8)
2440         .k(8)
2441         .iterations(1)
2442         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2443     }
2444   }
2445 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile_n)2446   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile_n) {
2447     TEST_REQUIRES_ARM_NEON_FMA;
2448     for (uint32_t n = 1; n <= 8; n++) {
2449       GemmMicrokernelTester()
2450         .mr(1)
2451         .nr(8)
2452         .kr(1)
2453         .sr(1)
2454         .m(1)
2455         .n(n)
2456         .k(8)
2457         .iterations(1)
2458         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2459     }
2460   }
2461 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16)2462   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16) {
2463     TEST_REQUIRES_ARM_NEON_FMA;
2464     GemmMicrokernelTester()
2465       .mr(1)
2466       .nr(8)
2467       .kr(1)
2468       .sr(1)
2469       .m(1)
2470       .n(8)
2471       .k(16)
2472       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2473   }
2474 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16_strided_a)2475   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16_strided_a) {
2476     TEST_REQUIRES_ARM_NEON_FMA;
2477     GemmMicrokernelTester()
2478       .mr(1)
2479       .nr(8)
2480       .kr(1)
2481       .sr(1)
2482       .m(1)
2483       .n(8)
2484       .k(16)
2485       .a_stride(19)
2486       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2487   }
2488 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16_subtile)2489   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16_subtile) {
2490     TEST_REQUIRES_ARM_NEON_FMA;
2491     for (uint32_t n = 1; n <= 8; n++) {
2492       for (uint32_t m = 1; m <= 1; m++) {
2493         GemmMicrokernelTester()
2494           .mr(1)
2495           .nr(8)
2496           .kr(1)
2497           .sr(1)
2498           .m(m)
2499           .n(n)
2500           .k(16)
2501           .iterations(1)
2502           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2503       }
2504     }
2505   }
2506 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16)2507   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16) {
2508     TEST_REQUIRES_ARM_NEON_FMA;
2509     for (size_t k = 1; k < 16; k++) {
2510       GemmMicrokernelTester()
2511         .mr(1)
2512         .nr(8)
2513         .kr(1)
2514         .sr(1)
2515         .m(1)
2516         .n(8)
2517         .k(k)
2518         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2519     }
2520   }
2521 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16_strided_a)2522   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16_strided_a) {
2523     TEST_REQUIRES_ARM_NEON_FMA;
2524     for (size_t k = 1; k < 16; k++) {
2525       GemmMicrokernelTester()
2526         .mr(1)
2527         .nr(8)
2528         .kr(1)
2529         .sr(1)
2530         .m(1)
2531         .n(8)
2532         .k(k)
2533         .a_stride(19)
2534         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2535     }
2536   }
2537 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16_subtile)2538   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16_subtile) {
2539     TEST_REQUIRES_ARM_NEON_FMA;
2540     for (size_t k = 1; k < 16; k++) {
2541       for (uint32_t n = 1; n <= 8; n++) {
2542         for (uint32_t m = 1; m <= 1; m++) {
2543           GemmMicrokernelTester()
2544             .mr(1)
2545             .nr(8)
2546             .kr(1)
2547             .sr(1)
2548             .m(m)
2549             .n(n)
2550             .k(k)
2551             .iterations(1)
2552             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2553         }
2554       }
2555     }
2556   }
2557 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16)2558   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16) {
2559     TEST_REQUIRES_ARM_NEON_FMA;
2560     for (size_t k = 17; k < 32; k++) {
2561       GemmMicrokernelTester()
2562         .mr(1)
2563         .nr(8)
2564         .kr(1)
2565         .sr(1)
2566         .m(1)
2567         .n(8)
2568         .k(k)
2569         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2570     }
2571   }
2572 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16_strided_a)2573   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16_strided_a) {
2574     TEST_REQUIRES_ARM_NEON_FMA;
2575     for (size_t k = 17; k < 32; k++) {
2576       GemmMicrokernelTester()
2577         .mr(1)
2578         .nr(8)
2579         .kr(1)
2580         .sr(1)
2581         .m(1)
2582         .n(8)
2583         .k(k)
2584         .a_stride(37)
2585         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2586     }
2587   }
2588 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16_subtile)2589   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16_subtile) {
2590     TEST_REQUIRES_ARM_NEON_FMA;
2591     for (size_t k = 17; k < 32; k++) {
2592       for (uint32_t n = 1; n <= 8; n++) {
2593         for (uint32_t m = 1; m <= 1; m++) {
2594           GemmMicrokernelTester()
2595             .mr(1)
2596             .nr(8)
2597             .kr(1)
2598             .sr(1)
2599             .m(m)
2600             .n(n)
2601             .k(k)
2602             .iterations(1)
2603             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2604         }
2605       }
2606     }
2607   }
2608 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8)2609   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8) {
2610     TEST_REQUIRES_ARM_NEON_FMA;
2611     for (size_t k = 24; k <= 80; k += 8) {
2612       GemmMicrokernelTester()
2613         .mr(1)
2614         .nr(8)
2615         .kr(1)
2616         .sr(1)
2617         .m(1)
2618         .n(8)
2619         .k(k)
2620         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2621     }
2622   }
2623 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8_strided_a)2624   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8_strided_a) {
2625     TEST_REQUIRES_ARM_NEON_FMA;
2626     for (size_t k = 24; k <= 80; k += 8) {
2627       GemmMicrokernelTester()
2628         .mr(1)
2629         .nr(8)
2630         .kr(1)
2631         .sr(1)
2632         .m(1)
2633         .n(8)
2634         .k(k)
2635         .a_stride(83)
2636         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2637     }
2638   }
2639 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8_subtile)2640   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8_subtile) {
2641     TEST_REQUIRES_ARM_NEON_FMA;
2642     for (size_t k = 24; k <= 80; k += 8) {
2643       for (uint32_t n = 1; n <= 8; n++) {
2644         for (uint32_t m = 1; m <= 1; m++) {
2645           GemmMicrokernelTester()
2646             .mr(1)
2647             .nr(8)
2648             .kr(1)
2649             .sr(1)
2650             .m(m)
2651             .n(n)
2652             .k(k)
2653             .iterations(1)
2654             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2655         }
2656       }
2657     }
2658   }
2659 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8)2660   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8) {
2661     TEST_REQUIRES_ARM_NEON_FMA;
2662     for (uint32_t n = 9; n < 16; n++) {
2663       for (size_t k = 1; k <= 40; k += 9) {
2664         GemmMicrokernelTester()
2665           .mr(1)
2666           .nr(8)
2667           .kr(1)
2668           .sr(1)
2669           .m(1)
2670           .n(n)
2671           .k(k)
2672           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2673       }
2674     }
2675   }
2676 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_strided_cn)2677   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_strided_cn) {
2678     TEST_REQUIRES_ARM_NEON_FMA;
2679     for (uint32_t n = 9; n < 16; n++) {
2680       for (size_t k = 1; k <= 40; k += 9) {
2681         GemmMicrokernelTester()
2682           .mr(1)
2683           .nr(8)
2684           .kr(1)
2685           .sr(1)
2686           .m(1)
2687           .n(n)
2688           .k(k)
2689           .cn_stride(11)
2690           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2691       }
2692     }
2693   }
2694 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_strided_a)2695   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_strided_a) {
2696     TEST_REQUIRES_ARM_NEON_FMA;
2697     for (uint32_t n = 9; n < 16; n++) {
2698       for (size_t k = 1; k <= 40; k += 9) {
2699         GemmMicrokernelTester()
2700           .mr(1)
2701           .nr(8)
2702           .kr(1)
2703           .sr(1)
2704           .m(1)
2705           .n(n)
2706           .k(k)
2707           .a_stride(43)
2708           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2709       }
2710     }
2711   }
2712 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_subtile)2713   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_subtile) {
2714     TEST_REQUIRES_ARM_NEON_FMA;
2715     for (uint32_t n = 9; n < 16; n++) {
2716       for (size_t k = 1; k <= 40; k += 9) {
2717         for (uint32_t m = 1; m <= 1; m++) {
2718           GemmMicrokernelTester()
2719             .mr(1)
2720             .nr(8)
2721             .kr(1)
2722             .sr(1)
2723             .m(m)
2724             .n(n)
2725             .k(k)
2726             .iterations(1)
2727             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2728         }
2729       }
2730     }
2731   }
2732 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8)2733   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8) {
2734     TEST_REQUIRES_ARM_NEON_FMA;
2735     for (uint32_t n = 16; n <= 24; n += 8) {
2736       for (size_t k = 1; k <= 40; k += 9) {
2737         GemmMicrokernelTester()
2738           .mr(1)
2739           .nr(8)
2740           .kr(1)
2741           .sr(1)
2742           .m(1)
2743           .n(n)
2744           .k(k)
2745           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2746       }
2747     }
2748   }
2749 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_strided_cn)2750   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_strided_cn) {
2751     TEST_REQUIRES_ARM_NEON_FMA;
2752     for (uint32_t n = 16; n <= 24; n += 8) {
2753       for (size_t k = 1; k <= 40; k += 9) {
2754         GemmMicrokernelTester()
2755           .mr(1)
2756           .nr(8)
2757           .kr(1)
2758           .sr(1)
2759           .m(1)
2760           .n(n)
2761           .k(k)
2762           .cn_stride(11)
2763           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2764       }
2765     }
2766   }
2767 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_strided_a)2768   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_strided_a) {
2769     TEST_REQUIRES_ARM_NEON_FMA;
2770     for (uint32_t n = 16; n <= 24; n += 8) {
2771       for (size_t k = 1; k <= 40; k += 9) {
2772         GemmMicrokernelTester()
2773           .mr(1)
2774           .nr(8)
2775           .kr(1)
2776           .sr(1)
2777           .m(1)
2778           .n(n)
2779           .k(k)
2780           .a_stride(43)
2781           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2782       }
2783     }
2784   }
2785 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_subtile)2786   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_subtile) {
2787     TEST_REQUIRES_ARM_NEON_FMA;
2788     for (uint32_t n = 16; n <= 24; n += 8) {
2789       for (size_t k = 1; k <= 40; k += 9) {
2790         for (uint32_t m = 1; m <= 1; m++) {
2791           GemmMicrokernelTester()
2792             .mr(1)
2793             .nr(8)
2794             .kr(1)
2795             .sr(1)
2796             .m(m)
2797             .n(n)
2798             .k(k)
2799             .iterations(1)
2800             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2801         }
2802       }
2803     }
2804   }
2805 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,strided_cm_subtile)2806   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, strided_cm_subtile) {
2807     TEST_REQUIRES_ARM_NEON_FMA;
2808     for (size_t k = 1; k <= 40; k += 9) {
2809       for (uint32_t n = 1; n <= 8; n++) {
2810         for (uint32_t m = 1; m <= 1; m++) {
2811           GemmMicrokernelTester()
2812             .mr(1)
2813             .nr(8)
2814             .kr(1)
2815             .sr(1)
2816             .m(m)
2817             .n(n)
2818             .k(k)
2819             .cm_stride(11)
2820             .iterations(1)
2821             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2822         }
2823       }
2824     }
2825   }
2826 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,qmin)2827   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, qmin) {
2828     TEST_REQUIRES_ARM_NEON_FMA;
2829     GemmMicrokernelTester()
2830       .mr(1)
2831       .nr(8)
2832       .kr(1)
2833       .sr(1)
2834       .m(1)
2835       .n(8)
2836       .k(8)
2837       .qmin(128)
2838       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2839   }
2840 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,qmax)2841   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, qmax) {
2842     TEST_REQUIRES_ARM_NEON_FMA;
2843     GemmMicrokernelTester()
2844       .mr(1)
2845       .nr(8)
2846       .kr(1)
2847       .sr(1)
2848       .m(1)
2849       .n(8)
2850       .k(8)
2851       .qmax(128)
2852       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2853   }
2854 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75,strided_cm)2855   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_CORTEX_A75, strided_cm) {
2856     TEST_REQUIRES_ARM_NEON_FMA;
2857     GemmMicrokernelTester()
2858       .mr(1)
2859       .nr(8)
2860       .kr(1)
2861       .sr(1)
2862       .m(1)
2863       .n(8)
2864       .k(8)
2865       .cm_stride(11)
2866       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
2867   }
2868 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
2869 
2870 
2871 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_8)2872   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_8) {
2873     TEST_REQUIRES_ARM_NEON_FMA;
2874     GemmMicrokernelTester()
2875       .mr(1)
2876       .nr(8)
2877       .kr(1)
2878       .sr(1)
2879       .m(1)
2880       .n(8)
2881       .k(8)
2882       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2883   }
2884 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,strided_cn)2885   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, strided_cn) {
2886     TEST_REQUIRES_ARM_NEON_FMA;
2887     GemmMicrokernelTester()
2888       .mr(1)
2889       .nr(8)
2890       .kr(1)
2891       .sr(1)
2892       .m(1)
2893       .n(8)
2894       .k(8)
2895       .cn_stride(11)
2896       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2897   }
2898 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_8_strided_a)2899   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_8_strided_a) {
2900     TEST_REQUIRES_ARM_NEON_FMA;
2901     GemmMicrokernelTester()
2902       .mr(1)
2903       .nr(8)
2904       .kr(1)
2905       .sr(1)
2906       .m(1)
2907       .n(8)
2908       .k(8)
2909       .a_stride(11)
2910       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2911   }
2912 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_8_subtile)2913   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_8_subtile) {
2914     TEST_REQUIRES_ARM_NEON_FMA;
2915     for (uint32_t n = 1; n <= 8; n++) {
2916       for (uint32_t m = 1; m <= 1; m++) {
2917         GemmMicrokernelTester()
2918           .mr(1)
2919           .nr(8)
2920           .kr(1)
2921           .sr(1)
2922           .m(m)
2923           .n(n)
2924           .k(8)
2925           .iterations(1)
2926           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2927       }
2928     }
2929   }
2930 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_8_subtile_m)2931   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_8_subtile_m) {
2932     TEST_REQUIRES_ARM_NEON_FMA;
2933     for (uint32_t m = 1; m <= 1; m++) {
2934       GemmMicrokernelTester()
2935         .mr(1)
2936         .nr(8)
2937         .kr(1)
2938         .sr(1)
2939         .m(m)
2940         .n(8)
2941         .k(8)
2942         .iterations(1)
2943         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2944     }
2945   }
2946 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_8_subtile_n)2947   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_8_subtile_n) {
2948     TEST_REQUIRES_ARM_NEON_FMA;
2949     for (uint32_t n = 1; n <= 8; n++) {
2950       GemmMicrokernelTester()
2951         .mr(1)
2952         .nr(8)
2953         .kr(1)
2954         .sr(1)
2955         .m(1)
2956         .n(n)
2957         .k(8)
2958         .iterations(1)
2959         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2960     }
2961   }
2962 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_16)2963   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_16) {
2964     TEST_REQUIRES_ARM_NEON_FMA;
2965     GemmMicrokernelTester()
2966       .mr(1)
2967       .nr(8)
2968       .kr(1)
2969       .sr(1)
2970       .m(1)
2971       .n(8)
2972       .k(16)
2973       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2974   }
2975 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_16_strided_a)2976   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_16_strided_a) {
2977     TEST_REQUIRES_ARM_NEON_FMA;
2978     GemmMicrokernelTester()
2979       .mr(1)
2980       .nr(8)
2981       .kr(1)
2982       .sr(1)
2983       .m(1)
2984       .n(8)
2985       .k(16)
2986       .a_stride(19)
2987       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
2988   }
2989 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_16_subtile)2990   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_16_subtile) {
2991     TEST_REQUIRES_ARM_NEON_FMA;
2992     for (uint32_t n = 1; n <= 8; n++) {
2993       for (uint32_t m = 1; m <= 1; m++) {
2994         GemmMicrokernelTester()
2995           .mr(1)
2996           .nr(8)
2997           .kr(1)
2998           .sr(1)
2999           .m(m)
3000           .n(n)
3001           .k(16)
3002           .iterations(1)
3003           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3004       }
3005     }
3006   }
3007 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_lt_16)3008   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_lt_16) {
3009     TEST_REQUIRES_ARM_NEON_FMA;
3010     for (size_t k = 1; k < 16; k++) {
3011       GemmMicrokernelTester()
3012         .mr(1)
3013         .nr(8)
3014         .kr(1)
3015         .sr(1)
3016         .m(1)
3017         .n(8)
3018         .k(k)
3019         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3020     }
3021   }
3022 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_lt_16_strided_a)3023   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_lt_16_strided_a) {
3024     TEST_REQUIRES_ARM_NEON_FMA;
3025     for (size_t k = 1; k < 16; k++) {
3026       GemmMicrokernelTester()
3027         .mr(1)
3028         .nr(8)
3029         .kr(1)
3030         .sr(1)
3031         .m(1)
3032         .n(8)
3033         .k(k)
3034         .a_stride(19)
3035         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3036     }
3037   }
3038 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_lt_16_subtile)3039   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_lt_16_subtile) {
3040     TEST_REQUIRES_ARM_NEON_FMA;
3041     for (size_t k = 1; k < 16; k++) {
3042       for (uint32_t n = 1; n <= 8; n++) {
3043         for (uint32_t m = 1; m <= 1; m++) {
3044           GemmMicrokernelTester()
3045             .mr(1)
3046             .nr(8)
3047             .kr(1)
3048             .sr(1)
3049             .m(m)
3050             .n(n)
3051             .k(k)
3052             .iterations(1)
3053             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3054         }
3055       }
3056     }
3057   }
3058 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_gt_16)3059   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_gt_16) {
3060     TEST_REQUIRES_ARM_NEON_FMA;
3061     for (size_t k = 17; k < 32; k++) {
3062       GemmMicrokernelTester()
3063         .mr(1)
3064         .nr(8)
3065         .kr(1)
3066         .sr(1)
3067         .m(1)
3068         .n(8)
3069         .k(k)
3070         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3071     }
3072   }
3073 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_gt_16_strided_a)3074   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_gt_16_strided_a) {
3075     TEST_REQUIRES_ARM_NEON_FMA;
3076     for (size_t k = 17; k < 32; k++) {
3077       GemmMicrokernelTester()
3078         .mr(1)
3079         .nr(8)
3080         .kr(1)
3081         .sr(1)
3082         .m(1)
3083         .n(8)
3084         .k(k)
3085         .a_stride(37)
3086         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3087     }
3088   }
3089 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_gt_16_subtile)3090   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_gt_16_subtile) {
3091     TEST_REQUIRES_ARM_NEON_FMA;
3092     for (size_t k = 17; k < 32; k++) {
3093       for (uint32_t n = 1; n <= 8; n++) {
3094         for (uint32_t m = 1; m <= 1; m++) {
3095           GemmMicrokernelTester()
3096             .mr(1)
3097             .nr(8)
3098             .kr(1)
3099             .sr(1)
3100             .m(m)
3101             .n(n)
3102             .k(k)
3103             .iterations(1)
3104             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3105         }
3106       }
3107     }
3108   }
3109 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_div_8)3110   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_div_8) {
3111     TEST_REQUIRES_ARM_NEON_FMA;
3112     for (size_t k = 24; k <= 80; k += 8) {
3113       GemmMicrokernelTester()
3114         .mr(1)
3115         .nr(8)
3116         .kr(1)
3117         .sr(1)
3118         .m(1)
3119         .n(8)
3120         .k(k)
3121         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3122     }
3123   }
3124 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_div_8_strided_a)3125   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_div_8_strided_a) {
3126     TEST_REQUIRES_ARM_NEON_FMA;
3127     for (size_t k = 24; k <= 80; k += 8) {
3128       GemmMicrokernelTester()
3129         .mr(1)
3130         .nr(8)
3131         .kr(1)
3132         .sr(1)
3133         .m(1)
3134         .n(8)
3135         .k(k)
3136         .a_stride(83)
3137         .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3138     }
3139   }
3140 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_div_8_subtile)3141   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_div_8_subtile) {
3142     TEST_REQUIRES_ARM_NEON_FMA;
3143     for (size_t k = 24; k <= 80; k += 8) {
3144       for (uint32_t n = 1; n <= 8; n++) {
3145         for (uint32_t m = 1; m <= 1; m++) {
3146           GemmMicrokernelTester()
3147             .mr(1)
3148             .nr(8)
3149             .kr(1)
3150             .sr(1)
3151             .m(m)
3152             .n(n)
3153             .k(k)
3154             .iterations(1)
3155             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3156         }
3157       }
3158     }
3159   }
3160 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_gt_8)3161   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_gt_8) {
3162     TEST_REQUIRES_ARM_NEON_FMA;
3163     for (uint32_t n = 9; n < 16; n++) {
3164       for (size_t k = 1; k <= 40; k += 9) {
3165         GemmMicrokernelTester()
3166           .mr(1)
3167           .nr(8)
3168           .kr(1)
3169           .sr(1)
3170           .m(1)
3171           .n(n)
3172           .k(k)
3173           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3174       }
3175     }
3176   }
3177 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_gt_8_strided_cn)3178   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_gt_8_strided_cn) {
3179     TEST_REQUIRES_ARM_NEON_FMA;
3180     for (uint32_t n = 9; n < 16; n++) {
3181       for (size_t k = 1; k <= 40; k += 9) {
3182         GemmMicrokernelTester()
3183           .mr(1)
3184           .nr(8)
3185           .kr(1)
3186           .sr(1)
3187           .m(1)
3188           .n(n)
3189           .k(k)
3190           .cn_stride(11)
3191           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3192       }
3193     }
3194   }
3195 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_gt_8_strided_a)3196   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_gt_8_strided_a) {
3197     TEST_REQUIRES_ARM_NEON_FMA;
3198     for (uint32_t n = 9; n < 16; n++) {
3199       for (size_t k = 1; k <= 40; k += 9) {
3200         GemmMicrokernelTester()
3201           .mr(1)
3202           .nr(8)
3203           .kr(1)
3204           .sr(1)
3205           .m(1)
3206           .n(n)
3207           .k(k)
3208           .a_stride(43)
3209           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3210       }
3211     }
3212   }
3213 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_gt_8_subtile)3214   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_gt_8_subtile) {
3215     TEST_REQUIRES_ARM_NEON_FMA;
3216     for (uint32_t n = 9; n < 16; n++) {
3217       for (size_t k = 1; k <= 40; k += 9) {
3218         for (uint32_t m = 1; m <= 1; m++) {
3219           GemmMicrokernelTester()
3220             .mr(1)
3221             .nr(8)
3222             .kr(1)
3223             .sr(1)
3224             .m(m)
3225             .n(n)
3226             .k(k)
3227             .iterations(1)
3228             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3229         }
3230       }
3231     }
3232   }
3233 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_div_8)3234   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_div_8) {
3235     TEST_REQUIRES_ARM_NEON_FMA;
3236     for (uint32_t n = 16; n <= 24; n += 8) {
3237       for (size_t k = 1; k <= 40; k += 9) {
3238         GemmMicrokernelTester()
3239           .mr(1)
3240           .nr(8)
3241           .kr(1)
3242           .sr(1)
3243           .m(1)
3244           .n(n)
3245           .k(k)
3246           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3247       }
3248     }
3249   }
3250 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_div_8_strided_cn)3251   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_div_8_strided_cn) {
3252     TEST_REQUIRES_ARM_NEON_FMA;
3253     for (uint32_t n = 16; n <= 24; n += 8) {
3254       for (size_t k = 1; k <= 40; k += 9) {
3255         GemmMicrokernelTester()
3256           .mr(1)
3257           .nr(8)
3258           .kr(1)
3259           .sr(1)
3260           .m(1)
3261           .n(n)
3262           .k(k)
3263           .cn_stride(11)
3264           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3265       }
3266     }
3267   }
3268 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_div_8_strided_a)3269   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_div_8_strided_a) {
3270     TEST_REQUIRES_ARM_NEON_FMA;
3271     for (uint32_t n = 16; n <= 24; n += 8) {
3272       for (size_t k = 1; k <= 40; k += 9) {
3273         GemmMicrokernelTester()
3274           .mr(1)
3275           .nr(8)
3276           .kr(1)
3277           .sr(1)
3278           .m(1)
3279           .n(n)
3280           .k(k)
3281           .a_stride(43)
3282           .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3283       }
3284     }
3285   }
3286 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_div_8_subtile)3287   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_div_8_subtile) {
3288     TEST_REQUIRES_ARM_NEON_FMA;
3289     for (uint32_t n = 16; n <= 24; n += 8) {
3290       for (size_t k = 1; k <= 40; k += 9) {
3291         for (uint32_t m = 1; m <= 1; m++) {
3292           GemmMicrokernelTester()
3293             .mr(1)
3294             .nr(8)
3295             .kr(1)
3296             .sr(1)
3297             .m(m)
3298             .n(n)
3299             .k(k)
3300             .iterations(1)
3301             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3302         }
3303       }
3304     }
3305   }
3306 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,strided_cm_subtile)3307   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, strided_cm_subtile) {
3308     TEST_REQUIRES_ARM_NEON_FMA;
3309     for (size_t k = 1; k <= 40; k += 9) {
3310       for (uint32_t n = 1; n <= 8; n++) {
3311         for (uint32_t m = 1; m <= 1; m++) {
3312           GemmMicrokernelTester()
3313             .mr(1)
3314             .nr(8)
3315             .kr(1)
3316             .sr(1)
3317             .m(m)
3318             .n(n)
3319             .k(k)
3320             .cm_stride(11)
3321             .iterations(1)
3322             .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3323         }
3324       }
3325     }
3326   }
3327 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,qmin)3328   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, qmin) {
3329     TEST_REQUIRES_ARM_NEON_FMA;
3330     GemmMicrokernelTester()
3331       .mr(1)
3332       .nr(8)
3333       .kr(1)
3334       .sr(1)
3335       .m(1)
3336       .n(8)
3337       .k(8)
3338       .qmin(128)
3339       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3340   }
3341 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,qmax)3342   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, qmax) {
3343     TEST_REQUIRES_ARM_NEON_FMA;
3344     GemmMicrokernelTester()
3345       .mr(1)
3346       .nr(8)
3347       .kr(1)
3348       .sr(1)
3349       .m(1)
3350       .n(8)
3351       .k(8)
3352       .qmax(128)
3353       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3354   }
3355 
TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,strided_cm)3356   TEST(F32_GEMM_MINMAX_1X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, strided_cm) {
3357     TEST_REQUIRES_ARM_NEON_FMA;
3358     GemmMicrokernelTester()
3359       .mr(1)
3360       .nr(8)
3361       .kr(1)
3362       .sr(1)
3363       .m(1)
3364       .n(8)
3365       .k(8)
3366       .cm_stride(11)
3367       .Test(xnn_f32_gemm_minmax_ukernel_1x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
3368   }
3369 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
3370 
3371 
3372 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_4)3373   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_4) {
3374     TEST_REQUIRES_ARM_NEON_FMA;
3375     GemmMicrokernelTester()
3376       .mr(1)
3377       .nr(12)
3378       .kr(1)
3379       .sr(1)
3380       .m(1)
3381       .n(12)
3382       .k(4)
3383       .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3384   }
3385 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,strided_cn)3386   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, strided_cn) {
3387     TEST_REQUIRES_ARM_NEON_FMA;
3388     GemmMicrokernelTester()
3389       .mr(1)
3390       .nr(12)
3391       .kr(1)
3392       .sr(1)
3393       .m(1)
3394       .n(12)
3395       .k(4)
3396       .cn_stride(17)
3397       .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3398   }
3399 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_strided_a)3400   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_strided_a) {
3401     TEST_REQUIRES_ARM_NEON_FMA;
3402     GemmMicrokernelTester()
3403       .mr(1)
3404       .nr(12)
3405       .kr(1)
3406       .sr(1)
3407       .m(1)
3408       .n(12)
3409       .k(4)
3410       .a_stride(7)
3411       .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3412   }
3413 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile)3414   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile) {
3415     TEST_REQUIRES_ARM_NEON_FMA;
3416     for (uint32_t n = 1; n <= 12; n++) {
3417       for (uint32_t m = 1; m <= 1; m++) {
3418         GemmMicrokernelTester()
3419           .mr(1)
3420           .nr(12)
3421           .kr(1)
3422           .sr(1)
3423           .m(m)
3424           .n(n)
3425           .k(4)
3426           .iterations(1)
3427           .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3428       }
3429     }
3430   }
3431 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile_m)3432   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile_m) {
3433     TEST_REQUIRES_ARM_NEON_FMA;
3434     for (uint32_t m = 1; m <= 1; m++) {
3435       GemmMicrokernelTester()
3436         .mr(1)
3437         .nr(12)
3438         .kr(1)
3439         .sr(1)
3440         .m(m)
3441         .n(12)
3442         .k(4)
3443         .iterations(1)
3444         .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3445     }
3446   }
3447 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile_n)3448   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile_n) {
3449     TEST_REQUIRES_ARM_NEON_FMA;
3450     for (uint32_t n = 1; n <= 12; n++) {
3451       GemmMicrokernelTester()
3452         .mr(1)
3453         .nr(12)
3454         .kr(1)
3455         .sr(1)
3456         .m(1)
3457         .n(n)
3458         .k(4)
3459         .iterations(1)
3460         .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3461     }
3462   }
3463 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_8)3464   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_8) {
3465     TEST_REQUIRES_ARM_NEON_FMA;
3466     GemmMicrokernelTester()
3467       .mr(1)
3468       .nr(12)
3469       .kr(1)
3470       .sr(1)
3471       .m(1)
3472       .n(12)
3473       .k(8)
3474       .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3475   }
3476 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_8_strided_a)3477   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_8_strided_a) {
3478     TEST_REQUIRES_ARM_NEON_FMA;
3479     GemmMicrokernelTester()
3480       .mr(1)
3481       .nr(12)
3482       .kr(1)
3483       .sr(1)
3484       .m(1)
3485       .n(12)
3486       .k(8)
3487       .a_stride(11)
3488       .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3489   }
3490 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_8_subtile)3491   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_8_subtile) {
3492     TEST_REQUIRES_ARM_NEON_FMA;
3493     for (uint32_t n = 1; n <= 12; n++) {
3494       for (uint32_t m = 1; m <= 1; m++) {
3495         GemmMicrokernelTester()
3496           .mr(1)
3497           .nr(12)
3498           .kr(1)
3499           .sr(1)
3500           .m(m)
3501           .n(n)
3502           .k(8)
3503           .iterations(1)
3504           .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3505       }
3506     }
3507   }
3508 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_lt_8)3509   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_lt_8) {
3510     TEST_REQUIRES_ARM_NEON_FMA;
3511     for (size_t k = 1; k < 8; k++) {
3512       GemmMicrokernelTester()
3513         .mr(1)
3514         .nr(12)
3515         .kr(1)
3516         .sr(1)
3517         .m(1)
3518         .n(12)
3519         .k(k)
3520         .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3521     }
3522   }
3523 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_lt_8_strided_a)3524   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_lt_8_strided_a) {
3525     TEST_REQUIRES_ARM_NEON_FMA;
3526     for (size_t k = 1; k < 8; k++) {
3527       GemmMicrokernelTester()
3528         .mr(1)
3529         .nr(12)
3530         .kr(1)
3531         .sr(1)
3532         .m(1)
3533         .n(12)
3534         .k(k)
3535         .a_stride(11)
3536         .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3537     }
3538   }
3539 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_lt_8_subtile)3540   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_lt_8_subtile) {
3541     TEST_REQUIRES_ARM_NEON_FMA;
3542     for (size_t k = 1; k < 8; k++) {
3543       for (uint32_t n = 1; n <= 12; n++) {
3544         for (uint32_t m = 1; m <= 1; m++) {
3545           GemmMicrokernelTester()
3546             .mr(1)
3547             .nr(12)
3548             .kr(1)
3549             .sr(1)
3550             .m(m)
3551             .n(n)
3552             .k(k)
3553             .iterations(1)
3554             .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3555         }
3556       }
3557     }
3558   }
3559 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_gt_8)3560   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_gt_8) {
3561     TEST_REQUIRES_ARM_NEON_FMA;
3562     for (size_t k = 9; k < 16; k++) {
3563       GemmMicrokernelTester()
3564         .mr(1)
3565         .nr(12)
3566         .kr(1)
3567         .sr(1)
3568         .m(1)
3569         .n(12)
3570         .k(k)
3571         .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3572     }
3573   }
3574 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_gt_8_strided_a)3575   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_gt_8_strided_a) {
3576     TEST_REQUIRES_ARM_NEON_FMA;
3577     for (size_t k = 9; k < 16; k++) {
3578       GemmMicrokernelTester()
3579         .mr(1)
3580         .nr(12)
3581         .kr(1)
3582         .sr(1)
3583         .m(1)
3584         .n(12)
3585         .k(k)
3586         .a_stride(19)
3587         .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3588     }
3589   }
3590 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_gt_8_subtile)3591   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_gt_8_subtile) {
3592     TEST_REQUIRES_ARM_NEON_FMA;
3593     for (size_t k = 9; k < 16; k++) {
3594       for (uint32_t n = 1; n <= 12; n++) {
3595         for (uint32_t m = 1; m <= 1; m++) {
3596           GemmMicrokernelTester()
3597             .mr(1)
3598             .nr(12)
3599             .kr(1)
3600             .sr(1)
3601             .m(m)
3602             .n(n)
3603             .k(k)
3604             .iterations(1)
3605             .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3606         }
3607       }
3608     }
3609   }
3610 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_div_4)3611   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_div_4) {
3612     TEST_REQUIRES_ARM_NEON_FMA;
3613     for (size_t k = 12; k <= 40; k += 4) {
3614       GemmMicrokernelTester()
3615         .mr(1)
3616         .nr(12)
3617         .kr(1)
3618         .sr(1)
3619         .m(1)
3620         .n(12)
3621         .k(k)
3622         .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3623     }
3624   }
3625 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_div_4_strided_a)3626   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_div_4_strided_a) {
3627     TEST_REQUIRES_ARM_NEON_FMA;
3628     for (size_t k = 12; k <= 40; k += 4) {
3629       GemmMicrokernelTester()
3630         .mr(1)
3631         .nr(12)
3632         .kr(1)
3633         .sr(1)
3634         .m(1)
3635         .n(12)
3636         .k(k)
3637         .a_stride(43)
3638         .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3639     }
3640   }
3641 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,k_div_4_subtile)3642   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, k_div_4_subtile) {
3643     TEST_REQUIRES_ARM_NEON_FMA;
3644     for (size_t k = 12; k <= 40; k += 4) {
3645       for (uint32_t n = 1; n <= 12; n++) {
3646         for (uint32_t m = 1; m <= 1; m++) {
3647           GemmMicrokernelTester()
3648             .mr(1)
3649             .nr(12)
3650             .kr(1)
3651             .sr(1)
3652             .m(m)
3653             .n(n)
3654             .k(k)
3655             .iterations(1)
3656             .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3657         }
3658       }
3659     }
3660   }
3661 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,n_gt_12)3662   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, n_gt_12) {
3663     TEST_REQUIRES_ARM_NEON_FMA;
3664     for (uint32_t n = 13; n < 24; n++) {
3665       for (size_t k = 1; k <= 20; k += 5) {
3666         GemmMicrokernelTester()
3667           .mr(1)
3668           .nr(12)
3669           .kr(1)
3670           .sr(1)
3671           .m(1)
3672           .n(n)
3673           .k(k)
3674           .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3675       }
3676     }
3677   }
3678 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,n_gt_12_strided_cn)3679   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, n_gt_12_strided_cn) {
3680     TEST_REQUIRES_ARM_NEON_FMA;
3681     for (uint32_t n = 13; n < 24; n++) {
3682       for (size_t k = 1; k <= 20; k += 5) {
3683         GemmMicrokernelTester()
3684           .mr(1)
3685           .nr(12)
3686           .kr(1)
3687           .sr(1)
3688           .m(1)
3689           .n(n)
3690           .k(k)
3691           .cn_stride(17)
3692           .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3693       }
3694     }
3695   }
3696 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,n_gt_12_strided_a)3697   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, n_gt_12_strided_a) {
3698     TEST_REQUIRES_ARM_NEON_FMA;
3699     for (uint32_t n = 13; n < 24; n++) {
3700       for (size_t k = 1; k <= 20; k += 5) {
3701         GemmMicrokernelTester()
3702           .mr(1)
3703           .nr(12)
3704           .kr(1)
3705           .sr(1)
3706           .m(1)
3707           .n(n)
3708           .k(k)
3709           .a_stride(23)
3710           .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3711       }
3712     }
3713   }
3714 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,n_gt_12_subtile)3715   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, n_gt_12_subtile) {
3716     TEST_REQUIRES_ARM_NEON_FMA;
3717     for (uint32_t n = 13; n < 24; n++) {
3718       for (size_t k = 1; k <= 20; k += 5) {
3719         for (uint32_t m = 1; m <= 1; m++) {
3720           GemmMicrokernelTester()
3721             .mr(1)
3722             .nr(12)
3723             .kr(1)
3724             .sr(1)
3725             .m(m)
3726             .n(n)
3727             .k(k)
3728             .iterations(1)
3729             .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3730         }
3731       }
3732     }
3733   }
3734 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,n_div_12)3735   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, n_div_12) {
3736     TEST_REQUIRES_ARM_NEON_FMA;
3737     for (uint32_t n = 24; n <= 36; n += 12) {
3738       for (size_t k = 1; k <= 20; k += 5) {
3739         GemmMicrokernelTester()
3740           .mr(1)
3741           .nr(12)
3742           .kr(1)
3743           .sr(1)
3744           .m(1)
3745           .n(n)
3746           .k(k)
3747           .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3748       }
3749     }
3750   }
3751 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,n_div_12_strided_cn)3752   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, n_div_12_strided_cn) {
3753     TEST_REQUIRES_ARM_NEON_FMA;
3754     for (uint32_t n = 24; n <= 36; n += 12) {
3755       for (size_t k = 1; k <= 20; k += 5) {
3756         GemmMicrokernelTester()
3757           .mr(1)
3758           .nr(12)
3759           .kr(1)
3760           .sr(1)
3761           .m(1)
3762           .n(n)
3763           .k(k)
3764           .cn_stride(17)
3765           .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3766       }
3767     }
3768   }
3769 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,n_div_12_strided_a)3770   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, n_div_12_strided_a) {
3771     TEST_REQUIRES_ARM_NEON_FMA;
3772     for (uint32_t n = 24; n <= 36; n += 12) {
3773       for (size_t k = 1; k <= 20; k += 5) {
3774         GemmMicrokernelTester()
3775           .mr(1)
3776           .nr(12)
3777           .kr(1)
3778           .sr(1)
3779           .m(1)
3780           .n(n)
3781           .k(k)
3782           .a_stride(23)
3783           .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3784       }
3785     }
3786   }
3787 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,n_div_12_subtile)3788   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, n_div_12_subtile) {
3789     TEST_REQUIRES_ARM_NEON_FMA;
3790     for (uint32_t n = 24; n <= 36; n += 12) {
3791       for (size_t k = 1; k <= 20; k += 5) {
3792         for (uint32_t m = 1; m <= 1; m++) {
3793           GemmMicrokernelTester()
3794             .mr(1)
3795             .nr(12)
3796             .kr(1)
3797             .sr(1)
3798             .m(m)
3799             .n(n)
3800             .k(k)
3801             .iterations(1)
3802             .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3803         }
3804       }
3805     }
3806   }
3807 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,strided_cm_subtile)3808   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, strided_cm_subtile) {
3809     TEST_REQUIRES_ARM_NEON_FMA;
3810     for (size_t k = 1; k <= 20; k += 5) {
3811       for (uint32_t n = 1; n <= 12; n++) {
3812         for (uint32_t m = 1; m <= 1; m++) {
3813           GemmMicrokernelTester()
3814             .mr(1)
3815             .nr(12)
3816             .kr(1)
3817             .sr(1)
3818             .m(m)
3819             .n(n)
3820             .k(k)
3821             .cm_stride(17)
3822             .iterations(1)
3823             .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3824         }
3825       }
3826     }
3827   }
3828 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,qmin)3829   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, qmin) {
3830     TEST_REQUIRES_ARM_NEON_FMA;
3831     GemmMicrokernelTester()
3832       .mr(1)
3833       .nr(12)
3834       .kr(1)
3835       .sr(1)
3836       .m(1)
3837       .n(12)
3838       .k(4)
3839       .qmin(128)
3840       .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3841   }
3842 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,qmax)3843   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, qmax) {
3844     TEST_REQUIRES_ARM_NEON_FMA;
3845     GemmMicrokernelTester()
3846       .mr(1)
3847       .nr(12)
3848       .kr(1)
3849       .sr(1)
3850       .m(1)
3851       .n(12)
3852       .k(4)
3853       .qmax(128)
3854       .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3855   }
3856 
TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53,strided_cm)3857   TEST(F32_GEMM_MINMAX_1X12__AARCH64_NEONFMA_CORTEX_A53, strided_cm) {
3858     TEST_REQUIRES_ARM_NEON_FMA;
3859     GemmMicrokernelTester()
3860       .mr(1)
3861       .nr(12)
3862       .kr(1)
3863       .sr(1)
3864       .m(1)
3865       .n(12)
3866       .k(4)
3867       .cm_stride(17)
3868       .Test(xnn_f32_gemm_minmax_ukernel_1x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3869   }
3870 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
3871 
3872 
3873 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_4)3874   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_4) {
3875     TEST_REQUIRES_ARM_NEON_FMA;
3876     GemmMicrokernelTester()
3877       .mr(4)
3878       .nr(8)
3879       .kr(1)
3880       .sr(1)
3881       .m(4)
3882       .n(8)
3883       .k(4)
3884       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3885   }
3886 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,strided_cn)3887   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, strided_cn) {
3888     TEST_REQUIRES_ARM_NEON_FMA;
3889     GemmMicrokernelTester()
3890       .mr(4)
3891       .nr(8)
3892       .kr(1)
3893       .sr(1)
3894       .m(4)
3895       .n(8)
3896       .k(4)
3897       .cn_stride(11)
3898       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3899   }
3900 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_strided_a)3901   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_strided_a) {
3902     TEST_REQUIRES_ARM_NEON_FMA;
3903     GemmMicrokernelTester()
3904       .mr(4)
3905       .nr(8)
3906       .kr(1)
3907       .sr(1)
3908       .m(4)
3909       .n(8)
3910       .k(4)
3911       .a_stride(7)
3912       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3913   }
3914 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile)3915   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile) {
3916     TEST_REQUIRES_ARM_NEON_FMA;
3917     for (uint32_t n = 1; n <= 8; n++) {
3918       for (uint32_t m = 1; m <= 4; m++) {
3919         GemmMicrokernelTester()
3920           .mr(4)
3921           .nr(8)
3922           .kr(1)
3923           .sr(1)
3924           .m(m)
3925           .n(n)
3926           .k(4)
3927           .iterations(1)
3928           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3929       }
3930     }
3931   }
3932 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile_m)3933   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile_m) {
3934     TEST_REQUIRES_ARM_NEON_FMA;
3935     for (uint32_t m = 1; m <= 4; m++) {
3936       GemmMicrokernelTester()
3937         .mr(4)
3938         .nr(8)
3939         .kr(1)
3940         .sr(1)
3941         .m(m)
3942         .n(8)
3943         .k(4)
3944         .iterations(1)
3945         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3946     }
3947   }
3948 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile_n)3949   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile_n) {
3950     TEST_REQUIRES_ARM_NEON_FMA;
3951     for (uint32_t n = 1; n <= 8; n++) {
3952       GemmMicrokernelTester()
3953         .mr(4)
3954         .nr(8)
3955         .kr(1)
3956         .sr(1)
3957         .m(4)
3958         .n(n)
3959         .k(4)
3960         .iterations(1)
3961         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3962     }
3963   }
3964 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_8)3965   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_8) {
3966     TEST_REQUIRES_ARM_NEON_FMA;
3967     GemmMicrokernelTester()
3968       .mr(4)
3969       .nr(8)
3970       .kr(1)
3971       .sr(1)
3972       .m(4)
3973       .n(8)
3974       .k(8)
3975       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3976   }
3977 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_8_strided_a)3978   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_8_strided_a) {
3979     TEST_REQUIRES_ARM_NEON_FMA;
3980     GemmMicrokernelTester()
3981       .mr(4)
3982       .nr(8)
3983       .kr(1)
3984       .sr(1)
3985       .m(4)
3986       .n(8)
3987       .k(8)
3988       .a_stride(11)
3989       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
3990   }
3991 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_8_subtile)3992   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_8_subtile) {
3993     TEST_REQUIRES_ARM_NEON_FMA;
3994     for (uint32_t n = 1; n <= 8; n++) {
3995       for (uint32_t m = 1; m <= 4; m++) {
3996         GemmMicrokernelTester()
3997           .mr(4)
3998           .nr(8)
3999           .kr(1)
4000           .sr(1)
4001           .m(m)
4002           .n(n)
4003           .k(8)
4004           .iterations(1)
4005           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4006       }
4007     }
4008   }
4009 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_lt_8)4010   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_lt_8) {
4011     TEST_REQUIRES_ARM_NEON_FMA;
4012     for (size_t k = 1; k < 8; k++) {
4013       GemmMicrokernelTester()
4014         .mr(4)
4015         .nr(8)
4016         .kr(1)
4017         .sr(1)
4018         .m(4)
4019         .n(8)
4020         .k(k)
4021         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4022     }
4023   }
4024 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_lt_8_strided_a)4025   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_lt_8_strided_a) {
4026     TEST_REQUIRES_ARM_NEON_FMA;
4027     for (size_t k = 1; k < 8; k++) {
4028       GemmMicrokernelTester()
4029         .mr(4)
4030         .nr(8)
4031         .kr(1)
4032         .sr(1)
4033         .m(4)
4034         .n(8)
4035         .k(k)
4036         .a_stride(11)
4037         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4038     }
4039   }
4040 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_lt_8_subtile)4041   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_lt_8_subtile) {
4042     TEST_REQUIRES_ARM_NEON_FMA;
4043     for (size_t k = 1; k < 8; k++) {
4044       for (uint32_t n = 1; n <= 8; n++) {
4045         for (uint32_t m = 1; m <= 4; m++) {
4046           GemmMicrokernelTester()
4047             .mr(4)
4048             .nr(8)
4049             .kr(1)
4050             .sr(1)
4051             .m(m)
4052             .n(n)
4053             .k(k)
4054             .iterations(1)
4055             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4056         }
4057       }
4058     }
4059   }
4060 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_gt_8)4061   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_gt_8) {
4062     TEST_REQUIRES_ARM_NEON_FMA;
4063     for (size_t k = 9; k < 16; k++) {
4064       GemmMicrokernelTester()
4065         .mr(4)
4066         .nr(8)
4067         .kr(1)
4068         .sr(1)
4069         .m(4)
4070         .n(8)
4071         .k(k)
4072         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4073     }
4074   }
4075 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_gt_8_strided_a)4076   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_gt_8_strided_a) {
4077     TEST_REQUIRES_ARM_NEON_FMA;
4078     for (size_t k = 9; k < 16; k++) {
4079       GemmMicrokernelTester()
4080         .mr(4)
4081         .nr(8)
4082         .kr(1)
4083         .sr(1)
4084         .m(4)
4085         .n(8)
4086         .k(k)
4087         .a_stride(19)
4088         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4089     }
4090   }
4091 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_gt_8_subtile)4092   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_gt_8_subtile) {
4093     TEST_REQUIRES_ARM_NEON_FMA;
4094     for (size_t k = 9; k < 16; k++) {
4095       for (uint32_t n = 1; n <= 8; n++) {
4096         for (uint32_t m = 1; m <= 4; m++) {
4097           GemmMicrokernelTester()
4098             .mr(4)
4099             .nr(8)
4100             .kr(1)
4101             .sr(1)
4102             .m(m)
4103             .n(n)
4104             .k(k)
4105             .iterations(1)
4106             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4107         }
4108       }
4109     }
4110   }
4111 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_div_4)4112   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_div_4) {
4113     TEST_REQUIRES_ARM_NEON_FMA;
4114     for (size_t k = 12; k <= 40; k += 4) {
4115       GemmMicrokernelTester()
4116         .mr(4)
4117         .nr(8)
4118         .kr(1)
4119         .sr(1)
4120         .m(4)
4121         .n(8)
4122         .k(k)
4123         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4124     }
4125   }
4126 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_div_4_strided_a)4127   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_div_4_strided_a) {
4128     TEST_REQUIRES_ARM_NEON_FMA;
4129     for (size_t k = 12; k <= 40; k += 4) {
4130       GemmMicrokernelTester()
4131         .mr(4)
4132         .nr(8)
4133         .kr(1)
4134         .sr(1)
4135         .m(4)
4136         .n(8)
4137         .k(k)
4138         .a_stride(43)
4139         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4140     }
4141   }
4142 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,k_div_4_subtile)4143   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, k_div_4_subtile) {
4144     TEST_REQUIRES_ARM_NEON_FMA;
4145     for (size_t k = 12; k <= 40; k += 4) {
4146       for (uint32_t n = 1; n <= 8; n++) {
4147         for (uint32_t m = 1; m <= 4; m++) {
4148           GemmMicrokernelTester()
4149             .mr(4)
4150             .nr(8)
4151             .kr(1)
4152             .sr(1)
4153             .m(m)
4154             .n(n)
4155             .k(k)
4156             .iterations(1)
4157             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4158         }
4159       }
4160     }
4161   }
4162 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,n_gt_8)4163   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, n_gt_8) {
4164     TEST_REQUIRES_ARM_NEON_FMA;
4165     for (uint32_t n = 9; n < 16; n++) {
4166       for (size_t k = 1; k <= 20; k += 5) {
4167         GemmMicrokernelTester()
4168           .mr(4)
4169           .nr(8)
4170           .kr(1)
4171           .sr(1)
4172           .m(4)
4173           .n(n)
4174           .k(k)
4175           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4176       }
4177     }
4178   }
4179 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,n_gt_8_strided_cn)4180   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, n_gt_8_strided_cn) {
4181     TEST_REQUIRES_ARM_NEON_FMA;
4182     for (uint32_t n = 9; n < 16; n++) {
4183       for (size_t k = 1; k <= 20; k += 5) {
4184         GemmMicrokernelTester()
4185           .mr(4)
4186           .nr(8)
4187           .kr(1)
4188           .sr(1)
4189           .m(4)
4190           .n(n)
4191           .k(k)
4192           .cn_stride(11)
4193           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4194       }
4195     }
4196   }
4197 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,n_gt_8_strided_a)4198   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, n_gt_8_strided_a) {
4199     TEST_REQUIRES_ARM_NEON_FMA;
4200     for (uint32_t n = 9; n < 16; n++) {
4201       for (size_t k = 1; k <= 20; k += 5) {
4202         GemmMicrokernelTester()
4203           .mr(4)
4204           .nr(8)
4205           .kr(1)
4206           .sr(1)
4207           .m(4)
4208           .n(n)
4209           .k(k)
4210           .a_stride(23)
4211           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4212       }
4213     }
4214   }
4215 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,n_gt_8_subtile)4216   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, n_gt_8_subtile) {
4217     TEST_REQUIRES_ARM_NEON_FMA;
4218     for (uint32_t n = 9; n < 16; n++) {
4219       for (size_t k = 1; k <= 20; k += 5) {
4220         for (uint32_t m = 1; m <= 4; m++) {
4221           GemmMicrokernelTester()
4222             .mr(4)
4223             .nr(8)
4224             .kr(1)
4225             .sr(1)
4226             .m(m)
4227             .n(n)
4228             .k(k)
4229             .iterations(1)
4230             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4231         }
4232       }
4233     }
4234   }
4235 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,n_div_8)4236   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, n_div_8) {
4237     TEST_REQUIRES_ARM_NEON_FMA;
4238     for (uint32_t n = 16; n <= 24; n += 8) {
4239       for (size_t k = 1; k <= 20; k += 5) {
4240         GemmMicrokernelTester()
4241           .mr(4)
4242           .nr(8)
4243           .kr(1)
4244           .sr(1)
4245           .m(4)
4246           .n(n)
4247           .k(k)
4248           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4249       }
4250     }
4251   }
4252 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,n_div_8_strided_cn)4253   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, n_div_8_strided_cn) {
4254     TEST_REQUIRES_ARM_NEON_FMA;
4255     for (uint32_t n = 16; n <= 24; n += 8) {
4256       for (size_t k = 1; k <= 20; k += 5) {
4257         GemmMicrokernelTester()
4258           .mr(4)
4259           .nr(8)
4260           .kr(1)
4261           .sr(1)
4262           .m(4)
4263           .n(n)
4264           .k(k)
4265           .cn_stride(11)
4266           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4267       }
4268     }
4269   }
4270 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,n_div_8_strided_a)4271   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, n_div_8_strided_a) {
4272     TEST_REQUIRES_ARM_NEON_FMA;
4273     for (uint32_t n = 16; n <= 24; n += 8) {
4274       for (size_t k = 1; k <= 20; k += 5) {
4275         GemmMicrokernelTester()
4276           .mr(4)
4277           .nr(8)
4278           .kr(1)
4279           .sr(1)
4280           .m(4)
4281           .n(n)
4282           .k(k)
4283           .a_stride(23)
4284           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4285       }
4286     }
4287   }
4288 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,n_div_8_subtile)4289   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, n_div_8_subtile) {
4290     TEST_REQUIRES_ARM_NEON_FMA;
4291     for (uint32_t n = 16; n <= 24; n += 8) {
4292       for (size_t k = 1; k <= 20; k += 5) {
4293         for (uint32_t m = 1; m <= 4; m++) {
4294           GemmMicrokernelTester()
4295             .mr(4)
4296             .nr(8)
4297             .kr(1)
4298             .sr(1)
4299             .m(m)
4300             .n(n)
4301             .k(k)
4302             .iterations(1)
4303             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4304         }
4305       }
4306     }
4307   }
4308 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,strided_cm_subtile)4309   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, strided_cm_subtile) {
4310     TEST_REQUIRES_ARM_NEON_FMA;
4311     for (size_t k = 1; k <= 20; k += 5) {
4312       for (uint32_t n = 1; n <= 8; n++) {
4313         for (uint32_t m = 1; m <= 4; m++) {
4314           GemmMicrokernelTester()
4315             .mr(4)
4316             .nr(8)
4317             .kr(1)
4318             .sr(1)
4319             .m(m)
4320             .n(n)
4321             .k(k)
4322             .cm_stride(11)
4323             .iterations(1)
4324             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4325         }
4326       }
4327     }
4328   }
4329 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,qmin)4330   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, qmin) {
4331     TEST_REQUIRES_ARM_NEON_FMA;
4332     GemmMicrokernelTester()
4333       .mr(4)
4334       .nr(8)
4335       .kr(1)
4336       .sr(1)
4337       .m(4)
4338       .n(8)
4339       .k(4)
4340       .qmin(128)
4341       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4342   }
4343 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,qmax)4344   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, qmax) {
4345     TEST_REQUIRES_ARM_NEON_FMA;
4346     GemmMicrokernelTester()
4347       .mr(4)
4348       .nr(8)
4349       .kr(1)
4350       .sr(1)
4351       .m(4)
4352       .n(8)
4353       .k(4)
4354       .qmax(128)
4355       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4356   }
4357 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53,strided_cm)4358   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_CORTEX_A53, strided_cm) {
4359     TEST_REQUIRES_ARM_NEON_FMA;
4360     GemmMicrokernelTester()
4361       .mr(4)
4362       .nr(8)
4363       .kr(1)
4364       .sr(1)
4365       .m(4)
4366       .n(8)
4367       .k(4)
4368       .cm_stride(11)
4369       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
4370   }
4371 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
4372 
4373 
4374 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_eq_2)4375   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_eq_2) {
4376     TEST_REQUIRES_ARM_NEON_FMA;
4377     GemmMicrokernelTester()
4378       .mr(4)
4379       .nr(8)
4380       .kr(1)
4381       .sr(1)
4382       .m(4)
4383       .n(8)
4384       .k(2)
4385       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4386   }
4387 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,strided_cn)4388   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, strided_cn) {
4389     TEST_REQUIRES_ARM_NEON_FMA;
4390     GemmMicrokernelTester()
4391       .mr(4)
4392       .nr(8)
4393       .kr(1)
4394       .sr(1)
4395       .m(4)
4396       .n(8)
4397       .k(2)
4398       .cn_stride(11)
4399       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4400   }
4401 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_eq_2_strided_a)4402   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_eq_2_strided_a) {
4403     TEST_REQUIRES_ARM_NEON_FMA;
4404     GemmMicrokernelTester()
4405       .mr(4)
4406       .nr(8)
4407       .kr(1)
4408       .sr(1)
4409       .m(4)
4410       .n(8)
4411       .k(2)
4412       .a_stride(5)
4413       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4414   }
4415 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_eq_2_subtile)4416   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_eq_2_subtile) {
4417     TEST_REQUIRES_ARM_NEON_FMA;
4418     for (uint32_t n = 1; n <= 8; n++) {
4419       for (uint32_t m = 1; m <= 4; m++) {
4420         GemmMicrokernelTester()
4421           .mr(4)
4422           .nr(8)
4423           .kr(1)
4424           .sr(1)
4425           .m(m)
4426           .n(n)
4427           .k(2)
4428           .iterations(1)
4429           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4430       }
4431     }
4432   }
4433 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_eq_2_subtile_m)4434   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_eq_2_subtile_m) {
4435     TEST_REQUIRES_ARM_NEON_FMA;
4436     for (uint32_t m = 1; m <= 4; m++) {
4437       GemmMicrokernelTester()
4438         .mr(4)
4439         .nr(8)
4440         .kr(1)
4441         .sr(1)
4442         .m(m)
4443         .n(8)
4444         .k(2)
4445         .iterations(1)
4446         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4447     }
4448   }
4449 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_eq_2_subtile_n)4450   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_eq_2_subtile_n) {
4451     TEST_REQUIRES_ARM_NEON_FMA;
4452     for (uint32_t n = 1; n <= 8; n++) {
4453       GemmMicrokernelTester()
4454         .mr(4)
4455         .nr(8)
4456         .kr(1)
4457         .sr(1)
4458         .m(4)
4459         .n(n)
4460         .k(2)
4461         .iterations(1)
4462         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4463     }
4464   }
4465 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_lt_2)4466   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_lt_2) {
4467     TEST_REQUIRES_ARM_NEON_FMA;
4468     for (size_t k = 1; k < 2; k++) {
4469       GemmMicrokernelTester()
4470         .mr(4)
4471         .nr(8)
4472         .kr(1)
4473         .sr(1)
4474         .m(4)
4475         .n(8)
4476         .k(k)
4477         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4478     }
4479   }
4480 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_lt_2_strided_a)4481   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_lt_2_strided_a) {
4482     TEST_REQUIRES_ARM_NEON_FMA;
4483     for (size_t k = 1; k < 2; k++) {
4484       GemmMicrokernelTester()
4485         .mr(4)
4486         .nr(8)
4487         .kr(1)
4488         .sr(1)
4489         .m(4)
4490         .n(8)
4491         .k(k)
4492         .a_stride(5)
4493         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4494     }
4495   }
4496 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_lt_2_subtile)4497   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_lt_2_subtile) {
4498     TEST_REQUIRES_ARM_NEON_FMA;
4499     for (size_t k = 1; k < 2; k++) {
4500       for (uint32_t n = 1; n <= 8; n++) {
4501         for (uint32_t m = 1; m <= 4; m++) {
4502           GemmMicrokernelTester()
4503             .mr(4)
4504             .nr(8)
4505             .kr(1)
4506             .sr(1)
4507             .m(m)
4508             .n(n)
4509             .k(k)
4510             .iterations(1)
4511             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4512         }
4513       }
4514     }
4515   }
4516 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_gt_2)4517   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_gt_2) {
4518     TEST_REQUIRES_ARM_NEON_FMA;
4519     for (size_t k = 3; k < 4; k++) {
4520       GemmMicrokernelTester()
4521         .mr(4)
4522         .nr(8)
4523         .kr(1)
4524         .sr(1)
4525         .m(4)
4526         .n(8)
4527         .k(k)
4528         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4529     }
4530   }
4531 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_gt_2_strided_a)4532   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_gt_2_strided_a) {
4533     TEST_REQUIRES_ARM_NEON_FMA;
4534     for (size_t k = 3; k < 4; k++) {
4535       GemmMicrokernelTester()
4536         .mr(4)
4537         .nr(8)
4538         .kr(1)
4539         .sr(1)
4540         .m(4)
4541         .n(8)
4542         .k(k)
4543         .a_stride(7)
4544         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4545     }
4546   }
4547 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_gt_2_subtile)4548   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_gt_2_subtile) {
4549     TEST_REQUIRES_ARM_NEON_FMA;
4550     for (size_t k = 3; k < 4; k++) {
4551       for (uint32_t n = 1; n <= 8; n++) {
4552         for (uint32_t m = 1; m <= 4; m++) {
4553           GemmMicrokernelTester()
4554             .mr(4)
4555             .nr(8)
4556             .kr(1)
4557             .sr(1)
4558             .m(m)
4559             .n(n)
4560             .k(k)
4561             .iterations(1)
4562             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4563         }
4564       }
4565     }
4566   }
4567 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_div_2)4568   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_div_2) {
4569     TEST_REQUIRES_ARM_NEON_FMA;
4570     for (size_t k = 4; k <= 20; k += 2) {
4571       GemmMicrokernelTester()
4572         .mr(4)
4573         .nr(8)
4574         .kr(1)
4575         .sr(1)
4576         .m(4)
4577         .n(8)
4578         .k(k)
4579         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4580     }
4581   }
4582 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_div_2_strided_a)4583   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_div_2_strided_a) {
4584     TEST_REQUIRES_ARM_NEON_FMA;
4585     for (size_t k = 4; k <= 20; k += 2) {
4586       GemmMicrokernelTester()
4587         .mr(4)
4588         .nr(8)
4589         .kr(1)
4590         .sr(1)
4591         .m(4)
4592         .n(8)
4593         .k(k)
4594         .a_stride(23)
4595         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4596     }
4597   }
4598 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,k_div_2_subtile)4599   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, k_div_2_subtile) {
4600     TEST_REQUIRES_ARM_NEON_FMA;
4601     for (size_t k = 4; k <= 20; k += 2) {
4602       for (uint32_t n = 1; n <= 8; n++) {
4603         for (uint32_t m = 1; m <= 4; m++) {
4604           GemmMicrokernelTester()
4605             .mr(4)
4606             .nr(8)
4607             .kr(1)
4608             .sr(1)
4609             .m(m)
4610             .n(n)
4611             .k(k)
4612             .iterations(1)
4613             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4614         }
4615       }
4616     }
4617   }
4618 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,n_gt_8)4619   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, n_gt_8) {
4620     TEST_REQUIRES_ARM_NEON_FMA;
4621     for (uint32_t n = 9; n < 16; n++) {
4622       for (size_t k = 1; k <= 10; k += 3) {
4623         GemmMicrokernelTester()
4624           .mr(4)
4625           .nr(8)
4626           .kr(1)
4627           .sr(1)
4628           .m(4)
4629           .n(n)
4630           .k(k)
4631           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4632       }
4633     }
4634   }
4635 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,n_gt_8_strided_cn)4636   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, n_gt_8_strided_cn) {
4637     TEST_REQUIRES_ARM_NEON_FMA;
4638     for (uint32_t n = 9; n < 16; n++) {
4639       for (size_t k = 1; k <= 10; k += 3) {
4640         GemmMicrokernelTester()
4641           .mr(4)
4642           .nr(8)
4643           .kr(1)
4644           .sr(1)
4645           .m(4)
4646           .n(n)
4647           .k(k)
4648           .cn_stride(11)
4649           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4650       }
4651     }
4652   }
4653 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,n_gt_8_strided_a)4654   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, n_gt_8_strided_a) {
4655     TEST_REQUIRES_ARM_NEON_FMA;
4656     for (uint32_t n = 9; n < 16; n++) {
4657       for (size_t k = 1; k <= 10; k += 3) {
4658         GemmMicrokernelTester()
4659           .mr(4)
4660           .nr(8)
4661           .kr(1)
4662           .sr(1)
4663           .m(4)
4664           .n(n)
4665           .k(k)
4666           .a_stride(13)
4667           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4668       }
4669     }
4670   }
4671 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,n_gt_8_subtile)4672   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, n_gt_8_subtile) {
4673     TEST_REQUIRES_ARM_NEON_FMA;
4674     for (uint32_t n = 9; n < 16; n++) {
4675       for (size_t k = 1; k <= 10; k += 3) {
4676         for (uint32_t m = 1; m <= 4; m++) {
4677           GemmMicrokernelTester()
4678             .mr(4)
4679             .nr(8)
4680             .kr(1)
4681             .sr(1)
4682             .m(m)
4683             .n(n)
4684             .k(k)
4685             .iterations(1)
4686             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4687         }
4688       }
4689     }
4690   }
4691 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,n_div_8)4692   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, n_div_8) {
4693     TEST_REQUIRES_ARM_NEON_FMA;
4694     for (uint32_t n = 16; n <= 24; n += 8) {
4695       for (size_t k = 1; k <= 10; k += 3) {
4696         GemmMicrokernelTester()
4697           .mr(4)
4698           .nr(8)
4699           .kr(1)
4700           .sr(1)
4701           .m(4)
4702           .n(n)
4703           .k(k)
4704           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4705       }
4706     }
4707   }
4708 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,n_div_8_strided_cn)4709   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, n_div_8_strided_cn) {
4710     TEST_REQUIRES_ARM_NEON_FMA;
4711     for (uint32_t n = 16; n <= 24; n += 8) {
4712       for (size_t k = 1; k <= 10; k += 3) {
4713         GemmMicrokernelTester()
4714           .mr(4)
4715           .nr(8)
4716           .kr(1)
4717           .sr(1)
4718           .m(4)
4719           .n(n)
4720           .k(k)
4721           .cn_stride(11)
4722           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4723       }
4724     }
4725   }
4726 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,n_div_8_strided_a)4727   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, n_div_8_strided_a) {
4728     TEST_REQUIRES_ARM_NEON_FMA;
4729     for (uint32_t n = 16; n <= 24; n += 8) {
4730       for (size_t k = 1; k <= 10; k += 3) {
4731         GemmMicrokernelTester()
4732           .mr(4)
4733           .nr(8)
4734           .kr(1)
4735           .sr(1)
4736           .m(4)
4737           .n(n)
4738           .k(k)
4739           .a_stride(13)
4740           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4741       }
4742     }
4743   }
4744 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,n_div_8_subtile)4745   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, n_div_8_subtile) {
4746     TEST_REQUIRES_ARM_NEON_FMA;
4747     for (uint32_t n = 16; n <= 24; n += 8) {
4748       for (size_t k = 1; k <= 10; k += 3) {
4749         for (uint32_t m = 1; m <= 4; m++) {
4750           GemmMicrokernelTester()
4751             .mr(4)
4752             .nr(8)
4753             .kr(1)
4754             .sr(1)
4755             .m(m)
4756             .n(n)
4757             .k(k)
4758             .iterations(1)
4759             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4760         }
4761       }
4762     }
4763   }
4764 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,strided_cm_subtile)4765   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, strided_cm_subtile) {
4766     TEST_REQUIRES_ARM_NEON_FMA;
4767     for (size_t k = 1; k <= 10; k += 3) {
4768       for (uint32_t n = 1; n <= 8; n++) {
4769         for (uint32_t m = 1; m <= 4; m++) {
4770           GemmMicrokernelTester()
4771             .mr(4)
4772             .nr(8)
4773             .kr(1)
4774             .sr(1)
4775             .m(m)
4776             .n(n)
4777             .k(k)
4778             .cm_stride(11)
4779             .iterations(1)
4780             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4781         }
4782       }
4783     }
4784   }
4785 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,qmin)4786   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, qmin) {
4787     TEST_REQUIRES_ARM_NEON_FMA;
4788     GemmMicrokernelTester()
4789       .mr(4)
4790       .nr(8)
4791       .kr(1)
4792       .sr(1)
4793       .m(4)
4794       .n(8)
4795       .k(2)
4796       .qmin(128)
4797       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4798   }
4799 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,qmax)4800   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, qmax) {
4801     TEST_REQUIRES_ARM_NEON_FMA;
4802     GemmMicrokernelTester()
4803       .mr(4)
4804       .nr(8)
4805       .kr(1)
4806       .sr(1)
4807       .m(4)
4808       .n(8)
4809       .k(2)
4810       .qmax(128)
4811       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4812   }
4813 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64,strided_cm)4814   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD64, strided_cm) {
4815     TEST_REQUIRES_ARM_NEON_FMA;
4816     GemmMicrokernelTester()
4817       .mr(4)
4818       .nr(8)
4819       .kr(1)
4820       .sr(1)
4821       .m(4)
4822       .n(8)
4823       .k(2)
4824       .cm_stride(11)
4825       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld64, xnn_init_f32_minmax_scalar_params);
4826   }
4827 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
4828 
4829 
4830 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_eq_4)4831   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_eq_4) {
4832     TEST_REQUIRES_ARM_NEON_FMA;
4833     GemmMicrokernelTester()
4834       .mr(4)
4835       .nr(8)
4836       .kr(1)
4837       .sr(1)
4838       .m(4)
4839       .n(8)
4840       .k(4)
4841       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
4842   }
4843 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,strided_cn)4844   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, strided_cn) {
4845     TEST_REQUIRES_ARM_NEON_FMA;
4846     GemmMicrokernelTester()
4847       .mr(4)
4848       .nr(8)
4849       .kr(1)
4850       .sr(1)
4851       .m(4)
4852       .n(8)
4853       .k(4)
4854       .cn_stride(11)
4855       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
4856   }
4857 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_eq_4_strided_a)4858   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_eq_4_strided_a) {
4859     TEST_REQUIRES_ARM_NEON_FMA;
4860     GemmMicrokernelTester()
4861       .mr(4)
4862       .nr(8)
4863       .kr(1)
4864       .sr(1)
4865       .m(4)
4866       .n(8)
4867       .k(4)
4868       .a_stride(7)
4869       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
4870   }
4871 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_eq_4_subtile)4872   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_eq_4_subtile) {
4873     TEST_REQUIRES_ARM_NEON_FMA;
4874     for (uint32_t n = 1; n <= 8; n++) {
4875       for (uint32_t m = 1; m <= 4; m++) {
4876         GemmMicrokernelTester()
4877           .mr(4)
4878           .nr(8)
4879           .kr(1)
4880           .sr(1)
4881           .m(m)
4882           .n(n)
4883           .k(4)
4884           .iterations(1)
4885           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
4886       }
4887     }
4888   }
4889 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_eq_4_subtile_m)4890   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_eq_4_subtile_m) {
4891     TEST_REQUIRES_ARM_NEON_FMA;
4892     for (uint32_t m = 1; m <= 4; m++) {
4893       GemmMicrokernelTester()
4894         .mr(4)
4895         .nr(8)
4896         .kr(1)
4897         .sr(1)
4898         .m(m)
4899         .n(8)
4900         .k(4)
4901         .iterations(1)
4902         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
4903     }
4904   }
4905 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_eq_4_subtile_n)4906   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_eq_4_subtile_n) {
4907     TEST_REQUIRES_ARM_NEON_FMA;
4908     for (uint32_t n = 1; n <= 8; n++) {
4909       GemmMicrokernelTester()
4910         .mr(4)
4911         .nr(8)
4912         .kr(1)
4913         .sr(1)
4914         .m(4)
4915         .n(n)
4916         .k(4)
4917         .iterations(1)
4918         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
4919     }
4920   }
4921 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_lt_4)4922   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_lt_4) {
4923     TEST_REQUIRES_ARM_NEON_FMA;
4924     for (size_t k = 1; k < 4; k++) {
4925       GemmMicrokernelTester()
4926         .mr(4)
4927         .nr(8)
4928         .kr(1)
4929         .sr(1)
4930         .m(4)
4931         .n(8)
4932         .k(k)
4933         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
4934     }
4935   }
4936 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_lt_4_strided_a)4937   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_lt_4_strided_a) {
4938     TEST_REQUIRES_ARM_NEON_FMA;
4939     for (size_t k = 1; k < 4; k++) {
4940       GemmMicrokernelTester()
4941         .mr(4)
4942         .nr(8)
4943         .kr(1)
4944         .sr(1)
4945         .m(4)
4946         .n(8)
4947         .k(k)
4948         .a_stride(7)
4949         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
4950     }
4951   }
4952 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_lt_4_subtile)4953   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_lt_4_subtile) {
4954     TEST_REQUIRES_ARM_NEON_FMA;
4955     for (size_t k = 1; k < 4; k++) {
4956       for (uint32_t n = 1; n <= 8; n++) {
4957         for (uint32_t m = 1; m <= 4; m++) {
4958           GemmMicrokernelTester()
4959             .mr(4)
4960             .nr(8)
4961             .kr(1)
4962             .sr(1)
4963             .m(m)
4964             .n(n)
4965             .k(k)
4966             .iterations(1)
4967             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
4968         }
4969       }
4970     }
4971   }
4972 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_gt_4)4973   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_gt_4) {
4974     TEST_REQUIRES_ARM_NEON_FMA;
4975     for (size_t k = 5; k < 8; k++) {
4976       GemmMicrokernelTester()
4977         .mr(4)
4978         .nr(8)
4979         .kr(1)
4980         .sr(1)
4981         .m(4)
4982         .n(8)
4983         .k(k)
4984         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
4985     }
4986   }
4987 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_gt_4_strided_a)4988   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_gt_4_strided_a) {
4989     TEST_REQUIRES_ARM_NEON_FMA;
4990     for (size_t k = 5; k < 8; k++) {
4991       GemmMicrokernelTester()
4992         .mr(4)
4993         .nr(8)
4994         .kr(1)
4995         .sr(1)
4996         .m(4)
4997         .n(8)
4998         .k(k)
4999         .a_stride(11)
5000         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5001     }
5002   }
5003 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_gt_4_subtile)5004   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_gt_4_subtile) {
5005     TEST_REQUIRES_ARM_NEON_FMA;
5006     for (size_t k = 5; k < 8; k++) {
5007       for (uint32_t n = 1; n <= 8; n++) {
5008         for (uint32_t m = 1; m <= 4; m++) {
5009           GemmMicrokernelTester()
5010             .mr(4)
5011             .nr(8)
5012             .kr(1)
5013             .sr(1)
5014             .m(m)
5015             .n(n)
5016             .k(k)
5017             .iterations(1)
5018             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5019         }
5020       }
5021     }
5022   }
5023 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_div_4)5024   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_div_4) {
5025     TEST_REQUIRES_ARM_NEON_FMA;
5026     for (size_t k = 8; k <= 40; k += 4) {
5027       GemmMicrokernelTester()
5028         .mr(4)
5029         .nr(8)
5030         .kr(1)
5031         .sr(1)
5032         .m(4)
5033         .n(8)
5034         .k(k)
5035         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5036     }
5037   }
5038 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_div_4_strided_a)5039   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_div_4_strided_a) {
5040     TEST_REQUIRES_ARM_NEON_FMA;
5041     for (size_t k = 8; k <= 40; k += 4) {
5042       GemmMicrokernelTester()
5043         .mr(4)
5044         .nr(8)
5045         .kr(1)
5046         .sr(1)
5047         .m(4)
5048         .n(8)
5049         .k(k)
5050         .a_stride(43)
5051         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5052     }
5053   }
5054 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,k_div_4_subtile)5055   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, k_div_4_subtile) {
5056     TEST_REQUIRES_ARM_NEON_FMA;
5057     for (size_t k = 8; k <= 40; k += 4) {
5058       for (uint32_t n = 1; n <= 8; n++) {
5059         for (uint32_t m = 1; m <= 4; m++) {
5060           GemmMicrokernelTester()
5061             .mr(4)
5062             .nr(8)
5063             .kr(1)
5064             .sr(1)
5065             .m(m)
5066             .n(n)
5067             .k(k)
5068             .iterations(1)
5069             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5070         }
5071       }
5072     }
5073   }
5074 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,n_gt_8)5075   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, n_gt_8) {
5076     TEST_REQUIRES_ARM_NEON_FMA;
5077     for (uint32_t n = 9; n < 16; n++) {
5078       for (size_t k = 1; k <= 20; k += 5) {
5079         GemmMicrokernelTester()
5080           .mr(4)
5081           .nr(8)
5082           .kr(1)
5083           .sr(1)
5084           .m(4)
5085           .n(n)
5086           .k(k)
5087           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5088       }
5089     }
5090   }
5091 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,n_gt_8_strided_cn)5092   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, n_gt_8_strided_cn) {
5093     TEST_REQUIRES_ARM_NEON_FMA;
5094     for (uint32_t n = 9; n < 16; n++) {
5095       for (size_t k = 1; k <= 20; k += 5) {
5096         GemmMicrokernelTester()
5097           .mr(4)
5098           .nr(8)
5099           .kr(1)
5100           .sr(1)
5101           .m(4)
5102           .n(n)
5103           .k(k)
5104           .cn_stride(11)
5105           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5106       }
5107     }
5108   }
5109 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,n_gt_8_strided_a)5110   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, n_gt_8_strided_a) {
5111     TEST_REQUIRES_ARM_NEON_FMA;
5112     for (uint32_t n = 9; n < 16; n++) {
5113       for (size_t k = 1; k <= 20; k += 5) {
5114         GemmMicrokernelTester()
5115           .mr(4)
5116           .nr(8)
5117           .kr(1)
5118           .sr(1)
5119           .m(4)
5120           .n(n)
5121           .k(k)
5122           .a_stride(23)
5123           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5124       }
5125     }
5126   }
5127 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,n_gt_8_subtile)5128   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, n_gt_8_subtile) {
5129     TEST_REQUIRES_ARM_NEON_FMA;
5130     for (uint32_t n = 9; n < 16; n++) {
5131       for (size_t k = 1; k <= 20; k += 5) {
5132         for (uint32_t m = 1; m <= 4; m++) {
5133           GemmMicrokernelTester()
5134             .mr(4)
5135             .nr(8)
5136             .kr(1)
5137             .sr(1)
5138             .m(m)
5139             .n(n)
5140             .k(k)
5141             .iterations(1)
5142             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5143         }
5144       }
5145     }
5146   }
5147 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,n_div_8)5148   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, n_div_8) {
5149     TEST_REQUIRES_ARM_NEON_FMA;
5150     for (uint32_t n = 16; n <= 24; n += 8) {
5151       for (size_t k = 1; k <= 20; k += 5) {
5152         GemmMicrokernelTester()
5153           .mr(4)
5154           .nr(8)
5155           .kr(1)
5156           .sr(1)
5157           .m(4)
5158           .n(n)
5159           .k(k)
5160           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5161       }
5162     }
5163   }
5164 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,n_div_8_strided_cn)5165   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, n_div_8_strided_cn) {
5166     TEST_REQUIRES_ARM_NEON_FMA;
5167     for (uint32_t n = 16; n <= 24; n += 8) {
5168       for (size_t k = 1; k <= 20; k += 5) {
5169         GemmMicrokernelTester()
5170           .mr(4)
5171           .nr(8)
5172           .kr(1)
5173           .sr(1)
5174           .m(4)
5175           .n(n)
5176           .k(k)
5177           .cn_stride(11)
5178           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5179       }
5180     }
5181   }
5182 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,n_div_8_strided_a)5183   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, n_div_8_strided_a) {
5184     TEST_REQUIRES_ARM_NEON_FMA;
5185     for (uint32_t n = 16; n <= 24; n += 8) {
5186       for (size_t k = 1; k <= 20; k += 5) {
5187         GemmMicrokernelTester()
5188           .mr(4)
5189           .nr(8)
5190           .kr(1)
5191           .sr(1)
5192           .m(4)
5193           .n(n)
5194           .k(k)
5195           .a_stride(23)
5196           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5197       }
5198     }
5199   }
5200 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,n_div_8_subtile)5201   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, n_div_8_subtile) {
5202     TEST_REQUIRES_ARM_NEON_FMA;
5203     for (uint32_t n = 16; n <= 24; n += 8) {
5204       for (size_t k = 1; k <= 20; k += 5) {
5205         for (uint32_t m = 1; m <= 4; m++) {
5206           GemmMicrokernelTester()
5207             .mr(4)
5208             .nr(8)
5209             .kr(1)
5210             .sr(1)
5211             .m(m)
5212             .n(n)
5213             .k(k)
5214             .iterations(1)
5215             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5216         }
5217       }
5218     }
5219   }
5220 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,strided_cm_subtile)5221   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, strided_cm_subtile) {
5222     TEST_REQUIRES_ARM_NEON_FMA;
5223     for (size_t k = 1; k <= 20; k += 5) {
5224       for (uint32_t n = 1; n <= 8; n++) {
5225         for (uint32_t m = 1; m <= 4; m++) {
5226           GemmMicrokernelTester()
5227             .mr(4)
5228             .nr(8)
5229             .kr(1)
5230             .sr(1)
5231             .m(m)
5232             .n(n)
5233             .k(k)
5234             .cm_stride(11)
5235             .iterations(1)
5236             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5237         }
5238       }
5239     }
5240   }
5241 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,qmin)5242   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, qmin) {
5243     TEST_REQUIRES_ARM_NEON_FMA;
5244     GemmMicrokernelTester()
5245       .mr(4)
5246       .nr(8)
5247       .kr(1)
5248       .sr(1)
5249       .m(4)
5250       .n(8)
5251       .k(4)
5252       .qmin(128)
5253       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5254   }
5255 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,qmax)5256   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, qmax) {
5257     TEST_REQUIRES_ARM_NEON_FMA;
5258     GemmMicrokernelTester()
5259       .mr(4)
5260       .nr(8)
5261       .kr(1)
5262       .sr(1)
5263       .m(4)
5264       .n(8)
5265       .k(4)
5266       .qmax(128)
5267       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5268   }
5269 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128,strided_cm)5270   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_LD128, strided_cm) {
5271     TEST_REQUIRES_ARM_NEON_FMA;
5272     GemmMicrokernelTester()
5273       .mr(4)
5274       .nr(8)
5275       .kr(1)
5276       .sr(1)
5277       .m(4)
5278       .n(8)
5279       .k(4)
5280       .cm_stride(11)
5281       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_ld128, xnn_init_f32_minmax_scalar_params);
5282   }
5283 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
5284 
5285 
5286 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_8)5287   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_8) {
5288     TEST_REQUIRES_ARM_NEON_FMA;
5289     GemmMicrokernelTester()
5290       .mr(4)
5291       .nr(8)
5292       .kr(1)
5293       .sr(1)
5294       .m(4)
5295       .n(8)
5296       .k(8)
5297       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5298   }
5299 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,strided_cn)5300   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, strided_cn) {
5301     TEST_REQUIRES_ARM_NEON_FMA;
5302     GemmMicrokernelTester()
5303       .mr(4)
5304       .nr(8)
5305       .kr(1)
5306       .sr(1)
5307       .m(4)
5308       .n(8)
5309       .k(8)
5310       .cn_stride(11)
5311       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5312   }
5313 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_8_strided_a)5314   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_8_strided_a) {
5315     TEST_REQUIRES_ARM_NEON_FMA;
5316     GemmMicrokernelTester()
5317       .mr(4)
5318       .nr(8)
5319       .kr(1)
5320       .sr(1)
5321       .m(4)
5322       .n(8)
5323       .k(8)
5324       .a_stride(11)
5325       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5326   }
5327 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_8_subtile)5328   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_8_subtile) {
5329     TEST_REQUIRES_ARM_NEON_FMA;
5330     for (uint32_t n = 1; n <= 8; n++) {
5331       for (uint32_t m = 1; m <= 4; m++) {
5332         GemmMicrokernelTester()
5333           .mr(4)
5334           .nr(8)
5335           .kr(1)
5336           .sr(1)
5337           .m(m)
5338           .n(n)
5339           .k(8)
5340           .iterations(1)
5341           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5342       }
5343     }
5344   }
5345 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_8_subtile_m)5346   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_8_subtile_m) {
5347     TEST_REQUIRES_ARM_NEON_FMA;
5348     for (uint32_t m = 1; m <= 4; m++) {
5349       GemmMicrokernelTester()
5350         .mr(4)
5351         .nr(8)
5352         .kr(1)
5353         .sr(1)
5354         .m(m)
5355         .n(8)
5356         .k(8)
5357         .iterations(1)
5358         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5359     }
5360   }
5361 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_8_subtile_n)5362   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_8_subtile_n) {
5363     TEST_REQUIRES_ARM_NEON_FMA;
5364     for (uint32_t n = 1; n <= 8; n++) {
5365       GemmMicrokernelTester()
5366         .mr(4)
5367         .nr(8)
5368         .kr(1)
5369         .sr(1)
5370         .m(4)
5371         .n(n)
5372         .k(8)
5373         .iterations(1)
5374         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5375     }
5376   }
5377 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_16)5378   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_16) {
5379     TEST_REQUIRES_ARM_NEON_FMA;
5380     GemmMicrokernelTester()
5381       .mr(4)
5382       .nr(8)
5383       .kr(1)
5384       .sr(1)
5385       .m(4)
5386       .n(8)
5387       .k(16)
5388       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5389   }
5390 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_16_strided_a)5391   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_16_strided_a) {
5392     TEST_REQUIRES_ARM_NEON_FMA;
5393     GemmMicrokernelTester()
5394       .mr(4)
5395       .nr(8)
5396       .kr(1)
5397       .sr(1)
5398       .m(4)
5399       .n(8)
5400       .k(16)
5401       .a_stride(19)
5402       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5403   }
5404 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_eq_16_subtile)5405   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_eq_16_subtile) {
5406     TEST_REQUIRES_ARM_NEON_FMA;
5407     for (uint32_t n = 1; n <= 8; n++) {
5408       for (uint32_t m = 1; m <= 4; m++) {
5409         GemmMicrokernelTester()
5410           .mr(4)
5411           .nr(8)
5412           .kr(1)
5413           .sr(1)
5414           .m(m)
5415           .n(n)
5416           .k(16)
5417           .iterations(1)
5418           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5419       }
5420     }
5421   }
5422 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_lt_16)5423   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_lt_16) {
5424     TEST_REQUIRES_ARM_NEON_FMA;
5425     for (size_t k = 1; k < 16; k++) {
5426       GemmMicrokernelTester()
5427         .mr(4)
5428         .nr(8)
5429         .kr(1)
5430         .sr(1)
5431         .m(4)
5432         .n(8)
5433         .k(k)
5434         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5435     }
5436   }
5437 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_lt_16_strided_a)5438   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_lt_16_strided_a) {
5439     TEST_REQUIRES_ARM_NEON_FMA;
5440     for (size_t k = 1; k < 16; k++) {
5441       GemmMicrokernelTester()
5442         .mr(4)
5443         .nr(8)
5444         .kr(1)
5445         .sr(1)
5446         .m(4)
5447         .n(8)
5448         .k(k)
5449         .a_stride(19)
5450         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5451     }
5452   }
5453 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_lt_16_subtile)5454   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_lt_16_subtile) {
5455     TEST_REQUIRES_ARM_NEON_FMA;
5456     for (size_t k = 1; k < 16; k++) {
5457       for (uint32_t n = 1; n <= 8; n++) {
5458         for (uint32_t m = 1; m <= 4; m++) {
5459           GemmMicrokernelTester()
5460             .mr(4)
5461             .nr(8)
5462             .kr(1)
5463             .sr(1)
5464             .m(m)
5465             .n(n)
5466             .k(k)
5467             .iterations(1)
5468             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5469         }
5470       }
5471     }
5472   }
5473 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_gt_16)5474   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_gt_16) {
5475     TEST_REQUIRES_ARM_NEON_FMA;
5476     for (size_t k = 17; k < 32; k++) {
5477       GemmMicrokernelTester()
5478         .mr(4)
5479         .nr(8)
5480         .kr(1)
5481         .sr(1)
5482         .m(4)
5483         .n(8)
5484         .k(k)
5485         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5486     }
5487   }
5488 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_gt_16_strided_a)5489   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_gt_16_strided_a) {
5490     TEST_REQUIRES_ARM_NEON_FMA;
5491     for (size_t k = 17; k < 32; k++) {
5492       GemmMicrokernelTester()
5493         .mr(4)
5494         .nr(8)
5495         .kr(1)
5496         .sr(1)
5497         .m(4)
5498         .n(8)
5499         .k(k)
5500         .a_stride(37)
5501         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5502     }
5503   }
5504 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_gt_16_subtile)5505   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_gt_16_subtile) {
5506     TEST_REQUIRES_ARM_NEON_FMA;
5507     for (size_t k = 17; k < 32; k++) {
5508       for (uint32_t n = 1; n <= 8; n++) {
5509         for (uint32_t m = 1; m <= 4; m++) {
5510           GemmMicrokernelTester()
5511             .mr(4)
5512             .nr(8)
5513             .kr(1)
5514             .sr(1)
5515             .m(m)
5516             .n(n)
5517             .k(k)
5518             .iterations(1)
5519             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5520         }
5521       }
5522     }
5523   }
5524 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_div_8)5525   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_div_8) {
5526     TEST_REQUIRES_ARM_NEON_FMA;
5527     for (size_t k = 24; k <= 80; k += 8) {
5528       GemmMicrokernelTester()
5529         .mr(4)
5530         .nr(8)
5531         .kr(1)
5532         .sr(1)
5533         .m(4)
5534         .n(8)
5535         .k(k)
5536         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5537     }
5538   }
5539 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_div_8_strided_a)5540   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_div_8_strided_a) {
5541     TEST_REQUIRES_ARM_NEON_FMA;
5542     for (size_t k = 24; k <= 80; k += 8) {
5543       GemmMicrokernelTester()
5544         .mr(4)
5545         .nr(8)
5546         .kr(1)
5547         .sr(1)
5548         .m(4)
5549         .n(8)
5550         .k(k)
5551         .a_stride(83)
5552         .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5553     }
5554   }
5555 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,k_div_8_subtile)5556   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, k_div_8_subtile) {
5557     TEST_REQUIRES_ARM_NEON_FMA;
5558     for (size_t k = 24; k <= 80; k += 8) {
5559       for (uint32_t n = 1; n <= 8; n++) {
5560         for (uint32_t m = 1; m <= 4; m++) {
5561           GemmMicrokernelTester()
5562             .mr(4)
5563             .nr(8)
5564             .kr(1)
5565             .sr(1)
5566             .m(m)
5567             .n(n)
5568             .k(k)
5569             .iterations(1)
5570             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5571         }
5572       }
5573     }
5574   }
5575 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_gt_8)5576   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_gt_8) {
5577     TEST_REQUIRES_ARM_NEON_FMA;
5578     for (uint32_t n = 9; n < 16; n++) {
5579       for (size_t k = 1; k <= 40; k += 9) {
5580         GemmMicrokernelTester()
5581           .mr(4)
5582           .nr(8)
5583           .kr(1)
5584           .sr(1)
5585           .m(4)
5586           .n(n)
5587           .k(k)
5588           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5589       }
5590     }
5591   }
5592 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_gt_8_strided_cn)5593   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_gt_8_strided_cn) {
5594     TEST_REQUIRES_ARM_NEON_FMA;
5595     for (uint32_t n = 9; n < 16; n++) {
5596       for (size_t k = 1; k <= 40; k += 9) {
5597         GemmMicrokernelTester()
5598           .mr(4)
5599           .nr(8)
5600           .kr(1)
5601           .sr(1)
5602           .m(4)
5603           .n(n)
5604           .k(k)
5605           .cn_stride(11)
5606           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5607       }
5608     }
5609   }
5610 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_gt_8_strided_a)5611   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_gt_8_strided_a) {
5612     TEST_REQUIRES_ARM_NEON_FMA;
5613     for (uint32_t n = 9; n < 16; n++) {
5614       for (size_t k = 1; k <= 40; k += 9) {
5615         GemmMicrokernelTester()
5616           .mr(4)
5617           .nr(8)
5618           .kr(1)
5619           .sr(1)
5620           .m(4)
5621           .n(n)
5622           .k(k)
5623           .a_stride(43)
5624           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5625       }
5626     }
5627   }
5628 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_gt_8_subtile)5629   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_gt_8_subtile) {
5630     TEST_REQUIRES_ARM_NEON_FMA;
5631     for (uint32_t n = 9; n < 16; n++) {
5632       for (size_t k = 1; k <= 40; k += 9) {
5633         for (uint32_t m = 1; m <= 4; m++) {
5634           GemmMicrokernelTester()
5635             .mr(4)
5636             .nr(8)
5637             .kr(1)
5638             .sr(1)
5639             .m(m)
5640             .n(n)
5641             .k(k)
5642             .iterations(1)
5643             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5644         }
5645       }
5646     }
5647   }
5648 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_div_8)5649   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_div_8) {
5650     TEST_REQUIRES_ARM_NEON_FMA;
5651     for (uint32_t n = 16; n <= 24; n += 8) {
5652       for (size_t k = 1; k <= 40; k += 9) {
5653         GemmMicrokernelTester()
5654           .mr(4)
5655           .nr(8)
5656           .kr(1)
5657           .sr(1)
5658           .m(4)
5659           .n(n)
5660           .k(k)
5661           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5662       }
5663     }
5664   }
5665 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_div_8_strided_cn)5666   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_div_8_strided_cn) {
5667     TEST_REQUIRES_ARM_NEON_FMA;
5668     for (uint32_t n = 16; n <= 24; n += 8) {
5669       for (size_t k = 1; k <= 40; k += 9) {
5670         GemmMicrokernelTester()
5671           .mr(4)
5672           .nr(8)
5673           .kr(1)
5674           .sr(1)
5675           .m(4)
5676           .n(n)
5677           .k(k)
5678           .cn_stride(11)
5679           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5680       }
5681     }
5682   }
5683 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_div_8_strided_a)5684   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_div_8_strided_a) {
5685     TEST_REQUIRES_ARM_NEON_FMA;
5686     for (uint32_t n = 16; n <= 24; n += 8) {
5687       for (size_t k = 1; k <= 40; k += 9) {
5688         GemmMicrokernelTester()
5689           .mr(4)
5690           .nr(8)
5691           .kr(1)
5692           .sr(1)
5693           .m(4)
5694           .n(n)
5695           .k(k)
5696           .a_stride(43)
5697           .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5698       }
5699     }
5700   }
5701 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,n_div_8_subtile)5702   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, n_div_8_subtile) {
5703     TEST_REQUIRES_ARM_NEON_FMA;
5704     for (uint32_t n = 16; n <= 24; n += 8) {
5705       for (size_t k = 1; k <= 40; k += 9) {
5706         for (uint32_t m = 1; m <= 4; m++) {
5707           GemmMicrokernelTester()
5708             .mr(4)
5709             .nr(8)
5710             .kr(1)
5711             .sr(1)
5712             .m(m)
5713             .n(n)
5714             .k(k)
5715             .iterations(1)
5716             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5717         }
5718       }
5719     }
5720   }
5721 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,strided_cm_subtile)5722   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, strided_cm_subtile) {
5723     TEST_REQUIRES_ARM_NEON_FMA;
5724     for (size_t k = 1; k <= 40; k += 9) {
5725       for (uint32_t n = 1; n <= 8; n++) {
5726         for (uint32_t m = 1; m <= 4; m++) {
5727           GemmMicrokernelTester()
5728             .mr(4)
5729             .nr(8)
5730             .kr(1)
5731             .sr(1)
5732             .m(m)
5733             .n(n)
5734             .k(k)
5735             .cm_stride(11)
5736             .iterations(1)
5737             .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5738         }
5739       }
5740     }
5741   }
5742 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,qmin)5743   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, qmin) {
5744     TEST_REQUIRES_ARM_NEON_FMA;
5745     GemmMicrokernelTester()
5746       .mr(4)
5747       .nr(8)
5748       .kr(1)
5749       .sr(1)
5750       .m(4)
5751       .n(8)
5752       .k(8)
5753       .qmin(128)
5754       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5755   }
5756 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,qmax)5757   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, qmax) {
5758     TEST_REQUIRES_ARM_NEON_FMA;
5759     GemmMicrokernelTester()
5760       .mr(4)
5761       .nr(8)
5762       .kr(1)
5763       .sr(1)
5764       .m(4)
5765       .n(8)
5766       .k(8)
5767       .qmax(128)
5768       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5769   }
5770 
TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75,strided_cm)5771   TEST(F32_GEMM_MINMAX_4X8__AARCH64_NEONFMA_PRFM_CORTEX_A75, strided_cm) {
5772     TEST_REQUIRES_ARM_NEON_FMA;
5773     GemmMicrokernelTester()
5774       .mr(4)
5775       .nr(8)
5776       .kr(1)
5777       .sr(1)
5778       .m(4)
5779       .n(8)
5780       .k(8)
5781       .cm_stride(11)
5782       .Test(xnn_f32_gemm_minmax_ukernel_4x8__aarch64_neonfma_prfm_cortex_a75, xnn_init_f32_minmax_scalar_params);
5783   }
5784 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
5785 
5786 
5787 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_4)5788   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_4) {
5789     TEST_REQUIRES_ARM_NEON_FMA;
5790     GemmMicrokernelTester()
5791       .mr(4)
5792       .nr(12)
5793       .kr(1)
5794       .sr(1)
5795       .m(4)
5796       .n(12)
5797       .k(4)
5798       .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5799   }
5800 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,strided_cn)5801   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, strided_cn) {
5802     TEST_REQUIRES_ARM_NEON_FMA;
5803     GemmMicrokernelTester()
5804       .mr(4)
5805       .nr(12)
5806       .kr(1)
5807       .sr(1)
5808       .m(4)
5809       .n(12)
5810       .k(4)
5811       .cn_stride(17)
5812       .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5813   }
5814 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_strided_a)5815   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_strided_a) {
5816     TEST_REQUIRES_ARM_NEON_FMA;
5817     GemmMicrokernelTester()
5818       .mr(4)
5819       .nr(12)
5820       .kr(1)
5821       .sr(1)
5822       .m(4)
5823       .n(12)
5824       .k(4)
5825       .a_stride(7)
5826       .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5827   }
5828 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile)5829   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile) {
5830     TEST_REQUIRES_ARM_NEON_FMA;
5831     for (uint32_t n = 1; n <= 12; n++) {
5832       for (uint32_t m = 1; m <= 4; m++) {
5833         GemmMicrokernelTester()
5834           .mr(4)
5835           .nr(12)
5836           .kr(1)
5837           .sr(1)
5838           .m(m)
5839           .n(n)
5840           .k(4)
5841           .iterations(1)
5842           .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5843       }
5844     }
5845   }
5846 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile_m)5847   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile_m) {
5848     TEST_REQUIRES_ARM_NEON_FMA;
5849     for (uint32_t m = 1; m <= 4; m++) {
5850       GemmMicrokernelTester()
5851         .mr(4)
5852         .nr(12)
5853         .kr(1)
5854         .sr(1)
5855         .m(m)
5856         .n(12)
5857         .k(4)
5858         .iterations(1)
5859         .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5860     }
5861   }
5862 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile_n)5863   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile_n) {
5864     TEST_REQUIRES_ARM_NEON_FMA;
5865     for (uint32_t n = 1; n <= 12; n++) {
5866       GemmMicrokernelTester()
5867         .mr(4)
5868         .nr(12)
5869         .kr(1)
5870         .sr(1)
5871         .m(4)
5872         .n(n)
5873         .k(4)
5874         .iterations(1)
5875         .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5876     }
5877   }
5878 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_8)5879   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_8) {
5880     TEST_REQUIRES_ARM_NEON_FMA;
5881     GemmMicrokernelTester()
5882       .mr(4)
5883       .nr(12)
5884       .kr(1)
5885       .sr(1)
5886       .m(4)
5887       .n(12)
5888       .k(8)
5889       .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5890   }
5891 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_8_strided_a)5892   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_8_strided_a) {
5893     TEST_REQUIRES_ARM_NEON_FMA;
5894     GemmMicrokernelTester()
5895       .mr(4)
5896       .nr(12)
5897       .kr(1)
5898       .sr(1)
5899       .m(4)
5900       .n(12)
5901       .k(8)
5902       .a_stride(11)
5903       .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5904   }
5905 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_eq_8_subtile)5906   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_eq_8_subtile) {
5907     TEST_REQUIRES_ARM_NEON_FMA;
5908     for (uint32_t n = 1; n <= 12; n++) {
5909       for (uint32_t m = 1; m <= 4; m++) {
5910         GemmMicrokernelTester()
5911           .mr(4)
5912           .nr(12)
5913           .kr(1)
5914           .sr(1)
5915           .m(m)
5916           .n(n)
5917           .k(8)
5918           .iterations(1)
5919           .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5920       }
5921     }
5922   }
5923 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_lt_8)5924   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_lt_8) {
5925     TEST_REQUIRES_ARM_NEON_FMA;
5926     for (size_t k = 1; k < 8; k++) {
5927       GemmMicrokernelTester()
5928         .mr(4)
5929         .nr(12)
5930         .kr(1)
5931         .sr(1)
5932         .m(4)
5933         .n(12)
5934         .k(k)
5935         .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5936     }
5937   }
5938 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_lt_8_strided_a)5939   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_lt_8_strided_a) {
5940     TEST_REQUIRES_ARM_NEON_FMA;
5941     for (size_t k = 1; k < 8; k++) {
5942       GemmMicrokernelTester()
5943         .mr(4)
5944         .nr(12)
5945         .kr(1)
5946         .sr(1)
5947         .m(4)
5948         .n(12)
5949         .k(k)
5950         .a_stride(11)
5951         .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5952     }
5953   }
5954 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_lt_8_subtile)5955   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_lt_8_subtile) {
5956     TEST_REQUIRES_ARM_NEON_FMA;
5957     for (size_t k = 1; k < 8; k++) {
5958       for (uint32_t n = 1; n <= 12; n++) {
5959         for (uint32_t m = 1; m <= 4; m++) {
5960           GemmMicrokernelTester()
5961             .mr(4)
5962             .nr(12)
5963             .kr(1)
5964             .sr(1)
5965             .m(m)
5966             .n(n)
5967             .k(k)
5968             .iterations(1)
5969             .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5970         }
5971       }
5972     }
5973   }
5974 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_gt_8)5975   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_gt_8) {
5976     TEST_REQUIRES_ARM_NEON_FMA;
5977     for (size_t k = 9; k < 16; k++) {
5978       GemmMicrokernelTester()
5979         .mr(4)
5980         .nr(12)
5981         .kr(1)
5982         .sr(1)
5983         .m(4)
5984         .n(12)
5985         .k(k)
5986         .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
5987     }
5988   }
5989 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_gt_8_strided_a)5990   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_gt_8_strided_a) {
5991     TEST_REQUIRES_ARM_NEON_FMA;
5992     for (size_t k = 9; k < 16; k++) {
5993       GemmMicrokernelTester()
5994         .mr(4)
5995         .nr(12)
5996         .kr(1)
5997         .sr(1)
5998         .m(4)
5999         .n(12)
6000         .k(k)
6001         .a_stride(19)
6002         .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6003     }
6004   }
6005 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_gt_8_subtile)6006   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_gt_8_subtile) {
6007     TEST_REQUIRES_ARM_NEON_FMA;
6008     for (size_t k = 9; k < 16; k++) {
6009       for (uint32_t n = 1; n <= 12; n++) {
6010         for (uint32_t m = 1; m <= 4; m++) {
6011           GemmMicrokernelTester()
6012             .mr(4)
6013             .nr(12)
6014             .kr(1)
6015             .sr(1)
6016             .m(m)
6017             .n(n)
6018             .k(k)
6019             .iterations(1)
6020             .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6021         }
6022       }
6023     }
6024   }
6025 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_div_4)6026   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_div_4) {
6027     TEST_REQUIRES_ARM_NEON_FMA;
6028     for (size_t k = 12; k <= 40; k += 4) {
6029       GemmMicrokernelTester()
6030         .mr(4)
6031         .nr(12)
6032         .kr(1)
6033         .sr(1)
6034         .m(4)
6035         .n(12)
6036         .k(k)
6037         .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6038     }
6039   }
6040 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_div_4_strided_a)6041   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_div_4_strided_a) {
6042     TEST_REQUIRES_ARM_NEON_FMA;
6043     for (size_t k = 12; k <= 40; k += 4) {
6044       GemmMicrokernelTester()
6045         .mr(4)
6046         .nr(12)
6047         .kr(1)
6048         .sr(1)
6049         .m(4)
6050         .n(12)
6051         .k(k)
6052         .a_stride(43)
6053         .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6054     }
6055   }
6056 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,k_div_4_subtile)6057   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, k_div_4_subtile) {
6058     TEST_REQUIRES_ARM_NEON_FMA;
6059     for (size_t k = 12; k <= 40; k += 4) {
6060       for (uint32_t n = 1; n <= 12; n++) {
6061         for (uint32_t m = 1; m <= 4; m++) {
6062           GemmMicrokernelTester()
6063             .mr(4)
6064             .nr(12)
6065             .kr(1)
6066             .sr(1)
6067             .m(m)
6068             .n(n)
6069             .k(k)
6070             .iterations(1)
6071             .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6072         }
6073       }
6074     }
6075   }
6076 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,n_gt_12)6077   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, n_gt_12) {
6078     TEST_REQUIRES_ARM_NEON_FMA;
6079     for (uint32_t n = 13; n < 24; n++) {
6080       for (size_t k = 1; k <= 20; k += 5) {
6081         GemmMicrokernelTester()
6082           .mr(4)
6083           .nr(12)
6084           .kr(1)
6085           .sr(1)
6086           .m(4)
6087           .n(n)
6088           .k(k)
6089           .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6090       }
6091     }
6092   }
6093 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,n_gt_12_strided_cn)6094   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, n_gt_12_strided_cn) {
6095     TEST_REQUIRES_ARM_NEON_FMA;
6096     for (uint32_t n = 13; n < 24; n++) {
6097       for (size_t k = 1; k <= 20; k += 5) {
6098         GemmMicrokernelTester()
6099           .mr(4)
6100           .nr(12)
6101           .kr(1)
6102           .sr(1)
6103           .m(4)
6104           .n(n)
6105           .k(k)
6106           .cn_stride(17)
6107           .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6108       }
6109     }
6110   }
6111 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,n_gt_12_strided_a)6112   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, n_gt_12_strided_a) {
6113     TEST_REQUIRES_ARM_NEON_FMA;
6114     for (uint32_t n = 13; n < 24; n++) {
6115       for (size_t k = 1; k <= 20; k += 5) {
6116         GemmMicrokernelTester()
6117           .mr(4)
6118           .nr(12)
6119           .kr(1)
6120           .sr(1)
6121           .m(4)
6122           .n(n)
6123           .k(k)
6124           .a_stride(23)
6125           .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6126       }
6127     }
6128   }
6129 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,n_gt_12_subtile)6130   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, n_gt_12_subtile) {
6131     TEST_REQUIRES_ARM_NEON_FMA;
6132     for (uint32_t n = 13; n < 24; n++) {
6133       for (size_t k = 1; k <= 20; k += 5) {
6134         for (uint32_t m = 1; m <= 4; m++) {
6135           GemmMicrokernelTester()
6136             .mr(4)
6137             .nr(12)
6138             .kr(1)
6139             .sr(1)
6140             .m(m)
6141             .n(n)
6142             .k(k)
6143             .iterations(1)
6144             .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6145         }
6146       }
6147     }
6148   }
6149 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,n_div_12)6150   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, n_div_12) {
6151     TEST_REQUIRES_ARM_NEON_FMA;
6152     for (uint32_t n = 24; n <= 36; n += 12) {
6153       for (size_t k = 1; k <= 20; k += 5) {
6154         GemmMicrokernelTester()
6155           .mr(4)
6156           .nr(12)
6157           .kr(1)
6158           .sr(1)
6159           .m(4)
6160           .n(n)
6161           .k(k)
6162           .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6163       }
6164     }
6165   }
6166 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,n_div_12_strided_cn)6167   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, n_div_12_strided_cn) {
6168     TEST_REQUIRES_ARM_NEON_FMA;
6169     for (uint32_t n = 24; n <= 36; n += 12) {
6170       for (size_t k = 1; k <= 20; k += 5) {
6171         GemmMicrokernelTester()
6172           .mr(4)
6173           .nr(12)
6174           .kr(1)
6175           .sr(1)
6176           .m(4)
6177           .n(n)
6178           .k(k)
6179           .cn_stride(17)
6180           .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6181       }
6182     }
6183   }
6184 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,n_div_12_strided_a)6185   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, n_div_12_strided_a) {
6186     TEST_REQUIRES_ARM_NEON_FMA;
6187     for (uint32_t n = 24; n <= 36; n += 12) {
6188       for (size_t k = 1; k <= 20; k += 5) {
6189         GemmMicrokernelTester()
6190           .mr(4)
6191           .nr(12)
6192           .kr(1)
6193           .sr(1)
6194           .m(4)
6195           .n(n)
6196           .k(k)
6197           .a_stride(23)
6198           .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6199       }
6200     }
6201   }
6202 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,n_div_12_subtile)6203   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, n_div_12_subtile) {
6204     TEST_REQUIRES_ARM_NEON_FMA;
6205     for (uint32_t n = 24; n <= 36; n += 12) {
6206       for (size_t k = 1; k <= 20; k += 5) {
6207         for (uint32_t m = 1; m <= 4; m++) {
6208           GemmMicrokernelTester()
6209             .mr(4)
6210             .nr(12)
6211             .kr(1)
6212             .sr(1)
6213             .m(m)
6214             .n(n)
6215             .k(k)
6216             .iterations(1)
6217             .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6218         }
6219       }
6220     }
6221   }
6222 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,strided_cm_subtile)6223   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, strided_cm_subtile) {
6224     TEST_REQUIRES_ARM_NEON_FMA;
6225     for (size_t k = 1; k <= 20; k += 5) {
6226       for (uint32_t n = 1; n <= 12; n++) {
6227         for (uint32_t m = 1; m <= 4; m++) {
6228           GemmMicrokernelTester()
6229             .mr(4)
6230             .nr(12)
6231             .kr(1)
6232             .sr(1)
6233             .m(m)
6234             .n(n)
6235             .k(k)
6236             .cm_stride(17)
6237             .iterations(1)
6238             .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6239         }
6240       }
6241     }
6242   }
6243 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,qmin)6244   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, qmin) {
6245     TEST_REQUIRES_ARM_NEON_FMA;
6246     GemmMicrokernelTester()
6247       .mr(4)
6248       .nr(12)
6249       .kr(1)
6250       .sr(1)
6251       .m(4)
6252       .n(12)
6253       .k(4)
6254       .qmin(128)
6255       .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6256   }
6257 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,qmax)6258   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, qmax) {
6259     TEST_REQUIRES_ARM_NEON_FMA;
6260     GemmMicrokernelTester()
6261       .mr(4)
6262       .nr(12)
6263       .kr(1)
6264       .sr(1)
6265       .m(4)
6266       .n(12)
6267       .k(4)
6268       .qmax(128)
6269       .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6270   }
6271 
TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53,strided_cm)6272   TEST(F32_GEMM_MINMAX_4X12__AARCH64_NEONFMA_CORTEX_A53, strided_cm) {
6273     TEST_REQUIRES_ARM_NEON_FMA;
6274     GemmMicrokernelTester()
6275       .mr(4)
6276       .nr(12)
6277       .kr(1)
6278       .sr(1)
6279       .m(4)
6280       .n(12)
6281       .k(4)
6282       .cm_stride(17)
6283       .Test(xnn_f32_gemm_minmax_ukernel_4x12__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6284   }
6285 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
6286 
6287 
6288 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8)6289   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8) {
6290     TEST_REQUIRES_ARM_NEON_FMA;
6291     GemmMicrokernelTester()
6292       .mr(5)
6293       .nr(8)
6294       .kr(1)
6295       .sr(1)
6296       .m(5)
6297       .n(8)
6298       .k(8)
6299       .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6300   }
6301 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,strided_cn)6302   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, strided_cn) {
6303     TEST_REQUIRES_ARM_NEON_FMA;
6304     GemmMicrokernelTester()
6305       .mr(5)
6306       .nr(8)
6307       .kr(1)
6308       .sr(1)
6309       .m(5)
6310       .n(8)
6311       .k(8)
6312       .cn_stride(11)
6313       .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6314   }
6315 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_strided_a)6316   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_strided_a) {
6317     TEST_REQUIRES_ARM_NEON_FMA;
6318     GemmMicrokernelTester()
6319       .mr(5)
6320       .nr(8)
6321       .kr(1)
6322       .sr(1)
6323       .m(5)
6324       .n(8)
6325       .k(8)
6326       .a_stride(11)
6327       .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6328   }
6329 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile)6330   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile) {
6331     TEST_REQUIRES_ARM_NEON_FMA;
6332     for (uint32_t n = 1; n <= 8; n++) {
6333       for (uint32_t m = 1; m <= 5; m++) {
6334         GemmMicrokernelTester()
6335           .mr(5)
6336           .nr(8)
6337           .kr(1)
6338           .sr(1)
6339           .m(m)
6340           .n(n)
6341           .k(8)
6342           .iterations(1)
6343           .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6344       }
6345     }
6346   }
6347 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile_m)6348   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile_m) {
6349     TEST_REQUIRES_ARM_NEON_FMA;
6350     for (uint32_t m = 1; m <= 5; m++) {
6351       GemmMicrokernelTester()
6352         .mr(5)
6353         .nr(8)
6354         .kr(1)
6355         .sr(1)
6356         .m(m)
6357         .n(8)
6358         .k(8)
6359         .iterations(1)
6360         .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6361     }
6362   }
6363 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile_n)6364   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile_n) {
6365     TEST_REQUIRES_ARM_NEON_FMA;
6366     for (uint32_t n = 1; n <= 8; n++) {
6367       GemmMicrokernelTester()
6368         .mr(5)
6369         .nr(8)
6370         .kr(1)
6371         .sr(1)
6372         .m(5)
6373         .n(n)
6374         .k(8)
6375         .iterations(1)
6376         .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6377     }
6378   }
6379 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16)6380   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16) {
6381     TEST_REQUIRES_ARM_NEON_FMA;
6382     GemmMicrokernelTester()
6383       .mr(5)
6384       .nr(8)
6385       .kr(1)
6386       .sr(1)
6387       .m(5)
6388       .n(8)
6389       .k(16)
6390       .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6391   }
6392 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16_strided_a)6393   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16_strided_a) {
6394     TEST_REQUIRES_ARM_NEON_FMA;
6395     GemmMicrokernelTester()
6396       .mr(5)
6397       .nr(8)
6398       .kr(1)
6399       .sr(1)
6400       .m(5)
6401       .n(8)
6402       .k(16)
6403       .a_stride(19)
6404       .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6405   }
6406 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16_subtile)6407   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16_subtile) {
6408     TEST_REQUIRES_ARM_NEON_FMA;
6409     for (uint32_t n = 1; n <= 8; n++) {
6410       for (uint32_t m = 1; m <= 5; m++) {
6411         GemmMicrokernelTester()
6412           .mr(5)
6413           .nr(8)
6414           .kr(1)
6415           .sr(1)
6416           .m(m)
6417           .n(n)
6418           .k(16)
6419           .iterations(1)
6420           .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6421       }
6422     }
6423   }
6424 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16)6425   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16) {
6426     TEST_REQUIRES_ARM_NEON_FMA;
6427     for (size_t k = 1; k < 16; k++) {
6428       GemmMicrokernelTester()
6429         .mr(5)
6430         .nr(8)
6431         .kr(1)
6432         .sr(1)
6433         .m(5)
6434         .n(8)
6435         .k(k)
6436         .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6437     }
6438   }
6439 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16_strided_a)6440   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16_strided_a) {
6441     TEST_REQUIRES_ARM_NEON_FMA;
6442     for (size_t k = 1; k < 16; k++) {
6443       GemmMicrokernelTester()
6444         .mr(5)
6445         .nr(8)
6446         .kr(1)
6447         .sr(1)
6448         .m(5)
6449         .n(8)
6450         .k(k)
6451         .a_stride(19)
6452         .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6453     }
6454   }
6455 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16_subtile)6456   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16_subtile) {
6457     TEST_REQUIRES_ARM_NEON_FMA;
6458     for (size_t k = 1; k < 16; k++) {
6459       for (uint32_t n = 1; n <= 8; n++) {
6460         for (uint32_t m = 1; m <= 5; m++) {
6461           GemmMicrokernelTester()
6462             .mr(5)
6463             .nr(8)
6464             .kr(1)
6465             .sr(1)
6466             .m(m)
6467             .n(n)
6468             .k(k)
6469             .iterations(1)
6470             .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6471         }
6472       }
6473     }
6474   }
6475 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16)6476   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16) {
6477     TEST_REQUIRES_ARM_NEON_FMA;
6478     for (size_t k = 17; k < 32; k++) {
6479       GemmMicrokernelTester()
6480         .mr(5)
6481         .nr(8)
6482         .kr(1)
6483         .sr(1)
6484         .m(5)
6485         .n(8)
6486         .k(k)
6487         .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6488     }
6489   }
6490 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16_strided_a)6491   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16_strided_a) {
6492     TEST_REQUIRES_ARM_NEON_FMA;
6493     for (size_t k = 17; k < 32; k++) {
6494       GemmMicrokernelTester()
6495         .mr(5)
6496         .nr(8)
6497         .kr(1)
6498         .sr(1)
6499         .m(5)
6500         .n(8)
6501         .k(k)
6502         .a_stride(37)
6503         .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6504     }
6505   }
6506 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16_subtile)6507   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16_subtile) {
6508     TEST_REQUIRES_ARM_NEON_FMA;
6509     for (size_t k = 17; k < 32; k++) {
6510       for (uint32_t n = 1; n <= 8; n++) {
6511         for (uint32_t m = 1; m <= 5; m++) {
6512           GemmMicrokernelTester()
6513             .mr(5)
6514             .nr(8)
6515             .kr(1)
6516             .sr(1)
6517             .m(m)
6518             .n(n)
6519             .k(k)
6520             .iterations(1)
6521             .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6522         }
6523       }
6524     }
6525   }
6526 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8)6527   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8) {
6528     TEST_REQUIRES_ARM_NEON_FMA;
6529     for (size_t k = 24; k <= 80; k += 8) {
6530       GemmMicrokernelTester()
6531         .mr(5)
6532         .nr(8)
6533         .kr(1)
6534         .sr(1)
6535         .m(5)
6536         .n(8)
6537         .k(k)
6538         .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6539     }
6540   }
6541 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8_strided_a)6542   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8_strided_a) {
6543     TEST_REQUIRES_ARM_NEON_FMA;
6544     for (size_t k = 24; k <= 80; k += 8) {
6545       GemmMicrokernelTester()
6546         .mr(5)
6547         .nr(8)
6548         .kr(1)
6549         .sr(1)
6550         .m(5)
6551         .n(8)
6552         .k(k)
6553         .a_stride(83)
6554         .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6555     }
6556   }
6557 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8_subtile)6558   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8_subtile) {
6559     TEST_REQUIRES_ARM_NEON_FMA;
6560     for (size_t k = 24; k <= 80; k += 8) {
6561       for (uint32_t n = 1; n <= 8; n++) {
6562         for (uint32_t m = 1; m <= 5; m++) {
6563           GemmMicrokernelTester()
6564             .mr(5)
6565             .nr(8)
6566             .kr(1)
6567             .sr(1)
6568             .m(m)
6569             .n(n)
6570             .k(k)
6571             .iterations(1)
6572             .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6573         }
6574       }
6575     }
6576   }
6577 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8)6578   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8) {
6579     TEST_REQUIRES_ARM_NEON_FMA;
6580     for (uint32_t n = 9; n < 16; n++) {
6581       for (size_t k = 1; k <= 40; k += 9) {
6582         GemmMicrokernelTester()
6583           .mr(5)
6584           .nr(8)
6585           .kr(1)
6586           .sr(1)
6587           .m(5)
6588           .n(n)
6589           .k(k)
6590           .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6591       }
6592     }
6593   }
6594 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_strided_cn)6595   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_strided_cn) {
6596     TEST_REQUIRES_ARM_NEON_FMA;
6597     for (uint32_t n = 9; n < 16; n++) {
6598       for (size_t k = 1; k <= 40; k += 9) {
6599         GemmMicrokernelTester()
6600           .mr(5)
6601           .nr(8)
6602           .kr(1)
6603           .sr(1)
6604           .m(5)
6605           .n(n)
6606           .k(k)
6607           .cn_stride(11)
6608           .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6609       }
6610     }
6611   }
6612 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_strided_a)6613   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_strided_a) {
6614     TEST_REQUIRES_ARM_NEON_FMA;
6615     for (uint32_t n = 9; n < 16; n++) {
6616       for (size_t k = 1; k <= 40; k += 9) {
6617         GemmMicrokernelTester()
6618           .mr(5)
6619           .nr(8)
6620           .kr(1)
6621           .sr(1)
6622           .m(5)
6623           .n(n)
6624           .k(k)
6625           .a_stride(43)
6626           .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6627       }
6628     }
6629   }
6630 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_subtile)6631   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_subtile) {
6632     TEST_REQUIRES_ARM_NEON_FMA;
6633     for (uint32_t n = 9; n < 16; n++) {
6634       for (size_t k = 1; k <= 40; k += 9) {
6635         for (uint32_t m = 1; m <= 5; m++) {
6636           GemmMicrokernelTester()
6637             .mr(5)
6638             .nr(8)
6639             .kr(1)
6640             .sr(1)
6641             .m(m)
6642             .n(n)
6643             .k(k)
6644             .iterations(1)
6645             .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6646         }
6647       }
6648     }
6649   }
6650 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8)6651   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8) {
6652     TEST_REQUIRES_ARM_NEON_FMA;
6653     for (uint32_t n = 16; n <= 24; n += 8) {
6654       for (size_t k = 1; k <= 40; k += 9) {
6655         GemmMicrokernelTester()
6656           .mr(5)
6657           .nr(8)
6658           .kr(1)
6659           .sr(1)
6660           .m(5)
6661           .n(n)
6662           .k(k)
6663           .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6664       }
6665     }
6666   }
6667 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_strided_cn)6668   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_strided_cn) {
6669     TEST_REQUIRES_ARM_NEON_FMA;
6670     for (uint32_t n = 16; n <= 24; n += 8) {
6671       for (size_t k = 1; k <= 40; k += 9) {
6672         GemmMicrokernelTester()
6673           .mr(5)
6674           .nr(8)
6675           .kr(1)
6676           .sr(1)
6677           .m(5)
6678           .n(n)
6679           .k(k)
6680           .cn_stride(11)
6681           .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6682       }
6683     }
6684   }
6685 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_strided_a)6686   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_strided_a) {
6687     TEST_REQUIRES_ARM_NEON_FMA;
6688     for (uint32_t n = 16; n <= 24; n += 8) {
6689       for (size_t k = 1; k <= 40; k += 9) {
6690         GemmMicrokernelTester()
6691           .mr(5)
6692           .nr(8)
6693           .kr(1)
6694           .sr(1)
6695           .m(5)
6696           .n(n)
6697           .k(k)
6698           .a_stride(43)
6699           .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6700       }
6701     }
6702   }
6703 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_subtile)6704   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_subtile) {
6705     TEST_REQUIRES_ARM_NEON_FMA;
6706     for (uint32_t n = 16; n <= 24; n += 8) {
6707       for (size_t k = 1; k <= 40; k += 9) {
6708         for (uint32_t m = 1; m <= 5; m++) {
6709           GemmMicrokernelTester()
6710             .mr(5)
6711             .nr(8)
6712             .kr(1)
6713             .sr(1)
6714             .m(m)
6715             .n(n)
6716             .k(k)
6717             .iterations(1)
6718             .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6719         }
6720       }
6721     }
6722   }
6723 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,strided_cm_subtile)6724   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, strided_cm_subtile) {
6725     TEST_REQUIRES_ARM_NEON_FMA;
6726     for (size_t k = 1; k <= 40; k += 9) {
6727       for (uint32_t n = 1; n <= 8; n++) {
6728         for (uint32_t m = 1; m <= 5; m++) {
6729           GemmMicrokernelTester()
6730             .mr(5)
6731             .nr(8)
6732             .kr(1)
6733             .sr(1)
6734             .m(m)
6735             .n(n)
6736             .k(k)
6737             .cm_stride(11)
6738             .iterations(1)
6739             .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6740         }
6741       }
6742     }
6743   }
6744 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,qmin)6745   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, qmin) {
6746     TEST_REQUIRES_ARM_NEON_FMA;
6747     GemmMicrokernelTester()
6748       .mr(5)
6749       .nr(8)
6750       .kr(1)
6751       .sr(1)
6752       .m(5)
6753       .n(8)
6754       .k(8)
6755       .qmin(128)
6756       .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6757   }
6758 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,qmax)6759   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, qmax) {
6760     TEST_REQUIRES_ARM_NEON_FMA;
6761     GemmMicrokernelTester()
6762       .mr(5)
6763       .nr(8)
6764       .kr(1)
6765       .sr(1)
6766       .m(5)
6767       .n(8)
6768       .k(8)
6769       .qmax(128)
6770       .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6771   }
6772 
TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75,strided_cm)6773   TEST(F32_GEMM_MINMAX_5X8__AARCH64_NEONFMA_CORTEX_A75, strided_cm) {
6774     TEST_REQUIRES_ARM_NEON_FMA;
6775     GemmMicrokernelTester()
6776       .mr(5)
6777       .nr(8)
6778       .kr(1)
6779       .sr(1)
6780       .m(5)
6781       .n(8)
6782       .k(8)
6783       .cm_stride(11)
6784       .Test(xnn_f32_gemm_minmax_ukernel_5x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
6785   }
6786 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
6787 
6788 
6789 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_4)6790   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_4) {
6791     TEST_REQUIRES_ARM_NEON_FMA;
6792     GemmMicrokernelTester()
6793       .mr(6)
6794       .nr(8)
6795       .kr(1)
6796       .sr(1)
6797       .m(6)
6798       .n(8)
6799       .k(4)
6800       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6801   }
6802 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,strided_cn)6803   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, strided_cn) {
6804     TEST_REQUIRES_ARM_NEON_FMA;
6805     GemmMicrokernelTester()
6806       .mr(6)
6807       .nr(8)
6808       .kr(1)
6809       .sr(1)
6810       .m(6)
6811       .n(8)
6812       .k(4)
6813       .cn_stride(11)
6814       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6815   }
6816 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_strided_a)6817   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_strided_a) {
6818     TEST_REQUIRES_ARM_NEON_FMA;
6819     GemmMicrokernelTester()
6820       .mr(6)
6821       .nr(8)
6822       .kr(1)
6823       .sr(1)
6824       .m(6)
6825       .n(8)
6826       .k(4)
6827       .a_stride(7)
6828       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6829   }
6830 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile)6831   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile) {
6832     TEST_REQUIRES_ARM_NEON_FMA;
6833     for (uint32_t n = 1; n <= 8; n++) {
6834       for (uint32_t m = 1; m <= 6; m++) {
6835         GemmMicrokernelTester()
6836           .mr(6)
6837           .nr(8)
6838           .kr(1)
6839           .sr(1)
6840           .m(m)
6841           .n(n)
6842           .k(4)
6843           .iterations(1)
6844           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6845       }
6846     }
6847   }
6848 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile_m)6849   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile_m) {
6850     TEST_REQUIRES_ARM_NEON_FMA;
6851     for (uint32_t m = 1; m <= 6; m++) {
6852       GemmMicrokernelTester()
6853         .mr(6)
6854         .nr(8)
6855         .kr(1)
6856         .sr(1)
6857         .m(m)
6858         .n(8)
6859         .k(4)
6860         .iterations(1)
6861         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6862     }
6863   }
6864 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_4_subtile_n)6865   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_4_subtile_n) {
6866     TEST_REQUIRES_ARM_NEON_FMA;
6867     for (uint32_t n = 1; n <= 8; n++) {
6868       GemmMicrokernelTester()
6869         .mr(6)
6870         .nr(8)
6871         .kr(1)
6872         .sr(1)
6873         .m(6)
6874         .n(n)
6875         .k(4)
6876         .iterations(1)
6877         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6878     }
6879   }
6880 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_8)6881   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_8) {
6882     TEST_REQUIRES_ARM_NEON_FMA;
6883     GemmMicrokernelTester()
6884       .mr(6)
6885       .nr(8)
6886       .kr(1)
6887       .sr(1)
6888       .m(6)
6889       .n(8)
6890       .k(8)
6891       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6892   }
6893 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_8_strided_a)6894   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_8_strided_a) {
6895     TEST_REQUIRES_ARM_NEON_FMA;
6896     GemmMicrokernelTester()
6897       .mr(6)
6898       .nr(8)
6899       .kr(1)
6900       .sr(1)
6901       .m(6)
6902       .n(8)
6903       .k(8)
6904       .a_stride(11)
6905       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6906   }
6907 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_eq_8_subtile)6908   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_eq_8_subtile) {
6909     TEST_REQUIRES_ARM_NEON_FMA;
6910     for (uint32_t n = 1; n <= 8; n++) {
6911       for (uint32_t m = 1; m <= 6; m++) {
6912         GemmMicrokernelTester()
6913           .mr(6)
6914           .nr(8)
6915           .kr(1)
6916           .sr(1)
6917           .m(m)
6918           .n(n)
6919           .k(8)
6920           .iterations(1)
6921           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6922       }
6923     }
6924   }
6925 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_lt_8)6926   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_lt_8) {
6927     TEST_REQUIRES_ARM_NEON_FMA;
6928     for (size_t k = 1; k < 8; k++) {
6929       GemmMicrokernelTester()
6930         .mr(6)
6931         .nr(8)
6932         .kr(1)
6933         .sr(1)
6934         .m(6)
6935         .n(8)
6936         .k(k)
6937         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6938     }
6939   }
6940 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_lt_8_strided_a)6941   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_lt_8_strided_a) {
6942     TEST_REQUIRES_ARM_NEON_FMA;
6943     for (size_t k = 1; k < 8; k++) {
6944       GemmMicrokernelTester()
6945         .mr(6)
6946         .nr(8)
6947         .kr(1)
6948         .sr(1)
6949         .m(6)
6950         .n(8)
6951         .k(k)
6952         .a_stride(11)
6953         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6954     }
6955   }
6956 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_lt_8_subtile)6957   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_lt_8_subtile) {
6958     TEST_REQUIRES_ARM_NEON_FMA;
6959     for (size_t k = 1; k < 8; k++) {
6960       for (uint32_t n = 1; n <= 8; n++) {
6961         for (uint32_t m = 1; m <= 6; m++) {
6962           GemmMicrokernelTester()
6963             .mr(6)
6964             .nr(8)
6965             .kr(1)
6966             .sr(1)
6967             .m(m)
6968             .n(n)
6969             .k(k)
6970             .iterations(1)
6971             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6972         }
6973       }
6974     }
6975   }
6976 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_gt_8)6977   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_gt_8) {
6978     TEST_REQUIRES_ARM_NEON_FMA;
6979     for (size_t k = 9; k < 16; k++) {
6980       GemmMicrokernelTester()
6981         .mr(6)
6982         .nr(8)
6983         .kr(1)
6984         .sr(1)
6985         .m(6)
6986         .n(8)
6987         .k(k)
6988         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
6989     }
6990   }
6991 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_gt_8_strided_a)6992   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_gt_8_strided_a) {
6993     TEST_REQUIRES_ARM_NEON_FMA;
6994     for (size_t k = 9; k < 16; k++) {
6995       GemmMicrokernelTester()
6996         .mr(6)
6997         .nr(8)
6998         .kr(1)
6999         .sr(1)
7000         .m(6)
7001         .n(8)
7002         .k(k)
7003         .a_stride(19)
7004         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7005     }
7006   }
7007 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_gt_8_subtile)7008   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_gt_8_subtile) {
7009     TEST_REQUIRES_ARM_NEON_FMA;
7010     for (size_t k = 9; k < 16; k++) {
7011       for (uint32_t n = 1; n <= 8; n++) {
7012         for (uint32_t m = 1; m <= 6; m++) {
7013           GemmMicrokernelTester()
7014             .mr(6)
7015             .nr(8)
7016             .kr(1)
7017             .sr(1)
7018             .m(m)
7019             .n(n)
7020             .k(k)
7021             .iterations(1)
7022             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7023         }
7024       }
7025     }
7026   }
7027 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_div_4)7028   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_div_4) {
7029     TEST_REQUIRES_ARM_NEON_FMA;
7030     for (size_t k = 12; k <= 40; k += 4) {
7031       GemmMicrokernelTester()
7032         .mr(6)
7033         .nr(8)
7034         .kr(1)
7035         .sr(1)
7036         .m(6)
7037         .n(8)
7038         .k(k)
7039         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7040     }
7041   }
7042 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_div_4_strided_a)7043   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_div_4_strided_a) {
7044     TEST_REQUIRES_ARM_NEON_FMA;
7045     for (size_t k = 12; k <= 40; k += 4) {
7046       GemmMicrokernelTester()
7047         .mr(6)
7048         .nr(8)
7049         .kr(1)
7050         .sr(1)
7051         .m(6)
7052         .n(8)
7053         .k(k)
7054         .a_stride(43)
7055         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7056     }
7057   }
7058 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,k_div_4_subtile)7059   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, k_div_4_subtile) {
7060     TEST_REQUIRES_ARM_NEON_FMA;
7061     for (size_t k = 12; k <= 40; k += 4) {
7062       for (uint32_t n = 1; n <= 8; n++) {
7063         for (uint32_t m = 1; m <= 6; m++) {
7064           GemmMicrokernelTester()
7065             .mr(6)
7066             .nr(8)
7067             .kr(1)
7068             .sr(1)
7069             .m(m)
7070             .n(n)
7071             .k(k)
7072             .iterations(1)
7073             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7074         }
7075       }
7076     }
7077   }
7078 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,n_gt_8)7079   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, n_gt_8) {
7080     TEST_REQUIRES_ARM_NEON_FMA;
7081     for (uint32_t n = 9; n < 16; n++) {
7082       for (size_t k = 1; k <= 20; k += 5) {
7083         GemmMicrokernelTester()
7084           .mr(6)
7085           .nr(8)
7086           .kr(1)
7087           .sr(1)
7088           .m(6)
7089           .n(n)
7090           .k(k)
7091           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7092       }
7093     }
7094   }
7095 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,n_gt_8_strided_cn)7096   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, n_gt_8_strided_cn) {
7097     TEST_REQUIRES_ARM_NEON_FMA;
7098     for (uint32_t n = 9; n < 16; n++) {
7099       for (size_t k = 1; k <= 20; k += 5) {
7100         GemmMicrokernelTester()
7101           .mr(6)
7102           .nr(8)
7103           .kr(1)
7104           .sr(1)
7105           .m(6)
7106           .n(n)
7107           .k(k)
7108           .cn_stride(11)
7109           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7110       }
7111     }
7112   }
7113 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,n_gt_8_strided_a)7114   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, n_gt_8_strided_a) {
7115     TEST_REQUIRES_ARM_NEON_FMA;
7116     for (uint32_t n = 9; n < 16; n++) {
7117       for (size_t k = 1; k <= 20; k += 5) {
7118         GemmMicrokernelTester()
7119           .mr(6)
7120           .nr(8)
7121           .kr(1)
7122           .sr(1)
7123           .m(6)
7124           .n(n)
7125           .k(k)
7126           .a_stride(23)
7127           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7128       }
7129     }
7130   }
7131 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,n_gt_8_subtile)7132   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, n_gt_8_subtile) {
7133     TEST_REQUIRES_ARM_NEON_FMA;
7134     for (uint32_t n = 9; n < 16; n++) {
7135       for (size_t k = 1; k <= 20; k += 5) {
7136         for (uint32_t m = 1; m <= 6; m++) {
7137           GemmMicrokernelTester()
7138             .mr(6)
7139             .nr(8)
7140             .kr(1)
7141             .sr(1)
7142             .m(m)
7143             .n(n)
7144             .k(k)
7145             .iterations(1)
7146             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7147         }
7148       }
7149     }
7150   }
7151 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,n_div_8)7152   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, n_div_8) {
7153     TEST_REQUIRES_ARM_NEON_FMA;
7154     for (uint32_t n = 16; n <= 24; n += 8) {
7155       for (size_t k = 1; k <= 20; k += 5) {
7156         GemmMicrokernelTester()
7157           .mr(6)
7158           .nr(8)
7159           .kr(1)
7160           .sr(1)
7161           .m(6)
7162           .n(n)
7163           .k(k)
7164           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7165       }
7166     }
7167   }
7168 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,n_div_8_strided_cn)7169   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, n_div_8_strided_cn) {
7170     TEST_REQUIRES_ARM_NEON_FMA;
7171     for (uint32_t n = 16; n <= 24; n += 8) {
7172       for (size_t k = 1; k <= 20; k += 5) {
7173         GemmMicrokernelTester()
7174           .mr(6)
7175           .nr(8)
7176           .kr(1)
7177           .sr(1)
7178           .m(6)
7179           .n(n)
7180           .k(k)
7181           .cn_stride(11)
7182           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7183       }
7184     }
7185   }
7186 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,n_div_8_strided_a)7187   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, n_div_8_strided_a) {
7188     TEST_REQUIRES_ARM_NEON_FMA;
7189     for (uint32_t n = 16; n <= 24; n += 8) {
7190       for (size_t k = 1; k <= 20; k += 5) {
7191         GemmMicrokernelTester()
7192           .mr(6)
7193           .nr(8)
7194           .kr(1)
7195           .sr(1)
7196           .m(6)
7197           .n(n)
7198           .k(k)
7199           .a_stride(23)
7200           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7201       }
7202     }
7203   }
7204 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,n_div_8_subtile)7205   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, n_div_8_subtile) {
7206     TEST_REQUIRES_ARM_NEON_FMA;
7207     for (uint32_t n = 16; n <= 24; n += 8) {
7208       for (size_t k = 1; k <= 20; k += 5) {
7209         for (uint32_t m = 1; m <= 6; m++) {
7210           GemmMicrokernelTester()
7211             .mr(6)
7212             .nr(8)
7213             .kr(1)
7214             .sr(1)
7215             .m(m)
7216             .n(n)
7217             .k(k)
7218             .iterations(1)
7219             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7220         }
7221       }
7222     }
7223   }
7224 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,strided_cm_subtile)7225   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, strided_cm_subtile) {
7226     TEST_REQUIRES_ARM_NEON_FMA;
7227     for (size_t k = 1; k <= 20; k += 5) {
7228       for (uint32_t n = 1; n <= 8; n++) {
7229         for (uint32_t m = 1; m <= 6; m++) {
7230           GemmMicrokernelTester()
7231             .mr(6)
7232             .nr(8)
7233             .kr(1)
7234             .sr(1)
7235             .m(m)
7236             .n(n)
7237             .k(k)
7238             .cm_stride(11)
7239             .iterations(1)
7240             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7241         }
7242       }
7243     }
7244   }
7245 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,qmin)7246   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, qmin) {
7247     TEST_REQUIRES_ARM_NEON_FMA;
7248     GemmMicrokernelTester()
7249       .mr(6)
7250       .nr(8)
7251       .kr(1)
7252       .sr(1)
7253       .m(6)
7254       .n(8)
7255       .k(4)
7256       .qmin(128)
7257       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7258   }
7259 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,qmax)7260   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, qmax) {
7261     TEST_REQUIRES_ARM_NEON_FMA;
7262     GemmMicrokernelTester()
7263       .mr(6)
7264       .nr(8)
7265       .kr(1)
7266       .sr(1)
7267       .m(6)
7268       .n(8)
7269       .k(4)
7270       .qmax(128)
7271       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7272   }
7273 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53,strided_cm)7274   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A53, strided_cm) {
7275     TEST_REQUIRES_ARM_NEON_FMA;
7276     GemmMicrokernelTester()
7277       .mr(6)
7278       .nr(8)
7279       .kr(1)
7280       .sr(1)
7281       .m(6)
7282       .n(8)
7283       .k(4)
7284       .cm_stride(11)
7285       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a53, xnn_init_f32_minmax_scalar_params);
7286   }
7287 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
7288 
7289 
7290 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_eq_8)7291   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_eq_8) {
7292     TEST_REQUIRES_ARM_NEON_FMA;
7293     GemmMicrokernelTester()
7294       .mr(6)
7295       .nr(8)
7296       .kr(1)
7297       .sr(1)
7298       .m(6)
7299       .n(8)
7300       .k(8)
7301       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7302   }
7303 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,strided_cn)7304   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, strided_cn) {
7305     TEST_REQUIRES_ARM_NEON_FMA;
7306     GemmMicrokernelTester()
7307       .mr(6)
7308       .nr(8)
7309       .kr(1)
7310       .sr(1)
7311       .m(6)
7312       .n(8)
7313       .k(8)
7314       .cn_stride(11)
7315       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7316   }
7317 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_eq_8_strided_a)7318   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_eq_8_strided_a) {
7319     TEST_REQUIRES_ARM_NEON_FMA;
7320     GemmMicrokernelTester()
7321       .mr(6)
7322       .nr(8)
7323       .kr(1)
7324       .sr(1)
7325       .m(6)
7326       .n(8)
7327       .k(8)
7328       .a_stride(11)
7329       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7330   }
7331 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_eq_8_subtile)7332   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_eq_8_subtile) {
7333     TEST_REQUIRES_ARM_NEON_FMA;
7334     for (uint32_t n = 1; n <= 8; n++) {
7335       for (uint32_t m = 1; m <= 6; m++) {
7336         GemmMicrokernelTester()
7337           .mr(6)
7338           .nr(8)
7339           .kr(1)
7340           .sr(1)
7341           .m(m)
7342           .n(n)
7343           .k(8)
7344           .iterations(1)
7345           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7346       }
7347     }
7348   }
7349 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_eq_8_subtile_m)7350   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_eq_8_subtile_m) {
7351     TEST_REQUIRES_ARM_NEON_FMA;
7352     for (uint32_t m = 1; m <= 6; m++) {
7353       GemmMicrokernelTester()
7354         .mr(6)
7355         .nr(8)
7356         .kr(1)
7357         .sr(1)
7358         .m(m)
7359         .n(8)
7360         .k(8)
7361         .iterations(1)
7362         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7363     }
7364   }
7365 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_eq_8_subtile_n)7366   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_eq_8_subtile_n) {
7367     TEST_REQUIRES_ARM_NEON_FMA;
7368     for (uint32_t n = 1; n <= 8; n++) {
7369       GemmMicrokernelTester()
7370         .mr(6)
7371         .nr(8)
7372         .kr(1)
7373         .sr(1)
7374         .m(6)
7375         .n(n)
7376         .k(8)
7377         .iterations(1)
7378         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7379     }
7380   }
7381 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_eq_16)7382   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_eq_16) {
7383     TEST_REQUIRES_ARM_NEON_FMA;
7384     GemmMicrokernelTester()
7385       .mr(6)
7386       .nr(8)
7387       .kr(1)
7388       .sr(1)
7389       .m(6)
7390       .n(8)
7391       .k(16)
7392       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7393   }
7394 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_eq_16_strided_a)7395   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_eq_16_strided_a) {
7396     TEST_REQUIRES_ARM_NEON_FMA;
7397     GemmMicrokernelTester()
7398       .mr(6)
7399       .nr(8)
7400       .kr(1)
7401       .sr(1)
7402       .m(6)
7403       .n(8)
7404       .k(16)
7405       .a_stride(19)
7406       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7407   }
7408 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_eq_16_subtile)7409   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_eq_16_subtile) {
7410     TEST_REQUIRES_ARM_NEON_FMA;
7411     for (uint32_t n = 1; n <= 8; n++) {
7412       for (uint32_t m = 1; m <= 6; m++) {
7413         GemmMicrokernelTester()
7414           .mr(6)
7415           .nr(8)
7416           .kr(1)
7417           .sr(1)
7418           .m(m)
7419           .n(n)
7420           .k(16)
7421           .iterations(1)
7422           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7423       }
7424     }
7425   }
7426 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_lt_16)7427   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_lt_16) {
7428     TEST_REQUIRES_ARM_NEON_FMA;
7429     for (size_t k = 1; k < 16; k++) {
7430       GemmMicrokernelTester()
7431         .mr(6)
7432         .nr(8)
7433         .kr(1)
7434         .sr(1)
7435         .m(6)
7436         .n(8)
7437         .k(k)
7438         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7439     }
7440   }
7441 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_lt_16_strided_a)7442   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_lt_16_strided_a) {
7443     TEST_REQUIRES_ARM_NEON_FMA;
7444     for (size_t k = 1; k < 16; k++) {
7445       GemmMicrokernelTester()
7446         .mr(6)
7447         .nr(8)
7448         .kr(1)
7449         .sr(1)
7450         .m(6)
7451         .n(8)
7452         .k(k)
7453         .a_stride(19)
7454         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7455     }
7456   }
7457 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_lt_16_subtile)7458   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_lt_16_subtile) {
7459     TEST_REQUIRES_ARM_NEON_FMA;
7460     for (size_t k = 1; k < 16; k++) {
7461       for (uint32_t n = 1; n <= 8; n++) {
7462         for (uint32_t m = 1; m <= 6; m++) {
7463           GemmMicrokernelTester()
7464             .mr(6)
7465             .nr(8)
7466             .kr(1)
7467             .sr(1)
7468             .m(m)
7469             .n(n)
7470             .k(k)
7471             .iterations(1)
7472             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7473         }
7474       }
7475     }
7476   }
7477 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_gt_16)7478   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_gt_16) {
7479     TEST_REQUIRES_ARM_NEON_FMA;
7480     for (size_t k = 17; k < 32; k++) {
7481       GemmMicrokernelTester()
7482         .mr(6)
7483         .nr(8)
7484         .kr(1)
7485         .sr(1)
7486         .m(6)
7487         .n(8)
7488         .k(k)
7489         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7490     }
7491   }
7492 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_gt_16_strided_a)7493   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_gt_16_strided_a) {
7494     TEST_REQUIRES_ARM_NEON_FMA;
7495     for (size_t k = 17; k < 32; k++) {
7496       GemmMicrokernelTester()
7497         .mr(6)
7498         .nr(8)
7499         .kr(1)
7500         .sr(1)
7501         .m(6)
7502         .n(8)
7503         .k(k)
7504         .a_stride(37)
7505         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7506     }
7507   }
7508 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_gt_16_subtile)7509   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_gt_16_subtile) {
7510     TEST_REQUIRES_ARM_NEON_FMA;
7511     for (size_t k = 17; k < 32; k++) {
7512       for (uint32_t n = 1; n <= 8; n++) {
7513         for (uint32_t m = 1; m <= 6; m++) {
7514           GemmMicrokernelTester()
7515             .mr(6)
7516             .nr(8)
7517             .kr(1)
7518             .sr(1)
7519             .m(m)
7520             .n(n)
7521             .k(k)
7522             .iterations(1)
7523             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7524         }
7525       }
7526     }
7527   }
7528 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_div_8)7529   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_div_8) {
7530     TEST_REQUIRES_ARM_NEON_FMA;
7531     for (size_t k = 24; k <= 80; k += 8) {
7532       GemmMicrokernelTester()
7533         .mr(6)
7534         .nr(8)
7535         .kr(1)
7536         .sr(1)
7537         .m(6)
7538         .n(8)
7539         .k(k)
7540         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7541     }
7542   }
7543 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_div_8_strided_a)7544   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_div_8_strided_a) {
7545     TEST_REQUIRES_ARM_NEON_FMA;
7546     for (size_t k = 24; k <= 80; k += 8) {
7547       GemmMicrokernelTester()
7548         .mr(6)
7549         .nr(8)
7550         .kr(1)
7551         .sr(1)
7552         .m(6)
7553         .n(8)
7554         .k(k)
7555         .a_stride(83)
7556         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7557     }
7558   }
7559 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,k_div_8_subtile)7560   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, k_div_8_subtile) {
7561     TEST_REQUIRES_ARM_NEON_FMA;
7562     for (size_t k = 24; k <= 80; k += 8) {
7563       for (uint32_t n = 1; n <= 8; n++) {
7564         for (uint32_t m = 1; m <= 6; m++) {
7565           GemmMicrokernelTester()
7566             .mr(6)
7567             .nr(8)
7568             .kr(1)
7569             .sr(1)
7570             .m(m)
7571             .n(n)
7572             .k(k)
7573             .iterations(1)
7574             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7575         }
7576       }
7577     }
7578   }
7579 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,n_gt_8)7580   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, n_gt_8) {
7581     TEST_REQUIRES_ARM_NEON_FMA;
7582     for (uint32_t n = 9; n < 16; n++) {
7583       for (size_t k = 1; k <= 40; k += 9) {
7584         GemmMicrokernelTester()
7585           .mr(6)
7586           .nr(8)
7587           .kr(1)
7588           .sr(1)
7589           .m(6)
7590           .n(n)
7591           .k(k)
7592           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7593       }
7594     }
7595   }
7596 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,n_gt_8_strided_cn)7597   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, n_gt_8_strided_cn) {
7598     TEST_REQUIRES_ARM_NEON_FMA;
7599     for (uint32_t n = 9; n < 16; n++) {
7600       for (size_t k = 1; k <= 40; k += 9) {
7601         GemmMicrokernelTester()
7602           .mr(6)
7603           .nr(8)
7604           .kr(1)
7605           .sr(1)
7606           .m(6)
7607           .n(n)
7608           .k(k)
7609           .cn_stride(11)
7610           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7611       }
7612     }
7613   }
7614 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,n_gt_8_strided_a)7615   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, n_gt_8_strided_a) {
7616     TEST_REQUIRES_ARM_NEON_FMA;
7617     for (uint32_t n = 9; n < 16; n++) {
7618       for (size_t k = 1; k <= 40; k += 9) {
7619         GemmMicrokernelTester()
7620           .mr(6)
7621           .nr(8)
7622           .kr(1)
7623           .sr(1)
7624           .m(6)
7625           .n(n)
7626           .k(k)
7627           .a_stride(43)
7628           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7629       }
7630     }
7631   }
7632 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,n_gt_8_subtile)7633   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, n_gt_8_subtile) {
7634     TEST_REQUIRES_ARM_NEON_FMA;
7635     for (uint32_t n = 9; n < 16; n++) {
7636       for (size_t k = 1; k <= 40; k += 9) {
7637         for (uint32_t m = 1; m <= 6; m++) {
7638           GemmMicrokernelTester()
7639             .mr(6)
7640             .nr(8)
7641             .kr(1)
7642             .sr(1)
7643             .m(m)
7644             .n(n)
7645             .k(k)
7646             .iterations(1)
7647             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7648         }
7649       }
7650     }
7651   }
7652 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,n_div_8)7653   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, n_div_8) {
7654     TEST_REQUIRES_ARM_NEON_FMA;
7655     for (uint32_t n = 16; n <= 24; n += 8) {
7656       for (size_t k = 1; k <= 40; k += 9) {
7657         GemmMicrokernelTester()
7658           .mr(6)
7659           .nr(8)
7660           .kr(1)
7661           .sr(1)
7662           .m(6)
7663           .n(n)
7664           .k(k)
7665           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7666       }
7667     }
7668   }
7669 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,n_div_8_strided_cn)7670   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, n_div_8_strided_cn) {
7671     TEST_REQUIRES_ARM_NEON_FMA;
7672     for (uint32_t n = 16; n <= 24; n += 8) {
7673       for (size_t k = 1; k <= 40; k += 9) {
7674         GemmMicrokernelTester()
7675           .mr(6)
7676           .nr(8)
7677           .kr(1)
7678           .sr(1)
7679           .m(6)
7680           .n(n)
7681           .k(k)
7682           .cn_stride(11)
7683           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7684       }
7685     }
7686   }
7687 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,n_div_8_strided_a)7688   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, n_div_8_strided_a) {
7689     TEST_REQUIRES_ARM_NEON_FMA;
7690     for (uint32_t n = 16; n <= 24; n += 8) {
7691       for (size_t k = 1; k <= 40; k += 9) {
7692         GemmMicrokernelTester()
7693           .mr(6)
7694           .nr(8)
7695           .kr(1)
7696           .sr(1)
7697           .m(6)
7698           .n(n)
7699           .k(k)
7700           .a_stride(43)
7701           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7702       }
7703     }
7704   }
7705 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,n_div_8_subtile)7706   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, n_div_8_subtile) {
7707     TEST_REQUIRES_ARM_NEON_FMA;
7708     for (uint32_t n = 16; n <= 24; n += 8) {
7709       for (size_t k = 1; k <= 40; k += 9) {
7710         for (uint32_t m = 1; m <= 6; m++) {
7711           GemmMicrokernelTester()
7712             .mr(6)
7713             .nr(8)
7714             .kr(1)
7715             .sr(1)
7716             .m(m)
7717             .n(n)
7718             .k(k)
7719             .iterations(1)
7720             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7721         }
7722       }
7723     }
7724   }
7725 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,strided_cm_subtile)7726   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, strided_cm_subtile) {
7727     TEST_REQUIRES_ARM_NEON_FMA;
7728     for (size_t k = 1; k <= 40; k += 9) {
7729       for (uint32_t n = 1; n <= 8; n++) {
7730         for (uint32_t m = 1; m <= 6; m++) {
7731           GemmMicrokernelTester()
7732             .mr(6)
7733             .nr(8)
7734             .kr(1)
7735             .sr(1)
7736             .m(m)
7737             .n(n)
7738             .k(k)
7739             .cm_stride(11)
7740             .iterations(1)
7741             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7742         }
7743       }
7744     }
7745   }
7746 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,qmin)7747   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, qmin) {
7748     TEST_REQUIRES_ARM_NEON_FMA;
7749     GemmMicrokernelTester()
7750       .mr(6)
7751       .nr(8)
7752       .kr(1)
7753       .sr(1)
7754       .m(6)
7755       .n(8)
7756       .k(8)
7757       .qmin(128)
7758       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7759   }
7760 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,qmax)7761   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, qmax) {
7762     TEST_REQUIRES_ARM_NEON_FMA;
7763     GemmMicrokernelTester()
7764       .mr(6)
7765       .nr(8)
7766       .kr(1)
7767       .sr(1)
7768       .m(6)
7769       .n(8)
7770       .k(8)
7771       .qmax(128)
7772       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7773   }
7774 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73,strided_cm)7775   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_CORTEX_A73, strided_cm) {
7776     TEST_REQUIRES_ARM_NEON_FMA;
7777     GemmMicrokernelTester()
7778       .mr(6)
7779       .nr(8)
7780       .kr(1)
7781       .sr(1)
7782       .m(6)
7783       .n(8)
7784       .k(8)
7785       .cm_stride(11)
7786       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_cortex_a73, xnn_init_f32_minmax_scalar_params);
7787   }
7788 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
7789 
7790 
7791 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_eq_4)7792   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_eq_4) {
7793     TEST_REQUIRES_ARM_NEON_FMA;
7794     GemmMicrokernelTester()
7795       .mr(6)
7796       .nr(8)
7797       .kr(1)
7798       .sr(1)
7799       .m(6)
7800       .n(8)
7801       .k(4)
7802       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7803   }
7804 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,strided_cn)7805   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, strided_cn) {
7806     TEST_REQUIRES_ARM_NEON_FMA;
7807     GemmMicrokernelTester()
7808       .mr(6)
7809       .nr(8)
7810       .kr(1)
7811       .sr(1)
7812       .m(6)
7813       .n(8)
7814       .k(4)
7815       .cn_stride(11)
7816       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7817   }
7818 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_eq_4_strided_a)7819   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_eq_4_strided_a) {
7820     TEST_REQUIRES_ARM_NEON_FMA;
7821     GemmMicrokernelTester()
7822       .mr(6)
7823       .nr(8)
7824       .kr(1)
7825       .sr(1)
7826       .m(6)
7827       .n(8)
7828       .k(4)
7829       .a_stride(7)
7830       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7831   }
7832 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_eq_4_subtile)7833   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_eq_4_subtile) {
7834     TEST_REQUIRES_ARM_NEON_FMA;
7835     for (uint32_t n = 1; n <= 8; n++) {
7836       for (uint32_t m = 1; m <= 6; m++) {
7837         GemmMicrokernelTester()
7838           .mr(6)
7839           .nr(8)
7840           .kr(1)
7841           .sr(1)
7842           .m(m)
7843           .n(n)
7844           .k(4)
7845           .iterations(1)
7846           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7847       }
7848     }
7849   }
7850 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_eq_4_subtile_m)7851   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_eq_4_subtile_m) {
7852     TEST_REQUIRES_ARM_NEON_FMA;
7853     for (uint32_t m = 1; m <= 6; m++) {
7854       GemmMicrokernelTester()
7855         .mr(6)
7856         .nr(8)
7857         .kr(1)
7858         .sr(1)
7859         .m(m)
7860         .n(8)
7861         .k(4)
7862         .iterations(1)
7863         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7864     }
7865   }
7866 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_eq_4_subtile_n)7867   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_eq_4_subtile_n) {
7868     TEST_REQUIRES_ARM_NEON_FMA;
7869     for (uint32_t n = 1; n <= 8; n++) {
7870       GemmMicrokernelTester()
7871         .mr(6)
7872         .nr(8)
7873         .kr(1)
7874         .sr(1)
7875         .m(6)
7876         .n(n)
7877         .k(4)
7878         .iterations(1)
7879         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7880     }
7881   }
7882 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_eq_8)7883   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_eq_8) {
7884     TEST_REQUIRES_ARM_NEON_FMA;
7885     GemmMicrokernelTester()
7886       .mr(6)
7887       .nr(8)
7888       .kr(1)
7889       .sr(1)
7890       .m(6)
7891       .n(8)
7892       .k(8)
7893       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7894   }
7895 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_eq_8_strided_a)7896   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_eq_8_strided_a) {
7897     TEST_REQUIRES_ARM_NEON_FMA;
7898     GemmMicrokernelTester()
7899       .mr(6)
7900       .nr(8)
7901       .kr(1)
7902       .sr(1)
7903       .m(6)
7904       .n(8)
7905       .k(8)
7906       .a_stride(11)
7907       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7908   }
7909 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_eq_8_subtile)7910   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_eq_8_subtile) {
7911     TEST_REQUIRES_ARM_NEON_FMA;
7912     for (uint32_t n = 1; n <= 8; n++) {
7913       for (uint32_t m = 1; m <= 6; m++) {
7914         GemmMicrokernelTester()
7915           .mr(6)
7916           .nr(8)
7917           .kr(1)
7918           .sr(1)
7919           .m(m)
7920           .n(n)
7921           .k(8)
7922           .iterations(1)
7923           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7924       }
7925     }
7926   }
7927 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_lt_8)7928   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_lt_8) {
7929     TEST_REQUIRES_ARM_NEON_FMA;
7930     for (size_t k = 1; k < 8; k++) {
7931       GemmMicrokernelTester()
7932         .mr(6)
7933         .nr(8)
7934         .kr(1)
7935         .sr(1)
7936         .m(6)
7937         .n(8)
7938         .k(k)
7939         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7940     }
7941   }
7942 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_lt_8_strided_a)7943   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_lt_8_strided_a) {
7944     TEST_REQUIRES_ARM_NEON_FMA;
7945     for (size_t k = 1; k < 8; k++) {
7946       GemmMicrokernelTester()
7947         .mr(6)
7948         .nr(8)
7949         .kr(1)
7950         .sr(1)
7951         .m(6)
7952         .n(8)
7953         .k(k)
7954         .a_stride(11)
7955         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7956     }
7957   }
7958 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_lt_8_subtile)7959   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_lt_8_subtile) {
7960     TEST_REQUIRES_ARM_NEON_FMA;
7961     for (size_t k = 1; k < 8; k++) {
7962       for (uint32_t n = 1; n <= 8; n++) {
7963         for (uint32_t m = 1; m <= 6; m++) {
7964           GemmMicrokernelTester()
7965             .mr(6)
7966             .nr(8)
7967             .kr(1)
7968             .sr(1)
7969             .m(m)
7970             .n(n)
7971             .k(k)
7972             .iterations(1)
7973             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7974         }
7975       }
7976     }
7977   }
7978 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_gt_8)7979   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_gt_8) {
7980     TEST_REQUIRES_ARM_NEON_FMA;
7981     for (size_t k = 9; k < 16; k++) {
7982       GemmMicrokernelTester()
7983         .mr(6)
7984         .nr(8)
7985         .kr(1)
7986         .sr(1)
7987         .m(6)
7988         .n(8)
7989         .k(k)
7990         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
7991     }
7992   }
7993 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_gt_8_strided_a)7994   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_gt_8_strided_a) {
7995     TEST_REQUIRES_ARM_NEON_FMA;
7996     for (size_t k = 9; k < 16; k++) {
7997       GemmMicrokernelTester()
7998         .mr(6)
7999         .nr(8)
8000         .kr(1)
8001         .sr(1)
8002         .m(6)
8003         .n(8)
8004         .k(k)
8005         .a_stride(19)
8006         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8007     }
8008   }
8009 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_gt_8_subtile)8010   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_gt_8_subtile) {
8011     TEST_REQUIRES_ARM_NEON_FMA;
8012     for (size_t k = 9; k < 16; k++) {
8013       for (uint32_t n = 1; n <= 8; n++) {
8014         for (uint32_t m = 1; m <= 6; m++) {
8015           GemmMicrokernelTester()
8016             .mr(6)
8017             .nr(8)
8018             .kr(1)
8019             .sr(1)
8020             .m(m)
8021             .n(n)
8022             .k(k)
8023             .iterations(1)
8024             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8025         }
8026       }
8027     }
8028   }
8029 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_div_4)8030   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_div_4) {
8031     TEST_REQUIRES_ARM_NEON_FMA;
8032     for (size_t k = 12; k <= 40; k += 4) {
8033       GemmMicrokernelTester()
8034         .mr(6)
8035         .nr(8)
8036         .kr(1)
8037         .sr(1)
8038         .m(6)
8039         .n(8)
8040         .k(k)
8041         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8042     }
8043   }
8044 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_div_4_strided_a)8045   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_div_4_strided_a) {
8046     TEST_REQUIRES_ARM_NEON_FMA;
8047     for (size_t k = 12; k <= 40; k += 4) {
8048       GemmMicrokernelTester()
8049         .mr(6)
8050         .nr(8)
8051         .kr(1)
8052         .sr(1)
8053         .m(6)
8054         .n(8)
8055         .k(k)
8056         .a_stride(43)
8057         .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8058     }
8059   }
8060 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,k_div_4_subtile)8061   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, k_div_4_subtile) {
8062     TEST_REQUIRES_ARM_NEON_FMA;
8063     for (size_t k = 12; k <= 40; k += 4) {
8064       for (uint32_t n = 1; n <= 8; n++) {
8065         for (uint32_t m = 1; m <= 6; m++) {
8066           GemmMicrokernelTester()
8067             .mr(6)
8068             .nr(8)
8069             .kr(1)
8070             .sr(1)
8071             .m(m)
8072             .n(n)
8073             .k(k)
8074             .iterations(1)
8075             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8076         }
8077       }
8078     }
8079   }
8080 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,n_gt_8)8081   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, n_gt_8) {
8082     TEST_REQUIRES_ARM_NEON_FMA;
8083     for (uint32_t n = 9; n < 16; n++) {
8084       for (size_t k = 1; k <= 20; k += 5) {
8085         GemmMicrokernelTester()
8086           .mr(6)
8087           .nr(8)
8088           .kr(1)
8089           .sr(1)
8090           .m(6)
8091           .n(n)
8092           .k(k)
8093           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8094       }
8095     }
8096   }
8097 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,n_gt_8_strided_cn)8098   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, n_gt_8_strided_cn) {
8099     TEST_REQUIRES_ARM_NEON_FMA;
8100     for (uint32_t n = 9; n < 16; n++) {
8101       for (size_t k = 1; k <= 20; k += 5) {
8102         GemmMicrokernelTester()
8103           .mr(6)
8104           .nr(8)
8105           .kr(1)
8106           .sr(1)
8107           .m(6)
8108           .n(n)
8109           .k(k)
8110           .cn_stride(11)
8111           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8112       }
8113     }
8114   }
8115 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,n_gt_8_strided_a)8116   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, n_gt_8_strided_a) {
8117     TEST_REQUIRES_ARM_NEON_FMA;
8118     for (uint32_t n = 9; n < 16; n++) {
8119       for (size_t k = 1; k <= 20; k += 5) {
8120         GemmMicrokernelTester()
8121           .mr(6)
8122           .nr(8)
8123           .kr(1)
8124           .sr(1)
8125           .m(6)
8126           .n(n)
8127           .k(k)
8128           .a_stride(23)
8129           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8130       }
8131     }
8132   }
8133 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,n_gt_8_subtile)8134   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, n_gt_8_subtile) {
8135     TEST_REQUIRES_ARM_NEON_FMA;
8136     for (uint32_t n = 9; n < 16; n++) {
8137       for (size_t k = 1; k <= 20; k += 5) {
8138         for (uint32_t m = 1; m <= 6; m++) {
8139           GemmMicrokernelTester()
8140             .mr(6)
8141             .nr(8)
8142             .kr(1)
8143             .sr(1)
8144             .m(m)
8145             .n(n)
8146             .k(k)
8147             .iterations(1)
8148             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8149         }
8150       }
8151     }
8152   }
8153 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,n_div_8)8154   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, n_div_8) {
8155     TEST_REQUIRES_ARM_NEON_FMA;
8156     for (uint32_t n = 16; n <= 24; n += 8) {
8157       for (size_t k = 1; k <= 20; k += 5) {
8158         GemmMicrokernelTester()
8159           .mr(6)
8160           .nr(8)
8161           .kr(1)
8162           .sr(1)
8163           .m(6)
8164           .n(n)
8165           .k(k)
8166           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8167       }
8168     }
8169   }
8170 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,n_div_8_strided_cn)8171   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, n_div_8_strided_cn) {
8172     TEST_REQUIRES_ARM_NEON_FMA;
8173     for (uint32_t n = 16; n <= 24; n += 8) {
8174       for (size_t k = 1; k <= 20; k += 5) {
8175         GemmMicrokernelTester()
8176           .mr(6)
8177           .nr(8)
8178           .kr(1)
8179           .sr(1)
8180           .m(6)
8181           .n(n)
8182           .k(k)
8183           .cn_stride(11)
8184           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8185       }
8186     }
8187   }
8188 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,n_div_8_strided_a)8189   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, n_div_8_strided_a) {
8190     TEST_REQUIRES_ARM_NEON_FMA;
8191     for (uint32_t n = 16; n <= 24; n += 8) {
8192       for (size_t k = 1; k <= 20; k += 5) {
8193         GemmMicrokernelTester()
8194           .mr(6)
8195           .nr(8)
8196           .kr(1)
8197           .sr(1)
8198           .m(6)
8199           .n(n)
8200           .k(k)
8201           .a_stride(23)
8202           .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8203       }
8204     }
8205   }
8206 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,n_div_8_subtile)8207   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, n_div_8_subtile) {
8208     TEST_REQUIRES_ARM_NEON_FMA;
8209     for (uint32_t n = 16; n <= 24; n += 8) {
8210       for (size_t k = 1; k <= 20; k += 5) {
8211         for (uint32_t m = 1; m <= 6; m++) {
8212           GemmMicrokernelTester()
8213             .mr(6)
8214             .nr(8)
8215             .kr(1)
8216             .sr(1)
8217             .m(m)
8218             .n(n)
8219             .k(k)
8220             .iterations(1)
8221             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8222         }
8223       }
8224     }
8225   }
8226 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,strided_cm_subtile)8227   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, strided_cm_subtile) {
8228     TEST_REQUIRES_ARM_NEON_FMA;
8229     for (size_t k = 1; k <= 20; k += 5) {
8230       for (uint32_t n = 1; n <= 8; n++) {
8231         for (uint32_t m = 1; m <= 6; m++) {
8232           GemmMicrokernelTester()
8233             .mr(6)
8234             .nr(8)
8235             .kr(1)
8236             .sr(1)
8237             .m(m)
8238             .n(n)
8239             .k(k)
8240             .cm_stride(11)
8241             .iterations(1)
8242             .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8243         }
8244       }
8245     }
8246   }
8247 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,qmin)8248   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, qmin) {
8249     TEST_REQUIRES_ARM_NEON_FMA;
8250     GemmMicrokernelTester()
8251       .mr(6)
8252       .nr(8)
8253       .kr(1)
8254       .sr(1)
8255       .m(6)
8256       .n(8)
8257       .k(4)
8258       .qmin(128)
8259       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8260   }
8261 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,qmax)8262   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, qmax) {
8263     TEST_REQUIRES_ARM_NEON_FMA;
8264     GemmMicrokernelTester()
8265       .mr(6)
8266       .nr(8)
8267       .kr(1)
8268       .sr(1)
8269       .m(6)
8270       .n(8)
8271       .k(4)
8272       .qmax(128)
8273       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8274   }
8275 
TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53,strided_cm)8276   TEST(F32_GEMM_MINMAX_6X8__AARCH64_NEONFMA_PRFM_CORTEX_A53, strided_cm) {
8277     TEST_REQUIRES_ARM_NEON_FMA;
8278     GemmMicrokernelTester()
8279       .mr(6)
8280       .nr(8)
8281       .kr(1)
8282       .sr(1)
8283       .m(6)
8284       .n(8)
8285       .k(4)
8286       .cm_stride(11)
8287       .Test(xnn_f32_gemm_minmax_ukernel_6x8__aarch64_neonfma_prfm_cortex_a53, xnn_init_f32_minmax_scalar_params);
8288   }
8289 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
8290 
8291 
8292 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_eq_2)8293   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_eq_2) {
8294     TEST_REQUIRES_ARM_NEON_FMA;
8295     GemmMicrokernelTester()
8296       .mr(1)
8297       .nr(8)
8298       .kr(1)
8299       .sr(1)
8300       .m(1)
8301       .n(8)
8302       .k(2)
8303       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8304   }
8305 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,strided_cn)8306   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, strided_cn) {
8307     TEST_REQUIRES_ARM_NEON_FMA;
8308     GemmMicrokernelTester()
8309       .mr(1)
8310       .nr(8)
8311       .kr(1)
8312       .sr(1)
8313       .m(1)
8314       .n(8)
8315       .k(2)
8316       .cn_stride(11)
8317       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8318   }
8319 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_eq_2_strided_a)8320   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_eq_2_strided_a) {
8321     TEST_REQUIRES_ARM_NEON_FMA;
8322     GemmMicrokernelTester()
8323       .mr(1)
8324       .nr(8)
8325       .kr(1)
8326       .sr(1)
8327       .m(1)
8328       .n(8)
8329       .k(2)
8330       .a_stride(5)
8331       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8332   }
8333 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_eq_2_subtile)8334   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_eq_2_subtile) {
8335     TEST_REQUIRES_ARM_NEON_FMA;
8336     for (uint32_t n = 1; n <= 8; n++) {
8337       for (uint32_t m = 1; m <= 1; m++) {
8338         GemmMicrokernelTester()
8339           .mr(1)
8340           .nr(8)
8341           .kr(1)
8342           .sr(1)
8343           .m(m)
8344           .n(n)
8345           .k(2)
8346           .iterations(1)
8347           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8348       }
8349     }
8350   }
8351 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_eq_2_subtile_m)8352   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_eq_2_subtile_m) {
8353     TEST_REQUIRES_ARM_NEON_FMA;
8354     for (uint32_t m = 1; m <= 1; m++) {
8355       GemmMicrokernelTester()
8356         .mr(1)
8357         .nr(8)
8358         .kr(1)
8359         .sr(1)
8360         .m(m)
8361         .n(8)
8362         .k(2)
8363         .iterations(1)
8364         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8365     }
8366   }
8367 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_eq_2_subtile_n)8368   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_eq_2_subtile_n) {
8369     TEST_REQUIRES_ARM_NEON_FMA;
8370     for (uint32_t n = 1; n <= 8; n++) {
8371       GemmMicrokernelTester()
8372         .mr(1)
8373         .nr(8)
8374         .kr(1)
8375         .sr(1)
8376         .m(1)
8377         .n(n)
8378         .k(2)
8379         .iterations(1)
8380         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8381     }
8382   }
8383 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_lt_2)8384   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_lt_2) {
8385     TEST_REQUIRES_ARM_NEON_FMA;
8386     for (size_t k = 1; k < 2; k++) {
8387       GemmMicrokernelTester()
8388         .mr(1)
8389         .nr(8)
8390         .kr(1)
8391         .sr(1)
8392         .m(1)
8393         .n(8)
8394         .k(k)
8395         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8396     }
8397   }
8398 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_lt_2_strided_a)8399   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_lt_2_strided_a) {
8400     TEST_REQUIRES_ARM_NEON_FMA;
8401     for (size_t k = 1; k < 2; k++) {
8402       GemmMicrokernelTester()
8403         .mr(1)
8404         .nr(8)
8405         .kr(1)
8406         .sr(1)
8407         .m(1)
8408         .n(8)
8409         .k(k)
8410         .a_stride(5)
8411         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8412     }
8413   }
8414 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_lt_2_subtile)8415   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_lt_2_subtile) {
8416     TEST_REQUIRES_ARM_NEON_FMA;
8417     for (size_t k = 1; k < 2; k++) {
8418       for (uint32_t n = 1; n <= 8; n++) {
8419         for (uint32_t m = 1; m <= 1; m++) {
8420           GemmMicrokernelTester()
8421             .mr(1)
8422             .nr(8)
8423             .kr(1)
8424             .sr(1)
8425             .m(m)
8426             .n(n)
8427             .k(k)
8428             .iterations(1)
8429             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8430         }
8431       }
8432     }
8433   }
8434 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_gt_2)8435   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_gt_2) {
8436     TEST_REQUIRES_ARM_NEON_FMA;
8437     for (size_t k = 3; k < 4; k++) {
8438       GemmMicrokernelTester()
8439         .mr(1)
8440         .nr(8)
8441         .kr(1)
8442         .sr(1)
8443         .m(1)
8444         .n(8)
8445         .k(k)
8446         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8447     }
8448   }
8449 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_gt_2_strided_a)8450   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_gt_2_strided_a) {
8451     TEST_REQUIRES_ARM_NEON_FMA;
8452     for (size_t k = 3; k < 4; k++) {
8453       GemmMicrokernelTester()
8454         .mr(1)
8455         .nr(8)
8456         .kr(1)
8457         .sr(1)
8458         .m(1)
8459         .n(8)
8460         .k(k)
8461         .a_stride(7)
8462         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8463     }
8464   }
8465 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_gt_2_subtile)8466   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_gt_2_subtile) {
8467     TEST_REQUIRES_ARM_NEON_FMA;
8468     for (size_t k = 3; k < 4; k++) {
8469       for (uint32_t n = 1; n <= 8; n++) {
8470         for (uint32_t m = 1; m <= 1; m++) {
8471           GemmMicrokernelTester()
8472             .mr(1)
8473             .nr(8)
8474             .kr(1)
8475             .sr(1)
8476             .m(m)
8477             .n(n)
8478             .k(k)
8479             .iterations(1)
8480             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8481         }
8482       }
8483     }
8484   }
8485 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_div_2)8486   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_div_2) {
8487     TEST_REQUIRES_ARM_NEON_FMA;
8488     for (size_t k = 4; k <= 20; k += 2) {
8489       GemmMicrokernelTester()
8490         .mr(1)
8491         .nr(8)
8492         .kr(1)
8493         .sr(1)
8494         .m(1)
8495         .n(8)
8496         .k(k)
8497         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8498     }
8499   }
8500 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_div_2_strided_a)8501   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_div_2_strided_a) {
8502     TEST_REQUIRES_ARM_NEON_FMA;
8503     for (size_t k = 4; k <= 20; k += 2) {
8504       GemmMicrokernelTester()
8505         .mr(1)
8506         .nr(8)
8507         .kr(1)
8508         .sr(1)
8509         .m(1)
8510         .n(8)
8511         .k(k)
8512         .a_stride(23)
8513         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8514     }
8515   }
8516 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,k_div_2_subtile)8517   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, k_div_2_subtile) {
8518     TEST_REQUIRES_ARM_NEON_FMA;
8519     for (size_t k = 4; k <= 20; k += 2) {
8520       for (uint32_t n = 1; n <= 8; n++) {
8521         for (uint32_t m = 1; m <= 1; m++) {
8522           GemmMicrokernelTester()
8523             .mr(1)
8524             .nr(8)
8525             .kr(1)
8526             .sr(1)
8527             .m(m)
8528             .n(n)
8529             .k(k)
8530             .iterations(1)
8531             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8532         }
8533       }
8534     }
8535   }
8536 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,n_gt_8)8537   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, n_gt_8) {
8538     TEST_REQUIRES_ARM_NEON_FMA;
8539     for (uint32_t n = 9; n < 16; n++) {
8540       for (size_t k = 1; k <= 10; k += 3) {
8541         GemmMicrokernelTester()
8542           .mr(1)
8543           .nr(8)
8544           .kr(1)
8545           .sr(1)
8546           .m(1)
8547           .n(n)
8548           .k(k)
8549           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8550       }
8551     }
8552   }
8553 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,n_gt_8_strided_cn)8554   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, n_gt_8_strided_cn) {
8555     TEST_REQUIRES_ARM_NEON_FMA;
8556     for (uint32_t n = 9; n < 16; n++) {
8557       for (size_t k = 1; k <= 10; k += 3) {
8558         GemmMicrokernelTester()
8559           .mr(1)
8560           .nr(8)
8561           .kr(1)
8562           .sr(1)
8563           .m(1)
8564           .n(n)
8565           .k(k)
8566           .cn_stride(11)
8567           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8568       }
8569     }
8570   }
8571 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,n_gt_8_strided_a)8572   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, n_gt_8_strided_a) {
8573     TEST_REQUIRES_ARM_NEON_FMA;
8574     for (uint32_t n = 9; n < 16; n++) {
8575       for (size_t k = 1; k <= 10; k += 3) {
8576         GemmMicrokernelTester()
8577           .mr(1)
8578           .nr(8)
8579           .kr(1)
8580           .sr(1)
8581           .m(1)
8582           .n(n)
8583           .k(k)
8584           .a_stride(13)
8585           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8586       }
8587     }
8588   }
8589 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,n_gt_8_subtile)8590   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, n_gt_8_subtile) {
8591     TEST_REQUIRES_ARM_NEON_FMA;
8592     for (uint32_t n = 9; n < 16; n++) {
8593       for (size_t k = 1; k <= 10; k += 3) {
8594         for (uint32_t m = 1; m <= 1; m++) {
8595           GemmMicrokernelTester()
8596             .mr(1)
8597             .nr(8)
8598             .kr(1)
8599             .sr(1)
8600             .m(m)
8601             .n(n)
8602             .k(k)
8603             .iterations(1)
8604             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8605         }
8606       }
8607     }
8608   }
8609 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,n_div_8)8610   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, n_div_8) {
8611     TEST_REQUIRES_ARM_NEON_FMA;
8612     for (uint32_t n = 16; n <= 24; n += 8) {
8613       for (size_t k = 1; k <= 10; k += 3) {
8614         GemmMicrokernelTester()
8615           .mr(1)
8616           .nr(8)
8617           .kr(1)
8618           .sr(1)
8619           .m(1)
8620           .n(n)
8621           .k(k)
8622           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8623       }
8624     }
8625   }
8626 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,n_div_8_strided_cn)8627   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, n_div_8_strided_cn) {
8628     TEST_REQUIRES_ARM_NEON_FMA;
8629     for (uint32_t n = 16; n <= 24; n += 8) {
8630       for (size_t k = 1; k <= 10; k += 3) {
8631         GemmMicrokernelTester()
8632           .mr(1)
8633           .nr(8)
8634           .kr(1)
8635           .sr(1)
8636           .m(1)
8637           .n(n)
8638           .k(k)
8639           .cn_stride(11)
8640           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8641       }
8642     }
8643   }
8644 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,n_div_8_strided_a)8645   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, n_div_8_strided_a) {
8646     TEST_REQUIRES_ARM_NEON_FMA;
8647     for (uint32_t n = 16; n <= 24; n += 8) {
8648       for (size_t k = 1; k <= 10; k += 3) {
8649         GemmMicrokernelTester()
8650           .mr(1)
8651           .nr(8)
8652           .kr(1)
8653           .sr(1)
8654           .m(1)
8655           .n(n)
8656           .k(k)
8657           .a_stride(13)
8658           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8659       }
8660     }
8661   }
8662 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,n_div_8_subtile)8663   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, n_div_8_subtile) {
8664     TEST_REQUIRES_ARM_NEON_FMA;
8665     for (uint32_t n = 16; n <= 24; n += 8) {
8666       for (size_t k = 1; k <= 10; k += 3) {
8667         for (uint32_t m = 1; m <= 1; m++) {
8668           GemmMicrokernelTester()
8669             .mr(1)
8670             .nr(8)
8671             .kr(1)
8672             .sr(1)
8673             .m(m)
8674             .n(n)
8675             .k(k)
8676             .iterations(1)
8677             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8678         }
8679       }
8680     }
8681   }
8682 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,strided_cm_subtile)8683   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, strided_cm_subtile) {
8684     TEST_REQUIRES_ARM_NEON_FMA;
8685     for (size_t k = 1; k <= 10; k += 3) {
8686       for (uint32_t n = 1; n <= 8; n++) {
8687         for (uint32_t m = 1; m <= 1; m++) {
8688           GemmMicrokernelTester()
8689             .mr(1)
8690             .nr(8)
8691             .kr(1)
8692             .sr(1)
8693             .m(m)
8694             .n(n)
8695             .k(k)
8696             .cm_stride(11)
8697             .iterations(1)
8698             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8699         }
8700       }
8701     }
8702   }
8703 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,qmin)8704   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, qmin) {
8705     TEST_REQUIRES_ARM_NEON_FMA;
8706     GemmMicrokernelTester()
8707       .mr(1)
8708       .nr(8)
8709       .kr(1)
8710       .sr(1)
8711       .m(1)
8712       .n(8)
8713       .k(2)
8714       .qmin(128)
8715       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8716   }
8717 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,qmax)8718   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, qmax) {
8719     TEST_REQUIRES_ARM_NEON_FMA;
8720     GemmMicrokernelTester()
8721       .mr(1)
8722       .nr(8)
8723       .kr(1)
8724       .sr(1)
8725       .m(1)
8726       .n(8)
8727       .k(2)
8728       .qmax(128)
8729       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8730   }
8731 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64,strided_cm)8732   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_DUP_LD64, strided_cm) {
8733     TEST_REQUIRES_ARM_NEON_FMA;
8734     GemmMicrokernelTester()
8735       .mr(1)
8736       .nr(8)
8737       .kr(1)
8738       .sr(1)
8739       .m(1)
8740       .n(8)
8741       .k(2)
8742       .cm_stride(11)
8743       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
8744   }
8745 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
8746 
8747 
8748 #if XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_eq_2)8749   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_eq_2) {
8750     TEST_REQUIRES_ARM_NEON_FMA;
8751     GemmMicrokernelTester()
8752       .mr(1)
8753       .nr(8)
8754       .kr(1)
8755       .sr(1)
8756       .m(1)
8757       .n(8)
8758       .k(2)
8759       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8760   }
8761 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,strided_cn)8762   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, strided_cn) {
8763     TEST_REQUIRES_ARM_NEON_FMA;
8764     GemmMicrokernelTester()
8765       .mr(1)
8766       .nr(8)
8767       .kr(1)
8768       .sr(1)
8769       .m(1)
8770       .n(8)
8771       .k(2)
8772       .cn_stride(11)
8773       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8774   }
8775 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_eq_2_strided_a)8776   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_eq_2_strided_a) {
8777     TEST_REQUIRES_ARM_NEON_FMA;
8778     GemmMicrokernelTester()
8779       .mr(1)
8780       .nr(8)
8781       .kr(1)
8782       .sr(1)
8783       .m(1)
8784       .n(8)
8785       .k(2)
8786       .a_stride(5)
8787       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8788   }
8789 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_eq_2_subtile)8790   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_eq_2_subtile) {
8791     TEST_REQUIRES_ARM_NEON_FMA;
8792     for (uint32_t n = 1; n <= 8; n++) {
8793       for (uint32_t m = 1; m <= 1; m++) {
8794         GemmMicrokernelTester()
8795           .mr(1)
8796           .nr(8)
8797           .kr(1)
8798           .sr(1)
8799           .m(m)
8800           .n(n)
8801           .k(2)
8802           .iterations(1)
8803           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8804       }
8805     }
8806   }
8807 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_eq_2_subtile_m)8808   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_eq_2_subtile_m) {
8809     TEST_REQUIRES_ARM_NEON_FMA;
8810     for (uint32_t m = 1; m <= 1; m++) {
8811       GemmMicrokernelTester()
8812         .mr(1)
8813         .nr(8)
8814         .kr(1)
8815         .sr(1)
8816         .m(m)
8817         .n(8)
8818         .k(2)
8819         .iterations(1)
8820         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8821     }
8822   }
8823 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_eq_2_subtile_n)8824   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_eq_2_subtile_n) {
8825     TEST_REQUIRES_ARM_NEON_FMA;
8826     for (uint32_t n = 1; n <= 8; n++) {
8827       GemmMicrokernelTester()
8828         .mr(1)
8829         .nr(8)
8830         .kr(1)
8831         .sr(1)
8832         .m(1)
8833         .n(n)
8834         .k(2)
8835         .iterations(1)
8836         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8837     }
8838   }
8839 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_lt_2)8840   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_lt_2) {
8841     TEST_REQUIRES_ARM_NEON_FMA;
8842     for (size_t k = 1; k < 2; k++) {
8843       GemmMicrokernelTester()
8844         .mr(1)
8845         .nr(8)
8846         .kr(1)
8847         .sr(1)
8848         .m(1)
8849         .n(8)
8850         .k(k)
8851         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8852     }
8853   }
8854 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_lt_2_strided_a)8855   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_lt_2_strided_a) {
8856     TEST_REQUIRES_ARM_NEON_FMA;
8857     for (size_t k = 1; k < 2; k++) {
8858       GemmMicrokernelTester()
8859         .mr(1)
8860         .nr(8)
8861         .kr(1)
8862         .sr(1)
8863         .m(1)
8864         .n(8)
8865         .k(k)
8866         .a_stride(5)
8867         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8868     }
8869   }
8870 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_lt_2_subtile)8871   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_lt_2_subtile) {
8872     TEST_REQUIRES_ARM_NEON_FMA;
8873     for (size_t k = 1; k < 2; k++) {
8874       for (uint32_t n = 1; n <= 8; n++) {
8875         for (uint32_t m = 1; m <= 1; m++) {
8876           GemmMicrokernelTester()
8877             .mr(1)
8878             .nr(8)
8879             .kr(1)
8880             .sr(1)
8881             .m(m)
8882             .n(n)
8883             .k(k)
8884             .iterations(1)
8885             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8886         }
8887       }
8888     }
8889   }
8890 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_gt_2)8891   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_gt_2) {
8892     TEST_REQUIRES_ARM_NEON_FMA;
8893     for (size_t k = 3; k < 4; k++) {
8894       GemmMicrokernelTester()
8895         .mr(1)
8896         .nr(8)
8897         .kr(1)
8898         .sr(1)
8899         .m(1)
8900         .n(8)
8901         .k(k)
8902         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8903     }
8904   }
8905 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_gt_2_strided_a)8906   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_gt_2_strided_a) {
8907     TEST_REQUIRES_ARM_NEON_FMA;
8908     for (size_t k = 3; k < 4; k++) {
8909       GemmMicrokernelTester()
8910         .mr(1)
8911         .nr(8)
8912         .kr(1)
8913         .sr(1)
8914         .m(1)
8915         .n(8)
8916         .k(k)
8917         .a_stride(7)
8918         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8919     }
8920   }
8921 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_gt_2_subtile)8922   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_gt_2_subtile) {
8923     TEST_REQUIRES_ARM_NEON_FMA;
8924     for (size_t k = 3; k < 4; k++) {
8925       for (uint32_t n = 1; n <= 8; n++) {
8926         for (uint32_t m = 1; m <= 1; m++) {
8927           GemmMicrokernelTester()
8928             .mr(1)
8929             .nr(8)
8930             .kr(1)
8931             .sr(1)
8932             .m(m)
8933             .n(n)
8934             .k(k)
8935             .iterations(1)
8936             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8937         }
8938       }
8939     }
8940   }
8941 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_div_2)8942   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_div_2) {
8943     TEST_REQUIRES_ARM_NEON_FMA;
8944     for (size_t k = 4; k <= 20; k += 2) {
8945       GemmMicrokernelTester()
8946         .mr(1)
8947         .nr(8)
8948         .kr(1)
8949         .sr(1)
8950         .m(1)
8951         .n(8)
8952         .k(k)
8953         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8954     }
8955   }
8956 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_div_2_strided_a)8957   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_div_2_strided_a) {
8958     TEST_REQUIRES_ARM_NEON_FMA;
8959     for (size_t k = 4; k <= 20; k += 2) {
8960       GemmMicrokernelTester()
8961         .mr(1)
8962         .nr(8)
8963         .kr(1)
8964         .sr(1)
8965         .m(1)
8966         .n(8)
8967         .k(k)
8968         .a_stride(23)
8969         .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8970     }
8971   }
8972 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,k_div_2_subtile)8973   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, k_div_2_subtile) {
8974     TEST_REQUIRES_ARM_NEON_FMA;
8975     for (size_t k = 4; k <= 20; k += 2) {
8976       for (uint32_t n = 1; n <= 8; n++) {
8977         for (uint32_t m = 1; m <= 1; m++) {
8978           GemmMicrokernelTester()
8979             .mr(1)
8980             .nr(8)
8981             .kr(1)
8982             .sr(1)
8983             .m(m)
8984             .n(n)
8985             .k(k)
8986             .iterations(1)
8987             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
8988         }
8989       }
8990     }
8991   }
8992 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,n_gt_8)8993   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, n_gt_8) {
8994     TEST_REQUIRES_ARM_NEON_FMA;
8995     for (uint32_t n = 9; n < 16; n++) {
8996       for (size_t k = 1; k <= 10; k += 3) {
8997         GemmMicrokernelTester()
8998           .mr(1)
8999           .nr(8)
9000           .kr(1)
9001           .sr(1)
9002           .m(1)
9003           .n(n)
9004           .k(k)
9005           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9006       }
9007     }
9008   }
9009 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,n_gt_8_strided_cn)9010   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, n_gt_8_strided_cn) {
9011     TEST_REQUIRES_ARM_NEON_FMA;
9012     for (uint32_t n = 9; n < 16; n++) {
9013       for (size_t k = 1; k <= 10; k += 3) {
9014         GemmMicrokernelTester()
9015           .mr(1)
9016           .nr(8)
9017           .kr(1)
9018           .sr(1)
9019           .m(1)
9020           .n(n)
9021           .k(k)
9022           .cn_stride(11)
9023           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9024       }
9025     }
9026   }
9027 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,n_gt_8_strided_a)9028   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, n_gt_8_strided_a) {
9029     TEST_REQUIRES_ARM_NEON_FMA;
9030     for (uint32_t n = 9; n < 16; n++) {
9031       for (size_t k = 1; k <= 10; k += 3) {
9032         GemmMicrokernelTester()
9033           .mr(1)
9034           .nr(8)
9035           .kr(1)
9036           .sr(1)
9037           .m(1)
9038           .n(n)
9039           .k(k)
9040           .a_stride(13)
9041           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9042       }
9043     }
9044   }
9045 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,n_gt_8_subtile)9046   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, n_gt_8_subtile) {
9047     TEST_REQUIRES_ARM_NEON_FMA;
9048     for (uint32_t n = 9; n < 16; n++) {
9049       for (size_t k = 1; k <= 10; k += 3) {
9050         for (uint32_t m = 1; m <= 1; m++) {
9051           GemmMicrokernelTester()
9052             .mr(1)
9053             .nr(8)
9054             .kr(1)
9055             .sr(1)
9056             .m(m)
9057             .n(n)
9058             .k(k)
9059             .iterations(1)
9060             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9061         }
9062       }
9063     }
9064   }
9065 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,n_div_8)9066   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, n_div_8) {
9067     TEST_REQUIRES_ARM_NEON_FMA;
9068     for (uint32_t n = 16; n <= 24; n += 8) {
9069       for (size_t k = 1; k <= 10; k += 3) {
9070         GemmMicrokernelTester()
9071           .mr(1)
9072           .nr(8)
9073           .kr(1)
9074           .sr(1)
9075           .m(1)
9076           .n(n)
9077           .k(k)
9078           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9079       }
9080     }
9081   }
9082 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,n_div_8_strided_cn)9083   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, n_div_8_strided_cn) {
9084     TEST_REQUIRES_ARM_NEON_FMA;
9085     for (uint32_t n = 16; n <= 24; n += 8) {
9086       for (size_t k = 1; k <= 10; k += 3) {
9087         GemmMicrokernelTester()
9088           .mr(1)
9089           .nr(8)
9090           .kr(1)
9091           .sr(1)
9092           .m(1)
9093           .n(n)
9094           .k(k)
9095           .cn_stride(11)
9096           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9097       }
9098     }
9099   }
9100 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,n_div_8_strided_a)9101   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, n_div_8_strided_a) {
9102     TEST_REQUIRES_ARM_NEON_FMA;
9103     for (uint32_t n = 16; n <= 24; n += 8) {
9104       for (size_t k = 1; k <= 10; k += 3) {
9105         GemmMicrokernelTester()
9106           .mr(1)
9107           .nr(8)
9108           .kr(1)
9109           .sr(1)
9110           .m(1)
9111           .n(n)
9112           .k(k)
9113           .a_stride(13)
9114           .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9115       }
9116     }
9117   }
9118 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,n_div_8_subtile)9119   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, n_div_8_subtile) {
9120     TEST_REQUIRES_ARM_NEON_FMA;
9121     for (uint32_t n = 16; n <= 24; n += 8) {
9122       for (size_t k = 1; k <= 10; k += 3) {
9123         for (uint32_t m = 1; m <= 1; m++) {
9124           GemmMicrokernelTester()
9125             .mr(1)
9126             .nr(8)
9127             .kr(1)
9128             .sr(1)
9129             .m(m)
9130             .n(n)
9131             .k(k)
9132             .iterations(1)
9133             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9134         }
9135       }
9136     }
9137   }
9138 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,strided_cm_subtile)9139   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, strided_cm_subtile) {
9140     TEST_REQUIRES_ARM_NEON_FMA;
9141     for (size_t k = 1; k <= 10; k += 3) {
9142       for (uint32_t n = 1; n <= 8; n++) {
9143         for (uint32_t m = 1; m <= 1; m++) {
9144           GemmMicrokernelTester()
9145             .mr(1)
9146             .nr(8)
9147             .kr(1)
9148             .sr(1)
9149             .m(m)
9150             .n(n)
9151             .k(k)
9152             .cm_stride(11)
9153             .iterations(1)
9154             .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9155         }
9156       }
9157     }
9158   }
9159 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,qmin)9160   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, qmin) {
9161     TEST_REQUIRES_ARM_NEON_FMA;
9162     GemmMicrokernelTester()
9163       .mr(1)
9164       .nr(8)
9165       .kr(1)
9166       .sr(1)
9167       .m(1)
9168       .n(8)
9169       .k(2)
9170       .qmin(128)
9171       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9172   }
9173 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,qmax)9174   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, qmax) {
9175     TEST_REQUIRES_ARM_NEON_FMA;
9176     GemmMicrokernelTester()
9177       .mr(1)
9178       .nr(8)
9179       .kr(1)
9180       .sr(1)
9181       .m(1)
9182       .n(8)
9183       .k(2)
9184       .qmax(128)
9185       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9186   }
9187 
TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64,strided_cm)9188   TEST(F32_GEMM_MINMAX_1X8__NEONFMA_LANE_LD64, strided_cm) {
9189     TEST_REQUIRES_ARM_NEON_FMA;
9190     GemmMicrokernelTester()
9191       .mr(1)
9192       .nr(8)
9193       .kr(1)
9194       .sr(1)
9195       .m(1)
9196       .n(8)
9197       .k(2)
9198       .cm_stride(11)
9199       .Test(xnn_f32_gemm_minmax_ukernel_1x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9200   }
9201 #endif  // XNN_ARCH_ARM64
9202 
9203 
9204 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_eq_2)9205   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_eq_2) {
9206     TEST_REQUIRES_ARM_NEON;
9207     GemmMicrokernelTester()
9208       .mr(4)
9209       .nr(2)
9210       .kr(1)
9211       .sr(1)
9212       .m(4)
9213       .n(2)
9214       .k(2)
9215       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9216   }
9217 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,strided_cn)9218   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, strided_cn) {
9219     TEST_REQUIRES_ARM_NEON;
9220     GemmMicrokernelTester()
9221       .mr(4)
9222       .nr(2)
9223       .kr(1)
9224       .sr(1)
9225       .m(4)
9226       .n(2)
9227       .k(2)
9228       .cn_stride(5)
9229       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9230   }
9231 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_eq_2_strided_a)9232   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_eq_2_strided_a) {
9233     TEST_REQUIRES_ARM_NEON;
9234     GemmMicrokernelTester()
9235       .mr(4)
9236       .nr(2)
9237       .kr(1)
9238       .sr(1)
9239       .m(4)
9240       .n(2)
9241       .k(2)
9242       .a_stride(5)
9243       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9244   }
9245 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_eq_2_subtile)9246   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_eq_2_subtile) {
9247     TEST_REQUIRES_ARM_NEON;
9248     for (uint32_t n = 1; n <= 2; n++) {
9249       for (uint32_t m = 1; m <= 4; m++) {
9250         GemmMicrokernelTester()
9251           .mr(4)
9252           .nr(2)
9253           .kr(1)
9254           .sr(1)
9255           .m(m)
9256           .n(n)
9257           .k(2)
9258           .iterations(1)
9259           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9260       }
9261     }
9262   }
9263 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_eq_2_subtile_m)9264   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_eq_2_subtile_m) {
9265     TEST_REQUIRES_ARM_NEON;
9266     for (uint32_t m = 1; m <= 4; m++) {
9267       GemmMicrokernelTester()
9268         .mr(4)
9269         .nr(2)
9270         .kr(1)
9271         .sr(1)
9272         .m(m)
9273         .n(2)
9274         .k(2)
9275         .iterations(1)
9276         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9277     }
9278   }
9279 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_eq_2_subtile_n)9280   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_eq_2_subtile_n) {
9281     TEST_REQUIRES_ARM_NEON;
9282     for (uint32_t n = 1; n <= 2; n++) {
9283       GemmMicrokernelTester()
9284         .mr(4)
9285         .nr(2)
9286         .kr(1)
9287         .sr(1)
9288         .m(4)
9289         .n(n)
9290         .k(2)
9291         .iterations(1)
9292         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9293     }
9294   }
9295 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_lt_2)9296   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_lt_2) {
9297     TEST_REQUIRES_ARM_NEON;
9298     for (size_t k = 1; k < 2; k++) {
9299       GemmMicrokernelTester()
9300         .mr(4)
9301         .nr(2)
9302         .kr(1)
9303         .sr(1)
9304         .m(4)
9305         .n(2)
9306         .k(k)
9307         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9308     }
9309   }
9310 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_lt_2_strided_a)9311   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_lt_2_strided_a) {
9312     TEST_REQUIRES_ARM_NEON;
9313     for (size_t k = 1; k < 2; k++) {
9314       GemmMicrokernelTester()
9315         .mr(4)
9316         .nr(2)
9317         .kr(1)
9318         .sr(1)
9319         .m(4)
9320         .n(2)
9321         .k(k)
9322         .a_stride(5)
9323         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9324     }
9325   }
9326 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_lt_2_subtile)9327   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_lt_2_subtile) {
9328     TEST_REQUIRES_ARM_NEON;
9329     for (size_t k = 1; k < 2; k++) {
9330       for (uint32_t n = 1; n <= 2; n++) {
9331         for (uint32_t m = 1; m <= 4; m++) {
9332           GemmMicrokernelTester()
9333             .mr(4)
9334             .nr(2)
9335             .kr(1)
9336             .sr(1)
9337             .m(m)
9338             .n(n)
9339             .k(k)
9340             .iterations(1)
9341             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9342         }
9343       }
9344     }
9345   }
9346 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_gt_2)9347   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_gt_2) {
9348     TEST_REQUIRES_ARM_NEON;
9349     for (size_t k = 3; k < 4; k++) {
9350       GemmMicrokernelTester()
9351         .mr(4)
9352         .nr(2)
9353         .kr(1)
9354         .sr(1)
9355         .m(4)
9356         .n(2)
9357         .k(k)
9358         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9359     }
9360   }
9361 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_gt_2_strided_a)9362   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_gt_2_strided_a) {
9363     TEST_REQUIRES_ARM_NEON;
9364     for (size_t k = 3; k < 4; k++) {
9365       GemmMicrokernelTester()
9366         .mr(4)
9367         .nr(2)
9368         .kr(1)
9369         .sr(1)
9370         .m(4)
9371         .n(2)
9372         .k(k)
9373         .a_stride(7)
9374         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9375     }
9376   }
9377 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_gt_2_subtile)9378   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_gt_2_subtile) {
9379     TEST_REQUIRES_ARM_NEON;
9380     for (size_t k = 3; k < 4; k++) {
9381       for (uint32_t n = 1; n <= 2; n++) {
9382         for (uint32_t m = 1; m <= 4; m++) {
9383           GemmMicrokernelTester()
9384             .mr(4)
9385             .nr(2)
9386             .kr(1)
9387             .sr(1)
9388             .m(m)
9389             .n(n)
9390             .k(k)
9391             .iterations(1)
9392             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9393         }
9394       }
9395     }
9396   }
9397 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_div_2)9398   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_div_2) {
9399     TEST_REQUIRES_ARM_NEON;
9400     for (size_t k = 4; k <= 20; k += 2) {
9401       GemmMicrokernelTester()
9402         .mr(4)
9403         .nr(2)
9404         .kr(1)
9405         .sr(1)
9406         .m(4)
9407         .n(2)
9408         .k(k)
9409         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9410     }
9411   }
9412 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_div_2_strided_a)9413   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_div_2_strided_a) {
9414     TEST_REQUIRES_ARM_NEON;
9415     for (size_t k = 4; k <= 20; k += 2) {
9416       GemmMicrokernelTester()
9417         .mr(4)
9418         .nr(2)
9419         .kr(1)
9420         .sr(1)
9421         .m(4)
9422         .n(2)
9423         .k(k)
9424         .a_stride(23)
9425         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9426     }
9427   }
9428 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,k_div_2_subtile)9429   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, k_div_2_subtile) {
9430     TEST_REQUIRES_ARM_NEON;
9431     for (size_t k = 4; k <= 20; k += 2) {
9432       for (uint32_t n = 1; n <= 2; n++) {
9433         for (uint32_t m = 1; m <= 4; m++) {
9434           GemmMicrokernelTester()
9435             .mr(4)
9436             .nr(2)
9437             .kr(1)
9438             .sr(1)
9439             .m(m)
9440             .n(n)
9441             .k(k)
9442             .iterations(1)
9443             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9444         }
9445       }
9446     }
9447   }
9448 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,n_gt_2)9449   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, n_gt_2) {
9450     TEST_REQUIRES_ARM_NEON;
9451     for (uint32_t n = 3; n < 4; n++) {
9452       for (size_t k = 1; k <= 10; k += 3) {
9453         GemmMicrokernelTester()
9454           .mr(4)
9455           .nr(2)
9456           .kr(1)
9457           .sr(1)
9458           .m(4)
9459           .n(n)
9460           .k(k)
9461           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9462       }
9463     }
9464   }
9465 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,n_gt_2_strided_cn)9466   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, n_gt_2_strided_cn) {
9467     TEST_REQUIRES_ARM_NEON;
9468     for (uint32_t n = 3; n < 4; n++) {
9469       for (size_t k = 1; k <= 10; k += 3) {
9470         GemmMicrokernelTester()
9471           .mr(4)
9472           .nr(2)
9473           .kr(1)
9474           .sr(1)
9475           .m(4)
9476           .n(n)
9477           .k(k)
9478           .cn_stride(5)
9479           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9480       }
9481     }
9482   }
9483 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,n_gt_2_strided_a)9484   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, n_gt_2_strided_a) {
9485     TEST_REQUIRES_ARM_NEON;
9486     for (uint32_t n = 3; n < 4; n++) {
9487       for (size_t k = 1; k <= 10; k += 3) {
9488         GemmMicrokernelTester()
9489           .mr(4)
9490           .nr(2)
9491           .kr(1)
9492           .sr(1)
9493           .m(4)
9494           .n(n)
9495           .k(k)
9496           .a_stride(13)
9497           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9498       }
9499     }
9500   }
9501 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,n_gt_2_subtile)9502   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, n_gt_2_subtile) {
9503     TEST_REQUIRES_ARM_NEON;
9504     for (uint32_t n = 3; n < 4; n++) {
9505       for (size_t k = 1; k <= 10; k += 3) {
9506         for (uint32_t m = 1; m <= 4; m++) {
9507           GemmMicrokernelTester()
9508             .mr(4)
9509             .nr(2)
9510             .kr(1)
9511             .sr(1)
9512             .m(m)
9513             .n(n)
9514             .k(k)
9515             .iterations(1)
9516             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9517         }
9518       }
9519     }
9520   }
9521 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,n_div_2)9522   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, n_div_2) {
9523     TEST_REQUIRES_ARM_NEON;
9524     for (uint32_t n = 4; n <= 6; n += 2) {
9525       for (size_t k = 1; k <= 10; k += 3) {
9526         GemmMicrokernelTester()
9527           .mr(4)
9528           .nr(2)
9529           .kr(1)
9530           .sr(1)
9531           .m(4)
9532           .n(n)
9533           .k(k)
9534           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9535       }
9536     }
9537   }
9538 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,n_div_2_strided_cn)9539   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, n_div_2_strided_cn) {
9540     TEST_REQUIRES_ARM_NEON;
9541     for (uint32_t n = 4; n <= 6; n += 2) {
9542       for (size_t k = 1; k <= 10; k += 3) {
9543         GemmMicrokernelTester()
9544           .mr(4)
9545           .nr(2)
9546           .kr(1)
9547           .sr(1)
9548           .m(4)
9549           .n(n)
9550           .k(k)
9551           .cn_stride(5)
9552           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9553       }
9554     }
9555   }
9556 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,n_div_2_strided_a)9557   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, n_div_2_strided_a) {
9558     TEST_REQUIRES_ARM_NEON;
9559     for (uint32_t n = 4; n <= 6; n += 2) {
9560       for (size_t k = 1; k <= 10; k += 3) {
9561         GemmMicrokernelTester()
9562           .mr(4)
9563           .nr(2)
9564           .kr(1)
9565           .sr(1)
9566           .m(4)
9567           .n(n)
9568           .k(k)
9569           .a_stride(13)
9570           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9571       }
9572     }
9573   }
9574 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,n_div_2_subtile)9575   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, n_div_2_subtile) {
9576     TEST_REQUIRES_ARM_NEON;
9577     for (uint32_t n = 4; n <= 6; n += 2) {
9578       for (size_t k = 1; k <= 10; k += 3) {
9579         for (uint32_t m = 1; m <= 4; m++) {
9580           GemmMicrokernelTester()
9581             .mr(4)
9582             .nr(2)
9583             .kr(1)
9584             .sr(1)
9585             .m(m)
9586             .n(n)
9587             .k(k)
9588             .iterations(1)
9589             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9590         }
9591       }
9592     }
9593   }
9594 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,strided_cm_subtile)9595   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, strided_cm_subtile) {
9596     TEST_REQUIRES_ARM_NEON;
9597     for (size_t k = 1; k <= 10; k += 3) {
9598       for (uint32_t n = 1; n <= 2; n++) {
9599         for (uint32_t m = 1; m <= 4; m++) {
9600           GemmMicrokernelTester()
9601             .mr(4)
9602             .nr(2)
9603             .kr(1)
9604             .sr(1)
9605             .m(m)
9606             .n(n)
9607             .k(k)
9608             .cm_stride(5)
9609             .iterations(1)
9610             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9611         }
9612       }
9613     }
9614   }
9615 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,qmin)9616   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, qmin) {
9617     TEST_REQUIRES_ARM_NEON;
9618     GemmMicrokernelTester()
9619       .mr(4)
9620       .nr(2)
9621       .kr(1)
9622       .sr(1)
9623       .m(4)
9624       .n(2)
9625       .k(2)
9626       .qmin(128)
9627       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9628   }
9629 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,qmax)9630   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, qmax) {
9631     TEST_REQUIRES_ARM_NEON;
9632     GemmMicrokernelTester()
9633       .mr(4)
9634       .nr(2)
9635       .kr(1)
9636       .sr(1)
9637       .m(4)
9638       .n(2)
9639       .k(2)
9640       .qmax(128)
9641       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9642   }
9643 
TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64,strided_cm)9644   TEST(F32_GEMM_MINMAX_4X2__NEON_LANE_LD64, strided_cm) {
9645     TEST_REQUIRES_ARM_NEON;
9646     GemmMicrokernelTester()
9647       .mr(4)
9648       .nr(2)
9649       .kr(1)
9650       .sr(1)
9651       .m(4)
9652       .n(2)
9653       .k(2)
9654       .cm_stride(5)
9655       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
9656   }
9657 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
9658 
9659 
9660 #if XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_eq_2)9661   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_eq_2) {
9662     TEST_REQUIRES_ARM_NEON_FMA;
9663     GemmMicrokernelTester()
9664       .mr(4)
9665       .nr(2)
9666       .kr(1)
9667       .sr(1)
9668       .m(4)
9669       .n(2)
9670       .k(2)
9671       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9672   }
9673 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,strided_cn)9674   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, strided_cn) {
9675     TEST_REQUIRES_ARM_NEON_FMA;
9676     GemmMicrokernelTester()
9677       .mr(4)
9678       .nr(2)
9679       .kr(1)
9680       .sr(1)
9681       .m(4)
9682       .n(2)
9683       .k(2)
9684       .cn_stride(5)
9685       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9686   }
9687 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_eq_2_strided_a)9688   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_eq_2_strided_a) {
9689     TEST_REQUIRES_ARM_NEON_FMA;
9690     GemmMicrokernelTester()
9691       .mr(4)
9692       .nr(2)
9693       .kr(1)
9694       .sr(1)
9695       .m(4)
9696       .n(2)
9697       .k(2)
9698       .a_stride(5)
9699       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9700   }
9701 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_eq_2_subtile)9702   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_eq_2_subtile) {
9703     TEST_REQUIRES_ARM_NEON_FMA;
9704     for (uint32_t n = 1; n <= 2; n++) {
9705       for (uint32_t m = 1; m <= 4; m++) {
9706         GemmMicrokernelTester()
9707           .mr(4)
9708           .nr(2)
9709           .kr(1)
9710           .sr(1)
9711           .m(m)
9712           .n(n)
9713           .k(2)
9714           .iterations(1)
9715           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9716       }
9717     }
9718   }
9719 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_eq_2_subtile_m)9720   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_eq_2_subtile_m) {
9721     TEST_REQUIRES_ARM_NEON_FMA;
9722     for (uint32_t m = 1; m <= 4; m++) {
9723       GemmMicrokernelTester()
9724         .mr(4)
9725         .nr(2)
9726         .kr(1)
9727         .sr(1)
9728         .m(m)
9729         .n(2)
9730         .k(2)
9731         .iterations(1)
9732         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9733     }
9734   }
9735 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_eq_2_subtile_n)9736   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_eq_2_subtile_n) {
9737     TEST_REQUIRES_ARM_NEON_FMA;
9738     for (uint32_t n = 1; n <= 2; n++) {
9739       GemmMicrokernelTester()
9740         .mr(4)
9741         .nr(2)
9742         .kr(1)
9743         .sr(1)
9744         .m(4)
9745         .n(n)
9746         .k(2)
9747         .iterations(1)
9748         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9749     }
9750   }
9751 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_lt_2)9752   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_lt_2) {
9753     TEST_REQUIRES_ARM_NEON_FMA;
9754     for (size_t k = 1; k < 2; k++) {
9755       GemmMicrokernelTester()
9756         .mr(4)
9757         .nr(2)
9758         .kr(1)
9759         .sr(1)
9760         .m(4)
9761         .n(2)
9762         .k(k)
9763         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9764     }
9765   }
9766 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_lt_2_strided_a)9767   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_lt_2_strided_a) {
9768     TEST_REQUIRES_ARM_NEON_FMA;
9769     for (size_t k = 1; k < 2; k++) {
9770       GemmMicrokernelTester()
9771         .mr(4)
9772         .nr(2)
9773         .kr(1)
9774         .sr(1)
9775         .m(4)
9776         .n(2)
9777         .k(k)
9778         .a_stride(5)
9779         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9780     }
9781   }
9782 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_lt_2_subtile)9783   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_lt_2_subtile) {
9784     TEST_REQUIRES_ARM_NEON_FMA;
9785     for (size_t k = 1; k < 2; k++) {
9786       for (uint32_t n = 1; n <= 2; n++) {
9787         for (uint32_t m = 1; m <= 4; m++) {
9788           GemmMicrokernelTester()
9789             .mr(4)
9790             .nr(2)
9791             .kr(1)
9792             .sr(1)
9793             .m(m)
9794             .n(n)
9795             .k(k)
9796             .iterations(1)
9797             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9798         }
9799       }
9800     }
9801   }
9802 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_gt_2)9803   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_gt_2) {
9804     TEST_REQUIRES_ARM_NEON_FMA;
9805     for (size_t k = 3; k < 4; k++) {
9806       GemmMicrokernelTester()
9807         .mr(4)
9808         .nr(2)
9809         .kr(1)
9810         .sr(1)
9811         .m(4)
9812         .n(2)
9813         .k(k)
9814         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9815     }
9816   }
9817 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_gt_2_strided_a)9818   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_gt_2_strided_a) {
9819     TEST_REQUIRES_ARM_NEON_FMA;
9820     for (size_t k = 3; k < 4; k++) {
9821       GemmMicrokernelTester()
9822         .mr(4)
9823         .nr(2)
9824         .kr(1)
9825         .sr(1)
9826         .m(4)
9827         .n(2)
9828         .k(k)
9829         .a_stride(7)
9830         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9831     }
9832   }
9833 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_gt_2_subtile)9834   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_gt_2_subtile) {
9835     TEST_REQUIRES_ARM_NEON_FMA;
9836     for (size_t k = 3; k < 4; k++) {
9837       for (uint32_t n = 1; n <= 2; n++) {
9838         for (uint32_t m = 1; m <= 4; m++) {
9839           GemmMicrokernelTester()
9840             .mr(4)
9841             .nr(2)
9842             .kr(1)
9843             .sr(1)
9844             .m(m)
9845             .n(n)
9846             .k(k)
9847             .iterations(1)
9848             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9849         }
9850       }
9851     }
9852   }
9853 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_div_2)9854   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_div_2) {
9855     TEST_REQUIRES_ARM_NEON_FMA;
9856     for (size_t k = 4; k <= 20; k += 2) {
9857       GemmMicrokernelTester()
9858         .mr(4)
9859         .nr(2)
9860         .kr(1)
9861         .sr(1)
9862         .m(4)
9863         .n(2)
9864         .k(k)
9865         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9866     }
9867   }
9868 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_div_2_strided_a)9869   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_div_2_strided_a) {
9870     TEST_REQUIRES_ARM_NEON_FMA;
9871     for (size_t k = 4; k <= 20; k += 2) {
9872       GemmMicrokernelTester()
9873         .mr(4)
9874         .nr(2)
9875         .kr(1)
9876         .sr(1)
9877         .m(4)
9878         .n(2)
9879         .k(k)
9880         .a_stride(23)
9881         .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9882     }
9883   }
9884 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,k_div_2_subtile)9885   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, k_div_2_subtile) {
9886     TEST_REQUIRES_ARM_NEON_FMA;
9887     for (size_t k = 4; k <= 20; k += 2) {
9888       for (uint32_t n = 1; n <= 2; n++) {
9889         for (uint32_t m = 1; m <= 4; m++) {
9890           GemmMicrokernelTester()
9891             .mr(4)
9892             .nr(2)
9893             .kr(1)
9894             .sr(1)
9895             .m(m)
9896             .n(n)
9897             .k(k)
9898             .iterations(1)
9899             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9900         }
9901       }
9902     }
9903   }
9904 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,n_gt_2)9905   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, n_gt_2) {
9906     TEST_REQUIRES_ARM_NEON_FMA;
9907     for (uint32_t n = 3; n < 4; n++) {
9908       for (size_t k = 1; k <= 10; k += 3) {
9909         GemmMicrokernelTester()
9910           .mr(4)
9911           .nr(2)
9912           .kr(1)
9913           .sr(1)
9914           .m(4)
9915           .n(n)
9916           .k(k)
9917           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9918       }
9919     }
9920   }
9921 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,n_gt_2_strided_cn)9922   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, n_gt_2_strided_cn) {
9923     TEST_REQUIRES_ARM_NEON_FMA;
9924     for (uint32_t n = 3; n < 4; n++) {
9925       for (size_t k = 1; k <= 10; k += 3) {
9926         GemmMicrokernelTester()
9927           .mr(4)
9928           .nr(2)
9929           .kr(1)
9930           .sr(1)
9931           .m(4)
9932           .n(n)
9933           .k(k)
9934           .cn_stride(5)
9935           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9936       }
9937     }
9938   }
9939 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,n_gt_2_strided_a)9940   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, n_gt_2_strided_a) {
9941     TEST_REQUIRES_ARM_NEON_FMA;
9942     for (uint32_t n = 3; n < 4; n++) {
9943       for (size_t k = 1; k <= 10; k += 3) {
9944         GemmMicrokernelTester()
9945           .mr(4)
9946           .nr(2)
9947           .kr(1)
9948           .sr(1)
9949           .m(4)
9950           .n(n)
9951           .k(k)
9952           .a_stride(13)
9953           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9954       }
9955     }
9956   }
9957 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,n_gt_2_subtile)9958   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, n_gt_2_subtile) {
9959     TEST_REQUIRES_ARM_NEON_FMA;
9960     for (uint32_t n = 3; n < 4; n++) {
9961       for (size_t k = 1; k <= 10; k += 3) {
9962         for (uint32_t m = 1; m <= 4; m++) {
9963           GemmMicrokernelTester()
9964             .mr(4)
9965             .nr(2)
9966             .kr(1)
9967             .sr(1)
9968             .m(m)
9969             .n(n)
9970             .k(k)
9971             .iterations(1)
9972             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9973         }
9974       }
9975     }
9976   }
9977 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,n_div_2)9978   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, n_div_2) {
9979     TEST_REQUIRES_ARM_NEON_FMA;
9980     for (uint32_t n = 4; n <= 6; n += 2) {
9981       for (size_t k = 1; k <= 10; k += 3) {
9982         GemmMicrokernelTester()
9983           .mr(4)
9984           .nr(2)
9985           .kr(1)
9986           .sr(1)
9987           .m(4)
9988           .n(n)
9989           .k(k)
9990           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
9991       }
9992     }
9993   }
9994 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,n_div_2_strided_cn)9995   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, n_div_2_strided_cn) {
9996     TEST_REQUIRES_ARM_NEON_FMA;
9997     for (uint32_t n = 4; n <= 6; n += 2) {
9998       for (size_t k = 1; k <= 10; k += 3) {
9999         GemmMicrokernelTester()
10000           .mr(4)
10001           .nr(2)
10002           .kr(1)
10003           .sr(1)
10004           .m(4)
10005           .n(n)
10006           .k(k)
10007           .cn_stride(5)
10008           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
10009       }
10010     }
10011   }
10012 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,n_div_2_strided_a)10013   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, n_div_2_strided_a) {
10014     TEST_REQUIRES_ARM_NEON_FMA;
10015     for (uint32_t n = 4; n <= 6; n += 2) {
10016       for (size_t k = 1; k <= 10; k += 3) {
10017         GemmMicrokernelTester()
10018           .mr(4)
10019           .nr(2)
10020           .kr(1)
10021           .sr(1)
10022           .m(4)
10023           .n(n)
10024           .k(k)
10025           .a_stride(13)
10026           .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
10027       }
10028     }
10029   }
10030 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,n_div_2_subtile)10031   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, n_div_2_subtile) {
10032     TEST_REQUIRES_ARM_NEON_FMA;
10033     for (uint32_t n = 4; n <= 6; n += 2) {
10034       for (size_t k = 1; k <= 10; k += 3) {
10035         for (uint32_t m = 1; m <= 4; m++) {
10036           GemmMicrokernelTester()
10037             .mr(4)
10038             .nr(2)
10039             .kr(1)
10040             .sr(1)
10041             .m(m)
10042             .n(n)
10043             .k(k)
10044             .iterations(1)
10045             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
10046         }
10047       }
10048     }
10049   }
10050 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,strided_cm_subtile)10051   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, strided_cm_subtile) {
10052     TEST_REQUIRES_ARM_NEON_FMA;
10053     for (size_t k = 1; k <= 10; k += 3) {
10054       for (uint32_t n = 1; n <= 2; n++) {
10055         for (uint32_t m = 1; m <= 4; m++) {
10056           GemmMicrokernelTester()
10057             .mr(4)
10058             .nr(2)
10059             .kr(1)
10060             .sr(1)
10061             .m(m)
10062             .n(n)
10063             .k(k)
10064             .cm_stride(5)
10065             .iterations(1)
10066             .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
10067         }
10068       }
10069     }
10070   }
10071 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,qmin)10072   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, qmin) {
10073     TEST_REQUIRES_ARM_NEON_FMA;
10074     GemmMicrokernelTester()
10075       .mr(4)
10076       .nr(2)
10077       .kr(1)
10078       .sr(1)
10079       .m(4)
10080       .n(2)
10081       .k(2)
10082       .qmin(128)
10083       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
10084   }
10085 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,qmax)10086   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, qmax) {
10087     TEST_REQUIRES_ARM_NEON_FMA;
10088     GemmMicrokernelTester()
10089       .mr(4)
10090       .nr(2)
10091       .kr(1)
10092       .sr(1)
10093       .m(4)
10094       .n(2)
10095       .k(2)
10096       .qmax(128)
10097       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
10098   }
10099 
TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64,strided_cm)10100   TEST(F32_GEMM_MINMAX_4X2__NEONFMA_LANE_LD64, strided_cm) {
10101     TEST_REQUIRES_ARM_NEON_FMA;
10102     GemmMicrokernelTester()
10103       .mr(4)
10104       .nr(2)
10105       .kr(1)
10106       .sr(1)
10107       .m(4)
10108       .n(2)
10109       .k(2)
10110       .cm_stride(5)
10111       .Test(xnn_f32_gemm_minmax_ukernel_4x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
10112   }
10113 #endif  // XNN_ARCH_ARM64
10114 
10115 
10116 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_eq_2)10117   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_eq_2) {
10118     TEST_REQUIRES_ARM_NEON;
10119     GemmMicrokernelTester()
10120       .mr(4)
10121       .nr(8)
10122       .kr(1)
10123       .sr(1)
10124       .m(4)
10125       .n(8)
10126       .k(2)
10127       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10128   }
10129 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,strided_cn)10130   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, strided_cn) {
10131     TEST_REQUIRES_ARM_NEON;
10132     GemmMicrokernelTester()
10133       .mr(4)
10134       .nr(8)
10135       .kr(1)
10136       .sr(1)
10137       .m(4)
10138       .n(8)
10139       .k(2)
10140       .cn_stride(11)
10141       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10142   }
10143 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_eq_2_strided_a)10144   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_eq_2_strided_a) {
10145     TEST_REQUIRES_ARM_NEON;
10146     GemmMicrokernelTester()
10147       .mr(4)
10148       .nr(8)
10149       .kr(1)
10150       .sr(1)
10151       .m(4)
10152       .n(8)
10153       .k(2)
10154       .a_stride(5)
10155       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10156   }
10157 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_eq_2_subtile)10158   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_eq_2_subtile) {
10159     TEST_REQUIRES_ARM_NEON;
10160     for (uint32_t n = 1; n <= 8; n++) {
10161       for (uint32_t m = 1; m <= 4; m++) {
10162         GemmMicrokernelTester()
10163           .mr(4)
10164           .nr(8)
10165           .kr(1)
10166           .sr(1)
10167           .m(m)
10168           .n(n)
10169           .k(2)
10170           .iterations(1)
10171           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10172       }
10173     }
10174   }
10175 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_eq_2_subtile_m)10176   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_eq_2_subtile_m) {
10177     TEST_REQUIRES_ARM_NEON;
10178     for (uint32_t m = 1; m <= 4; m++) {
10179       GemmMicrokernelTester()
10180         .mr(4)
10181         .nr(8)
10182         .kr(1)
10183         .sr(1)
10184         .m(m)
10185         .n(8)
10186         .k(2)
10187         .iterations(1)
10188         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10189     }
10190   }
10191 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_eq_2_subtile_n)10192   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_eq_2_subtile_n) {
10193     TEST_REQUIRES_ARM_NEON;
10194     for (uint32_t n = 1; n <= 8; n++) {
10195       GemmMicrokernelTester()
10196         .mr(4)
10197         .nr(8)
10198         .kr(1)
10199         .sr(1)
10200         .m(4)
10201         .n(n)
10202         .k(2)
10203         .iterations(1)
10204         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10205     }
10206   }
10207 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_lt_2)10208   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_lt_2) {
10209     TEST_REQUIRES_ARM_NEON;
10210     for (size_t k = 1; k < 2; k++) {
10211       GemmMicrokernelTester()
10212         .mr(4)
10213         .nr(8)
10214         .kr(1)
10215         .sr(1)
10216         .m(4)
10217         .n(8)
10218         .k(k)
10219         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10220     }
10221   }
10222 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_lt_2_strided_a)10223   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_lt_2_strided_a) {
10224     TEST_REQUIRES_ARM_NEON;
10225     for (size_t k = 1; k < 2; k++) {
10226       GemmMicrokernelTester()
10227         .mr(4)
10228         .nr(8)
10229         .kr(1)
10230         .sr(1)
10231         .m(4)
10232         .n(8)
10233         .k(k)
10234         .a_stride(5)
10235         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10236     }
10237   }
10238 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_lt_2_subtile)10239   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_lt_2_subtile) {
10240     TEST_REQUIRES_ARM_NEON;
10241     for (size_t k = 1; k < 2; k++) {
10242       for (uint32_t n = 1; n <= 8; n++) {
10243         for (uint32_t m = 1; m <= 4; m++) {
10244           GemmMicrokernelTester()
10245             .mr(4)
10246             .nr(8)
10247             .kr(1)
10248             .sr(1)
10249             .m(m)
10250             .n(n)
10251             .k(k)
10252             .iterations(1)
10253             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10254         }
10255       }
10256     }
10257   }
10258 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_gt_2)10259   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_gt_2) {
10260     TEST_REQUIRES_ARM_NEON;
10261     for (size_t k = 3; k < 4; k++) {
10262       GemmMicrokernelTester()
10263         .mr(4)
10264         .nr(8)
10265         .kr(1)
10266         .sr(1)
10267         .m(4)
10268         .n(8)
10269         .k(k)
10270         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10271     }
10272   }
10273 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_gt_2_strided_a)10274   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_gt_2_strided_a) {
10275     TEST_REQUIRES_ARM_NEON;
10276     for (size_t k = 3; k < 4; k++) {
10277       GemmMicrokernelTester()
10278         .mr(4)
10279         .nr(8)
10280         .kr(1)
10281         .sr(1)
10282         .m(4)
10283         .n(8)
10284         .k(k)
10285         .a_stride(7)
10286         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10287     }
10288   }
10289 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_gt_2_subtile)10290   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_gt_2_subtile) {
10291     TEST_REQUIRES_ARM_NEON;
10292     for (size_t k = 3; k < 4; k++) {
10293       for (uint32_t n = 1; n <= 8; n++) {
10294         for (uint32_t m = 1; m <= 4; m++) {
10295           GemmMicrokernelTester()
10296             .mr(4)
10297             .nr(8)
10298             .kr(1)
10299             .sr(1)
10300             .m(m)
10301             .n(n)
10302             .k(k)
10303             .iterations(1)
10304             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10305         }
10306       }
10307     }
10308   }
10309 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_div_2)10310   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_div_2) {
10311     TEST_REQUIRES_ARM_NEON;
10312     for (size_t k = 4; k <= 20; k += 2) {
10313       GemmMicrokernelTester()
10314         .mr(4)
10315         .nr(8)
10316         .kr(1)
10317         .sr(1)
10318         .m(4)
10319         .n(8)
10320         .k(k)
10321         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10322     }
10323   }
10324 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_div_2_strided_a)10325   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_div_2_strided_a) {
10326     TEST_REQUIRES_ARM_NEON;
10327     for (size_t k = 4; k <= 20; k += 2) {
10328       GemmMicrokernelTester()
10329         .mr(4)
10330         .nr(8)
10331         .kr(1)
10332         .sr(1)
10333         .m(4)
10334         .n(8)
10335         .k(k)
10336         .a_stride(23)
10337         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10338     }
10339   }
10340 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,k_div_2_subtile)10341   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, k_div_2_subtile) {
10342     TEST_REQUIRES_ARM_NEON;
10343     for (size_t k = 4; k <= 20; k += 2) {
10344       for (uint32_t n = 1; n <= 8; n++) {
10345         for (uint32_t m = 1; m <= 4; m++) {
10346           GemmMicrokernelTester()
10347             .mr(4)
10348             .nr(8)
10349             .kr(1)
10350             .sr(1)
10351             .m(m)
10352             .n(n)
10353             .k(k)
10354             .iterations(1)
10355             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10356         }
10357       }
10358     }
10359   }
10360 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,n_gt_8)10361   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, n_gt_8) {
10362     TEST_REQUIRES_ARM_NEON;
10363     for (uint32_t n = 9; n < 16; n++) {
10364       for (size_t k = 1; k <= 10; k += 3) {
10365         GemmMicrokernelTester()
10366           .mr(4)
10367           .nr(8)
10368           .kr(1)
10369           .sr(1)
10370           .m(4)
10371           .n(n)
10372           .k(k)
10373           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10374       }
10375     }
10376   }
10377 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,n_gt_8_strided_cn)10378   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, n_gt_8_strided_cn) {
10379     TEST_REQUIRES_ARM_NEON;
10380     for (uint32_t n = 9; n < 16; n++) {
10381       for (size_t k = 1; k <= 10; k += 3) {
10382         GemmMicrokernelTester()
10383           .mr(4)
10384           .nr(8)
10385           .kr(1)
10386           .sr(1)
10387           .m(4)
10388           .n(n)
10389           .k(k)
10390           .cn_stride(11)
10391           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10392       }
10393     }
10394   }
10395 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,n_gt_8_strided_a)10396   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, n_gt_8_strided_a) {
10397     TEST_REQUIRES_ARM_NEON;
10398     for (uint32_t n = 9; n < 16; n++) {
10399       for (size_t k = 1; k <= 10; k += 3) {
10400         GemmMicrokernelTester()
10401           .mr(4)
10402           .nr(8)
10403           .kr(1)
10404           .sr(1)
10405           .m(4)
10406           .n(n)
10407           .k(k)
10408           .a_stride(13)
10409           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10410       }
10411     }
10412   }
10413 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,n_gt_8_subtile)10414   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, n_gt_8_subtile) {
10415     TEST_REQUIRES_ARM_NEON;
10416     for (uint32_t n = 9; n < 16; n++) {
10417       for (size_t k = 1; k <= 10; k += 3) {
10418         for (uint32_t m = 1; m <= 4; m++) {
10419           GemmMicrokernelTester()
10420             .mr(4)
10421             .nr(8)
10422             .kr(1)
10423             .sr(1)
10424             .m(m)
10425             .n(n)
10426             .k(k)
10427             .iterations(1)
10428             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10429         }
10430       }
10431     }
10432   }
10433 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,n_div_8)10434   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, n_div_8) {
10435     TEST_REQUIRES_ARM_NEON;
10436     for (uint32_t n = 16; n <= 24; n += 8) {
10437       for (size_t k = 1; k <= 10; k += 3) {
10438         GemmMicrokernelTester()
10439           .mr(4)
10440           .nr(8)
10441           .kr(1)
10442           .sr(1)
10443           .m(4)
10444           .n(n)
10445           .k(k)
10446           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10447       }
10448     }
10449   }
10450 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,n_div_8_strided_cn)10451   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, n_div_8_strided_cn) {
10452     TEST_REQUIRES_ARM_NEON;
10453     for (uint32_t n = 16; n <= 24; n += 8) {
10454       for (size_t k = 1; k <= 10; k += 3) {
10455         GemmMicrokernelTester()
10456           .mr(4)
10457           .nr(8)
10458           .kr(1)
10459           .sr(1)
10460           .m(4)
10461           .n(n)
10462           .k(k)
10463           .cn_stride(11)
10464           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10465       }
10466     }
10467   }
10468 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,n_div_8_strided_a)10469   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, n_div_8_strided_a) {
10470     TEST_REQUIRES_ARM_NEON;
10471     for (uint32_t n = 16; n <= 24; n += 8) {
10472       for (size_t k = 1; k <= 10; k += 3) {
10473         GemmMicrokernelTester()
10474           .mr(4)
10475           .nr(8)
10476           .kr(1)
10477           .sr(1)
10478           .m(4)
10479           .n(n)
10480           .k(k)
10481           .a_stride(13)
10482           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10483       }
10484     }
10485   }
10486 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,n_div_8_subtile)10487   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, n_div_8_subtile) {
10488     TEST_REQUIRES_ARM_NEON;
10489     for (uint32_t n = 16; n <= 24; n += 8) {
10490       for (size_t k = 1; k <= 10; k += 3) {
10491         for (uint32_t m = 1; m <= 4; m++) {
10492           GemmMicrokernelTester()
10493             .mr(4)
10494             .nr(8)
10495             .kr(1)
10496             .sr(1)
10497             .m(m)
10498             .n(n)
10499             .k(k)
10500             .iterations(1)
10501             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10502         }
10503       }
10504     }
10505   }
10506 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,strided_cm_subtile)10507   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, strided_cm_subtile) {
10508     TEST_REQUIRES_ARM_NEON;
10509     for (size_t k = 1; k <= 10; k += 3) {
10510       for (uint32_t n = 1; n <= 8; n++) {
10511         for (uint32_t m = 1; m <= 4; m++) {
10512           GemmMicrokernelTester()
10513             .mr(4)
10514             .nr(8)
10515             .kr(1)
10516             .sr(1)
10517             .m(m)
10518             .n(n)
10519             .k(k)
10520             .cm_stride(11)
10521             .iterations(1)
10522             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10523         }
10524       }
10525     }
10526   }
10527 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,qmin)10528   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, qmin) {
10529     TEST_REQUIRES_ARM_NEON;
10530     GemmMicrokernelTester()
10531       .mr(4)
10532       .nr(8)
10533       .kr(1)
10534       .sr(1)
10535       .m(4)
10536       .n(8)
10537       .k(2)
10538       .qmin(128)
10539       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10540   }
10541 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,qmax)10542   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, qmax) {
10543     TEST_REQUIRES_ARM_NEON;
10544     GemmMicrokernelTester()
10545       .mr(4)
10546       .nr(8)
10547       .kr(1)
10548       .sr(1)
10549       .m(4)
10550       .n(8)
10551       .k(2)
10552       .qmax(128)
10553       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10554   }
10555 
TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64,strided_cm)10556   TEST(F32_GEMM_MINMAX_4X8__NEON_DUP_LD64, strided_cm) {
10557     TEST_REQUIRES_ARM_NEON;
10558     GemmMicrokernelTester()
10559       .mr(4)
10560       .nr(8)
10561       .kr(1)
10562       .sr(1)
10563       .m(4)
10564       .n(8)
10565       .k(2)
10566       .cm_stride(11)
10567       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neon_dup_ld64, xnn_init_f32_minmax_scalar_params);
10568   }
10569 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
10570 
10571 
10572 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_eq_4)10573   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_eq_4) {
10574     TEST_REQUIRES_ARM_NEON_FMA;
10575     GemmMicrokernelTester()
10576       .mr(4)
10577       .nr(8)
10578       .kr(1)
10579       .sr(1)
10580       .m(4)
10581       .n(8)
10582       .k(4)
10583       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10584   }
10585 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,strided_cn)10586   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, strided_cn) {
10587     TEST_REQUIRES_ARM_NEON_FMA;
10588     GemmMicrokernelTester()
10589       .mr(4)
10590       .nr(8)
10591       .kr(1)
10592       .sr(1)
10593       .m(4)
10594       .n(8)
10595       .k(4)
10596       .cn_stride(11)
10597       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10598   }
10599 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_eq_4_strided_a)10600   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_eq_4_strided_a) {
10601     TEST_REQUIRES_ARM_NEON_FMA;
10602     GemmMicrokernelTester()
10603       .mr(4)
10604       .nr(8)
10605       .kr(1)
10606       .sr(1)
10607       .m(4)
10608       .n(8)
10609       .k(4)
10610       .a_stride(7)
10611       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10612   }
10613 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_eq_4_subtile)10614   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_eq_4_subtile) {
10615     TEST_REQUIRES_ARM_NEON_FMA;
10616     for (uint32_t n = 1; n <= 8; n++) {
10617       for (uint32_t m = 1; m <= 4; m++) {
10618         GemmMicrokernelTester()
10619           .mr(4)
10620           .nr(8)
10621           .kr(1)
10622           .sr(1)
10623           .m(m)
10624           .n(n)
10625           .k(4)
10626           .iterations(1)
10627           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10628       }
10629     }
10630   }
10631 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_eq_4_subtile_m)10632   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_eq_4_subtile_m) {
10633     TEST_REQUIRES_ARM_NEON_FMA;
10634     for (uint32_t m = 1; m <= 4; m++) {
10635       GemmMicrokernelTester()
10636         .mr(4)
10637         .nr(8)
10638         .kr(1)
10639         .sr(1)
10640         .m(m)
10641         .n(8)
10642         .k(4)
10643         .iterations(1)
10644         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10645     }
10646   }
10647 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_eq_4_subtile_n)10648   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_eq_4_subtile_n) {
10649     TEST_REQUIRES_ARM_NEON_FMA;
10650     for (uint32_t n = 1; n <= 8; n++) {
10651       GemmMicrokernelTester()
10652         .mr(4)
10653         .nr(8)
10654         .kr(1)
10655         .sr(1)
10656         .m(4)
10657         .n(n)
10658         .k(4)
10659         .iterations(1)
10660         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10661     }
10662   }
10663 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_lt_4)10664   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_lt_4) {
10665     TEST_REQUIRES_ARM_NEON_FMA;
10666     for (size_t k = 1; k < 4; k++) {
10667       GemmMicrokernelTester()
10668         .mr(4)
10669         .nr(8)
10670         .kr(1)
10671         .sr(1)
10672         .m(4)
10673         .n(8)
10674         .k(k)
10675         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10676     }
10677   }
10678 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_lt_4_strided_a)10679   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_lt_4_strided_a) {
10680     TEST_REQUIRES_ARM_NEON_FMA;
10681     for (size_t k = 1; k < 4; k++) {
10682       GemmMicrokernelTester()
10683         .mr(4)
10684         .nr(8)
10685         .kr(1)
10686         .sr(1)
10687         .m(4)
10688         .n(8)
10689         .k(k)
10690         .a_stride(7)
10691         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10692     }
10693   }
10694 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_lt_4_subtile)10695   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_lt_4_subtile) {
10696     TEST_REQUIRES_ARM_NEON_FMA;
10697     for (size_t k = 1; k < 4; k++) {
10698       for (uint32_t n = 1; n <= 8; n++) {
10699         for (uint32_t m = 1; m <= 4; m++) {
10700           GemmMicrokernelTester()
10701             .mr(4)
10702             .nr(8)
10703             .kr(1)
10704             .sr(1)
10705             .m(m)
10706             .n(n)
10707             .k(k)
10708             .iterations(1)
10709             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10710         }
10711       }
10712     }
10713   }
10714 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_gt_4)10715   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_gt_4) {
10716     TEST_REQUIRES_ARM_NEON_FMA;
10717     for (size_t k = 5; k < 8; k++) {
10718       GemmMicrokernelTester()
10719         .mr(4)
10720         .nr(8)
10721         .kr(1)
10722         .sr(1)
10723         .m(4)
10724         .n(8)
10725         .k(k)
10726         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10727     }
10728   }
10729 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_gt_4_strided_a)10730   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_gt_4_strided_a) {
10731     TEST_REQUIRES_ARM_NEON_FMA;
10732     for (size_t k = 5; k < 8; k++) {
10733       GemmMicrokernelTester()
10734         .mr(4)
10735         .nr(8)
10736         .kr(1)
10737         .sr(1)
10738         .m(4)
10739         .n(8)
10740         .k(k)
10741         .a_stride(11)
10742         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10743     }
10744   }
10745 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_gt_4_subtile)10746   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_gt_4_subtile) {
10747     TEST_REQUIRES_ARM_NEON_FMA;
10748     for (size_t k = 5; k < 8; k++) {
10749       for (uint32_t n = 1; n <= 8; n++) {
10750         for (uint32_t m = 1; m <= 4; m++) {
10751           GemmMicrokernelTester()
10752             .mr(4)
10753             .nr(8)
10754             .kr(1)
10755             .sr(1)
10756             .m(m)
10757             .n(n)
10758             .k(k)
10759             .iterations(1)
10760             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10761         }
10762       }
10763     }
10764   }
10765 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_div_4)10766   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_div_4) {
10767     TEST_REQUIRES_ARM_NEON_FMA;
10768     for (size_t k = 8; k <= 40; k += 4) {
10769       GemmMicrokernelTester()
10770         .mr(4)
10771         .nr(8)
10772         .kr(1)
10773         .sr(1)
10774         .m(4)
10775         .n(8)
10776         .k(k)
10777         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10778     }
10779   }
10780 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_div_4_strided_a)10781   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_div_4_strided_a) {
10782     TEST_REQUIRES_ARM_NEON_FMA;
10783     for (size_t k = 8; k <= 40; k += 4) {
10784       GemmMicrokernelTester()
10785         .mr(4)
10786         .nr(8)
10787         .kr(1)
10788         .sr(1)
10789         .m(4)
10790         .n(8)
10791         .k(k)
10792         .a_stride(43)
10793         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10794     }
10795   }
10796 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,k_div_4_subtile)10797   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, k_div_4_subtile) {
10798     TEST_REQUIRES_ARM_NEON_FMA;
10799     for (size_t k = 8; k <= 40; k += 4) {
10800       for (uint32_t n = 1; n <= 8; n++) {
10801         for (uint32_t m = 1; m <= 4; m++) {
10802           GemmMicrokernelTester()
10803             .mr(4)
10804             .nr(8)
10805             .kr(1)
10806             .sr(1)
10807             .m(m)
10808             .n(n)
10809             .k(k)
10810             .iterations(1)
10811             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10812         }
10813       }
10814     }
10815   }
10816 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,n_gt_8)10817   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, n_gt_8) {
10818     TEST_REQUIRES_ARM_NEON_FMA;
10819     for (uint32_t n = 9; n < 16; n++) {
10820       for (size_t k = 1; k <= 20; k += 5) {
10821         GemmMicrokernelTester()
10822           .mr(4)
10823           .nr(8)
10824           .kr(1)
10825           .sr(1)
10826           .m(4)
10827           .n(n)
10828           .k(k)
10829           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10830       }
10831     }
10832   }
10833 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,n_gt_8_strided_cn)10834   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, n_gt_8_strided_cn) {
10835     TEST_REQUIRES_ARM_NEON_FMA;
10836     for (uint32_t n = 9; n < 16; n++) {
10837       for (size_t k = 1; k <= 20; k += 5) {
10838         GemmMicrokernelTester()
10839           .mr(4)
10840           .nr(8)
10841           .kr(1)
10842           .sr(1)
10843           .m(4)
10844           .n(n)
10845           .k(k)
10846           .cn_stride(11)
10847           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10848       }
10849     }
10850   }
10851 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,n_gt_8_strided_a)10852   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, n_gt_8_strided_a) {
10853     TEST_REQUIRES_ARM_NEON_FMA;
10854     for (uint32_t n = 9; n < 16; n++) {
10855       for (size_t k = 1; k <= 20; k += 5) {
10856         GemmMicrokernelTester()
10857           .mr(4)
10858           .nr(8)
10859           .kr(1)
10860           .sr(1)
10861           .m(4)
10862           .n(n)
10863           .k(k)
10864           .a_stride(23)
10865           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10866       }
10867     }
10868   }
10869 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,n_gt_8_subtile)10870   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, n_gt_8_subtile) {
10871     TEST_REQUIRES_ARM_NEON_FMA;
10872     for (uint32_t n = 9; n < 16; n++) {
10873       for (size_t k = 1; k <= 20; k += 5) {
10874         for (uint32_t m = 1; m <= 4; m++) {
10875           GemmMicrokernelTester()
10876             .mr(4)
10877             .nr(8)
10878             .kr(1)
10879             .sr(1)
10880             .m(m)
10881             .n(n)
10882             .k(k)
10883             .iterations(1)
10884             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10885         }
10886       }
10887     }
10888   }
10889 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,n_div_8)10890   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, n_div_8) {
10891     TEST_REQUIRES_ARM_NEON_FMA;
10892     for (uint32_t n = 16; n <= 24; n += 8) {
10893       for (size_t k = 1; k <= 20; k += 5) {
10894         GemmMicrokernelTester()
10895           .mr(4)
10896           .nr(8)
10897           .kr(1)
10898           .sr(1)
10899           .m(4)
10900           .n(n)
10901           .k(k)
10902           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10903       }
10904     }
10905   }
10906 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,n_div_8_strided_cn)10907   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, n_div_8_strided_cn) {
10908     TEST_REQUIRES_ARM_NEON_FMA;
10909     for (uint32_t n = 16; n <= 24; n += 8) {
10910       for (size_t k = 1; k <= 20; k += 5) {
10911         GemmMicrokernelTester()
10912           .mr(4)
10913           .nr(8)
10914           .kr(1)
10915           .sr(1)
10916           .m(4)
10917           .n(n)
10918           .k(k)
10919           .cn_stride(11)
10920           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10921       }
10922     }
10923   }
10924 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,n_div_8_strided_a)10925   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, n_div_8_strided_a) {
10926     TEST_REQUIRES_ARM_NEON_FMA;
10927     for (uint32_t n = 16; n <= 24; n += 8) {
10928       for (size_t k = 1; k <= 20; k += 5) {
10929         GemmMicrokernelTester()
10930           .mr(4)
10931           .nr(8)
10932           .kr(1)
10933           .sr(1)
10934           .m(4)
10935           .n(n)
10936           .k(k)
10937           .a_stride(23)
10938           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10939       }
10940     }
10941   }
10942 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,n_div_8_subtile)10943   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, n_div_8_subtile) {
10944     TEST_REQUIRES_ARM_NEON_FMA;
10945     for (uint32_t n = 16; n <= 24; n += 8) {
10946       for (size_t k = 1; k <= 20; k += 5) {
10947         for (uint32_t m = 1; m <= 4; m++) {
10948           GemmMicrokernelTester()
10949             .mr(4)
10950             .nr(8)
10951             .kr(1)
10952             .sr(1)
10953             .m(m)
10954             .n(n)
10955             .k(k)
10956             .iterations(1)
10957             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10958         }
10959       }
10960     }
10961   }
10962 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,strided_cm_subtile)10963   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, strided_cm_subtile) {
10964     TEST_REQUIRES_ARM_NEON_FMA;
10965     for (size_t k = 1; k <= 20; k += 5) {
10966       for (uint32_t n = 1; n <= 8; n++) {
10967         for (uint32_t m = 1; m <= 4; m++) {
10968           GemmMicrokernelTester()
10969             .mr(4)
10970             .nr(8)
10971             .kr(1)
10972             .sr(1)
10973             .m(m)
10974             .n(n)
10975             .k(k)
10976             .cm_stride(11)
10977             .iterations(1)
10978             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10979         }
10980       }
10981     }
10982   }
10983 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,qmin)10984   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, qmin) {
10985     TEST_REQUIRES_ARM_NEON_FMA;
10986     GemmMicrokernelTester()
10987       .mr(4)
10988       .nr(8)
10989       .kr(1)
10990       .sr(1)
10991       .m(4)
10992       .n(8)
10993       .k(4)
10994       .qmin(128)
10995       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
10996   }
10997 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,qmax)10998   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, qmax) {
10999     TEST_REQUIRES_ARM_NEON_FMA;
11000     GemmMicrokernelTester()
11001       .mr(4)
11002       .nr(8)
11003       .kr(1)
11004       .sr(1)
11005       .m(4)
11006       .n(8)
11007       .k(4)
11008       .qmax(128)
11009       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
11010   }
11011 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128,strided_cm)11012   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_DUP_LD128, strided_cm) {
11013     TEST_REQUIRES_ARM_NEON_FMA;
11014     GemmMicrokernelTester()
11015       .mr(4)
11016       .nr(8)
11017       .kr(1)
11018       .sr(1)
11019       .m(4)
11020       .n(8)
11021       .k(4)
11022       .cm_stride(11)
11023       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
11024   }
11025 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
11026 
11027 
11028 #if XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_eq_2)11029   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_eq_2) {
11030     TEST_REQUIRES_ARM_NEON_FMA;
11031     GemmMicrokernelTester()
11032       .mr(4)
11033       .nr(8)
11034       .kr(1)
11035       .sr(1)
11036       .m(4)
11037       .n(8)
11038       .k(2)
11039       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11040   }
11041 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,strided_cn)11042   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, strided_cn) {
11043     TEST_REQUIRES_ARM_NEON_FMA;
11044     GemmMicrokernelTester()
11045       .mr(4)
11046       .nr(8)
11047       .kr(1)
11048       .sr(1)
11049       .m(4)
11050       .n(8)
11051       .k(2)
11052       .cn_stride(11)
11053       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11054   }
11055 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_eq_2_strided_a)11056   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_eq_2_strided_a) {
11057     TEST_REQUIRES_ARM_NEON_FMA;
11058     GemmMicrokernelTester()
11059       .mr(4)
11060       .nr(8)
11061       .kr(1)
11062       .sr(1)
11063       .m(4)
11064       .n(8)
11065       .k(2)
11066       .a_stride(5)
11067       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11068   }
11069 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_eq_2_subtile)11070   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_eq_2_subtile) {
11071     TEST_REQUIRES_ARM_NEON_FMA;
11072     for (uint32_t n = 1; n <= 8; n++) {
11073       for (uint32_t m = 1; m <= 4; m++) {
11074         GemmMicrokernelTester()
11075           .mr(4)
11076           .nr(8)
11077           .kr(1)
11078           .sr(1)
11079           .m(m)
11080           .n(n)
11081           .k(2)
11082           .iterations(1)
11083           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11084       }
11085     }
11086   }
11087 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_eq_2_subtile_m)11088   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_eq_2_subtile_m) {
11089     TEST_REQUIRES_ARM_NEON_FMA;
11090     for (uint32_t m = 1; m <= 4; m++) {
11091       GemmMicrokernelTester()
11092         .mr(4)
11093         .nr(8)
11094         .kr(1)
11095         .sr(1)
11096         .m(m)
11097         .n(8)
11098         .k(2)
11099         .iterations(1)
11100         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11101     }
11102   }
11103 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_eq_2_subtile_n)11104   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_eq_2_subtile_n) {
11105     TEST_REQUIRES_ARM_NEON_FMA;
11106     for (uint32_t n = 1; n <= 8; n++) {
11107       GemmMicrokernelTester()
11108         .mr(4)
11109         .nr(8)
11110         .kr(1)
11111         .sr(1)
11112         .m(4)
11113         .n(n)
11114         .k(2)
11115         .iterations(1)
11116         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11117     }
11118   }
11119 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_lt_2)11120   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_lt_2) {
11121     TEST_REQUIRES_ARM_NEON_FMA;
11122     for (size_t k = 1; k < 2; k++) {
11123       GemmMicrokernelTester()
11124         .mr(4)
11125         .nr(8)
11126         .kr(1)
11127         .sr(1)
11128         .m(4)
11129         .n(8)
11130         .k(k)
11131         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11132     }
11133   }
11134 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_lt_2_strided_a)11135   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_lt_2_strided_a) {
11136     TEST_REQUIRES_ARM_NEON_FMA;
11137     for (size_t k = 1; k < 2; k++) {
11138       GemmMicrokernelTester()
11139         .mr(4)
11140         .nr(8)
11141         .kr(1)
11142         .sr(1)
11143         .m(4)
11144         .n(8)
11145         .k(k)
11146         .a_stride(5)
11147         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11148     }
11149   }
11150 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_lt_2_subtile)11151   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_lt_2_subtile) {
11152     TEST_REQUIRES_ARM_NEON_FMA;
11153     for (size_t k = 1; k < 2; k++) {
11154       for (uint32_t n = 1; n <= 8; n++) {
11155         for (uint32_t m = 1; m <= 4; m++) {
11156           GemmMicrokernelTester()
11157             .mr(4)
11158             .nr(8)
11159             .kr(1)
11160             .sr(1)
11161             .m(m)
11162             .n(n)
11163             .k(k)
11164             .iterations(1)
11165             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11166         }
11167       }
11168     }
11169   }
11170 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_gt_2)11171   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_gt_2) {
11172     TEST_REQUIRES_ARM_NEON_FMA;
11173     for (size_t k = 3; k < 4; k++) {
11174       GemmMicrokernelTester()
11175         .mr(4)
11176         .nr(8)
11177         .kr(1)
11178         .sr(1)
11179         .m(4)
11180         .n(8)
11181         .k(k)
11182         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11183     }
11184   }
11185 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_gt_2_strided_a)11186   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_gt_2_strided_a) {
11187     TEST_REQUIRES_ARM_NEON_FMA;
11188     for (size_t k = 3; k < 4; k++) {
11189       GemmMicrokernelTester()
11190         .mr(4)
11191         .nr(8)
11192         .kr(1)
11193         .sr(1)
11194         .m(4)
11195         .n(8)
11196         .k(k)
11197         .a_stride(7)
11198         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11199     }
11200   }
11201 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_gt_2_subtile)11202   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_gt_2_subtile) {
11203     TEST_REQUIRES_ARM_NEON_FMA;
11204     for (size_t k = 3; k < 4; k++) {
11205       for (uint32_t n = 1; n <= 8; n++) {
11206         for (uint32_t m = 1; m <= 4; m++) {
11207           GemmMicrokernelTester()
11208             .mr(4)
11209             .nr(8)
11210             .kr(1)
11211             .sr(1)
11212             .m(m)
11213             .n(n)
11214             .k(k)
11215             .iterations(1)
11216             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11217         }
11218       }
11219     }
11220   }
11221 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_div_2)11222   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_div_2) {
11223     TEST_REQUIRES_ARM_NEON_FMA;
11224     for (size_t k = 4; k <= 20; k += 2) {
11225       GemmMicrokernelTester()
11226         .mr(4)
11227         .nr(8)
11228         .kr(1)
11229         .sr(1)
11230         .m(4)
11231         .n(8)
11232         .k(k)
11233         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11234     }
11235   }
11236 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_div_2_strided_a)11237   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_div_2_strided_a) {
11238     TEST_REQUIRES_ARM_NEON_FMA;
11239     for (size_t k = 4; k <= 20; k += 2) {
11240       GemmMicrokernelTester()
11241         .mr(4)
11242         .nr(8)
11243         .kr(1)
11244         .sr(1)
11245         .m(4)
11246         .n(8)
11247         .k(k)
11248         .a_stride(23)
11249         .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11250     }
11251   }
11252 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,k_div_2_subtile)11253   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, k_div_2_subtile) {
11254     TEST_REQUIRES_ARM_NEON_FMA;
11255     for (size_t k = 4; k <= 20; k += 2) {
11256       for (uint32_t n = 1; n <= 8; n++) {
11257         for (uint32_t m = 1; m <= 4; m++) {
11258           GemmMicrokernelTester()
11259             .mr(4)
11260             .nr(8)
11261             .kr(1)
11262             .sr(1)
11263             .m(m)
11264             .n(n)
11265             .k(k)
11266             .iterations(1)
11267             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11268         }
11269       }
11270     }
11271   }
11272 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,n_gt_8)11273   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, n_gt_8) {
11274     TEST_REQUIRES_ARM_NEON_FMA;
11275     for (uint32_t n = 9; n < 16; n++) {
11276       for (size_t k = 1; k <= 10; k += 3) {
11277         GemmMicrokernelTester()
11278           .mr(4)
11279           .nr(8)
11280           .kr(1)
11281           .sr(1)
11282           .m(4)
11283           .n(n)
11284           .k(k)
11285           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11286       }
11287     }
11288   }
11289 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,n_gt_8_strided_cn)11290   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, n_gt_8_strided_cn) {
11291     TEST_REQUIRES_ARM_NEON_FMA;
11292     for (uint32_t n = 9; n < 16; n++) {
11293       for (size_t k = 1; k <= 10; k += 3) {
11294         GemmMicrokernelTester()
11295           .mr(4)
11296           .nr(8)
11297           .kr(1)
11298           .sr(1)
11299           .m(4)
11300           .n(n)
11301           .k(k)
11302           .cn_stride(11)
11303           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11304       }
11305     }
11306   }
11307 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,n_gt_8_strided_a)11308   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, n_gt_8_strided_a) {
11309     TEST_REQUIRES_ARM_NEON_FMA;
11310     for (uint32_t n = 9; n < 16; n++) {
11311       for (size_t k = 1; k <= 10; k += 3) {
11312         GemmMicrokernelTester()
11313           .mr(4)
11314           .nr(8)
11315           .kr(1)
11316           .sr(1)
11317           .m(4)
11318           .n(n)
11319           .k(k)
11320           .a_stride(13)
11321           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11322       }
11323     }
11324   }
11325 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,n_gt_8_subtile)11326   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, n_gt_8_subtile) {
11327     TEST_REQUIRES_ARM_NEON_FMA;
11328     for (uint32_t n = 9; n < 16; n++) {
11329       for (size_t k = 1; k <= 10; k += 3) {
11330         for (uint32_t m = 1; m <= 4; m++) {
11331           GemmMicrokernelTester()
11332             .mr(4)
11333             .nr(8)
11334             .kr(1)
11335             .sr(1)
11336             .m(m)
11337             .n(n)
11338             .k(k)
11339             .iterations(1)
11340             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11341         }
11342       }
11343     }
11344   }
11345 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,n_div_8)11346   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, n_div_8) {
11347     TEST_REQUIRES_ARM_NEON_FMA;
11348     for (uint32_t n = 16; n <= 24; n += 8) {
11349       for (size_t k = 1; k <= 10; k += 3) {
11350         GemmMicrokernelTester()
11351           .mr(4)
11352           .nr(8)
11353           .kr(1)
11354           .sr(1)
11355           .m(4)
11356           .n(n)
11357           .k(k)
11358           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11359       }
11360     }
11361   }
11362 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,n_div_8_strided_cn)11363   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, n_div_8_strided_cn) {
11364     TEST_REQUIRES_ARM_NEON_FMA;
11365     for (uint32_t n = 16; n <= 24; n += 8) {
11366       for (size_t k = 1; k <= 10; k += 3) {
11367         GemmMicrokernelTester()
11368           .mr(4)
11369           .nr(8)
11370           .kr(1)
11371           .sr(1)
11372           .m(4)
11373           .n(n)
11374           .k(k)
11375           .cn_stride(11)
11376           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11377       }
11378     }
11379   }
11380 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,n_div_8_strided_a)11381   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, n_div_8_strided_a) {
11382     TEST_REQUIRES_ARM_NEON_FMA;
11383     for (uint32_t n = 16; n <= 24; n += 8) {
11384       for (size_t k = 1; k <= 10; k += 3) {
11385         GemmMicrokernelTester()
11386           .mr(4)
11387           .nr(8)
11388           .kr(1)
11389           .sr(1)
11390           .m(4)
11391           .n(n)
11392           .k(k)
11393           .a_stride(13)
11394           .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11395       }
11396     }
11397   }
11398 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,n_div_8_subtile)11399   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, n_div_8_subtile) {
11400     TEST_REQUIRES_ARM_NEON_FMA;
11401     for (uint32_t n = 16; n <= 24; n += 8) {
11402       for (size_t k = 1; k <= 10; k += 3) {
11403         for (uint32_t m = 1; m <= 4; m++) {
11404           GemmMicrokernelTester()
11405             .mr(4)
11406             .nr(8)
11407             .kr(1)
11408             .sr(1)
11409             .m(m)
11410             .n(n)
11411             .k(k)
11412             .iterations(1)
11413             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11414         }
11415       }
11416     }
11417   }
11418 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,strided_cm_subtile)11419   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, strided_cm_subtile) {
11420     TEST_REQUIRES_ARM_NEON_FMA;
11421     for (size_t k = 1; k <= 10; k += 3) {
11422       for (uint32_t n = 1; n <= 8; n++) {
11423         for (uint32_t m = 1; m <= 4; m++) {
11424           GemmMicrokernelTester()
11425             .mr(4)
11426             .nr(8)
11427             .kr(1)
11428             .sr(1)
11429             .m(m)
11430             .n(n)
11431             .k(k)
11432             .cm_stride(11)
11433             .iterations(1)
11434             .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11435         }
11436       }
11437     }
11438   }
11439 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,qmin)11440   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, qmin) {
11441     TEST_REQUIRES_ARM_NEON_FMA;
11442     GemmMicrokernelTester()
11443       .mr(4)
11444       .nr(8)
11445       .kr(1)
11446       .sr(1)
11447       .m(4)
11448       .n(8)
11449       .k(2)
11450       .qmin(128)
11451       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11452   }
11453 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,qmax)11454   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, qmax) {
11455     TEST_REQUIRES_ARM_NEON_FMA;
11456     GemmMicrokernelTester()
11457       .mr(4)
11458       .nr(8)
11459       .kr(1)
11460       .sr(1)
11461       .m(4)
11462       .n(8)
11463       .k(2)
11464       .qmax(128)
11465       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11466   }
11467 
TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64,strided_cm)11468   TEST(F32_GEMM_MINMAX_4X8__NEONFMA_LANE_LD64, strided_cm) {
11469     TEST_REQUIRES_ARM_NEON_FMA;
11470     GemmMicrokernelTester()
11471       .mr(4)
11472       .nr(8)
11473       .kr(1)
11474       .sr(1)
11475       .m(4)
11476       .n(8)
11477       .k(2)
11478       .cm_stride(11)
11479       .Test(xnn_f32_gemm_minmax_ukernel_4x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11480   }
11481 #endif  // XNN_ARCH_ARM64
11482 
11483 
11484 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_eq_4)11485   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_eq_4) {
11486     TEST_REQUIRES_ARM_NEON_FMA;
11487     GemmMicrokernelTester()
11488       .mr(4)
11489       .nr(8)
11490       .kr(1)
11491       .sr(4)
11492       .m(4)
11493       .n(8)
11494       .k(4)
11495       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11496   }
11497 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,strided_cn)11498   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, strided_cn) {
11499     TEST_REQUIRES_ARM_NEON_FMA;
11500     GemmMicrokernelTester()
11501       .mr(4)
11502       .nr(8)
11503       .kr(1)
11504       .sr(4)
11505       .m(4)
11506       .n(8)
11507       .k(4)
11508       .cn_stride(11)
11509       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11510   }
11511 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_eq_4_strided_a)11512   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_eq_4_strided_a) {
11513     TEST_REQUIRES_ARM_NEON_FMA;
11514     GemmMicrokernelTester()
11515       .mr(4)
11516       .nr(8)
11517       .kr(1)
11518       .sr(4)
11519       .m(4)
11520       .n(8)
11521       .k(4)
11522       .a_stride(7)
11523       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11524   }
11525 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_eq_4_subtile)11526   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_eq_4_subtile) {
11527     TEST_REQUIRES_ARM_NEON_FMA;
11528     for (uint32_t n = 1; n <= 8; n++) {
11529       for (uint32_t m = 1; m <= 4; m++) {
11530         GemmMicrokernelTester()
11531           .mr(4)
11532           .nr(8)
11533           .kr(1)
11534           .sr(4)
11535           .m(m)
11536           .n(n)
11537           .k(4)
11538           .iterations(1)
11539           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11540       }
11541     }
11542   }
11543 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_eq_4_subtile_m)11544   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_eq_4_subtile_m) {
11545     TEST_REQUIRES_ARM_NEON_FMA;
11546     for (uint32_t m = 1; m <= 4; m++) {
11547       GemmMicrokernelTester()
11548         .mr(4)
11549         .nr(8)
11550         .kr(1)
11551         .sr(4)
11552         .m(m)
11553         .n(8)
11554         .k(4)
11555         .iterations(1)
11556         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11557     }
11558   }
11559 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_eq_4_subtile_n)11560   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_eq_4_subtile_n) {
11561     TEST_REQUIRES_ARM_NEON_FMA;
11562     for (uint32_t n = 1; n <= 8; n++) {
11563       GemmMicrokernelTester()
11564         .mr(4)
11565         .nr(8)
11566         .kr(1)
11567         .sr(4)
11568         .m(4)
11569         .n(n)
11570         .k(4)
11571         .iterations(1)
11572         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11573     }
11574   }
11575 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_lt_4)11576   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_lt_4) {
11577     TEST_REQUIRES_ARM_NEON_FMA;
11578     for (size_t k = 1; k < 4; k++) {
11579       GemmMicrokernelTester()
11580         .mr(4)
11581         .nr(8)
11582         .kr(1)
11583         .sr(4)
11584         .m(4)
11585         .n(8)
11586         .k(k)
11587         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11588     }
11589   }
11590 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_lt_4_strided_a)11591   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_lt_4_strided_a) {
11592     TEST_REQUIRES_ARM_NEON_FMA;
11593     for (size_t k = 1; k < 4; k++) {
11594       GemmMicrokernelTester()
11595         .mr(4)
11596         .nr(8)
11597         .kr(1)
11598         .sr(4)
11599         .m(4)
11600         .n(8)
11601         .k(k)
11602         .a_stride(7)
11603         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11604     }
11605   }
11606 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_lt_4_subtile)11607   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_lt_4_subtile) {
11608     TEST_REQUIRES_ARM_NEON_FMA;
11609     for (size_t k = 1; k < 4; k++) {
11610       for (uint32_t n = 1; n <= 8; n++) {
11611         for (uint32_t m = 1; m <= 4; m++) {
11612           GemmMicrokernelTester()
11613             .mr(4)
11614             .nr(8)
11615             .kr(1)
11616             .sr(4)
11617             .m(m)
11618             .n(n)
11619             .k(k)
11620             .iterations(1)
11621             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11622         }
11623       }
11624     }
11625   }
11626 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_gt_4)11627   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_gt_4) {
11628     TEST_REQUIRES_ARM_NEON_FMA;
11629     for (size_t k = 5; k < 8; k++) {
11630       GemmMicrokernelTester()
11631         .mr(4)
11632         .nr(8)
11633         .kr(1)
11634         .sr(4)
11635         .m(4)
11636         .n(8)
11637         .k(k)
11638         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11639     }
11640   }
11641 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_gt_4_strided_a)11642   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_gt_4_strided_a) {
11643     TEST_REQUIRES_ARM_NEON_FMA;
11644     for (size_t k = 5; k < 8; k++) {
11645       GemmMicrokernelTester()
11646         .mr(4)
11647         .nr(8)
11648         .kr(1)
11649         .sr(4)
11650         .m(4)
11651         .n(8)
11652         .k(k)
11653         .a_stride(11)
11654         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11655     }
11656   }
11657 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_gt_4_subtile)11658   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_gt_4_subtile) {
11659     TEST_REQUIRES_ARM_NEON_FMA;
11660     for (size_t k = 5; k < 8; k++) {
11661       for (uint32_t n = 1; n <= 8; n++) {
11662         for (uint32_t m = 1; m <= 4; m++) {
11663           GemmMicrokernelTester()
11664             .mr(4)
11665             .nr(8)
11666             .kr(1)
11667             .sr(4)
11668             .m(m)
11669             .n(n)
11670             .k(k)
11671             .iterations(1)
11672             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11673         }
11674       }
11675     }
11676   }
11677 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_div_4)11678   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_div_4) {
11679     TEST_REQUIRES_ARM_NEON_FMA;
11680     for (size_t k = 8; k <= 40; k += 4) {
11681       GemmMicrokernelTester()
11682         .mr(4)
11683         .nr(8)
11684         .kr(1)
11685         .sr(4)
11686         .m(4)
11687         .n(8)
11688         .k(k)
11689         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11690     }
11691   }
11692 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_div_4_strided_a)11693   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_div_4_strided_a) {
11694     TEST_REQUIRES_ARM_NEON_FMA;
11695     for (size_t k = 8; k <= 40; k += 4) {
11696       GemmMicrokernelTester()
11697         .mr(4)
11698         .nr(8)
11699         .kr(1)
11700         .sr(4)
11701         .m(4)
11702         .n(8)
11703         .k(k)
11704         .a_stride(43)
11705         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11706     }
11707   }
11708 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,k_div_4_subtile)11709   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, k_div_4_subtile) {
11710     TEST_REQUIRES_ARM_NEON_FMA;
11711     for (size_t k = 8; k <= 40; k += 4) {
11712       for (uint32_t n = 1; n <= 8; n++) {
11713         for (uint32_t m = 1; m <= 4; m++) {
11714           GemmMicrokernelTester()
11715             .mr(4)
11716             .nr(8)
11717             .kr(1)
11718             .sr(4)
11719             .m(m)
11720             .n(n)
11721             .k(k)
11722             .iterations(1)
11723             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11724         }
11725       }
11726     }
11727   }
11728 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,n_gt_8)11729   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, n_gt_8) {
11730     TEST_REQUIRES_ARM_NEON_FMA;
11731     for (uint32_t n = 9; n < 16; n++) {
11732       for (size_t k = 1; k <= 20; k += 5) {
11733         GemmMicrokernelTester()
11734           .mr(4)
11735           .nr(8)
11736           .kr(1)
11737           .sr(4)
11738           .m(4)
11739           .n(n)
11740           .k(k)
11741           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11742       }
11743     }
11744   }
11745 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,n_gt_8_strided_cn)11746   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, n_gt_8_strided_cn) {
11747     TEST_REQUIRES_ARM_NEON_FMA;
11748     for (uint32_t n = 9; n < 16; n++) {
11749       for (size_t k = 1; k <= 20; k += 5) {
11750         GemmMicrokernelTester()
11751           .mr(4)
11752           .nr(8)
11753           .kr(1)
11754           .sr(4)
11755           .m(4)
11756           .n(n)
11757           .k(k)
11758           .cn_stride(11)
11759           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11760       }
11761     }
11762   }
11763 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,n_gt_8_strided_a)11764   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, n_gt_8_strided_a) {
11765     TEST_REQUIRES_ARM_NEON_FMA;
11766     for (uint32_t n = 9; n < 16; n++) {
11767       for (size_t k = 1; k <= 20; k += 5) {
11768         GemmMicrokernelTester()
11769           .mr(4)
11770           .nr(8)
11771           .kr(1)
11772           .sr(4)
11773           .m(4)
11774           .n(n)
11775           .k(k)
11776           .a_stride(23)
11777           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11778       }
11779     }
11780   }
11781 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,n_gt_8_subtile)11782   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, n_gt_8_subtile) {
11783     TEST_REQUIRES_ARM_NEON_FMA;
11784     for (uint32_t n = 9; n < 16; n++) {
11785       for (size_t k = 1; k <= 20; k += 5) {
11786         for (uint32_t m = 1; m <= 4; m++) {
11787           GemmMicrokernelTester()
11788             .mr(4)
11789             .nr(8)
11790             .kr(1)
11791             .sr(4)
11792             .m(m)
11793             .n(n)
11794             .k(k)
11795             .iterations(1)
11796             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11797         }
11798       }
11799     }
11800   }
11801 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,n_div_8)11802   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, n_div_8) {
11803     TEST_REQUIRES_ARM_NEON_FMA;
11804     for (uint32_t n = 16; n <= 24; n += 8) {
11805       for (size_t k = 1; k <= 20; k += 5) {
11806         GemmMicrokernelTester()
11807           .mr(4)
11808           .nr(8)
11809           .kr(1)
11810           .sr(4)
11811           .m(4)
11812           .n(n)
11813           .k(k)
11814           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11815       }
11816     }
11817   }
11818 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,n_div_8_strided_cn)11819   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, n_div_8_strided_cn) {
11820     TEST_REQUIRES_ARM_NEON_FMA;
11821     for (uint32_t n = 16; n <= 24; n += 8) {
11822       for (size_t k = 1; k <= 20; k += 5) {
11823         GemmMicrokernelTester()
11824           .mr(4)
11825           .nr(8)
11826           .kr(1)
11827           .sr(4)
11828           .m(4)
11829           .n(n)
11830           .k(k)
11831           .cn_stride(11)
11832           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11833       }
11834     }
11835   }
11836 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,n_div_8_strided_a)11837   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, n_div_8_strided_a) {
11838     TEST_REQUIRES_ARM_NEON_FMA;
11839     for (uint32_t n = 16; n <= 24; n += 8) {
11840       for (size_t k = 1; k <= 20; k += 5) {
11841         GemmMicrokernelTester()
11842           .mr(4)
11843           .nr(8)
11844           .kr(1)
11845           .sr(4)
11846           .m(4)
11847           .n(n)
11848           .k(k)
11849           .a_stride(23)
11850           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11851       }
11852     }
11853   }
11854 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,n_div_8_subtile)11855   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, n_div_8_subtile) {
11856     TEST_REQUIRES_ARM_NEON_FMA;
11857     for (uint32_t n = 16; n <= 24; n += 8) {
11858       for (size_t k = 1; k <= 20; k += 5) {
11859         for (uint32_t m = 1; m <= 4; m++) {
11860           GemmMicrokernelTester()
11861             .mr(4)
11862             .nr(8)
11863             .kr(1)
11864             .sr(4)
11865             .m(m)
11866             .n(n)
11867             .k(k)
11868             .iterations(1)
11869             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11870         }
11871       }
11872     }
11873   }
11874 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,strided_cm_subtile)11875   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, strided_cm_subtile) {
11876     TEST_REQUIRES_ARM_NEON_FMA;
11877     for (size_t k = 1; k <= 20; k += 5) {
11878       for (uint32_t n = 1; n <= 8; n++) {
11879         for (uint32_t m = 1; m <= 4; m++) {
11880           GemmMicrokernelTester()
11881             .mr(4)
11882             .nr(8)
11883             .kr(1)
11884             .sr(4)
11885             .m(m)
11886             .n(n)
11887             .k(k)
11888             .cm_stride(11)
11889             .iterations(1)
11890             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11891         }
11892       }
11893     }
11894   }
11895 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,qmin)11896   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, qmin) {
11897     TEST_REQUIRES_ARM_NEON_FMA;
11898     GemmMicrokernelTester()
11899       .mr(4)
11900       .nr(8)
11901       .kr(1)
11902       .sr(4)
11903       .m(4)
11904       .n(8)
11905       .k(4)
11906       .qmin(128)
11907       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11908   }
11909 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,qmax)11910   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, qmax) {
11911     TEST_REQUIRES_ARM_NEON_FMA;
11912     GemmMicrokernelTester()
11913       .mr(4)
11914       .nr(8)
11915       .kr(1)
11916       .sr(4)
11917       .m(4)
11918       .n(8)
11919       .k(4)
11920       .qmax(128)
11921       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11922   }
11923 
TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA,strided_cm)11924   TEST(F32_GEMM_MINMAX_4X8S4__NEONFMA, strided_cm) {
11925     TEST_REQUIRES_ARM_NEON_FMA;
11926     GemmMicrokernelTester()
11927       .mr(4)
11928       .nr(8)
11929       .kr(1)
11930       .sr(4)
11931       .m(4)
11932       .n(8)
11933       .k(4)
11934       .cm_stride(11)
11935       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__neonfma, xnn_init_f32_minmax_scalar_params);
11936   }
11937 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
11938 
11939 
11940 #if XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_eq_2)11941   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_eq_2) {
11942     TEST_REQUIRES_ARM_NEON_FMA;
11943     GemmMicrokernelTester()
11944       .mr(5)
11945       .nr(8)
11946       .kr(1)
11947       .sr(1)
11948       .m(5)
11949       .n(8)
11950       .k(2)
11951       .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11952   }
11953 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,strided_cn)11954   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, strided_cn) {
11955     TEST_REQUIRES_ARM_NEON_FMA;
11956     GemmMicrokernelTester()
11957       .mr(5)
11958       .nr(8)
11959       .kr(1)
11960       .sr(1)
11961       .m(5)
11962       .n(8)
11963       .k(2)
11964       .cn_stride(11)
11965       .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11966   }
11967 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_eq_2_strided_a)11968   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_eq_2_strided_a) {
11969     TEST_REQUIRES_ARM_NEON_FMA;
11970     GemmMicrokernelTester()
11971       .mr(5)
11972       .nr(8)
11973       .kr(1)
11974       .sr(1)
11975       .m(5)
11976       .n(8)
11977       .k(2)
11978       .a_stride(5)
11979       .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11980   }
11981 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_eq_2_subtile)11982   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_eq_2_subtile) {
11983     TEST_REQUIRES_ARM_NEON_FMA;
11984     for (uint32_t n = 1; n <= 8; n++) {
11985       for (uint32_t m = 1; m <= 5; m++) {
11986         GemmMicrokernelTester()
11987           .mr(5)
11988           .nr(8)
11989           .kr(1)
11990           .sr(1)
11991           .m(m)
11992           .n(n)
11993           .k(2)
11994           .iterations(1)
11995           .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
11996       }
11997     }
11998   }
11999 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_eq_2_subtile_m)12000   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_eq_2_subtile_m) {
12001     TEST_REQUIRES_ARM_NEON_FMA;
12002     for (uint32_t m = 1; m <= 5; m++) {
12003       GemmMicrokernelTester()
12004         .mr(5)
12005         .nr(8)
12006         .kr(1)
12007         .sr(1)
12008         .m(m)
12009         .n(8)
12010         .k(2)
12011         .iterations(1)
12012         .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12013     }
12014   }
12015 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_eq_2_subtile_n)12016   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_eq_2_subtile_n) {
12017     TEST_REQUIRES_ARM_NEON_FMA;
12018     for (uint32_t n = 1; n <= 8; n++) {
12019       GemmMicrokernelTester()
12020         .mr(5)
12021         .nr(8)
12022         .kr(1)
12023         .sr(1)
12024         .m(5)
12025         .n(n)
12026         .k(2)
12027         .iterations(1)
12028         .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12029     }
12030   }
12031 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_lt_2)12032   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_lt_2) {
12033     TEST_REQUIRES_ARM_NEON_FMA;
12034     for (size_t k = 1; k < 2; k++) {
12035       GemmMicrokernelTester()
12036         .mr(5)
12037         .nr(8)
12038         .kr(1)
12039         .sr(1)
12040         .m(5)
12041         .n(8)
12042         .k(k)
12043         .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12044     }
12045   }
12046 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_lt_2_strided_a)12047   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_lt_2_strided_a) {
12048     TEST_REQUIRES_ARM_NEON_FMA;
12049     for (size_t k = 1; k < 2; k++) {
12050       GemmMicrokernelTester()
12051         .mr(5)
12052         .nr(8)
12053         .kr(1)
12054         .sr(1)
12055         .m(5)
12056         .n(8)
12057         .k(k)
12058         .a_stride(5)
12059         .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12060     }
12061   }
12062 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_lt_2_subtile)12063   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_lt_2_subtile) {
12064     TEST_REQUIRES_ARM_NEON_FMA;
12065     for (size_t k = 1; k < 2; k++) {
12066       for (uint32_t n = 1; n <= 8; n++) {
12067         for (uint32_t m = 1; m <= 5; m++) {
12068           GemmMicrokernelTester()
12069             .mr(5)
12070             .nr(8)
12071             .kr(1)
12072             .sr(1)
12073             .m(m)
12074             .n(n)
12075             .k(k)
12076             .iterations(1)
12077             .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12078         }
12079       }
12080     }
12081   }
12082 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_gt_2)12083   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_gt_2) {
12084     TEST_REQUIRES_ARM_NEON_FMA;
12085     for (size_t k = 3; k < 4; k++) {
12086       GemmMicrokernelTester()
12087         .mr(5)
12088         .nr(8)
12089         .kr(1)
12090         .sr(1)
12091         .m(5)
12092         .n(8)
12093         .k(k)
12094         .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12095     }
12096   }
12097 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_gt_2_strided_a)12098   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_gt_2_strided_a) {
12099     TEST_REQUIRES_ARM_NEON_FMA;
12100     for (size_t k = 3; k < 4; k++) {
12101       GemmMicrokernelTester()
12102         .mr(5)
12103         .nr(8)
12104         .kr(1)
12105         .sr(1)
12106         .m(5)
12107         .n(8)
12108         .k(k)
12109         .a_stride(7)
12110         .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12111     }
12112   }
12113 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_gt_2_subtile)12114   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_gt_2_subtile) {
12115     TEST_REQUIRES_ARM_NEON_FMA;
12116     for (size_t k = 3; k < 4; k++) {
12117       for (uint32_t n = 1; n <= 8; n++) {
12118         for (uint32_t m = 1; m <= 5; m++) {
12119           GemmMicrokernelTester()
12120             .mr(5)
12121             .nr(8)
12122             .kr(1)
12123             .sr(1)
12124             .m(m)
12125             .n(n)
12126             .k(k)
12127             .iterations(1)
12128             .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12129         }
12130       }
12131     }
12132   }
12133 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_div_2)12134   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_div_2) {
12135     TEST_REQUIRES_ARM_NEON_FMA;
12136     for (size_t k = 4; k <= 20; k += 2) {
12137       GemmMicrokernelTester()
12138         .mr(5)
12139         .nr(8)
12140         .kr(1)
12141         .sr(1)
12142         .m(5)
12143         .n(8)
12144         .k(k)
12145         .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12146     }
12147   }
12148 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_div_2_strided_a)12149   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_div_2_strided_a) {
12150     TEST_REQUIRES_ARM_NEON_FMA;
12151     for (size_t k = 4; k <= 20; k += 2) {
12152       GemmMicrokernelTester()
12153         .mr(5)
12154         .nr(8)
12155         .kr(1)
12156         .sr(1)
12157         .m(5)
12158         .n(8)
12159         .k(k)
12160         .a_stride(23)
12161         .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12162     }
12163   }
12164 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,k_div_2_subtile)12165   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, k_div_2_subtile) {
12166     TEST_REQUIRES_ARM_NEON_FMA;
12167     for (size_t k = 4; k <= 20; k += 2) {
12168       for (uint32_t n = 1; n <= 8; n++) {
12169         for (uint32_t m = 1; m <= 5; m++) {
12170           GemmMicrokernelTester()
12171             .mr(5)
12172             .nr(8)
12173             .kr(1)
12174             .sr(1)
12175             .m(m)
12176             .n(n)
12177             .k(k)
12178             .iterations(1)
12179             .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12180         }
12181       }
12182     }
12183   }
12184 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,n_gt_8)12185   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, n_gt_8) {
12186     TEST_REQUIRES_ARM_NEON_FMA;
12187     for (uint32_t n = 9; n < 16; n++) {
12188       for (size_t k = 1; k <= 10; k += 3) {
12189         GemmMicrokernelTester()
12190           .mr(5)
12191           .nr(8)
12192           .kr(1)
12193           .sr(1)
12194           .m(5)
12195           .n(n)
12196           .k(k)
12197           .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12198       }
12199     }
12200   }
12201 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,n_gt_8_strided_cn)12202   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, n_gt_8_strided_cn) {
12203     TEST_REQUIRES_ARM_NEON_FMA;
12204     for (uint32_t n = 9; n < 16; n++) {
12205       for (size_t k = 1; k <= 10; k += 3) {
12206         GemmMicrokernelTester()
12207           .mr(5)
12208           .nr(8)
12209           .kr(1)
12210           .sr(1)
12211           .m(5)
12212           .n(n)
12213           .k(k)
12214           .cn_stride(11)
12215           .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12216       }
12217     }
12218   }
12219 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,n_gt_8_strided_a)12220   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, n_gt_8_strided_a) {
12221     TEST_REQUIRES_ARM_NEON_FMA;
12222     for (uint32_t n = 9; n < 16; n++) {
12223       for (size_t k = 1; k <= 10; k += 3) {
12224         GemmMicrokernelTester()
12225           .mr(5)
12226           .nr(8)
12227           .kr(1)
12228           .sr(1)
12229           .m(5)
12230           .n(n)
12231           .k(k)
12232           .a_stride(13)
12233           .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12234       }
12235     }
12236   }
12237 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,n_gt_8_subtile)12238   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, n_gt_8_subtile) {
12239     TEST_REQUIRES_ARM_NEON_FMA;
12240     for (uint32_t n = 9; n < 16; n++) {
12241       for (size_t k = 1; k <= 10; k += 3) {
12242         for (uint32_t m = 1; m <= 5; m++) {
12243           GemmMicrokernelTester()
12244             .mr(5)
12245             .nr(8)
12246             .kr(1)
12247             .sr(1)
12248             .m(m)
12249             .n(n)
12250             .k(k)
12251             .iterations(1)
12252             .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12253         }
12254       }
12255     }
12256   }
12257 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,n_div_8)12258   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, n_div_8) {
12259     TEST_REQUIRES_ARM_NEON_FMA;
12260     for (uint32_t n = 16; n <= 24; n += 8) {
12261       for (size_t k = 1; k <= 10; k += 3) {
12262         GemmMicrokernelTester()
12263           .mr(5)
12264           .nr(8)
12265           .kr(1)
12266           .sr(1)
12267           .m(5)
12268           .n(n)
12269           .k(k)
12270           .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12271       }
12272     }
12273   }
12274 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,n_div_8_strided_cn)12275   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, n_div_8_strided_cn) {
12276     TEST_REQUIRES_ARM_NEON_FMA;
12277     for (uint32_t n = 16; n <= 24; n += 8) {
12278       for (size_t k = 1; k <= 10; k += 3) {
12279         GemmMicrokernelTester()
12280           .mr(5)
12281           .nr(8)
12282           .kr(1)
12283           .sr(1)
12284           .m(5)
12285           .n(n)
12286           .k(k)
12287           .cn_stride(11)
12288           .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12289       }
12290     }
12291   }
12292 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,n_div_8_strided_a)12293   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, n_div_8_strided_a) {
12294     TEST_REQUIRES_ARM_NEON_FMA;
12295     for (uint32_t n = 16; n <= 24; n += 8) {
12296       for (size_t k = 1; k <= 10; k += 3) {
12297         GemmMicrokernelTester()
12298           .mr(5)
12299           .nr(8)
12300           .kr(1)
12301           .sr(1)
12302           .m(5)
12303           .n(n)
12304           .k(k)
12305           .a_stride(13)
12306           .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12307       }
12308     }
12309   }
12310 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,n_div_8_subtile)12311   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, n_div_8_subtile) {
12312     TEST_REQUIRES_ARM_NEON_FMA;
12313     for (uint32_t n = 16; n <= 24; n += 8) {
12314       for (size_t k = 1; k <= 10; k += 3) {
12315         for (uint32_t m = 1; m <= 5; m++) {
12316           GemmMicrokernelTester()
12317             .mr(5)
12318             .nr(8)
12319             .kr(1)
12320             .sr(1)
12321             .m(m)
12322             .n(n)
12323             .k(k)
12324             .iterations(1)
12325             .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12326         }
12327       }
12328     }
12329   }
12330 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,strided_cm_subtile)12331   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, strided_cm_subtile) {
12332     TEST_REQUIRES_ARM_NEON_FMA;
12333     for (size_t k = 1; k <= 10; k += 3) {
12334       for (uint32_t n = 1; n <= 8; n++) {
12335         for (uint32_t m = 1; m <= 5; m++) {
12336           GemmMicrokernelTester()
12337             .mr(5)
12338             .nr(8)
12339             .kr(1)
12340             .sr(1)
12341             .m(m)
12342             .n(n)
12343             .k(k)
12344             .cm_stride(11)
12345             .iterations(1)
12346             .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12347         }
12348       }
12349     }
12350   }
12351 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,qmin)12352   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, qmin) {
12353     TEST_REQUIRES_ARM_NEON_FMA;
12354     GemmMicrokernelTester()
12355       .mr(5)
12356       .nr(8)
12357       .kr(1)
12358       .sr(1)
12359       .m(5)
12360       .n(8)
12361       .k(2)
12362       .qmin(128)
12363       .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12364   }
12365 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,qmax)12366   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, qmax) {
12367     TEST_REQUIRES_ARM_NEON_FMA;
12368     GemmMicrokernelTester()
12369       .mr(5)
12370       .nr(8)
12371       .kr(1)
12372       .sr(1)
12373       .m(5)
12374       .n(8)
12375       .k(2)
12376       .qmax(128)
12377       .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12378   }
12379 
TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64,strided_cm)12380   TEST(F32_GEMM_MINMAX_5X8__NEONFMA_LANE_LD64, strided_cm) {
12381     TEST_REQUIRES_ARM_NEON_FMA;
12382     GemmMicrokernelTester()
12383       .mr(5)
12384       .nr(8)
12385       .kr(1)
12386       .sr(1)
12387       .m(5)
12388       .n(8)
12389       .k(2)
12390       .cm_stride(11)
12391       .Test(xnn_f32_gemm_minmax_ukernel_5x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12392   }
12393 #endif  // XNN_ARCH_ARM64
12394 
12395 
12396 #if XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_eq_2)12397   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_eq_2) {
12398     TEST_REQUIRES_ARM_NEON_FMA;
12399     GemmMicrokernelTester()
12400       .mr(6)
12401       .nr(2)
12402       .kr(1)
12403       .sr(1)
12404       .m(6)
12405       .n(2)
12406       .k(2)
12407       .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12408   }
12409 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,strided_cn)12410   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, strided_cn) {
12411     TEST_REQUIRES_ARM_NEON_FMA;
12412     GemmMicrokernelTester()
12413       .mr(6)
12414       .nr(2)
12415       .kr(1)
12416       .sr(1)
12417       .m(6)
12418       .n(2)
12419       .k(2)
12420       .cn_stride(5)
12421       .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12422   }
12423 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_eq_2_strided_a)12424   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_eq_2_strided_a) {
12425     TEST_REQUIRES_ARM_NEON_FMA;
12426     GemmMicrokernelTester()
12427       .mr(6)
12428       .nr(2)
12429       .kr(1)
12430       .sr(1)
12431       .m(6)
12432       .n(2)
12433       .k(2)
12434       .a_stride(5)
12435       .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12436   }
12437 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_eq_2_subtile)12438   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_eq_2_subtile) {
12439     TEST_REQUIRES_ARM_NEON_FMA;
12440     for (uint32_t n = 1; n <= 2; n++) {
12441       for (uint32_t m = 1; m <= 6; m++) {
12442         GemmMicrokernelTester()
12443           .mr(6)
12444           .nr(2)
12445           .kr(1)
12446           .sr(1)
12447           .m(m)
12448           .n(n)
12449           .k(2)
12450           .iterations(1)
12451           .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12452       }
12453     }
12454   }
12455 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_eq_2_subtile_m)12456   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_eq_2_subtile_m) {
12457     TEST_REQUIRES_ARM_NEON_FMA;
12458     for (uint32_t m = 1; m <= 6; m++) {
12459       GemmMicrokernelTester()
12460         .mr(6)
12461         .nr(2)
12462         .kr(1)
12463         .sr(1)
12464         .m(m)
12465         .n(2)
12466         .k(2)
12467         .iterations(1)
12468         .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12469     }
12470   }
12471 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_eq_2_subtile_n)12472   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_eq_2_subtile_n) {
12473     TEST_REQUIRES_ARM_NEON_FMA;
12474     for (uint32_t n = 1; n <= 2; n++) {
12475       GemmMicrokernelTester()
12476         .mr(6)
12477         .nr(2)
12478         .kr(1)
12479         .sr(1)
12480         .m(6)
12481         .n(n)
12482         .k(2)
12483         .iterations(1)
12484         .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12485     }
12486   }
12487 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_lt_2)12488   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_lt_2) {
12489     TEST_REQUIRES_ARM_NEON_FMA;
12490     for (size_t k = 1; k < 2; k++) {
12491       GemmMicrokernelTester()
12492         .mr(6)
12493         .nr(2)
12494         .kr(1)
12495         .sr(1)
12496         .m(6)
12497         .n(2)
12498         .k(k)
12499         .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12500     }
12501   }
12502 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_lt_2_strided_a)12503   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_lt_2_strided_a) {
12504     TEST_REQUIRES_ARM_NEON_FMA;
12505     for (size_t k = 1; k < 2; k++) {
12506       GemmMicrokernelTester()
12507         .mr(6)
12508         .nr(2)
12509         .kr(1)
12510         .sr(1)
12511         .m(6)
12512         .n(2)
12513         .k(k)
12514         .a_stride(5)
12515         .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12516     }
12517   }
12518 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_lt_2_subtile)12519   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_lt_2_subtile) {
12520     TEST_REQUIRES_ARM_NEON_FMA;
12521     for (size_t k = 1; k < 2; k++) {
12522       for (uint32_t n = 1; n <= 2; n++) {
12523         for (uint32_t m = 1; m <= 6; m++) {
12524           GemmMicrokernelTester()
12525             .mr(6)
12526             .nr(2)
12527             .kr(1)
12528             .sr(1)
12529             .m(m)
12530             .n(n)
12531             .k(k)
12532             .iterations(1)
12533             .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12534         }
12535       }
12536     }
12537   }
12538 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_gt_2)12539   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_gt_2) {
12540     TEST_REQUIRES_ARM_NEON_FMA;
12541     for (size_t k = 3; k < 4; k++) {
12542       GemmMicrokernelTester()
12543         .mr(6)
12544         .nr(2)
12545         .kr(1)
12546         .sr(1)
12547         .m(6)
12548         .n(2)
12549         .k(k)
12550         .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12551     }
12552   }
12553 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_gt_2_strided_a)12554   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_gt_2_strided_a) {
12555     TEST_REQUIRES_ARM_NEON_FMA;
12556     for (size_t k = 3; k < 4; k++) {
12557       GemmMicrokernelTester()
12558         .mr(6)
12559         .nr(2)
12560         .kr(1)
12561         .sr(1)
12562         .m(6)
12563         .n(2)
12564         .k(k)
12565         .a_stride(7)
12566         .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12567     }
12568   }
12569 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_gt_2_subtile)12570   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_gt_2_subtile) {
12571     TEST_REQUIRES_ARM_NEON_FMA;
12572     for (size_t k = 3; k < 4; k++) {
12573       for (uint32_t n = 1; n <= 2; n++) {
12574         for (uint32_t m = 1; m <= 6; m++) {
12575           GemmMicrokernelTester()
12576             .mr(6)
12577             .nr(2)
12578             .kr(1)
12579             .sr(1)
12580             .m(m)
12581             .n(n)
12582             .k(k)
12583             .iterations(1)
12584             .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12585         }
12586       }
12587     }
12588   }
12589 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_div_2)12590   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_div_2) {
12591     TEST_REQUIRES_ARM_NEON_FMA;
12592     for (size_t k = 4; k <= 20; k += 2) {
12593       GemmMicrokernelTester()
12594         .mr(6)
12595         .nr(2)
12596         .kr(1)
12597         .sr(1)
12598         .m(6)
12599         .n(2)
12600         .k(k)
12601         .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12602     }
12603   }
12604 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_div_2_strided_a)12605   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_div_2_strided_a) {
12606     TEST_REQUIRES_ARM_NEON_FMA;
12607     for (size_t k = 4; k <= 20; k += 2) {
12608       GemmMicrokernelTester()
12609         .mr(6)
12610         .nr(2)
12611         .kr(1)
12612         .sr(1)
12613         .m(6)
12614         .n(2)
12615         .k(k)
12616         .a_stride(23)
12617         .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12618     }
12619   }
12620 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,k_div_2_subtile)12621   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, k_div_2_subtile) {
12622     TEST_REQUIRES_ARM_NEON_FMA;
12623     for (size_t k = 4; k <= 20; k += 2) {
12624       for (uint32_t n = 1; n <= 2; n++) {
12625         for (uint32_t m = 1; m <= 6; m++) {
12626           GemmMicrokernelTester()
12627             .mr(6)
12628             .nr(2)
12629             .kr(1)
12630             .sr(1)
12631             .m(m)
12632             .n(n)
12633             .k(k)
12634             .iterations(1)
12635             .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12636         }
12637       }
12638     }
12639   }
12640 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,n_gt_2)12641   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, n_gt_2) {
12642     TEST_REQUIRES_ARM_NEON_FMA;
12643     for (uint32_t n = 3; n < 4; n++) {
12644       for (size_t k = 1; k <= 10; k += 3) {
12645         GemmMicrokernelTester()
12646           .mr(6)
12647           .nr(2)
12648           .kr(1)
12649           .sr(1)
12650           .m(6)
12651           .n(n)
12652           .k(k)
12653           .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12654       }
12655     }
12656   }
12657 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,n_gt_2_strided_cn)12658   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, n_gt_2_strided_cn) {
12659     TEST_REQUIRES_ARM_NEON_FMA;
12660     for (uint32_t n = 3; n < 4; n++) {
12661       for (size_t k = 1; k <= 10; k += 3) {
12662         GemmMicrokernelTester()
12663           .mr(6)
12664           .nr(2)
12665           .kr(1)
12666           .sr(1)
12667           .m(6)
12668           .n(n)
12669           .k(k)
12670           .cn_stride(5)
12671           .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12672       }
12673     }
12674   }
12675 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,n_gt_2_strided_a)12676   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, n_gt_2_strided_a) {
12677     TEST_REQUIRES_ARM_NEON_FMA;
12678     for (uint32_t n = 3; n < 4; n++) {
12679       for (size_t k = 1; k <= 10; k += 3) {
12680         GemmMicrokernelTester()
12681           .mr(6)
12682           .nr(2)
12683           .kr(1)
12684           .sr(1)
12685           .m(6)
12686           .n(n)
12687           .k(k)
12688           .a_stride(13)
12689           .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12690       }
12691     }
12692   }
12693 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,n_gt_2_subtile)12694   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, n_gt_2_subtile) {
12695     TEST_REQUIRES_ARM_NEON_FMA;
12696     for (uint32_t n = 3; n < 4; n++) {
12697       for (size_t k = 1; k <= 10; k += 3) {
12698         for (uint32_t m = 1; m <= 6; m++) {
12699           GemmMicrokernelTester()
12700             .mr(6)
12701             .nr(2)
12702             .kr(1)
12703             .sr(1)
12704             .m(m)
12705             .n(n)
12706             .k(k)
12707             .iterations(1)
12708             .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12709         }
12710       }
12711     }
12712   }
12713 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,n_div_2)12714   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, n_div_2) {
12715     TEST_REQUIRES_ARM_NEON_FMA;
12716     for (uint32_t n = 4; n <= 6; n += 2) {
12717       for (size_t k = 1; k <= 10; k += 3) {
12718         GemmMicrokernelTester()
12719           .mr(6)
12720           .nr(2)
12721           .kr(1)
12722           .sr(1)
12723           .m(6)
12724           .n(n)
12725           .k(k)
12726           .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12727       }
12728     }
12729   }
12730 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,n_div_2_strided_cn)12731   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, n_div_2_strided_cn) {
12732     TEST_REQUIRES_ARM_NEON_FMA;
12733     for (uint32_t n = 4; n <= 6; n += 2) {
12734       for (size_t k = 1; k <= 10; k += 3) {
12735         GemmMicrokernelTester()
12736           .mr(6)
12737           .nr(2)
12738           .kr(1)
12739           .sr(1)
12740           .m(6)
12741           .n(n)
12742           .k(k)
12743           .cn_stride(5)
12744           .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12745       }
12746     }
12747   }
12748 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,n_div_2_strided_a)12749   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, n_div_2_strided_a) {
12750     TEST_REQUIRES_ARM_NEON_FMA;
12751     for (uint32_t n = 4; n <= 6; n += 2) {
12752       for (size_t k = 1; k <= 10; k += 3) {
12753         GemmMicrokernelTester()
12754           .mr(6)
12755           .nr(2)
12756           .kr(1)
12757           .sr(1)
12758           .m(6)
12759           .n(n)
12760           .k(k)
12761           .a_stride(13)
12762           .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12763       }
12764     }
12765   }
12766 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,n_div_2_subtile)12767   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, n_div_2_subtile) {
12768     TEST_REQUIRES_ARM_NEON_FMA;
12769     for (uint32_t n = 4; n <= 6; n += 2) {
12770       for (size_t k = 1; k <= 10; k += 3) {
12771         for (uint32_t m = 1; m <= 6; m++) {
12772           GemmMicrokernelTester()
12773             .mr(6)
12774             .nr(2)
12775             .kr(1)
12776             .sr(1)
12777             .m(m)
12778             .n(n)
12779             .k(k)
12780             .iterations(1)
12781             .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12782         }
12783       }
12784     }
12785   }
12786 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,strided_cm_subtile)12787   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, strided_cm_subtile) {
12788     TEST_REQUIRES_ARM_NEON_FMA;
12789     for (size_t k = 1; k <= 10; k += 3) {
12790       for (uint32_t n = 1; n <= 2; n++) {
12791         for (uint32_t m = 1; m <= 6; m++) {
12792           GemmMicrokernelTester()
12793             .mr(6)
12794             .nr(2)
12795             .kr(1)
12796             .sr(1)
12797             .m(m)
12798             .n(n)
12799             .k(k)
12800             .cm_stride(5)
12801             .iterations(1)
12802             .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12803         }
12804       }
12805     }
12806   }
12807 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,qmin)12808   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, qmin) {
12809     TEST_REQUIRES_ARM_NEON_FMA;
12810     GemmMicrokernelTester()
12811       .mr(6)
12812       .nr(2)
12813       .kr(1)
12814       .sr(1)
12815       .m(6)
12816       .n(2)
12817       .k(2)
12818       .qmin(128)
12819       .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12820   }
12821 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,qmax)12822   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, qmax) {
12823     TEST_REQUIRES_ARM_NEON_FMA;
12824     GemmMicrokernelTester()
12825       .mr(6)
12826       .nr(2)
12827       .kr(1)
12828       .sr(1)
12829       .m(6)
12830       .n(2)
12831       .k(2)
12832       .qmax(128)
12833       .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12834   }
12835 
TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64,strided_cm)12836   TEST(F32_GEMM_MINMAX_6X2__NEONFMA_LANE_LD64, strided_cm) {
12837     TEST_REQUIRES_ARM_NEON_FMA;
12838     GemmMicrokernelTester()
12839       .mr(6)
12840       .nr(2)
12841       .kr(1)
12842       .sr(1)
12843       .m(6)
12844       .n(2)
12845       .k(2)
12846       .cm_stride(5)
12847       .Test(xnn_f32_gemm_minmax_ukernel_6x2__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
12848   }
12849 #endif  // XNN_ARCH_ARM64
12850 
12851 
12852 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_eq_4)12853   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_eq_4) {
12854     TEST_REQUIRES_ARM_NEON;
12855     GemmMicrokernelTester()
12856       .mr(6)
12857       .nr(8)
12858       .kr(1)
12859       .sr(1)
12860       .m(6)
12861       .n(8)
12862       .k(4)
12863       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
12864   }
12865 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,strided_cn)12866   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, strided_cn) {
12867     TEST_REQUIRES_ARM_NEON;
12868     GemmMicrokernelTester()
12869       .mr(6)
12870       .nr(8)
12871       .kr(1)
12872       .sr(1)
12873       .m(6)
12874       .n(8)
12875       .k(4)
12876       .cn_stride(11)
12877       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
12878   }
12879 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_eq_4_strided_a)12880   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_eq_4_strided_a) {
12881     TEST_REQUIRES_ARM_NEON;
12882     GemmMicrokernelTester()
12883       .mr(6)
12884       .nr(8)
12885       .kr(1)
12886       .sr(1)
12887       .m(6)
12888       .n(8)
12889       .k(4)
12890       .a_stride(7)
12891       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
12892   }
12893 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_eq_4_subtile)12894   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_eq_4_subtile) {
12895     TEST_REQUIRES_ARM_NEON;
12896     for (uint32_t n = 1; n <= 8; n++) {
12897       for (uint32_t m = 1; m <= 6; m++) {
12898         GemmMicrokernelTester()
12899           .mr(6)
12900           .nr(8)
12901           .kr(1)
12902           .sr(1)
12903           .m(m)
12904           .n(n)
12905           .k(4)
12906           .iterations(1)
12907           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
12908       }
12909     }
12910   }
12911 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_eq_4_subtile_m)12912   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_eq_4_subtile_m) {
12913     TEST_REQUIRES_ARM_NEON;
12914     for (uint32_t m = 1; m <= 6; m++) {
12915       GemmMicrokernelTester()
12916         .mr(6)
12917         .nr(8)
12918         .kr(1)
12919         .sr(1)
12920         .m(m)
12921         .n(8)
12922         .k(4)
12923         .iterations(1)
12924         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
12925     }
12926   }
12927 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_eq_4_subtile_n)12928   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_eq_4_subtile_n) {
12929     TEST_REQUIRES_ARM_NEON;
12930     for (uint32_t n = 1; n <= 8; n++) {
12931       GemmMicrokernelTester()
12932         .mr(6)
12933         .nr(8)
12934         .kr(1)
12935         .sr(1)
12936         .m(6)
12937         .n(n)
12938         .k(4)
12939         .iterations(1)
12940         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
12941     }
12942   }
12943 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_lt_4)12944   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_lt_4) {
12945     TEST_REQUIRES_ARM_NEON;
12946     for (size_t k = 1; k < 4; k++) {
12947       GemmMicrokernelTester()
12948         .mr(6)
12949         .nr(8)
12950         .kr(1)
12951         .sr(1)
12952         .m(6)
12953         .n(8)
12954         .k(k)
12955         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
12956     }
12957   }
12958 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_lt_4_strided_a)12959   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_lt_4_strided_a) {
12960     TEST_REQUIRES_ARM_NEON;
12961     for (size_t k = 1; k < 4; k++) {
12962       GemmMicrokernelTester()
12963         .mr(6)
12964         .nr(8)
12965         .kr(1)
12966         .sr(1)
12967         .m(6)
12968         .n(8)
12969         .k(k)
12970         .a_stride(7)
12971         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
12972     }
12973   }
12974 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_lt_4_subtile)12975   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_lt_4_subtile) {
12976     TEST_REQUIRES_ARM_NEON;
12977     for (size_t k = 1; k < 4; k++) {
12978       for (uint32_t n = 1; n <= 8; n++) {
12979         for (uint32_t m = 1; m <= 6; m++) {
12980           GemmMicrokernelTester()
12981             .mr(6)
12982             .nr(8)
12983             .kr(1)
12984             .sr(1)
12985             .m(m)
12986             .n(n)
12987             .k(k)
12988             .iterations(1)
12989             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
12990         }
12991       }
12992     }
12993   }
12994 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_gt_4)12995   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_gt_4) {
12996     TEST_REQUIRES_ARM_NEON;
12997     for (size_t k = 5; k < 8; k++) {
12998       GemmMicrokernelTester()
12999         .mr(6)
13000         .nr(8)
13001         .kr(1)
13002         .sr(1)
13003         .m(6)
13004         .n(8)
13005         .k(k)
13006         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13007     }
13008   }
13009 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_gt_4_strided_a)13010   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_gt_4_strided_a) {
13011     TEST_REQUIRES_ARM_NEON;
13012     for (size_t k = 5; k < 8; k++) {
13013       GemmMicrokernelTester()
13014         .mr(6)
13015         .nr(8)
13016         .kr(1)
13017         .sr(1)
13018         .m(6)
13019         .n(8)
13020         .k(k)
13021         .a_stride(11)
13022         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13023     }
13024   }
13025 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_gt_4_subtile)13026   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_gt_4_subtile) {
13027     TEST_REQUIRES_ARM_NEON;
13028     for (size_t k = 5; k < 8; k++) {
13029       for (uint32_t n = 1; n <= 8; n++) {
13030         for (uint32_t m = 1; m <= 6; m++) {
13031           GemmMicrokernelTester()
13032             .mr(6)
13033             .nr(8)
13034             .kr(1)
13035             .sr(1)
13036             .m(m)
13037             .n(n)
13038             .k(k)
13039             .iterations(1)
13040             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13041         }
13042       }
13043     }
13044   }
13045 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_div_4)13046   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_div_4) {
13047     TEST_REQUIRES_ARM_NEON;
13048     for (size_t k = 8; k <= 40; k += 4) {
13049       GemmMicrokernelTester()
13050         .mr(6)
13051         .nr(8)
13052         .kr(1)
13053         .sr(1)
13054         .m(6)
13055         .n(8)
13056         .k(k)
13057         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13058     }
13059   }
13060 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_div_4_strided_a)13061   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_div_4_strided_a) {
13062     TEST_REQUIRES_ARM_NEON;
13063     for (size_t k = 8; k <= 40; k += 4) {
13064       GemmMicrokernelTester()
13065         .mr(6)
13066         .nr(8)
13067         .kr(1)
13068         .sr(1)
13069         .m(6)
13070         .n(8)
13071         .k(k)
13072         .a_stride(43)
13073         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13074     }
13075   }
13076 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,k_div_4_subtile)13077   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, k_div_4_subtile) {
13078     TEST_REQUIRES_ARM_NEON;
13079     for (size_t k = 8; k <= 40; k += 4) {
13080       for (uint32_t n = 1; n <= 8; n++) {
13081         for (uint32_t m = 1; m <= 6; m++) {
13082           GemmMicrokernelTester()
13083             .mr(6)
13084             .nr(8)
13085             .kr(1)
13086             .sr(1)
13087             .m(m)
13088             .n(n)
13089             .k(k)
13090             .iterations(1)
13091             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13092         }
13093       }
13094     }
13095   }
13096 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,n_gt_8)13097   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, n_gt_8) {
13098     TEST_REQUIRES_ARM_NEON;
13099     for (uint32_t n = 9; n < 16; n++) {
13100       for (size_t k = 1; k <= 20; k += 5) {
13101         GemmMicrokernelTester()
13102           .mr(6)
13103           .nr(8)
13104           .kr(1)
13105           .sr(1)
13106           .m(6)
13107           .n(n)
13108           .k(k)
13109           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13110       }
13111     }
13112   }
13113 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,n_gt_8_strided_cn)13114   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, n_gt_8_strided_cn) {
13115     TEST_REQUIRES_ARM_NEON;
13116     for (uint32_t n = 9; n < 16; n++) {
13117       for (size_t k = 1; k <= 20; k += 5) {
13118         GemmMicrokernelTester()
13119           .mr(6)
13120           .nr(8)
13121           .kr(1)
13122           .sr(1)
13123           .m(6)
13124           .n(n)
13125           .k(k)
13126           .cn_stride(11)
13127           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13128       }
13129     }
13130   }
13131 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,n_gt_8_strided_a)13132   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, n_gt_8_strided_a) {
13133     TEST_REQUIRES_ARM_NEON;
13134     for (uint32_t n = 9; n < 16; n++) {
13135       for (size_t k = 1; k <= 20; k += 5) {
13136         GemmMicrokernelTester()
13137           .mr(6)
13138           .nr(8)
13139           .kr(1)
13140           .sr(1)
13141           .m(6)
13142           .n(n)
13143           .k(k)
13144           .a_stride(23)
13145           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13146       }
13147     }
13148   }
13149 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,n_gt_8_subtile)13150   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, n_gt_8_subtile) {
13151     TEST_REQUIRES_ARM_NEON;
13152     for (uint32_t n = 9; n < 16; n++) {
13153       for (size_t k = 1; k <= 20; k += 5) {
13154         for (uint32_t m = 1; m <= 6; m++) {
13155           GemmMicrokernelTester()
13156             .mr(6)
13157             .nr(8)
13158             .kr(1)
13159             .sr(1)
13160             .m(m)
13161             .n(n)
13162             .k(k)
13163             .iterations(1)
13164             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13165         }
13166       }
13167     }
13168   }
13169 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,n_div_8)13170   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, n_div_8) {
13171     TEST_REQUIRES_ARM_NEON;
13172     for (uint32_t n = 16; n <= 24; n += 8) {
13173       for (size_t k = 1; k <= 20; k += 5) {
13174         GemmMicrokernelTester()
13175           .mr(6)
13176           .nr(8)
13177           .kr(1)
13178           .sr(1)
13179           .m(6)
13180           .n(n)
13181           .k(k)
13182           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13183       }
13184     }
13185   }
13186 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,n_div_8_strided_cn)13187   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, n_div_8_strided_cn) {
13188     TEST_REQUIRES_ARM_NEON;
13189     for (uint32_t n = 16; n <= 24; n += 8) {
13190       for (size_t k = 1; k <= 20; k += 5) {
13191         GemmMicrokernelTester()
13192           .mr(6)
13193           .nr(8)
13194           .kr(1)
13195           .sr(1)
13196           .m(6)
13197           .n(n)
13198           .k(k)
13199           .cn_stride(11)
13200           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13201       }
13202     }
13203   }
13204 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,n_div_8_strided_a)13205   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, n_div_8_strided_a) {
13206     TEST_REQUIRES_ARM_NEON;
13207     for (uint32_t n = 16; n <= 24; n += 8) {
13208       for (size_t k = 1; k <= 20; k += 5) {
13209         GemmMicrokernelTester()
13210           .mr(6)
13211           .nr(8)
13212           .kr(1)
13213           .sr(1)
13214           .m(6)
13215           .n(n)
13216           .k(k)
13217           .a_stride(23)
13218           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13219       }
13220     }
13221   }
13222 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,n_div_8_subtile)13223   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, n_div_8_subtile) {
13224     TEST_REQUIRES_ARM_NEON;
13225     for (uint32_t n = 16; n <= 24; n += 8) {
13226       for (size_t k = 1; k <= 20; k += 5) {
13227         for (uint32_t m = 1; m <= 6; m++) {
13228           GemmMicrokernelTester()
13229             .mr(6)
13230             .nr(8)
13231             .kr(1)
13232             .sr(1)
13233             .m(m)
13234             .n(n)
13235             .k(k)
13236             .iterations(1)
13237             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13238         }
13239       }
13240     }
13241   }
13242 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,strided_cm_subtile)13243   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, strided_cm_subtile) {
13244     TEST_REQUIRES_ARM_NEON;
13245     for (size_t k = 1; k <= 20; k += 5) {
13246       for (uint32_t n = 1; n <= 8; n++) {
13247         for (uint32_t m = 1; m <= 6; m++) {
13248           GemmMicrokernelTester()
13249             .mr(6)
13250             .nr(8)
13251             .kr(1)
13252             .sr(1)
13253             .m(m)
13254             .n(n)
13255             .k(k)
13256             .cm_stride(11)
13257             .iterations(1)
13258             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13259         }
13260       }
13261     }
13262   }
13263 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,qmin)13264   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, qmin) {
13265     TEST_REQUIRES_ARM_NEON;
13266     GemmMicrokernelTester()
13267       .mr(6)
13268       .nr(8)
13269       .kr(1)
13270       .sr(1)
13271       .m(6)
13272       .n(8)
13273       .k(4)
13274       .qmin(128)
13275       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13276   }
13277 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,qmax)13278   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, qmax) {
13279     TEST_REQUIRES_ARM_NEON;
13280     GemmMicrokernelTester()
13281       .mr(6)
13282       .nr(8)
13283       .kr(1)
13284       .sr(1)
13285       .m(6)
13286       .n(8)
13287       .k(4)
13288       .qmax(128)
13289       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13290   }
13291 
TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128,strided_cm)13292   TEST(F32_GEMM_MINMAX_6X8__NEON_DUP_LD128, strided_cm) {
13293     TEST_REQUIRES_ARM_NEON;
13294     GemmMicrokernelTester()
13295       .mr(6)
13296       .nr(8)
13297       .kr(1)
13298       .sr(1)
13299       .m(6)
13300       .n(8)
13301       .k(4)
13302       .cm_stride(11)
13303       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_dup_ld128, xnn_init_f32_minmax_scalar_params);
13304   }
13305 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
13306 
13307 
13308 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_eq_2)13309   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_eq_2) {
13310     TEST_REQUIRES_ARM_NEON;
13311     GemmMicrokernelTester()
13312       .mr(6)
13313       .nr(8)
13314       .kr(1)
13315       .sr(1)
13316       .m(6)
13317       .n(8)
13318       .k(2)
13319       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13320   }
13321 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,strided_cn)13322   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, strided_cn) {
13323     TEST_REQUIRES_ARM_NEON;
13324     GemmMicrokernelTester()
13325       .mr(6)
13326       .nr(8)
13327       .kr(1)
13328       .sr(1)
13329       .m(6)
13330       .n(8)
13331       .k(2)
13332       .cn_stride(11)
13333       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13334   }
13335 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_eq_2_strided_a)13336   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_eq_2_strided_a) {
13337     TEST_REQUIRES_ARM_NEON;
13338     GemmMicrokernelTester()
13339       .mr(6)
13340       .nr(8)
13341       .kr(1)
13342       .sr(1)
13343       .m(6)
13344       .n(8)
13345       .k(2)
13346       .a_stride(5)
13347       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13348   }
13349 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_eq_2_subtile)13350   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_eq_2_subtile) {
13351     TEST_REQUIRES_ARM_NEON;
13352     for (uint32_t n = 1; n <= 8; n++) {
13353       for (uint32_t m = 1; m <= 6; m++) {
13354         GemmMicrokernelTester()
13355           .mr(6)
13356           .nr(8)
13357           .kr(1)
13358           .sr(1)
13359           .m(m)
13360           .n(n)
13361           .k(2)
13362           .iterations(1)
13363           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13364       }
13365     }
13366   }
13367 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_eq_2_subtile_m)13368   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_eq_2_subtile_m) {
13369     TEST_REQUIRES_ARM_NEON;
13370     for (uint32_t m = 1; m <= 6; m++) {
13371       GemmMicrokernelTester()
13372         .mr(6)
13373         .nr(8)
13374         .kr(1)
13375         .sr(1)
13376         .m(m)
13377         .n(8)
13378         .k(2)
13379         .iterations(1)
13380         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13381     }
13382   }
13383 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_eq_2_subtile_n)13384   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_eq_2_subtile_n) {
13385     TEST_REQUIRES_ARM_NEON;
13386     for (uint32_t n = 1; n <= 8; n++) {
13387       GemmMicrokernelTester()
13388         .mr(6)
13389         .nr(8)
13390         .kr(1)
13391         .sr(1)
13392         .m(6)
13393         .n(n)
13394         .k(2)
13395         .iterations(1)
13396         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13397     }
13398   }
13399 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_lt_2)13400   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_lt_2) {
13401     TEST_REQUIRES_ARM_NEON;
13402     for (size_t k = 1; k < 2; k++) {
13403       GemmMicrokernelTester()
13404         .mr(6)
13405         .nr(8)
13406         .kr(1)
13407         .sr(1)
13408         .m(6)
13409         .n(8)
13410         .k(k)
13411         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13412     }
13413   }
13414 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_lt_2_strided_a)13415   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_lt_2_strided_a) {
13416     TEST_REQUIRES_ARM_NEON;
13417     for (size_t k = 1; k < 2; k++) {
13418       GemmMicrokernelTester()
13419         .mr(6)
13420         .nr(8)
13421         .kr(1)
13422         .sr(1)
13423         .m(6)
13424         .n(8)
13425         .k(k)
13426         .a_stride(5)
13427         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13428     }
13429   }
13430 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_lt_2_subtile)13431   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_lt_2_subtile) {
13432     TEST_REQUIRES_ARM_NEON;
13433     for (size_t k = 1; k < 2; k++) {
13434       for (uint32_t n = 1; n <= 8; n++) {
13435         for (uint32_t m = 1; m <= 6; m++) {
13436           GemmMicrokernelTester()
13437             .mr(6)
13438             .nr(8)
13439             .kr(1)
13440             .sr(1)
13441             .m(m)
13442             .n(n)
13443             .k(k)
13444             .iterations(1)
13445             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13446         }
13447       }
13448     }
13449   }
13450 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_gt_2)13451   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_gt_2) {
13452     TEST_REQUIRES_ARM_NEON;
13453     for (size_t k = 3; k < 4; k++) {
13454       GemmMicrokernelTester()
13455         .mr(6)
13456         .nr(8)
13457         .kr(1)
13458         .sr(1)
13459         .m(6)
13460         .n(8)
13461         .k(k)
13462         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13463     }
13464   }
13465 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_gt_2_strided_a)13466   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_gt_2_strided_a) {
13467     TEST_REQUIRES_ARM_NEON;
13468     for (size_t k = 3; k < 4; k++) {
13469       GemmMicrokernelTester()
13470         .mr(6)
13471         .nr(8)
13472         .kr(1)
13473         .sr(1)
13474         .m(6)
13475         .n(8)
13476         .k(k)
13477         .a_stride(7)
13478         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13479     }
13480   }
13481 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_gt_2_subtile)13482   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_gt_2_subtile) {
13483     TEST_REQUIRES_ARM_NEON;
13484     for (size_t k = 3; k < 4; k++) {
13485       for (uint32_t n = 1; n <= 8; n++) {
13486         for (uint32_t m = 1; m <= 6; m++) {
13487           GemmMicrokernelTester()
13488             .mr(6)
13489             .nr(8)
13490             .kr(1)
13491             .sr(1)
13492             .m(m)
13493             .n(n)
13494             .k(k)
13495             .iterations(1)
13496             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13497         }
13498       }
13499     }
13500   }
13501 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_div_2)13502   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_div_2) {
13503     TEST_REQUIRES_ARM_NEON;
13504     for (size_t k = 4; k <= 20; k += 2) {
13505       GemmMicrokernelTester()
13506         .mr(6)
13507         .nr(8)
13508         .kr(1)
13509         .sr(1)
13510         .m(6)
13511         .n(8)
13512         .k(k)
13513         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13514     }
13515   }
13516 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_div_2_strided_a)13517   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_div_2_strided_a) {
13518     TEST_REQUIRES_ARM_NEON;
13519     for (size_t k = 4; k <= 20; k += 2) {
13520       GemmMicrokernelTester()
13521         .mr(6)
13522         .nr(8)
13523         .kr(1)
13524         .sr(1)
13525         .m(6)
13526         .n(8)
13527         .k(k)
13528         .a_stride(23)
13529         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13530     }
13531   }
13532 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,k_div_2_subtile)13533   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, k_div_2_subtile) {
13534     TEST_REQUIRES_ARM_NEON;
13535     for (size_t k = 4; k <= 20; k += 2) {
13536       for (uint32_t n = 1; n <= 8; n++) {
13537         for (uint32_t m = 1; m <= 6; m++) {
13538           GemmMicrokernelTester()
13539             .mr(6)
13540             .nr(8)
13541             .kr(1)
13542             .sr(1)
13543             .m(m)
13544             .n(n)
13545             .k(k)
13546             .iterations(1)
13547             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13548         }
13549       }
13550     }
13551   }
13552 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,n_gt_8)13553   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, n_gt_8) {
13554     TEST_REQUIRES_ARM_NEON;
13555     for (uint32_t n = 9; n < 16; n++) {
13556       for (size_t k = 1; k <= 10; k += 3) {
13557         GemmMicrokernelTester()
13558           .mr(6)
13559           .nr(8)
13560           .kr(1)
13561           .sr(1)
13562           .m(6)
13563           .n(n)
13564           .k(k)
13565           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13566       }
13567     }
13568   }
13569 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,n_gt_8_strided_cn)13570   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, n_gt_8_strided_cn) {
13571     TEST_REQUIRES_ARM_NEON;
13572     for (uint32_t n = 9; n < 16; n++) {
13573       for (size_t k = 1; k <= 10; k += 3) {
13574         GemmMicrokernelTester()
13575           .mr(6)
13576           .nr(8)
13577           .kr(1)
13578           .sr(1)
13579           .m(6)
13580           .n(n)
13581           .k(k)
13582           .cn_stride(11)
13583           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13584       }
13585     }
13586   }
13587 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,n_gt_8_strided_a)13588   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, n_gt_8_strided_a) {
13589     TEST_REQUIRES_ARM_NEON;
13590     for (uint32_t n = 9; n < 16; n++) {
13591       for (size_t k = 1; k <= 10; k += 3) {
13592         GemmMicrokernelTester()
13593           .mr(6)
13594           .nr(8)
13595           .kr(1)
13596           .sr(1)
13597           .m(6)
13598           .n(n)
13599           .k(k)
13600           .a_stride(13)
13601           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13602       }
13603     }
13604   }
13605 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,n_gt_8_subtile)13606   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, n_gt_8_subtile) {
13607     TEST_REQUIRES_ARM_NEON;
13608     for (uint32_t n = 9; n < 16; n++) {
13609       for (size_t k = 1; k <= 10; k += 3) {
13610         for (uint32_t m = 1; m <= 6; m++) {
13611           GemmMicrokernelTester()
13612             .mr(6)
13613             .nr(8)
13614             .kr(1)
13615             .sr(1)
13616             .m(m)
13617             .n(n)
13618             .k(k)
13619             .iterations(1)
13620             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13621         }
13622       }
13623     }
13624   }
13625 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,n_div_8)13626   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, n_div_8) {
13627     TEST_REQUIRES_ARM_NEON;
13628     for (uint32_t n = 16; n <= 24; n += 8) {
13629       for (size_t k = 1; k <= 10; k += 3) {
13630         GemmMicrokernelTester()
13631           .mr(6)
13632           .nr(8)
13633           .kr(1)
13634           .sr(1)
13635           .m(6)
13636           .n(n)
13637           .k(k)
13638           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13639       }
13640     }
13641   }
13642 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,n_div_8_strided_cn)13643   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, n_div_8_strided_cn) {
13644     TEST_REQUIRES_ARM_NEON;
13645     for (uint32_t n = 16; n <= 24; n += 8) {
13646       for (size_t k = 1; k <= 10; k += 3) {
13647         GemmMicrokernelTester()
13648           .mr(6)
13649           .nr(8)
13650           .kr(1)
13651           .sr(1)
13652           .m(6)
13653           .n(n)
13654           .k(k)
13655           .cn_stride(11)
13656           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13657       }
13658     }
13659   }
13660 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,n_div_8_strided_a)13661   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, n_div_8_strided_a) {
13662     TEST_REQUIRES_ARM_NEON;
13663     for (uint32_t n = 16; n <= 24; n += 8) {
13664       for (size_t k = 1; k <= 10; k += 3) {
13665         GemmMicrokernelTester()
13666           .mr(6)
13667           .nr(8)
13668           .kr(1)
13669           .sr(1)
13670           .m(6)
13671           .n(n)
13672           .k(k)
13673           .a_stride(13)
13674           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13675       }
13676     }
13677   }
13678 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,n_div_8_subtile)13679   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, n_div_8_subtile) {
13680     TEST_REQUIRES_ARM_NEON;
13681     for (uint32_t n = 16; n <= 24; n += 8) {
13682       for (size_t k = 1; k <= 10; k += 3) {
13683         for (uint32_t m = 1; m <= 6; m++) {
13684           GemmMicrokernelTester()
13685             .mr(6)
13686             .nr(8)
13687             .kr(1)
13688             .sr(1)
13689             .m(m)
13690             .n(n)
13691             .k(k)
13692             .iterations(1)
13693             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13694         }
13695       }
13696     }
13697   }
13698 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,strided_cm_subtile)13699   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, strided_cm_subtile) {
13700     TEST_REQUIRES_ARM_NEON;
13701     for (size_t k = 1; k <= 10; k += 3) {
13702       for (uint32_t n = 1; n <= 8; n++) {
13703         for (uint32_t m = 1; m <= 6; m++) {
13704           GemmMicrokernelTester()
13705             .mr(6)
13706             .nr(8)
13707             .kr(1)
13708             .sr(1)
13709             .m(m)
13710             .n(n)
13711             .k(k)
13712             .cm_stride(11)
13713             .iterations(1)
13714             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13715         }
13716       }
13717     }
13718   }
13719 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,qmin)13720   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, qmin) {
13721     TEST_REQUIRES_ARM_NEON;
13722     GemmMicrokernelTester()
13723       .mr(6)
13724       .nr(8)
13725       .kr(1)
13726       .sr(1)
13727       .m(6)
13728       .n(8)
13729       .k(2)
13730       .qmin(128)
13731       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13732   }
13733 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,qmax)13734   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, qmax) {
13735     TEST_REQUIRES_ARM_NEON;
13736     GemmMicrokernelTester()
13737       .mr(6)
13738       .nr(8)
13739       .kr(1)
13740       .sr(1)
13741       .m(6)
13742       .n(8)
13743       .k(2)
13744       .qmax(128)
13745       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13746   }
13747 
TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64,strided_cm)13748   TEST(F32_GEMM_MINMAX_6X8__NEON_LANE_LD64, strided_cm) {
13749     TEST_REQUIRES_ARM_NEON;
13750     GemmMicrokernelTester()
13751       .mr(6)
13752       .nr(8)
13753       .kr(1)
13754       .sr(1)
13755       .m(6)
13756       .n(8)
13757       .k(2)
13758       .cm_stride(11)
13759       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neon_lane_ld64, xnn_init_f32_minmax_scalar_params);
13760   }
13761 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
13762 
13763 
13764 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_eq_2)13765   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_eq_2) {
13766     TEST_REQUIRES_ARM_NEON_FMA;
13767     GemmMicrokernelTester()
13768       .mr(6)
13769       .nr(8)
13770       .kr(1)
13771       .sr(1)
13772       .m(6)
13773       .n(8)
13774       .k(2)
13775       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13776   }
13777 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,strided_cn)13778   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, strided_cn) {
13779     TEST_REQUIRES_ARM_NEON_FMA;
13780     GemmMicrokernelTester()
13781       .mr(6)
13782       .nr(8)
13783       .kr(1)
13784       .sr(1)
13785       .m(6)
13786       .n(8)
13787       .k(2)
13788       .cn_stride(11)
13789       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13790   }
13791 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_eq_2_strided_a)13792   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_eq_2_strided_a) {
13793     TEST_REQUIRES_ARM_NEON_FMA;
13794     GemmMicrokernelTester()
13795       .mr(6)
13796       .nr(8)
13797       .kr(1)
13798       .sr(1)
13799       .m(6)
13800       .n(8)
13801       .k(2)
13802       .a_stride(5)
13803       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13804   }
13805 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_eq_2_subtile)13806   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_eq_2_subtile) {
13807     TEST_REQUIRES_ARM_NEON_FMA;
13808     for (uint32_t n = 1; n <= 8; n++) {
13809       for (uint32_t m = 1; m <= 6; m++) {
13810         GemmMicrokernelTester()
13811           .mr(6)
13812           .nr(8)
13813           .kr(1)
13814           .sr(1)
13815           .m(m)
13816           .n(n)
13817           .k(2)
13818           .iterations(1)
13819           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13820       }
13821     }
13822   }
13823 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_eq_2_subtile_m)13824   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_eq_2_subtile_m) {
13825     TEST_REQUIRES_ARM_NEON_FMA;
13826     for (uint32_t m = 1; m <= 6; m++) {
13827       GemmMicrokernelTester()
13828         .mr(6)
13829         .nr(8)
13830         .kr(1)
13831         .sr(1)
13832         .m(m)
13833         .n(8)
13834         .k(2)
13835         .iterations(1)
13836         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13837     }
13838   }
13839 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_eq_2_subtile_n)13840   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_eq_2_subtile_n) {
13841     TEST_REQUIRES_ARM_NEON_FMA;
13842     for (uint32_t n = 1; n <= 8; n++) {
13843       GemmMicrokernelTester()
13844         .mr(6)
13845         .nr(8)
13846         .kr(1)
13847         .sr(1)
13848         .m(6)
13849         .n(n)
13850         .k(2)
13851         .iterations(1)
13852         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13853     }
13854   }
13855 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_lt_2)13856   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_lt_2) {
13857     TEST_REQUIRES_ARM_NEON_FMA;
13858     for (size_t k = 1; k < 2; k++) {
13859       GemmMicrokernelTester()
13860         .mr(6)
13861         .nr(8)
13862         .kr(1)
13863         .sr(1)
13864         .m(6)
13865         .n(8)
13866         .k(k)
13867         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13868     }
13869   }
13870 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_lt_2_strided_a)13871   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_lt_2_strided_a) {
13872     TEST_REQUIRES_ARM_NEON_FMA;
13873     for (size_t k = 1; k < 2; k++) {
13874       GemmMicrokernelTester()
13875         .mr(6)
13876         .nr(8)
13877         .kr(1)
13878         .sr(1)
13879         .m(6)
13880         .n(8)
13881         .k(k)
13882         .a_stride(5)
13883         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13884     }
13885   }
13886 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_lt_2_subtile)13887   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_lt_2_subtile) {
13888     TEST_REQUIRES_ARM_NEON_FMA;
13889     for (size_t k = 1; k < 2; k++) {
13890       for (uint32_t n = 1; n <= 8; n++) {
13891         for (uint32_t m = 1; m <= 6; m++) {
13892           GemmMicrokernelTester()
13893             .mr(6)
13894             .nr(8)
13895             .kr(1)
13896             .sr(1)
13897             .m(m)
13898             .n(n)
13899             .k(k)
13900             .iterations(1)
13901             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13902         }
13903       }
13904     }
13905   }
13906 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_gt_2)13907   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_gt_2) {
13908     TEST_REQUIRES_ARM_NEON_FMA;
13909     for (size_t k = 3; k < 4; k++) {
13910       GemmMicrokernelTester()
13911         .mr(6)
13912         .nr(8)
13913         .kr(1)
13914         .sr(1)
13915         .m(6)
13916         .n(8)
13917         .k(k)
13918         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13919     }
13920   }
13921 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_gt_2_strided_a)13922   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_gt_2_strided_a) {
13923     TEST_REQUIRES_ARM_NEON_FMA;
13924     for (size_t k = 3; k < 4; k++) {
13925       GemmMicrokernelTester()
13926         .mr(6)
13927         .nr(8)
13928         .kr(1)
13929         .sr(1)
13930         .m(6)
13931         .n(8)
13932         .k(k)
13933         .a_stride(7)
13934         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13935     }
13936   }
13937 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_gt_2_subtile)13938   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_gt_2_subtile) {
13939     TEST_REQUIRES_ARM_NEON_FMA;
13940     for (size_t k = 3; k < 4; k++) {
13941       for (uint32_t n = 1; n <= 8; n++) {
13942         for (uint32_t m = 1; m <= 6; m++) {
13943           GemmMicrokernelTester()
13944             .mr(6)
13945             .nr(8)
13946             .kr(1)
13947             .sr(1)
13948             .m(m)
13949             .n(n)
13950             .k(k)
13951             .iterations(1)
13952             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13953         }
13954       }
13955     }
13956   }
13957 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_div_2)13958   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_div_2) {
13959     TEST_REQUIRES_ARM_NEON_FMA;
13960     for (size_t k = 4; k <= 20; k += 2) {
13961       GemmMicrokernelTester()
13962         .mr(6)
13963         .nr(8)
13964         .kr(1)
13965         .sr(1)
13966         .m(6)
13967         .n(8)
13968         .k(k)
13969         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13970     }
13971   }
13972 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_div_2_strided_a)13973   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_div_2_strided_a) {
13974     TEST_REQUIRES_ARM_NEON_FMA;
13975     for (size_t k = 4; k <= 20; k += 2) {
13976       GemmMicrokernelTester()
13977         .mr(6)
13978         .nr(8)
13979         .kr(1)
13980         .sr(1)
13981         .m(6)
13982         .n(8)
13983         .k(k)
13984         .a_stride(23)
13985         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
13986     }
13987   }
13988 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,k_div_2_subtile)13989   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, k_div_2_subtile) {
13990     TEST_REQUIRES_ARM_NEON_FMA;
13991     for (size_t k = 4; k <= 20; k += 2) {
13992       for (uint32_t n = 1; n <= 8; n++) {
13993         for (uint32_t m = 1; m <= 6; m++) {
13994           GemmMicrokernelTester()
13995             .mr(6)
13996             .nr(8)
13997             .kr(1)
13998             .sr(1)
13999             .m(m)
14000             .n(n)
14001             .k(k)
14002             .iterations(1)
14003             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14004         }
14005       }
14006     }
14007   }
14008 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,n_gt_8)14009   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, n_gt_8) {
14010     TEST_REQUIRES_ARM_NEON_FMA;
14011     for (uint32_t n = 9; n < 16; n++) {
14012       for (size_t k = 1; k <= 10; k += 3) {
14013         GemmMicrokernelTester()
14014           .mr(6)
14015           .nr(8)
14016           .kr(1)
14017           .sr(1)
14018           .m(6)
14019           .n(n)
14020           .k(k)
14021           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14022       }
14023     }
14024   }
14025 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,n_gt_8_strided_cn)14026   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, n_gt_8_strided_cn) {
14027     TEST_REQUIRES_ARM_NEON_FMA;
14028     for (uint32_t n = 9; n < 16; n++) {
14029       for (size_t k = 1; k <= 10; k += 3) {
14030         GemmMicrokernelTester()
14031           .mr(6)
14032           .nr(8)
14033           .kr(1)
14034           .sr(1)
14035           .m(6)
14036           .n(n)
14037           .k(k)
14038           .cn_stride(11)
14039           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14040       }
14041     }
14042   }
14043 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,n_gt_8_strided_a)14044   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, n_gt_8_strided_a) {
14045     TEST_REQUIRES_ARM_NEON_FMA;
14046     for (uint32_t n = 9; n < 16; n++) {
14047       for (size_t k = 1; k <= 10; k += 3) {
14048         GemmMicrokernelTester()
14049           .mr(6)
14050           .nr(8)
14051           .kr(1)
14052           .sr(1)
14053           .m(6)
14054           .n(n)
14055           .k(k)
14056           .a_stride(13)
14057           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14058       }
14059     }
14060   }
14061 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,n_gt_8_subtile)14062   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, n_gt_8_subtile) {
14063     TEST_REQUIRES_ARM_NEON_FMA;
14064     for (uint32_t n = 9; n < 16; n++) {
14065       for (size_t k = 1; k <= 10; k += 3) {
14066         for (uint32_t m = 1; m <= 6; m++) {
14067           GemmMicrokernelTester()
14068             .mr(6)
14069             .nr(8)
14070             .kr(1)
14071             .sr(1)
14072             .m(m)
14073             .n(n)
14074             .k(k)
14075             .iterations(1)
14076             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14077         }
14078       }
14079     }
14080   }
14081 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,n_div_8)14082   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, n_div_8) {
14083     TEST_REQUIRES_ARM_NEON_FMA;
14084     for (uint32_t n = 16; n <= 24; n += 8) {
14085       for (size_t k = 1; k <= 10; k += 3) {
14086         GemmMicrokernelTester()
14087           .mr(6)
14088           .nr(8)
14089           .kr(1)
14090           .sr(1)
14091           .m(6)
14092           .n(n)
14093           .k(k)
14094           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14095       }
14096     }
14097   }
14098 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,n_div_8_strided_cn)14099   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, n_div_8_strided_cn) {
14100     TEST_REQUIRES_ARM_NEON_FMA;
14101     for (uint32_t n = 16; n <= 24; n += 8) {
14102       for (size_t k = 1; k <= 10; k += 3) {
14103         GemmMicrokernelTester()
14104           .mr(6)
14105           .nr(8)
14106           .kr(1)
14107           .sr(1)
14108           .m(6)
14109           .n(n)
14110           .k(k)
14111           .cn_stride(11)
14112           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14113       }
14114     }
14115   }
14116 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,n_div_8_strided_a)14117   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, n_div_8_strided_a) {
14118     TEST_REQUIRES_ARM_NEON_FMA;
14119     for (uint32_t n = 16; n <= 24; n += 8) {
14120       for (size_t k = 1; k <= 10; k += 3) {
14121         GemmMicrokernelTester()
14122           .mr(6)
14123           .nr(8)
14124           .kr(1)
14125           .sr(1)
14126           .m(6)
14127           .n(n)
14128           .k(k)
14129           .a_stride(13)
14130           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14131       }
14132     }
14133   }
14134 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,n_div_8_subtile)14135   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, n_div_8_subtile) {
14136     TEST_REQUIRES_ARM_NEON_FMA;
14137     for (uint32_t n = 16; n <= 24; n += 8) {
14138       for (size_t k = 1; k <= 10; k += 3) {
14139         for (uint32_t m = 1; m <= 6; m++) {
14140           GemmMicrokernelTester()
14141             .mr(6)
14142             .nr(8)
14143             .kr(1)
14144             .sr(1)
14145             .m(m)
14146             .n(n)
14147             .k(k)
14148             .iterations(1)
14149             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14150         }
14151       }
14152     }
14153   }
14154 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,strided_cm_subtile)14155   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, strided_cm_subtile) {
14156     TEST_REQUIRES_ARM_NEON_FMA;
14157     for (size_t k = 1; k <= 10; k += 3) {
14158       for (uint32_t n = 1; n <= 8; n++) {
14159         for (uint32_t m = 1; m <= 6; m++) {
14160           GemmMicrokernelTester()
14161             .mr(6)
14162             .nr(8)
14163             .kr(1)
14164             .sr(1)
14165             .m(m)
14166             .n(n)
14167             .k(k)
14168             .cm_stride(11)
14169             .iterations(1)
14170             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14171         }
14172       }
14173     }
14174   }
14175 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,qmin)14176   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, qmin) {
14177     TEST_REQUIRES_ARM_NEON_FMA;
14178     GemmMicrokernelTester()
14179       .mr(6)
14180       .nr(8)
14181       .kr(1)
14182       .sr(1)
14183       .m(6)
14184       .n(8)
14185       .k(2)
14186       .qmin(128)
14187       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14188   }
14189 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,qmax)14190   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, qmax) {
14191     TEST_REQUIRES_ARM_NEON_FMA;
14192     GemmMicrokernelTester()
14193       .mr(6)
14194       .nr(8)
14195       .kr(1)
14196       .sr(1)
14197       .m(6)
14198       .n(8)
14199       .k(2)
14200       .qmax(128)
14201       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14202   }
14203 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64,strided_cm)14204   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD64, strided_cm) {
14205     TEST_REQUIRES_ARM_NEON_FMA;
14206     GemmMicrokernelTester()
14207       .mr(6)
14208       .nr(8)
14209       .kr(1)
14210       .sr(1)
14211       .m(6)
14212       .n(8)
14213       .k(2)
14214       .cm_stride(11)
14215       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld64, xnn_init_f32_minmax_scalar_params);
14216   }
14217 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
14218 
14219 
14220 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_eq_4)14221   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_eq_4) {
14222     TEST_REQUIRES_ARM_NEON_FMA;
14223     GemmMicrokernelTester()
14224       .mr(6)
14225       .nr(8)
14226       .kr(1)
14227       .sr(1)
14228       .m(6)
14229       .n(8)
14230       .k(4)
14231       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14232   }
14233 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,strided_cn)14234   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, strided_cn) {
14235     TEST_REQUIRES_ARM_NEON_FMA;
14236     GemmMicrokernelTester()
14237       .mr(6)
14238       .nr(8)
14239       .kr(1)
14240       .sr(1)
14241       .m(6)
14242       .n(8)
14243       .k(4)
14244       .cn_stride(11)
14245       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14246   }
14247 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_eq_4_strided_a)14248   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_eq_4_strided_a) {
14249     TEST_REQUIRES_ARM_NEON_FMA;
14250     GemmMicrokernelTester()
14251       .mr(6)
14252       .nr(8)
14253       .kr(1)
14254       .sr(1)
14255       .m(6)
14256       .n(8)
14257       .k(4)
14258       .a_stride(7)
14259       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14260   }
14261 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_eq_4_subtile)14262   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_eq_4_subtile) {
14263     TEST_REQUIRES_ARM_NEON_FMA;
14264     for (uint32_t n = 1; n <= 8; n++) {
14265       for (uint32_t m = 1; m <= 6; m++) {
14266         GemmMicrokernelTester()
14267           .mr(6)
14268           .nr(8)
14269           .kr(1)
14270           .sr(1)
14271           .m(m)
14272           .n(n)
14273           .k(4)
14274           .iterations(1)
14275           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14276       }
14277     }
14278   }
14279 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_eq_4_subtile_m)14280   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_eq_4_subtile_m) {
14281     TEST_REQUIRES_ARM_NEON_FMA;
14282     for (uint32_t m = 1; m <= 6; m++) {
14283       GemmMicrokernelTester()
14284         .mr(6)
14285         .nr(8)
14286         .kr(1)
14287         .sr(1)
14288         .m(m)
14289         .n(8)
14290         .k(4)
14291         .iterations(1)
14292         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14293     }
14294   }
14295 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_eq_4_subtile_n)14296   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_eq_4_subtile_n) {
14297     TEST_REQUIRES_ARM_NEON_FMA;
14298     for (uint32_t n = 1; n <= 8; n++) {
14299       GemmMicrokernelTester()
14300         .mr(6)
14301         .nr(8)
14302         .kr(1)
14303         .sr(1)
14304         .m(6)
14305         .n(n)
14306         .k(4)
14307         .iterations(1)
14308         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14309     }
14310   }
14311 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_lt_4)14312   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_lt_4) {
14313     TEST_REQUIRES_ARM_NEON_FMA;
14314     for (size_t k = 1; k < 4; k++) {
14315       GemmMicrokernelTester()
14316         .mr(6)
14317         .nr(8)
14318         .kr(1)
14319         .sr(1)
14320         .m(6)
14321         .n(8)
14322         .k(k)
14323         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14324     }
14325   }
14326 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_lt_4_strided_a)14327   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_lt_4_strided_a) {
14328     TEST_REQUIRES_ARM_NEON_FMA;
14329     for (size_t k = 1; k < 4; k++) {
14330       GemmMicrokernelTester()
14331         .mr(6)
14332         .nr(8)
14333         .kr(1)
14334         .sr(1)
14335         .m(6)
14336         .n(8)
14337         .k(k)
14338         .a_stride(7)
14339         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14340     }
14341   }
14342 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_lt_4_subtile)14343   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_lt_4_subtile) {
14344     TEST_REQUIRES_ARM_NEON_FMA;
14345     for (size_t k = 1; k < 4; k++) {
14346       for (uint32_t n = 1; n <= 8; n++) {
14347         for (uint32_t m = 1; m <= 6; m++) {
14348           GemmMicrokernelTester()
14349             .mr(6)
14350             .nr(8)
14351             .kr(1)
14352             .sr(1)
14353             .m(m)
14354             .n(n)
14355             .k(k)
14356             .iterations(1)
14357             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14358         }
14359       }
14360     }
14361   }
14362 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_gt_4)14363   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_gt_4) {
14364     TEST_REQUIRES_ARM_NEON_FMA;
14365     for (size_t k = 5; k < 8; k++) {
14366       GemmMicrokernelTester()
14367         .mr(6)
14368         .nr(8)
14369         .kr(1)
14370         .sr(1)
14371         .m(6)
14372         .n(8)
14373         .k(k)
14374         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14375     }
14376   }
14377 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_gt_4_strided_a)14378   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_gt_4_strided_a) {
14379     TEST_REQUIRES_ARM_NEON_FMA;
14380     for (size_t k = 5; k < 8; k++) {
14381       GemmMicrokernelTester()
14382         .mr(6)
14383         .nr(8)
14384         .kr(1)
14385         .sr(1)
14386         .m(6)
14387         .n(8)
14388         .k(k)
14389         .a_stride(11)
14390         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14391     }
14392   }
14393 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_gt_4_subtile)14394   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_gt_4_subtile) {
14395     TEST_REQUIRES_ARM_NEON_FMA;
14396     for (size_t k = 5; k < 8; k++) {
14397       for (uint32_t n = 1; n <= 8; n++) {
14398         for (uint32_t m = 1; m <= 6; m++) {
14399           GemmMicrokernelTester()
14400             .mr(6)
14401             .nr(8)
14402             .kr(1)
14403             .sr(1)
14404             .m(m)
14405             .n(n)
14406             .k(k)
14407             .iterations(1)
14408             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14409         }
14410       }
14411     }
14412   }
14413 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_div_4)14414   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_div_4) {
14415     TEST_REQUIRES_ARM_NEON_FMA;
14416     for (size_t k = 8; k <= 40; k += 4) {
14417       GemmMicrokernelTester()
14418         .mr(6)
14419         .nr(8)
14420         .kr(1)
14421         .sr(1)
14422         .m(6)
14423         .n(8)
14424         .k(k)
14425         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14426     }
14427   }
14428 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_div_4_strided_a)14429   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_div_4_strided_a) {
14430     TEST_REQUIRES_ARM_NEON_FMA;
14431     for (size_t k = 8; k <= 40; k += 4) {
14432       GemmMicrokernelTester()
14433         .mr(6)
14434         .nr(8)
14435         .kr(1)
14436         .sr(1)
14437         .m(6)
14438         .n(8)
14439         .k(k)
14440         .a_stride(43)
14441         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14442     }
14443   }
14444 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,k_div_4_subtile)14445   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, k_div_4_subtile) {
14446     TEST_REQUIRES_ARM_NEON_FMA;
14447     for (size_t k = 8; k <= 40; k += 4) {
14448       for (uint32_t n = 1; n <= 8; n++) {
14449         for (uint32_t m = 1; m <= 6; m++) {
14450           GemmMicrokernelTester()
14451             .mr(6)
14452             .nr(8)
14453             .kr(1)
14454             .sr(1)
14455             .m(m)
14456             .n(n)
14457             .k(k)
14458             .iterations(1)
14459             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14460         }
14461       }
14462     }
14463   }
14464 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,n_gt_8)14465   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, n_gt_8) {
14466     TEST_REQUIRES_ARM_NEON_FMA;
14467     for (uint32_t n = 9; n < 16; n++) {
14468       for (size_t k = 1; k <= 20; k += 5) {
14469         GemmMicrokernelTester()
14470           .mr(6)
14471           .nr(8)
14472           .kr(1)
14473           .sr(1)
14474           .m(6)
14475           .n(n)
14476           .k(k)
14477           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14478       }
14479     }
14480   }
14481 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,n_gt_8_strided_cn)14482   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, n_gt_8_strided_cn) {
14483     TEST_REQUIRES_ARM_NEON_FMA;
14484     for (uint32_t n = 9; n < 16; n++) {
14485       for (size_t k = 1; k <= 20; k += 5) {
14486         GemmMicrokernelTester()
14487           .mr(6)
14488           .nr(8)
14489           .kr(1)
14490           .sr(1)
14491           .m(6)
14492           .n(n)
14493           .k(k)
14494           .cn_stride(11)
14495           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14496       }
14497     }
14498   }
14499 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,n_gt_8_strided_a)14500   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, n_gt_8_strided_a) {
14501     TEST_REQUIRES_ARM_NEON_FMA;
14502     for (uint32_t n = 9; n < 16; n++) {
14503       for (size_t k = 1; k <= 20; k += 5) {
14504         GemmMicrokernelTester()
14505           .mr(6)
14506           .nr(8)
14507           .kr(1)
14508           .sr(1)
14509           .m(6)
14510           .n(n)
14511           .k(k)
14512           .a_stride(23)
14513           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14514       }
14515     }
14516   }
14517 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,n_gt_8_subtile)14518   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, n_gt_8_subtile) {
14519     TEST_REQUIRES_ARM_NEON_FMA;
14520     for (uint32_t n = 9; n < 16; n++) {
14521       for (size_t k = 1; k <= 20; k += 5) {
14522         for (uint32_t m = 1; m <= 6; m++) {
14523           GemmMicrokernelTester()
14524             .mr(6)
14525             .nr(8)
14526             .kr(1)
14527             .sr(1)
14528             .m(m)
14529             .n(n)
14530             .k(k)
14531             .iterations(1)
14532             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14533         }
14534       }
14535     }
14536   }
14537 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,n_div_8)14538   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, n_div_8) {
14539     TEST_REQUIRES_ARM_NEON_FMA;
14540     for (uint32_t n = 16; n <= 24; n += 8) {
14541       for (size_t k = 1; k <= 20; k += 5) {
14542         GemmMicrokernelTester()
14543           .mr(6)
14544           .nr(8)
14545           .kr(1)
14546           .sr(1)
14547           .m(6)
14548           .n(n)
14549           .k(k)
14550           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14551       }
14552     }
14553   }
14554 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,n_div_8_strided_cn)14555   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, n_div_8_strided_cn) {
14556     TEST_REQUIRES_ARM_NEON_FMA;
14557     for (uint32_t n = 16; n <= 24; n += 8) {
14558       for (size_t k = 1; k <= 20; k += 5) {
14559         GemmMicrokernelTester()
14560           .mr(6)
14561           .nr(8)
14562           .kr(1)
14563           .sr(1)
14564           .m(6)
14565           .n(n)
14566           .k(k)
14567           .cn_stride(11)
14568           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14569       }
14570     }
14571   }
14572 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,n_div_8_strided_a)14573   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, n_div_8_strided_a) {
14574     TEST_REQUIRES_ARM_NEON_FMA;
14575     for (uint32_t n = 16; n <= 24; n += 8) {
14576       for (size_t k = 1; k <= 20; k += 5) {
14577         GemmMicrokernelTester()
14578           .mr(6)
14579           .nr(8)
14580           .kr(1)
14581           .sr(1)
14582           .m(6)
14583           .n(n)
14584           .k(k)
14585           .a_stride(23)
14586           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14587       }
14588     }
14589   }
14590 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,n_div_8_subtile)14591   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, n_div_8_subtile) {
14592     TEST_REQUIRES_ARM_NEON_FMA;
14593     for (uint32_t n = 16; n <= 24; n += 8) {
14594       for (size_t k = 1; k <= 20; k += 5) {
14595         for (uint32_t m = 1; m <= 6; m++) {
14596           GemmMicrokernelTester()
14597             .mr(6)
14598             .nr(8)
14599             .kr(1)
14600             .sr(1)
14601             .m(m)
14602             .n(n)
14603             .k(k)
14604             .iterations(1)
14605             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14606         }
14607       }
14608     }
14609   }
14610 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,strided_cm_subtile)14611   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, strided_cm_subtile) {
14612     TEST_REQUIRES_ARM_NEON_FMA;
14613     for (size_t k = 1; k <= 20; k += 5) {
14614       for (uint32_t n = 1; n <= 8; n++) {
14615         for (uint32_t m = 1; m <= 6; m++) {
14616           GemmMicrokernelTester()
14617             .mr(6)
14618             .nr(8)
14619             .kr(1)
14620             .sr(1)
14621             .m(m)
14622             .n(n)
14623             .k(k)
14624             .cm_stride(11)
14625             .iterations(1)
14626             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14627         }
14628       }
14629     }
14630   }
14631 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,qmin)14632   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, qmin) {
14633     TEST_REQUIRES_ARM_NEON_FMA;
14634     GemmMicrokernelTester()
14635       .mr(6)
14636       .nr(8)
14637       .kr(1)
14638       .sr(1)
14639       .m(6)
14640       .n(8)
14641       .k(4)
14642       .qmin(128)
14643       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14644   }
14645 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,qmax)14646   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, qmax) {
14647     TEST_REQUIRES_ARM_NEON_FMA;
14648     GemmMicrokernelTester()
14649       .mr(6)
14650       .nr(8)
14651       .kr(1)
14652       .sr(1)
14653       .m(6)
14654       .n(8)
14655       .k(4)
14656       .qmax(128)
14657       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14658   }
14659 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128,strided_cm)14660   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_DUP_LD128, strided_cm) {
14661     TEST_REQUIRES_ARM_NEON_FMA;
14662     GemmMicrokernelTester()
14663       .mr(6)
14664       .nr(8)
14665       .kr(1)
14666       .sr(1)
14667       .m(6)
14668       .n(8)
14669       .k(4)
14670       .cm_stride(11)
14671       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_dup_ld128, xnn_init_f32_minmax_scalar_params);
14672   }
14673 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
14674 
14675 
14676 #if XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_eq_2)14677   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_eq_2) {
14678     TEST_REQUIRES_ARM_NEON_FMA;
14679     GemmMicrokernelTester()
14680       .mr(6)
14681       .nr(8)
14682       .kr(1)
14683       .sr(1)
14684       .m(6)
14685       .n(8)
14686       .k(2)
14687       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14688   }
14689 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,strided_cn)14690   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, strided_cn) {
14691     TEST_REQUIRES_ARM_NEON_FMA;
14692     GemmMicrokernelTester()
14693       .mr(6)
14694       .nr(8)
14695       .kr(1)
14696       .sr(1)
14697       .m(6)
14698       .n(8)
14699       .k(2)
14700       .cn_stride(11)
14701       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14702   }
14703 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_eq_2_strided_a)14704   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_eq_2_strided_a) {
14705     TEST_REQUIRES_ARM_NEON_FMA;
14706     GemmMicrokernelTester()
14707       .mr(6)
14708       .nr(8)
14709       .kr(1)
14710       .sr(1)
14711       .m(6)
14712       .n(8)
14713       .k(2)
14714       .a_stride(5)
14715       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14716   }
14717 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_eq_2_subtile)14718   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_eq_2_subtile) {
14719     TEST_REQUIRES_ARM_NEON_FMA;
14720     for (uint32_t n = 1; n <= 8; n++) {
14721       for (uint32_t m = 1; m <= 6; m++) {
14722         GemmMicrokernelTester()
14723           .mr(6)
14724           .nr(8)
14725           .kr(1)
14726           .sr(1)
14727           .m(m)
14728           .n(n)
14729           .k(2)
14730           .iterations(1)
14731           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14732       }
14733     }
14734   }
14735 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_eq_2_subtile_m)14736   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_eq_2_subtile_m) {
14737     TEST_REQUIRES_ARM_NEON_FMA;
14738     for (uint32_t m = 1; m <= 6; m++) {
14739       GemmMicrokernelTester()
14740         .mr(6)
14741         .nr(8)
14742         .kr(1)
14743         .sr(1)
14744         .m(m)
14745         .n(8)
14746         .k(2)
14747         .iterations(1)
14748         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14749     }
14750   }
14751 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_eq_2_subtile_n)14752   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_eq_2_subtile_n) {
14753     TEST_REQUIRES_ARM_NEON_FMA;
14754     for (uint32_t n = 1; n <= 8; n++) {
14755       GemmMicrokernelTester()
14756         .mr(6)
14757         .nr(8)
14758         .kr(1)
14759         .sr(1)
14760         .m(6)
14761         .n(n)
14762         .k(2)
14763         .iterations(1)
14764         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14765     }
14766   }
14767 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_lt_2)14768   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_lt_2) {
14769     TEST_REQUIRES_ARM_NEON_FMA;
14770     for (size_t k = 1; k < 2; k++) {
14771       GemmMicrokernelTester()
14772         .mr(6)
14773         .nr(8)
14774         .kr(1)
14775         .sr(1)
14776         .m(6)
14777         .n(8)
14778         .k(k)
14779         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14780     }
14781   }
14782 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_lt_2_strided_a)14783   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_lt_2_strided_a) {
14784     TEST_REQUIRES_ARM_NEON_FMA;
14785     for (size_t k = 1; k < 2; k++) {
14786       GemmMicrokernelTester()
14787         .mr(6)
14788         .nr(8)
14789         .kr(1)
14790         .sr(1)
14791         .m(6)
14792         .n(8)
14793         .k(k)
14794         .a_stride(5)
14795         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14796     }
14797   }
14798 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_lt_2_subtile)14799   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_lt_2_subtile) {
14800     TEST_REQUIRES_ARM_NEON_FMA;
14801     for (size_t k = 1; k < 2; k++) {
14802       for (uint32_t n = 1; n <= 8; n++) {
14803         for (uint32_t m = 1; m <= 6; m++) {
14804           GemmMicrokernelTester()
14805             .mr(6)
14806             .nr(8)
14807             .kr(1)
14808             .sr(1)
14809             .m(m)
14810             .n(n)
14811             .k(k)
14812             .iterations(1)
14813             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14814         }
14815       }
14816     }
14817   }
14818 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_gt_2)14819   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_gt_2) {
14820     TEST_REQUIRES_ARM_NEON_FMA;
14821     for (size_t k = 3; k < 4; k++) {
14822       GemmMicrokernelTester()
14823         .mr(6)
14824         .nr(8)
14825         .kr(1)
14826         .sr(1)
14827         .m(6)
14828         .n(8)
14829         .k(k)
14830         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14831     }
14832   }
14833 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_gt_2_strided_a)14834   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_gt_2_strided_a) {
14835     TEST_REQUIRES_ARM_NEON_FMA;
14836     for (size_t k = 3; k < 4; k++) {
14837       GemmMicrokernelTester()
14838         .mr(6)
14839         .nr(8)
14840         .kr(1)
14841         .sr(1)
14842         .m(6)
14843         .n(8)
14844         .k(k)
14845         .a_stride(7)
14846         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14847     }
14848   }
14849 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_gt_2_subtile)14850   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_gt_2_subtile) {
14851     TEST_REQUIRES_ARM_NEON_FMA;
14852     for (size_t k = 3; k < 4; k++) {
14853       for (uint32_t n = 1; n <= 8; n++) {
14854         for (uint32_t m = 1; m <= 6; m++) {
14855           GemmMicrokernelTester()
14856             .mr(6)
14857             .nr(8)
14858             .kr(1)
14859             .sr(1)
14860             .m(m)
14861             .n(n)
14862             .k(k)
14863             .iterations(1)
14864             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14865         }
14866       }
14867     }
14868   }
14869 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_div_2)14870   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_div_2) {
14871     TEST_REQUIRES_ARM_NEON_FMA;
14872     for (size_t k = 4; k <= 20; k += 2) {
14873       GemmMicrokernelTester()
14874         .mr(6)
14875         .nr(8)
14876         .kr(1)
14877         .sr(1)
14878         .m(6)
14879         .n(8)
14880         .k(k)
14881         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14882     }
14883   }
14884 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_div_2_strided_a)14885   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_div_2_strided_a) {
14886     TEST_REQUIRES_ARM_NEON_FMA;
14887     for (size_t k = 4; k <= 20; k += 2) {
14888       GemmMicrokernelTester()
14889         .mr(6)
14890         .nr(8)
14891         .kr(1)
14892         .sr(1)
14893         .m(6)
14894         .n(8)
14895         .k(k)
14896         .a_stride(23)
14897         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14898     }
14899   }
14900 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,k_div_2_subtile)14901   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, k_div_2_subtile) {
14902     TEST_REQUIRES_ARM_NEON_FMA;
14903     for (size_t k = 4; k <= 20; k += 2) {
14904       for (uint32_t n = 1; n <= 8; n++) {
14905         for (uint32_t m = 1; m <= 6; m++) {
14906           GemmMicrokernelTester()
14907             .mr(6)
14908             .nr(8)
14909             .kr(1)
14910             .sr(1)
14911             .m(m)
14912             .n(n)
14913             .k(k)
14914             .iterations(1)
14915             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14916         }
14917       }
14918     }
14919   }
14920 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,n_gt_8)14921   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, n_gt_8) {
14922     TEST_REQUIRES_ARM_NEON_FMA;
14923     for (uint32_t n = 9; n < 16; n++) {
14924       for (size_t k = 1; k <= 10; k += 3) {
14925         GemmMicrokernelTester()
14926           .mr(6)
14927           .nr(8)
14928           .kr(1)
14929           .sr(1)
14930           .m(6)
14931           .n(n)
14932           .k(k)
14933           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14934       }
14935     }
14936   }
14937 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,n_gt_8_strided_cn)14938   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, n_gt_8_strided_cn) {
14939     TEST_REQUIRES_ARM_NEON_FMA;
14940     for (uint32_t n = 9; n < 16; n++) {
14941       for (size_t k = 1; k <= 10; k += 3) {
14942         GemmMicrokernelTester()
14943           .mr(6)
14944           .nr(8)
14945           .kr(1)
14946           .sr(1)
14947           .m(6)
14948           .n(n)
14949           .k(k)
14950           .cn_stride(11)
14951           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14952       }
14953     }
14954   }
14955 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,n_gt_8_strided_a)14956   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, n_gt_8_strided_a) {
14957     TEST_REQUIRES_ARM_NEON_FMA;
14958     for (uint32_t n = 9; n < 16; n++) {
14959       for (size_t k = 1; k <= 10; k += 3) {
14960         GemmMicrokernelTester()
14961           .mr(6)
14962           .nr(8)
14963           .kr(1)
14964           .sr(1)
14965           .m(6)
14966           .n(n)
14967           .k(k)
14968           .a_stride(13)
14969           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14970       }
14971     }
14972   }
14973 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,n_gt_8_subtile)14974   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, n_gt_8_subtile) {
14975     TEST_REQUIRES_ARM_NEON_FMA;
14976     for (uint32_t n = 9; n < 16; n++) {
14977       for (size_t k = 1; k <= 10; k += 3) {
14978         for (uint32_t m = 1; m <= 6; m++) {
14979           GemmMicrokernelTester()
14980             .mr(6)
14981             .nr(8)
14982             .kr(1)
14983             .sr(1)
14984             .m(m)
14985             .n(n)
14986             .k(k)
14987             .iterations(1)
14988             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
14989         }
14990       }
14991     }
14992   }
14993 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,n_div_8)14994   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, n_div_8) {
14995     TEST_REQUIRES_ARM_NEON_FMA;
14996     for (uint32_t n = 16; n <= 24; n += 8) {
14997       for (size_t k = 1; k <= 10; k += 3) {
14998         GemmMicrokernelTester()
14999           .mr(6)
15000           .nr(8)
15001           .kr(1)
15002           .sr(1)
15003           .m(6)
15004           .n(n)
15005           .k(k)
15006           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
15007       }
15008     }
15009   }
15010 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,n_div_8_strided_cn)15011   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, n_div_8_strided_cn) {
15012     TEST_REQUIRES_ARM_NEON_FMA;
15013     for (uint32_t n = 16; n <= 24; n += 8) {
15014       for (size_t k = 1; k <= 10; k += 3) {
15015         GemmMicrokernelTester()
15016           .mr(6)
15017           .nr(8)
15018           .kr(1)
15019           .sr(1)
15020           .m(6)
15021           .n(n)
15022           .k(k)
15023           .cn_stride(11)
15024           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
15025       }
15026     }
15027   }
15028 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,n_div_8_strided_a)15029   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, n_div_8_strided_a) {
15030     TEST_REQUIRES_ARM_NEON_FMA;
15031     for (uint32_t n = 16; n <= 24; n += 8) {
15032       for (size_t k = 1; k <= 10; k += 3) {
15033         GemmMicrokernelTester()
15034           .mr(6)
15035           .nr(8)
15036           .kr(1)
15037           .sr(1)
15038           .m(6)
15039           .n(n)
15040           .k(k)
15041           .a_stride(13)
15042           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
15043       }
15044     }
15045   }
15046 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,n_div_8_subtile)15047   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, n_div_8_subtile) {
15048     TEST_REQUIRES_ARM_NEON_FMA;
15049     for (uint32_t n = 16; n <= 24; n += 8) {
15050       for (size_t k = 1; k <= 10; k += 3) {
15051         for (uint32_t m = 1; m <= 6; m++) {
15052           GemmMicrokernelTester()
15053             .mr(6)
15054             .nr(8)
15055             .kr(1)
15056             .sr(1)
15057             .m(m)
15058             .n(n)
15059             .k(k)
15060             .iterations(1)
15061             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
15062         }
15063       }
15064     }
15065   }
15066 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,strided_cm_subtile)15067   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, strided_cm_subtile) {
15068     TEST_REQUIRES_ARM_NEON_FMA;
15069     for (size_t k = 1; k <= 10; k += 3) {
15070       for (uint32_t n = 1; n <= 8; n++) {
15071         for (uint32_t m = 1; m <= 6; m++) {
15072           GemmMicrokernelTester()
15073             .mr(6)
15074             .nr(8)
15075             .kr(1)
15076             .sr(1)
15077             .m(m)
15078             .n(n)
15079             .k(k)
15080             .cm_stride(11)
15081             .iterations(1)
15082             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
15083         }
15084       }
15085     }
15086   }
15087 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,qmin)15088   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, qmin) {
15089     TEST_REQUIRES_ARM_NEON_FMA;
15090     GemmMicrokernelTester()
15091       .mr(6)
15092       .nr(8)
15093       .kr(1)
15094       .sr(1)
15095       .m(6)
15096       .n(8)
15097       .k(2)
15098       .qmin(128)
15099       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
15100   }
15101 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,qmax)15102   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, qmax) {
15103     TEST_REQUIRES_ARM_NEON_FMA;
15104     GemmMicrokernelTester()
15105       .mr(6)
15106       .nr(8)
15107       .kr(1)
15108       .sr(1)
15109       .m(6)
15110       .n(8)
15111       .k(2)
15112       .qmax(128)
15113       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
15114   }
15115 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64,strided_cm)15116   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD64, strided_cm) {
15117     TEST_REQUIRES_ARM_NEON_FMA;
15118     GemmMicrokernelTester()
15119       .mr(6)
15120       .nr(8)
15121       .kr(1)
15122       .sr(1)
15123       .m(6)
15124       .n(8)
15125       .k(2)
15126       .cm_stride(11)
15127       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld64, xnn_init_f32_minmax_scalar_params);
15128   }
15129 #endif  // XNN_ARCH_ARM64
15130 
15131 
15132 #if XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_eq_4)15133   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_eq_4) {
15134     TEST_REQUIRES_ARM_NEON_FMA;
15135     GemmMicrokernelTester()
15136       .mr(6)
15137       .nr(8)
15138       .kr(1)
15139       .sr(1)
15140       .m(6)
15141       .n(8)
15142       .k(4)
15143       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15144   }
15145 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,strided_cn)15146   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, strided_cn) {
15147     TEST_REQUIRES_ARM_NEON_FMA;
15148     GemmMicrokernelTester()
15149       .mr(6)
15150       .nr(8)
15151       .kr(1)
15152       .sr(1)
15153       .m(6)
15154       .n(8)
15155       .k(4)
15156       .cn_stride(11)
15157       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15158   }
15159 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_eq_4_strided_a)15160   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_eq_4_strided_a) {
15161     TEST_REQUIRES_ARM_NEON_FMA;
15162     GemmMicrokernelTester()
15163       .mr(6)
15164       .nr(8)
15165       .kr(1)
15166       .sr(1)
15167       .m(6)
15168       .n(8)
15169       .k(4)
15170       .a_stride(7)
15171       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15172   }
15173 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_eq_4_subtile)15174   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_eq_4_subtile) {
15175     TEST_REQUIRES_ARM_NEON_FMA;
15176     for (uint32_t n = 1; n <= 8; n++) {
15177       for (uint32_t m = 1; m <= 6; m++) {
15178         GemmMicrokernelTester()
15179           .mr(6)
15180           .nr(8)
15181           .kr(1)
15182           .sr(1)
15183           .m(m)
15184           .n(n)
15185           .k(4)
15186           .iterations(1)
15187           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15188       }
15189     }
15190   }
15191 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_eq_4_subtile_m)15192   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_eq_4_subtile_m) {
15193     TEST_REQUIRES_ARM_NEON_FMA;
15194     for (uint32_t m = 1; m <= 6; m++) {
15195       GemmMicrokernelTester()
15196         .mr(6)
15197         .nr(8)
15198         .kr(1)
15199         .sr(1)
15200         .m(m)
15201         .n(8)
15202         .k(4)
15203         .iterations(1)
15204         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15205     }
15206   }
15207 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_eq_4_subtile_n)15208   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_eq_4_subtile_n) {
15209     TEST_REQUIRES_ARM_NEON_FMA;
15210     for (uint32_t n = 1; n <= 8; n++) {
15211       GemmMicrokernelTester()
15212         .mr(6)
15213         .nr(8)
15214         .kr(1)
15215         .sr(1)
15216         .m(6)
15217         .n(n)
15218         .k(4)
15219         .iterations(1)
15220         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15221     }
15222   }
15223 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_lt_4)15224   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_lt_4) {
15225     TEST_REQUIRES_ARM_NEON_FMA;
15226     for (size_t k = 1; k < 4; k++) {
15227       GemmMicrokernelTester()
15228         .mr(6)
15229         .nr(8)
15230         .kr(1)
15231         .sr(1)
15232         .m(6)
15233         .n(8)
15234         .k(k)
15235         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15236     }
15237   }
15238 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_lt_4_strided_a)15239   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_lt_4_strided_a) {
15240     TEST_REQUIRES_ARM_NEON_FMA;
15241     for (size_t k = 1; k < 4; k++) {
15242       GemmMicrokernelTester()
15243         .mr(6)
15244         .nr(8)
15245         .kr(1)
15246         .sr(1)
15247         .m(6)
15248         .n(8)
15249         .k(k)
15250         .a_stride(7)
15251         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15252     }
15253   }
15254 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_lt_4_subtile)15255   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_lt_4_subtile) {
15256     TEST_REQUIRES_ARM_NEON_FMA;
15257     for (size_t k = 1; k < 4; k++) {
15258       for (uint32_t n = 1; n <= 8; n++) {
15259         for (uint32_t m = 1; m <= 6; m++) {
15260           GemmMicrokernelTester()
15261             .mr(6)
15262             .nr(8)
15263             .kr(1)
15264             .sr(1)
15265             .m(m)
15266             .n(n)
15267             .k(k)
15268             .iterations(1)
15269             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15270         }
15271       }
15272     }
15273   }
15274 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_gt_4)15275   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_gt_4) {
15276     TEST_REQUIRES_ARM_NEON_FMA;
15277     for (size_t k = 5; k < 8; k++) {
15278       GemmMicrokernelTester()
15279         .mr(6)
15280         .nr(8)
15281         .kr(1)
15282         .sr(1)
15283         .m(6)
15284         .n(8)
15285         .k(k)
15286         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15287     }
15288   }
15289 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_gt_4_strided_a)15290   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_gt_4_strided_a) {
15291     TEST_REQUIRES_ARM_NEON_FMA;
15292     for (size_t k = 5; k < 8; k++) {
15293       GemmMicrokernelTester()
15294         .mr(6)
15295         .nr(8)
15296         .kr(1)
15297         .sr(1)
15298         .m(6)
15299         .n(8)
15300         .k(k)
15301         .a_stride(11)
15302         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15303     }
15304   }
15305 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_gt_4_subtile)15306   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_gt_4_subtile) {
15307     TEST_REQUIRES_ARM_NEON_FMA;
15308     for (size_t k = 5; k < 8; k++) {
15309       for (uint32_t n = 1; n <= 8; n++) {
15310         for (uint32_t m = 1; m <= 6; m++) {
15311           GemmMicrokernelTester()
15312             .mr(6)
15313             .nr(8)
15314             .kr(1)
15315             .sr(1)
15316             .m(m)
15317             .n(n)
15318             .k(k)
15319             .iterations(1)
15320             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15321         }
15322       }
15323     }
15324   }
15325 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_div_4)15326   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_div_4) {
15327     TEST_REQUIRES_ARM_NEON_FMA;
15328     for (size_t k = 8; k <= 40; k += 4) {
15329       GemmMicrokernelTester()
15330         .mr(6)
15331         .nr(8)
15332         .kr(1)
15333         .sr(1)
15334         .m(6)
15335         .n(8)
15336         .k(k)
15337         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15338     }
15339   }
15340 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_div_4_strided_a)15341   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_div_4_strided_a) {
15342     TEST_REQUIRES_ARM_NEON_FMA;
15343     for (size_t k = 8; k <= 40; k += 4) {
15344       GemmMicrokernelTester()
15345         .mr(6)
15346         .nr(8)
15347         .kr(1)
15348         .sr(1)
15349         .m(6)
15350         .n(8)
15351         .k(k)
15352         .a_stride(43)
15353         .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15354     }
15355   }
15356 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,k_div_4_subtile)15357   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, k_div_4_subtile) {
15358     TEST_REQUIRES_ARM_NEON_FMA;
15359     for (size_t k = 8; k <= 40; k += 4) {
15360       for (uint32_t n = 1; n <= 8; n++) {
15361         for (uint32_t m = 1; m <= 6; m++) {
15362           GemmMicrokernelTester()
15363             .mr(6)
15364             .nr(8)
15365             .kr(1)
15366             .sr(1)
15367             .m(m)
15368             .n(n)
15369             .k(k)
15370             .iterations(1)
15371             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15372         }
15373       }
15374     }
15375   }
15376 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,n_gt_8)15377   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, n_gt_8) {
15378     TEST_REQUIRES_ARM_NEON_FMA;
15379     for (uint32_t n = 9; n < 16; n++) {
15380       for (size_t k = 1; k <= 20; k += 5) {
15381         GemmMicrokernelTester()
15382           .mr(6)
15383           .nr(8)
15384           .kr(1)
15385           .sr(1)
15386           .m(6)
15387           .n(n)
15388           .k(k)
15389           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15390       }
15391     }
15392   }
15393 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,n_gt_8_strided_cn)15394   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, n_gt_8_strided_cn) {
15395     TEST_REQUIRES_ARM_NEON_FMA;
15396     for (uint32_t n = 9; n < 16; n++) {
15397       for (size_t k = 1; k <= 20; k += 5) {
15398         GemmMicrokernelTester()
15399           .mr(6)
15400           .nr(8)
15401           .kr(1)
15402           .sr(1)
15403           .m(6)
15404           .n(n)
15405           .k(k)
15406           .cn_stride(11)
15407           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15408       }
15409     }
15410   }
15411 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,n_gt_8_strided_a)15412   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, n_gt_8_strided_a) {
15413     TEST_REQUIRES_ARM_NEON_FMA;
15414     for (uint32_t n = 9; n < 16; n++) {
15415       for (size_t k = 1; k <= 20; k += 5) {
15416         GemmMicrokernelTester()
15417           .mr(6)
15418           .nr(8)
15419           .kr(1)
15420           .sr(1)
15421           .m(6)
15422           .n(n)
15423           .k(k)
15424           .a_stride(23)
15425           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15426       }
15427     }
15428   }
15429 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,n_gt_8_subtile)15430   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, n_gt_8_subtile) {
15431     TEST_REQUIRES_ARM_NEON_FMA;
15432     for (uint32_t n = 9; n < 16; n++) {
15433       for (size_t k = 1; k <= 20; k += 5) {
15434         for (uint32_t m = 1; m <= 6; m++) {
15435           GemmMicrokernelTester()
15436             .mr(6)
15437             .nr(8)
15438             .kr(1)
15439             .sr(1)
15440             .m(m)
15441             .n(n)
15442             .k(k)
15443             .iterations(1)
15444             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15445         }
15446       }
15447     }
15448   }
15449 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,n_div_8)15450   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, n_div_8) {
15451     TEST_REQUIRES_ARM_NEON_FMA;
15452     for (uint32_t n = 16; n <= 24; n += 8) {
15453       for (size_t k = 1; k <= 20; k += 5) {
15454         GemmMicrokernelTester()
15455           .mr(6)
15456           .nr(8)
15457           .kr(1)
15458           .sr(1)
15459           .m(6)
15460           .n(n)
15461           .k(k)
15462           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15463       }
15464     }
15465   }
15466 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,n_div_8_strided_cn)15467   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, n_div_8_strided_cn) {
15468     TEST_REQUIRES_ARM_NEON_FMA;
15469     for (uint32_t n = 16; n <= 24; n += 8) {
15470       for (size_t k = 1; k <= 20; k += 5) {
15471         GemmMicrokernelTester()
15472           .mr(6)
15473           .nr(8)
15474           .kr(1)
15475           .sr(1)
15476           .m(6)
15477           .n(n)
15478           .k(k)
15479           .cn_stride(11)
15480           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15481       }
15482     }
15483   }
15484 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,n_div_8_strided_a)15485   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, n_div_8_strided_a) {
15486     TEST_REQUIRES_ARM_NEON_FMA;
15487     for (uint32_t n = 16; n <= 24; n += 8) {
15488       for (size_t k = 1; k <= 20; k += 5) {
15489         GemmMicrokernelTester()
15490           .mr(6)
15491           .nr(8)
15492           .kr(1)
15493           .sr(1)
15494           .m(6)
15495           .n(n)
15496           .k(k)
15497           .a_stride(23)
15498           .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15499       }
15500     }
15501   }
15502 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,n_div_8_subtile)15503   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, n_div_8_subtile) {
15504     TEST_REQUIRES_ARM_NEON_FMA;
15505     for (uint32_t n = 16; n <= 24; n += 8) {
15506       for (size_t k = 1; k <= 20; k += 5) {
15507         for (uint32_t m = 1; m <= 6; m++) {
15508           GemmMicrokernelTester()
15509             .mr(6)
15510             .nr(8)
15511             .kr(1)
15512             .sr(1)
15513             .m(m)
15514             .n(n)
15515             .k(k)
15516             .iterations(1)
15517             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15518         }
15519       }
15520     }
15521   }
15522 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,strided_cm_subtile)15523   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, strided_cm_subtile) {
15524     TEST_REQUIRES_ARM_NEON_FMA;
15525     for (size_t k = 1; k <= 20; k += 5) {
15526       for (uint32_t n = 1; n <= 8; n++) {
15527         for (uint32_t m = 1; m <= 6; m++) {
15528           GemmMicrokernelTester()
15529             .mr(6)
15530             .nr(8)
15531             .kr(1)
15532             .sr(1)
15533             .m(m)
15534             .n(n)
15535             .k(k)
15536             .cm_stride(11)
15537             .iterations(1)
15538             .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15539         }
15540       }
15541     }
15542   }
15543 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,qmin)15544   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, qmin) {
15545     TEST_REQUIRES_ARM_NEON_FMA;
15546     GemmMicrokernelTester()
15547       .mr(6)
15548       .nr(8)
15549       .kr(1)
15550       .sr(1)
15551       .m(6)
15552       .n(8)
15553       .k(4)
15554       .qmin(128)
15555       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15556   }
15557 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,qmax)15558   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, qmax) {
15559     TEST_REQUIRES_ARM_NEON_FMA;
15560     GemmMicrokernelTester()
15561       .mr(6)
15562       .nr(8)
15563       .kr(1)
15564       .sr(1)
15565       .m(6)
15566       .n(8)
15567       .k(4)
15568       .qmax(128)
15569       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15570   }
15571 
TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128,strided_cm)15572   TEST(F32_GEMM_MINMAX_6X8__NEONFMA_LANE_LD128, strided_cm) {
15573     TEST_REQUIRES_ARM_NEON_FMA;
15574     GemmMicrokernelTester()
15575       .mr(6)
15576       .nr(8)
15577       .kr(1)
15578       .sr(1)
15579       .m(6)
15580       .n(8)
15581       .k(4)
15582       .cm_stride(11)
15583       .Test(xnn_f32_gemm_minmax_ukernel_6x8__neonfma_lane_ld128, xnn_init_f32_minmax_scalar_params);
15584   }
15585 #endif  // XNN_ARCH_ARM64
15586 
15587 
15588 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_eq_4)15589   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_eq_4) {
15590     TEST_REQUIRES_ARM_NEON;
15591     GemmMicrokernelTester()
15592       .mr(6)
15593       .nr(8)
15594       .kr(1)
15595       .sr(4)
15596       .m(6)
15597       .n(8)
15598       .k(4)
15599       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15600   }
15601 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,strided_cn)15602   TEST(F32_GEMM_MINMAX_6X8S4__NEON, strided_cn) {
15603     TEST_REQUIRES_ARM_NEON;
15604     GemmMicrokernelTester()
15605       .mr(6)
15606       .nr(8)
15607       .kr(1)
15608       .sr(4)
15609       .m(6)
15610       .n(8)
15611       .k(4)
15612       .cn_stride(11)
15613       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15614   }
15615 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_eq_4_strided_a)15616   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_eq_4_strided_a) {
15617     TEST_REQUIRES_ARM_NEON;
15618     GemmMicrokernelTester()
15619       .mr(6)
15620       .nr(8)
15621       .kr(1)
15622       .sr(4)
15623       .m(6)
15624       .n(8)
15625       .k(4)
15626       .a_stride(7)
15627       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15628   }
15629 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_eq_4_subtile)15630   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_eq_4_subtile) {
15631     TEST_REQUIRES_ARM_NEON;
15632     for (uint32_t n = 1; n <= 8; n++) {
15633       for (uint32_t m = 1; m <= 6; m++) {
15634         GemmMicrokernelTester()
15635           .mr(6)
15636           .nr(8)
15637           .kr(1)
15638           .sr(4)
15639           .m(m)
15640           .n(n)
15641           .k(4)
15642           .iterations(1)
15643           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15644       }
15645     }
15646   }
15647 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_eq_4_subtile_m)15648   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_eq_4_subtile_m) {
15649     TEST_REQUIRES_ARM_NEON;
15650     for (uint32_t m = 1; m <= 6; m++) {
15651       GemmMicrokernelTester()
15652         .mr(6)
15653         .nr(8)
15654         .kr(1)
15655         .sr(4)
15656         .m(m)
15657         .n(8)
15658         .k(4)
15659         .iterations(1)
15660         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15661     }
15662   }
15663 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_eq_4_subtile_n)15664   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_eq_4_subtile_n) {
15665     TEST_REQUIRES_ARM_NEON;
15666     for (uint32_t n = 1; n <= 8; n++) {
15667       GemmMicrokernelTester()
15668         .mr(6)
15669         .nr(8)
15670         .kr(1)
15671         .sr(4)
15672         .m(6)
15673         .n(n)
15674         .k(4)
15675         .iterations(1)
15676         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15677     }
15678   }
15679 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_lt_4)15680   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_lt_4) {
15681     TEST_REQUIRES_ARM_NEON;
15682     for (size_t k = 1; k < 4; k++) {
15683       GemmMicrokernelTester()
15684         .mr(6)
15685         .nr(8)
15686         .kr(1)
15687         .sr(4)
15688         .m(6)
15689         .n(8)
15690         .k(k)
15691         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15692     }
15693   }
15694 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_lt_4_strided_a)15695   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_lt_4_strided_a) {
15696     TEST_REQUIRES_ARM_NEON;
15697     for (size_t k = 1; k < 4; k++) {
15698       GemmMicrokernelTester()
15699         .mr(6)
15700         .nr(8)
15701         .kr(1)
15702         .sr(4)
15703         .m(6)
15704         .n(8)
15705         .k(k)
15706         .a_stride(7)
15707         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15708     }
15709   }
15710 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_lt_4_subtile)15711   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_lt_4_subtile) {
15712     TEST_REQUIRES_ARM_NEON;
15713     for (size_t k = 1; k < 4; k++) {
15714       for (uint32_t n = 1; n <= 8; n++) {
15715         for (uint32_t m = 1; m <= 6; m++) {
15716           GemmMicrokernelTester()
15717             .mr(6)
15718             .nr(8)
15719             .kr(1)
15720             .sr(4)
15721             .m(m)
15722             .n(n)
15723             .k(k)
15724             .iterations(1)
15725             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15726         }
15727       }
15728     }
15729   }
15730 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_gt_4)15731   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_gt_4) {
15732     TEST_REQUIRES_ARM_NEON;
15733     for (size_t k = 5; k < 8; k++) {
15734       GemmMicrokernelTester()
15735         .mr(6)
15736         .nr(8)
15737         .kr(1)
15738         .sr(4)
15739         .m(6)
15740         .n(8)
15741         .k(k)
15742         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15743     }
15744   }
15745 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_gt_4_strided_a)15746   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_gt_4_strided_a) {
15747     TEST_REQUIRES_ARM_NEON;
15748     for (size_t k = 5; k < 8; k++) {
15749       GemmMicrokernelTester()
15750         .mr(6)
15751         .nr(8)
15752         .kr(1)
15753         .sr(4)
15754         .m(6)
15755         .n(8)
15756         .k(k)
15757         .a_stride(11)
15758         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15759     }
15760   }
15761 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_gt_4_subtile)15762   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_gt_4_subtile) {
15763     TEST_REQUIRES_ARM_NEON;
15764     for (size_t k = 5; k < 8; k++) {
15765       for (uint32_t n = 1; n <= 8; n++) {
15766         for (uint32_t m = 1; m <= 6; m++) {
15767           GemmMicrokernelTester()
15768             .mr(6)
15769             .nr(8)
15770             .kr(1)
15771             .sr(4)
15772             .m(m)
15773             .n(n)
15774             .k(k)
15775             .iterations(1)
15776             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15777         }
15778       }
15779     }
15780   }
15781 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_div_4)15782   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_div_4) {
15783     TEST_REQUIRES_ARM_NEON;
15784     for (size_t k = 8; k <= 40; k += 4) {
15785       GemmMicrokernelTester()
15786         .mr(6)
15787         .nr(8)
15788         .kr(1)
15789         .sr(4)
15790         .m(6)
15791         .n(8)
15792         .k(k)
15793         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15794     }
15795   }
15796 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_div_4_strided_a)15797   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_div_4_strided_a) {
15798     TEST_REQUIRES_ARM_NEON;
15799     for (size_t k = 8; k <= 40; k += 4) {
15800       GemmMicrokernelTester()
15801         .mr(6)
15802         .nr(8)
15803         .kr(1)
15804         .sr(4)
15805         .m(6)
15806         .n(8)
15807         .k(k)
15808         .a_stride(43)
15809         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15810     }
15811   }
15812 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,k_div_4_subtile)15813   TEST(F32_GEMM_MINMAX_6X8S4__NEON, k_div_4_subtile) {
15814     TEST_REQUIRES_ARM_NEON;
15815     for (size_t k = 8; k <= 40; k += 4) {
15816       for (uint32_t n = 1; n <= 8; n++) {
15817         for (uint32_t m = 1; m <= 6; m++) {
15818           GemmMicrokernelTester()
15819             .mr(6)
15820             .nr(8)
15821             .kr(1)
15822             .sr(4)
15823             .m(m)
15824             .n(n)
15825             .k(k)
15826             .iterations(1)
15827             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15828         }
15829       }
15830     }
15831   }
15832 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,n_gt_8)15833   TEST(F32_GEMM_MINMAX_6X8S4__NEON, n_gt_8) {
15834     TEST_REQUIRES_ARM_NEON;
15835     for (uint32_t n = 9; n < 16; n++) {
15836       for (size_t k = 1; k <= 20; k += 5) {
15837         GemmMicrokernelTester()
15838           .mr(6)
15839           .nr(8)
15840           .kr(1)
15841           .sr(4)
15842           .m(6)
15843           .n(n)
15844           .k(k)
15845           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15846       }
15847     }
15848   }
15849 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,n_gt_8_strided_cn)15850   TEST(F32_GEMM_MINMAX_6X8S4__NEON, n_gt_8_strided_cn) {
15851     TEST_REQUIRES_ARM_NEON;
15852     for (uint32_t n = 9; n < 16; n++) {
15853       for (size_t k = 1; k <= 20; k += 5) {
15854         GemmMicrokernelTester()
15855           .mr(6)
15856           .nr(8)
15857           .kr(1)
15858           .sr(4)
15859           .m(6)
15860           .n(n)
15861           .k(k)
15862           .cn_stride(11)
15863           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15864       }
15865     }
15866   }
15867 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,n_gt_8_strided_a)15868   TEST(F32_GEMM_MINMAX_6X8S4__NEON, n_gt_8_strided_a) {
15869     TEST_REQUIRES_ARM_NEON;
15870     for (uint32_t n = 9; n < 16; n++) {
15871       for (size_t k = 1; k <= 20; k += 5) {
15872         GemmMicrokernelTester()
15873           .mr(6)
15874           .nr(8)
15875           .kr(1)
15876           .sr(4)
15877           .m(6)
15878           .n(n)
15879           .k(k)
15880           .a_stride(23)
15881           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15882       }
15883     }
15884   }
15885 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,n_gt_8_subtile)15886   TEST(F32_GEMM_MINMAX_6X8S4__NEON, n_gt_8_subtile) {
15887     TEST_REQUIRES_ARM_NEON;
15888     for (uint32_t n = 9; n < 16; n++) {
15889       for (size_t k = 1; k <= 20; k += 5) {
15890         for (uint32_t m = 1; m <= 6; m++) {
15891           GemmMicrokernelTester()
15892             .mr(6)
15893             .nr(8)
15894             .kr(1)
15895             .sr(4)
15896             .m(m)
15897             .n(n)
15898             .k(k)
15899             .iterations(1)
15900             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15901         }
15902       }
15903     }
15904   }
15905 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,n_div_8)15906   TEST(F32_GEMM_MINMAX_6X8S4__NEON, n_div_8) {
15907     TEST_REQUIRES_ARM_NEON;
15908     for (uint32_t n = 16; n <= 24; n += 8) {
15909       for (size_t k = 1; k <= 20; k += 5) {
15910         GemmMicrokernelTester()
15911           .mr(6)
15912           .nr(8)
15913           .kr(1)
15914           .sr(4)
15915           .m(6)
15916           .n(n)
15917           .k(k)
15918           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15919       }
15920     }
15921   }
15922 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,n_div_8_strided_cn)15923   TEST(F32_GEMM_MINMAX_6X8S4__NEON, n_div_8_strided_cn) {
15924     TEST_REQUIRES_ARM_NEON;
15925     for (uint32_t n = 16; n <= 24; n += 8) {
15926       for (size_t k = 1; k <= 20; k += 5) {
15927         GemmMicrokernelTester()
15928           .mr(6)
15929           .nr(8)
15930           .kr(1)
15931           .sr(4)
15932           .m(6)
15933           .n(n)
15934           .k(k)
15935           .cn_stride(11)
15936           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15937       }
15938     }
15939   }
15940 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,n_div_8_strided_a)15941   TEST(F32_GEMM_MINMAX_6X8S4__NEON, n_div_8_strided_a) {
15942     TEST_REQUIRES_ARM_NEON;
15943     for (uint32_t n = 16; n <= 24; n += 8) {
15944       for (size_t k = 1; k <= 20; k += 5) {
15945         GemmMicrokernelTester()
15946           .mr(6)
15947           .nr(8)
15948           .kr(1)
15949           .sr(4)
15950           .m(6)
15951           .n(n)
15952           .k(k)
15953           .a_stride(23)
15954           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15955       }
15956     }
15957   }
15958 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,n_div_8_subtile)15959   TEST(F32_GEMM_MINMAX_6X8S4__NEON, n_div_8_subtile) {
15960     TEST_REQUIRES_ARM_NEON;
15961     for (uint32_t n = 16; n <= 24; n += 8) {
15962       for (size_t k = 1; k <= 20; k += 5) {
15963         for (uint32_t m = 1; m <= 6; m++) {
15964           GemmMicrokernelTester()
15965             .mr(6)
15966             .nr(8)
15967             .kr(1)
15968             .sr(4)
15969             .m(m)
15970             .n(n)
15971             .k(k)
15972             .iterations(1)
15973             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15974         }
15975       }
15976     }
15977   }
15978 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,strided_cm_subtile)15979   TEST(F32_GEMM_MINMAX_6X8S4__NEON, strided_cm_subtile) {
15980     TEST_REQUIRES_ARM_NEON;
15981     for (size_t k = 1; k <= 20; k += 5) {
15982       for (uint32_t n = 1; n <= 8; n++) {
15983         for (uint32_t m = 1; m <= 6; m++) {
15984           GemmMicrokernelTester()
15985             .mr(6)
15986             .nr(8)
15987             .kr(1)
15988             .sr(4)
15989             .m(m)
15990             .n(n)
15991             .k(k)
15992             .cm_stride(11)
15993             .iterations(1)
15994             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
15995         }
15996       }
15997     }
15998   }
15999 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,qmin)16000   TEST(F32_GEMM_MINMAX_6X8S4__NEON, qmin) {
16001     TEST_REQUIRES_ARM_NEON;
16002     GemmMicrokernelTester()
16003       .mr(6)
16004       .nr(8)
16005       .kr(1)
16006       .sr(4)
16007       .m(6)
16008       .n(8)
16009       .k(4)
16010       .qmin(128)
16011       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
16012   }
16013 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,qmax)16014   TEST(F32_GEMM_MINMAX_6X8S4__NEON, qmax) {
16015     TEST_REQUIRES_ARM_NEON;
16016     GemmMicrokernelTester()
16017       .mr(6)
16018       .nr(8)
16019       .kr(1)
16020       .sr(4)
16021       .m(6)
16022       .n(8)
16023       .k(4)
16024       .qmax(128)
16025       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
16026   }
16027 
TEST(F32_GEMM_MINMAX_6X8S4__NEON,strided_cm)16028   TEST(F32_GEMM_MINMAX_6X8S4__NEON, strided_cm) {
16029     TEST_REQUIRES_ARM_NEON;
16030     GemmMicrokernelTester()
16031       .mr(6)
16032       .nr(8)
16033       .kr(1)
16034       .sr(4)
16035       .m(6)
16036       .n(8)
16037       .k(4)
16038       .cm_stride(11)
16039       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__neon, xnn_init_f32_minmax_scalar_params);
16040   }
16041 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
16042 
16043 
16044 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_eq_4)16045   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_eq_4) {
16046     TEST_REQUIRES_ARM_NEON;
16047     GemmMicrokernelTester()
16048       .mr(8)
16049       .nr(8)
16050       .kr(1)
16051       .sr(4)
16052       .m(8)
16053       .n(8)
16054       .k(4)
16055       .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16056   }
16057 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,strided_cn)16058   TEST(F32_GEMM_MINMAX_8X8S4__NEON, strided_cn) {
16059     TEST_REQUIRES_ARM_NEON;
16060     GemmMicrokernelTester()
16061       .mr(8)
16062       .nr(8)
16063       .kr(1)
16064       .sr(4)
16065       .m(8)
16066       .n(8)
16067       .k(4)
16068       .cn_stride(11)
16069       .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16070   }
16071 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_eq_4_strided_a)16072   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_eq_4_strided_a) {
16073     TEST_REQUIRES_ARM_NEON;
16074     GemmMicrokernelTester()
16075       .mr(8)
16076       .nr(8)
16077       .kr(1)
16078       .sr(4)
16079       .m(8)
16080       .n(8)
16081       .k(4)
16082       .a_stride(7)
16083       .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16084   }
16085 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_eq_4_subtile)16086   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_eq_4_subtile) {
16087     TEST_REQUIRES_ARM_NEON;
16088     for (uint32_t n = 1; n <= 8; n++) {
16089       for (uint32_t m = 1; m <= 8; m++) {
16090         GemmMicrokernelTester()
16091           .mr(8)
16092           .nr(8)
16093           .kr(1)
16094           .sr(4)
16095           .m(m)
16096           .n(n)
16097           .k(4)
16098           .iterations(1)
16099           .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16100       }
16101     }
16102   }
16103 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_eq_4_subtile_m)16104   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_eq_4_subtile_m) {
16105     TEST_REQUIRES_ARM_NEON;
16106     for (uint32_t m = 1; m <= 8; m++) {
16107       GemmMicrokernelTester()
16108         .mr(8)
16109         .nr(8)
16110         .kr(1)
16111         .sr(4)
16112         .m(m)
16113         .n(8)
16114         .k(4)
16115         .iterations(1)
16116         .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16117     }
16118   }
16119 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_eq_4_subtile_n)16120   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_eq_4_subtile_n) {
16121     TEST_REQUIRES_ARM_NEON;
16122     for (uint32_t n = 1; n <= 8; n++) {
16123       GemmMicrokernelTester()
16124         .mr(8)
16125         .nr(8)
16126         .kr(1)
16127         .sr(4)
16128         .m(8)
16129         .n(n)
16130         .k(4)
16131         .iterations(1)
16132         .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16133     }
16134   }
16135 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_lt_4)16136   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_lt_4) {
16137     TEST_REQUIRES_ARM_NEON;
16138     for (size_t k = 1; k < 4; k++) {
16139       GemmMicrokernelTester()
16140         .mr(8)
16141         .nr(8)
16142         .kr(1)
16143         .sr(4)
16144         .m(8)
16145         .n(8)
16146         .k(k)
16147         .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16148     }
16149   }
16150 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_lt_4_strided_a)16151   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_lt_4_strided_a) {
16152     TEST_REQUIRES_ARM_NEON;
16153     for (size_t k = 1; k < 4; k++) {
16154       GemmMicrokernelTester()
16155         .mr(8)
16156         .nr(8)
16157         .kr(1)
16158         .sr(4)
16159         .m(8)
16160         .n(8)
16161         .k(k)
16162         .a_stride(7)
16163         .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16164     }
16165   }
16166 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_lt_4_subtile)16167   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_lt_4_subtile) {
16168     TEST_REQUIRES_ARM_NEON;
16169     for (size_t k = 1; k < 4; k++) {
16170       for (uint32_t n = 1; n <= 8; n++) {
16171         for (uint32_t m = 1; m <= 8; m++) {
16172           GemmMicrokernelTester()
16173             .mr(8)
16174             .nr(8)
16175             .kr(1)
16176             .sr(4)
16177             .m(m)
16178             .n(n)
16179             .k(k)
16180             .iterations(1)
16181             .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16182         }
16183       }
16184     }
16185   }
16186 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_gt_4)16187   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_gt_4) {
16188     TEST_REQUIRES_ARM_NEON;
16189     for (size_t k = 5; k < 8; k++) {
16190       GemmMicrokernelTester()
16191         .mr(8)
16192         .nr(8)
16193         .kr(1)
16194         .sr(4)
16195         .m(8)
16196         .n(8)
16197         .k(k)
16198         .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16199     }
16200   }
16201 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_gt_4_strided_a)16202   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_gt_4_strided_a) {
16203     TEST_REQUIRES_ARM_NEON;
16204     for (size_t k = 5; k < 8; k++) {
16205       GemmMicrokernelTester()
16206         .mr(8)
16207         .nr(8)
16208         .kr(1)
16209         .sr(4)
16210         .m(8)
16211         .n(8)
16212         .k(k)
16213         .a_stride(11)
16214         .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16215     }
16216   }
16217 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_gt_4_subtile)16218   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_gt_4_subtile) {
16219     TEST_REQUIRES_ARM_NEON;
16220     for (size_t k = 5; k < 8; k++) {
16221       for (uint32_t n = 1; n <= 8; n++) {
16222         for (uint32_t m = 1; m <= 8; m++) {
16223           GemmMicrokernelTester()
16224             .mr(8)
16225             .nr(8)
16226             .kr(1)
16227             .sr(4)
16228             .m(m)
16229             .n(n)
16230             .k(k)
16231             .iterations(1)
16232             .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16233         }
16234       }
16235     }
16236   }
16237 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_div_4)16238   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_div_4) {
16239     TEST_REQUIRES_ARM_NEON;
16240     for (size_t k = 8; k <= 40; k += 4) {
16241       GemmMicrokernelTester()
16242         .mr(8)
16243         .nr(8)
16244         .kr(1)
16245         .sr(4)
16246         .m(8)
16247         .n(8)
16248         .k(k)
16249         .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16250     }
16251   }
16252 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_div_4_strided_a)16253   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_div_4_strided_a) {
16254     TEST_REQUIRES_ARM_NEON;
16255     for (size_t k = 8; k <= 40; k += 4) {
16256       GemmMicrokernelTester()
16257         .mr(8)
16258         .nr(8)
16259         .kr(1)
16260         .sr(4)
16261         .m(8)
16262         .n(8)
16263         .k(k)
16264         .a_stride(43)
16265         .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16266     }
16267   }
16268 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,k_div_4_subtile)16269   TEST(F32_GEMM_MINMAX_8X8S4__NEON, k_div_4_subtile) {
16270     TEST_REQUIRES_ARM_NEON;
16271     for (size_t k = 8; k <= 40; k += 4) {
16272       for (uint32_t n = 1; n <= 8; n++) {
16273         for (uint32_t m = 1; m <= 8; m++) {
16274           GemmMicrokernelTester()
16275             .mr(8)
16276             .nr(8)
16277             .kr(1)
16278             .sr(4)
16279             .m(m)
16280             .n(n)
16281             .k(k)
16282             .iterations(1)
16283             .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16284         }
16285       }
16286     }
16287   }
16288 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,n_gt_8)16289   TEST(F32_GEMM_MINMAX_8X8S4__NEON, n_gt_8) {
16290     TEST_REQUIRES_ARM_NEON;
16291     for (uint32_t n = 9; n < 16; n++) {
16292       for (size_t k = 1; k <= 20; k += 5) {
16293         GemmMicrokernelTester()
16294           .mr(8)
16295           .nr(8)
16296           .kr(1)
16297           .sr(4)
16298           .m(8)
16299           .n(n)
16300           .k(k)
16301           .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16302       }
16303     }
16304   }
16305 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,n_gt_8_strided_cn)16306   TEST(F32_GEMM_MINMAX_8X8S4__NEON, n_gt_8_strided_cn) {
16307     TEST_REQUIRES_ARM_NEON;
16308     for (uint32_t n = 9; n < 16; n++) {
16309       for (size_t k = 1; k <= 20; k += 5) {
16310         GemmMicrokernelTester()
16311           .mr(8)
16312           .nr(8)
16313           .kr(1)
16314           .sr(4)
16315           .m(8)
16316           .n(n)
16317           .k(k)
16318           .cn_stride(11)
16319           .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16320       }
16321     }
16322   }
16323 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,n_gt_8_strided_a)16324   TEST(F32_GEMM_MINMAX_8X8S4__NEON, n_gt_8_strided_a) {
16325     TEST_REQUIRES_ARM_NEON;
16326     for (uint32_t n = 9; n < 16; n++) {
16327       for (size_t k = 1; k <= 20; k += 5) {
16328         GemmMicrokernelTester()
16329           .mr(8)
16330           .nr(8)
16331           .kr(1)
16332           .sr(4)
16333           .m(8)
16334           .n(n)
16335           .k(k)
16336           .a_stride(23)
16337           .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16338       }
16339     }
16340   }
16341 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,n_gt_8_subtile)16342   TEST(F32_GEMM_MINMAX_8X8S4__NEON, n_gt_8_subtile) {
16343     TEST_REQUIRES_ARM_NEON;
16344     for (uint32_t n = 9; n < 16; n++) {
16345       for (size_t k = 1; k <= 20; k += 5) {
16346         for (uint32_t m = 1; m <= 8; m++) {
16347           GemmMicrokernelTester()
16348             .mr(8)
16349             .nr(8)
16350             .kr(1)
16351             .sr(4)
16352             .m(m)
16353             .n(n)
16354             .k(k)
16355             .iterations(1)
16356             .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16357         }
16358       }
16359     }
16360   }
16361 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,n_div_8)16362   TEST(F32_GEMM_MINMAX_8X8S4__NEON, n_div_8) {
16363     TEST_REQUIRES_ARM_NEON;
16364     for (uint32_t n = 16; n <= 24; n += 8) {
16365       for (size_t k = 1; k <= 20; k += 5) {
16366         GemmMicrokernelTester()
16367           .mr(8)
16368           .nr(8)
16369           .kr(1)
16370           .sr(4)
16371           .m(8)
16372           .n(n)
16373           .k(k)
16374           .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16375       }
16376     }
16377   }
16378 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,n_div_8_strided_cn)16379   TEST(F32_GEMM_MINMAX_8X8S4__NEON, n_div_8_strided_cn) {
16380     TEST_REQUIRES_ARM_NEON;
16381     for (uint32_t n = 16; n <= 24; n += 8) {
16382       for (size_t k = 1; k <= 20; k += 5) {
16383         GemmMicrokernelTester()
16384           .mr(8)
16385           .nr(8)
16386           .kr(1)
16387           .sr(4)
16388           .m(8)
16389           .n(n)
16390           .k(k)
16391           .cn_stride(11)
16392           .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16393       }
16394     }
16395   }
16396 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,n_div_8_strided_a)16397   TEST(F32_GEMM_MINMAX_8X8S4__NEON, n_div_8_strided_a) {
16398     TEST_REQUIRES_ARM_NEON;
16399     for (uint32_t n = 16; n <= 24; n += 8) {
16400       for (size_t k = 1; k <= 20; k += 5) {
16401         GemmMicrokernelTester()
16402           .mr(8)
16403           .nr(8)
16404           .kr(1)
16405           .sr(4)
16406           .m(8)
16407           .n(n)
16408           .k(k)
16409           .a_stride(23)
16410           .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16411       }
16412     }
16413   }
16414 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,n_div_8_subtile)16415   TEST(F32_GEMM_MINMAX_8X8S4__NEON, n_div_8_subtile) {
16416     TEST_REQUIRES_ARM_NEON;
16417     for (uint32_t n = 16; n <= 24; n += 8) {
16418       for (size_t k = 1; k <= 20; k += 5) {
16419         for (uint32_t m = 1; m <= 8; m++) {
16420           GemmMicrokernelTester()
16421             .mr(8)
16422             .nr(8)
16423             .kr(1)
16424             .sr(4)
16425             .m(m)
16426             .n(n)
16427             .k(k)
16428             .iterations(1)
16429             .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16430         }
16431       }
16432     }
16433   }
16434 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,strided_cm_subtile)16435   TEST(F32_GEMM_MINMAX_8X8S4__NEON, strided_cm_subtile) {
16436     TEST_REQUIRES_ARM_NEON;
16437     for (size_t k = 1; k <= 20; k += 5) {
16438       for (uint32_t n = 1; n <= 8; n++) {
16439         for (uint32_t m = 1; m <= 8; m++) {
16440           GemmMicrokernelTester()
16441             .mr(8)
16442             .nr(8)
16443             .kr(1)
16444             .sr(4)
16445             .m(m)
16446             .n(n)
16447             .k(k)
16448             .cm_stride(11)
16449             .iterations(1)
16450             .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16451         }
16452       }
16453     }
16454   }
16455 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,qmin)16456   TEST(F32_GEMM_MINMAX_8X8S4__NEON, qmin) {
16457     TEST_REQUIRES_ARM_NEON;
16458     GemmMicrokernelTester()
16459       .mr(8)
16460       .nr(8)
16461       .kr(1)
16462       .sr(4)
16463       .m(8)
16464       .n(8)
16465       .k(4)
16466       .qmin(128)
16467       .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16468   }
16469 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,qmax)16470   TEST(F32_GEMM_MINMAX_8X8S4__NEON, qmax) {
16471     TEST_REQUIRES_ARM_NEON;
16472     GemmMicrokernelTester()
16473       .mr(8)
16474       .nr(8)
16475       .kr(1)
16476       .sr(4)
16477       .m(8)
16478       .n(8)
16479       .k(4)
16480       .qmax(128)
16481       .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16482   }
16483 
TEST(F32_GEMM_MINMAX_8X8S4__NEON,strided_cm)16484   TEST(F32_GEMM_MINMAX_8X8S4__NEON, strided_cm) {
16485     TEST_REQUIRES_ARM_NEON;
16486     GemmMicrokernelTester()
16487       .mr(8)
16488       .nr(8)
16489       .kr(1)
16490       .sr(4)
16491       .m(8)
16492       .n(8)
16493       .k(4)
16494       .cm_stride(11)
16495       .Test(xnn_f32_gemm_minmax_ukernel_8x8s4__neon, xnn_init_f32_minmax_scalar_params);
16496   }
16497 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
16498 
16499 
16500 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_eq_4)16501   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_eq_4) {
16502     TEST_REQUIRES_X86_SSE;
16503     GemmMicrokernelTester()
16504       .mr(1)
16505       .nr(8)
16506       .kr(1)
16507       .sr(1)
16508       .m(1)
16509       .n(8)
16510       .k(4)
16511       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16512   }
16513 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,strided_cn)16514   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, strided_cn) {
16515     TEST_REQUIRES_X86_SSE;
16516     GemmMicrokernelTester()
16517       .mr(1)
16518       .nr(8)
16519       .kr(1)
16520       .sr(1)
16521       .m(1)
16522       .n(8)
16523       .k(4)
16524       .cn_stride(11)
16525       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16526   }
16527 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_eq_4_strided_a)16528   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_eq_4_strided_a) {
16529     TEST_REQUIRES_X86_SSE;
16530     GemmMicrokernelTester()
16531       .mr(1)
16532       .nr(8)
16533       .kr(1)
16534       .sr(1)
16535       .m(1)
16536       .n(8)
16537       .k(4)
16538       .a_stride(7)
16539       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16540   }
16541 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_eq_4_subtile)16542   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_eq_4_subtile) {
16543     TEST_REQUIRES_X86_SSE;
16544     for (uint32_t n = 1; n <= 8; n++) {
16545       for (uint32_t m = 1; m <= 1; m++) {
16546         GemmMicrokernelTester()
16547           .mr(1)
16548           .nr(8)
16549           .kr(1)
16550           .sr(1)
16551           .m(m)
16552           .n(n)
16553           .k(4)
16554           .iterations(1)
16555           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16556       }
16557     }
16558   }
16559 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_eq_4_subtile_m)16560   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_eq_4_subtile_m) {
16561     TEST_REQUIRES_X86_SSE;
16562     for (uint32_t m = 1; m <= 1; m++) {
16563       GemmMicrokernelTester()
16564         .mr(1)
16565         .nr(8)
16566         .kr(1)
16567         .sr(1)
16568         .m(m)
16569         .n(8)
16570         .k(4)
16571         .iterations(1)
16572         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16573     }
16574   }
16575 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_eq_4_subtile_n)16576   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_eq_4_subtile_n) {
16577     TEST_REQUIRES_X86_SSE;
16578     for (uint32_t n = 1; n <= 8; n++) {
16579       GemmMicrokernelTester()
16580         .mr(1)
16581         .nr(8)
16582         .kr(1)
16583         .sr(1)
16584         .m(1)
16585         .n(n)
16586         .k(4)
16587         .iterations(1)
16588         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16589     }
16590   }
16591 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_lt_4)16592   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_lt_4) {
16593     TEST_REQUIRES_X86_SSE;
16594     for (size_t k = 1; k < 4; k++) {
16595       GemmMicrokernelTester()
16596         .mr(1)
16597         .nr(8)
16598         .kr(1)
16599         .sr(1)
16600         .m(1)
16601         .n(8)
16602         .k(k)
16603         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16604     }
16605   }
16606 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_lt_4_strided_a)16607   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_lt_4_strided_a) {
16608     TEST_REQUIRES_X86_SSE;
16609     for (size_t k = 1; k < 4; k++) {
16610       GemmMicrokernelTester()
16611         .mr(1)
16612         .nr(8)
16613         .kr(1)
16614         .sr(1)
16615         .m(1)
16616         .n(8)
16617         .k(k)
16618         .a_stride(7)
16619         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16620     }
16621   }
16622 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_lt_4_subtile)16623   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_lt_4_subtile) {
16624     TEST_REQUIRES_X86_SSE;
16625     for (size_t k = 1; k < 4; k++) {
16626       for (uint32_t n = 1; n <= 8; n++) {
16627         for (uint32_t m = 1; m <= 1; m++) {
16628           GemmMicrokernelTester()
16629             .mr(1)
16630             .nr(8)
16631             .kr(1)
16632             .sr(1)
16633             .m(m)
16634             .n(n)
16635             .k(k)
16636             .iterations(1)
16637             .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16638         }
16639       }
16640     }
16641   }
16642 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_gt_4)16643   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_gt_4) {
16644     TEST_REQUIRES_X86_SSE;
16645     for (size_t k = 5; k < 8; k++) {
16646       GemmMicrokernelTester()
16647         .mr(1)
16648         .nr(8)
16649         .kr(1)
16650         .sr(1)
16651         .m(1)
16652         .n(8)
16653         .k(k)
16654         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16655     }
16656   }
16657 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_gt_4_strided_a)16658   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_gt_4_strided_a) {
16659     TEST_REQUIRES_X86_SSE;
16660     for (size_t k = 5; k < 8; k++) {
16661       GemmMicrokernelTester()
16662         .mr(1)
16663         .nr(8)
16664         .kr(1)
16665         .sr(1)
16666         .m(1)
16667         .n(8)
16668         .k(k)
16669         .a_stride(11)
16670         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16671     }
16672   }
16673 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_gt_4_subtile)16674   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_gt_4_subtile) {
16675     TEST_REQUIRES_X86_SSE;
16676     for (size_t k = 5; k < 8; k++) {
16677       for (uint32_t n = 1; n <= 8; n++) {
16678         for (uint32_t m = 1; m <= 1; m++) {
16679           GemmMicrokernelTester()
16680             .mr(1)
16681             .nr(8)
16682             .kr(1)
16683             .sr(1)
16684             .m(m)
16685             .n(n)
16686             .k(k)
16687             .iterations(1)
16688             .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16689         }
16690       }
16691     }
16692   }
16693 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_div_4)16694   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_div_4) {
16695     TEST_REQUIRES_X86_SSE;
16696     for (size_t k = 8; k <= 40; k += 4) {
16697       GemmMicrokernelTester()
16698         .mr(1)
16699         .nr(8)
16700         .kr(1)
16701         .sr(1)
16702         .m(1)
16703         .n(8)
16704         .k(k)
16705         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16706     }
16707   }
16708 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_div_4_strided_a)16709   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_div_4_strided_a) {
16710     TEST_REQUIRES_X86_SSE;
16711     for (size_t k = 8; k <= 40; k += 4) {
16712       GemmMicrokernelTester()
16713         .mr(1)
16714         .nr(8)
16715         .kr(1)
16716         .sr(1)
16717         .m(1)
16718         .n(8)
16719         .k(k)
16720         .a_stride(43)
16721         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16722     }
16723   }
16724 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,k_div_4_subtile)16725   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, k_div_4_subtile) {
16726     TEST_REQUIRES_X86_SSE;
16727     for (size_t k = 8; k <= 40; k += 4) {
16728       for (uint32_t n = 1; n <= 8; n++) {
16729         for (uint32_t m = 1; m <= 1; m++) {
16730           GemmMicrokernelTester()
16731             .mr(1)
16732             .nr(8)
16733             .kr(1)
16734             .sr(1)
16735             .m(m)
16736             .n(n)
16737             .k(k)
16738             .iterations(1)
16739             .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16740         }
16741       }
16742     }
16743   }
16744 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,n_gt_8)16745   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, n_gt_8) {
16746     TEST_REQUIRES_X86_SSE;
16747     for (uint32_t n = 9; n < 16; n++) {
16748       for (size_t k = 1; k <= 20; k += 5) {
16749         GemmMicrokernelTester()
16750           .mr(1)
16751           .nr(8)
16752           .kr(1)
16753           .sr(1)
16754           .m(1)
16755           .n(n)
16756           .k(k)
16757           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16758       }
16759     }
16760   }
16761 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,n_gt_8_strided_cn)16762   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, n_gt_8_strided_cn) {
16763     TEST_REQUIRES_X86_SSE;
16764     for (uint32_t n = 9; n < 16; n++) {
16765       for (size_t k = 1; k <= 20; k += 5) {
16766         GemmMicrokernelTester()
16767           .mr(1)
16768           .nr(8)
16769           .kr(1)
16770           .sr(1)
16771           .m(1)
16772           .n(n)
16773           .k(k)
16774           .cn_stride(11)
16775           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16776       }
16777     }
16778   }
16779 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,n_gt_8_strided_a)16780   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, n_gt_8_strided_a) {
16781     TEST_REQUIRES_X86_SSE;
16782     for (uint32_t n = 9; n < 16; n++) {
16783       for (size_t k = 1; k <= 20; k += 5) {
16784         GemmMicrokernelTester()
16785           .mr(1)
16786           .nr(8)
16787           .kr(1)
16788           .sr(1)
16789           .m(1)
16790           .n(n)
16791           .k(k)
16792           .a_stride(23)
16793           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16794       }
16795     }
16796   }
16797 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,n_gt_8_subtile)16798   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, n_gt_8_subtile) {
16799     TEST_REQUIRES_X86_SSE;
16800     for (uint32_t n = 9; n < 16; n++) {
16801       for (size_t k = 1; k <= 20; k += 5) {
16802         for (uint32_t m = 1; m <= 1; m++) {
16803           GemmMicrokernelTester()
16804             .mr(1)
16805             .nr(8)
16806             .kr(1)
16807             .sr(1)
16808             .m(m)
16809             .n(n)
16810             .k(k)
16811             .iterations(1)
16812             .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16813         }
16814       }
16815     }
16816   }
16817 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,n_div_8)16818   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, n_div_8) {
16819     TEST_REQUIRES_X86_SSE;
16820     for (uint32_t n = 16; n <= 24; n += 8) {
16821       for (size_t k = 1; k <= 20; k += 5) {
16822         GemmMicrokernelTester()
16823           .mr(1)
16824           .nr(8)
16825           .kr(1)
16826           .sr(1)
16827           .m(1)
16828           .n(n)
16829           .k(k)
16830           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16831       }
16832     }
16833   }
16834 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,n_div_8_strided_cn)16835   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, n_div_8_strided_cn) {
16836     TEST_REQUIRES_X86_SSE;
16837     for (uint32_t n = 16; n <= 24; n += 8) {
16838       for (size_t k = 1; k <= 20; k += 5) {
16839         GemmMicrokernelTester()
16840           .mr(1)
16841           .nr(8)
16842           .kr(1)
16843           .sr(1)
16844           .m(1)
16845           .n(n)
16846           .k(k)
16847           .cn_stride(11)
16848           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16849       }
16850     }
16851   }
16852 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,n_div_8_strided_a)16853   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, n_div_8_strided_a) {
16854     TEST_REQUIRES_X86_SSE;
16855     for (uint32_t n = 16; n <= 24; n += 8) {
16856       for (size_t k = 1; k <= 20; k += 5) {
16857         GemmMicrokernelTester()
16858           .mr(1)
16859           .nr(8)
16860           .kr(1)
16861           .sr(1)
16862           .m(1)
16863           .n(n)
16864           .k(k)
16865           .a_stride(23)
16866           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16867       }
16868     }
16869   }
16870 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,n_div_8_subtile)16871   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, n_div_8_subtile) {
16872     TEST_REQUIRES_X86_SSE;
16873     for (uint32_t n = 16; n <= 24; n += 8) {
16874       for (size_t k = 1; k <= 20; k += 5) {
16875         for (uint32_t m = 1; m <= 1; m++) {
16876           GemmMicrokernelTester()
16877             .mr(1)
16878             .nr(8)
16879             .kr(1)
16880             .sr(1)
16881             .m(m)
16882             .n(n)
16883             .k(k)
16884             .iterations(1)
16885             .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16886         }
16887       }
16888     }
16889   }
16890 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,strided_cm_subtile)16891   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, strided_cm_subtile) {
16892     TEST_REQUIRES_X86_SSE;
16893     for (size_t k = 1; k <= 20; k += 5) {
16894       for (uint32_t n = 1; n <= 8; n++) {
16895         for (uint32_t m = 1; m <= 1; m++) {
16896           GemmMicrokernelTester()
16897             .mr(1)
16898             .nr(8)
16899             .kr(1)
16900             .sr(1)
16901             .m(m)
16902             .n(n)
16903             .k(k)
16904             .cm_stride(11)
16905             .iterations(1)
16906             .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16907         }
16908       }
16909     }
16910   }
16911 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,qmin)16912   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, qmin) {
16913     TEST_REQUIRES_X86_SSE;
16914     GemmMicrokernelTester()
16915       .mr(1)
16916       .nr(8)
16917       .kr(1)
16918       .sr(1)
16919       .m(1)
16920       .n(8)
16921       .k(4)
16922       .qmin(128)
16923       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16924   }
16925 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,qmax)16926   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, qmax) {
16927     TEST_REQUIRES_X86_SSE;
16928     GemmMicrokernelTester()
16929       .mr(1)
16930       .nr(8)
16931       .kr(1)
16932       .sr(1)
16933       .m(1)
16934       .n(8)
16935       .k(4)
16936       .qmax(128)
16937       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16938   }
16939 
TEST(F32_GEMM_MINMAX_1X8__SSE_DUP,strided_cm)16940   TEST(F32_GEMM_MINMAX_1X8__SSE_DUP, strided_cm) {
16941     TEST_REQUIRES_X86_SSE;
16942     GemmMicrokernelTester()
16943       .mr(1)
16944       .nr(8)
16945       .kr(1)
16946       .sr(1)
16947       .m(1)
16948       .n(8)
16949       .k(4)
16950       .cm_stride(11)
16951       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_dup, xnn_init_f32_minmax_sse_params);
16952   }
16953 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
16954 
16955 
16956 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,k_eq_1)16957   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, k_eq_1) {
16958     TEST_REQUIRES_X86_SSE;
16959     GemmMicrokernelTester()
16960       .mr(1)
16961       .nr(8)
16962       .kr(1)
16963       .sr(1)
16964       .m(1)
16965       .n(8)
16966       .k(1)
16967       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
16968   }
16969 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,strided_cn)16970   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, strided_cn) {
16971     TEST_REQUIRES_X86_SSE;
16972     GemmMicrokernelTester()
16973       .mr(1)
16974       .nr(8)
16975       .kr(1)
16976       .sr(1)
16977       .m(1)
16978       .n(8)
16979       .k(1)
16980       .cn_stride(11)
16981       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
16982   }
16983 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,k_eq_1_strided_a)16984   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, k_eq_1_strided_a) {
16985     TEST_REQUIRES_X86_SSE;
16986     GemmMicrokernelTester()
16987       .mr(1)
16988       .nr(8)
16989       .kr(1)
16990       .sr(1)
16991       .m(1)
16992       .n(8)
16993       .k(1)
16994       .a_stride(3)
16995       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
16996   }
16997 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,k_eq_1_subtile)16998   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, k_eq_1_subtile) {
16999     TEST_REQUIRES_X86_SSE;
17000     for (uint32_t n = 1; n <= 8; n++) {
17001       for (uint32_t m = 1; m <= 1; m++) {
17002         GemmMicrokernelTester()
17003           .mr(1)
17004           .nr(8)
17005           .kr(1)
17006           .sr(1)
17007           .m(m)
17008           .n(n)
17009           .k(1)
17010           .iterations(1)
17011           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17012       }
17013     }
17014   }
17015 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,k_eq_1_subtile_m)17016   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, k_eq_1_subtile_m) {
17017     TEST_REQUIRES_X86_SSE;
17018     for (uint32_t m = 1; m <= 1; m++) {
17019       GemmMicrokernelTester()
17020         .mr(1)
17021         .nr(8)
17022         .kr(1)
17023         .sr(1)
17024         .m(m)
17025         .n(8)
17026         .k(1)
17027         .iterations(1)
17028         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17029     }
17030   }
17031 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,k_eq_1_subtile_n)17032   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, k_eq_1_subtile_n) {
17033     TEST_REQUIRES_X86_SSE;
17034     for (uint32_t n = 1; n <= 8; n++) {
17035       GemmMicrokernelTester()
17036         .mr(1)
17037         .nr(8)
17038         .kr(1)
17039         .sr(1)
17040         .m(1)
17041         .n(n)
17042         .k(1)
17043         .iterations(1)
17044         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17045     }
17046   }
17047 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,k_gt_1)17048   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, k_gt_1) {
17049     TEST_REQUIRES_X86_SSE;
17050     for (size_t k = 2; k < 10; k++) {
17051       GemmMicrokernelTester()
17052         .mr(1)
17053         .nr(8)
17054         .kr(1)
17055         .sr(1)
17056         .m(1)
17057         .n(8)
17058         .k(k)
17059         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17060     }
17061   }
17062 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,k_gt_1_strided_a)17063   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, k_gt_1_strided_a) {
17064     TEST_REQUIRES_X86_SSE;
17065     for (size_t k = 2; k < 10; k++) {
17066       GemmMicrokernelTester()
17067         .mr(1)
17068         .nr(8)
17069         .kr(1)
17070         .sr(1)
17071         .m(1)
17072         .n(8)
17073         .k(k)
17074         .a_stride(11)
17075         .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17076     }
17077   }
17078 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,k_gt_1_subtile)17079   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, k_gt_1_subtile) {
17080     TEST_REQUIRES_X86_SSE;
17081     for (size_t k = 2; k < 10; k++) {
17082       for (uint32_t n = 1; n <= 8; n++) {
17083         for (uint32_t m = 1; m <= 1; m++) {
17084           GemmMicrokernelTester()
17085             .mr(1)
17086             .nr(8)
17087             .kr(1)
17088             .sr(1)
17089             .m(m)
17090             .n(n)
17091             .k(k)
17092             .iterations(1)
17093             .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17094         }
17095       }
17096     }
17097   }
17098 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,n_gt_8)17099   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, n_gt_8) {
17100     TEST_REQUIRES_X86_SSE;
17101     for (uint32_t n = 9; n < 16; n++) {
17102       for (size_t k = 1; k <= 5; k += 2) {
17103         GemmMicrokernelTester()
17104           .mr(1)
17105           .nr(8)
17106           .kr(1)
17107           .sr(1)
17108           .m(1)
17109           .n(n)
17110           .k(k)
17111           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17112       }
17113     }
17114   }
17115 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,n_gt_8_strided_cn)17116   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, n_gt_8_strided_cn) {
17117     TEST_REQUIRES_X86_SSE;
17118     for (uint32_t n = 9; n < 16; n++) {
17119       for (size_t k = 1; k <= 5; k += 2) {
17120         GemmMicrokernelTester()
17121           .mr(1)
17122           .nr(8)
17123           .kr(1)
17124           .sr(1)
17125           .m(1)
17126           .n(n)
17127           .k(k)
17128           .cn_stride(11)
17129           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17130       }
17131     }
17132   }
17133 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,n_gt_8_strided_a)17134   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, n_gt_8_strided_a) {
17135     TEST_REQUIRES_X86_SSE;
17136     for (uint32_t n = 9; n < 16; n++) {
17137       for (size_t k = 1; k <= 5; k += 2) {
17138         GemmMicrokernelTester()
17139           .mr(1)
17140           .nr(8)
17141           .kr(1)
17142           .sr(1)
17143           .m(1)
17144           .n(n)
17145           .k(k)
17146           .a_stride(7)
17147           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17148       }
17149     }
17150   }
17151 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,n_gt_8_subtile)17152   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, n_gt_8_subtile) {
17153     TEST_REQUIRES_X86_SSE;
17154     for (uint32_t n = 9; n < 16; n++) {
17155       for (size_t k = 1; k <= 5; k += 2) {
17156         for (uint32_t m = 1; m <= 1; m++) {
17157           GemmMicrokernelTester()
17158             .mr(1)
17159             .nr(8)
17160             .kr(1)
17161             .sr(1)
17162             .m(m)
17163             .n(n)
17164             .k(k)
17165             .iterations(1)
17166             .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17167         }
17168       }
17169     }
17170   }
17171 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,n_div_8)17172   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, n_div_8) {
17173     TEST_REQUIRES_X86_SSE;
17174     for (uint32_t n = 16; n <= 24; n += 8) {
17175       for (size_t k = 1; k <= 5; k += 2) {
17176         GemmMicrokernelTester()
17177           .mr(1)
17178           .nr(8)
17179           .kr(1)
17180           .sr(1)
17181           .m(1)
17182           .n(n)
17183           .k(k)
17184           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17185       }
17186     }
17187   }
17188 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,n_div_8_strided_cn)17189   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, n_div_8_strided_cn) {
17190     TEST_REQUIRES_X86_SSE;
17191     for (uint32_t n = 16; n <= 24; n += 8) {
17192       for (size_t k = 1; k <= 5; k += 2) {
17193         GemmMicrokernelTester()
17194           .mr(1)
17195           .nr(8)
17196           .kr(1)
17197           .sr(1)
17198           .m(1)
17199           .n(n)
17200           .k(k)
17201           .cn_stride(11)
17202           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17203       }
17204     }
17205   }
17206 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,n_div_8_strided_a)17207   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, n_div_8_strided_a) {
17208     TEST_REQUIRES_X86_SSE;
17209     for (uint32_t n = 16; n <= 24; n += 8) {
17210       for (size_t k = 1; k <= 5; k += 2) {
17211         GemmMicrokernelTester()
17212           .mr(1)
17213           .nr(8)
17214           .kr(1)
17215           .sr(1)
17216           .m(1)
17217           .n(n)
17218           .k(k)
17219           .a_stride(7)
17220           .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17221       }
17222     }
17223   }
17224 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,n_div_8_subtile)17225   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, n_div_8_subtile) {
17226     TEST_REQUIRES_X86_SSE;
17227     for (uint32_t n = 16; n <= 24; n += 8) {
17228       for (size_t k = 1; k <= 5; k += 2) {
17229         for (uint32_t m = 1; m <= 1; m++) {
17230           GemmMicrokernelTester()
17231             .mr(1)
17232             .nr(8)
17233             .kr(1)
17234             .sr(1)
17235             .m(m)
17236             .n(n)
17237             .k(k)
17238             .iterations(1)
17239             .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17240         }
17241       }
17242     }
17243   }
17244 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,strided_cm_subtile)17245   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, strided_cm_subtile) {
17246     TEST_REQUIRES_X86_SSE;
17247     for (size_t k = 1; k <= 5; k += 2) {
17248       for (uint32_t n = 1; n <= 8; n++) {
17249         for (uint32_t m = 1; m <= 1; m++) {
17250           GemmMicrokernelTester()
17251             .mr(1)
17252             .nr(8)
17253             .kr(1)
17254             .sr(1)
17255             .m(m)
17256             .n(n)
17257             .k(k)
17258             .cm_stride(11)
17259             .iterations(1)
17260             .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17261         }
17262       }
17263     }
17264   }
17265 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,qmin)17266   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, qmin) {
17267     TEST_REQUIRES_X86_SSE;
17268     GemmMicrokernelTester()
17269       .mr(1)
17270       .nr(8)
17271       .kr(1)
17272       .sr(1)
17273       .m(1)
17274       .n(8)
17275       .k(1)
17276       .qmin(128)
17277       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17278   }
17279 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,qmax)17280   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, qmax) {
17281     TEST_REQUIRES_X86_SSE;
17282     GemmMicrokernelTester()
17283       .mr(1)
17284       .nr(8)
17285       .kr(1)
17286       .sr(1)
17287       .m(1)
17288       .n(8)
17289       .k(1)
17290       .qmax(128)
17291       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17292   }
17293 
TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1,strided_cm)17294   TEST(F32_GEMM_MINMAX_1X8__SSE_LOAD1, strided_cm) {
17295     TEST_REQUIRES_X86_SSE;
17296     GemmMicrokernelTester()
17297       .mr(1)
17298       .nr(8)
17299       .kr(1)
17300       .sr(1)
17301       .m(1)
17302       .n(8)
17303       .k(1)
17304       .cm_stride(11)
17305       .Test(xnn_f32_gemm_minmax_ukernel_1x8__sse_load1, xnn_init_f32_minmax_sse_params);
17306   }
17307 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
17308 
17309 
17310 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_eq_4)17311   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_eq_4) {
17312     TEST_REQUIRES_X86_SSE;
17313     GemmMicrokernelTester()
17314       .mr(1)
17315       .nr(8)
17316       .kr(1)
17317       .sr(4)
17318       .m(1)
17319       .n(8)
17320       .k(4)
17321       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17322   }
17323 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,strided_cn)17324   TEST(F32_GEMM_MINMAX_1X8S4__SSE, strided_cn) {
17325     TEST_REQUIRES_X86_SSE;
17326     GemmMicrokernelTester()
17327       .mr(1)
17328       .nr(8)
17329       .kr(1)
17330       .sr(4)
17331       .m(1)
17332       .n(8)
17333       .k(4)
17334       .cn_stride(11)
17335       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17336   }
17337 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_eq_4_strided_a)17338   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_eq_4_strided_a) {
17339     TEST_REQUIRES_X86_SSE;
17340     GemmMicrokernelTester()
17341       .mr(1)
17342       .nr(8)
17343       .kr(1)
17344       .sr(4)
17345       .m(1)
17346       .n(8)
17347       .k(4)
17348       .a_stride(7)
17349       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17350   }
17351 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_eq_4_subtile)17352   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_eq_4_subtile) {
17353     TEST_REQUIRES_X86_SSE;
17354     for (uint32_t n = 1; n <= 8; n++) {
17355       for (uint32_t m = 1; m <= 1; m++) {
17356         GemmMicrokernelTester()
17357           .mr(1)
17358           .nr(8)
17359           .kr(1)
17360           .sr(4)
17361           .m(m)
17362           .n(n)
17363           .k(4)
17364           .iterations(1)
17365           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17366       }
17367     }
17368   }
17369 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_eq_4_subtile_m)17370   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_eq_4_subtile_m) {
17371     TEST_REQUIRES_X86_SSE;
17372     for (uint32_t m = 1; m <= 1; m++) {
17373       GemmMicrokernelTester()
17374         .mr(1)
17375         .nr(8)
17376         .kr(1)
17377         .sr(4)
17378         .m(m)
17379         .n(8)
17380         .k(4)
17381         .iterations(1)
17382         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17383     }
17384   }
17385 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_eq_4_subtile_n)17386   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_eq_4_subtile_n) {
17387     TEST_REQUIRES_X86_SSE;
17388     for (uint32_t n = 1; n <= 8; n++) {
17389       GemmMicrokernelTester()
17390         .mr(1)
17391         .nr(8)
17392         .kr(1)
17393         .sr(4)
17394         .m(1)
17395         .n(n)
17396         .k(4)
17397         .iterations(1)
17398         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17399     }
17400   }
17401 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_lt_4)17402   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_lt_4) {
17403     TEST_REQUIRES_X86_SSE;
17404     for (size_t k = 1; k < 4; k++) {
17405       GemmMicrokernelTester()
17406         .mr(1)
17407         .nr(8)
17408         .kr(1)
17409         .sr(4)
17410         .m(1)
17411         .n(8)
17412         .k(k)
17413         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17414     }
17415   }
17416 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_lt_4_strided_a)17417   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_lt_4_strided_a) {
17418     TEST_REQUIRES_X86_SSE;
17419     for (size_t k = 1; k < 4; k++) {
17420       GemmMicrokernelTester()
17421         .mr(1)
17422         .nr(8)
17423         .kr(1)
17424         .sr(4)
17425         .m(1)
17426         .n(8)
17427         .k(k)
17428         .a_stride(7)
17429         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17430     }
17431   }
17432 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_lt_4_subtile)17433   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_lt_4_subtile) {
17434     TEST_REQUIRES_X86_SSE;
17435     for (size_t k = 1; k < 4; k++) {
17436       for (uint32_t n = 1; n <= 8; n++) {
17437         for (uint32_t m = 1; m <= 1; m++) {
17438           GemmMicrokernelTester()
17439             .mr(1)
17440             .nr(8)
17441             .kr(1)
17442             .sr(4)
17443             .m(m)
17444             .n(n)
17445             .k(k)
17446             .iterations(1)
17447             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17448         }
17449       }
17450     }
17451   }
17452 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_gt_4)17453   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_gt_4) {
17454     TEST_REQUIRES_X86_SSE;
17455     for (size_t k = 5; k < 8; k++) {
17456       GemmMicrokernelTester()
17457         .mr(1)
17458         .nr(8)
17459         .kr(1)
17460         .sr(4)
17461         .m(1)
17462         .n(8)
17463         .k(k)
17464         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17465     }
17466   }
17467 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_gt_4_strided_a)17468   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_gt_4_strided_a) {
17469     TEST_REQUIRES_X86_SSE;
17470     for (size_t k = 5; k < 8; k++) {
17471       GemmMicrokernelTester()
17472         .mr(1)
17473         .nr(8)
17474         .kr(1)
17475         .sr(4)
17476         .m(1)
17477         .n(8)
17478         .k(k)
17479         .a_stride(11)
17480         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17481     }
17482   }
17483 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_gt_4_subtile)17484   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_gt_4_subtile) {
17485     TEST_REQUIRES_X86_SSE;
17486     for (size_t k = 5; k < 8; k++) {
17487       for (uint32_t n = 1; n <= 8; n++) {
17488         for (uint32_t m = 1; m <= 1; m++) {
17489           GemmMicrokernelTester()
17490             .mr(1)
17491             .nr(8)
17492             .kr(1)
17493             .sr(4)
17494             .m(m)
17495             .n(n)
17496             .k(k)
17497             .iterations(1)
17498             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17499         }
17500       }
17501     }
17502   }
17503 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_div_4)17504   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_div_4) {
17505     TEST_REQUIRES_X86_SSE;
17506     for (size_t k = 8; k <= 40; k += 4) {
17507       GemmMicrokernelTester()
17508         .mr(1)
17509         .nr(8)
17510         .kr(1)
17511         .sr(4)
17512         .m(1)
17513         .n(8)
17514         .k(k)
17515         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17516     }
17517   }
17518 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_div_4_strided_a)17519   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_div_4_strided_a) {
17520     TEST_REQUIRES_X86_SSE;
17521     for (size_t k = 8; k <= 40; k += 4) {
17522       GemmMicrokernelTester()
17523         .mr(1)
17524         .nr(8)
17525         .kr(1)
17526         .sr(4)
17527         .m(1)
17528         .n(8)
17529         .k(k)
17530         .a_stride(43)
17531         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17532     }
17533   }
17534 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,k_div_4_subtile)17535   TEST(F32_GEMM_MINMAX_1X8S4__SSE, k_div_4_subtile) {
17536     TEST_REQUIRES_X86_SSE;
17537     for (size_t k = 8; k <= 40; k += 4) {
17538       for (uint32_t n = 1; n <= 8; n++) {
17539         for (uint32_t m = 1; m <= 1; m++) {
17540           GemmMicrokernelTester()
17541             .mr(1)
17542             .nr(8)
17543             .kr(1)
17544             .sr(4)
17545             .m(m)
17546             .n(n)
17547             .k(k)
17548             .iterations(1)
17549             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17550         }
17551       }
17552     }
17553   }
17554 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,n_gt_8)17555   TEST(F32_GEMM_MINMAX_1X8S4__SSE, n_gt_8) {
17556     TEST_REQUIRES_X86_SSE;
17557     for (uint32_t n = 9; n < 16; n++) {
17558       for (size_t k = 1; k <= 20; k += 5) {
17559         GemmMicrokernelTester()
17560           .mr(1)
17561           .nr(8)
17562           .kr(1)
17563           .sr(4)
17564           .m(1)
17565           .n(n)
17566           .k(k)
17567           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17568       }
17569     }
17570   }
17571 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,n_gt_8_strided_cn)17572   TEST(F32_GEMM_MINMAX_1X8S4__SSE, n_gt_8_strided_cn) {
17573     TEST_REQUIRES_X86_SSE;
17574     for (uint32_t n = 9; n < 16; n++) {
17575       for (size_t k = 1; k <= 20; k += 5) {
17576         GemmMicrokernelTester()
17577           .mr(1)
17578           .nr(8)
17579           .kr(1)
17580           .sr(4)
17581           .m(1)
17582           .n(n)
17583           .k(k)
17584           .cn_stride(11)
17585           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17586       }
17587     }
17588   }
17589 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,n_gt_8_strided_a)17590   TEST(F32_GEMM_MINMAX_1X8S4__SSE, n_gt_8_strided_a) {
17591     TEST_REQUIRES_X86_SSE;
17592     for (uint32_t n = 9; n < 16; n++) {
17593       for (size_t k = 1; k <= 20; k += 5) {
17594         GemmMicrokernelTester()
17595           .mr(1)
17596           .nr(8)
17597           .kr(1)
17598           .sr(4)
17599           .m(1)
17600           .n(n)
17601           .k(k)
17602           .a_stride(23)
17603           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17604       }
17605     }
17606   }
17607 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,n_gt_8_subtile)17608   TEST(F32_GEMM_MINMAX_1X8S4__SSE, n_gt_8_subtile) {
17609     TEST_REQUIRES_X86_SSE;
17610     for (uint32_t n = 9; n < 16; n++) {
17611       for (size_t k = 1; k <= 20; k += 5) {
17612         for (uint32_t m = 1; m <= 1; m++) {
17613           GemmMicrokernelTester()
17614             .mr(1)
17615             .nr(8)
17616             .kr(1)
17617             .sr(4)
17618             .m(m)
17619             .n(n)
17620             .k(k)
17621             .iterations(1)
17622             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17623         }
17624       }
17625     }
17626   }
17627 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,n_div_8)17628   TEST(F32_GEMM_MINMAX_1X8S4__SSE, n_div_8) {
17629     TEST_REQUIRES_X86_SSE;
17630     for (uint32_t n = 16; n <= 24; n += 8) {
17631       for (size_t k = 1; k <= 20; k += 5) {
17632         GemmMicrokernelTester()
17633           .mr(1)
17634           .nr(8)
17635           .kr(1)
17636           .sr(4)
17637           .m(1)
17638           .n(n)
17639           .k(k)
17640           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17641       }
17642     }
17643   }
17644 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,n_div_8_strided_cn)17645   TEST(F32_GEMM_MINMAX_1X8S4__SSE, n_div_8_strided_cn) {
17646     TEST_REQUIRES_X86_SSE;
17647     for (uint32_t n = 16; n <= 24; n += 8) {
17648       for (size_t k = 1; k <= 20; k += 5) {
17649         GemmMicrokernelTester()
17650           .mr(1)
17651           .nr(8)
17652           .kr(1)
17653           .sr(4)
17654           .m(1)
17655           .n(n)
17656           .k(k)
17657           .cn_stride(11)
17658           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17659       }
17660     }
17661   }
17662 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,n_div_8_strided_a)17663   TEST(F32_GEMM_MINMAX_1X8S4__SSE, n_div_8_strided_a) {
17664     TEST_REQUIRES_X86_SSE;
17665     for (uint32_t n = 16; n <= 24; n += 8) {
17666       for (size_t k = 1; k <= 20; k += 5) {
17667         GemmMicrokernelTester()
17668           .mr(1)
17669           .nr(8)
17670           .kr(1)
17671           .sr(4)
17672           .m(1)
17673           .n(n)
17674           .k(k)
17675           .a_stride(23)
17676           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17677       }
17678     }
17679   }
17680 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,n_div_8_subtile)17681   TEST(F32_GEMM_MINMAX_1X8S4__SSE, n_div_8_subtile) {
17682     TEST_REQUIRES_X86_SSE;
17683     for (uint32_t n = 16; n <= 24; n += 8) {
17684       for (size_t k = 1; k <= 20; k += 5) {
17685         for (uint32_t m = 1; m <= 1; m++) {
17686           GemmMicrokernelTester()
17687             .mr(1)
17688             .nr(8)
17689             .kr(1)
17690             .sr(4)
17691             .m(m)
17692             .n(n)
17693             .k(k)
17694             .iterations(1)
17695             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17696         }
17697       }
17698     }
17699   }
17700 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,strided_cm_subtile)17701   TEST(F32_GEMM_MINMAX_1X8S4__SSE, strided_cm_subtile) {
17702     TEST_REQUIRES_X86_SSE;
17703     for (size_t k = 1; k <= 20; k += 5) {
17704       for (uint32_t n = 1; n <= 8; n++) {
17705         for (uint32_t m = 1; m <= 1; m++) {
17706           GemmMicrokernelTester()
17707             .mr(1)
17708             .nr(8)
17709             .kr(1)
17710             .sr(4)
17711             .m(m)
17712             .n(n)
17713             .k(k)
17714             .cm_stride(11)
17715             .iterations(1)
17716             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17717         }
17718       }
17719     }
17720   }
17721 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,qmin)17722   TEST(F32_GEMM_MINMAX_1X8S4__SSE, qmin) {
17723     TEST_REQUIRES_X86_SSE;
17724     GemmMicrokernelTester()
17725       .mr(1)
17726       .nr(8)
17727       .kr(1)
17728       .sr(4)
17729       .m(1)
17730       .n(8)
17731       .k(4)
17732       .qmin(128)
17733       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17734   }
17735 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,qmax)17736   TEST(F32_GEMM_MINMAX_1X8S4__SSE, qmax) {
17737     TEST_REQUIRES_X86_SSE;
17738     GemmMicrokernelTester()
17739       .mr(1)
17740       .nr(8)
17741       .kr(1)
17742       .sr(4)
17743       .m(1)
17744       .n(8)
17745       .k(4)
17746       .qmax(128)
17747       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17748   }
17749 
TEST(F32_GEMM_MINMAX_1X8S4__SSE,strided_cm)17750   TEST(F32_GEMM_MINMAX_1X8S4__SSE, strided_cm) {
17751     TEST_REQUIRES_X86_SSE;
17752     GemmMicrokernelTester()
17753       .mr(1)
17754       .nr(8)
17755       .kr(1)
17756       .sr(4)
17757       .m(1)
17758       .n(8)
17759       .k(4)
17760       .cm_stride(11)
17761       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__sse, xnn_init_f32_minmax_sse_params);
17762   }
17763 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
17764 
17765 
17766 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_eq_4)17767   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_eq_4) {
17768     TEST_REQUIRES_X86_SSE2;
17769     GemmMicrokernelTester()
17770       .mr(3)
17771       .nr(8)
17772       .kr(1)
17773       .sr(1)
17774       .m(3)
17775       .n(8)
17776       .k(4)
17777       .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17778   }
17779 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,strided_cn)17780   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, strided_cn) {
17781     TEST_REQUIRES_X86_SSE2;
17782     GemmMicrokernelTester()
17783       .mr(3)
17784       .nr(8)
17785       .kr(1)
17786       .sr(1)
17787       .m(3)
17788       .n(8)
17789       .k(4)
17790       .cn_stride(11)
17791       .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17792   }
17793 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_eq_4_strided_a)17794   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_eq_4_strided_a) {
17795     TEST_REQUIRES_X86_SSE2;
17796     GemmMicrokernelTester()
17797       .mr(3)
17798       .nr(8)
17799       .kr(1)
17800       .sr(1)
17801       .m(3)
17802       .n(8)
17803       .k(4)
17804       .a_stride(7)
17805       .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17806   }
17807 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_eq_4_subtile)17808   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_eq_4_subtile) {
17809     TEST_REQUIRES_X86_SSE2;
17810     for (uint32_t n = 1; n <= 8; n++) {
17811       for (uint32_t m = 1; m <= 3; m++) {
17812         GemmMicrokernelTester()
17813           .mr(3)
17814           .nr(8)
17815           .kr(1)
17816           .sr(1)
17817           .m(m)
17818           .n(n)
17819           .k(4)
17820           .iterations(1)
17821           .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17822       }
17823     }
17824   }
17825 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_eq_4_subtile_m)17826   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_eq_4_subtile_m) {
17827     TEST_REQUIRES_X86_SSE2;
17828     for (uint32_t m = 1; m <= 3; m++) {
17829       GemmMicrokernelTester()
17830         .mr(3)
17831         .nr(8)
17832         .kr(1)
17833         .sr(1)
17834         .m(m)
17835         .n(8)
17836         .k(4)
17837         .iterations(1)
17838         .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17839     }
17840   }
17841 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_eq_4_subtile_n)17842   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_eq_4_subtile_n) {
17843     TEST_REQUIRES_X86_SSE2;
17844     for (uint32_t n = 1; n <= 8; n++) {
17845       GemmMicrokernelTester()
17846         .mr(3)
17847         .nr(8)
17848         .kr(1)
17849         .sr(1)
17850         .m(3)
17851         .n(n)
17852         .k(4)
17853         .iterations(1)
17854         .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17855     }
17856   }
17857 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_lt_4)17858   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_lt_4) {
17859     TEST_REQUIRES_X86_SSE2;
17860     for (size_t k = 1; k < 4; k++) {
17861       GemmMicrokernelTester()
17862         .mr(3)
17863         .nr(8)
17864         .kr(1)
17865         .sr(1)
17866         .m(3)
17867         .n(8)
17868         .k(k)
17869         .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17870     }
17871   }
17872 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_lt_4_strided_a)17873   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_lt_4_strided_a) {
17874     TEST_REQUIRES_X86_SSE2;
17875     for (size_t k = 1; k < 4; k++) {
17876       GemmMicrokernelTester()
17877         .mr(3)
17878         .nr(8)
17879         .kr(1)
17880         .sr(1)
17881         .m(3)
17882         .n(8)
17883         .k(k)
17884         .a_stride(7)
17885         .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17886     }
17887   }
17888 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_lt_4_subtile)17889   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_lt_4_subtile) {
17890     TEST_REQUIRES_X86_SSE2;
17891     for (size_t k = 1; k < 4; k++) {
17892       for (uint32_t n = 1; n <= 8; n++) {
17893         for (uint32_t m = 1; m <= 3; m++) {
17894           GemmMicrokernelTester()
17895             .mr(3)
17896             .nr(8)
17897             .kr(1)
17898             .sr(1)
17899             .m(m)
17900             .n(n)
17901             .k(k)
17902             .iterations(1)
17903             .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17904         }
17905       }
17906     }
17907   }
17908 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_gt_4)17909   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_gt_4) {
17910     TEST_REQUIRES_X86_SSE2;
17911     for (size_t k = 5; k < 8; k++) {
17912       GemmMicrokernelTester()
17913         .mr(3)
17914         .nr(8)
17915         .kr(1)
17916         .sr(1)
17917         .m(3)
17918         .n(8)
17919         .k(k)
17920         .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17921     }
17922   }
17923 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_gt_4_strided_a)17924   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_gt_4_strided_a) {
17925     TEST_REQUIRES_X86_SSE2;
17926     for (size_t k = 5; k < 8; k++) {
17927       GemmMicrokernelTester()
17928         .mr(3)
17929         .nr(8)
17930         .kr(1)
17931         .sr(1)
17932         .m(3)
17933         .n(8)
17934         .k(k)
17935         .a_stride(11)
17936         .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17937     }
17938   }
17939 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_gt_4_subtile)17940   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_gt_4_subtile) {
17941     TEST_REQUIRES_X86_SSE2;
17942     for (size_t k = 5; k < 8; k++) {
17943       for (uint32_t n = 1; n <= 8; n++) {
17944         for (uint32_t m = 1; m <= 3; m++) {
17945           GemmMicrokernelTester()
17946             .mr(3)
17947             .nr(8)
17948             .kr(1)
17949             .sr(1)
17950             .m(m)
17951             .n(n)
17952             .k(k)
17953             .iterations(1)
17954             .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17955         }
17956       }
17957     }
17958   }
17959 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_div_4)17960   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_div_4) {
17961     TEST_REQUIRES_X86_SSE2;
17962     for (size_t k = 8; k <= 40; k += 4) {
17963       GemmMicrokernelTester()
17964         .mr(3)
17965         .nr(8)
17966         .kr(1)
17967         .sr(1)
17968         .m(3)
17969         .n(8)
17970         .k(k)
17971         .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17972     }
17973   }
17974 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_div_4_strided_a)17975   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_div_4_strided_a) {
17976     TEST_REQUIRES_X86_SSE2;
17977     for (size_t k = 8; k <= 40; k += 4) {
17978       GemmMicrokernelTester()
17979         .mr(3)
17980         .nr(8)
17981         .kr(1)
17982         .sr(1)
17983         .m(3)
17984         .n(8)
17985         .k(k)
17986         .a_stride(43)
17987         .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
17988     }
17989   }
17990 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,k_div_4_subtile)17991   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, k_div_4_subtile) {
17992     TEST_REQUIRES_X86_SSE2;
17993     for (size_t k = 8; k <= 40; k += 4) {
17994       for (uint32_t n = 1; n <= 8; n++) {
17995         for (uint32_t m = 1; m <= 3; m++) {
17996           GemmMicrokernelTester()
17997             .mr(3)
17998             .nr(8)
17999             .kr(1)
18000             .sr(1)
18001             .m(m)
18002             .n(n)
18003             .k(k)
18004             .iterations(1)
18005             .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18006         }
18007       }
18008     }
18009   }
18010 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,n_gt_8)18011   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, n_gt_8) {
18012     TEST_REQUIRES_X86_SSE2;
18013     for (uint32_t n = 9; n < 16; n++) {
18014       for (size_t k = 1; k <= 20; k += 5) {
18015         GemmMicrokernelTester()
18016           .mr(3)
18017           .nr(8)
18018           .kr(1)
18019           .sr(1)
18020           .m(3)
18021           .n(n)
18022           .k(k)
18023           .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18024       }
18025     }
18026   }
18027 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,n_gt_8_strided_cn)18028   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, n_gt_8_strided_cn) {
18029     TEST_REQUIRES_X86_SSE2;
18030     for (uint32_t n = 9; n < 16; n++) {
18031       for (size_t k = 1; k <= 20; k += 5) {
18032         GemmMicrokernelTester()
18033           .mr(3)
18034           .nr(8)
18035           .kr(1)
18036           .sr(1)
18037           .m(3)
18038           .n(n)
18039           .k(k)
18040           .cn_stride(11)
18041           .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18042       }
18043     }
18044   }
18045 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,n_gt_8_strided_a)18046   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, n_gt_8_strided_a) {
18047     TEST_REQUIRES_X86_SSE2;
18048     for (uint32_t n = 9; n < 16; n++) {
18049       for (size_t k = 1; k <= 20; k += 5) {
18050         GemmMicrokernelTester()
18051           .mr(3)
18052           .nr(8)
18053           .kr(1)
18054           .sr(1)
18055           .m(3)
18056           .n(n)
18057           .k(k)
18058           .a_stride(23)
18059           .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18060       }
18061     }
18062   }
18063 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,n_gt_8_subtile)18064   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, n_gt_8_subtile) {
18065     TEST_REQUIRES_X86_SSE2;
18066     for (uint32_t n = 9; n < 16; n++) {
18067       for (size_t k = 1; k <= 20; k += 5) {
18068         for (uint32_t m = 1; m <= 3; m++) {
18069           GemmMicrokernelTester()
18070             .mr(3)
18071             .nr(8)
18072             .kr(1)
18073             .sr(1)
18074             .m(m)
18075             .n(n)
18076             .k(k)
18077             .iterations(1)
18078             .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18079         }
18080       }
18081     }
18082   }
18083 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,n_div_8)18084   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, n_div_8) {
18085     TEST_REQUIRES_X86_SSE2;
18086     for (uint32_t n = 16; n <= 24; n += 8) {
18087       for (size_t k = 1; k <= 20; k += 5) {
18088         GemmMicrokernelTester()
18089           .mr(3)
18090           .nr(8)
18091           .kr(1)
18092           .sr(1)
18093           .m(3)
18094           .n(n)
18095           .k(k)
18096           .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18097       }
18098     }
18099   }
18100 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,n_div_8_strided_cn)18101   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, n_div_8_strided_cn) {
18102     TEST_REQUIRES_X86_SSE2;
18103     for (uint32_t n = 16; n <= 24; n += 8) {
18104       for (size_t k = 1; k <= 20; k += 5) {
18105         GemmMicrokernelTester()
18106           .mr(3)
18107           .nr(8)
18108           .kr(1)
18109           .sr(1)
18110           .m(3)
18111           .n(n)
18112           .k(k)
18113           .cn_stride(11)
18114           .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18115       }
18116     }
18117   }
18118 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,n_div_8_strided_a)18119   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, n_div_8_strided_a) {
18120     TEST_REQUIRES_X86_SSE2;
18121     for (uint32_t n = 16; n <= 24; n += 8) {
18122       for (size_t k = 1; k <= 20; k += 5) {
18123         GemmMicrokernelTester()
18124           .mr(3)
18125           .nr(8)
18126           .kr(1)
18127           .sr(1)
18128           .m(3)
18129           .n(n)
18130           .k(k)
18131           .a_stride(23)
18132           .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18133       }
18134     }
18135   }
18136 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,n_div_8_subtile)18137   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, n_div_8_subtile) {
18138     TEST_REQUIRES_X86_SSE2;
18139     for (uint32_t n = 16; n <= 24; n += 8) {
18140       for (size_t k = 1; k <= 20; k += 5) {
18141         for (uint32_t m = 1; m <= 3; m++) {
18142           GemmMicrokernelTester()
18143             .mr(3)
18144             .nr(8)
18145             .kr(1)
18146             .sr(1)
18147             .m(m)
18148             .n(n)
18149             .k(k)
18150             .iterations(1)
18151             .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18152         }
18153       }
18154     }
18155   }
18156 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,strided_cm_subtile)18157   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, strided_cm_subtile) {
18158     TEST_REQUIRES_X86_SSE2;
18159     for (size_t k = 1; k <= 20; k += 5) {
18160       for (uint32_t n = 1; n <= 8; n++) {
18161         for (uint32_t m = 1; m <= 3; m++) {
18162           GemmMicrokernelTester()
18163             .mr(3)
18164             .nr(8)
18165             .kr(1)
18166             .sr(1)
18167             .m(m)
18168             .n(n)
18169             .k(k)
18170             .cm_stride(11)
18171             .iterations(1)
18172             .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18173         }
18174       }
18175     }
18176   }
18177 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,qmin)18178   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, qmin) {
18179     TEST_REQUIRES_X86_SSE2;
18180     GemmMicrokernelTester()
18181       .mr(3)
18182       .nr(8)
18183       .kr(1)
18184       .sr(1)
18185       .m(3)
18186       .n(8)
18187       .k(4)
18188       .qmin(128)
18189       .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18190   }
18191 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,qmax)18192   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, qmax) {
18193     TEST_REQUIRES_X86_SSE2;
18194     GemmMicrokernelTester()
18195       .mr(3)
18196       .nr(8)
18197       .kr(1)
18198       .sr(1)
18199       .m(3)
18200       .n(8)
18201       .k(4)
18202       .qmax(128)
18203       .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18204   }
18205 
TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP,strided_cm)18206   TEST(F32_GEMM_MINMAX_3X8__SSE2_DUP, strided_cm) {
18207     TEST_REQUIRES_X86_SSE2;
18208     GemmMicrokernelTester()
18209       .mr(3)
18210       .nr(8)
18211       .kr(1)
18212       .sr(1)
18213       .m(3)
18214       .n(8)
18215       .k(4)
18216       .cm_stride(11)
18217       .Test(xnn_f32_gemm_minmax_ukernel_3x8__sse2_dup, xnn_init_f32_minmax_sse_params);
18218   }
18219 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
18220 
18221 
18222 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_eq_4)18223   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_eq_4) {
18224     TEST_REQUIRES_X86_SSE;
18225     GemmMicrokernelTester()
18226       .mr(4)
18227       .nr(2)
18228       .kr(4)
18229       .sr(1)
18230       .m(4)
18231       .n(2)
18232       .k(4)
18233       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18234   }
18235 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,strided_cn)18236   TEST(F32_GEMM_MINMAX_4X2C4__SSE, strided_cn) {
18237     TEST_REQUIRES_X86_SSE;
18238     GemmMicrokernelTester()
18239       .mr(4)
18240       .nr(2)
18241       .kr(4)
18242       .sr(1)
18243       .m(4)
18244       .n(2)
18245       .k(4)
18246       .cn_stride(5)
18247       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18248   }
18249 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_eq_4_strided_a)18250   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_eq_4_strided_a) {
18251     TEST_REQUIRES_X86_SSE;
18252     GemmMicrokernelTester()
18253       .mr(4)
18254       .nr(2)
18255       .kr(4)
18256       .sr(1)
18257       .m(4)
18258       .n(2)
18259       .k(4)
18260       .a_stride(7)
18261       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18262   }
18263 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_eq_4_subtile)18264   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_eq_4_subtile) {
18265     TEST_REQUIRES_X86_SSE;
18266     for (uint32_t n = 1; n <= 2; n++) {
18267       for (uint32_t m = 1; m <= 4; m++) {
18268         GemmMicrokernelTester()
18269           .mr(4)
18270           .nr(2)
18271           .kr(4)
18272           .sr(1)
18273           .m(m)
18274           .n(n)
18275           .k(4)
18276           .iterations(1)
18277           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18278       }
18279     }
18280   }
18281 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_eq_4_subtile_m)18282   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_eq_4_subtile_m) {
18283     TEST_REQUIRES_X86_SSE;
18284     for (uint32_t m = 1; m <= 4; m++) {
18285       GemmMicrokernelTester()
18286         .mr(4)
18287         .nr(2)
18288         .kr(4)
18289         .sr(1)
18290         .m(m)
18291         .n(2)
18292         .k(4)
18293         .iterations(1)
18294         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18295     }
18296   }
18297 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_eq_4_subtile_n)18298   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_eq_4_subtile_n) {
18299     TEST_REQUIRES_X86_SSE;
18300     for (uint32_t n = 1; n <= 2; n++) {
18301       GemmMicrokernelTester()
18302         .mr(4)
18303         .nr(2)
18304         .kr(4)
18305         .sr(1)
18306         .m(4)
18307         .n(n)
18308         .k(4)
18309         .iterations(1)
18310         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18311     }
18312   }
18313 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_lt_4)18314   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_lt_4) {
18315     TEST_REQUIRES_X86_SSE;
18316     for (size_t k = 1; k < 4; k++) {
18317       GemmMicrokernelTester()
18318         .mr(4)
18319         .nr(2)
18320         .kr(4)
18321         .sr(1)
18322         .m(4)
18323         .n(2)
18324         .k(k)
18325         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18326     }
18327   }
18328 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_lt_4_strided_a)18329   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_lt_4_strided_a) {
18330     TEST_REQUIRES_X86_SSE;
18331     for (size_t k = 1; k < 4; k++) {
18332       GemmMicrokernelTester()
18333         .mr(4)
18334         .nr(2)
18335         .kr(4)
18336         .sr(1)
18337         .m(4)
18338         .n(2)
18339         .k(k)
18340         .a_stride(7)
18341         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18342     }
18343   }
18344 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_lt_4_subtile)18345   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_lt_4_subtile) {
18346     TEST_REQUIRES_X86_SSE;
18347     for (size_t k = 1; k < 4; k++) {
18348       for (uint32_t n = 1; n <= 2; n++) {
18349         for (uint32_t m = 1; m <= 4; m++) {
18350           GemmMicrokernelTester()
18351             .mr(4)
18352             .nr(2)
18353             .kr(4)
18354             .sr(1)
18355             .m(m)
18356             .n(n)
18357             .k(k)
18358             .iterations(1)
18359             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18360         }
18361       }
18362     }
18363   }
18364 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_gt_4)18365   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_gt_4) {
18366     TEST_REQUIRES_X86_SSE;
18367     for (size_t k = 5; k < 8; k++) {
18368       GemmMicrokernelTester()
18369         .mr(4)
18370         .nr(2)
18371         .kr(4)
18372         .sr(1)
18373         .m(4)
18374         .n(2)
18375         .k(k)
18376         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18377     }
18378   }
18379 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_gt_4_strided_a)18380   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_gt_4_strided_a) {
18381     TEST_REQUIRES_X86_SSE;
18382     for (size_t k = 5; k < 8; k++) {
18383       GemmMicrokernelTester()
18384         .mr(4)
18385         .nr(2)
18386         .kr(4)
18387         .sr(1)
18388         .m(4)
18389         .n(2)
18390         .k(k)
18391         .a_stride(11)
18392         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18393     }
18394   }
18395 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_gt_4_subtile)18396   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_gt_4_subtile) {
18397     TEST_REQUIRES_X86_SSE;
18398     for (size_t k = 5; k < 8; k++) {
18399       for (uint32_t n = 1; n <= 2; n++) {
18400         for (uint32_t m = 1; m <= 4; m++) {
18401           GemmMicrokernelTester()
18402             .mr(4)
18403             .nr(2)
18404             .kr(4)
18405             .sr(1)
18406             .m(m)
18407             .n(n)
18408             .k(k)
18409             .iterations(1)
18410             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18411         }
18412       }
18413     }
18414   }
18415 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_div_4)18416   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_div_4) {
18417     TEST_REQUIRES_X86_SSE;
18418     for (size_t k = 8; k <= 40; k += 4) {
18419       GemmMicrokernelTester()
18420         .mr(4)
18421         .nr(2)
18422         .kr(4)
18423         .sr(1)
18424         .m(4)
18425         .n(2)
18426         .k(k)
18427         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18428     }
18429   }
18430 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_div_4_strided_a)18431   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_div_4_strided_a) {
18432     TEST_REQUIRES_X86_SSE;
18433     for (size_t k = 8; k <= 40; k += 4) {
18434       GemmMicrokernelTester()
18435         .mr(4)
18436         .nr(2)
18437         .kr(4)
18438         .sr(1)
18439         .m(4)
18440         .n(2)
18441         .k(k)
18442         .a_stride(43)
18443         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18444     }
18445   }
18446 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,k_div_4_subtile)18447   TEST(F32_GEMM_MINMAX_4X2C4__SSE, k_div_4_subtile) {
18448     TEST_REQUIRES_X86_SSE;
18449     for (size_t k = 8; k <= 40; k += 4) {
18450       for (uint32_t n = 1; n <= 2; n++) {
18451         for (uint32_t m = 1; m <= 4; m++) {
18452           GemmMicrokernelTester()
18453             .mr(4)
18454             .nr(2)
18455             .kr(4)
18456             .sr(1)
18457             .m(m)
18458             .n(n)
18459             .k(k)
18460             .iterations(1)
18461             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18462         }
18463       }
18464     }
18465   }
18466 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,n_gt_2)18467   TEST(F32_GEMM_MINMAX_4X2C4__SSE, n_gt_2) {
18468     TEST_REQUIRES_X86_SSE;
18469     for (uint32_t n = 3; n < 4; n++) {
18470       for (size_t k = 1; k <= 20; k += 5) {
18471         GemmMicrokernelTester()
18472           .mr(4)
18473           .nr(2)
18474           .kr(4)
18475           .sr(1)
18476           .m(4)
18477           .n(n)
18478           .k(k)
18479           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18480       }
18481     }
18482   }
18483 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,n_gt_2_strided_cn)18484   TEST(F32_GEMM_MINMAX_4X2C4__SSE, n_gt_2_strided_cn) {
18485     TEST_REQUIRES_X86_SSE;
18486     for (uint32_t n = 3; n < 4; n++) {
18487       for (size_t k = 1; k <= 20; k += 5) {
18488         GemmMicrokernelTester()
18489           .mr(4)
18490           .nr(2)
18491           .kr(4)
18492           .sr(1)
18493           .m(4)
18494           .n(n)
18495           .k(k)
18496           .cn_stride(5)
18497           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18498       }
18499     }
18500   }
18501 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,n_gt_2_strided_a)18502   TEST(F32_GEMM_MINMAX_4X2C4__SSE, n_gt_2_strided_a) {
18503     TEST_REQUIRES_X86_SSE;
18504     for (uint32_t n = 3; n < 4; n++) {
18505       for (size_t k = 1; k <= 20; k += 5) {
18506         GemmMicrokernelTester()
18507           .mr(4)
18508           .nr(2)
18509           .kr(4)
18510           .sr(1)
18511           .m(4)
18512           .n(n)
18513           .k(k)
18514           .a_stride(23)
18515           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18516       }
18517     }
18518   }
18519 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,n_gt_2_subtile)18520   TEST(F32_GEMM_MINMAX_4X2C4__SSE, n_gt_2_subtile) {
18521     TEST_REQUIRES_X86_SSE;
18522     for (uint32_t n = 3; n < 4; n++) {
18523       for (size_t k = 1; k <= 20; k += 5) {
18524         for (uint32_t m = 1; m <= 4; m++) {
18525           GemmMicrokernelTester()
18526             .mr(4)
18527             .nr(2)
18528             .kr(4)
18529             .sr(1)
18530             .m(m)
18531             .n(n)
18532             .k(k)
18533             .iterations(1)
18534             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18535         }
18536       }
18537     }
18538   }
18539 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,n_div_2)18540   TEST(F32_GEMM_MINMAX_4X2C4__SSE, n_div_2) {
18541     TEST_REQUIRES_X86_SSE;
18542     for (uint32_t n = 4; n <= 6; n += 2) {
18543       for (size_t k = 1; k <= 20; k += 5) {
18544         GemmMicrokernelTester()
18545           .mr(4)
18546           .nr(2)
18547           .kr(4)
18548           .sr(1)
18549           .m(4)
18550           .n(n)
18551           .k(k)
18552           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18553       }
18554     }
18555   }
18556 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,n_div_2_strided_cn)18557   TEST(F32_GEMM_MINMAX_4X2C4__SSE, n_div_2_strided_cn) {
18558     TEST_REQUIRES_X86_SSE;
18559     for (uint32_t n = 4; n <= 6; n += 2) {
18560       for (size_t k = 1; k <= 20; k += 5) {
18561         GemmMicrokernelTester()
18562           .mr(4)
18563           .nr(2)
18564           .kr(4)
18565           .sr(1)
18566           .m(4)
18567           .n(n)
18568           .k(k)
18569           .cn_stride(5)
18570           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18571       }
18572     }
18573   }
18574 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,n_div_2_strided_a)18575   TEST(F32_GEMM_MINMAX_4X2C4__SSE, n_div_2_strided_a) {
18576     TEST_REQUIRES_X86_SSE;
18577     for (uint32_t n = 4; n <= 6; n += 2) {
18578       for (size_t k = 1; k <= 20; k += 5) {
18579         GemmMicrokernelTester()
18580           .mr(4)
18581           .nr(2)
18582           .kr(4)
18583           .sr(1)
18584           .m(4)
18585           .n(n)
18586           .k(k)
18587           .a_stride(23)
18588           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18589       }
18590     }
18591   }
18592 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,n_div_2_subtile)18593   TEST(F32_GEMM_MINMAX_4X2C4__SSE, n_div_2_subtile) {
18594     TEST_REQUIRES_X86_SSE;
18595     for (uint32_t n = 4; n <= 6; n += 2) {
18596       for (size_t k = 1; k <= 20; k += 5) {
18597         for (uint32_t m = 1; m <= 4; m++) {
18598           GemmMicrokernelTester()
18599             .mr(4)
18600             .nr(2)
18601             .kr(4)
18602             .sr(1)
18603             .m(m)
18604             .n(n)
18605             .k(k)
18606             .iterations(1)
18607             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18608         }
18609       }
18610     }
18611   }
18612 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,strided_cm_subtile)18613   TEST(F32_GEMM_MINMAX_4X2C4__SSE, strided_cm_subtile) {
18614     TEST_REQUIRES_X86_SSE;
18615     for (size_t k = 1; k <= 20; k += 5) {
18616       for (uint32_t n = 1; n <= 2; n++) {
18617         for (uint32_t m = 1; m <= 4; m++) {
18618           GemmMicrokernelTester()
18619             .mr(4)
18620             .nr(2)
18621             .kr(4)
18622             .sr(1)
18623             .m(m)
18624             .n(n)
18625             .k(k)
18626             .cm_stride(5)
18627             .iterations(1)
18628             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18629         }
18630       }
18631     }
18632   }
18633 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,qmin)18634   TEST(F32_GEMM_MINMAX_4X2C4__SSE, qmin) {
18635     TEST_REQUIRES_X86_SSE;
18636     GemmMicrokernelTester()
18637       .mr(4)
18638       .nr(2)
18639       .kr(4)
18640       .sr(1)
18641       .m(4)
18642       .n(2)
18643       .k(4)
18644       .qmin(128)
18645       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18646   }
18647 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,qmax)18648   TEST(F32_GEMM_MINMAX_4X2C4__SSE, qmax) {
18649     TEST_REQUIRES_X86_SSE;
18650     GemmMicrokernelTester()
18651       .mr(4)
18652       .nr(2)
18653       .kr(4)
18654       .sr(1)
18655       .m(4)
18656       .n(2)
18657       .k(4)
18658       .qmax(128)
18659       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18660   }
18661 
TEST(F32_GEMM_MINMAX_4X2C4__SSE,strided_cm)18662   TEST(F32_GEMM_MINMAX_4X2C4__SSE, strided_cm) {
18663     TEST_REQUIRES_X86_SSE;
18664     GemmMicrokernelTester()
18665       .mr(4)
18666       .nr(2)
18667       .kr(4)
18668       .sr(1)
18669       .m(4)
18670       .n(2)
18671       .k(4)
18672       .cm_stride(5)
18673       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__sse, xnn_init_f32_minmax_sse_params);
18674   }
18675 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
18676 
18677 
18678 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_eq_4)18679   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_eq_4) {
18680     TEST_REQUIRES_X86_SSE;
18681     GemmMicrokernelTester()
18682       .mr(4)
18683       .nr(8)
18684       .kr(1)
18685       .sr(1)
18686       .m(4)
18687       .n(8)
18688       .k(4)
18689       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18690   }
18691 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,strided_cn)18692   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, strided_cn) {
18693     TEST_REQUIRES_X86_SSE;
18694     GemmMicrokernelTester()
18695       .mr(4)
18696       .nr(8)
18697       .kr(1)
18698       .sr(1)
18699       .m(4)
18700       .n(8)
18701       .k(4)
18702       .cn_stride(11)
18703       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18704   }
18705 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_eq_4_strided_a)18706   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_eq_4_strided_a) {
18707     TEST_REQUIRES_X86_SSE;
18708     GemmMicrokernelTester()
18709       .mr(4)
18710       .nr(8)
18711       .kr(1)
18712       .sr(1)
18713       .m(4)
18714       .n(8)
18715       .k(4)
18716       .a_stride(7)
18717       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18718   }
18719 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_eq_4_subtile)18720   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_eq_4_subtile) {
18721     TEST_REQUIRES_X86_SSE;
18722     for (uint32_t n = 1; n <= 8; n++) {
18723       for (uint32_t m = 1; m <= 4; m++) {
18724         GemmMicrokernelTester()
18725           .mr(4)
18726           .nr(8)
18727           .kr(1)
18728           .sr(1)
18729           .m(m)
18730           .n(n)
18731           .k(4)
18732           .iterations(1)
18733           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18734       }
18735     }
18736   }
18737 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_eq_4_subtile_m)18738   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_eq_4_subtile_m) {
18739     TEST_REQUIRES_X86_SSE;
18740     for (uint32_t m = 1; m <= 4; m++) {
18741       GemmMicrokernelTester()
18742         .mr(4)
18743         .nr(8)
18744         .kr(1)
18745         .sr(1)
18746         .m(m)
18747         .n(8)
18748         .k(4)
18749         .iterations(1)
18750         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18751     }
18752   }
18753 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_eq_4_subtile_n)18754   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_eq_4_subtile_n) {
18755     TEST_REQUIRES_X86_SSE;
18756     for (uint32_t n = 1; n <= 8; n++) {
18757       GemmMicrokernelTester()
18758         .mr(4)
18759         .nr(8)
18760         .kr(1)
18761         .sr(1)
18762         .m(4)
18763         .n(n)
18764         .k(4)
18765         .iterations(1)
18766         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18767     }
18768   }
18769 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_lt_4)18770   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_lt_4) {
18771     TEST_REQUIRES_X86_SSE;
18772     for (size_t k = 1; k < 4; k++) {
18773       GemmMicrokernelTester()
18774         .mr(4)
18775         .nr(8)
18776         .kr(1)
18777         .sr(1)
18778         .m(4)
18779         .n(8)
18780         .k(k)
18781         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18782     }
18783   }
18784 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_lt_4_strided_a)18785   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_lt_4_strided_a) {
18786     TEST_REQUIRES_X86_SSE;
18787     for (size_t k = 1; k < 4; k++) {
18788       GemmMicrokernelTester()
18789         .mr(4)
18790         .nr(8)
18791         .kr(1)
18792         .sr(1)
18793         .m(4)
18794         .n(8)
18795         .k(k)
18796         .a_stride(7)
18797         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18798     }
18799   }
18800 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_lt_4_subtile)18801   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_lt_4_subtile) {
18802     TEST_REQUIRES_X86_SSE;
18803     for (size_t k = 1; k < 4; k++) {
18804       for (uint32_t n = 1; n <= 8; n++) {
18805         for (uint32_t m = 1; m <= 4; m++) {
18806           GemmMicrokernelTester()
18807             .mr(4)
18808             .nr(8)
18809             .kr(1)
18810             .sr(1)
18811             .m(m)
18812             .n(n)
18813             .k(k)
18814             .iterations(1)
18815             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18816         }
18817       }
18818     }
18819   }
18820 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_gt_4)18821   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_gt_4) {
18822     TEST_REQUIRES_X86_SSE;
18823     for (size_t k = 5; k < 8; k++) {
18824       GemmMicrokernelTester()
18825         .mr(4)
18826         .nr(8)
18827         .kr(1)
18828         .sr(1)
18829         .m(4)
18830         .n(8)
18831         .k(k)
18832         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18833     }
18834   }
18835 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_gt_4_strided_a)18836   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_gt_4_strided_a) {
18837     TEST_REQUIRES_X86_SSE;
18838     for (size_t k = 5; k < 8; k++) {
18839       GemmMicrokernelTester()
18840         .mr(4)
18841         .nr(8)
18842         .kr(1)
18843         .sr(1)
18844         .m(4)
18845         .n(8)
18846         .k(k)
18847         .a_stride(11)
18848         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18849     }
18850   }
18851 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_gt_4_subtile)18852   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_gt_4_subtile) {
18853     TEST_REQUIRES_X86_SSE;
18854     for (size_t k = 5; k < 8; k++) {
18855       for (uint32_t n = 1; n <= 8; n++) {
18856         for (uint32_t m = 1; m <= 4; m++) {
18857           GemmMicrokernelTester()
18858             .mr(4)
18859             .nr(8)
18860             .kr(1)
18861             .sr(1)
18862             .m(m)
18863             .n(n)
18864             .k(k)
18865             .iterations(1)
18866             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18867         }
18868       }
18869     }
18870   }
18871 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_div_4)18872   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_div_4) {
18873     TEST_REQUIRES_X86_SSE;
18874     for (size_t k = 8; k <= 40; k += 4) {
18875       GemmMicrokernelTester()
18876         .mr(4)
18877         .nr(8)
18878         .kr(1)
18879         .sr(1)
18880         .m(4)
18881         .n(8)
18882         .k(k)
18883         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18884     }
18885   }
18886 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_div_4_strided_a)18887   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_div_4_strided_a) {
18888     TEST_REQUIRES_X86_SSE;
18889     for (size_t k = 8; k <= 40; k += 4) {
18890       GemmMicrokernelTester()
18891         .mr(4)
18892         .nr(8)
18893         .kr(1)
18894         .sr(1)
18895         .m(4)
18896         .n(8)
18897         .k(k)
18898         .a_stride(43)
18899         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18900     }
18901   }
18902 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,k_div_4_subtile)18903   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, k_div_4_subtile) {
18904     TEST_REQUIRES_X86_SSE;
18905     for (size_t k = 8; k <= 40; k += 4) {
18906       for (uint32_t n = 1; n <= 8; n++) {
18907         for (uint32_t m = 1; m <= 4; m++) {
18908           GemmMicrokernelTester()
18909             .mr(4)
18910             .nr(8)
18911             .kr(1)
18912             .sr(1)
18913             .m(m)
18914             .n(n)
18915             .k(k)
18916             .iterations(1)
18917             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18918         }
18919       }
18920     }
18921   }
18922 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,n_gt_8)18923   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, n_gt_8) {
18924     TEST_REQUIRES_X86_SSE;
18925     for (uint32_t n = 9; n < 16; n++) {
18926       for (size_t k = 1; k <= 20; k += 5) {
18927         GemmMicrokernelTester()
18928           .mr(4)
18929           .nr(8)
18930           .kr(1)
18931           .sr(1)
18932           .m(4)
18933           .n(n)
18934           .k(k)
18935           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18936       }
18937     }
18938   }
18939 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,n_gt_8_strided_cn)18940   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, n_gt_8_strided_cn) {
18941     TEST_REQUIRES_X86_SSE;
18942     for (uint32_t n = 9; n < 16; n++) {
18943       for (size_t k = 1; k <= 20; k += 5) {
18944         GemmMicrokernelTester()
18945           .mr(4)
18946           .nr(8)
18947           .kr(1)
18948           .sr(1)
18949           .m(4)
18950           .n(n)
18951           .k(k)
18952           .cn_stride(11)
18953           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18954       }
18955     }
18956   }
18957 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,n_gt_8_strided_a)18958   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, n_gt_8_strided_a) {
18959     TEST_REQUIRES_X86_SSE;
18960     for (uint32_t n = 9; n < 16; n++) {
18961       for (size_t k = 1; k <= 20; k += 5) {
18962         GemmMicrokernelTester()
18963           .mr(4)
18964           .nr(8)
18965           .kr(1)
18966           .sr(1)
18967           .m(4)
18968           .n(n)
18969           .k(k)
18970           .a_stride(23)
18971           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18972       }
18973     }
18974   }
18975 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,n_gt_8_subtile)18976   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, n_gt_8_subtile) {
18977     TEST_REQUIRES_X86_SSE;
18978     for (uint32_t n = 9; n < 16; n++) {
18979       for (size_t k = 1; k <= 20; k += 5) {
18980         for (uint32_t m = 1; m <= 4; m++) {
18981           GemmMicrokernelTester()
18982             .mr(4)
18983             .nr(8)
18984             .kr(1)
18985             .sr(1)
18986             .m(m)
18987             .n(n)
18988             .k(k)
18989             .iterations(1)
18990             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
18991         }
18992       }
18993     }
18994   }
18995 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,n_div_8)18996   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, n_div_8) {
18997     TEST_REQUIRES_X86_SSE;
18998     for (uint32_t n = 16; n <= 24; n += 8) {
18999       for (size_t k = 1; k <= 20; k += 5) {
19000         GemmMicrokernelTester()
19001           .mr(4)
19002           .nr(8)
19003           .kr(1)
19004           .sr(1)
19005           .m(4)
19006           .n(n)
19007           .k(k)
19008           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
19009       }
19010     }
19011   }
19012 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,n_div_8_strided_cn)19013   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, n_div_8_strided_cn) {
19014     TEST_REQUIRES_X86_SSE;
19015     for (uint32_t n = 16; n <= 24; n += 8) {
19016       for (size_t k = 1; k <= 20; k += 5) {
19017         GemmMicrokernelTester()
19018           .mr(4)
19019           .nr(8)
19020           .kr(1)
19021           .sr(1)
19022           .m(4)
19023           .n(n)
19024           .k(k)
19025           .cn_stride(11)
19026           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
19027       }
19028     }
19029   }
19030 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,n_div_8_strided_a)19031   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, n_div_8_strided_a) {
19032     TEST_REQUIRES_X86_SSE;
19033     for (uint32_t n = 16; n <= 24; n += 8) {
19034       for (size_t k = 1; k <= 20; k += 5) {
19035         GemmMicrokernelTester()
19036           .mr(4)
19037           .nr(8)
19038           .kr(1)
19039           .sr(1)
19040           .m(4)
19041           .n(n)
19042           .k(k)
19043           .a_stride(23)
19044           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
19045       }
19046     }
19047   }
19048 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,n_div_8_subtile)19049   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, n_div_8_subtile) {
19050     TEST_REQUIRES_X86_SSE;
19051     for (uint32_t n = 16; n <= 24; n += 8) {
19052       for (size_t k = 1; k <= 20; k += 5) {
19053         for (uint32_t m = 1; m <= 4; m++) {
19054           GemmMicrokernelTester()
19055             .mr(4)
19056             .nr(8)
19057             .kr(1)
19058             .sr(1)
19059             .m(m)
19060             .n(n)
19061             .k(k)
19062             .iterations(1)
19063             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
19064         }
19065       }
19066     }
19067   }
19068 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,strided_cm_subtile)19069   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, strided_cm_subtile) {
19070     TEST_REQUIRES_X86_SSE;
19071     for (size_t k = 1; k <= 20; k += 5) {
19072       for (uint32_t n = 1; n <= 8; n++) {
19073         for (uint32_t m = 1; m <= 4; m++) {
19074           GemmMicrokernelTester()
19075             .mr(4)
19076             .nr(8)
19077             .kr(1)
19078             .sr(1)
19079             .m(m)
19080             .n(n)
19081             .k(k)
19082             .cm_stride(11)
19083             .iterations(1)
19084             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
19085         }
19086       }
19087     }
19088   }
19089 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,qmin)19090   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, qmin) {
19091     TEST_REQUIRES_X86_SSE;
19092     GemmMicrokernelTester()
19093       .mr(4)
19094       .nr(8)
19095       .kr(1)
19096       .sr(1)
19097       .m(4)
19098       .n(8)
19099       .k(4)
19100       .qmin(128)
19101       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
19102   }
19103 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,qmax)19104   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, qmax) {
19105     TEST_REQUIRES_X86_SSE;
19106     GemmMicrokernelTester()
19107       .mr(4)
19108       .nr(8)
19109       .kr(1)
19110       .sr(1)
19111       .m(4)
19112       .n(8)
19113       .k(4)
19114       .qmax(128)
19115       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
19116   }
19117 
TEST(F32_GEMM_MINMAX_4X8__SSE_DUP,strided_cm)19118   TEST(F32_GEMM_MINMAX_4X8__SSE_DUP, strided_cm) {
19119     TEST_REQUIRES_X86_SSE;
19120     GemmMicrokernelTester()
19121       .mr(4)
19122       .nr(8)
19123       .kr(1)
19124       .sr(1)
19125       .m(4)
19126       .n(8)
19127       .k(4)
19128       .cm_stride(11)
19129       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse_dup, xnn_init_f32_minmax_sse_params);
19130   }
19131 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
19132 
19133 
19134 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_eq_4)19135   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_eq_4) {
19136     TEST_REQUIRES_X86_SSE2;
19137     GemmMicrokernelTester()
19138       .mr(4)
19139       .nr(8)
19140       .kr(1)
19141       .sr(1)
19142       .m(4)
19143       .n(8)
19144       .k(4)
19145       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19146   }
19147 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,strided_cn)19148   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, strided_cn) {
19149     TEST_REQUIRES_X86_SSE2;
19150     GemmMicrokernelTester()
19151       .mr(4)
19152       .nr(8)
19153       .kr(1)
19154       .sr(1)
19155       .m(4)
19156       .n(8)
19157       .k(4)
19158       .cn_stride(11)
19159       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19160   }
19161 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_eq_4_strided_a)19162   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_eq_4_strided_a) {
19163     TEST_REQUIRES_X86_SSE2;
19164     GemmMicrokernelTester()
19165       .mr(4)
19166       .nr(8)
19167       .kr(1)
19168       .sr(1)
19169       .m(4)
19170       .n(8)
19171       .k(4)
19172       .a_stride(7)
19173       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19174   }
19175 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_eq_4_subtile)19176   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_eq_4_subtile) {
19177     TEST_REQUIRES_X86_SSE2;
19178     for (uint32_t n = 1; n <= 8; n++) {
19179       for (uint32_t m = 1; m <= 4; m++) {
19180         GemmMicrokernelTester()
19181           .mr(4)
19182           .nr(8)
19183           .kr(1)
19184           .sr(1)
19185           .m(m)
19186           .n(n)
19187           .k(4)
19188           .iterations(1)
19189           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19190       }
19191     }
19192   }
19193 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_eq_4_subtile_m)19194   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_eq_4_subtile_m) {
19195     TEST_REQUIRES_X86_SSE2;
19196     for (uint32_t m = 1; m <= 4; m++) {
19197       GemmMicrokernelTester()
19198         .mr(4)
19199         .nr(8)
19200         .kr(1)
19201         .sr(1)
19202         .m(m)
19203         .n(8)
19204         .k(4)
19205         .iterations(1)
19206         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19207     }
19208   }
19209 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_eq_4_subtile_n)19210   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_eq_4_subtile_n) {
19211     TEST_REQUIRES_X86_SSE2;
19212     for (uint32_t n = 1; n <= 8; n++) {
19213       GemmMicrokernelTester()
19214         .mr(4)
19215         .nr(8)
19216         .kr(1)
19217         .sr(1)
19218         .m(4)
19219         .n(n)
19220         .k(4)
19221         .iterations(1)
19222         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19223     }
19224   }
19225 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_lt_4)19226   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_lt_4) {
19227     TEST_REQUIRES_X86_SSE2;
19228     for (size_t k = 1; k < 4; k++) {
19229       GemmMicrokernelTester()
19230         .mr(4)
19231         .nr(8)
19232         .kr(1)
19233         .sr(1)
19234         .m(4)
19235         .n(8)
19236         .k(k)
19237         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19238     }
19239   }
19240 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_lt_4_strided_a)19241   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_lt_4_strided_a) {
19242     TEST_REQUIRES_X86_SSE2;
19243     for (size_t k = 1; k < 4; k++) {
19244       GemmMicrokernelTester()
19245         .mr(4)
19246         .nr(8)
19247         .kr(1)
19248         .sr(1)
19249         .m(4)
19250         .n(8)
19251         .k(k)
19252         .a_stride(7)
19253         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19254     }
19255   }
19256 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_lt_4_subtile)19257   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_lt_4_subtile) {
19258     TEST_REQUIRES_X86_SSE2;
19259     for (size_t k = 1; k < 4; k++) {
19260       for (uint32_t n = 1; n <= 8; n++) {
19261         for (uint32_t m = 1; m <= 4; m++) {
19262           GemmMicrokernelTester()
19263             .mr(4)
19264             .nr(8)
19265             .kr(1)
19266             .sr(1)
19267             .m(m)
19268             .n(n)
19269             .k(k)
19270             .iterations(1)
19271             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19272         }
19273       }
19274     }
19275   }
19276 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_gt_4)19277   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_gt_4) {
19278     TEST_REQUIRES_X86_SSE2;
19279     for (size_t k = 5; k < 8; k++) {
19280       GemmMicrokernelTester()
19281         .mr(4)
19282         .nr(8)
19283         .kr(1)
19284         .sr(1)
19285         .m(4)
19286         .n(8)
19287         .k(k)
19288         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19289     }
19290   }
19291 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_gt_4_strided_a)19292   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_gt_4_strided_a) {
19293     TEST_REQUIRES_X86_SSE2;
19294     for (size_t k = 5; k < 8; k++) {
19295       GemmMicrokernelTester()
19296         .mr(4)
19297         .nr(8)
19298         .kr(1)
19299         .sr(1)
19300         .m(4)
19301         .n(8)
19302         .k(k)
19303         .a_stride(11)
19304         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19305     }
19306   }
19307 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_gt_4_subtile)19308   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_gt_4_subtile) {
19309     TEST_REQUIRES_X86_SSE2;
19310     for (size_t k = 5; k < 8; k++) {
19311       for (uint32_t n = 1; n <= 8; n++) {
19312         for (uint32_t m = 1; m <= 4; m++) {
19313           GemmMicrokernelTester()
19314             .mr(4)
19315             .nr(8)
19316             .kr(1)
19317             .sr(1)
19318             .m(m)
19319             .n(n)
19320             .k(k)
19321             .iterations(1)
19322             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19323         }
19324       }
19325     }
19326   }
19327 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_div_4)19328   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_div_4) {
19329     TEST_REQUIRES_X86_SSE2;
19330     for (size_t k = 8; k <= 40; k += 4) {
19331       GemmMicrokernelTester()
19332         .mr(4)
19333         .nr(8)
19334         .kr(1)
19335         .sr(1)
19336         .m(4)
19337         .n(8)
19338         .k(k)
19339         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19340     }
19341   }
19342 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_div_4_strided_a)19343   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_div_4_strided_a) {
19344     TEST_REQUIRES_X86_SSE2;
19345     for (size_t k = 8; k <= 40; k += 4) {
19346       GemmMicrokernelTester()
19347         .mr(4)
19348         .nr(8)
19349         .kr(1)
19350         .sr(1)
19351         .m(4)
19352         .n(8)
19353         .k(k)
19354         .a_stride(43)
19355         .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19356     }
19357   }
19358 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,k_div_4_subtile)19359   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, k_div_4_subtile) {
19360     TEST_REQUIRES_X86_SSE2;
19361     for (size_t k = 8; k <= 40; k += 4) {
19362       for (uint32_t n = 1; n <= 8; n++) {
19363         for (uint32_t m = 1; m <= 4; m++) {
19364           GemmMicrokernelTester()
19365             .mr(4)
19366             .nr(8)
19367             .kr(1)
19368             .sr(1)
19369             .m(m)
19370             .n(n)
19371             .k(k)
19372             .iterations(1)
19373             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19374         }
19375       }
19376     }
19377   }
19378 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,n_gt_8)19379   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, n_gt_8) {
19380     TEST_REQUIRES_X86_SSE2;
19381     for (uint32_t n = 9; n < 16; n++) {
19382       for (size_t k = 1; k <= 20; k += 5) {
19383         GemmMicrokernelTester()
19384           .mr(4)
19385           .nr(8)
19386           .kr(1)
19387           .sr(1)
19388           .m(4)
19389           .n(n)
19390           .k(k)
19391           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19392       }
19393     }
19394   }
19395 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,n_gt_8_strided_cn)19396   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, n_gt_8_strided_cn) {
19397     TEST_REQUIRES_X86_SSE2;
19398     for (uint32_t n = 9; n < 16; n++) {
19399       for (size_t k = 1; k <= 20; k += 5) {
19400         GemmMicrokernelTester()
19401           .mr(4)
19402           .nr(8)
19403           .kr(1)
19404           .sr(1)
19405           .m(4)
19406           .n(n)
19407           .k(k)
19408           .cn_stride(11)
19409           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19410       }
19411     }
19412   }
19413 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,n_gt_8_strided_a)19414   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, n_gt_8_strided_a) {
19415     TEST_REQUIRES_X86_SSE2;
19416     for (uint32_t n = 9; n < 16; n++) {
19417       for (size_t k = 1; k <= 20; k += 5) {
19418         GemmMicrokernelTester()
19419           .mr(4)
19420           .nr(8)
19421           .kr(1)
19422           .sr(1)
19423           .m(4)
19424           .n(n)
19425           .k(k)
19426           .a_stride(23)
19427           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19428       }
19429     }
19430   }
19431 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,n_gt_8_subtile)19432   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, n_gt_8_subtile) {
19433     TEST_REQUIRES_X86_SSE2;
19434     for (uint32_t n = 9; n < 16; n++) {
19435       for (size_t k = 1; k <= 20; k += 5) {
19436         for (uint32_t m = 1; m <= 4; m++) {
19437           GemmMicrokernelTester()
19438             .mr(4)
19439             .nr(8)
19440             .kr(1)
19441             .sr(1)
19442             .m(m)
19443             .n(n)
19444             .k(k)
19445             .iterations(1)
19446             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19447         }
19448       }
19449     }
19450   }
19451 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,n_div_8)19452   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, n_div_8) {
19453     TEST_REQUIRES_X86_SSE2;
19454     for (uint32_t n = 16; n <= 24; n += 8) {
19455       for (size_t k = 1; k <= 20; k += 5) {
19456         GemmMicrokernelTester()
19457           .mr(4)
19458           .nr(8)
19459           .kr(1)
19460           .sr(1)
19461           .m(4)
19462           .n(n)
19463           .k(k)
19464           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19465       }
19466     }
19467   }
19468 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,n_div_8_strided_cn)19469   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, n_div_8_strided_cn) {
19470     TEST_REQUIRES_X86_SSE2;
19471     for (uint32_t n = 16; n <= 24; n += 8) {
19472       for (size_t k = 1; k <= 20; k += 5) {
19473         GemmMicrokernelTester()
19474           .mr(4)
19475           .nr(8)
19476           .kr(1)
19477           .sr(1)
19478           .m(4)
19479           .n(n)
19480           .k(k)
19481           .cn_stride(11)
19482           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19483       }
19484     }
19485   }
19486 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,n_div_8_strided_a)19487   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, n_div_8_strided_a) {
19488     TEST_REQUIRES_X86_SSE2;
19489     for (uint32_t n = 16; n <= 24; n += 8) {
19490       for (size_t k = 1; k <= 20; k += 5) {
19491         GemmMicrokernelTester()
19492           .mr(4)
19493           .nr(8)
19494           .kr(1)
19495           .sr(1)
19496           .m(4)
19497           .n(n)
19498           .k(k)
19499           .a_stride(23)
19500           .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19501       }
19502     }
19503   }
19504 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,n_div_8_subtile)19505   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, n_div_8_subtile) {
19506     TEST_REQUIRES_X86_SSE2;
19507     for (uint32_t n = 16; n <= 24; n += 8) {
19508       for (size_t k = 1; k <= 20; k += 5) {
19509         for (uint32_t m = 1; m <= 4; m++) {
19510           GemmMicrokernelTester()
19511             .mr(4)
19512             .nr(8)
19513             .kr(1)
19514             .sr(1)
19515             .m(m)
19516             .n(n)
19517             .k(k)
19518             .iterations(1)
19519             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19520         }
19521       }
19522     }
19523   }
19524 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,strided_cm_subtile)19525   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, strided_cm_subtile) {
19526     TEST_REQUIRES_X86_SSE2;
19527     for (size_t k = 1; k <= 20; k += 5) {
19528       for (uint32_t n = 1; n <= 8; n++) {
19529         for (uint32_t m = 1; m <= 4; m++) {
19530           GemmMicrokernelTester()
19531             .mr(4)
19532             .nr(8)
19533             .kr(1)
19534             .sr(1)
19535             .m(m)
19536             .n(n)
19537             .k(k)
19538             .cm_stride(11)
19539             .iterations(1)
19540             .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19541         }
19542       }
19543     }
19544   }
19545 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,qmin)19546   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, qmin) {
19547     TEST_REQUIRES_X86_SSE2;
19548     GemmMicrokernelTester()
19549       .mr(4)
19550       .nr(8)
19551       .kr(1)
19552       .sr(1)
19553       .m(4)
19554       .n(8)
19555       .k(4)
19556       .qmin(128)
19557       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19558   }
19559 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,qmax)19560   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, qmax) {
19561     TEST_REQUIRES_X86_SSE2;
19562     GemmMicrokernelTester()
19563       .mr(4)
19564       .nr(8)
19565       .kr(1)
19566       .sr(1)
19567       .m(4)
19568       .n(8)
19569       .k(4)
19570       .qmax(128)
19571       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19572   }
19573 
TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP,strided_cm)19574   TEST(F32_GEMM_MINMAX_4X8__SSE2_DUP, strided_cm) {
19575     TEST_REQUIRES_X86_SSE2;
19576     GemmMicrokernelTester()
19577       .mr(4)
19578       .nr(8)
19579       .kr(1)
19580       .sr(1)
19581       .m(4)
19582       .n(8)
19583       .k(4)
19584       .cm_stride(11)
19585       .Test(xnn_f32_gemm_minmax_ukernel_4x8__sse2_dup, xnn_init_f32_minmax_sse_params);
19586   }
19587 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
19588 
19589 
19590 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_eq_4)19591   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_eq_4) {
19592     TEST_REQUIRES_X86_SSE;
19593     GemmMicrokernelTester()
19594       .mr(4)
19595       .nr(8)
19596       .kr(1)
19597       .sr(4)
19598       .m(4)
19599       .n(8)
19600       .k(4)
19601       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19602   }
19603 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,strided_cn)19604   TEST(F32_GEMM_MINMAX_4X8S4__SSE, strided_cn) {
19605     TEST_REQUIRES_X86_SSE;
19606     GemmMicrokernelTester()
19607       .mr(4)
19608       .nr(8)
19609       .kr(1)
19610       .sr(4)
19611       .m(4)
19612       .n(8)
19613       .k(4)
19614       .cn_stride(11)
19615       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19616   }
19617 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_eq_4_strided_a)19618   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_eq_4_strided_a) {
19619     TEST_REQUIRES_X86_SSE;
19620     GemmMicrokernelTester()
19621       .mr(4)
19622       .nr(8)
19623       .kr(1)
19624       .sr(4)
19625       .m(4)
19626       .n(8)
19627       .k(4)
19628       .a_stride(7)
19629       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19630   }
19631 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_eq_4_subtile)19632   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_eq_4_subtile) {
19633     TEST_REQUIRES_X86_SSE;
19634     for (uint32_t n = 1; n <= 8; n++) {
19635       for (uint32_t m = 1; m <= 4; m++) {
19636         GemmMicrokernelTester()
19637           .mr(4)
19638           .nr(8)
19639           .kr(1)
19640           .sr(4)
19641           .m(m)
19642           .n(n)
19643           .k(4)
19644           .iterations(1)
19645           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19646       }
19647     }
19648   }
19649 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_eq_4_subtile_m)19650   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_eq_4_subtile_m) {
19651     TEST_REQUIRES_X86_SSE;
19652     for (uint32_t m = 1; m <= 4; m++) {
19653       GemmMicrokernelTester()
19654         .mr(4)
19655         .nr(8)
19656         .kr(1)
19657         .sr(4)
19658         .m(m)
19659         .n(8)
19660         .k(4)
19661         .iterations(1)
19662         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19663     }
19664   }
19665 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_eq_4_subtile_n)19666   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_eq_4_subtile_n) {
19667     TEST_REQUIRES_X86_SSE;
19668     for (uint32_t n = 1; n <= 8; n++) {
19669       GemmMicrokernelTester()
19670         .mr(4)
19671         .nr(8)
19672         .kr(1)
19673         .sr(4)
19674         .m(4)
19675         .n(n)
19676         .k(4)
19677         .iterations(1)
19678         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19679     }
19680   }
19681 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_lt_4)19682   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_lt_4) {
19683     TEST_REQUIRES_X86_SSE;
19684     for (size_t k = 1; k < 4; k++) {
19685       GemmMicrokernelTester()
19686         .mr(4)
19687         .nr(8)
19688         .kr(1)
19689         .sr(4)
19690         .m(4)
19691         .n(8)
19692         .k(k)
19693         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19694     }
19695   }
19696 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_lt_4_strided_a)19697   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_lt_4_strided_a) {
19698     TEST_REQUIRES_X86_SSE;
19699     for (size_t k = 1; k < 4; k++) {
19700       GemmMicrokernelTester()
19701         .mr(4)
19702         .nr(8)
19703         .kr(1)
19704         .sr(4)
19705         .m(4)
19706         .n(8)
19707         .k(k)
19708         .a_stride(7)
19709         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19710     }
19711   }
19712 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_lt_4_subtile)19713   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_lt_4_subtile) {
19714     TEST_REQUIRES_X86_SSE;
19715     for (size_t k = 1; k < 4; k++) {
19716       for (uint32_t n = 1; n <= 8; n++) {
19717         for (uint32_t m = 1; m <= 4; m++) {
19718           GemmMicrokernelTester()
19719             .mr(4)
19720             .nr(8)
19721             .kr(1)
19722             .sr(4)
19723             .m(m)
19724             .n(n)
19725             .k(k)
19726             .iterations(1)
19727             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19728         }
19729       }
19730     }
19731   }
19732 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_gt_4)19733   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_gt_4) {
19734     TEST_REQUIRES_X86_SSE;
19735     for (size_t k = 5; k < 8; k++) {
19736       GemmMicrokernelTester()
19737         .mr(4)
19738         .nr(8)
19739         .kr(1)
19740         .sr(4)
19741         .m(4)
19742         .n(8)
19743         .k(k)
19744         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19745     }
19746   }
19747 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_gt_4_strided_a)19748   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_gt_4_strided_a) {
19749     TEST_REQUIRES_X86_SSE;
19750     for (size_t k = 5; k < 8; k++) {
19751       GemmMicrokernelTester()
19752         .mr(4)
19753         .nr(8)
19754         .kr(1)
19755         .sr(4)
19756         .m(4)
19757         .n(8)
19758         .k(k)
19759         .a_stride(11)
19760         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19761     }
19762   }
19763 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_gt_4_subtile)19764   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_gt_4_subtile) {
19765     TEST_REQUIRES_X86_SSE;
19766     for (size_t k = 5; k < 8; k++) {
19767       for (uint32_t n = 1; n <= 8; n++) {
19768         for (uint32_t m = 1; m <= 4; m++) {
19769           GemmMicrokernelTester()
19770             .mr(4)
19771             .nr(8)
19772             .kr(1)
19773             .sr(4)
19774             .m(m)
19775             .n(n)
19776             .k(k)
19777             .iterations(1)
19778             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19779         }
19780       }
19781     }
19782   }
19783 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_div_4)19784   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_div_4) {
19785     TEST_REQUIRES_X86_SSE;
19786     for (size_t k = 8; k <= 40; k += 4) {
19787       GemmMicrokernelTester()
19788         .mr(4)
19789         .nr(8)
19790         .kr(1)
19791         .sr(4)
19792         .m(4)
19793         .n(8)
19794         .k(k)
19795         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19796     }
19797   }
19798 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_div_4_strided_a)19799   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_div_4_strided_a) {
19800     TEST_REQUIRES_X86_SSE;
19801     for (size_t k = 8; k <= 40; k += 4) {
19802       GemmMicrokernelTester()
19803         .mr(4)
19804         .nr(8)
19805         .kr(1)
19806         .sr(4)
19807         .m(4)
19808         .n(8)
19809         .k(k)
19810         .a_stride(43)
19811         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19812     }
19813   }
19814 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,k_div_4_subtile)19815   TEST(F32_GEMM_MINMAX_4X8S4__SSE, k_div_4_subtile) {
19816     TEST_REQUIRES_X86_SSE;
19817     for (size_t k = 8; k <= 40; k += 4) {
19818       for (uint32_t n = 1; n <= 8; n++) {
19819         for (uint32_t m = 1; m <= 4; m++) {
19820           GemmMicrokernelTester()
19821             .mr(4)
19822             .nr(8)
19823             .kr(1)
19824             .sr(4)
19825             .m(m)
19826             .n(n)
19827             .k(k)
19828             .iterations(1)
19829             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19830         }
19831       }
19832     }
19833   }
19834 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,n_gt_8)19835   TEST(F32_GEMM_MINMAX_4X8S4__SSE, n_gt_8) {
19836     TEST_REQUIRES_X86_SSE;
19837     for (uint32_t n = 9; n < 16; n++) {
19838       for (size_t k = 1; k <= 20; k += 5) {
19839         GemmMicrokernelTester()
19840           .mr(4)
19841           .nr(8)
19842           .kr(1)
19843           .sr(4)
19844           .m(4)
19845           .n(n)
19846           .k(k)
19847           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19848       }
19849     }
19850   }
19851 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,n_gt_8_strided_cn)19852   TEST(F32_GEMM_MINMAX_4X8S4__SSE, n_gt_8_strided_cn) {
19853     TEST_REQUIRES_X86_SSE;
19854     for (uint32_t n = 9; n < 16; n++) {
19855       for (size_t k = 1; k <= 20; k += 5) {
19856         GemmMicrokernelTester()
19857           .mr(4)
19858           .nr(8)
19859           .kr(1)
19860           .sr(4)
19861           .m(4)
19862           .n(n)
19863           .k(k)
19864           .cn_stride(11)
19865           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19866       }
19867     }
19868   }
19869 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,n_gt_8_strided_a)19870   TEST(F32_GEMM_MINMAX_4X8S4__SSE, n_gt_8_strided_a) {
19871     TEST_REQUIRES_X86_SSE;
19872     for (uint32_t n = 9; n < 16; n++) {
19873       for (size_t k = 1; k <= 20; k += 5) {
19874         GemmMicrokernelTester()
19875           .mr(4)
19876           .nr(8)
19877           .kr(1)
19878           .sr(4)
19879           .m(4)
19880           .n(n)
19881           .k(k)
19882           .a_stride(23)
19883           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19884       }
19885     }
19886   }
19887 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,n_gt_8_subtile)19888   TEST(F32_GEMM_MINMAX_4X8S4__SSE, n_gt_8_subtile) {
19889     TEST_REQUIRES_X86_SSE;
19890     for (uint32_t n = 9; n < 16; n++) {
19891       for (size_t k = 1; k <= 20; k += 5) {
19892         for (uint32_t m = 1; m <= 4; m++) {
19893           GemmMicrokernelTester()
19894             .mr(4)
19895             .nr(8)
19896             .kr(1)
19897             .sr(4)
19898             .m(m)
19899             .n(n)
19900             .k(k)
19901             .iterations(1)
19902             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19903         }
19904       }
19905     }
19906   }
19907 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,n_div_8)19908   TEST(F32_GEMM_MINMAX_4X8S4__SSE, n_div_8) {
19909     TEST_REQUIRES_X86_SSE;
19910     for (uint32_t n = 16; n <= 24; n += 8) {
19911       for (size_t k = 1; k <= 20; k += 5) {
19912         GemmMicrokernelTester()
19913           .mr(4)
19914           .nr(8)
19915           .kr(1)
19916           .sr(4)
19917           .m(4)
19918           .n(n)
19919           .k(k)
19920           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19921       }
19922     }
19923   }
19924 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,n_div_8_strided_cn)19925   TEST(F32_GEMM_MINMAX_4X8S4__SSE, n_div_8_strided_cn) {
19926     TEST_REQUIRES_X86_SSE;
19927     for (uint32_t n = 16; n <= 24; n += 8) {
19928       for (size_t k = 1; k <= 20; k += 5) {
19929         GemmMicrokernelTester()
19930           .mr(4)
19931           .nr(8)
19932           .kr(1)
19933           .sr(4)
19934           .m(4)
19935           .n(n)
19936           .k(k)
19937           .cn_stride(11)
19938           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19939       }
19940     }
19941   }
19942 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,n_div_8_strided_a)19943   TEST(F32_GEMM_MINMAX_4X8S4__SSE, n_div_8_strided_a) {
19944     TEST_REQUIRES_X86_SSE;
19945     for (uint32_t n = 16; n <= 24; n += 8) {
19946       for (size_t k = 1; k <= 20; k += 5) {
19947         GemmMicrokernelTester()
19948           .mr(4)
19949           .nr(8)
19950           .kr(1)
19951           .sr(4)
19952           .m(4)
19953           .n(n)
19954           .k(k)
19955           .a_stride(23)
19956           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19957       }
19958     }
19959   }
19960 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,n_div_8_subtile)19961   TEST(F32_GEMM_MINMAX_4X8S4__SSE, n_div_8_subtile) {
19962     TEST_REQUIRES_X86_SSE;
19963     for (uint32_t n = 16; n <= 24; n += 8) {
19964       for (size_t k = 1; k <= 20; k += 5) {
19965         for (uint32_t m = 1; m <= 4; m++) {
19966           GemmMicrokernelTester()
19967             .mr(4)
19968             .nr(8)
19969             .kr(1)
19970             .sr(4)
19971             .m(m)
19972             .n(n)
19973             .k(k)
19974             .iterations(1)
19975             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19976         }
19977       }
19978     }
19979   }
19980 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,strided_cm_subtile)19981   TEST(F32_GEMM_MINMAX_4X8S4__SSE, strided_cm_subtile) {
19982     TEST_REQUIRES_X86_SSE;
19983     for (size_t k = 1; k <= 20; k += 5) {
19984       for (uint32_t n = 1; n <= 8; n++) {
19985         for (uint32_t m = 1; m <= 4; m++) {
19986           GemmMicrokernelTester()
19987             .mr(4)
19988             .nr(8)
19989             .kr(1)
19990             .sr(4)
19991             .m(m)
19992             .n(n)
19993             .k(k)
19994             .cm_stride(11)
19995             .iterations(1)
19996             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
19997         }
19998       }
19999     }
20000   }
20001 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,qmin)20002   TEST(F32_GEMM_MINMAX_4X8S4__SSE, qmin) {
20003     TEST_REQUIRES_X86_SSE;
20004     GemmMicrokernelTester()
20005       .mr(4)
20006       .nr(8)
20007       .kr(1)
20008       .sr(4)
20009       .m(4)
20010       .n(8)
20011       .k(4)
20012       .qmin(128)
20013       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
20014   }
20015 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,qmax)20016   TEST(F32_GEMM_MINMAX_4X8S4__SSE, qmax) {
20017     TEST_REQUIRES_X86_SSE;
20018     GemmMicrokernelTester()
20019       .mr(4)
20020       .nr(8)
20021       .kr(1)
20022       .sr(4)
20023       .m(4)
20024       .n(8)
20025       .k(4)
20026       .qmax(128)
20027       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
20028   }
20029 
TEST(F32_GEMM_MINMAX_4X8S4__SSE,strided_cm)20030   TEST(F32_GEMM_MINMAX_4X8S4__SSE, strided_cm) {
20031     TEST_REQUIRES_X86_SSE;
20032     GemmMicrokernelTester()
20033       .mr(4)
20034       .nr(8)
20035       .kr(1)
20036       .sr(4)
20037       .m(4)
20038       .n(8)
20039       .k(4)
20040       .cm_stride(11)
20041       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__sse, xnn_init_f32_minmax_sse_params);
20042   }
20043 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
20044 
20045 
20046 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_eq_4)20047   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_eq_4) {
20048     TEST_REQUIRES_X86_SSE;
20049     GemmMicrokernelTester()
20050       .mr(5)
20051       .nr(8)
20052       .kr(1)
20053       .sr(4)
20054       .m(5)
20055       .n(8)
20056       .k(4)
20057       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20058   }
20059 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,strided_cn)20060   TEST(F32_GEMM_MINMAX_5X8S4__SSE, strided_cn) {
20061     TEST_REQUIRES_X86_SSE;
20062     GemmMicrokernelTester()
20063       .mr(5)
20064       .nr(8)
20065       .kr(1)
20066       .sr(4)
20067       .m(5)
20068       .n(8)
20069       .k(4)
20070       .cn_stride(11)
20071       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20072   }
20073 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_eq_4_strided_a)20074   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_eq_4_strided_a) {
20075     TEST_REQUIRES_X86_SSE;
20076     GemmMicrokernelTester()
20077       .mr(5)
20078       .nr(8)
20079       .kr(1)
20080       .sr(4)
20081       .m(5)
20082       .n(8)
20083       .k(4)
20084       .a_stride(7)
20085       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20086   }
20087 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_eq_4_subtile)20088   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_eq_4_subtile) {
20089     TEST_REQUIRES_X86_SSE;
20090     for (uint32_t n = 1; n <= 8; n++) {
20091       for (uint32_t m = 1; m <= 5; m++) {
20092         GemmMicrokernelTester()
20093           .mr(5)
20094           .nr(8)
20095           .kr(1)
20096           .sr(4)
20097           .m(m)
20098           .n(n)
20099           .k(4)
20100           .iterations(1)
20101           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20102       }
20103     }
20104   }
20105 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_eq_4_subtile_m)20106   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_eq_4_subtile_m) {
20107     TEST_REQUIRES_X86_SSE;
20108     for (uint32_t m = 1; m <= 5; m++) {
20109       GemmMicrokernelTester()
20110         .mr(5)
20111         .nr(8)
20112         .kr(1)
20113         .sr(4)
20114         .m(m)
20115         .n(8)
20116         .k(4)
20117         .iterations(1)
20118         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20119     }
20120   }
20121 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_eq_4_subtile_n)20122   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_eq_4_subtile_n) {
20123     TEST_REQUIRES_X86_SSE;
20124     for (uint32_t n = 1; n <= 8; n++) {
20125       GemmMicrokernelTester()
20126         .mr(5)
20127         .nr(8)
20128         .kr(1)
20129         .sr(4)
20130         .m(5)
20131         .n(n)
20132         .k(4)
20133         .iterations(1)
20134         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20135     }
20136   }
20137 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_lt_4)20138   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_lt_4) {
20139     TEST_REQUIRES_X86_SSE;
20140     for (size_t k = 1; k < 4; k++) {
20141       GemmMicrokernelTester()
20142         .mr(5)
20143         .nr(8)
20144         .kr(1)
20145         .sr(4)
20146         .m(5)
20147         .n(8)
20148         .k(k)
20149         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20150     }
20151   }
20152 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_lt_4_strided_a)20153   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_lt_4_strided_a) {
20154     TEST_REQUIRES_X86_SSE;
20155     for (size_t k = 1; k < 4; k++) {
20156       GemmMicrokernelTester()
20157         .mr(5)
20158         .nr(8)
20159         .kr(1)
20160         .sr(4)
20161         .m(5)
20162         .n(8)
20163         .k(k)
20164         .a_stride(7)
20165         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20166     }
20167   }
20168 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_lt_4_subtile)20169   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_lt_4_subtile) {
20170     TEST_REQUIRES_X86_SSE;
20171     for (size_t k = 1; k < 4; k++) {
20172       for (uint32_t n = 1; n <= 8; n++) {
20173         for (uint32_t m = 1; m <= 5; m++) {
20174           GemmMicrokernelTester()
20175             .mr(5)
20176             .nr(8)
20177             .kr(1)
20178             .sr(4)
20179             .m(m)
20180             .n(n)
20181             .k(k)
20182             .iterations(1)
20183             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20184         }
20185       }
20186     }
20187   }
20188 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_gt_4)20189   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_gt_4) {
20190     TEST_REQUIRES_X86_SSE;
20191     for (size_t k = 5; k < 8; k++) {
20192       GemmMicrokernelTester()
20193         .mr(5)
20194         .nr(8)
20195         .kr(1)
20196         .sr(4)
20197         .m(5)
20198         .n(8)
20199         .k(k)
20200         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20201     }
20202   }
20203 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_gt_4_strided_a)20204   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_gt_4_strided_a) {
20205     TEST_REQUIRES_X86_SSE;
20206     for (size_t k = 5; k < 8; k++) {
20207       GemmMicrokernelTester()
20208         .mr(5)
20209         .nr(8)
20210         .kr(1)
20211         .sr(4)
20212         .m(5)
20213         .n(8)
20214         .k(k)
20215         .a_stride(11)
20216         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20217     }
20218   }
20219 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_gt_4_subtile)20220   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_gt_4_subtile) {
20221     TEST_REQUIRES_X86_SSE;
20222     for (size_t k = 5; k < 8; k++) {
20223       for (uint32_t n = 1; n <= 8; n++) {
20224         for (uint32_t m = 1; m <= 5; m++) {
20225           GemmMicrokernelTester()
20226             .mr(5)
20227             .nr(8)
20228             .kr(1)
20229             .sr(4)
20230             .m(m)
20231             .n(n)
20232             .k(k)
20233             .iterations(1)
20234             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20235         }
20236       }
20237     }
20238   }
20239 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_div_4)20240   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_div_4) {
20241     TEST_REQUIRES_X86_SSE;
20242     for (size_t k = 8; k <= 40; k += 4) {
20243       GemmMicrokernelTester()
20244         .mr(5)
20245         .nr(8)
20246         .kr(1)
20247         .sr(4)
20248         .m(5)
20249         .n(8)
20250         .k(k)
20251         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20252     }
20253   }
20254 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_div_4_strided_a)20255   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_div_4_strided_a) {
20256     TEST_REQUIRES_X86_SSE;
20257     for (size_t k = 8; k <= 40; k += 4) {
20258       GemmMicrokernelTester()
20259         .mr(5)
20260         .nr(8)
20261         .kr(1)
20262         .sr(4)
20263         .m(5)
20264         .n(8)
20265         .k(k)
20266         .a_stride(43)
20267         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20268     }
20269   }
20270 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,k_div_4_subtile)20271   TEST(F32_GEMM_MINMAX_5X8S4__SSE, k_div_4_subtile) {
20272     TEST_REQUIRES_X86_SSE;
20273     for (size_t k = 8; k <= 40; k += 4) {
20274       for (uint32_t n = 1; n <= 8; n++) {
20275         for (uint32_t m = 1; m <= 5; m++) {
20276           GemmMicrokernelTester()
20277             .mr(5)
20278             .nr(8)
20279             .kr(1)
20280             .sr(4)
20281             .m(m)
20282             .n(n)
20283             .k(k)
20284             .iterations(1)
20285             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20286         }
20287       }
20288     }
20289   }
20290 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,n_gt_8)20291   TEST(F32_GEMM_MINMAX_5X8S4__SSE, n_gt_8) {
20292     TEST_REQUIRES_X86_SSE;
20293     for (uint32_t n = 9; n < 16; n++) {
20294       for (size_t k = 1; k <= 20; k += 5) {
20295         GemmMicrokernelTester()
20296           .mr(5)
20297           .nr(8)
20298           .kr(1)
20299           .sr(4)
20300           .m(5)
20301           .n(n)
20302           .k(k)
20303           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20304       }
20305     }
20306   }
20307 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,n_gt_8_strided_cn)20308   TEST(F32_GEMM_MINMAX_5X8S4__SSE, n_gt_8_strided_cn) {
20309     TEST_REQUIRES_X86_SSE;
20310     for (uint32_t n = 9; n < 16; n++) {
20311       for (size_t k = 1; k <= 20; k += 5) {
20312         GemmMicrokernelTester()
20313           .mr(5)
20314           .nr(8)
20315           .kr(1)
20316           .sr(4)
20317           .m(5)
20318           .n(n)
20319           .k(k)
20320           .cn_stride(11)
20321           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20322       }
20323     }
20324   }
20325 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,n_gt_8_strided_a)20326   TEST(F32_GEMM_MINMAX_5X8S4__SSE, n_gt_8_strided_a) {
20327     TEST_REQUIRES_X86_SSE;
20328     for (uint32_t n = 9; n < 16; n++) {
20329       for (size_t k = 1; k <= 20; k += 5) {
20330         GemmMicrokernelTester()
20331           .mr(5)
20332           .nr(8)
20333           .kr(1)
20334           .sr(4)
20335           .m(5)
20336           .n(n)
20337           .k(k)
20338           .a_stride(23)
20339           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20340       }
20341     }
20342   }
20343 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,n_gt_8_subtile)20344   TEST(F32_GEMM_MINMAX_5X8S4__SSE, n_gt_8_subtile) {
20345     TEST_REQUIRES_X86_SSE;
20346     for (uint32_t n = 9; n < 16; n++) {
20347       for (size_t k = 1; k <= 20; k += 5) {
20348         for (uint32_t m = 1; m <= 5; m++) {
20349           GemmMicrokernelTester()
20350             .mr(5)
20351             .nr(8)
20352             .kr(1)
20353             .sr(4)
20354             .m(m)
20355             .n(n)
20356             .k(k)
20357             .iterations(1)
20358             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20359         }
20360       }
20361     }
20362   }
20363 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,n_div_8)20364   TEST(F32_GEMM_MINMAX_5X8S4__SSE, n_div_8) {
20365     TEST_REQUIRES_X86_SSE;
20366     for (uint32_t n = 16; n <= 24; n += 8) {
20367       for (size_t k = 1; k <= 20; k += 5) {
20368         GemmMicrokernelTester()
20369           .mr(5)
20370           .nr(8)
20371           .kr(1)
20372           .sr(4)
20373           .m(5)
20374           .n(n)
20375           .k(k)
20376           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20377       }
20378     }
20379   }
20380 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,n_div_8_strided_cn)20381   TEST(F32_GEMM_MINMAX_5X8S4__SSE, n_div_8_strided_cn) {
20382     TEST_REQUIRES_X86_SSE;
20383     for (uint32_t n = 16; n <= 24; n += 8) {
20384       for (size_t k = 1; k <= 20; k += 5) {
20385         GemmMicrokernelTester()
20386           .mr(5)
20387           .nr(8)
20388           .kr(1)
20389           .sr(4)
20390           .m(5)
20391           .n(n)
20392           .k(k)
20393           .cn_stride(11)
20394           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20395       }
20396     }
20397   }
20398 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,n_div_8_strided_a)20399   TEST(F32_GEMM_MINMAX_5X8S4__SSE, n_div_8_strided_a) {
20400     TEST_REQUIRES_X86_SSE;
20401     for (uint32_t n = 16; n <= 24; n += 8) {
20402       for (size_t k = 1; k <= 20; k += 5) {
20403         GemmMicrokernelTester()
20404           .mr(5)
20405           .nr(8)
20406           .kr(1)
20407           .sr(4)
20408           .m(5)
20409           .n(n)
20410           .k(k)
20411           .a_stride(23)
20412           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20413       }
20414     }
20415   }
20416 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,n_div_8_subtile)20417   TEST(F32_GEMM_MINMAX_5X8S4__SSE, n_div_8_subtile) {
20418     TEST_REQUIRES_X86_SSE;
20419     for (uint32_t n = 16; n <= 24; n += 8) {
20420       for (size_t k = 1; k <= 20; k += 5) {
20421         for (uint32_t m = 1; m <= 5; m++) {
20422           GemmMicrokernelTester()
20423             .mr(5)
20424             .nr(8)
20425             .kr(1)
20426             .sr(4)
20427             .m(m)
20428             .n(n)
20429             .k(k)
20430             .iterations(1)
20431             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20432         }
20433       }
20434     }
20435   }
20436 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,strided_cm_subtile)20437   TEST(F32_GEMM_MINMAX_5X8S4__SSE, strided_cm_subtile) {
20438     TEST_REQUIRES_X86_SSE;
20439     for (size_t k = 1; k <= 20; k += 5) {
20440       for (uint32_t n = 1; n <= 8; n++) {
20441         for (uint32_t m = 1; m <= 5; m++) {
20442           GemmMicrokernelTester()
20443             .mr(5)
20444             .nr(8)
20445             .kr(1)
20446             .sr(4)
20447             .m(m)
20448             .n(n)
20449             .k(k)
20450             .cm_stride(11)
20451             .iterations(1)
20452             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20453         }
20454       }
20455     }
20456   }
20457 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,qmin)20458   TEST(F32_GEMM_MINMAX_5X8S4__SSE, qmin) {
20459     TEST_REQUIRES_X86_SSE;
20460     GemmMicrokernelTester()
20461       .mr(5)
20462       .nr(8)
20463       .kr(1)
20464       .sr(4)
20465       .m(5)
20466       .n(8)
20467       .k(4)
20468       .qmin(128)
20469       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20470   }
20471 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,qmax)20472   TEST(F32_GEMM_MINMAX_5X8S4__SSE, qmax) {
20473     TEST_REQUIRES_X86_SSE;
20474     GemmMicrokernelTester()
20475       .mr(5)
20476       .nr(8)
20477       .kr(1)
20478       .sr(4)
20479       .m(5)
20480       .n(8)
20481       .k(4)
20482       .qmax(128)
20483       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20484   }
20485 
TEST(F32_GEMM_MINMAX_5X8S4__SSE,strided_cm)20486   TEST(F32_GEMM_MINMAX_5X8S4__SSE, strided_cm) {
20487     TEST_REQUIRES_X86_SSE;
20488     GemmMicrokernelTester()
20489       .mr(5)
20490       .nr(8)
20491       .kr(1)
20492       .sr(4)
20493       .m(5)
20494       .n(8)
20495       .k(4)
20496       .cm_stride(11)
20497       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__sse, xnn_init_f32_minmax_sse_params);
20498   }
20499 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
20500 
20501 
20502 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,k_eq_1)20503   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, k_eq_1) {
20504     TEST_REQUIRES_X86_AVX;
20505     GemmMicrokernelTester()
20506       .mr(1)
20507       .nr(16)
20508       .kr(1)
20509       .sr(1)
20510       .m(1)
20511       .n(16)
20512       .k(1)
20513       .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20514   }
20515 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,strided_cn)20516   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, strided_cn) {
20517     TEST_REQUIRES_X86_AVX;
20518     GemmMicrokernelTester()
20519       .mr(1)
20520       .nr(16)
20521       .kr(1)
20522       .sr(1)
20523       .m(1)
20524       .n(16)
20525       .k(1)
20526       .cn_stride(19)
20527       .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20528   }
20529 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,k_eq_1_strided_a)20530   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, k_eq_1_strided_a) {
20531     TEST_REQUIRES_X86_AVX;
20532     GemmMicrokernelTester()
20533       .mr(1)
20534       .nr(16)
20535       .kr(1)
20536       .sr(1)
20537       .m(1)
20538       .n(16)
20539       .k(1)
20540       .a_stride(3)
20541       .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20542   }
20543 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,k_eq_1_subtile)20544   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, k_eq_1_subtile) {
20545     TEST_REQUIRES_X86_AVX;
20546     for (uint32_t n = 1; n <= 16; n++) {
20547       for (uint32_t m = 1; m <= 1; m++) {
20548         GemmMicrokernelTester()
20549           .mr(1)
20550           .nr(16)
20551           .kr(1)
20552           .sr(1)
20553           .m(m)
20554           .n(n)
20555           .k(1)
20556           .iterations(1)
20557           .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20558       }
20559     }
20560   }
20561 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,k_eq_1_subtile_m)20562   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, k_eq_1_subtile_m) {
20563     TEST_REQUIRES_X86_AVX;
20564     for (uint32_t m = 1; m <= 1; m++) {
20565       GemmMicrokernelTester()
20566         .mr(1)
20567         .nr(16)
20568         .kr(1)
20569         .sr(1)
20570         .m(m)
20571         .n(16)
20572         .k(1)
20573         .iterations(1)
20574         .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20575     }
20576   }
20577 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,k_eq_1_subtile_n)20578   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, k_eq_1_subtile_n) {
20579     TEST_REQUIRES_X86_AVX;
20580     for (uint32_t n = 1; n <= 16; n++) {
20581       GemmMicrokernelTester()
20582         .mr(1)
20583         .nr(16)
20584         .kr(1)
20585         .sr(1)
20586         .m(1)
20587         .n(n)
20588         .k(1)
20589         .iterations(1)
20590         .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20591     }
20592   }
20593 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,k_gt_1)20594   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, k_gt_1) {
20595     TEST_REQUIRES_X86_AVX;
20596     for (size_t k = 2; k < 10; k++) {
20597       GemmMicrokernelTester()
20598         .mr(1)
20599         .nr(16)
20600         .kr(1)
20601         .sr(1)
20602         .m(1)
20603         .n(16)
20604         .k(k)
20605         .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20606     }
20607   }
20608 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,k_gt_1_strided_a)20609   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, k_gt_1_strided_a) {
20610     TEST_REQUIRES_X86_AVX;
20611     for (size_t k = 2; k < 10; k++) {
20612       GemmMicrokernelTester()
20613         .mr(1)
20614         .nr(16)
20615         .kr(1)
20616         .sr(1)
20617         .m(1)
20618         .n(16)
20619         .k(k)
20620         .a_stride(11)
20621         .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20622     }
20623   }
20624 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,k_gt_1_subtile)20625   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, k_gt_1_subtile) {
20626     TEST_REQUIRES_X86_AVX;
20627     for (size_t k = 2; k < 10; k++) {
20628       for (uint32_t n = 1; n <= 16; n++) {
20629         for (uint32_t m = 1; m <= 1; m++) {
20630           GemmMicrokernelTester()
20631             .mr(1)
20632             .nr(16)
20633             .kr(1)
20634             .sr(1)
20635             .m(m)
20636             .n(n)
20637             .k(k)
20638             .iterations(1)
20639             .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20640         }
20641       }
20642     }
20643   }
20644 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,n_gt_16)20645   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, n_gt_16) {
20646     TEST_REQUIRES_X86_AVX;
20647     for (uint32_t n = 17; n < 32; n++) {
20648       for (size_t k = 1; k <= 5; k += 2) {
20649         GemmMicrokernelTester()
20650           .mr(1)
20651           .nr(16)
20652           .kr(1)
20653           .sr(1)
20654           .m(1)
20655           .n(n)
20656           .k(k)
20657           .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20658       }
20659     }
20660   }
20661 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,n_gt_16_strided_cn)20662   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, n_gt_16_strided_cn) {
20663     TEST_REQUIRES_X86_AVX;
20664     for (uint32_t n = 17; n < 32; n++) {
20665       for (size_t k = 1; k <= 5; k += 2) {
20666         GemmMicrokernelTester()
20667           .mr(1)
20668           .nr(16)
20669           .kr(1)
20670           .sr(1)
20671           .m(1)
20672           .n(n)
20673           .k(k)
20674           .cn_stride(19)
20675           .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20676       }
20677     }
20678   }
20679 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,n_gt_16_strided_a)20680   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, n_gt_16_strided_a) {
20681     TEST_REQUIRES_X86_AVX;
20682     for (uint32_t n = 17; n < 32; n++) {
20683       for (size_t k = 1; k <= 5; k += 2) {
20684         GemmMicrokernelTester()
20685           .mr(1)
20686           .nr(16)
20687           .kr(1)
20688           .sr(1)
20689           .m(1)
20690           .n(n)
20691           .k(k)
20692           .a_stride(7)
20693           .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20694       }
20695     }
20696   }
20697 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,n_gt_16_subtile)20698   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, n_gt_16_subtile) {
20699     TEST_REQUIRES_X86_AVX;
20700     for (uint32_t n = 17; n < 32; n++) {
20701       for (size_t k = 1; k <= 5; k += 2) {
20702         for (uint32_t m = 1; m <= 1; m++) {
20703           GemmMicrokernelTester()
20704             .mr(1)
20705             .nr(16)
20706             .kr(1)
20707             .sr(1)
20708             .m(m)
20709             .n(n)
20710             .k(k)
20711             .iterations(1)
20712             .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20713         }
20714       }
20715     }
20716   }
20717 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,n_div_16)20718   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, n_div_16) {
20719     TEST_REQUIRES_X86_AVX;
20720     for (uint32_t n = 32; n <= 48; n += 16) {
20721       for (size_t k = 1; k <= 5; k += 2) {
20722         GemmMicrokernelTester()
20723           .mr(1)
20724           .nr(16)
20725           .kr(1)
20726           .sr(1)
20727           .m(1)
20728           .n(n)
20729           .k(k)
20730           .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20731       }
20732     }
20733   }
20734 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,n_div_16_strided_cn)20735   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, n_div_16_strided_cn) {
20736     TEST_REQUIRES_X86_AVX;
20737     for (uint32_t n = 32; n <= 48; n += 16) {
20738       for (size_t k = 1; k <= 5; k += 2) {
20739         GemmMicrokernelTester()
20740           .mr(1)
20741           .nr(16)
20742           .kr(1)
20743           .sr(1)
20744           .m(1)
20745           .n(n)
20746           .k(k)
20747           .cn_stride(19)
20748           .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20749       }
20750     }
20751   }
20752 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,n_div_16_strided_a)20753   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, n_div_16_strided_a) {
20754     TEST_REQUIRES_X86_AVX;
20755     for (uint32_t n = 32; n <= 48; n += 16) {
20756       for (size_t k = 1; k <= 5; k += 2) {
20757         GemmMicrokernelTester()
20758           .mr(1)
20759           .nr(16)
20760           .kr(1)
20761           .sr(1)
20762           .m(1)
20763           .n(n)
20764           .k(k)
20765           .a_stride(7)
20766           .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20767       }
20768     }
20769   }
20770 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,n_div_16_subtile)20771   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, n_div_16_subtile) {
20772     TEST_REQUIRES_X86_AVX;
20773     for (uint32_t n = 32; n <= 48; n += 16) {
20774       for (size_t k = 1; k <= 5; k += 2) {
20775         for (uint32_t m = 1; m <= 1; m++) {
20776           GemmMicrokernelTester()
20777             .mr(1)
20778             .nr(16)
20779             .kr(1)
20780             .sr(1)
20781             .m(m)
20782             .n(n)
20783             .k(k)
20784             .iterations(1)
20785             .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20786         }
20787       }
20788     }
20789   }
20790 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,strided_cm_subtile)20791   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, strided_cm_subtile) {
20792     TEST_REQUIRES_X86_AVX;
20793     for (size_t k = 1; k <= 5; k += 2) {
20794       for (uint32_t n = 1; n <= 16; n++) {
20795         for (uint32_t m = 1; m <= 1; m++) {
20796           GemmMicrokernelTester()
20797             .mr(1)
20798             .nr(16)
20799             .kr(1)
20800             .sr(1)
20801             .m(m)
20802             .n(n)
20803             .k(k)
20804             .cm_stride(19)
20805             .iterations(1)
20806             .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20807         }
20808       }
20809     }
20810   }
20811 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,qmin)20812   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, qmin) {
20813     TEST_REQUIRES_X86_AVX;
20814     GemmMicrokernelTester()
20815       .mr(1)
20816       .nr(16)
20817       .kr(1)
20818       .sr(1)
20819       .m(1)
20820       .n(16)
20821       .k(1)
20822       .qmin(128)
20823       .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20824   }
20825 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,qmax)20826   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, qmax) {
20827     TEST_REQUIRES_X86_AVX;
20828     GemmMicrokernelTester()
20829       .mr(1)
20830       .nr(16)
20831       .kr(1)
20832       .sr(1)
20833       .m(1)
20834       .n(16)
20835       .k(1)
20836       .qmax(128)
20837       .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20838   }
20839 
TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST,strided_cm)20840   TEST(F32_GEMM_MINMAX_1X16__AVX_BROADCAST, strided_cm) {
20841     TEST_REQUIRES_X86_AVX;
20842     GemmMicrokernelTester()
20843       .mr(1)
20844       .nr(16)
20845       .kr(1)
20846       .sr(1)
20847       .m(1)
20848       .n(16)
20849       .k(1)
20850       .cm_stride(19)
20851       .Test(xnn_f32_gemm_minmax_ukernel_1x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
20852   }
20853 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
20854 
20855 
20856 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,k_eq_1)20857   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, k_eq_1) {
20858     TEST_REQUIRES_X86_AVX;
20859     GemmMicrokernelTester()
20860       .mr(4)
20861       .nr(8)
20862       .kr(1)
20863       .sr(1)
20864       .m(4)
20865       .n(8)
20866       .k(1)
20867       .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
20868   }
20869 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,strided_cn)20870   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, strided_cn) {
20871     TEST_REQUIRES_X86_AVX;
20872     GemmMicrokernelTester()
20873       .mr(4)
20874       .nr(8)
20875       .kr(1)
20876       .sr(1)
20877       .m(4)
20878       .n(8)
20879       .k(1)
20880       .cn_stride(11)
20881       .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
20882   }
20883 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,k_eq_1_strided_a)20884   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, k_eq_1_strided_a) {
20885     TEST_REQUIRES_X86_AVX;
20886     GemmMicrokernelTester()
20887       .mr(4)
20888       .nr(8)
20889       .kr(1)
20890       .sr(1)
20891       .m(4)
20892       .n(8)
20893       .k(1)
20894       .a_stride(3)
20895       .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
20896   }
20897 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,k_eq_1_subtile)20898   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, k_eq_1_subtile) {
20899     TEST_REQUIRES_X86_AVX;
20900     for (uint32_t n = 1; n <= 8; n++) {
20901       for (uint32_t m = 1; m <= 4; m++) {
20902         GemmMicrokernelTester()
20903           .mr(4)
20904           .nr(8)
20905           .kr(1)
20906           .sr(1)
20907           .m(m)
20908           .n(n)
20909           .k(1)
20910           .iterations(1)
20911           .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
20912       }
20913     }
20914   }
20915 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,k_eq_1_subtile_m)20916   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, k_eq_1_subtile_m) {
20917     TEST_REQUIRES_X86_AVX;
20918     for (uint32_t m = 1; m <= 4; m++) {
20919       GemmMicrokernelTester()
20920         .mr(4)
20921         .nr(8)
20922         .kr(1)
20923         .sr(1)
20924         .m(m)
20925         .n(8)
20926         .k(1)
20927         .iterations(1)
20928         .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
20929     }
20930   }
20931 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,k_eq_1_subtile_n)20932   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, k_eq_1_subtile_n) {
20933     TEST_REQUIRES_X86_AVX;
20934     for (uint32_t n = 1; n <= 8; n++) {
20935       GemmMicrokernelTester()
20936         .mr(4)
20937         .nr(8)
20938         .kr(1)
20939         .sr(1)
20940         .m(4)
20941         .n(n)
20942         .k(1)
20943         .iterations(1)
20944         .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
20945     }
20946   }
20947 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,k_gt_1)20948   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, k_gt_1) {
20949     TEST_REQUIRES_X86_AVX;
20950     for (size_t k = 2; k < 10; k++) {
20951       GemmMicrokernelTester()
20952         .mr(4)
20953         .nr(8)
20954         .kr(1)
20955         .sr(1)
20956         .m(4)
20957         .n(8)
20958         .k(k)
20959         .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
20960     }
20961   }
20962 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,k_gt_1_strided_a)20963   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, k_gt_1_strided_a) {
20964     TEST_REQUIRES_X86_AVX;
20965     for (size_t k = 2; k < 10; k++) {
20966       GemmMicrokernelTester()
20967         .mr(4)
20968         .nr(8)
20969         .kr(1)
20970         .sr(1)
20971         .m(4)
20972         .n(8)
20973         .k(k)
20974         .a_stride(11)
20975         .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
20976     }
20977   }
20978 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,k_gt_1_subtile)20979   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, k_gt_1_subtile) {
20980     TEST_REQUIRES_X86_AVX;
20981     for (size_t k = 2; k < 10; k++) {
20982       for (uint32_t n = 1; n <= 8; n++) {
20983         for (uint32_t m = 1; m <= 4; m++) {
20984           GemmMicrokernelTester()
20985             .mr(4)
20986             .nr(8)
20987             .kr(1)
20988             .sr(1)
20989             .m(m)
20990             .n(n)
20991             .k(k)
20992             .iterations(1)
20993             .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
20994         }
20995       }
20996     }
20997   }
20998 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,n_gt_8)20999   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, n_gt_8) {
21000     TEST_REQUIRES_X86_AVX;
21001     for (uint32_t n = 9; n < 16; n++) {
21002       for (size_t k = 1; k <= 5; k += 2) {
21003         GemmMicrokernelTester()
21004           .mr(4)
21005           .nr(8)
21006           .kr(1)
21007           .sr(1)
21008           .m(4)
21009           .n(n)
21010           .k(k)
21011           .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21012       }
21013     }
21014   }
21015 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,n_gt_8_strided_cn)21016   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, n_gt_8_strided_cn) {
21017     TEST_REQUIRES_X86_AVX;
21018     for (uint32_t n = 9; n < 16; n++) {
21019       for (size_t k = 1; k <= 5; k += 2) {
21020         GemmMicrokernelTester()
21021           .mr(4)
21022           .nr(8)
21023           .kr(1)
21024           .sr(1)
21025           .m(4)
21026           .n(n)
21027           .k(k)
21028           .cn_stride(11)
21029           .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21030       }
21031     }
21032   }
21033 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,n_gt_8_strided_a)21034   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, n_gt_8_strided_a) {
21035     TEST_REQUIRES_X86_AVX;
21036     for (uint32_t n = 9; n < 16; n++) {
21037       for (size_t k = 1; k <= 5; k += 2) {
21038         GemmMicrokernelTester()
21039           .mr(4)
21040           .nr(8)
21041           .kr(1)
21042           .sr(1)
21043           .m(4)
21044           .n(n)
21045           .k(k)
21046           .a_stride(7)
21047           .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21048       }
21049     }
21050   }
21051 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,n_gt_8_subtile)21052   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, n_gt_8_subtile) {
21053     TEST_REQUIRES_X86_AVX;
21054     for (uint32_t n = 9; n < 16; n++) {
21055       for (size_t k = 1; k <= 5; k += 2) {
21056         for (uint32_t m = 1; m <= 4; m++) {
21057           GemmMicrokernelTester()
21058             .mr(4)
21059             .nr(8)
21060             .kr(1)
21061             .sr(1)
21062             .m(m)
21063             .n(n)
21064             .k(k)
21065             .iterations(1)
21066             .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21067         }
21068       }
21069     }
21070   }
21071 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,n_div_8)21072   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, n_div_8) {
21073     TEST_REQUIRES_X86_AVX;
21074     for (uint32_t n = 16; n <= 24; n += 8) {
21075       for (size_t k = 1; k <= 5; k += 2) {
21076         GemmMicrokernelTester()
21077           .mr(4)
21078           .nr(8)
21079           .kr(1)
21080           .sr(1)
21081           .m(4)
21082           .n(n)
21083           .k(k)
21084           .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21085       }
21086     }
21087   }
21088 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,n_div_8_strided_cn)21089   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, n_div_8_strided_cn) {
21090     TEST_REQUIRES_X86_AVX;
21091     for (uint32_t n = 16; n <= 24; n += 8) {
21092       for (size_t k = 1; k <= 5; k += 2) {
21093         GemmMicrokernelTester()
21094           .mr(4)
21095           .nr(8)
21096           .kr(1)
21097           .sr(1)
21098           .m(4)
21099           .n(n)
21100           .k(k)
21101           .cn_stride(11)
21102           .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21103       }
21104     }
21105   }
21106 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,n_div_8_strided_a)21107   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, n_div_8_strided_a) {
21108     TEST_REQUIRES_X86_AVX;
21109     for (uint32_t n = 16; n <= 24; n += 8) {
21110       for (size_t k = 1; k <= 5; k += 2) {
21111         GemmMicrokernelTester()
21112           .mr(4)
21113           .nr(8)
21114           .kr(1)
21115           .sr(1)
21116           .m(4)
21117           .n(n)
21118           .k(k)
21119           .a_stride(7)
21120           .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21121       }
21122     }
21123   }
21124 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,n_div_8_subtile)21125   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, n_div_8_subtile) {
21126     TEST_REQUIRES_X86_AVX;
21127     for (uint32_t n = 16; n <= 24; n += 8) {
21128       for (size_t k = 1; k <= 5; k += 2) {
21129         for (uint32_t m = 1; m <= 4; m++) {
21130           GemmMicrokernelTester()
21131             .mr(4)
21132             .nr(8)
21133             .kr(1)
21134             .sr(1)
21135             .m(m)
21136             .n(n)
21137             .k(k)
21138             .iterations(1)
21139             .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21140         }
21141       }
21142     }
21143   }
21144 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,strided_cm_subtile)21145   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, strided_cm_subtile) {
21146     TEST_REQUIRES_X86_AVX;
21147     for (size_t k = 1; k <= 5; k += 2) {
21148       for (uint32_t n = 1; n <= 8; n++) {
21149         for (uint32_t m = 1; m <= 4; m++) {
21150           GemmMicrokernelTester()
21151             .mr(4)
21152             .nr(8)
21153             .kr(1)
21154             .sr(1)
21155             .m(m)
21156             .n(n)
21157             .k(k)
21158             .cm_stride(11)
21159             .iterations(1)
21160             .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21161         }
21162       }
21163     }
21164   }
21165 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,qmin)21166   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, qmin) {
21167     TEST_REQUIRES_X86_AVX;
21168     GemmMicrokernelTester()
21169       .mr(4)
21170       .nr(8)
21171       .kr(1)
21172       .sr(1)
21173       .m(4)
21174       .n(8)
21175       .k(1)
21176       .qmin(128)
21177       .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21178   }
21179 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,qmax)21180   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, qmax) {
21181     TEST_REQUIRES_X86_AVX;
21182     GemmMicrokernelTester()
21183       .mr(4)
21184       .nr(8)
21185       .kr(1)
21186       .sr(1)
21187       .m(4)
21188       .n(8)
21189       .k(1)
21190       .qmax(128)
21191       .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21192   }
21193 
TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST,strided_cm)21194   TEST(F32_GEMM_MINMAX_4X8__AVX_BROADCAST, strided_cm) {
21195     TEST_REQUIRES_X86_AVX;
21196     GemmMicrokernelTester()
21197       .mr(4)
21198       .nr(8)
21199       .kr(1)
21200       .sr(1)
21201       .m(4)
21202       .n(8)
21203       .k(1)
21204       .cm_stride(11)
21205       .Test(xnn_f32_gemm_minmax_ukernel_4x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21206   }
21207 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
21208 
21209 
21210 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,k_eq_1)21211   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, k_eq_1) {
21212     TEST_REQUIRES_X86_AVX;
21213     GemmMicrokernelTester()
21214       .mr(4)
21215       .nr(16)
21216       .kr(1)
21217       .sr(1)
21218       .m(4)
21219       .n(16)
21220       .k(1)
21221       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21222   }
21223 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,strided_cn)21224   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, strided_cn) {
21225     TEST_REQUIRES_X86_AVX;
21226     GemmMicrokernelTester()
21227       .mr(4)
21228       .nr(16)
21229       .kr(1)
21230       .sr(1)
21231       .m(4)
21232       .n(16)
21233       .k(1)
21234       .cn_stride(19)
21235       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21236   }
21237 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,k_eq_1_strided_a)21238   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, k_eq_1_strided_a) {
21239     TEST_REQUIRES_X86_AVX;
21240     GemmMicrokernelTester()
21241       .mr(4)
21242       .nr(16)
21243       .kr(1)
21244       .sr(1)
21245       .m(4)
21246       .n(16)
21247       .k(1)
21248       .a_stride(3)
21249       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21250   }
21251 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,k_eq_1_subtile)21252   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, k_eq_1_subtile) {
21253     TEST_REQUIRES_X86_AVX;
21254     for (uint32_t n = 1; n <= 16; n++) {
21255       for (uint32_t m = 1; m <= 4; m++) {
21256         GemmMicrokernelTester()
21257           .mr(4)
21258           .nr(16)
21259           .kr(1)
21260           .sr(1)
21261           .m(m)
21262           .n(n)
21263           .k(1)
21264           .iterations(1)
21265           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21266       }
21267     }
21268   }
21269 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,k_eq_1_subtile_m)21270   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, k_eq_1_subtile_m) {
21271     TEST_REQUIRES_X86_AVX;
21272     for (uint32_t m = 1; m <= 4; m++) {
21273       GemmMicrokernelTester()
21274         .mr(4)
21275         .nr(16)
21276         .kr(1)
21277         .sr(1)
21278         .m(m)
21279         .n(16)
21280         .k(1)
21281         .iterations(1)
21282         .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21283     }
21284   }
21285 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,k_eq_1_subtile_n)21286   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, k_eq_1_subtile_n) {
21287     TEST_REQUIRES_X86_AVX;
21288     for (uint32_t n = 1; n <= 16; n++) {
21289       GemmMicrokernelTester()
21290         .mr(4)
21291         .nr(16)
21292         .kr(1)
21293         .sr(1)
21294         .m(4)
21295         .n(n)
21296         .k(1)
21297         .iterations(1)
21298         .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21299     }
21300   }
21301 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,k_gt_1)21302   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, k_gt_1) {
21303     TEST_REQUIRES_X86_AVX;
21304     for (size_t k = 2; k < 10; k++) {
21305       GemmMicrokernelTester()
21306         .mr(4)
21307         .nr(16)
21308         .kr(1)
21309         .sr(1)
21310         .m(4)
21311         .n(16)
21312         .k(k)
21313         .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21314     }
21315   }
21316 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,k_gt_1_strided_a)21317   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, k_gt_1_strided_a) {
21318     TEST_REQUIRES_X86_AVX;
21319     for (size_t k = 2; k < 10; k++) {
21320       GemmMicrokernelTester()
21321         .mr(4)
21322         .nr(16)
21323         .kr(1)
21324         .sr(1)
21325         .m(4)
21326         .n(16)
21327         .k(k)
21328         .a_stride(11)
21329         .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21330     }
21331   }
21332 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,k_gt_1_subtile)21333   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, k_gt_1_subtile) {
21334     TEST_REQUIRES_X86_AVX;
21335     for (size_t k = 2; k < 10; k++) {
21336       for (uint32_t n = 1; n <= 16; n++) {
21337         for (uint32_t m = 1; m <= 4; m++) {
21338           GemmMicrokernelTester()
21339             .mr(4)
21340             .nr(16)
21341             .kr(1)
21342             .sr(1)
21343             .m(m)
21344             .n(n)
21345             .k(k)
21346             .iterations(1)
21347             .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21348         }
21349       }
21350     }
21351   }
21352 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,n_gt_16)21353   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, n_gt_16) {
21354     TEST_REQUIRES_X86_AVX;
21355     for (uint32_t n = 17; n < 32; n++) {
21356       for (size_t k = 1; k <= 5; k += 2) {
21357         GemmMicrokernelTester()
21358           .mr(4)
21359           .nr(16)
21360           .kr(1)
21361           .sr(1)
21362           .m(4)
21363           .n(n)
21364           .k(k)
21365           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21366       }
21367     }
21368   }
21369 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,n_gt_16_strided_cn)21370   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, n_gt_16_strided_cn) {
21371     TEST_REQUIRES_X86_AVX;
21372     for (uint32_t n = 17; n < 32; n++) {
21373       for (size_t k = 1; k <= 5; k += 2) {
21374         GemmMicrokernelTester()
21375           .mr(4)
21376           .nr(16)
21377           .kr(1)
21378           .sr(1)
21379           .m(4)
21380           .n(n)
21381           .k(k)
21382           .cn_stride(19)
21383           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21384       }
21385     }
21386   }
21387 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,n_gt_16_strided_a)21388   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, n_gt_16_strided_a) {
21389     TEST_REQUIRES_X86_AVX;
21390     for (uint32_t n = 17; n < 32; n++) {
21391       for (size_t k = 1; k <= 5; k += 2) {
21392         GemmMicrokernelTester()
21393           .mr(4)
21394           .nr(16)
21395           .kr(1)
21396           .sr(1)
21397           .m(4)
21398           .n(n)
21399           .k(k)
21400           .a_stride(7)
21401           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21402       }
21403     }
21404   }
21405 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,n_gt_16_subtile)21406   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, n_gt_16_subtile) {
21407     TEST_REQUIRES_X86_AVX;
21408     for (uint32_t n = 17; n < 32; n++) {
21409       for (size_t k = 1; k <= 5; k += 2) {
21410         for (uint32_t m = 1; m <= 4; m++) {
21411           GemmMicrokernelTester()
21412             .mr(4)
21413             .nr(16)
21414             .kr(1)
21415             .sr(1)
21416             .m(m)
21417             .n(n)
21418             .k(k)
21419             .iterations(1)
21420             .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21421         }
21422       }
21423     }
21424   }
21425 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,n_div_16)21426   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, n_div_16) {
21427     TEST_REQUIRES_X86_AVX;
21428     for (uint32_t n = 32; n <= 48; n += 16) {
21429       for (size_t k = 1; k <= 5; k += 2) {
21430         GemmMicrokernelTester()
21431           .mr(4)
21432           .nr(16)
21433           .kr(1)
21434           .sr(1)
21435           .m(4)
21436           .n(n)
21437           .k(k)
21438           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21439       }
21440     }
21441   }
21442 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,n_div_16_strided_cn)21443   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, n_div_16_strided_cn) {
21444     TEST_REQUIRES_X86_AVX;
21445     for (uint32_t n = 32; n <= 48; n += 16) {
21446       for (size_t k = 1; k <= 5; k += 2) {
21447         GemmMicrokernelTester()
21448           .mr(4)
21449           .nr(16)
21450           .kr(1)
21451           .sr(1)
21452           .m(4)
21453           .n(n)
21454           .k(k)
21455           .cn_stride(19)
21456           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21457       }
21458     }
21459   }
21460 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,n_div_16_strided_a)21461   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, n_div_16_strided_a) {
21462     TEST_REQUIRES_X86_AVX;
21463     for (uint32_t n = 32; n <= 48; n += 16) {
21464       for (size_t k = 1; k <= 5; k += 2) {
21465         GemmMicrokernelTester()
21466           .mr(4)
21467           .nr(16)
21468           .kr(1)
21469           .sr(1)
21470           .m(4)
21471           .n(n)
21472           .k(k)
21473           .a_stride(7)
21474           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21475       }
21476     }
21477   }
21478 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,n_div_16_subtile)21479   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, n_div_16_subtile) {
21480     TEST_REQUIRES_X86_AVX;
21481     for (uint32_t n = 32; n <= 48; n += 16) {
21482       for (size_t k = 1; k <= 5; k += 2) {
21483         for (uint32_t m = 1; m <= 4; m++) {
21484           GemmMicrokernelTester()
21485             .mr(4)
21486             .nr(16)
21487             .kr(1)
21488             .sr(1)
21489             .m(m)
21490             .n(n)
21491             .k(k)
21492             .iterations(1)
21493             .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21494         }
21495       }
21496     }
21497   }
21498 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,strided_cm_subtile)21499   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, strided_cm_subtile) {
21500     TEST_REQUIRES_X86_AVX;
21501     for (size_t k = 1; k <= 5; k += 2) {
21502       for (uint32_t n = 1; n <= 16; n++) {
21503         for (uint32_t m = 1; m <= 4; m++) {
21504           GemmMicrokernelTester()
21505             .mr(4)
21506             .nr(16)
21507             .kr(1)
21508             .sr(1)
21509             .m(m)
21510             .n(n)
21511             .k(k)
21512             .cm_stride(19)
21513             .iterations(1)
21514             .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21515         }
21516       }
21517     }
21518   }
21519 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,qmin)21520   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, qmin) {
21521     TEST_REQUIRES_X86_AVX;
21522     GemmMicrokernelTester()
21523       .mr(4)
21524       .nr(16)
21525       .kr(1)
21526       .sr(1)
21527       .m(4)
21528       .n(16)
21529       .k(1)
21530       .qmin(128)
21531       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21532   }
21533 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,qmax)21534   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, qmax) {
21535     TEST_REQUIRES_X86_AVX;
21536     GemmMicrokernelTester()
21537       .mr(4)
21538       .nr(16)
21539       .kr(1)
21540       .sr(1)
21541       .m(4)
21542       .n(16)
21543       .k(1)
21544       .qmax(128)
21545       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21546   }
21547 
TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST,strided_cm)21548   TEST(F32_GEMM_MINMAX_4X16__AVX_BROADCAST, strided_cm) {
21549     TEST_REQUIRES_X86_AVX;
21550     GemmMicrokernelTester()
21551       .mr(4)
21552       .nr(16)
21553       .kr(1)
21554       .sr(1)
21555       .m(4)
21556       .n(16)
21557       .k(1)
21558       .cm_stride(19)
21559       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21560   }
21561 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
21562 
21563 
21564 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,k_eq_1)21565   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, k_eq_1) {
21566     TEST_REQUIRES_X86_AVX;
21567     GemmMicrokernelTester()
21568       .mr(5)
21569       .nr(16)
21570       .kr(1)
21571       .sr(1)
21572       .m(5)
21573       .n(16)
21574       .k(1)
21575       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21576   }
21577 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,strided_cn)21578   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, strided_cn) {
21579     TEST_REQUIRES_X86_AVX;
21580     GemmMicrokernelTester()
21581       .mr(5)
21582       .nr(16)
21583       .kr(1)
21584       .sr(1)
21585       .m(5)
21586       .n(16)
21587       .k(1)
21588       .cn_stride(19)
21589       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21590   }
21591 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,k_eq_1_strided_a)21592   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, k_eq_1_strided_a) {
21593     TEST_REQUIRES_X86_AVX;
21594     GemmMicrokernelTester()
21595       .mr(5)
21596       .nr(16)
21597       .kr(1)
21598       .sr(1)
21599       .m(5)
21600       .n(16)
21601       .k(1)
21602       .a_stride(3)
21603       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21604   }
21605 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,k_eq_1_subtile)21606   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, k_eq_1_subtile) {
21607     TEST_REQUIRES_X86_AVX;
21608     for (uint32_t n = 1; n <= 16; n++) {
21609       for (uint32_t m = 1; m <= 5; m++) {
21610         GemmMicrokernelTester()
21611           .mr(5)
21612           .nr(16)
21613           .kr(1)
21614           .sr(1)
21615           .m(m)
21616           .n(n)
21617           .k(1)
21618           .iterations(1)
21619           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21620       }
21621     }
21622   }
21623 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,k_eq_1_subtile_m)21624   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, k_eq_1_subtile_m) {
21625     TEST_REQUIRES_X86_AVX;
21626     for (uint32_t m = 1; m <= 5; m++) {
21627       GemmMicrokernelTester()
21628         .mr(5)
21629         .nr(16)
21630         .kr(1)
21631         .sr(1)
21632         .m(m)
21633         .n(16)
21634         .k(1)
21635         .iterations(1)
21636         .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21637     }
21638   }
21639 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,k_eq_1_subtile_n)21640   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, k_eq_1_subtile_n) {
21641     TEST_REQUIRES_X86_AVX;
21642     for (uint32_t n = 1; n <= 16; n++) {
21643       GemmMicrokernelTester()
21644         .mr(5)
21645         .nr(16)
21646         .kr(1)
21647         .sr(1)
21648         .m(5)
21649         .n(n)
21650         .k(1)
21651         .iterations(1)
21652         .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21653     }
21654   }
21655 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,k_gt_1)21656   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, k_gt_1) {
21657     TEST_REQUIRES_X86_AVX;
21658     for (size_t k = 2; k < 10; k++) {
21659       GemmMicrokernelTester()
21660         .mr(5)
21661         .nr(16)
21662         .kr(1)
21663         .sr(1)
21664         .m(5)
21665         .n(16)
21666         .k(k)
21667         .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21668     }
21669   }
21670 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,k_gt_1_strided_a)21671   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, k_gt_1_strided_a) {
21672     TEST_REQUIRES_X86_AVX;
21673     for (size_t k = 2; k < 10; k++) {
21674       GemmMicrokernelTester()
21675         .mr(5)
21676         .nr(16)
21677         .kr(1)
21678         .sr(1)
21679         .m(5)
21680         .n(16)
21681         .k(k)
21682         .a_stride(11)
21683         .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21684     }
21685   }
21686 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,k_gt_1_subtile)21687   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, k_gt_1_subtile) {
21688     TEST_REQUIRES_X86_AVX;
21689     for (size_t k = 2; k < 10; k++) {
21690       for (uint32_t n = 1; n <= 16; n++) {
21691         for (uint32_t m = 1; m <= 5; m++) {
21692           GemmMicrokernelTester()
21693             .mr(5)
21694             .nr(16)
21695             .kr(1)
21696             .sr(1)
21697             .m(m)
21698             .n(n)
21699             .k(k)
21700             .iterations(1)
21701             .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21702         }
21703       }
21704     }
21705   }
21706 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,n_gt_16)21707   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, n_gt_16) {
21708     TEST_REQUIRES_X86_AVX;
21709     for (uint32_t n = 17; n < 32; n++) {
21710       for (size_t k = 1; k <= 5; k += 2) {
21711         GemmMicrokernelTester()
21712           .mr(5)
21713           .nr(16)
21714           .kr(1)
21715           .sr(1)
21716           .m(5)
21717           .n(n)
21718           .k(k)
21719           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21720       }
21721     }
21722   }
21723 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,n_gt_16_strided_cn)21724   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, n_gt_16_strided_cn) {
21725     TEST_REQUIRES_X86_AVX;
21726     for (uint32_t n = 17; n < 32; n++) {
21727       for (size_t k = 1; k <= 5; k += 2) {
21728         GemmMicrokernelTester()
21729           .mr(5)
21730           .nr(16)
21731           .kr(1)
21732           .sr(1)
21733           .m(5)
21734           .n(n)
21735           .k(k)
21736           .cn_stride(19)
21737           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21738       }
21739     }
21740   }
21741 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,n_gt_16_strided_a)21742   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, n_gt_16_strided_a) {
21743     TEST_REQUIRES_X86_AVX;
21744     for (uint32_t n = 17; n < 32; n++) {
21745       for (size_t k = 1; k <= 5; k += 2) {
21746         GemmMicrokernelTester()
21747           .mr(5)
21748           .nr(16)
21749           .kr(1)
21750           .sr(1)
21751           .m(5)
21752           .n(n)
21753           .k(k)
21754           .a_stride(7)
21755           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21756       }
21757     }
21758   }
21759 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,n_gt_16_subtile)21760   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, n_gt_16_subtile) {
21761     TEST_REQUIRES_X86_AVX;
21762     for (uint32_t n = 17; n < 32; n++) {
21763       for (size_t k = 1; k <= 5; k += 2) {
21764         for (uint32_t m = 1; m <= 5; m++) {
21765           GemmMicrokernelTester()
21766             .mr(5)
21767             .nr(16)
21768             .kr(1)
21769             .sr(1)
21770             .m(m)
21771             .n(n)
21772             .k(k)
21773             .iterations(1)
21774             .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21775         }
21776       }
21777     }
21778   }
21779 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,n_div_16)21780   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, n_div_16) {
21781     TEST_REQUIRES_X86_AVX;
21782     for (uint32_t n = 32; n <= 48; n += 16) {
21783       for (size_t k = 1; k <= 5; k += 2) {
21784         GemmMicrokernelTester()
21785           .mr(5)
21786           .nr(16)
21787           .kr(1)
21788           .sr(1)
21789           .m(5)
21790           .n(n)
21791           .k(k)
21792           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21793       }
21794     }
21795   }
21796 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,n_div_16_strided_cn)21797   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, n_div_16_strided_cn) {
21798     TEST_REQUIRES_X86_AVX;
21799     for (uint32_t n = 32; n <= 48; n += 16) {
21800       for (size_t k = 1; k <= 5; k += 2) {
21801         GemmMicrokernelTester()
21802           .mr(5)
21803           .nr(16)
21804           .kr(1)
21805           .sr(1)
21806           .m(5)
21807           .n(n)
21808           .k(k)
21809           .cn_stride(19)
21810           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21811       }
21812     }
21813   }
21814 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,n_div_16_strided_a)21815   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, n_div_16_strided_a) {
21816     TEST_REQUIRES_X86_AVX;
21817     for (uint32_t n = 32; n <= 48; n += 16) {
21818       for (size_t k = 1; k <= 5; k += 2) {
21819         GemmMicrokernelTester()
21820           .mr(5)
21821           .nr(16)
21822           .kr(1)
21823           .sr(1)
21824           .m(5)
21825           .n(n)
21826           .k(k)
21827           .a_stride(7)
21828           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21829       }
21830     }
21831   }
21832 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,n_div_16_subtile)21833   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, n_div_16_subtile) {
21834     TEST_REQUIRES_X86_AVX;
21835     for (uint32_t n = 32; n <= 48; n += 16) {
21836       for (size_t k = 1; k <= 5; k += 2) {
21837         for (uint32_t m = 1; m <= 5; m++) {
21838           GemmMicrokernelTester()
21839             .mr(5)
21840             .nr(16)
21841             .kr(1)
21842             .sr(1)
21843             .m(m)
21844             .n(n)
21845             .k(k)
21846             .iterations(1)
21847             .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21848         }
21849       }
21850     }
21851   }
21852 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,strided_cm_subtile)21853   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, strided_cm_subtile) {
21854     TEST_REQUIRES_X86_AVX;
21855     for (size_t k = 1; k <= 5; k += 2) {
21856       for (uint32_t n = 1; n <= 16; n++) {
21857         for (uint32_t m = 1; m <= 5; m++) {
21858           GemmMicrokernelTester()
21859             .mr(5)
21860             .nr(16)
21861             .kr(1)
21862             .sr(1)
21863             .m(m)
21864             .n(n)
21865             .k(k)
21866             .cm_stride(19)
21867             .iterations(1)
21868             .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21869         }
21870       }
21871     }
21872   }
21873 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,qmin)21874   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, qmin) {
21875     TEST_REQUIRES_X86_AVX;
21876     GemmMicrokernelTester()
21877       .mr(5)
21878       .nr(16)
21879       .kr(1)
21880       .sr(1)
21881       .m(5)
21882       .n(16)
21883       .k(1)
21884       .qmin(128)
21885       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21886   }
21887 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,qmax)21888   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, qmax) {
21889     TEST_REQUIRES_X86_AVX;
21890     GemmMicrokernelTester()
21891       .mr(5)
21892       .nr(16)
21893       .kr(1)
21894       .sr(1)
21895       .m(5)
21896       .n(16)
21897       .k(1)
21898       .qmax(128)
21899       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21900   }
21901 
TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST,strided_cm)21902   TEST(F32_GEMM_MINMAX_5X16__AVX_BROADCAST, strided_cm) {
21903     TEST_REQUIRES_X86_AVX;
21904     GemmMicrokernelTester()
21905       .mr(5)
21906       .nr(16)
21907       .kr(1)
21908       .sr(1)
21909       .m(5)
21910       .n(16)
21911       .k(1)
21912       .cm_stride(19)
21913       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx_broadcast, xnn_init_f32_minmax_avx_params);
21914   }
21915 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
21916 
21917 
21918 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,k_eq_1)21919   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, k_eq_1) {
21920     TEST_REQUIRES_X86_AVX;
21921     GemmMicrokernelTester()
21922       .mr(7)
21923       .nr(8)
21924       .kr(1)
21925       .sr(1)
21926       .m(7)
21927       .n(8)
21928       .k(1)
21929       .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21930   }
21931 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,strided_cn)21932   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, strided_cn) {
21933     TEST_REQUIRES_X86_AVX;
21934     GemmMicrokernelTester()
21935       .mr(7)
21936       .nr(8)
21937       .kr(1)
21938       .sr(1)
21939       .m(7)
21940       .n(8)
21941       .k(1)
21942       .cn_stride(11)
21943       .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21944   }
21945 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,k_eq_1_strided_a)21946   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, k_eq_1_strided_a) {
21947     TEST_REQUIRES_X86_AVX;
21948     GemmMicrokernelTester()
21949       .mr(7)
21950       .nr(8)
21951       .kr(1)
21952       .sr(1)
21953       .m(7)
21954       .n(8)
21955       .k(1)
21956       .a_stride(3)
21957       .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21958   }
21959 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,k_eq_1_subtile)21960   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, k_eq_1_subtile) {
21961     TEST_REQUIRES_X86_AVX;
21962     for (uint32_t n = 1; n <= 8; n++) {
21963       for (uint32_t m = 1; m <= 7; m++) {
21964         GemmMicrokernelTester()
21965           .mr(7)
21966           .nr(8)
21967           .kr(1)
21968           .sr(1)
21969           .m(m)
21970           .n(n)
21971           .k(1)
21972           .iterations(1)
21973           .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21974       }
21975     }
21976   }
21977 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,k_eq_1_subtile_m)21978   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, k_eq_1_subtile_m) {
21979     TEST_REQUIRES_X86_AVX;
21980     for (uint32_t m = 1; m <= 7; m++) {
21981       GemmMicrokernelTester()
21982         .mr(7)
21983         .nr(8)
21984         .kr(1)
21985         .sr(1)
21986         .m(m)
21987         .n(8)
21988         .k(1)
21989         .iterations(1)
21990         .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
21991     }
21992   }
21993 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,k_eq_1_subtile_n)21994   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, k_eq_1_subtile_n) {
21995     TEST_REQUIRES_X86_AVX;
21996     for (uint32_t n = 1; n <= 8; n++) {
21997       GemmMicrokernelTester()
21998         .mr(7)
21999         .nr(8)
22000         .kr(1)
22001         .sr(1)
22002         .m(7)
22003         .n(n)
22004         .k(1)
22005         .iterations(1)
22006         .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22007     }
22008   }
22009 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,k_gt_1)22010   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, k_gt_1) {
22011     TEST_REQUIRES_X86_AVX;
22012     for (size_t k = 2; k < 10; k++) {
22013       GemmMicrokernelTester()
22014         .mr(7)
22015         .nr(8)
22016         .kr(1)
22017         .sr(1)
22018         .m(7)
22019         .n(8)
22020         .k(k)
22021         .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22022     }
22023   }
22024 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,k_gt_1_strided_a)22025   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, k_gt_1_strided_a) {
22026     TEST_REQUIRES_X86_AVX;
22027     for (size_t k = 2; k < 10; k++) {
22028       GemmMicrokernelTester()
22029         .mr(7)
22030         .nr(8)
22031         .kr(1)
22032         .sr(1)
22033         .m(7)
22034         .n(8)
22035         .k(k)
22036         .a_stride(11)
22037         .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22038     }
22039   }
22040 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,k_gt_1_subtile)22041   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, k_gt_1_subtile) {
22042     TEST_REQUIRES_X86_AVX;
22043     for (size_t k = 2; k < 10; k++) {
22044       for (uint32_t n = 1; n <= 8; n++) {
22045         for (uint32_t m = 1; m <= 7; m++) {
22046           GemmMicrokernelTester()
22047             .mr(7)
22048             .nr(8)
22049             .kr(1)
22050             .sr(1)
22051             .m(m)
22052             .n(n)
22053             .k(k)
22054             .iterations(1)
22055             .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22056         }
22057       }
22058     }
22059   }
22060 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,n_gt_8)22061   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, n_gt_8) {
22062     TEST_REQUIRES_X86_AVX;
22063     for (uint32_t n = 9; n < 16; n++) {
22064       for (size_t k = 1; k <= 5; k += 2) {
22065         GemmMicrokernelTester()
22066           .mr(7)
22067           .nr(8)
22068           .kr(1)
22069           .sr(1)
22070           .m(7)
22071           .n(n)
22072           .k(k)
22073           .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22074       }
22075     }
22076   }
22077 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,n_gt_8_strided_cn)22078   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, n_gt_8_strided_cn) {
22079     TEST_REQUIRES_X86_AVX;
22080     for (uint32_t n = 9; n < 16; n++) {
22081       for (size_t k = 1; k <= 5; k += 2) {
22082         GemmMicrokernelTester()
22083           .mr(7)
22084           .nr(8)
22085           .kr(1)
22086           .sr(1)
22087           .m(7)
22088           .n(n)
22089           .k(k)
22090           .cn_stride(11)
22091           .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22092       }
22093     }
22094   }
22095 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,n_gt_8_strided_a)22096   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, n_gt_8_strided_a) {
22097     TEST_REQUIRES_X86_AVX;
22098     for (uint32_t n = 9; n < 16; n++) {
22099       for (size_t k = 1; k <= 5; k += 2) {
22100         GemmMicrokernelTester()
22101           .mr(7)
22102           .nr(8)
22103           .kr(1)
22104           .sr(1)
22105           .m(7)
22106           .n(n)
22107           .k(k)
22108           .a_stride(7)
22109           .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22110       }
22111     }
22112   }
22113 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,n_gt_8_subtile)22114   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, n_gt_8_subtile) {
22115     TEST_REQUIRES_X86_AVX;
22116     for (uint32_t n = 9; n < 16; n++) {
22117       for (size_t k = 1; k <= 5; k += 2) {
22118         for (uint32_t m = 1; m <= 7; m++) {
22119           GemmMicrokernelTester()
22120             .mr(7)
22121             .nr(8)
22122             .kr(1)
22123             .sr(1)
22124             .m(m)
22125             .n(n)
22126             .k(k)
22127             .iterations(1)
22128             .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22129         }
22130       }
22131     }
22132   }
22133 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,n_div_8)22134   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, n_div_8) {
22135     TEST_REQUIRES_X86_AVX;
22136     for (uint32_t n = 16; n <= 24; n += 8) {
22137       for (size_t k = 1; k <= 5; k += 2) {
22138         GemmMicrokernelTester()
22139           .mr(7)
22140           .nr(8)
22141           .kr(1)
22142           .sr(1)
22143           .m(7)
22144           .n(n)
22145           .k(k)
22146           .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22147       }
22148     }
22149   }
22150 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,n_div_8_strided_cn)22151   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, n_div_8_strided_cn) {
22152     TEST_REQUIRES_X86_AVX;
22153     for (uint32_t n = 16; n <= 24; n += 8) {
22154       for (size_t k = 1; k <= 5; k += 2) {
22155         GemmMicrokernelTester()
22156           .mr(7)
22157           .nr(8)
22158           .kr(1)
22159           .sr(1)
22160           .m(7)
22161           .n(n)
22162           .k(k)
22163           .cn_stride(11)
22164           .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22165       }
22166     }
22167   }
22168 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,n_div_8_strided_a)22169   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, n_div_8_strided_a) {
22170     TEST_REQUIRES_X86_AVX;
22171     for (uint32_t n = 16; n <= 24; n += 8) {
22172       for (size_t k = 1; k <= 5; k += 2) {
22173         GemmMicrokernelTester()
22174           .mr(7)
22175           .nr(8)
22176           .kr(1)
22177           .sr(1)
22178           .m(7)
22179           .n(n)
22180           .k(k)
22181           .a_stride(7)
22182           .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22183       }
22184     }
22185   }
22186 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,n_div_8_subtile)22187   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, n_div_8_subtile) {
22188     TEST_REQUIRES_X86_AVX;
22189     for (uint32_t n = 16; n <= 24; n += 8) {
22190       for (size_t k = 1; k <= 5; k += 2) {
22191         for (uint32_t m = 1; m <= 7; m++) {
22192           GemmMicrokernelTester()
22193             .mr(7)
22194             .nr(8)
22195             .kr(1)
22196             .sr(1)
22197             .m(m)
22198             .n(n)
22199             .k(k)
22200             .iterations(1)
22201             .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22202         }
22203       }
22204     }
22205   }
22206 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,strided_cm_subtile)22207   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, strided_cm_subtile) {
22208     TEST_REQUIRES_X86_AVX;
22209     for (size_t k = 1; k <= 5; k += 2) {
22210       for (uint32_t n = 1; n <= 8; n++) {
22211         for (uint32_t m = 1; m <= 7; m++) {
22212           GemmMicrokernelTester()
22213             .mr(7)
22214             .nr(8)
22215             .kr(1)
22216             .sr(1)
22217             .m(m)
22218             .n(n)
22219             .k(k)
22220             .cm_stride(11)
22221             .iterations(1)
22222             .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22223         }
22224       }
22225     }
22226   }
22227 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,qmin)22228   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, qmin) {
22229     TEST_REQUIRES_X86_AVX;
22230     GemmMicrokernelTester()
22231       .mr(7)
22232       .nr(8)
22233       .kr(1)
22234       .sr(1)
22235       .m(7)
22236       .n(8)
22237       .k(1)
22238       .qmin(128)
22239       .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22240   }
22241 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,qmax)22242   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, qmax) {
22243     TEST_REQUIRES_X86_AVX;
22244     GemmMicrokernelTester()
22245       .mr(7)
22246       .nr(8)
22247       .kr(1)
22248       .sr(1)
22249       .m(7)
22250       .n(8)
22251       .k(1)
22252       .qmax(128)
22253       .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22254   }
22255 
TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST,strided_cm)22256   TEST(F32_GEMM_MINMAX_7X8__AVX_BROADCAST, strided_cm) {
22257     TEST_REQUIRES_X86_AVX;
22258     GemmMicrokernelTester()
22259       .mr(7)
22260       .nr(8)
22261       .kr(1)
22262       .sr(1)
22263       .m(7)
22264       .n(8)
22265       .k(1)
22266       .cm_stride(11)
22267       .Test(xnn_f32_gemm_minmax_ukernel_7x8__avx_broadcast, xnn_init_f32_minmax_avx_params);
22268   }
22269 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
22270 
22271 
22272 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_eq_4)22273   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_eq_4) {
22274     TEST_REQUIRES_X86_FMA3;
22275     GemmMicrokernelTester()
22276       .mr(1)
22277       .nr(16)
22278       .kr(1)
22279       .sr(4)
22280       .m(1)
22281       .n(16)
22282       .k(4)
22283       .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22284   }
22285 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,strided_cn)22286   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, strided_cn) {
22287     TEST_REQUIRES_X86_FMA3;
22288     GemmMicrokernelTester()
22289       .mr(1)
22290       .nr(16)
22291       .kr(1)
22292       .sr(4)
22293       .m(1)
22294       .n(16)
22295       .k(4)
22296       .cn_stride(19)
22297       .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22298   }
22299 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_eq_4_strided_a)22300   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_eq_4_strided_a) {
22301     TEST_REQUIRES_X86_FMA3;
22302     GemmMicrokernelTester()
22303       .mr(1)
22304       .nr(16)
22305       .kr(1)
22306       .sr(4)
22307       .m(1)
22308       .n(16)
22309       .k(4)
22310       .a_stride(7)
22311       .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22312   }
22313 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_eq_4_subtile)22314   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_eq_4_subtile) {
22315     TEST_REQUIRES_X86_FMA3;
22316     for (uint32_t n = 1; n <= 16; n++) {
22317       for (uint32_t m = 1; m <= 1; m++) {
22318         GemmMicrokernelTester()
22319           .mr(1)
22320           .nr(16)
22321           .kr(1)
22322           .sr(4)
22323           .m(m)
22324           .n(n)
22325           .k(4)
22326           .iterations(1)
22327           .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22328       }
22329     }
22330   }
22331 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_eq_4_subtile_m)22332   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_eq_4_subtile_m) {
22333     TEST_REQUIRES_X86_FMA3;
22334     for (uint32_t m = 1; m <= 1; m++) {
22335       GemmMicrokernelTester()
22336         .mr(1)
22337         .nr(16)
22338         .kr(1)
22339         .sr(4)
22340         .m(m)
22341         .n(16)
22342         .k(4)
22343         .iterations(1)
22344         .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22345     }
22346   }
22347 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_eq_4_subtile_n)22348   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_eq_4_subtile_n) {
22349     TEST_REQUIRES_X86_FMA3;
22350     for (uint32_t n = 1; n <= 16; n++) {
22351       GemmMicrokernelTester()
22352         .mr(1)
22353         .nr(16)
22354         .kr(1)
22355         .sr(4)
22356         .m(1)
22357         .n(n)
22358         .k(4)
22359         .iterations(1)
22360         .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22361     }
22362   }
22363 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_lt_4)22364   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_lt_4) {
22365     TEST_REQUIRES_X86_FMA3;
22366     for (size_t k = 1; k < 4; k++) {
22367       GemmMicrokernelTester()
22368         .mr(1)
22369         .nr(16)
22370         .kr(1)
22371         .sr(4)
22372         .m(1)
22373         .n(16)
22374         .k(k)
22375         .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22376     }
22377   }
22378 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_lt_4_strided_a)22379   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_lt_4_strided_a) {
22380     TEST_REQUIRES_X86_FMA3;
22381     for (size_t k = 1; k < 4; k++) {
22382       GemmMicrokernelTester()
22383         .mr(1)
22384         .nr(16)
22385         .kr(1)
22386         .sr(4)
22387         .m(1)
22388         .n(16)
22389         .k(k)
22390         .a_stride(7)
22391         .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22392     }
22393   }
22394 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_lt_4_subtile)22395   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_lt_4_subtile) {
22396     TEST_REQUIRES_X86_FMA3;
22397     for (size_t k = 1; k < 4; k++) {
22398       for (uint32_t n = 1; n <= 16; n++) {
22399         for (uint32_t m = 1; m <= 1; m++) {
22400           GemmMicrokernelTester()
22401             .mr(1)
22402             .nr(16)
22403             .kr(1)
22404             .sr(4)
22405             .m(m)
22406             .n(n)
22407             .k(k)
22408             .iterations(1)
22409             .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22410         }
22411       }
22412     }
22413   }
22414 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_gt_4)22415   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_gt_4) {
22416     TEST_REQUIRES_X86_FMA3;
22417     for (size_t k = 5; k < 8; k++) {
22418       GemmMicrokernelTester()
22419         .mr(1)
22420         .nr(16)
22421         .kr(1)
22422         .sr(4)
22423         .m(1)
22424         .n(16)
22425         .k(k)
22426         .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22427     }
22428   }
22429 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_gt_4_strided_a)22430   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_gt_4_strided_a) {
22431     TEST_REQUIRES_X86_FMA3;
22432     for (size_t k = 5; k < 8; k++) {
22433       GemmMicrokernelTester()
22434         .mr(1)
22435         .nr(16)
22436         .kr(1)
22437         .sr(4)
22438         .m(1)
22439         .n(16)
22440         .k(k)
22441         .a_stride(11)
22442         .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22443     }
22444   }
22445 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_gt_4_subtile)22446   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_gt_4_subtile) {
22447     TEST_REQUIRES_X86_FMA3;
22448     for (size_t k = 5; k < 8; k++) {
22449       for (uint32_t n = 1; n <= 16; n++) {
22450         for (uint32_t m = 1; m <= 1; m++) {
22451           GemmMicrokernelTester()
22452             .mr(1)
22453             .nr(16)
22454             .kr(1)
22455             .sr(4)
22456             .m(m)
22457             .n(n)
22458             .k(k)
22459             .iterations(1)
22460             .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22461         }
22462       }
22463     }
22464   }
22465 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_div_4)22466   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_div_4) {
22467     TEST_REQUIRES_X86_FMA3;
22468     for (size_t k = 8; k <= 40; k += 4) {
22469       GemmMicrokernelTester()
22470         .mr(1)
22471         .nr(16)
22472         .kr(1)
22473         .sr(4)
22474         .m(1)
22475         .n(16)
22476         .k(k)
22477         .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22478     }
22479   }
22480 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_div_4_strided_a)22481   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_div_4_strided_a) {
22482     TEST_REQUIRES_X86_FMA3;
22483     for (size_t k = 8; k <= 40; k += 4) {
22484       GemmMicrokernelTester()
22485         .mr(1)
22486         .nr(16)
22487         .kr(1)
22488         .sr(4)
22489         .m(1)
22490         .n(16)
22491         .k(k)
22492         .a_stride(43)
22493         .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22494     }
22495   }
22496 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,k_div_4_subtile)22497   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, k_div_4_subtile) {
22498     TEST_REQUIRES_X86_FMA3;
22499     for (size_t k = 8; k <= 40; k += 4) {
22500       for (uint32_t n = 1; n <= 16; n++) {
22501         for (uint32_t m = 1; m <= 1; m++) {
22502           GemmMicrokernelTester()
22503             .mr(1)
22504             .nr(16)
22505             .kr(1)
22506             .sr(4)
22507             .m(m)
22508             .n(n)
22509             .k(k)
22510             .iterations(1)
22511             .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22512         }
22513       }
22514     }
22515   }
22516 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,n_gt_16)22517   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, n_gt_16) {
22518     TEST_REQUIRES_X86_FMA3;
22519     for (uint32_t n = 17; n < 32; n++) {
22520       for (size_t k = 1; k <= 20; k += 5) {
22521         GemmMicrokernelTester()
22522           .mr(1)
22523           .nr(16)
22524           .kr(1)
22525           .sr(4)
22526           .m(1)
22527           .n(n)
22528           .k(k)
22529           .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22530       }
22531     }
22532   }
22533 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,n_gt_16_strided_cn)22534   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, n_gt_16_strided_cn) {
22535     TEST_REQUIRES_X86_FMA3;
22536     for (uint32_t n = 17; n < 32; n++) {
22537       for (size_t k = 1; k <= 20; k += 5) {
22538         GemmMicrokernelTester()
22539           .mr(1)
22540           .nr(16)
22541           .kr(1)
22542           .sr(4)
22543           .m(1)
22544           .n(n)
22545           .k(k)
22546           .cn_stride(19)
22547           .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22548       }
22549     }
22550   }
22551 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,n_gt_16_strided_a)22552   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, n_gt_16_strided_a) {
22553     TEST_REQUIRES_X86_FMA3;
22554     for (uint32_t n = 17; n < 32; n++) {
22555       for (size_t k = 1; k <= 20; k += 5) {
22556         GemmMicrokernelTester()
22557           .mr(1)
22558           .nr(16)
22559           .kr(1)
22560           .sr(4)
22561           .m(1)
22562           .n(n)
22563           .k(k)
22564           .a_stride(23)
22565           .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22566       }
22567     }
22568   }
22569 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,n_gt_16_subtile)22570   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, n_gt_16_subtile) {
22571     TEST_REQUIRES_X86_FMA3;
22572     for (uint32_t n = 17; n < 32; n++) {
22573       for (size_t k = 1; k <= 20; k += 5) {
22574         for (uint32_t m = 1; m <= 1; m++) {
22575           GemmMicrokernelTester()
22576             .mr(1)
22577             .nr(16)
22578             .kr(1)
22579             .sr(4)
22580             .m(m)
22581             .n(n)
22582             .k(k)
22583             .iterations(1)
22584             .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22585         }
22586       }
22587     }
22588   }
22589 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,n_div_16)22590   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, n_div_16) {
22591     TEST_REQUIRES_X86_FMA3;
22592     for (uint32_t n = 32; n <= 48; n += 16) {
22593       for (size_t k = 1; k <= 20; k += 5) {
22594         GemmMicrokernelTester()
22595           .mr(1)
22596           .nr(16)
22597           .kr(1)
22598           .sr(4)
22599           .m(1)
22600           .n(n)
22601           .k(k)
22602           .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22603       }
22604     }
22605   }
22606 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,n_div_16_strided_cn)22607   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, n_div_16_strided_cn) {
22608     TEST_REQUIRES_X86_FMA3;
22609     for (uint32_t n = 32; n <= 48; n += 16) {
22610       for (size_t k = 1; k <= 20; k += 5) {
22611         GemmMicrokernelTester()
22612           .mr(1)
22613           .nr(16)
22614           .kr(1)
22615           .sr(4)
22616           .m(1)
22617           .n(n)
22618           .k(k)
22619           .cn_stride(19)
22620           .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22621       }
22622     }
22623   }
22624 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,n_div_16_strided_a)22625   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, n_div_16_strided_a) {
22626     TEST_REQUIRES_X86_FMA3;
22627     for (uint32_t n = 32; n <= 48; n += 16) {
22628       for (size_t k = 1; k <= 20; k += 5) {
22629         GemmMicrokernelTester()
22630           .mr(1)
22631           .nr(16)
22632           .kr(1)
22633           .sr(4)
22634           .m(1)
22635           .n(n)
22636           .k(k)
22637           .a_stride(23)
22638           .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22639       }
22640     }
22641   }
22642 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,n_div_16_subtile)22643   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, n_div_16_subtile) {
22644     TEST_REQUIRES_X86_FMA3;
22645     for (uint32_t n = 32; n <= 48; n += 16) {
22646       for (size_t k = 1; k <= 20; k += 5) {
22647         for (uint32_t m = 1; m <= 1; m++) {
22648           GemmMicrokernelTester()
22649             .mr(1)
22650             .nr(16)
22651             .kr(1)
22652             .sr(4)
22653             .m(m)
22654             .n(n)
22655             .k(k)
22656             .iterations(1)
22657             .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22658         }
22659       }
22660     }
22661   }
22662 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,strided_cm_subtile)22663   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, strided_cm_subtile) {
22664     TEST_REQUIRES_X86_FMA3;
22665     for (size_t k = 1; k <= 20; k += 5) {
22666       for (uint32_t n = 1; n <= 16; n++) {
22667         for (uint32_t m = 1; m <= 1; m++) {
22668           GemmMicrokernelTester()
22669             .mr(1)
22670             .nr(16)
22671             .kr(1)
22672             .sr(4)
22673             .m(m)
22674             .n(n)
22675             .k(k)
22676             .cm_stride(19)
22677             .iterations(1)
22678             .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22679         }
22680       }
22681     }
22682   }
22683 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,qmin)22684   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, qmin) {
22685     TEST_REQUIRES_X86_FMA3;
22686     GemmMicrokernelTester()
22687       .mr(1)
22688       .nr(16)
22689       .kr(1)
22690       .sr(4)
22691       .m(1)
22692       .n(16)
22693       .k(4)
22694       .qmin(128)
22695       .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22696   }
22697 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,qmax)22698   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, qmax) {
22699     TEST_REQUIRES_X86_FMA3;
22700     GemmMicrokernelTester()
22701       .mr(1)
22702       .nr(16)
22703       .kr(1)
22704       .sr(4)
22705       .m(1)
22706       .n(16)
22707       .k(4)
22708       .qmax(128)
22709       .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22710   }
22711 
TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST,strided_cm)22712   TEST(F32_GEMM_MINMAX_1X16S4__FMA3_BROADCAST, strided_cm) {
22713     TEST_REQUIRES_X86_FMA3;
22714     GemmMicrokernelTester()
22715       .mr(1)
22716       .nr(16)
22717       .kr(1)
22718       .sr(4)
22719       .m(1)
22720       .n(16)
22721       .k(4)
22722       .cm_stride(19)
22723       .Test(xnn_f32_gemm_minmax_ukernel_1x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22724   }
22725 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
22726 
22727 
22728 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_eq_4)22729   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_eq_4) {
22730     TEST_REQUIRES_X86_FMA3;
22731     GemmMicrokernelTester()
22732       .mr(3)
22733       .nr(16)
22734       .kr(1)
22735       .sr(4)
22736       .m(3)
22737       .n(16)
22738       .k(4)
22739       .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22740   }
22741 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,strided_cn)22742   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, strided_cn) {
22743     TEST_REQUIRES_X86_FMA3;
22744     GemmMicrokernelTester()
22745       .mr(3)
22746       .nr(16)
22747       .kr(1)
22748       .sr(4)
22749       .m(3)
22750       .n(16)
22751       .k(4)
22752       .cn_stride(19)
22753       .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22754   }
22755 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_eq_4_strided_a)22756   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_eq_4_strided_a) {
22757     TEST_REQUIRES_X86_FMA3;
22758     GemmMicrokernelTester()
22759       .mr(3)
22760       .nr(16)
22761       .kr(1)
22762       .sr(4)
22763       .m(3)
22764       .n(16)
22765       .k(4)
22766       .a_stride(7)
22767       .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22768   }
22769 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_eq_4_subtile)22770   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_eq_4_subtile) {
22771     TEST_REQUIRES_X86_FMA3;
22772     for (uint32_t n = 1; n <= 16; n++) {
22773       for (uint32_t m = 1; m <= 3; m++) {
22774         GemmMicrokernelTester()
22775           .mr(3)
22776           .nr(16)
22777           .kr(1)
22778           .sr(4)
22779           .m(m)
22780           .n(n)
22781           .k(4)
22782           .iterations(1)
22783           .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22784       }
22785     }
22786   }
22787 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_eq_4_subtile_m)22788   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_eq_4_subtile_m) {
22789     TEST_REQUIRES_X86_FMA3;
22790     for (uint32_t m = 1; m <= 3; m++) {
22791       GemmMicrokernelTester()
22792         .mr(3)
22793         .nr(16)
22794         .kr(1)
22795         .sr(4)
22796         .m(m)
22797         .n(16)
22798         .k(4)
22799         .iterations(1)
22800         .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22801     }
22802   }
22803 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_eq_4_subtile_n)22804   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_eq_4_subtile_n) {
22805     TEST_REQUIRES_X86_FMA3;
22806     for (uint32_t n = 1; n <= 16; n++) {
22807       GemmMicrokernelTester()
22808         .mr(3)
22809         .nr(16)
22810         .kr(1)
22811         .sr(4)
22812         .m(3)
22813         .n(n)
22814         .k(4)
22815         .iterations(1)
22816         .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22817     }
22818   }
22819 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_lt_4)22820   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_lt_4) {
22821     TEST_REQUIRES_X86_FMA3;
22822     for (size_t k = 1; k < 4; k++) {
22823       GemmMicrokernelTester()
22824         .mr(3)
22825         .nr(16)
22826         .kr(1)
22827         .sr(4)
22828         .m(3)
22829         .n(16)
22830         .k(k)
22831         .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22832     }
22833   }
22834 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_lt_4_strided_a)22835   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_lt_4_strided_a) {
22836     TEST_REQUIRES_X86_FMA3;
22837     for (size_t k = 1; k < 4; k++) {
22838       GemmMicrokernelTester()
22839         .mr(3)
22840         .nr(16)
22841         .kr(1)
22842         .sr(4)
22843         .m(3)
22844         .n(16)
22845         .k(k)
22846         .a_stride(7)
22847         .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22848     }
22849   }
22850 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_lt_4_subtile)22851   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_lt_4_subtile) {
22852     TEST_REQUIRES_X86_FMA3;
22853     for (size_t k = 1; k < 4; k++) {
22854       for (uint32_t n = 1; n <= 16; n++) {
22855         for (uint32_t m = 1; m <= 3; m++) {
22856           GemmMicrokernelTester()
22857             .mr(3)
22858             .nr(16)
22859             .kr(1)
22860             .sr(4)
22861             .m(m)
22862             .n(n)
22863             .k(k)
22864             .iterations(1)
22865             .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22866         }
22867       }
22868     }
22869   }
22870 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_gt_4)22871   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_gt_4) {
22872     TEST_REQUIRES_X86_FMA3;
22873     for (size_t k = 5; k < 8; k++) {
22874       GemmMicrokernelTester()
22875         .mr(3)
22876         .nr(16)
22877         .kr(1)
22878         .sr(4)
22879         .m(3)
22880         .n(16)
22881         .k(k)
22882         .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22883     }
22884   }
22885 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_gt_4_strided_a)22886   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_gt_4_strided_a) {
22887     TEST_REQUIRES_X86_FMA3;
22888     for (size_t k = 5; k < 8; k++) {
22889       GemmMicrokernelTester()
22890         .mr(3)
22891         .nr(16)
22892         .kr(1)
22893         .sr(4)
22894         .m(3)
22895         .n(16)
22896         .k(k)
22897         .a_stride(11)
22898         .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22899     }
22900   }
22901 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_gt_4_subtile)22902   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_gt_4_subtile) {
22903     TEST_REQUIRES_X86_FMA3;
22904     for (size_t k = 5; k < 8; k++) {
22905       for (uint32_t n = 1; n <= 16; n++) {
22906         for (uint32_t m = 1; m <= 3; m++) {
22907           GemmMicrokernelTester()
22908             .mr(3)
22909             .nr(16)
22910             .kr(1)
22911             .sr(4)
22912             .m(m)
22913             .n(n)
22914             .k(k)
22915             .iterations(1)
22916             .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22917         }
22918       }
22919     }
22920   }
22921 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_div_4)22922   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_div_4) {
22923     TEST_REQUIRES_X86_FMA3;
22924     for (size_t k = 8; k <= 40; k += 4) {
22925       GemmMicrokernelTester()
22926         .mr(3)
22927         .nr(16)
22928         .kr(1)
22929         .sr(4)
22930         .m(3)
22931         .n(16)
22932         .k(k)
22933         .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22934     }
22935   }
22936 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_div_4_strided_a)22937   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_div_4_strided_a) {
22938     TEST_REQUIRES_X86_FMA3;
22939     for (size_t k = 8; k <= 40; k += 4) {
22940       GemmMicrokernelTester()
22941         .mr(3)
22942         .nr(16)
22943         .kr(1)
22944         .sr(4)
22945         .m(3)
22946         .n(16)
22947         .k(k)
22948         .a_stride(43)
22949         .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22950     }
22951   }
22952 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,k_div_4_subtile)22953   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, k_div_4_subtile) {
22954     TEST_REQUIRES_X86_FMA3;
22955     for (size_t k = 8; k <= 40; k += 4) {
22956       for (uint32_t n = 1; n <= 16; n++) {
22957         for (uint32_t m = 1; m <= 3; m++) {
22958           GemmMicrokernelTester()
22959             .mr(3)
22960             .nr(16)
22961             .kr(1)
22962             .sr(4)
22963             .m(m)
22964             .n(n)
22965             .k(k)
22966             .iterations(1)
22967             .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22968         }
22969       }
22970     }
22971   }
22972 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,n_gt_16)22973   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, n_gt_16) {
22974     TEST_REQUIRES_X86_FMA3;
22975     for (uint32_t n = 17; n < 32; n++) {
22976       for (size_t k = 1; k <= 20; k += 5) {
22977         GemmMicrokernelTester()
22978           .mr(3)
22979           .nr(16)
22980           .kr(1)
22981           .sr(4)
22982           .m(3)
22983           .n(n)
22984           .k(k)
22985           .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
22986       }
22987     }
22988   }
22989 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,n_gt_16_strided_cn)22990   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, n_gt_16_strided_cn) {
22991     TEST_REQUIRES_X86_FMA3;
22992     for (uint32_t n = 17; n < 32; n++) {
22993       for (size_t k = 1; k <= 20; k += 5) {
22994         GemmMicrokernelTester()
22995           .mr(3)
22996           .nr(16)
22997           .kr(1)
22998           .sr(4)
22999           .m(3)
23000           .n(n)
23001           .k(k)
23002           .cn_stride(19)
23003           .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23004       }
23005     }
23006   }
23007 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,n_gt_16_strided_a)23008   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, n_gt_16_strided_a) {
23009     TEST_REQUIRES_X86_FMA3;
23010     for (uint32_t n = 17; n < 32; n++) {
23011       for (size_t k = 1; k <= 20; k += 5) {
23012         GemmMicrokernelTester()
23013           .mr(3)
23014           .nr(16)
23015           .kr(1)
23016           .sr(4)
23017           .m(3)
23018           .n(n)
23019           .k(k)
23020           .a_stride(23)
23021           .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23022       }
23023     }
23024   }
23025 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,n_gt_16_subtile)23026   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, n_gt_16_subtile) {
23027     TEST_REQUIRES_X86_FMA3;
23028     for (uint32_t n = 17; n < 32; n++) {
23029       for (size_t k = 1; k <= 20; k += 5) {
23030         for (uint32_t m = 1; m <= 3; m++) {
23031           GemmMicrokernelTester()
23032             .mr(3)
23033             .nr(16)
23034             .kr(1)
23035             .sr(4)
23036             .m(m)
23037             .n(n)
23038             .k(k)
23039             .iterations(1)
23040             .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23041         }
23042       }
23043     }
23044   }
23045 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,n_div_16)23046   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, n_div_16) {
23047     TEST_REQUIRES_X86_FMA3;
23048     for (uint32_t n = 32; n <= 48; n += 16) {
23049       for (size_t k = 1; k <= 20; k += 5) {
23050         GemmMicrokernelTester()
23051           .mr(3)
23052           .nr(16)
23053           .kr(1)
23054           .sr(4)
23055           .m(3)
23056           .n(n)
23057           .k(k)
23058           .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23059       }
23060     }
23061   }
23062 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,n_div_16_strided_cn)23063   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, n_div_16_strided_cn) {
23064     TEST_REQUIRES_X86_FMA3;
23065     for (uint32_t n = 32; n <= 48; n += 16) {
23066       for (size_t k = 1; k <= 20; k += 5) {
23067         GemmMicrokernelTester()
23068           .mr(3)
23069           .nr(16)
23070           .kr(1)
23071           .sr(4)
23072           .m(3)
23073           .n(n)
23074           .k(k)
23075           .cn_stride(19)
23076           .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23077       }
23078     }
23079   }
23080 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,n_div_16_strided_a)23081   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, n_div_16_strided_a) {
23082     TEST_REQUIRES_X86_FMA3;
23083     for (uint32_t n = 32; n <= 48; n += 16) {
23084       for (size_t k = 1; k <= 20; k += 5) {
23085         GemmMicrokernelTester()
23086           .mr(3)
23087           .nr(16)
23088           .kr(1)
23089           .sr(4)
23090           .m(3)
23091           .n(n)
23092           .k(k)
23093           .a_stride(23)
23094           .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23095       }
23096     }
23097   }
23098 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,n_div_16_subtile)23099   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, n_div_16_subtile) {
23100     TEST_REQUIRES_X86_FMA3;
23101     for (uint32_t n = 32; n <= 48; n += 16) {
23102       for (size_t k = 1; k <= 20; k += 5) {
23103         for (uint32_t m = 1; m <= 3; m++) {
23104           GemmMicrokernelTester()
23105             .mr(3)
23106             .nr(16)
23107             .kr(1)
23108             .sr(4)
23109             .m(m)
23110             .n(n)
23111             .k(k)
23112             .iterations(1)
23113             .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23114         }
23115       }
23116     }
23117   }
23118 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,strided_cm_subtile)23119   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, strided_cm_subtile) {
23120     TEST_REQUIRES_X86_FMA3;
23121     for (size_t k = 1; k <= 20; k += 5) {
23122       for (uint32_t n = 1; n <= 16; n++) {
23123         for (uint32_t m = 1; m <= 3; m++) {
23124           GemmMicrokernelTester()
23125             .mr(3)
23126             .nr(16)
23127             .kr(1)
23128             .sr(4)
23129             .m(m)
23130             .n(n)
23131             .k(k)
23132             .cm_stride(19)
23133             .iterations(1)
23134             .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23135         }
23136       }
23137     }
23138   }
23139 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,qmin)23140   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, qmin) {
23141     TEST_REQUIRES_X86_FMA3;
23142     GemmMicrokernelTester()
23143       .mr(3)
23144       .nr(16)
23145       .kr(1)
23146       .sr(4)
23147       .m(3)
23148       .n(16)
23149       .k(4)
23150       .qmin(128)
23151       .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23152   }
23153 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,qmax)23154   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, qmax) {
23155     TEST_REQUIRES_X86_FMA3;
23156     GemmMicrokernelTester()
23157       .mr(3)
23158       .nr(16)
23159       .kr(1)
23160       .sr(4)
23161       .m(3)
23162       .n(16)
23163       .k(4)
23164       .qmax(128)
23165       .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23166   }
23167 
TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST,strided_cm)23168   TEST(F32_GEMM_MINMAX_3X16S4__FMA3_BROADCAST, strided_cm) {
23169     TEST_REQUIRES_X86_FMA3;
23170     GemmMicrokernelTester()
23171       .mr(3)
23172       .nr(16)
23173       .kr(1)
23174       .sr(4)
23175       .m(3)
23176       .n(16)
23177       .k(4)
23178       .cm_stride(19)
23179       .Test(xnn_f32_gemm_minmax_ukernel_3x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23180   }
23181 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
23182 
23183 
23184 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,k_eq_1)23185   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, k_eq_1) {
23186     TEST_REQUIRES_X86_FMA3;
23187     GemmMicrokernelTester()
23188       .mr(4)
23189       .nr(16)
23190       .kr(1)
23191       .sr(1)
23192       .m(4)
23193       .n(16)
23194       .k(1)
23195       .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23196   }
23197 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,strided_cn)23198   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, strided_cn) {
23199     TEST_REQUIRES_X86_FMA3;
23200     GemmMicrokernelTester()
23201       .mr(4)
23202       .nr(16)
23203       .kr(1)
23204       .sr(1)
23205       .m(4)
23206       .n(16)
23207       .k(1)
23208       .cn_stride(19)
23209       .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23210   }
23211 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,k_eq_1_strided_a)23212   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, k_eq_1_strided_a) {
23213     TEST_REQUIRES_X86_FMA3;
23214     GemmMicrokernelTester()
23215       .mr(4)
23216       .nr(16)
23217       .kr(1)
23218       .sr(1)
23219       .m(4)
23220       .n(16)
23221       .k(1)
23222       .a_stride(3)
23223       .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23224   }
23225 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,k_eq_1_subtile)23226   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, k_eq_1_subtile) {
23227     TEST_REQUIRES_X86_FMA3;
23228     for (uint32_t n = 1; n <= 16; n++) {
23229       for (uint32_t m = 1; m <= 4; m++) {
23230         GemmMicrokernelTester()
23231           .mr(4)
23232           .nr(16)
23233           .kr(1)
23234           .sr(1)
23235           .m(m)
23236           .n(n)
23237           .k(1)
23238           .iterations(1)
23239           .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23240       }
23241     }
23242   }
23243 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,k_eq_1_subtile_m)23244   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, k_eq_1_subtile_m) {
23245     TEST_REQUIRES_X86_FMA3;
23246     for (uint32_t m = 1; m <= 4; m++) {
23247       GemmMicrokernelTester()
23248         .mr(4)
23249         .nr(16)
23250         .kr(1)
23251         .sr(1)
23252         .m(m)
23253         .n(16)
23254         .k(1)
23255         .iterations(1)
23256         .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23257     }
23258   }
23259 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,k_eq_1_subtile_n)23260   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, k_eq_1_subtile_n) {
23261     TEST_REQUIRES_X86_FMA3;
23262     for (uint32_t n = 1; n <= 16; n++) {
23263       GemmMicrokernelTester()
23264         .mr(4)
23265         .nr(16)
23266         .kr(1)
23267         .sr(1)
23268         .m(4)
23269         .n(n)
23270         .k(1)
23271         .iterations(1)
23272         .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23273     }
23274   }
23275 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,k_gt_1)23276   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, k_gt_1) {
23277     TEST_REQUIRES_X86_FMA3;
23278     for (size_t k = 2; k < 10; k++) {
23279       GemmMicrokernelTester()
23280         .mr(4)
23281         .nr(16)
23282         .kr(1)
23283         .sr(1)
23284         .m(4)
23285         .n(16)
23286         .k(k)
23287         .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23288     }
23289   }
23290 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,k_gt_1_strided_a)23291   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, k_gt_1_strided_a) {
23292     TEST_REQUIRES_X86_FMA3;
23293     for (size_t k = 2; k < 10; k++) {
23294       GemmMicrokernelTester()
23295         .mr(4)
23296         .nr(16)
23297         .kr(1)
23298         .sr(1)
23299         .m(4)
23300         .n(16)
23301         .k(k)
23302         .a_stride(11)
23303         .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23304     }
23305   }
23306 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,k_gt_1_subtile)23307   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, k_gt_1_subtile) {
23308     TEST_REQUIRES_X86_FMA3;
23309     for (size_t k = 2; k < 10; k++) {
23310       for (uint32_t n = 1; n <= 16; n++) {
23311         for (uint32_t m = 1; m <= 4; m++) {
23312           GemmMicrokernelTester()
23313             .mr(4)
23314             .nr(16)
23315             .kr(1)
23316             .sr(1)
23317             .m(m)
23318             .n(n)
23319             .k(k)
23320             .iterations(1)
23321             .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23322         }
23323       }
23324     }
23325   }
23326 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,n_gt_16)23327   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, n_gt_16) {
23328     TEST_REQUIRES_X86_FMA3;
23329     for (uint32_t n = 17; n < 32; n++) {
23330       for (size_t k = 1; k <= 5; k += 2) {
23331         GemmMicrokernelTester()
23332           .mr(4)
23333           .nr(16)
23334           .kr(1)
23335           .sr(1)
23336           .m(4)
23337           .n(n)
23338           .k(k)
23339           .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23340       }
23341     }
23342   }
23343 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,n_gt_16_strided_cn)23344   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, n_gt_16_strided_cn) {
23345     TEST_REQUIRES_X86_FMA3;
23346     for (uint32_t n = 17; n < 32; n++) {
23347       for (size_t k = 1; k <= 5; k += 2) {
23348         GemmMicrokernelTester()
23349           .mr(4)
23350           .nr(16)
23351           .kr(1)
23352           .sr(1)
23353           .m(4)
23354           .n(n)
23355           .k(k)
23356           .cn_stride(19)
23357           .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23358       }
23359     }
23360   }
23361 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,n_gt_16_strided_a)23362   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, n_gt_16_strided_a) {
23363     TEST_REQUIRES_X86_FMA3;
23364     for (uint32_t n = 17; n < 32; n++) {
23365       for (size_t k = 1; k <= 5; k += 2) {
23366         GemmMicrokernelTester()
23367           .mr(4)
23368           .nr(16)
23369           .kr(1)
23370           .sr(1)
23371           .m(4)
23372           .n(n)
23373           .k(k)
23374           .a_stride(7)
23375           .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23376       }
23377     }
23378   }
23379 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,n_gt_16_subtile)23380   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, n_gt_16_subtile) {
23381     TEST_REQUIRES_X86_FMA3;
23382     for (uint32_t n = 17; n < 32; n++) {
23383       for (size_t k = 1; k <= 5; k += 2) {
23384         for (uint32_t m = 1; m <= 4; m++) {
23385           GemmMicrokernelTester()
23386             .mr(4)
23387             .nr(16)
23388             .kr(1)
23389             .sr(1)
23390             .m(m)
23391             .n(n)
23392             .k(k)
23393             .iterations(1)
23394             .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23395         }
23396       }
23397     }
23398   }
23399 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,n_div_16)23400   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, n_div_16) {
23401     TEST_REQUIRES_X86_FMA3;
23402     for (uint32_t n = 32; n <= 48; n += 16) {
23403       for (size_t k = 1; k <= 5; k += 2) {
23404         GemmMicrokernelTester()
23405           .mr(4)
23406           .nr(16)
23407           .kr(1)
23408           .sr(1)
23409           .m(4)
23410           .n(n)
23411           .k(k)
23412           .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23413       }
23414     }
23415   }
23416 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,n_div_16_strided_cn)23417   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, n_div_16_strided_cn) {
23418     TEST_REQUIRES_X86_FMA3;
23419     for (uint32_t n = 32; n <= 48; n += 16) {
23420       for (size_t k = 1; k <= 5; k += 2) {
23421         GemmMicrokernelTester()
23422           .mr(4)
23423           .nr(16)
23424           .kr(1)
23425           .sr(1)
23426           .m(4)
23427           .n(n)
23428           .k(k)
23429           .cn_stride(19)
23430           .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23431       }
23432     }
23433   }
23434 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,n_div_16_strided_a)23435   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, n_div_16_strided_a) {
23436     TEST_REQUIRES_X86_FMA3;
23437     for (uint32_t n = 32; n <= 48; n += 16) {
23438       for (size_t k = 1; k <= 5; k += 2) {
23439         GemmMicrokernelTester()
23440           .mr(4)
23441           .nr(16)
23442           .kr(1)
23443           .sr(1)
23444           .m(4)
23445           .n(n)
23446           .k(k)
23447           .a_stride(7)
23448           .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23449       }
23450     }
23451   }
23452 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,n_div_16_subtile)23453   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, n_div_16_subtile) {
23454     TEST_REQUIRES_X86_FMA3;
23455     for (uint32_t n = 32; n <= 48; n += 16) {
23456       for (size_t k = 1; k <= 5; k += 2) {
23457         for (uint32_t m = 1; m <= 4; m++) {
23458           GemmMicrokernelTester()
23459             .mr(4)
23460             .nr(16)
23461             .kr(1)
23462             .sr(1)
23463             .m(m)
23464             .n(n)
23465             .k(k)
23466             .iterations(1)
23467             .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23468         }
23469       }
23470     }
23471   }
23472 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,strided_cm_subtile)23473   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, strided_cm_subtile) {
23474     TEST_REQUIRES_X86_FMA3;
23475     for (size_t k = 1; k <= 5; k += 2) {
23476       for (uint32_t n = 1; n <= 16; n++) {
23477         for (uint32_t m = 1; m <= 4; m++) {
23478           GemmMicrokernelTester()
23479             .mr(4)
23480             .nr(16)
23481             .kr(1)
23482             .sr(1)
23483             .m(m)
23484             .n(n)
23485             .k(k)
23486             .cm_stride(19)
23487             .iterations(1)
23488             .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23489         }
23490       }
23491     }
23492   }
23493 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,qmin)23494   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, qmin) {
23495     TEST_REQUIRES_X86_FMA3;
23496     GemmMicrokernelTester()
23497       .mr(4)
23498       .nr(16)
23499       .kr(1)
23500       .sr(1)
23501       .m(4)
23502       .n(16)
23503       .k(1)
23504       .qmin(128)
23505       .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23506   }
23507 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,qmax)23508   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, qmax) {
23509     TEST_REQUIRES_X86_FMA3;
23510     GemmMicrokernelTester()
23511       .mr(4)
23512       .nr(16)
23513       .kr(1)
23514       .sr(1)
23515       .m(4)
23516       .n(16)
23517       .k(1)
23518       .qmax(128)
23519       .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23520   }
23521 
TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST,strided_cm)23522   TEST(F32_GEMM_MINMAX_4X16__FMA3_BROADCAST, strided_cm) {
23523     TEST_REQUIRES_X86_FMA3;
23524     GemmMicrokernelTester()
23525       .mr(4)
23526       .nr(16)
23527       .kr(1)
23528       .sr(1)
23529       .m(4)
23530       .n(16)
23531       .k(1)
23532       .cm_stride(19)
23533       .Test(xnn_f32_gemm_minmax_ukernel_4x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23534   }
23535 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
23536 
23537 
23538 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_eq_4)23539   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_eq_4) {
23540     TEST_REQUIRES_X86_FMA3;
23541     GemmMicrokernelTester()
23542       .mr(4)
23543       .nr(16)
23544       .kr(1)
23545       .sr(4)
23546       .m(4)
23547       .n(16)
23548       .k(4)
23549       .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23550   }
23551 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,strided_cn)23552   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, strided_cn) {
23553     TEST_REQUIRES_X86_FMA3;
23554     GemmMicrokernelTester()
23555       .mr(4)
23556       .nr(16)
23557       .kr(1)
23558       .sr(4)
23559       .m(4)
23560       .n(16)
23561       .k(4)
23562       .cn_stride(19)
23563       .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23564   }
23565 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_eq_4_strided_a)23566   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_eq_4_strided_a) {
23567     TEST_REQUIRES_X86_FMA3;
23568     GemmMicrokernelTester()
23569       .mr(4)
23570       .nr(16)
23571       .kr(1)
23572       .sr(4)
23573       .m(4)
23574       .n(16)
23575       .k(4)
23576       .a_stride(7)
23577       .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23578   }
23579 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_eq_4_subtile)23580   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_eq_4_subtile) {
23581     TEST_REQUIRES_X86_FMA3;
23582     for (uint32_t n = 1; n <= 16; n++) {
23583       for (uint32_t m = 1; m <= 4; m++) {
23584         GemmMicrokernelTester()
23585           .mr(4)
23586           .nr(16)
23587           .kr(1)
23588           .sr(4)
23589           .m(m)
23590           .n(n)
23591           .k(4)
23592           .iterations(1)
23593           .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23594       }
23595     }
23596   }
23597 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_eq_4_subtile_m)23598   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_eq_4_subtile_m) {
23599     TEST_REQUIRES_X86_FMA3;
23600     for (uint32_t m = 1; m <= 4; m++) {
23601       GemmMicrokernelTester()
23602         .mr(4)
23603         .nr(16)
23604         .kr(1)
23605         .sr(4)
23606         .m(m)
23607         .n(16)
23608         .k(4)
23609         .iterations(1)
23610         .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23611     }
23612   }
23613 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_eq_4_subtile_n)23614   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_eq_4_subtile_n) {
23615     TEST_REQUIRES_X86_FMA3;
23616     for (uint32_t n = 1; n <= 16; n++) {
23617       GemmMicrokernelTester()
23618         .mr(4)
23619         .nr(16)
23620         .kr(1)
23621         .sr(4)
23622         .m(4)
23623         .n(n)
23624         .k(4)
23625         .iterations(1)
23626         .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23627     }
23628   }
23629 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_lt_4)23630   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_lt_4) {
23631     TEST_REQUIRES_X86_FMA3;
23632     for (size_t k = 1; k < 4; k++) {
23633       GemmMicrokernelTester()
23634         .mr(4)
23635         .nr(16)
23636         .kr(1)
23637         .sr(4)
23638         .m(4)
23639         .n(16)
23640         .k(k)
23641         .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23642     }
23643   }
23644 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_lt_4_strided_a)23645   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_lt_4_strided_a) {
23646     TEST_REQUIRES_X86_FMA3;
23647     for (size_t k = 1; k < 4; k++) {
23648       GemmMicrokernelTester()
23649         .mr(4)
23650         .nr(16)
23651         .kr(1)
23652         .sr(4)
23653         .m(4)
23654         .n(16)
23655         .k(k)
23656         .a_stride(7)
23657         .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23658     }
23659   }
23660 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_lt_4_subtile)23661   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_lt_4_subtile) {
23662     TEST_REQUIRES_X86_FMA3;
23663     for (size_t k = 1; k < 4; k++) {
23664       for (uint32_t n = 1; n <= 16; n++) {
23665         for (uint32_t m = 1; m <= 4; m++) {
23666           GemmMicrokernelTester()
23667             .mr(4)
23668             .nr(16)
23669             .kr(1)
23670             .sr(4)
23671             .m(m)
23672             .n(n)
23673             .k(k)
23674             .iterations(1)
23675             .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23676         }
23677       }
23678     }
23679   }
23680 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_gt_4)23681   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_gt_4) {
23682     TEST_REQUIRES_X86_FMA3;
23683     for (size_t k = 5; k < 8; k++) {
23684       GemmMicrokernelTester()
23685         .mr(4)
23686         .nr(16)
23687         .kr(1)
23688         .sr(4)
23689         .m(4)
23690         .n(16)
23691         .k(k)
23692         .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23693     }
23694   }
23695 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_gt_4_strided_a)23696   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_gt_4_strided_a) {
23697     TEST_REQUIRES_X86_FMA3;
23698     for (size_t k = 5; k < 8; k++) {
23699       GemmMicrokernelTester()
23700         .mr(4)
23701         .nr(16)
23702         .kr(1)
23703         .sr(4)
23704         .m(4)
23705         .n(16)
23706         .k(k)
23707         .a_stride(11)
23708         .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23709     }
23710   }
23711 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_gt_4_subtile)23712   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_gt_4_subtile) {
23713     TEST_REQUIRES_X86_FMA3;
23714     for (size_t k = 5; k < 8; k++) {
23715       for (uint32_t n = 1; n <= 16; n++) {
23716         for (uint32_t m = 1; m <= 4; m++) {
23717           GemmMicrokernelTester()
23718             .mr(4)
23719             .nr(16)
23720             .kr(1)
23721             .sr(4)
23722             .m(m)
23723             .n(n)
23724             .k(k)
23725             .iterations(1)
23726             .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23727         }
23728       }
23729     }
23730   }
23731 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_div_4)23732   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_div_4) {
23733     TEST_REQUIRES_X86_FMA3;
23734     for (size_t k = 8; k <= 40; k += 4) {
23735       GemmMicrokernelTester()
23736         .mr(4)
23737         .nr(16)
23738         .kr(1)
23739         .sr(4)
23740         .m(4)
23741         .n(16)
23742         .k(k)
23743         .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23744     }
23745   }
23746 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_div_4_strided_a)23747   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_div_4_strided_a) {
23748     TEST_REQUIRES_X86_FMA3;
23749     for (size_t k = 8; k <= 40; k += 4) {
23750       GemmMicrokernelTester()
23751         .mr(4)
23752         .nr(16)
23753         .kr(1)
23754         .sr(4)
23755         .m(4)
23756         .n(16)
23757         .k(k)
23758         .a_stride(43)
23759         .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23760     }
23761   }
23762 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,k_div_4_subtile)23763   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, k_div_4_subtile) {
23764     TEST_REQUIRES_X86_FMA3;
23765     for (size_t k = 8; k <= 40; k += 4) {
23766       for (uint32_t n = 1; n <= 16; n++) {
23767         for (uint32_t m = 1; m <= 4; m++) {
23768           GemmMicrokernelTester()
23769             .mr(4)
23770             .nr(16)
23771             .kr(1)
23772             .sr(4)
23773             .m(m)
23774             .n(n)
23775             .k(k)
23776             .iterations(1)
23777             .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23778         }
23779       }
23780     }
23781   }
23782 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,n_gt_16)23783   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, n_gt_16) {
23784     TEST_REQUIRES_X86_FMA3;
23785     for (uint32_t n = 17; n < 32; n++) {
23786       for (size_t k = 1; k <= 20; k += 5) {
23787         GemmMicrokernelTester()
23788           .mr(4)
23789           .nr(16)
23790           .kr(1)
23791           .sr(4)
23792           .m(4)
23793           .n(n)
23794           .k(k)
23795           .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23796       }
23797     }
23798   }
23799 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,n_gt_16_strided_cn)23800   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, n_gt_16_strided_cn) {
23801     TEST_REQUIRES_X86_FMA3;
23802     for (uint32_t n = 17; n < 32; n++) {
23803       for (size_t k = 1; k <= 20; k += 5) {
23804         GemmMicrokernelTester()
23805           .mr(4)
23806           .nr(16)
23807           .kr(1)
23808           .sr(4)
23809           .m(4)
23810           .n(n)
23811           .k(k)
23812           .cn_stride(19)
23813           .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23814       }
23815     }
23816   }
23817 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,n_gt_16_strided_a)23818   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, n_gt_16_strided_a) {
23819     TEST_REQUIRES_X86_FMA3;
23820     for (uint32_t n = 17; n < 32; n++) {
23821       for (size_t k = 1; k <= 20; k += 5) {
23822         GemmMicrokernelTester()
23823           .mr(4)
23824           .nr(16)
23825           .kr(1)
23826           .sr(4)
23827           .m(4)
23828           .n(n)
23829           .k(k)
23830           .a_stride(23)
23831           .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23832       }
23833     }
23834   }
23835 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,n_gt_16_subtile)23836   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, n_gt_16_subtile) {
23837     TEST_REQUIRES_X86_FMA3;
23838     for (uint32_t n = 17; n < 32; n++) {
23839       for (size_t k = 1; k <= 20; k += 5) {
23840         for (uint32_t m = 1; m <= 4; m++) {
23841           GemmMicrokernelTester()
23842             .mr(4)
23843             .nr(16)
23844             .kr(1)
23845             .sr(4)
23846             .m(m)
23847             .n(n)
23848             .k(k)
23849             .iterations(1)
23850             .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23851         }
23852       }
23853     }
23854   }
23855 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,n_div_16)23856   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, n_div_16) {
23857     TEST_REQUIRES_X86_FMA3;
23858     for (uint32_t n = 32; n <= 48; n += 16) {
23859       for (size_t k = 1; k <= 20; k += 5) {
23860         GemmMicrokernelTester()
23861           .mr(4)
23862           .nr(16)
23863           .kr(1)
23864           .sr(4)
23865           .m(4)
23866           .n(n)
23867           .k(k)
23868           .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23869       }
23870     }
23871   }
23872 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,n_div_16_strided_cn)23873   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, n_div_16_strided_cn) {
23874     TEST_REQUIRES_X86_FMA3;
23875     for (uint32_t n = 32; n <= 48; n += 16) {
23876       for (size_t k = 1; k <= 20; k += 5) {
23877         GemmMicrokernelTester()
23878           .mr(4)
23879           .nr(16)
23880           .kr(1)
23881           .sr(4)
23882           .m(4)
23883           .n(n)
23884           .k(k)
23885           .cn_stride(19)
23886           .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23887       }
23888     }
23889   }
23890 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,n_div_16_strided_a)23891   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, n_div_16_strided_a) {
23892     TEST_REQUIRES_X86_FMA3;
23893     for (uint32_t n = 32; n <= 48; n += 16) {
23894       for (size_t k = 1; k <= 20; k += 5) {
23895         GemmMicrokernelTester()
23896           .mr(4)
23897           .nr(16)
23898           .kr(1)
23899           .sr(4)
23900           .m(4)
23901           .n(n)
23902           .k(k)
23903           .a_stride(23)
23904           .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23905       }
23906     }
23907   }
23908 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,n_div_16_subtile)23909   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, n_div_16_subtile) {
23910     TEST_REQUIRES_X86_FMA3;
23911     for (uint32_t n = 32; n <= 48; n += 16) {
23912       for (size_t k = 1; k <= 20; k += 5) {
23913         for (uint32_t m = 1; m <= 4; m++) {
23914           GemmMicrokernelTester()
23915             .mr(4)
23916             .nr(16)
23917             .kr(1)
23918             .sr(4)
23919             .m(m)
23920             .n(n)
23921             .k(k)
23922             .iterations(1)
23923             .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23924         }
23925       }
23926     }
23927   }
23928 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,strided_cm_subtile)23929   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, strided_cm_subtile) {
23930     TEST_REQUIRES_X86_FMA3;
23931     for (size_t k = 1; k <= 20; k += 5) {
23932       for (uint32_t n = 1; n <= 16; n++) {
23933         for (uint32_t m = 1; m <= 4; m++) {
23934           GemmMicrokernelTester()
23935             .mr(4)
23936             .nr(16)
23937             .kr(1)
23938             .sr(4)
23939             .m(m)
23940             .n(n)
23941             .k(k)
23942             .cm_stride(19)
23943             .iterations(1)
23944             .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23945         }
23946       }
23947     }
23948   }
23949 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,qmin)23950   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, qmin) {
23951     TEST_REQUIRES_X86_FMA3;
23952     GemmMicrokernelTester()
23953       .mr(4)
23954       .nr(16)
23955       .kr(1)
23956       .sr(4)
23957       .m(4)
23958       .n(16)
23959       .k(4)
23960       .qmin(128)
23961       .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23962   }
23963 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,qmax)23964   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, qmax) {
23965     TEST_REQUIRES_X86_FMA3;
23966     GemmMicrokernelTester()
23967       .mr(4)
23968       .nr(16)
23969       .kr(1)
23970       .sr(4)
23971       .m(4)
23972       .n(16)
23973       .k(4)
23974       .qmax(128)
23975       .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23976   }
23977 
TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST,strided_cm)23978   TEST(F32_GEMM_MINMAX_4X16S4__FMA3_BROADCAST, strided_cm) {
23979     TEST_REQUIRES_X86_FMA3;
23980     GemmMicrokernelTester()
23981       .mr(4)
23982       .nr(16)
23983       .kr(1)
23984       .sr(4)
23985       .m(4)
23986       .n(16)
23987       .k(4)
23988       .cm_stride(19)
23989       .Test(xnn_f32_gemm_minmax_ukernel_4x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
23990   }
23991 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
23992 
23993 
23994 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,k_eq_1)23995   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, k_eq_1) {
23996     TEST_REQUIRES_X86_FMA3;
23997     GemmMicrokernelTester()
23998       .mr(5)
23999       .nr(16)
24000       .kr(1)
24001       .sr(1)
24002       .m(5)
24003       .n(16)
24004       .k(1)
24005       .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24006   }
24007 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,strided_cn)24008   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, strided_cn) {
24009     TEST_REQUIRES_X86_FMA3;
24010     GemmMicrokernelTester()
24011       .mr(5)
24012       .nr(16)
24013       .kr(1)
24014       .sr(1)
24015       .m(5)
24016       .n(16)
24017       .k(1)
24018       .cn_stride(19)
24019       .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24020   }
24021 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,k_eq_1_strided_a)24022   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, k_eq_1_strided_a) {
24023     TEST_REQUIRES_X86_FMA3;
24024     GemmMicrokernelTester()
24025       .mr(5)
24026       .nr(16)
24027       .kr(1)
24028       .sr(1)
24029       .m(5)
24030       .n(16)
24031       .k(1)
24032       .a_stride(3)
24033       .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24034   }
24035 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,k_eq_1_subtile)24036   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, k_eq_1_subtile) {
24037     TEST_REQUIRES_X86_FMA3;
24038     for (uint32_t n = 1; n <= 16; n++) {
24039       for (uint32_t m = 1; m <= 5; m++) {
24040         GemmMicrokernelTester()
24041           .mr(5)
24042           .nr(16)
24043           .kr(1)
24044           .sr(1)
24045           .m(m)
24046           .n(n)
24047           .k(1)
24048           .iterations(1)
24049           .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24050       }
24051     }
24052   }
24053 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,k_eq_1_subtile_m)24054   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, k_eq_1_subtile_m) {
24055     TEST_REQUIRES_X86_FMA3;
24056     for (uint32_t m = 1; m <= 5; m++) {
24057       GemmMicrokernelTester()
24058         .mr(5)
24059         .nr(16)
24060         .kr(1)
24061         .sr(1)
24062         .m(m)
24063         .n(16)
24064         .k(1)
24065         .iterations(1)
24066         .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24067     }
24068   }
24069 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,k_eq_1_subtile_n)24070   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, k_eq_1_subtile_n) {
24071     TEST_REQUIRES_X86_FMA3;
24072     for (uint32_t n = 1; n <= 16; n++) {
24073       GemmMicrokernelTester()
24074         .mr(5)
24075         .nr(16)
24076         .kr(1)
24077         .sr(1)
24078         .m(5)
24079         .n(n)
24080         .k(1)
24081         .iterations(1)
24082         .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24083     }
24084   }
24085 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,k_gt_1)24086   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, k_gt_1) {
24087     TEST_REQUIRES_X86_FMA3;
24088     for (size_t k = 2; k < 10; k++) {
24089       GemmMicrokernelTester()
24090         .mr(5)
24091         .nr(16)
24092         .kr(1)
24093         .sr(1)
24094         .m(5)
24095         .n(16)
24096         .k(k)
24097         .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24098     }
24099   }
24100 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,k_gt_1_strided_a)24101   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, k_gt_1_strided_a) {
24102     TEST_REQUIRES_X86_FMA3;
24103     for (size_t k = 2; k < 10; k++) {
24104       GemmMicrokernelTester()
24105         .mr(5)
24106         .nr(16)
24107         .kr(1)
24108         .sr(1)
24109         .m(5)
24110         .n(16)
24111         .k(k)
24112         .a_stride(11)
24113         .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24114     }
24115   }
24116 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,k_gt_1_subtile)24117   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, k_gt_1_subtile) {
24118     TEST_REQUIRES_X86_FMA3;
24119     for (size_t k = 2; k < 10; k++) {
24120       for (uint32_t n = 1; n <= 16; n++) {
24121         for (uint32_t m = 1; m <= 5; m++) {
24122           GemmMicrokernelTester()
24123             .mr(5)
24124             .nr(16)
24125             .kr(1)
24126             .sr(1)
24127             .m(m)
24128             .n(n)
24129             .k(k)
24130             .iterations(1)
24131             .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24132         }
24133       }
24134     }
24135   }
24136 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,n_gt_16)24137   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, n_gt_16) {
24138     TEST_REQUIRES_X86_FMA3;
24139     for (uint32_t n = 17; n < 32; n++) {
24140       for (size_t k = 1; k <= 5; k += 2) {
24141         GemmMicrokernelTester()
24142           .mr(5)
24143           .nr(16)
24144           .kr(1)
24145           .sr(1)
24146           .m(5)
24147           .n(n)
24148           .k(k)
24149           .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24150       }
24151     }
24152   }
24153 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,n_gt_16_strided_cn)24154   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, n_gt_16_strided_cn) {
24155     TEST_REQUIRES_X86_FMA3;
24156     for (uint32_t n = 17; n < 32; n++) {
24157       for (size_t k = 1; k <= 5; k += 2) {
24158         GemmMicrokernelTester()
24159           .mr(5)
24160           .nr(16)
24161           .kr(1)
24162           .sr(1)
24163           .m(5)
24164           .n(n)
24165           .k(k)
24166           .cn_stride(19)
24167           .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24168       }
24169     }
24170   }
24171 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,n_gt_16_strided_a)24172   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, n_gt_16_strided_a) {
24173     TEST_REQUIRES_X86_FMA3;
24174     for (uint32_t n = 17; n < 32; n++) {
24175       for (size_t k = 1; k <= 5; k += 2) {
24176         GemmMicrokernelTester()
24177           .mr(5)
24178           .nr(16)
24179           .kr(1)
24180           .sr(1)
24181           .m(5)
24182           .n(n)
24183           .k(k)
24184           .a_stride(7)
24185           .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24186       }
24187     }
24188   }
24189 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,n_gt_16_subtile)24190   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, n_gt_16_subtile) {
24191     TEST_REQUIRES_X86_FMA3;
24192     for (uint32_t n = 17; n < 32; n++) {
24193       for (size_t k = 1; k <= 5; k += 2) {
24194         for (uint32_t m = 1; m <= 5; m++) {
24195           GemmMicrokernelTester()
24196             .mr(5)
24197             .nr(16)
24198             .kr(1)
24199             .sr(1)
24200             .m(m)
24201             .n(n)
24202             .k(k)
24203             .iterations(1)
24204             .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24205         }
24206       }
24207     }
24208   }
24209 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,n_div_16)24210   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, n_div_16) {
24211     TEST_REQUIRES_X86_FMA3;
24212     for (uint32_t n = 32; n <= 48; n += 16) {
24213       for (size_t k = 1; k <= 5; k += 2) {
24214         GemmMicrokernelTester()
24215           .mr(5)
24216           .nr(16)
24217           .kr(1)
24218           .sr(1)
24219           .m(5)
24220           .n(n)
24221           .k(k)
24222           .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24223       }
24224     }
24225   }
24226 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,n_div_16_strided_cn)24227   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, n_div_16_strided_cn) {
24228     TEST_REQUIRES_X86_FMA3;
24229     for (uint32_t n = 32; n <= 48; n += 16) {
24230       for (size_t k = 1; k <= 5; k += 2) {
24231         GemmMicrokernelTester()
24232           .mr(5)
24233           .nr(16)
24234           .kr(1)
24235           .sr(1)
24236           .m(5)
24237           .n(n)
24238           .k(k)
24239           .cn_stride(19)
24240           .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24241       }
24242     }
24243   }
24244 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,n_div_16_strided_a)24245   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, n_div_16_strided_a) {
24246     TEST_REQUIRES_X86_FMA3;
24247     for (uint32_t n = 32; n <= 48; n += 16) {
24248       for (size_t k = 1; k <= 5; k += 2) {
24249         GemmMicrokernelTester()
24250           .mr(5)
24251           .nr(16)
24252           .kr(1)
24253           .sr(1)
24254           .m(5)
24255           .n(n)
24256           .k(k)
24257           .a_stride(7)
24258           .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24259       }
24260     }
24261   }
24262 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,n_div_16_subtile)24263   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, n_div_16_subtile) {
24264     TEST_REQUIRES_X86_FMA3;
24265     for (uint32_t n = 32; n <= 48; n += 16) {
24266       for (size_t k = 1; k <= 5; k += 2) {
24267         for (uint32_t m = 1; m <= 5; m++) {
24268           GemmMicrokernelTester()
24269             .mr(5)
24270             .nr(16)
24271             .kr(1)
24272             .sr(1)
24273             .m(m)
24274             .n(n)
24275             .k(k)
24276             .iterations(1)
24277             .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24278         }
24279       }
24280     }
24281   }
24282 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,strided_cm_subtile)24283   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, strided_cm_subtile) {
24284     TEST_REQUIRES_X86_FMA3;
24285     for (size_t k = 1; k <= 5; k += 2) {
24286       for (uint32_t n = 1; n <= 16; n++) {
24287         for (uint32_t m = 1; m <= 5; m++) {
24288           GemmMicrokernelTester()
24289             .mr(5)
24290             .nr(16)
24291             .kr(1)
24292             .sr(1)
24293             .m(m)
24294             .n(n)
24295             .k(k)
24296             .cm_stride(19)
24297             .iterations(1)
24298             .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24299         }
24300       }
24301     }
24302   }
24303 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,qmin)24304   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, qmin) {
24305     TEST_REQUIRES_X86_FMA3;
24306     GemmMicrokernelTester()
24307       .mr(5)
24308       .nr(16)
24309       .kr(1)
24310       .sr(1)
24311       .m(5)
24312       .n(16)
24313       .k(1)
24314       .qmin(128)
24315       .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24316   }
24317 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,qmax)24318   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, qmax) {
24319     TEST_REQUIRES_X86_FMA3;
24320     GemmMicrokernelTester()
24321       .mr(5)
24322       .nr(16)
24323       .kr(1)
24324       .sr(1)
24325       .m(5)
24326       .n(16)
24327       .k(1)
24328       .qmax(128)
24329       .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24330   }
24331 
TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST,strided_cm)24332   TEST(F32_GEMM_MINMAX_5X16__FMA3_BROADCAST, strided_cm) {
24333     TEST_REQUIRES_X86_FMA3;
24334     GemmMicrokernelTester()
24335       .mr(5)
24336       .nr(16)
24337       .kr(1)
24338       .sr(1)
24339       .m(5)
24340       .n(16)
24341       .k(1)
24342       .cm_stride(19)
24343       .Test(xnn_f32_gemm_minmax_ukernel_5x16__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24344   }
24345 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
24346 
24347 
24348 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_eq_4)24349   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_eq_4) {
24350     TEST_REQUIRES_X86_FMA3;
24351     GemmMicrokernelTester()
24352       .mr(5)
24353       .nr(16)
24354       .kr(1)
24355       .sr(4)
24356       .m(5)
24357       .n(16)
24358       .k(4)
24359       .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24360   }
24361 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,strided_cn)24362   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, strided_cn) {
24363     TEST_REQUIRES_X86_FMA3;
24364     GemmMicrokernelTester()
24365       .mr(5)
24366       .nr(16)
24367       .kr(1)
24368       .sr(4)
24369       .m(5)
24370       .n(16)
24371       .k(4)
24372       .cn_stride(19)
24373       .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24374   }
24375 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_eq_4_strided_a)24376   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_eq_4_strided_a) {
24377     TEST_REQUIRES_X86_FMA3;
24378     GemmMicrokernelTester()
24379       .mr(5)
24380       .nr(16)
24381       .kr(1)
24382       .sr(4)
24383       .m(5)
24384       .n(16)
24385       .k(4)
24386       .a_stride(7)
24387       .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24388   }
24389 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_eq_4_subtile)24390   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_eq_4_subtile) {
24391     TEST_REQUIRES_X86_FMA3;
24392     for (uint32_t n = 1; n <= 16; n++) {
24393       for (uint32_t m = 1; m <= 5; m++) {
24394         GemmMicrokernelTester()
24395           .mr(5)
24396           .nr(16)
24397           .kr(1)
24398           .sr(4)
24399           .m(m)
24400           .n(n)
24401           .k(4)
24402           .iterations(1)
24403           .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24404       }
24405     }
24406   }
24407 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_eq_4_subtile_m)24408   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_eq_4_subtile_m) {
24409     TEST_REQUIRES_X86_FMA3;
24410     for (uint32_t m = 1; m <= 5; m++) {
24411       GemmMicrokernelTester()
24412         .mr(5)
24413         .nr(16)
24414         .kr(1)
24415         .sr(4)
24416         .m(m)
24417         .n(16)
24418         .k(4)
24419         .iterations(1)
24420         .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24421     }
24422   }
24423 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_eq_4_subtile_n)24424   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_eq_4_subtile_n) {
24425     TEST_REQUIRES_X86_FMA3;
24426     for (uint32_t n = 1; n <= 16; n++) {
24427       GemmMicrokernelTester()
24428         .mr(5)
24429         .nr(16)
24430         .kr(1)
24431         .sr(4)
24432         .m(5)
24433         .n(n)
24434         .k(4)
24435         .iterations(1)
24436         .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24437     }
24438   }
24439 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_lt_4)24440   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_lt_4) {
24441     TEST_REQUIRES_X86_FMA3;
24442     for (size_t k = 1; k < 4; k++) {
24443       GemmMicrokernelTester()
24444         .mr(5)
24445         .nr(16)
24446         .kr(1)
24447         .sr(4)
24448         .m(5)
24449         .n(16)
24450         .k(k)
24451         .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24452     }
24453   }
24454 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_lt_4_strided_a)24455   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_lt_4_strided_a) {
24456     TEST_REQUIRES_X86_FMA3;
24457     for (size_t k = 1; k < 4; k++) {
24458       GemmMicrokernelTester()
24459         .mr(5)
24460         .nr(16)
24461         .kr(1)
24462         .sr(4)
24463         .m(5)
24464         .n(16)
24465         .k(k)
24466         .a_stride(7)
24467         .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24468     }
24469   }
24470 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_lt_4_subtile)24471   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_lt_4_subtile) {
24472     TEST_REQUIRES_X86_FMA3;
24473     for (size_t k = 1; k < 4; k++) {
24474       for (uint32_t n = 1; n <= 16; n++) {
24475         for (uint32_t m = 1; m <= 5; m++) {
24476           GemmMicrokernelTester()
24477             .mr(5)
24478             .nr(16)
24479             .kr(1)
24480             .sr(4)
24481             .m(m)
24482             .n(n)
24483             .k(k)
24484             .iterations(1)
24485             .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24486         }
24487       }
24488     }
24489   }
24490 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_gt_4)24491   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_gt_4) {
24492     TEST_REQUIRES_X86_FMA3;
24493     for (size_t k = 5; k < 8; k++) {
24494       GemmMicrokernelTester()
24495         .mr(5)
24496         .nr(16)
24497         .kr(1)
24498         .sr(4)
24499         .m(5)
24500         .n(16)
24501         .k(k)
24502         .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24503     }
24504   }
24505 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_gt_4_strided_a)24506   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_gt_4_strided_a) {
24507     TEST_REQUIRES_X86_FMA3;
24508     for (size_t k = 5; k < 8; k++) {
24509       GemmMicrokernelTester()
24510         .mr(5)
24511         .nr(16)
24512         .kr(1)
24513         .sr(4)
24514         .m(5)
24515         .n(16)
24516         .k(k)
24517         .a_stride(11)
24518         .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24519     }
24520   }
24521 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_gt_4_subtile)24522   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_gt_4_subtile) {
24523     TEST_REQUIRES_X86_FMA3;
24524     for (size_t k = 5; k < 8; k++) {
24525       for (uint32_t n = 1; n <= 16; n++) {
24526         for (uint32_t m = 1; m <= 5; m++) {
24527           GemmMicrokernelTester()
24528             .mr(5)
24529             .nr(16)
24530             .kr(1)
24531             .sr(4)
24532             .m(m)
24533             .n(n)
24534             .k(k)
24535             .iterations(1)
24536             .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24537         }
24538       }
24539     }
24540   }
24541 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_div_4)24542   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_div_4) {
24543     TEST_REQUIRES_X86_FMA3;
24544     for (size_t k = 8; k <= 40; k += 4) {
24545       GemmMicrokernelTester()
24546         .mr(5)
24547         .nr(16)
24548         .kr(1)
24549         .sr(4)
24550         .m(5)
24551         .n(16)
24552         .k(k)
24553         .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24554     }
24555   }
24556 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_div_4_strided_a)24557   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_div_4_strided_a) {
24558     TEST_REQUIRES_X86_FMA3;
24559     for (size_t k = 8; k <= 40; k += 4) {
24560       GemmMicrokernelTester()
24561         .mr(5)
24562         .nr(16)
24563         .kr(1)
24564         .sr(4)
24565         .m(5)
24566         .n(16)
24567         .k(k)
24568         .a_stride(43)
24569         .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24570     }
24571   }
24572 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,k_div_4_subtile)24573   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, k_div_4_subtile) {
24574     TEST_REQUIRES_X86_FMA3;
24575     for (size_t k = 8; k <= 40; k += 4) {
24576       for (uint32_t n = 1; n <= 16; n++) {
24577         for (uint32_t m = 1; m <= 5; m++) {
24578           GemmMicrokernelTester()
24579             .mr(5)
24580             .nr(16)
24581             .kr(1)
24582             .sr(4)
24583             .m(m)
24584             .n(n)
24585             .k(k)
24586             .iterations(1)
24587             .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24588         }
24589       }
24590     }
24591   }
24592 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,n_gt_16)24593   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, n_gt_16) {
24594     TEST_REQUIRES_X86_FMA3;
24595     for (uint32_t n = 17; n < 32; n++) {
24596       for (size_t k = 1; k <= 20; k += 5) {
24597         GemmMicrokernelTester()
24598           .mr(5)
24599           .nr(16)
24600           .kr(1)
24601           .sr(4)
24602           .m(5)
24603           .n(n)
24604           .k(k)
24605           .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24606       }
24607     }
24608   }
24609 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,n_gt_16_strided_cn)24610   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, n_gt_16_strided_cn) {
24611     TEST_REQUIRES_X86_FMA3;
24612     for (uint32_t n = 17; n < 32; n++) {
24613       for (size_t k = 1; k <= 20; k += 5) {
24614         GemmMicrokernelTester()
24615           .mr(5)
24616           .nr(16)
24617           .kr(1)
24618           .sr(4)
24619           .m(5)
24620           .n(n)
24621           .k(k)
24622           .cn_stride(19)
24623           .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24624       }
24625     }
24626   }
24627 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,n_gt_16_strided_a)24628   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, n_gt_16_strided_a) {
24629     TEST_REQUIRES_X86_FMA3;
24630     for (uint32_t n = 17; n < 32; n++) {
24631       for (size_t k = 1; k <= 20; k += 5) {
24632         GemmMicrokernelTester()
24633           .mr(5)
24634           .nr(16)
24635           .kr(1)
24636           .sr(4)
24637           .m(5)
24638           .n(n)
24639           .k(k)
24640           .a_stride(23)
24641           .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24642       }
24643     }
24644   }
24645 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,n_gt_16_subtile)24646   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, n_gt_16_subtile) {
24647     TEST_REQUIRES_X86_FMA3;
24648     for (uint32_t n = 17; n < 32; n++) {
24649       for (size_t k = 1; k <= 20; k += 5) {
24650         for (uint32_t m = 1; m <= 5; m++) {
24651           GemmMicrokernelTester()
24652             .mr(5)
24653             .nr(16)
24654             .kr(1)
24655             .sr(4)
24656             .m(m)
24657             .n(n)
24658             .k(k)
24659             .iterations(1)
24660             .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24661         }
24662       }
24663     }
24664   }
24665 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,n_div_16)24666   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, n_div_16) {
24667     TEST_REQUIRES_X86_FMA3;
24668     for (uint32_t n = 32; n <= 48; n += 16) {
24669       for (size_t k = 1; k <= 20; k += 5) {
24670         GemmMicrokernelTester()
24671           .mr(5)
24672           .nr(16)
24673           .kr(1)
24674           .sr(4)
24675           .m(5)
24676           .n(n)
24677           .k(k)
24678           .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24679       }
24680     }
24681   }
24682 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,n_div_16_strided_cn)24683   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, n_div_16_strided_cn) {
24684     TEST_REQUIRES_X86_FMA3;
24685     for (uint32_t n = 32; n <= 48; n += 16) {
24686       for (size_t k = 1; k <= 20; k += 5) {
24687         GemmMicrokernelTester()
24688           .mr(5)
24689           .nr(16)
24690           .kr(1)
24691           .sr(4)
24692           .m(5)
24693           .n(n)
24694           .k(k)
24695           .cn_stride(19)
24696           .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24697       }
24698     }
24699   }
24700 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,n_div_16_strided_a)24701   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, n_div_16_strided_a) {
24702     TEST_REQUIRES_X86_FMA3;
24703     for (uint32_t n = 32; n <= 48; n += 16) {
24704       for (size_t k = 1; k <= 20; k += 5) {
24705         GemmMicrokernelTester()
24706           .mr(5)
24707           .nr(16)
24708           .kr(1)
24709           .sr(4)
24710           .m(5)
24711           .n(n)
24712           .k(k)
24713           .a_stride(23)
24714           .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24715       }
24716     }
24717   }
24718 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,n_div_16_subtile)24719   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, n_div_16_subtile) {
24720     TEST_REQUIRES_X86_FMA3;
24721     for (uint32_t n = 32; n <= 48; n += 16) {
24722       for (size_t k = 1; k <= 20; k += 5) {
24723         for (uint32_t m = 1; m <= 5; m++) {
24724           GemmMicrokernelTester()
24725             .mr(5)
24726             .nr(16)
24727             .kr(1)
24728             .sr(4)
24729             .m(m)
24730             .n(n)
24731             .k(k)
24732             .iterations(1)
24733             .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24734         }
24735       }
24736     }
24737   }
24738 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,strided_cm_subtile)24739   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, strided_cm_subtile) {
24740     TEST_REQUIRES_X86_FMA3;
24741     for (size_t k = 1; k <= 20; k += 5) {
24742       for (uint32_t n = 1; n <= 16; n++) {
24743         for (uint32_t m = 1; m <= 5; m++) {
24744           GemmMicrokernelTester()
24745             .mr(5)
24746             .nr(16)
24747             .kr(1)
24748             .sr(4)
24749             .m(m)
24750             .n(n)
24751             .k(k)
24752             .cm_stride(19)
24753             .iterations(1)
24754             .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24755         }
24756       }
24757     }
24758   }
24759 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,qmin)24760   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, qmin) {
24761     TEST_REQUIRES_X86_FMA3;
24762     GemmMicrokernelTester()
24763       .mr(5)
24764       .nr(16)
24765       .kr(1)
24766       .sr(4)
24767       .m(5)
24768       .n(16)
24769       .k(4)
24770       .qmin(128)
24771       .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24772   }
24773 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,qmax)24774   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, qmax) {
24775     TEST_REQUIRES_X86_FMA3;
24776     GemmMicrokernelTester()
24777       .mr(5)
24778       .nr(16)
24779       .kr(1)
24780       .sr(4)
24781       .m(5)
24782       .n(16)
24783       .k(4)
24784       .qmax(128)
24785       .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24786   }
24787 
TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST,strided_cm)24788   TEST(F32_GEMM_MINMAX_5X16S4__FMA3_BROADCAST, strided_cm) {
24789     TEST_REQUIRES_X86_FMA3;
24790     GemmMicrokernelTester()
24791       .mr(5)
24792       .nr(16)
24793       .kr(1)
24794       .sr(4)
24795       .m(5)
24796       .n(16)
24797       .k(4)
24798       .cm_stride(19)
24799       .Test(xnn_f32_gemm_minmax_ukernel_5x16s4__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24800   }
24801 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
24802 
24803 
24804 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,k_eq_1)24805   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, k_eq_1) {
24806     TEST_REQUIRES_X86_FMA3;
24807     GemmMicrokernelTester()
24808       .mr(6)
24809       .nr(8)
24810       .kr(1)
24811       .sr(1)
24812       .m(6)
24813       .n(8)
24814       .k(1)
24815       .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24816   }
24817 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,strided_cn)24818   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, strided_cn) {
24819     TEST_REQUIRES_X86_FMA3;
24820     GemmMicrokernelTester()
24821       .mr(6)
24822       .nr(8)
24823       .kr(1)
24824       .sr(1)
24825       .m(6)
24826       .n(8)
24827       .k(1)
24828       .cn_stride(11)
24829       .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24830   }
24831 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,k_eq_1_strided_a)24832   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, k_eq_1_strided_a) {
24833     TEST_REQUIRES_X86_FMA3;
24834     GemmMicrokernelTester()
24835       .mr(6)
24836       .nr(8)
24837       .kr(1)
24838       .sr(1)
24839       .m(6)
24840       .n(8)
24841       .k(1)
24842       .a_stride(3)
24843       .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24844   }
24845 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,k_eq_1_subtile)24846   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, k_eq_1_subtile) {
24847     TEST_REQUIRES_X86_FMA3;
24848     for (uint32_t n = 1; n <= 8; n++) {
24849       for (uint32_t m = 1; m <= 6; m++) {
24850         GemmMicrokernelTester()
24851           .mr(6)
24852           .nr(8)
24853           .kr(1)
24854           .sr(1)
24855           .m(m)
24856           .n(n)
24857           .k(1)
24858           .iterations(1)
24859           .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24860       }
24861     }
24862   }
24863 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,k_eq_1_subtile_m)24864   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, k_eq_1_subtile_m) {
24865     TEST_REQUIRES_X86_FMA3;
24866     for (uint32_t m = 1; m <= 6; m++) {
24867       GemmMicrokernelTester()
24868         .mr(6)
24869         .nr(8)
24870         .kr(1)
24871         .sr(1)
24872         .m(m)
24873         .n(8)
24874         .k(1)
24875         .iterations(1)
24876         .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24877     }
24878   }
24879 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,k_eq_1_subtile_n)24880   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, k_eq_1_subtile_n) {
24881     TEST_REQUIRES_X86_FMA3;
24882     for (uint32_t n = 1; n <= 8; n++) {
24883       GemmMicrokernelTester()
24884         .mr(6)
24885         .nr(8)
24886         .kr(1)
24887         .sr(1)
24888         .m(6)
24889         .n(n)
24890         .k(1)
24891         .iterations(1)
24892         .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24893     }
24894   }
24895 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,k_gt_1)24896   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, k_gt_1) {
24897     TEST_REQUIRES_X86_FMA3;
24898     for (size_t k = 2; k < 10; k++) {
24899       GemmMicrokernelTester()
24900         .mr(6)
24901         .nr(8)
24902         .kr(1)
24903         .sr(1)
24904         .m(6)
24905         .n(8)
24906         .k(k)
24907         .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24908     }
24909   }
24910 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,k_gt_1_strided_a)24911   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, k_gt_1_strided_a) {
24912     TEST_REQUIRES_X86_FMA3;
24913     for (size_t k = 2; k < 10; k++) {
24914       GemmMicrokernelTester()
24915         .mr(6)
24916         .nr(8)
24917         .kr(1)
24918         .sr(1)
24919         .m(6)
24920         .n(8)
24921         .k(k)
24922         .a_stride(11)
24923         .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24924     }
24925   }
24926 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,k_gt_1_subtile)24927   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, k_gt_1_subtile) {
24928     TEST_REQUIRES_X86_FMA3;
24929     for (size_t k = 2; k < 10; k++) {
24930       for (uint32_t n = 1; n <= 8; n++) {
24931         for (uint32_t m = 1; m <= 6; m++) {
24932           GemmMicrokernelTester()
24933             .mr(6)
24934             .nr(8)
24935             .kr(1)
24936             .sr(1)
24937             .m(m)
24938             .n(n)
24939             .k(k)
24940             .iterations(1)
24941             .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24942         }
24943       }
24944     }
24945   }
24946 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,n_gt_8)24947   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, n_gt_8) {
24948     TEST_REQUIRES_X86_FMA3;
24949     for (uint32_t n = 9; n < 16; n++) {
24950       for (size_t k = 1; k <= 5; k += 2) {
24951         GemmMicrokernelTester()
24952           .mr(6)
24953           .nr(8)
24954           .kr(1)
24955           .sr(1)
24956           .m(6)
24957           .n(n)
24958           .k(k)
24959           .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24960       }
24961     }
24962   }
24963 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,n_gt_8_strided_cn)24964   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, n_gt_8_strided_cn) {
24965     TEST_REQUIRES_X86_FMA3;
24966     for (uint32_t n = 9; n < 16; n++) {
24967       for (size_t k = 1; k <= 5; k += 2) {
24968         GemmMicrokernelTester()
24969           .mr(6)
24970           .nr(8)
24971           .kr(1)
24972           .sr(1)
24973           .m(6)
24974           .n(n)
24975           .k(k)
24976           .cn_stride(11)
24977           .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24978       }
24979     }
24980   }
24981 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,n_gt_8_strided_a)24982   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, n_gt_8_strided_a) {
24983     TEST_REQUIRES_X86_FMA3;
24984     for (uint32_t n = 9; n < 16; n++) {
24985       for (size_t k = 1; k <= 5; k += 2) {
24986         GemmMicrokernelTester()
24987           .mr(6)
24988           .nr(8)
24989           .kr(1)
24990           .sr(1)
24991           .m(6)
24992           .n(n)
24993           .k(k)
24994           .a_stride(7)
24995           .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
24996       }
24997     }
24998   }
24999 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,n_gt_8_subtile)25000   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, n_gt_8_subtile) {
25001     TEST_REQUIRES_X86_FMA3;
25002     for (uint32_t n = 9; n < 16; n++) {
25003       for (size_t k = 1; k <= 5; k += 2) {
25004         for (uint32_t m = 1; m <= 6; m++) {
25005           GemmMicrokernelTester()
25006             .mr(6)
25007             .nr(8)
25008             .kr(1)
25009             .sr(1)
25010             .m(m)
25011             .n(n)
25012             .k(k)
25013             .iterations(1)
25014             .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25015         }
25016       }
25017     }
25018   }
25019 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,n_div_8)25020   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, n_div_8) {
25021     TEST_REQUIRES_X86_FMA3;
25022     for (uint32_t n = 16; n <= 24; n += 8) {
25023       for (size_t k = 1; k <= 5; k += 2) {
25024         GemmMicrokernelTester()
25025           .mr(6)
25026           .nr(8)
25027           .kr(1)
25028           .sr(1)
25029           .m(6)
25030           .n(n)
25031           .k(k)
25032           .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25033       }
25034     }
25035   }
25036 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,n_div_8_strided_cn)25037   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, n_div_8_strided_cn) {
25038     TEST_REQUIRES_X86_FMA3;
25039     for (uint32_t n = 16; n <= 24; n += 8) {
25040       for (size_t k = 1; k <= 5; k += 2) {
25041         GemmMicrokernelTester()
25042           .mr(6)
25043           .nr(8)
25044           .kr(1)
25045           .sr(1)
25046           .m(6)
25047           .n(n)
25048           .k(k)
25049           .cn_stride(11)
25050           .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25051       }
25052     }
25053   }
25054 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,n_div_8_strided_a)25055   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, n_div_8_strided_a) {
25056     TEST_REQUIRES_X86_FMA3;
25057     for (uint32_t n = 16; n <= 24; n += 8) {
25058       for (size_t k = 1; k <= 5; k += 2) {
25059         GemmMicrokernelTester()
25060           .mr(6)
25061           .nr(8)
25062           .kr(1)
25063           .sr(1)
25064           .m(6)
25065           .n(n)
25066           .k(k)
25067           .a_stride(7)
25068           .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25069       }
25070     }
25071   }
25072 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,n_div_8_subtile)25073   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, n_div_8_subtile) {
25074     TEST_REQUIRES_X86_FMA3;
25075     for (uint32_t n = 16; n <= 24; n += 8) {
25076       for (size_t k = 1; k <= 5; k += 2) {
25077         for (uint32_t m = 1; m <= 6; m++) {
25078           GemmMicrokernelTester()
25079             .mr(6)
25080             .nr(8)
25081             .kr(1)
25082             .sr(1)
25083             .m(m)
25084             .n(n)
25085             .k(k)
25086             .iterations(1)
25087             .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25088         }
25089       }
25090     }
25091   }
25092 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,strided_cm_subtile)25093   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, strided_cm_subtile) {
25094     TEST_REQUIRES_X86_FMA3;
25095     for (size_t k = 1; k <= 5; k += 2) {
25096       for (uint32_t n = 1; n <= 8; n++) {
25097         for (uint32_t m = 1; m <= 6; m++) {
25098           GemmMicrokernelTester()
25099             .mr(6)
25100             .nr(8)
25101             .kr(1)
25102             .sr(1)
25103             .m(m)
25104             .n(n)
25105             .k(k)
25106             .cm_stride(11)
25107             .iterations(1)
25108             .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25109         }
25110       }
25111     }
25112   }
25113 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,qmin)25114   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, qmin) {
25115     TEST_REQUIRES_X86_FMA3;
25116     GemmMicrokernelTester()
25117       .mr(6)
25118       .nr(8)
25119       .kr(1)
25120       .sr(1)
25121       .m(6)
25122       .n(8)
25123       .k(1)
25124       .qmin(128)
25125       .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25126   }
25127 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,qmax)25128   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, qmax) {
25129     TEST_REQUIRES_X86_FMA3;
25130     GemmMicrokernelTester()
25131       .mr(6)
25132       .nr(8)
25133       .kr(1)
25134       .sr(1)
25135       .m(6)
25136       .n(8)
25137       .k(1)
25138       .qmax(128)
25139       .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25140   }
25141 
TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST,strided_cm)25142   TEST(F32_GEMM_MINMAX_6X8__FMA3_BROADCAST, strided_cm) {
25143     TEST_REQUIRES_X86_FMA3;
25144     GemmMicrokernelTester()
25145       .mr(6)
25146       .nr(8)
25147       .kr(1)
25148       .sr(1)
25149       .m(6)
25150       .n(8)
25151       .k(1)
25152       .cm_stride(11)
25153       .Test(xnn_f32_gemm_minmax_ukernel_6x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25154   }
25155 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
25156 
25157 
25158 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,k_eq_1)25159   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, k_eq_1) {
25160     TEST_REQUIRES_X86_FMA3;
25161     GemmMicrokernelTester()
25162       .mr(7)
25163       .nr(8)
25164       .kr(1)
25165       .sr(1)
25166       .m(7)
25167       .n(8)
25168       .k(1)
25169       .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25170   }
25171 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,strided_cn)25172   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, strided_cn) {
25173     TEST_REQUIRES_X86_FMA3;
25174     GemmMicrokernelTester()
25175       .mr(7)
25176       .nr(8)
25177       .kr(1)
25178       .sr(1)
25179       .m(7)
25180       .n(8)
25181       .k(1)
25182       .cn_stride(11)
25183       .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25184   }
25185 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,k_eq_1_strided_a)25186   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, k_eq_1_strided_a) {
25187     TEST_REQUIRES_X86_FMA3;
25188     GemmMicrokernelTester()
25189       .mr(7)
25190       .nr(8)
25191       .kr(1)
25192       .sr(1)
25193       .m(7)
25194       .n(8)
25195       .k(1)
25196       .a_stride(3)
25197       .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25198   }
25199 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,k_eq_1_subtile)25200   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, k_eq_1_subtile) {
25201     TEST_REQUIRES_X86_FMA3;
25202     for (uint32_t n = 1; n <= 8; n++) {
25203       for (uint32_t m = 1; m <= 7; m++) {
25204         GemmMicrokernelTester()
25205           .mr(7)
25206           .nr(8)
25207           .kr(1)
25208           .sr(1)
25209           .m(m)
25210           .n(n)
25211           .k(1)
25212           .iterations(1)
25213           .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25214       }
25215     }
25216   }
25217 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,k_eq_1_subtile_m)25218   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, k_eq_1_subtile_m) {
25219     TEST_REQUIRES_X86_FMA3;
25220     for (uint32_t m = 1; m <= 7; m++) {
25221       GemmMicrokernelTester()
25222         .mr(7)
25223         .nr(8)
25224         .kr(1)
25225         .sr(1)
25226         .m(m)
25227         .n(8)
25228         .k(1)
25229         .iterations(1)
25230         .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25231     }
25232   }
25233 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,k_eq_1_subtile_n)25234   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, k_eq_1_subtile_n) {
25235     TEST_REQUIRES_X86_FMA3;
25236     for (uint32_t n = 1; n <= 8; n++) {
25237       GemmMicrokernelTester()
25238         .mr(7)
25239         .nr(8)
25240         .kr(1)
25241         .sr(1)
25242         .m(7)
25243         .n(n)
25244         .k(1)
25245         .iterations(1)
25246         .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25247     }
25248   }
25249 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,k_gt_1)25250   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, k_gt_1) {
25251     TEST_REQUIRES_X86_FMA3;
25252     for (size_t k = 2; k < 10; k++) {
25253       GemmMicrokernelTester()
25254         .mr(7)
25255         .nr(8)
25256         .kr(1)
25257         .sr(1)
25258         .m(7)
25259         .n(8)
25260         .k(k)
25261         .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25262     }
25263   }
25264 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,k_gt_1_strided_a)25265   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, k_gt_1_strided_a) {
25266     TEST_REQUIRES_X86_FMA3;
25267     for (size_t k = 2; k < 10; k++) {
25268       GemmMicrokernelTester()
25269         .mr(7)
25270         .nr(8)
25271         .kr(1)
25272         .sr(1)
25273         .m(7)
25274         .n(8)
25275         .k(k)
25276         .a_stride(11)
25277         .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25278     }
25279   }
25280 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,k_gt_1_subtile)25281   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, k_gt_1_subtile) {
25282     TEST_REQUIRES_X86_FMA3;
25283     for (size_t k = 2; k < 10; k++) {
25284       for (uint32_t n = 1; n <= 8; n++) {
25285         for (uint32_t m = 1; m <= 7; m++) {
25286           GemmMicrokernelTester()
25287             .mr(7)
25288             .nr(8)
25289             .kr(1)
25290             .sr(1)
25291             .m(m)
25292             .n(n)
25293             .k(k)
25294             .iterations(1)
25295             .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25296         }
25297       }
25298     }
25299   }
25300 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,n_gt_8)25301   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, n_gt_8) {
25302     TEST_REQUIRES_X86_FMA3;
25303     for (uint32_t n = 9; n < 16; n++) {
25304       for (size_t k = 1; k <= 5; k += 2) {
25305         GemmMicrokernelTester()
25306           .mr(7)
25307           .nr(8)
25308           .kr(1)
25309           .sr(1)
25310           .m(7)
25311           .n(n)
25312           .k(k)
25313           .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25314       }
25315     }
25316   }
25317 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,n_gt_8_strided_cn)25318   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, n_gt_8_strided_cn) {
25319     TEST_REQUIRES_X86_FMA3;
25320     for (uint32_t n = 9; n < 16; n++) {
25321       for (size_t k = 1; k <= 5; k += 2) {
25322         GemmMicrokernelTester()
25323           .mr(7)
25324           .nr(8)
25325           .kr(1)
25326           .sr(1)
25327           .m(7)
25328           .n(n)
25329           .k(k)
25330           .cn_stride(11)
25331           .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25332       }
25333     }
25334   }
25335 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,n_gt_8_strided_a)25336   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, n_gt_8_strided_a) {
25337     TEST_REQUIRES_X86_FMA3;
25338     for (uint32_t n = 9; n < 16; n++) {
25339       for (size_t k = 1; k <= 5; k += 2) {
25340         GemmMicrokernelTester()
25341           .mr(7)
25342           .nr(8)
25343           .kr(1)
25344           .sr(1)
25345           .m(7)
25346           .n(n)
25347           .k(k)
25348           .a_stride(7)
25349           .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25350       }
25351     }
25352   }
25353 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,n_gt_8_subtile)25354   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, n_gt_8_subtile) {
25355     TEST_REQUIRES_X86_FMA3;
25356     for (uint32_t n = 9; n < 16; n++) {
25357       for (size_t k = 1; k <= 5; k += 2) {
25358         for (uint32_t m = 1; m <= 7; m++) {
25359           GemmMicrokernelTester()
25360             .mr(7)
25361             .nr(8)
25362             .kr(1)
25363             .sr(1)
25364             .m(m)
25365             .n(n)
25366             .k(k)
25367             .iterations(1)
25368             .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25369         }
25370       }
25371     }
25372   }
25373 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,n_div_8)25374   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, n_div_8) {
25375     TEST_REQUIRES_X86_FMA3;
25376     for (uint32_t n = 16; n <= 24; n += 8) {
25377       for (size_t k = 1; k <= 5; k += 2) {
25378         GemmMicrokernelTester()
25379           .mr(7)
25380           .nr(8)
25381           .kr(1)
25382           .sr(1)
25383           .m(7)
25384           .n(n)
25385           .k(k)
25386           .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25387       }
25388     }
25389   }
25390 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,n_div_8_strided_cn)25391   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, n_div_8_strided_cn) {
25392     TEST_REQUIRES_X86_FMA3;
25393     for (uint32_t n = 16; n <= 24; n += 8) {
25394       for (size_t k = 1; k <= 5; k += 2) {
25395         GemmMicrokernelTester()
25396           .mr(7)
25397           .nr(8)
25398           .kr(1)
25399           .sr(1)
25400           .m(7)
25401           .n(n)
25402           .k(k)
25403           .cn_stride(11)
25404           .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25405       }
25406     }
25407   }
25408 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,n_div_8_strided_a)25409   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, n_div_8_strided_a) {
25410     TEST_REQUIRES_X86_FMA3;
25411     for (uint32_t n = 16; n <= 24; n += 8) {
25412       for (size_t k = 1; k <= 5; k += 2) {
25413         GemmMicrokernelTester()
25414           .mr(7)
25415           .nr(8)
25416           .kr(1)
25417           .sr(1)
25418           .m(7)
25419           .n(n)
25420           .k(k)
25421           .a_stride(7)
25422           .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25423       }
25424     }
25425   }
25426 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,n_div_8_subtile)25427   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, n_div_8_subtile) {
25428     TEST_REQUIRES_X86_FMA3;
25429     for (uint32_t n = 16; n <= 24; n += 8) {
25430       for (size_t k = 1; k <= 5; k += 2) {
25431         for (uint32_t m = 1; m <= 7; m++) {
25432           GemmMicrokernelTester()
25433             .mr(7)
25434             .nr(8)
25435             .kr(1)
25436             .sr(1)
25437             .m(m)
25438             .n(n)
25439             .k(k)
25440             .iterations(1)
25441             .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25442         }
25443       }
25444     }
25445   }
25446 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,strided_cm_subtile)25447   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, strided_cm_subtile) {
25448     TEST_REQUIRES_X86_FMA3;
25449     for (size_t k = 1; k <= 5; k += 2) {
25450       for (uint32_t n = 1; n <= 8; n++) {
25451         for (uint32_t m = 1; m <= 7; m++) {
25452           GemmMicrokernelTester()
25453             .mr(7)
25454             .nr(8)
25455             .kr(1)
25456             .sr(1)
25457             .m(m)
25458             .n(n)
25459             .k(k)
25460             .cm_stride(11)
25461             .iterations(1)
25462             .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25463         }
25464       }
25465     }
25466   }
25467 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,qmin)25468   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, qmin) {
25469     TEST_REQUIRES_X86_FMA3;
25470     GemmMicrokernelTester()
25471       .mr(7)
25472       .nr(8)
25473       .kr(1)
25474       .sr(1)
25475       .m(7)
25476       .n(8)
25477       .k(1)
25478       .qmin(128)
25479       .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25480   }
25481 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,qmax)25482   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, qmax) {
25483     TEST_REQUIRES_X86_FMA3;
25484     GemmMicrokernelTester()
25485       .mr(7)
25486       .nr(8)
25487       .kr(1)
25488       .sr(1)
25489       .m(7)
25490       .n(8)
25491       .k(1)
25492       .qmax(128)
25493       .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25494   }
25495 
TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST,strided_cm)25496   TEST(F32_GEMM_MINMAX_7X8__FMA3_BROADCAST, strided_cm) {
25497     TEST_REQUIRES_X86_FMA3;
25498     GemmMicrokernelTester()
25499       .mr(7)
25500       .nr(8)
25501       .kr(1)
25502       .sr(1)
25503       .m(7)
25504       .n(8)
25505       .k(1)
25506       .cm_stride(11)
25507       .Test(xnn_f32_gemm_minmax_ukernel_7x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25508   }
25509 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
25510 
25511 
25512 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,k_eq_1)25513   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, k_eq_1) {
25514     TEST_REQUIRES_X86_FMA3;
25515     GemmMicrokernelTester()
25516       .mr(8)
25517       .nr(8)
25518       .kr(1)
25519       .sr(1)
25520       .m(8)
25521       .n(8)
25522       .k(1)
25523       .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25524   }
25525 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,strided_cn)25526   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, strided_cn) {
25527     TEST_REQUIRES_X86_FMA3;
25528     GemmMicrokernelTester()
25529       .mr(8)
25530       .nr(8)
25531       .kr(1)
25532       .sr(1)
25533       .m(8)
25534       .n(8)
25535       .k(1)
25536       .cn_stride(11)
25537       .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25538   }
25539 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,k_eq_1_strided_a)25540   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, k_eq_1_strided_a) {
25541     TEST_REQUIRES_X86_FMA3;
25542     GemmMicrokernelTester()
25543       .mr(8)
25544       .nr(8)
25545       .kr(1)
25546       .sr(1)
25547       .m(8)
25548       .n(8)
25549       .k(1)
25550       .a_stride(3)
25551       .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25552   }
25553 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,k_eq_1_subtile)25554   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, k_eq_1_subtile) {
25555     TEST_REQUIRES_X86_FMA3;
25556     for (uint32_t n = 1; n <= 8; n++) {
25557       for (uint32_t m = 1; m <= 8; m++) {
25558         GemmMicrokernelTester()
25559           .mr(8)
25560           .nr(8)
25561           .kr(1)
25562           .sr(1)
25563           .m(m)
25564           .n(n)
25565           .k(1)
25566           .iterations(1)
25567           .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25568       }
25569     }
25570   }
25571 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,k_eq_1_subtile_m)25572   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, k_eq_1_subtile_m) {
25573     TEST_REQUIRES_X86_FMA3;
25574     for (uint32_t m = 1; m <= 8; m++) {
25575       GemmMicrokernelTester()
25576         .mr(8)
25577         .nr(8)
25578         .kr(1)
25579         .sr(1)
25580         .m(m)
25581         .n(8)
25582         .k(1)
25583         .iterations(1)
25584         .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25585     }
25586   }
25587 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,k_eq_1_subtile_n)25588   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, k_eq_1_subtile_n) {
25589     TEST_REQUIRES_X86_FMA3;
25590     for (uint32_t n = 1; n <= 8; n++) {
25591       GemmMicrokernelTester()
25592         .mr(8)
25593         .nr(8)
25594         .kr(1)
25595         .sr(1)
25596         .m(8)
25597         .n(n)
25598         .k(1)
25599         .iterations(1)
25600         .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25601     }
25602   }
25603 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,k_gt_1)25604   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, k_gt_1) {
25605     TEST_REQUIRES_X86_FMA3;
25606     for (size_t k = 2; k < 10; k++) {
25607       GemmMicrokernelTester()
25608         .mr(8)
25609         .nr(8)
25610         .kr(1)
25611         .sr(1)
25612         .m(8)
25613         .n(8)
25614         .k(k)
25615         .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25616     }
25617   }
25618 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,k_gt_1_strided_a)25619   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, k_gt_1_strided_a) {
25620     TEST_REQUIRES_X86_FMA3;
25621     for (size_t k = 2; k < 10; k++) {
25622       GemmMicrokernelTester()
25623         .mr(8)
25624         .nr(8)
25625         .kr(1)
25626         .sr(1)
25627         .m(8)
25628         .n(8)
25629         .k(k)
25630         .a_stride(11)
25631         .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25632     }
25633   }
25634 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,k_gt_1_subtile)25635   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, k_gt_1_subtile) {
25636     TEST_REQUIRES_X86_FMA3;
25637     for (size_t k = 2; k < 10; k++) {
25638       for (uint32_t n = 1; n <= 8; n++) {
25639         for (uint32_t m = 1; m <= 8; m++) {
25640           GemmMicrokernelTester()
25641             .mr(8)
25642             .nr(8)
25643             .kr(1)
25644             .sr(1)
25645             .m(m)
25646             .n(n)
25647             .k(k)
25648             .iterations(1)
25649             .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25650         }
25651       }
25652     }
25653   }
25654 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,n_gt_8)25655   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, n_gt_8) {
25656     TEST_REQUIRES_X86_FMA3;
25657     for (uint32_t n = 9; n < 16; n++) {
25658       for (size_t k = 1; k <= 5; k += 2) {
25659         GemmMicrokernelTester()
25660           .mr(8)
25661           .nr(8)
25662           .kr(1)
25663           .sr(1)
25664           .m(8)
25665           .n(n)
25666           .k(k)
25667           .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25668       }
25669     }
25670   }
25671 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,n_gt_8_strided_cn)25672   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, n_gt_8_strided_cn) {
25673     TEST_REQUIRES_X86_FMA3;
25674     for (uint32_t n = 9; n < 16; n++) {
25675       for (size_t k = 1; k <= 5; k += 2) {
25676         GemmMicrokernelTester()
25677           .mr(8)
25678           .nr(8)
25679           .kr(1)
25680           .sr(1)
25681           .m(8)
25682           .n(n)
25683           .k(k)
25684           .cn_stride(11)
25685           .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25686       }
25687     }
25688   }
25689 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,n_gt_8_strided_a)25690   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, n_gt_8_strided_a) {
25691     TEST_REQUIRES_X86_FMA3;
25692     for (uint32_t n = 9; n < 16; n++) {
25693       for (size_t k = 1; k <= 5; k += 2) {
25694         GemmMicrokernelTester()
25695           .mr(8)
25696           .nr(8)
25697           .kr(1)
25698           .sr(1)
25699           .m(8)
25700           .n(n)
25701           .k(k)
25702           .a_stride(7)
25703           .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25704       }
25705     }
25706   }
25707 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,n_gt_8_subtile)25708   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, n_gt_8_subtile) {
25709     TEST_REQUIRES_X86_FMA3;
25710     for (uint32_t n = 9; n < 16; n++) {
25711       for (size_t k = 1; k <= 5; k += 2) {
25712         for (uint32_t m = 1; m <= 8; m++) {
25713           GemmMicrokernelTester()
25714             .mr(8)
25715             .nr(8)
25716             .kr(1)
25717             .sr(1)
25718             .m(m)
25719             .n(n)
25720             .k(k)
25721             .iterations(1)
25722             .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25723         }
25724       }
25725     }
25726   }
25727 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,n_div_8)25728   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, n_div_8) {
25729     TEST_REQUIRES_X86_FMA3;
25730     for (uint32_t n = 16; n <= 24; n += 8) {
25731       for (size_t k = 1; k <= 5; k += 2) {
25732         GemmMicrokernelTester()
25733           .mr(8)
25734           .nr(8)
25735           .kr(1)
25736           .sr(1)
25737           .m(8)
25738           .n(n)
25739           .k(k)
25740           .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25741       }
25742     }
25743   }
25744 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,n_div_8_strided_cn)25745   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, n_div_8_strided_cn) {
25746     TEST_REQUIRES_X86_FMA3;
25747     for (uint32_t n = 16; n <= 24; n += 8) {
25748       for (size_t k = 1; k <= 5; k += 2) {
25749         GemmMicrokernelTester()
25750           .mr(8)
25751           .nr(8)
25752           .kr(1)
25753           .sr(1)
25754           .m(8)
25755           .n(n)
25756           .k(k)
25757           .cn_stride(11)
25758           .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25759       }
25760     }
25761   }
25762 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,n_div_8_strided_a)25763   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, n_div_8_strided_a) {
25764     TEST_REQUIRES_X86_FMA3;
25765     for (uint32_t n = 16; n <= 24; n += 8) {
25766       for (size_t k = 1; k <= 5; k += 2) {
25767         GemmMicrokernelTester()
25768           .mr(8)
25769           .nr(8)
25770           .kr(1)
25771           .sr(1)
25772           .m(8)
25773           .n(n)
25774           .k(k)
25775           .a_stride(7)
25776           .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25777       }
25778     }
25779   }
25780 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,n_div_8_subtile)25781   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, n_div_8_subtile) {
25782     TEST_REQUIRES_X86_FMA3;
25783     for (uint32_t n = 16; n <= 24; n += 8) {
25784       for (size_t k = 1; k <= 5; k += 2) {
25785         for (uint32_t m = 1; m <= 8; m++) {
25786           GemmMicrokernelTester()
25787             .mr(8)
25788             .nr(8)
25789             .kr(1)
25790             .sr(1)
25791             .m(m)
25792             .n(n)
25793             .k(k)
25794             .iterations(1)
25795             .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25796         }
25797       }
25798     }
25799   }
25800 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,strided_cm_subtile)25801   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, strided_cm_subtile) {
25802     TEST_REQUIRES_X86_FMA3;
25803     for (size_t k = 1; k <= 5; k += 2) {
25804       for (uint32_t n = 1; n <= 8; n++) {
25805         for (uint32_t m = 1; m <= 8; m++) {
25806           GemmMicrokernelTester()
25807             .mr(8)
25808             .nr(8)
25809             .kr(1)
25810             .sr(1)
25811             .m(m)
25812             .n(n)
25813             .k(k)
25814             .cm_stride(11)
25815             .iterations(1)
25816             .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25817         }
25818       }
25819     }
25820   }
25821 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,qmin)25822   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, qmin) {
25823     TEST_REQUIRES_X86_FMA3;
25824     GemmMicrokernelTester()
25825       .mr(8)
25826       .nr(8)
25827       .kr(1)
25828       .sr(1)
25829       .m(8)
25830       .n(8)
25831       .k(1)
25832       .qmin(128)
25833       .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25834   }
25835 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,qmax)25836   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, qmax) {
25837     TEST_REQUIRES_X86_FMA3;
25838     GemmMicrokernelTester()
25839       .mr(8)
25840       .nr(8)
25841       .kr(1)
25842       .sr(1)
25843       .m(8)
25844       .n(8)
25845       .k(1)
25846       .qmax(128)
25847       .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25848   }
25849 
TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST,strided_cm)25850   TEST(F32_GEMM_MINMAX_8X8__FMA3_BROADCAST, strided_cm) {
25851     TEST_REQUIRES_X86_FMA3;
25852     GemmMicrokernelTester()
25853       .mr(8)
25854       .nr(8)
25855       .kr(1)
25856       .sr(1)
25857       .m(8)
25858       .n(8)
25859       .k(1)
25860       .cm_stride(11)
25861       .Test(xnn_f32_gemm_minmax_ukernel_8x8__fma3_broadcast, xnn_init_f32_minmax_avx_params);
25862   }
25863 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
25864 
25865 
25866 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,k_eq_1)25867   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, k_eq_1) {
25868     TEST_REQUIRES_X86_AVX512F;
25869     GemmMicrokernelTester()
25870       .mr(4)
25871       .nr(16)
25872       .kr(1)
25873       .sr(1)
25874       .m(4)
25875       .n(16)
25876       .k(1)
25877       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
25878   }
25879 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,strided_cn)25880   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, strided_cn) {
25881     TEST_REQUIRES_X86_AVX512F;
25882     GemmMicrokernelTester()
25883       .mr(4)
25884       .nr(16)
25885       .kr(1)
25886       .sr(1)
25887       .m(4)
25888       .n(16)
25889       .k(1)
25890       .cn_stride(19)
25891       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
25892   }
25893 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,k_eq_1_strided_a)25894   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, k_eq_1_strided_a) {
25895     TEST_REQUIRES_X86_AVX512F;
25896     GemmMicrokernelTester()
25897       .mr(4)
25898       .nr(16)
25899       .kr(1)
25900       .sr(1)
25901       .m(4)
25902       .n(16)
25903       .k(1)
25904       .a_stride(3)
25905       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
25906   }
25907 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,k_eq_1_subtile)25908   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, k_eq_1_subtile) {
25909     TEST_REQUIRES_X86_AVX512F;
25910     for (uint32_t n = 1; n <= 16; n++) {
25911       for (uint32_t m = 1; m <= 4; m++) {
25912         GemmMicrokernelTester()
25913           .mr(4)
25914           .nr(16)
25915           .kr(1)
25916           .sr(1)
25917           .m(m)
25918           .n(n)
25919           .k(1)
25920           .iterations(1)
25921           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
25922       }
25923     }
25924   }
25925 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,k_eq_1_subtile_m)25926   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, k_eq_1_subtile_m) {
25927     TEST_REQUIRES_X86_AVX512F;
25928     for (uint32_t m = 1; m <= 4; m++) {
25929       GemmMicrokernelTester()
25930         .mr(4)
25931         .nr(16)
25932         .kr(1)
25933         .sr(1)
25934         .m(m)
25935         .n(16)
25936         .k(1)
25937         .iterations(1)
25938         .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
25939     }
25940   }
25941 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,k_eq_1_subtile_n)25942   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, k_eq_1_subtile_n) {
25943     TEST_REQUIRES_X86_AVX512F;
25944     for (uint32_t n = 1; n <= 16; n++) {
25945       GemmMicrokernelTester()
25946         .mr(4)
25947         .nr(16)
25948         .kr(1)
25949         .sr(1)
25950         .m(4)
25951         .n(n)
25952         .k(1)
25953         .iterations(1)
25954         .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
25955     }
25956   }
25957 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,k_gt_1)25958   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, k_gt_1) {
25959     TEST_REQUIRES_X86_AVX512F;
25960     for (size_t k = 2; k < 10; k++) {
25961       GemmMicrokernelTester()
25962         .mr(4)
25963         .nr(16)
25964         .kr(1)
25965         .sr(1)
25966         .m(4)
25967         .n(16)
25968         .k(k)
25969         .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
25970     }
25971   }
25972 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,k_gt_1_strided_a)25973   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, k_gt_1_strided_a) {
25974     TEST_REQUIRES_X86_AVX512F;
25975     for (size_t k = 2; k < 10; k++) {
25976       GemmMicrokernelTester()
25977         .mr(4)
25978         .nr(16)
25979         .kr(1)
25980         .sr(1)
25981         .m(4)
25982         .n(16)
25983         .k(k)
25984         .a_stride(11)
25985         .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
25986     }
25987   }
25988 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,k_gt_1_subtile)25989   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, k_gt_1_subtile) {
25990     TEST_REQUIRES_X86_AVX512F;
25991     for (size_t k = 2; k < 10; k++) {
25992       for (uint32_t n = 1; n <= 16; n++) {
25993         for (uint32_t m = 1; m <= 4; m++) {
25994           GemmMicrokernelTester()
25995             .mr(4)
25996             .nr(16)
25997             .kr(1)
25998             .sr(1)
25999             .m(m)
26000             .n(n)
26001             .k(k)
26002             .iterations(1)
26003             .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26004         }
26005       }
26006     }
26007   }
26008 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,n_gt_16)26009   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, n_gt_16) {
26010     TEST_REQUIRES_X86_AVX512F;
26011     for (uint32_t n = 17; n < 32; n++) {
26012       for (size_t k = 1; k <= 5; k += 2) {
26013         GemmMicrokernelTester()
26014           .mr(4)
26015           .nr(16)
26016           .kr(1)
26017           .sr(1)
26018           .m(4)
26019           .n(n)
26020           .k(k)
26021           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26022       }
26023     }
26024   }
26025 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,n_gt_16_strided_cn)26026   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, n_gt_16_strided_cn) {
26027     TEST_REQUIRES_X86_AVX512F;
26028     for (uint32_t n = 17; n < 32; n++) {
26029       for (size_t k = 1; k <= 5; k += 2) {
26030         GemmMicrokernelTester()
26031           .mr(4)
26032           .nr(16)
26033           .kr(1)
26034           .sr(1)
26035           .m(4)
26036           .n(n)
26037           .k(k)
26038           .cn_stride(19)
26039           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26040       }
26041     }
26042   }
26043 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,n_gt_16_strided_a)26044   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, n_gt_16_strided_a) {
26045     TEST_REQUIRES_X86_AVX512F;
26046     for (uint32_t n = 17; n < 32; n++) {
26047       for (size_t k = 1; k <= 5; k += 2) {
26048         GemmMicrokernelTester()
26049           .mr(4)
26050           .nr(16)
26051           .kr(1)
26052           .sr(1)
26053           .m(4)
26054           .n(n)
26055           .k(k)
26056           .a_stride(7)
26057           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26058       }
26059     }
26060   }
26061 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,n_gt_16_subtile)26062   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, n_gt_16_subtile) {
26063     TEST_REQUIRES_X86_AVX512F;
26064     for (uint32_t n = 17; n < 32; n++) {
26065       for (size_t k = 1; k <= 5; k += 2) {
26066         for (uint32_t m = 1; m <= 4; m++) {
26067           GemmMicrokernelTester()
26068             .mr(4)
26069             .nr(16)
26070             .kr(1)
26071             .sr(1)
26072             .m(m)
26073             .n(n)
26074             .k(k)
26075             .iterations(1)
26076             .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26077         }
26078       }
26079     }
26080   }
26081 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,n_div_16)26082   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, n_div_16) {
26083     TEST_REQUIRES_X86_AVX512F;
26084     for (uint32_t n = 32; n <= 48; n += 16) {
26085       for (size_t k = 1; k <= 5; k += 2) {
26086         GemmMicrokernelTester()
26087           .mr(4)
26088           .nr(16)
26089           .kr(1)
26090           .sr(1)
26091           .m(4)
26092           .n(n)
26093           .k(k)
26094           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26095       }
26096     }
26097   }
26098 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,n_div_16_strided_cn)26099   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, n_div_16_strided_cn) {
26100     TEST_REQUIRES_X86_AVX512F;
26101     for (uint32_t n = 32; n <= 48; n += 16) {
26102       for (size_t k = 1; k <= 5; k += 2) {
26103         GemmMicrokernelTester()
26104           .mr(4)
26105           .nr(16)
26106           .kr(1)
26107           .sr(1)
26108           .m(4)
26109           .n(n)
26110           .k(k)
26111           .cn_stride(19)
26112           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26113       }
26114     }
26115   }
26116 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,n_div_16_strided_a)26117   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, n_div_16_strided_a) {
26118     TEST_REQUIRES_X86_AVX512F;
26119     for (uint32_t n = 32; n <= 48; n += 16) {
26120       for (size_t k = 1; k <= 5; k += 2) {
26121         GemmMicrokernelTester()
26122           .mr(4)
26123           .nr(16)
26124           .kr(1)
26125           .sr(1)
26126           .m(4)
26127           .n(n)
26128           .k(k)
26129           .a_stride(7)
26130           .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26131       }
26132     }
26133   }
26134 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,n_div_16_subtile)26135   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, n_div_16_subtile) {
26136     TEST_REQUIRES_X86_AVX512F;
26137     for (uint32_t n = 32; n <= 48; n += 16) {
26138       for (size_t k = 1; k <= 5; k += 2) {
26139         for (uint32_t m = 1; m <= 4; m++) {
26140           GemmMicrokernelTester()
26141             .mr(4)
26142             .nr(16)
26143             .kr(1)
26144             .sr(1)
26145             .m(m)
26146             .n(n)
26147             .k(k)
26148             .iterations(1)
26149             .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26150         }
26151       }
26152     }
26153   }
26154 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,strided_cm_subtile)26155   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, strided_cm_subtile) {
26156     TEST_REQUIRES_X86_AVX512F;
26157     for (size_t k = 1; k <= 5; k += 2) {
26158       for (uint32_t n = 1; n <= 16; n++) {
26159         for (uint32_t m = 1; m <= 4; m++) {
26160           GemmMicrokernelTester()
26161             .mr(4)
26162             .nr(16)
26163             .kr(1)
26164             .sr(1)
26165             .m(m)
26166             .n(n)
26167             .k(k)
26168             .cm_stride(19)
26169             .iterations(1)
26170             .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26171         }
26172       }
26173     }
26174   }
26175 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,qmin)26176   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, qmin) {
26177     TEST_REQUIRES_X86_AVX512F;
26178     GemmMicrokernelTester()
26179       .mr(4)
26180       .nr(16)
26181       .kr(1)
26182       .sr(1)
26183       .m(4)
26184       .n(16)
26185       .k(1)
26186       .qmin(128)
26187       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26188   }
26189 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,qmax)26190   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, qmax) {
26191     TEST_REQUIRES_X86_AVX512F;
26192     GemmMicrokernelTester()
26193       .mr(4)
26194       .nr(16)
26195       .kr(1)
26196       .sr(1)
26197       .m(4)
26198       .n(16)
26199       .k(1)
26200       .qmax(128)
26201       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26202   }
26203 
TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST,strided_cm)26204   TEST(F32_GEMM_MINMAX_4X16__AVX512F_BROADCAST, strided_cm) {
26205     TEST_REQUIRES_X86_AVX512F;
26206     GemmMicrokernelTester()
26207       .mr(4)
26208       .nr(16)
26209       .kr(1)
26210       .sr(1)
26211       .m(4)
26212       .n(16)
26213       .k(1)
26214       .cm_stride(19)
26215       .Test(xnn_f32_gemm_minmax_ukernel_4x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26216   }
26217 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
26218 
26219 
26220 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,k_eq_1)26221   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, k_eq_1) {
26222     TEST_REQUIRES_X86_AVX512F;
26223     GemmMicrokernelTester()
26224       .mr(5)
26225       .nr(16)
26226       .kr(1)
26227       .sr(1)
26228       .m(5)
26229       .n(16)
26230       .k(1)
26231       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26232   }
26233 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,strided_cn)26234   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, strided_cn) {
26235     TEST_REQUIRES_X86_AVX512F;
26236     GemmMicrokernelTester()
26237       .mr(5)
26238       .nr(16)
26239       .kr(1)
26240       .sr(1)
26241       .m(5)
26242       .n(16)
26243       .k(1)
26244       .cn_stride(19)
26245       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26246   }
26247 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,k_eq_1_strided_a)26248   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, k_eq_1_strided_a) {
26249     TEST_REQUIRES_X86_AVX512F;
26250     GemmMicrokernelTester()
26251       .mr(5)
26252       .nr(16)
26253       .kr(1)
26254       .sr(1)
26255       .m(5)
26256       .n(16)
26257       .k(1)
26258       .a_stride(3)
26259       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26260   }
26261 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,k_eq_1_subtile)26262   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, k_eq_1_subtile) {
26263     TEST_REQUIRES_X86_AVX512F;
26264     for (uint32_t n = 1; n <= 16; n++) {
26265       for (uint32_t m = 1; m <= 5; m++) {
26266         GemmMicrokernelTester()
26267           .mr(5)
26268           .nr(16)
26269           .kr(1)
26270           .sr(1)
26271           .m(m)
26272           .n(n)
26273           .k(1)
26274           .iterations(1)
26275           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26276       }
26277     }
26278   }
26279 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,k_eq_1_subtile_m)26280   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, k_eq_1_subtile_m) {
26281     TEST_REQUIRES_X86_AVX512F;
26282     for (uint32_t m = 1; m <= 5; m++) {
26283       GemmMicrokernelTester()
26284         .mr(5)
26285         .nr(16)
26286         .kr(1)
26287         .sr(1)
26288         .m(m)
26289         .n(16)
26290         .k(1)
26291         .iterations(1)
26292         .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26293     }
26294   }
26295 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,k_eq_1_subtile_n)26296   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, k_eq_1_subtile_n) {
26297     TEST_REQUIRES_X86_AVX512F;
26298     for (uint32_t n = 1; n <= 16; n++) {
26299       GemmMicrokernelTester()
26300         .mr(5)
26301         .nr(16)
26302         .kr(1)
26303         .sr(1)
26304         .m(5)
26305         .n(n)
26306         .k(1)
26307         .iterations(1)
26308         .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26309     }
26310   }
26311 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,k_gt_1)26312   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, k_gt_1) {
26313     TEST_REQUIRES_X86_AVX512F;
26314     for (size_t k = 2; k < 10; k++) {
26315       GemmMicrokernelTester()
26316         .mr(5)
26317         .nr(16)
26318         .kr(1)
26319         .sr(1)
26320         .m(5)
26321         .n(16)
26322         .k(k)
26323         .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26324     }
26325   }
26326 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,k_gt_1_strided_a)26327   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, k_gt_1_strided_a) {
26328     TEST_REQUIRES_X86_AVX512F;
26329     for (size_t k = 2; k < 10; k++) {
26330       GemmMicrokernelTester()
26331         .mr(5)
26332         .nr(16)
26333         .kr(1)
26334         .sr(1)
26335         .m(5)
26336         .n(16)
26337         .k(k)
26338         .a_stride(11)
26339         .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26340     }
26341   }
26342 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,k_gt_1_subtile)26343   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, k_gt_1_subtile) {
26344     TEST_REQUIRES_X86_AVX512F;
26345     for (size_t k = 2; k < 10; k++) {
26346       for (uint32_t n = 1; n <= 16; n++) {
26347         for (uint32_t m = 1; m <= 5; m++) {
26348           GemmMicrokernelTester()
26349             .mr(5)
26350             .nr(16)
26351             .kr(1)
26352             .sr(1)
26353             .m(m)
26354             .n(n)
26355             .k(k)
26356             .iterations(1)
26357             .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26358         }
26359       }
26360     }
26361   }
26362 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,n_gt_16)26363   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, n_gt_16) {
26364     TEST_REQUIRES_X86_AVX512F;
26365     for (uint32_t n = 17; n < 32; n++) {
26366       for (size_t k = 1; k <= 5; k += 2) {
26367         GemmMicrokernelTester()
26368           .mr(5)
26369           .nr(16)
26370           .kr(1)
26371           .sr(1)
26372           .m(5)
26373           .n(n)
26374           .k(k)
26375           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26376       }
26377     }
26378   }
26379 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,n_gt_16_strided_cn)26380   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, n_gt_16_strided_cn) {
26381     TEST_REQUIRES_X86_AVX512F;
26382     for (uint32_t n = 17; n < 32; n++) {
26383       for (size_t k = 1; k <= 5; k += 2) {
26384         GemmMicrokernelTester()
26385           .mr(5)
26386           .nr(16)
26387           .kr(1)
26388           .sr(1)
26389           .m(5)
26390           .n(n)
26391           .k(k)
26392           .cn_stride(19)
26393           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26394       }
26395     }
26396   }
26397 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,n_gt_16_strided_a)26398   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, n_gt_16_strided_a) {
26399     TEST_REQUIRES_X86_AVX512F;
26400     for (uint32_t n = 17; n < 32; n++) {
26401       for (size_t k = 1; k <= 5; k += 2) {
26402         GemmMicrokernelTester()
26403           .mr(5)
26404           .nr(16)
26405           .kr(1)
26406           .sr(1)
26407           .m(5)
26408           .n(n)
26409           .k(k)
26410           .a_stride(7)
26411           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26412       }
26413     }
26414   }
26415 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,n_gt_16_subtile)26416   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, n_gt_16_subtile) {
26417     TEST_REQUIRES_X86_AVX512F;
26418     for (uint32_t n = 17; n < 32; n++) {
26419       for (size_t k = 1; k <= 5; k += 2) {
26420         for (uint32_t m = 1; m <= 5; m++) {
26421           GemmMicrokernelTester()
26422             .mr(5)
26423             .nr(16)
26424             .kr(1)
26425             .sr(1)
26426             .m(m)
26427             .n(n)
26428             .k(k)
26429             .iterations(1)
26430             .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26431         }
26432       }
26433     }
26434   }
26435 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,n_div_16)26436   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, n_div_16) {
26437     TEST_REQUIRES_X86_AVX512F;
26438     for (uint32_t n = 32; n <= 48; n += 16) {
26439       for (size_t k = 1; k <= 5; k += 2) {
26440         GemmMicrokernelTester()
26441           .mr(5)
26442           .nr(16)
26443           .kr(1)
26444           .sr(1)
26445           .m(5)
26446           .n(n)
26447           .k(k)
26448           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26449       }
26450     }
26451   }
26452 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,n_div_16_strided_cn)26453   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, n_div_16_strided_cn) {
26454     TEST_REQUIRES_X86_AVX512F;
26455     for (uint32_t n = 32; n <= 48; n += 16) {
26456       for (size_t k = 1; k <= 5; k += 2) {
26457         GemmMicrokernelTester()
26458           .mr(5)
26459           .nr(16)
26460           .kr(1)
26461           .sr(1)
26462           .m(5)
26463           .n(n)
26464           .k(k)
26465           .cn_stride(19)
26466           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26467       }
26468     }
26469   }
26470 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,n_div_16_strided_a)26471   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, n_div_16_strided_a) {
26472     TEST_REQUIRES_X86_AVX512F;
26473     for (uint32_t n = 32; n <= 48; n += 16) {
26474       for (size_t k = 1; k <= 5; k += 2) {
26475         GemmMicrokernelTester()
26476           .mr(5)
26477           .nr(16)
26478           .kr(1)
26479           .sr(1)
26480           .m(5)
26481           .n(n)
26482           .k(k)
26483           .a_stride(7)
26484           .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26485       }
26486     }
26487   }
26488 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,n_div_16_subtile)26489   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, n_div_16_subtile) {
26490     TEST_REQUIRES_X86_AVX512F;
26491     for (uint32_t n = 32; n <= 48; n += 16) {
26492       for (size_t k = 1; k <= 5; k += 2) {
26493         for (uint32_t m = 1; m <= 5; m++) {
26494           GemmMicrokernelTester()
26495             .mr(5)
26496             .nr(16)
26497             .kr(1)
26498             .sr(1)
26499             .m(m)
26500             .n(n)
26501             .k(k)
26502             .iterations(1)
26503             .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26504         }
26505       }
26506     }
26507   }
26508 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,strided_cm_subtile)26509   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, strided_cm_subtile) {
26510     TEST_REQUIRES_X86_AVX512F;
26511     for (size_t k = 1; k <= 5; k += 2) {
26512       for (uint32_t n = 1; n <= 16; n++) {
26513         for (uint32_t m = 1; m <= 5; m++) {
26514           GemmMicrokernelTester()
26515             .mr(5)
26516             .nr(16)
26517             .kr(1)
26518             .sr(1)
26519             .m(m)
26520             .n(n)
26521             .k(k)
26522             .cm_stride(19)
26523             .iterations(1)
26524             .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26525         }
26526       }
26527     }
26528   }
26529 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,qmin)26530   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, qmin) {
26531     TEST_REQUIRES_X86_AVX512F;
26532     GemmMicrokernelTester()
26533       .mr(5)
26534       .nr(16)
26535       .kr(1)
26536       .sr(1)
26537       .m(5)
26538       .n(16)
26539       .k(1)
26540       .qmin(128)
26541       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26542   }
26543 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,qmax)26544   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, qmax) {
26545     TEST_REQUIRES_X86_AVX512F;
26546     GemmMicrokernelTester()
26547       .mr(5)
26548       .nr(16)
26549       .kr(1)
26550       .sr(1)
26551       .m(5)
26552       .n(16)
26553       .k(1)
26554       .qmax(128)
26555       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26556   }
26557 
TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST,strided_cm)26558   TEST(F32_GEMM_MINMAX_5X16__AVX512F_BROADCAST, strided_cm) {
26559     TEST_REQUIRES_X86_AVX512F;
26560     GemmMicrokernelTester()
26561       .mr(5)
26562       .nr(16)
26563       .kr(1)
26564       .sr(1)
26565       .m(5)
26566       .n(16)
26567       .k(1)
26568       .cm_stride(19)
26569       .Test(xnn_f32_gemm_minmax_ukernel_5x16__avx512f_broadcast, xnn_init_f32_minmax_scalar_params);
26570   }
26571 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
26572 
26573 
26574 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1)26575   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1) {
26576     GemmMicrokernelTester()
26577       .mr(1)
26578       .nr(8)
26579       .kr(1)
26580       .sr(1)
26581       .m(1)
26582       .n(8)
26583       .k(1)
26584       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26585   }
26586 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,strided_cn)26587   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, strided_cn) {
26588     GemmMicrokernelTester()
26589       .mr(1)
26590       .nr(8)
26591       .kr(1)
26592       .sr(1)
26593       .m(1)
26594       .n(8)
26595       .k(1)
26596       .cn_stride(11)
26597       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26598   }
26599 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_strided_a)26600   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_strided_a) {
26601     GemmMicrokernelTester()
26602       .mr(1)
26603       .nr(8)
26604       .kr(1)
26605       .sr(1)
26606       .m(1)
26607       .n(8)
26608       .k(1)
26609       .a_stride(3)
26610       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26611   }
26612 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile)26613   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile) {
26614     for (uint32_t n = 1; n <= 8; n++) {
26615       for (uint32_t m = 1; m <= 1; m++) {
26616         GemmMicrokernelTester()
26617           .mr(1)
26618           .nr(8)
26619           .kr(1)
26620           .sr(1)
26621           .m(m)
26622           .n(n)
26623           .k(1)
26624           .iterations(1)
26625           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26626       }
26627     }
26628   }
26629 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile_m)26630   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile_m) {
26631     for (uint32_t m = 1; m <= 1; m++) {
26632       GemmMicrokernelTester()
26633         .mr(1)
26634         .nr(8)
26635         .kr(1)
26636         .sr(1)
26637         .m(m)
26638         .n(8)
26639         .k(1)
26640         .iterations(1)
26641         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26642     }
26643   }
26644 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile_n)26645   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile_n) {
26646     for (uint32_t n = 1; n <= 8; n++) {
26647       GemmMicrokernelTester()
26648         .mr(1)
26649         .nr(8)
26650         .kr(1)
26651         .sr(1)
26652         .m(1)
26653         .n(n)
26654         .k(1)
26655         .iterations(1)
26656         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26657     }
26658   }
26659 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1)26660   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1) {
26661     for (size_t k = 2; k < 10; k++) {
26662       GemmMicrokernelTester()
26663         .mr(1)
26664         .nr(8)
26665         .kr(1)
26666         .sr(1)
26667         .m(1)
26668         .n(8)
26669         .k(k)
26670         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26671     }
26672   }
26673 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1_strided_a)26674   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1_strided_a) {
26675     for (size_t k = 2; k < 10; k++) {
26676       GemmMicrokernelTester()
26677         .mr(1)
26678         .nr(8)
26679         .kr(1)
26680         .sr(1)
26681         .m(1)
26682         .n(8)
26683         .k(k)
26684         .a_stride(11)
26685         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26686     }
26687   }
26688 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1_subtile)26689   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1_subtile) {
26690     for (size_t k = 2; k < 10; k++) {
26691       for (uint32_t n = 1; n <= 8; n++) {
26692         for (uint32_t m = 1; m <= 1; m++) {
26693           GemmMicrokernelTester()
26694             .mr(1)
26695             .nr(8)
26696             .kr(1)
26697             .sr(1)
26698             .m(m)
26699             .n(n)
26700             .k(k)
26701             .iterations(1)
26702             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26703         }
26704       }
26705     }
26706   }
26707 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8)26708   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8) {
26709     for (uint32_t n = 9; n < 16; n++) {
26710       for (size_t k = 1; k <= 5; k += 2) {
26711         GemmMicrokernelTester()
26712           .mr(1)
26713           .nr(8)
26714           .kr(1)
26715           .sr(1)
26716           .m(1)
26717           .n(n)
26718           .k(k)
26719           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26720       }
26721     }
26722   }
26723 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_strided_cn)26724   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_strided_cn) {
26725     for (uint32_t n = 9; n < 16; n++) {
26726       for (size_t k = 1; k <= 5; k += 2) {
26727         GemmMicrokernelTester()
26728           .mr(1)
26729           .nr(8)
26730           .kr(1)
26731           .sr(1)
26732           .m(1)
26733           .n(n)
26734           .k(k)
26735           .cn_stride(11)
26736           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26737       }
26738     }
26739   }
26740 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_strided_a)26741   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_strided_a) {
26742     for (uint32_t n = 9; n < 16; n++) {
26743       for (size_t k = 1; k <= 5; k += 2) {
26744         GemmMicrokernelTester()
26745           .mr(1)
26746           .nr(8)
26747           .kr(1)
26748           .sr(1)
26749           .m(1)
26750           .n(n)
26751           .k(k)
26752           .a_stride(7)
26753           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26754       }
26755     }
26756   }
26757 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_subtile)26758   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_subtile) {
26759     for (uint32_t n = 9; n < 16; n++) {
26760       for (size_t k = 1; k <= 5; k += 2) {
26761         for (uint32_t m = 1; m <= 1; m++) {
26762           GemmMicrokernelTester()
26763             .mr(1)
26764             .nr(8)
26765             .kr(1)
26766             .sr(1)
26767             .m(m)
26768             .n(n)
26769             .k(k)
26770             .iterations(1)
26771             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26772         }
26773       }
26774     }
26775   }
26776 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,n_div_8)26777   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, n_div_8) {
26778     for (uint32_t n = 16; n <= 24; n += 8) {
26779       for (size_t k = 1; k <= 5; k += 2) {
26780         GemmMicrokernelTester()
26781           .mr(1)
26782           .nr(8)
26783           .kr(1)
26784           .sr(1)
26785           .m(1)
26786           .n(n)
26787           .k(k)
26788           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26789       }
26790     }
26791   }
26792 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_strided_cn)26793   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_strided_cn) {
26794     for (uint32_t n = 16; n <= 24; n += 8) {
26795       for (size_t k = 1; k <= 5; k += 2) {
26796         GemmMicrokernelTester()
26797           .mr(1)
26798           .nr(8)
26799           .kr(1)
26800           .sr(1)
26801           .m(1)
26802           .n(n)
26803           .k(k)
26804           .cn_stride(11)
26805           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26806       }
26807     }
26808   }
26809 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_strided_a)26810   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_strided_a) {
26811     for (uint32_t n = 16; n <= 24; n += 8) {
26812       for (size_t k = 1; k <= 5; k += 2) {
26813         GemmMicrokernelTester()
26814           .mr(1)
26815           .nr(8)
26816           .kr(1)
26817           .sr(1)
26818           .m(1)
26819           .n(n)
26820           .k(k)
26821           .a_stride(7)
26822           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26823       }
26824     }
26825   }
26826 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_subtile)26827   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_subtile) {
26828     for (uint32_t n = 16; n <= 24; n += 8) {
26829       for (size_t k = 1; k <= 5; k += 2) {
26830         for (uint32_t m = 1; m <= 1; m++) {
26831           GemmMicrokernelTester()
26832             .mr(1)
26833             .nr(8)
26834             .kr(1)
26835             .sr(1)
26836             .m(m)
26837             .n(n)
26838             .k(k)
26839             .iterations(1)
26840             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26841         }
26842       }
26843     }
26844   }
26845 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,strided_cm_subtile)26846   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, strided_cm_subtile) {
26847     for (size_t k = 1; k <= 5; k += 2) {
26848       for (uint32_t n = 1; n <= 8; n++) {
26849         for (uint32_t m = 1; m <= 1; m++) {
26850           GemmMicrokernelTester()
26851             .mr(1)
26852             .nr(8)
26853             .kr(1)
26854             .sr(1)
26855             .m(m)
26856             .n(n)
26857             .k(k)
26858             .cm_stride(11)
26859             .iterations(1)
26860             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26861         }
26862       }
26863     }
26864   }
26865 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,qmin)26866   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, qmin) {
26867     GemmMicrokernelTester()
26868       .mr(1)
26869       .nr(8)
26870       .kr(1)
26871       .sr(1)
26872       .m(1)
26873       .n(8)
26874       .k(1)
26875       .qmin(128)
26876       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26877   }
26878 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,qmax)26879   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, qmax) {
26880     GemmMicrokernelTester()
26881       .mr(1)
26882       .nr(8)
26883       .kr(1)
26884       .sr(1)
26885       .m(1)
26886       .n(8)
26887       .k(1)
26888       .qmax(128)
26889       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26890   }
26891 
TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT,strided_cm)26892   TEST(F32_GEMM_MINMAX_1X8__WASMSIMD_ARM_LOADSPLAT, strided_cm) {
26893     GemmMicrokernelTester()
26894       .mr(1)
26895       .nr(8)
26896       .kr(1)
26897       .sr(1)
26898       .m(1)
26899       .n(8)
26900       .k(1)
26901       .cm_stride(11)
26902       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
26903   }
26904 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
26905 
26906 
26907 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_eq_4)26908   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_eq_4) {
26909     GemmMicrokernelTester()
26910       .mr(1)
26911       .nr(8)
26912       .kr(1)
26913       .sr(4)
26914       .m(1)
26915       .n(8)
26916       .k(4)
26917       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
26918   }
26919 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,strided_cn)26920   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, strided_cn) {
26921     GemmMicrokernelTester()
26922       .mr(1)
26923       .nr(8)
26924       .kr(1)
26925       .sr(4)
26926       .m(1)
26927       .n(8)
26928       .k(4)
26929       .cn_stride(11)
26930       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
26931   }
26932 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_eq_4_strided_a)26933   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_eq_4_strided_a) {
26934     GemmMicrokernelTester()
26935       .mr(1)
26936       .nr(8)
26937       .kr(1)
26938       .sr(4)
26939       .m(1)
26940       .n(8)
26941       .k(4)
26942       .a_stride(7)
26943       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
26944   }
26945 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_eq_4_subtile)26946   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_eq_4_subtile) {
26947     for (uint32_t n = 1; n <= 8; n++) {
26948       for (uint32_t m = 1; m <= 1; m++) {
26949         GemmMicrokernelTester()
26950           .mr(1)
26951           .nr(8)
26952           .kr(1)
26953           .sr(4)
26954           .m(m)
26955           .n(n)
26956           .k(4)
26957           .iterations(1)
26958           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
26959       }
26960     }
26961   }
26962 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_eq_4_subtile_m)26963   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_eq_4_subtile_m) {
26964     for (uint32_t m = 1; m <= 1; m++) {
26965       GemmMicrokernelTester()
26966         .mr(1)
26967         .nr(8)
26968         .kr(1)
26969         .sr(4)
26970         .m(m)
26971         .n(8)
26972         .k(4)
26973         .iterations(1)
26974         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
26975     }
26976   }
26977 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_eq_4_subtile_n)26978   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_eq_4_subtile_n) {
26979     for (uint32_t n = 1; n <= 8; n++) {
26980       GemmMicrokernelTester()
26981         .mr(1)
26982         .nr(8)
26983         .kr(1)
26984         .sr(4)
26985         .m(1)
26986         .n(n)
26987         .k(4)
26988         .iterations(1)
26989         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
26990     }
26991   }
26992 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_lt_4)26993   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_lt_4) {
26994     for (size_t k = 1; k < 4; k++) {
26995       GemmMicrokernelTester()
26996         .mr(1)
26997         .nr(8)
26998         .kr(1)
26999         .sr(4)
27000         .m(1)
27001         .n(8)
27002         .k(k)
27003         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27004     }
27005   }
27006 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_lt_4_strided_a)27007   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_lt_4_strided_a) {
27008     for (size_t k = 1; k < 4; k++) {
27009       GemmMicrokernelTester()
27010         .mr(1)
27011         .nr(8)
27012         .kr(1)
27013         .sr(4)
27014         .m(1)
27015         .n(8)
27016         .k(k)
27017         .a_stride(7)
27018         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27019     }
27020   }
27021 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_lt_4_subtile)27022   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_lt_4_subtile) {
27023     for (size_t k = 1; k < 4; k++) {
27024       for (uint32_t n = 1; n <= 8; n++) {
27025         for (uint32_t m = 1; m <= 1; m++) {
27026           GemmMicrokernelTester()
27027             .mr(1)
27028             .nr(8)
27029             .kr(1)
27030             .sr(4)
27031             .m(m)
27032             .n(n)
27033             .k(k)
27034             .iterations(1)
27035             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27036         }
27037       }
27038     }
27039   }
27040 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_gt_4)27041   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_gt_4) {
27042     for (size_t k = 5; k < 8; k++) {
27043       GemmMicrokernelTester()
27044         .mr(1)
27045         .nr(8)
27046         .kr(1)
27047         .sr(4)
27048         .m(1)
27049         .n(8)
27050         .k(k)
27051         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27052     }
27053   }
27054 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_gt_4_strided_a)27055   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_gt_4_strided_a) {
27056     for (size_t k = 5; k < 8; k++) {
27057       GemmMicrokernelTester()
27058         .mr(1)
27059         .nr(8)
27060         .kr(1)
27061         .sr(4)
27062         .m(1)
27063         .n(8)
27064         .k(k)
27065         .a_stride(11)
27066         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27067     }
27068   }
27069 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_gt_4_subtile)27070   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_gt_4_subtile) {
27071     for (size_t k = 5; k < 8; k++) {
27072       for (uint32_t n = 1; n <= 8; n++) {
27073         for (uint32_t m = 1; m <= 1; m++) {
27074           GemmMicrokernelTester()
27075             .mr(1)
27076             .nr(8)
27077             .kr(1)
27078             .sr(4)
27079             .m(m)
27080             .n(n)
27081             .k(k)
27082             .iterations(1)
27083             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27084         }
27085       }
27086     }
27087   }
27088 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_div_4)27089   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_div_4) {
27090     for (size_t k = 8; k <= 40; k += 4) {
27091       GemmMicrokernelTester()
27092         .mr(1)
27093         .nr(8)
27094         .kr(1)
27095         .sr(4)
27096         .m(1)
27097         .n(8)
27098         .k(k)
27099         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27100     }
27101   }
27102 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_div_4_strided_a)27103   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_div_4_strided_a) {
27104     for (size_t k = 8; k <= 40; k += 4) {
27105       GemmMicrokernelTester()
27106         .mr(1)
27107         .nr(8)
27108         .kr(1)
27109         .sr(4)
27110         .m(1)
27111         .n(8)
27112         .k(k)
27113         .a_stride(43)
27114         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27115     }
27116   }
27117 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,k_div_4_subtile)27118   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, k_div_4_subtile) {
27119     for (size_t k = 8; k <= 40; k += 4) {
27120       for (uint32_t n = 1; n <= 8; n++) {
27121         for (uint32_t m = 1; m <= 1; m++) {
27122           GemmMicrokernelTester()
27123             .mr(1)
27124             .nr(8)
27125             .kr(1)
27126             .sr(4)
27127             .m(m)
27128             .n(n)
27129             .k(k)
27130             .iterations(1)
27131             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27132         }
27133       }
27134     }
27135   }
27136 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,n_gt_8)27137   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, n_gt_8) {
27138     for (uint32_t n = 9; n < 16; n++) {
27139       for (size_t k = 1; k <= 20; k += 5) {
27140         GemmMicrokernelTester()
27141           .mr(1)
27142           .nr(8)
27143           .kr(1)
27144           .sr(4)
27145           .m(1)
27146           .n(n)
27147           .k(k)
27148           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27149       }
27150     }
27151   }
27152 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,n_gt_8_strided_cn)27153   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, n_gt_8_strided_cn) {
27154     for (uint32_t n = 9; n < 16; n++) {
27155       for (size_t k = 1; k <= 20; k += 5) {
27156         GemmMicrokernelTester()
27157           .mr(1)
27158           .nr(8)
27159           .kr(1)
27160           .sr(4)
27161           .m(1)
27162           .n(n)
27163           .k(k)
27164           .cn_stride(11)
27165           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27166       }
27167     }
27168   }
27169 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,n_gt_8_strided_a)27170   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, n_gt_8_strided_a) {
27171     for (uint32_t n = 9; n < 16; n++) {
27172       for (size_t k = 1; k <= 20; k += 5) {
27173         GemmMicrokernelTester()
27174           .mr(1)
27175           .nr(8)
27176           .kr(1)
27177           .sr(4)
27178           .m(1)
27179           .n(n)
27180           .k(k)
27181           .a_stride(23)
27182           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27183       }
27184     }
27185   }
27186 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,n_gt_8_subtile)27187   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, n_gt_8_subtile) {
27188     for (uint32_t n = 9; n < 16; n++) {
27189       for (size_t k = 1; k <= 20; k += 5) {
27190         for (uint32_t m = 1; m <= 1; m++) {
27191           GemmMicrokernelTester()
27192             .mr(1)
27193             .nr(8)
27194             .kr(1)
27195             .sr(4)
27196             .m(m)
27197             .n(n)
27198             .k(k)
27199             .iterations(1)
27200             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27201         }
27202       }
27203     }
27204   }
27205 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,n_div_8)27206   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, n_div_8) {
27207     for (uint32_t n = 16; n <= 24; n += 8) {
27208       for (size_t k = 1; k <= 20; k += 5) {
27209         GemmMicrokernelTester()
27210           .mr(1)
27211           .nr(8)
27212           .kr(1)
27213           .sr(4)
27214           .m(1)
27215           .n(n)
27216           .k(k)
27217           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27218       }
27219     }
27220   }
27221 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,n_div_8_strided_cn)27222   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, n_div_8_strided_cn) {
27223     for (uint32_t n = 16; n <= 24; n += 8) {
27224       for (size_t k = 1; k <= 20; k += 5) {
27225         GemmMicrokernelTester()
27226           .mr(1)
27227           .nr(8)
27228           .kr(1)
27229           .sr(4)
27230           .m(1)
27231           .n(n)
27232           .k(k)
27233           .cn_stride(11)
27234           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27235       }
27236     }
27237   }
27238 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,n_div_8_strided_a)27239   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, n_div_8_strided_a) {
27240     for (uint32_t n = 16; n <= 24; n += 8) {
27241       for (size_t k = 1; k <= 20; k += 5) {
27242         GemmMicrokernelTester()
27243           .mr(1)
27244           .nr(8)
27245           .kr(1)
27246           .sr(4)
27247           .m(1)
27248           .n(n)
27249           .k(k)
27250           .a_stride(23)
27251           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27252       }
27253     }
27254   }
27255 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,n_div_8_subtile)27256   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, n_div_8_subtile) {
27257     for (uint32_t n = 16; n <= 24; n += 8) {
27258       for (size_t k = 1; k <= 20; k += 5) {
27259         for (uint32_t m = 1; m <= 1; m++) {
27260           GemmMicrokernelTester()
27261             .mr(1)
27262             .nr(8)
27263             .kr(1)
27264             .sr(4)
27265             .m(m)
27266             .n(n)
27267             .k(k)
27268             .iterations(1)
27269             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27270         }
27271       }
27272     }
27273   }
27274 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,strided_cm_subtile)27275   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, strided_cm_subtile) {
27276     for (size_t k = 1; k <= 20; k += 5) {
27277       for (uint32_t n = 1; n <= 8; n++) {
27278         for (uint32_t m = 1; m <= 1; m++) {
27279           GemmMicrokernelTester()
27280             .mr(1)
27281             .nr(8)
27282             .kr(1)
27283             .sr(4)
27284             .m(m)
27285             .n(n)
27286             .k(k)
27287             .cm_stride(11)
27288             .iterations(1)
27289             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27290         }
27291       }
27292     }
27293   }
27294 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,qmin)27295   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, qmin) {
27296     GemmMicrokernelTester()
27297       .mr(1)
27298       .nr(8)
27299       .kr(1)
27300       .sr(4)
27301       .m(1)
27302       .n(8)
27303       .k(4)
27304       .qmin(128)
27305       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27306   }
27307 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,qmax)27308   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, qmax) {
27309     GemmMicrokernelTester()
27310       .mr(1)
27311       .nr(8)
27312       .kr(1)
27313       .sr(4)
27314       .m(1)
27315       .n(8)
27316       .k(4)
27317       .qmax(128)
27318       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27319   }
27320 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM,strided_cm)27321   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_ARM, strided_cm) {
27322     GemmMicrokernelTester()
27323       .mr(1)
27324       .nr(8)
27325       .kr(1)
27326       .sr(4)
27327       .m(1)
27328       .n(8)
27329       .k(4)
27330       .cm_stride(11)
27331       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
27332   }
27333 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
27334 
27335 
27336 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_eq_4)27337   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_eq_4) {
27338     GemmMicrokernelTester()
27339       .mr(1)
27340       .nr(8)
27341       .kr(1)
27342       .sr(4)
27343       .m(1)
27344       .n(8)
27345       .k(4)
27346       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27347   }
27348 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,strided_cn)27349   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, strided_cn) {
27350     GemmMicrokernelTester()
27351       .mr(1)
27352       .nr(8)
27353       .kr(1)
27354       .sr(4)
27355       .m(1)
27356       .n(8)
27357       .k(4)
27358       .cn_stride(11)
27359       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27360   }
27361 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_eq_4_strided_a)27362   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_eq_4_strided_a) {
27363     GemmMicrokernelTester()
27364       .mr(1)
27365       .nr(8)
27366       .kr(1)
27367       .sr(4)
27368       .m(1)
27369       .n(8)
27370       .k(4)
27371       .a_stride(7)
27372       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27373   }
27374 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_eq_4_subtile)27375   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_eq_4_subtile) {
27376     for (uint32_t n = 1; n <= 8; n++) {
27377       for (uint32_t m = 1; m <= 1; m++) {
27378         GemmMicrokernelTester()
27379           .mr(1)
27380           .nr(8)
27381           .kr(1)
27382           .sr(4)
27383           .m(m)
27384           .n(n)
27385           .k(4)
27386           .iterations(1)
27387           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27388       }
27389     }
27390   }
27391 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_eq_4_subtile_m)27392   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_eq_4_subtile_m) {
27393     for (uint32_t m = 1; m <= 1; m++) {
27394       GemmMicrokernelTester()
27395         .mr(1)
27396         .nr(8)
27397         .kr(1)
27398         .sr(4)
27399         .m(m)
27400         .n(8)
27401         .k(4)
27402         .iterations(1)
27403         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27404     }
27405   }
27406 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_eq_4_subtile_n)27407   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_eq_4_subtile_n) {
27408     for (uint32_t n = 1; n <= 8; n++) {
27409       GemmMicrokernelTester()
27410         .mr(1)
27411         .nr(8)
27412         .kr(1)
27413         .sr(4)
27414         .m(1)
27415         .n(n)
27416         .k(4)
27417         .iterations(1)
27418         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27419     }
27420   }
27421 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_lt_4)27422   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_lt_4) {
27423     for (size_t k = 1; k < 4; k++) {
27424       GemmMicrokernelTester()
27425         .mr(1)
27426         .nr(8)
27427         .kr(1)
27428         .sr(4)
27429         .m(1)
27430         .n(8)
27431         .k(k)
27432         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27433     }
27434   }
27435 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_lt_4_strided_a)27436   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_lt_4_strided_a) {
27437     for (size_t k = 1; k < 4; k++) {
27438       GemmMicrokernelTester()
27439         .mr(1)
27440         .nr(8)
27441         .kr(1)
27442         .sr(4)
27443         .m(1)
27444         .n(8)
27445         .k(k)
27446         .a_stride(7)
27447         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27448     }
27449   }
27450 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_lt_4_subtile)27451   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_lt_4_subtile) {
27452     for (size_t k = 1; k < 4; k++) {
27453       for (uint32_t n = 1; n <= 8; n++) {
27454         for (uint32_t m = 1; m <= 1; m++) {
27455           GemmMicrokernelTester()
27456             .mr(1)
27457             .nr(8)
27458             .kr(1)
27459             .sr(4)
27460             .m(m)
27461             .n(n)
27462             .k(k)
27463             .iterations(1)
27464             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27465         }
27466       }
27467     }
27468   }
27469 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_gt_4)27470   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_gt_4) {
27471     for (size_t k = 5; k < 8; k++) {
27472       GemmMicrokernelTester()
27473         .mr(1)
27474         .nr(8)
27475         .kr(1)
27476         .sr(4)
27477         .m(1)
27478         .n(8)
27479         .k(k)
27480         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27481     }
27482   }
27483 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_gt_4_strided_a)27484   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_gt_4_strided_a) {
27485     for (size_t k = 5; k < 8; k++) {
27486       GemmMicrokernelTester()
27487         .mr(1)
27488         .nr(8)
27489         .kr(1)
27490         .sr(4)
27491         .m(1)
27492         .n(8)
27493         .k(k)
27494         .a_stride(11)
27495         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27496     }
27497   }
27498 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_gt_4_subtile)27499   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_gt_4_subtile) {
27500     for (size_t k = 5; k < 8; k++) {
27501       for (uint32_t n = 1; n <= 8; n++) {
27502         for (uint32_t m = 1; m <= 1; m++) {
27503           GemmMicrokernelTester()
27504             .mr(1)
27505             .nr(8)
27506             .kr(1)
27507             .sr(4)
27508             .m(m)
27509             .n(n)
27510             .k(k)
27511             .iterations(1)
27512             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27513         }
27514       }
27515     }
27516   }
27517 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_div_4)27518   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_div_4) {
27519     for (size_t k = 8; k <= 40; k += 4) {
27520       GemmMicrokernelTester()
27521         .mr(1)
27522         .nr(8)
27523         .kr(1)
27524         .sr(4)
27525         .m(1)
27526         .n(8)
27527         .k(k)
27528         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27529     }
27530   }
27531 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_div_4_strided_a)27532   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_div_4_strided_a) {
27533     for (size_t k = 8; k <= 40; k += 4) {
27534       GemmMicrokernelTester()
27535         .mr(1)
27536         .nr(8)
27537         .kr(1)
27538         .sr(4)
27539         .m(1)
27540         .n(8)
27541         .k(k)
27542         .a_stride(43)
27543         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27544     }
27545   }
27546 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,k_div_4_subtile)27547   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, k_div_4_subtile) {
27548     for (size_t k = 8; k <= 40; k += 4) {
27549       for (uint32_t n = 1; n <= 8; n++) {
27550         for (uint32_t m = 1; m <= 1; m++) {
27551           GemmMicrokernelTester()
27552             .mr(1)
27553             .nr(8)
27554             .kr(1)
27555             .sr(4)
27556             .m(m)
27557             .n(n)
27558             .k(k)
27559             .iterations(1)
27560             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27561         }
27562       }
27563     }
27564   }
27565 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,n_gt_8)27566   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, n_gt_8) {
27567     for (uint32_t n = 9; n < 16; n++) {
27568       for (size_t k = 1; k <= 20; k += 5) {
27569         GemmMicrokernelTester()
27570           .mr(1)
27571           .nr(8)
27572           .kr(1)
27573           .sr(4)
27574           .m(1)
27575           .n(n)
27576           .k(k)
27577           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27578       }
27579     }
27580   }
27581 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,n_gt_8_strided_cn)27582   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, n_gt_8_strided_cn) {
27583     for (uint32_t n = 9; n < 16; n++) {
27584       for (size_t k = 1; k <= 20; k += 5) {
27585         GemmMicrokernelTester()
27586           .mr(1)
27587           .nr(8)
27588           .kr(1)
27589           .sr(4)
27590           .m(1)
27591           .n(n)
27592           .k(k)
27593           .cn_stride(11)
27594           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27595       }
27596     }
27597   }
27598 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,n_gt_8_strided_a)27599   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, n_gt_8_strided_a) {
27600     for (uint32_t n = 9; n < 16; n++) {
27601       for (size_t k = 1; k <= 20; k += 5) {
27602         GemmMicrokernelTester()
27603           .mr(1)
27604           .nr(8)
27605           .kr(1)
27606           .sr(4)
27607           .m(1)
27608           .n(n)
27609           .k(k)
27610           .a_stride(23)
27611           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27612       }
27613     }
27614   }
27615 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,n_gt_8_subtile)27616   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, n_gt_8_subtile) {
27617     for (uint32_t n = 9; n < 16; n++) {
27618       for (size_t k = 1; k <= 20; k += 5) {
27619         for (uint32_t m = 1; m <= 1; m++) {
27620           GemmMicrokernelTester()
27621             .mr(1)
27622             .nr(8)
27623             .kr(1)
27624             .sr(4)
27625             .m(m)
27626             .n(n)
27627             .k(k)
27628             .iterations(1)
27629             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27630         }
27631       }
27632     }
27633   }
27634 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,n_div_8)27635   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, n_div_8) {
27636     for (uint32_t n = 16; n <= 24; n += 8) {
27637       for (size_t k = 1; k <= 20; k += 5) {
27638         GemmMicrokernelTester()
27639           .mr(1)
27640           .nr(8)
27641           .kr(1)
27642           .sr(4)
27643           .m(1)
27644           .n(n)
27645           .k(k)
27646           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27647       }
27648     }
27649   }
27650 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,n_div_8_strided_cn)27651   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, n_div_8_strided_cn) {
27652     for (uint32_t n = 16; n <= 24; n += 8) {
27653       for (size_t k = 1; k <= 20; k += 5) {
27654         GemmMicrokernelTester()
27655           .mr(1)
27656           .nr(8)
27657           .kr(1)
27658           .sr(4)
27659           .m(1)
27660           .n(n)
27661           .k(k)
27662           .cn_stride(11)
27663           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27664       }
27665     }
27666   }
27667 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,n_div_8_strided_a)27668   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, n_div_8_strided_a) {
27669     for (uint32_t n = 16; n <= 24; n += 8) {
27670       for (size_t k = 1; k <= 20; k += 5) {
27671         GemmMicrokernelTester()
27672           .mr(1)
27673           .nr(8)
27674           .kr(1)
27675           .sr(4)
27676           .m(1)
27677           .n(n)
27678           .k(k)
27679           .a_stride(23)
27680           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27681       }
27682     }
27683   }
27684 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,n_div_8_subtile)27685   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, n_div_8_subtile) {
27686     for (uint32_t n = 16; n <= 24; n += 8) {
27687       for (size_t k = 1; k <= 20; k += 5) {
27688         for (uint32_t m = 1; m <= 1; m++) {
27689           GemmMicrokernelTester()
27690             .mr(1)
27691             .nr(8)
27692             .kr(1)
27693             .sr(4)
27694             .m(m)
27695             .n(n)
27696             .k(k)
27697             .iterations(1)
27698             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27699         }
27700       }
27701     }
27702   }
27703 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,strided_cm_subtile)27704   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, strided_cm_subtile) {
27705     for (size_t k = 1; k <= 20; k += 5) {
27706       for (uint32_t n = 1; n <= 8; n++) {
27707         for (uint32_t m = 1; m <= 1; m++) {
27708           GemmMicrokernelTester()
27709             .mr(1)
27710             .nr(8)
27711             .kr(1)
27712             .sr(4)
27713             .m(m)
27714             .n(n)
27715             .k(k)
27716             .cm_stride(11)
27717             .iterations(1)
27718             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27719         }
27720       }
27721     }
27722   }
27723 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,qmin)27724   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, qmin) {
27725     GemmMicrokernelTester()
27726       .mr(1)
27727       .nr(8)
27728       .kr(1)
27729       .sr(4)
27730       .m(1)
27731       .n(8)
27732       .k(4)
27733       .qmin(128)
27734       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27735   }
27736 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,qmax)27737   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, qmax) {
27738     GemmMicrokernelTester()
27739       .mr(1)
27740       .nr(8)
27741       .kr(1)
27742       .sr(4)
27743       .m(1)
27744       .n(8)
27745       .k(4)
27746       .qmax(128)
27747       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27748   }
27749 
TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86,strided_cm)27750   TEST(F32_GEMM_MINMAX_1X8S4__WASMSIMD_X86, strided_cm) {
27751     GemmMicrokernelTester()
27752       .mr(1)
27753       .nr(8)
27754       .kr(1)
27755       .sr(4)
27756       .m(1)
27757       .n(8)
27758       .k(4)
27759       .cm_stride(11)
27760       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
27761   }
27762 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
27763 
27764 
27765 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1)27766   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1) {
27767     GemmMicrokernelTester()
27768       .mr(3)
27769       .nr(8)
27770       .kr(1)
27771       .sr(1)
27772       .m(3)
27773       .n(8)
27774       .k(1)
27775       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27776   }
27777 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,strided_cn)27778   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, strided_cn) {
27779     GemmMicrokernelTester()
27780       .mr(3)
27781       .nr(8)
27782       .kr(1)
27783       .sr(1)
27784       .m(3)
27785       .n(8)
27786       .k(1)
27787       .cn_stride(11)
27788       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27789   }
27790 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_strided_a)27791   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_strided_a) {
27792     GemmMicrokernelTester()
27793       .mr(3)
27794       .nr(8)
27795       .kr(1)
27796       .sr(1)
27797       .m(3)
27798       .n(8)
27799       .k(1)
27800       .a_stride(3)
27801       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27802   }
27803 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile)27804   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile) {
27805     for (uint32_t n = 1; n <= 8; n++) {
27806       for (uint32_t m = 1; m <= 3; m++) {
27807         GemmMicrokernelTester()
27808           .mr(3)
27809           .nr(8)
27810           .kr(1)
27811           .sr(1)
27812           .m(m)
27813           .n(n)
27814           .k(1)
27815           .iterations(1)
27816           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27817       }
27818     }
27819   }
27820 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile_m)27821   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile_m) {
27822     for (uint32_t m = 1; m <= 3; m++) {
27823       GemmMicrokernelTester()
27824         .mr(3)
27825         .nr(8)
27826         .kr(1)
27827         .sr(1)
27828         .m(m)
27829         .n(8)
27830         .k(1)
27831         .iterations(1)
27832         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27833     }
27834   }
27835 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile_n)27836   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile_n) {
27837     for (uint32_t n = 1; n <= 8; n++) {
27838       GemmMicrokernelTester()
27839         .mr(3)
27840         .nr(8)
27841         .kr(1)
27842         .sr(1)
27843         .m(3)
27844         .n(n)
27845         .k(1)
27846         .iterations(1)
27847         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27848     }
27849   }
27850 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1)27851   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1) {
27852     for (size_t k = 2; k < 10; k++) {
27853       GemmMicrokernelTester()
27854         .mr(3)
27855         .nr(8)
27856         .kr(1)
27857         .sr(1)
27858         .m(3)
27859         .n(8)
27860         .k(k)
27861         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27862     }
27863   }
27864 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1_strided_a)27865   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1_strided_a) {
27866     for (size_t k = 2; k < 10; k++) {
27867       GemmMicrokernelTester()
27868         .mr(3)
27869         .nr(8)
27870         .kr(1)
27871         .sr(1)
27872         .m(3)
27873         .n(8)
27874         .k(k)
27875         .a_stride(11)
27876         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27877     }
27878   }
27879 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1_subtile)27880   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1_subtile) {
27881     for (size_t k = 2; k < 10; k++) {
27882       for (uint32_t n = 1; n <= 8; n++) {
27883         for (uint32_t m = 1; m <= 3; m++) {
27884           GemmMicrokernelTester()
27885             .mr(3)
27886             .nr(8)
27887             .kr(1)
27888             .sr(1)
27889             .m(m)
27890             .n(n)
27891             .k(k)
27892             .iterations(1)
27893             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27894         }
27895       }
27896     }
27897   }
27898 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8)27899   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8) {
27900     for (uint32_t n = 9; n < 16; n++) {
27901       for (size_t k = 1; k <= 5; k += 2) {
27902         GemmMicrokernelTester()
27903           .mr(3)
27904           .nr(8)
27905           .kr(1)
27906           .sr(1)
27907           .m(3)
27908           .n(n)
27909           .k(k)
27910           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27911       }
27912     }
27913   }
27914 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_strided_cn)27915   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_strided_cn) {
27916     for (uint32_t n = 9; n < 16; n++) {
27917       for (size_t k = 1; k <= 5; k += 2) {
27918         GemmMicrokernelTester()
27919           .mr(3)
27920           .nr(8)
27921           .kr(1)
27922           .sr(1)
27923           .m(3)
27924           .n(n)
27925           .k(k)
27926           .cn_stride(11)
27927           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27928       }
27929     }
27930   }
27931 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_strided_a)27932   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_strided_a) {
27933     for (uint32_t n = 9; n < 16; n++) {
27934       for (size_t k = 1; k <= 5; k += 2) {
27935         GemmMicrokernelTester()
27936           .mr(3)
27937           .nr(8)
27938           .kr(1)
27939           .sr(1)
27940           .m(3)
27941           .n(n)
27942           .k(k)
27943           .a_stride(7)
27944           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27945       }
27946     }
27947   }
27948 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_subtile)27949   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_subtile) {
27950     for (uint32_t n = 9; n < 16; n++) {
27951       for (size_t k = 1; k <= 5; k += 2) {
27952         for (uint32_t m = 1; m <= 3; m++) {
27953           GemmMicrokernelTester()
27954             .mr(3)
27955             .nr(8)
27956             .kr(1)
27957             .sr(1)
27958             .m(m)
27959             .n(n)
27960             .k(k)
27961             .iterations(1)
27962             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27963         }
27964       }
27965     }
27966   }
27967 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,n_div_8)27968   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, n_div_8) {
27969     for (uint32_t n = 16; n <= 24; n += 8) {
27970       for (size_t k = 1; k <= 5; k += 2) {
27971         GemmMicrokernelTester()
27972           .mr(3)
27973           .nr(8)
27974           .kr(1)
27975           .sr(1)
27976           .m(3)
27977           .n(n)
27978           .k(k)
27979           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27980       }
27981     }
27982   }
27983 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_strided_cn)27984   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_strided_cn) {
27985     for (uint32_t n = 16; n <= 24; n += 8) {
27986       for (size_t k = 1; k <= 5; k += 2) {
27987         GemmMicrokernelTester()
27988           .mr(3)
27989           .nr(8)
27990           .kr(1)
27991           .sr(1)
27992           .m(3)
27993           .n(n)
27994           .k(k)
27995           .cn_stride(11)
27996           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
27997       }
27998     }
27999   }
28000 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_strided_a)28001   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_strided_a) {
28002     for (uint32_t n = 16; n <= 24; n += 8) {
28003       for (size_t k = 1; k <= 5; k += 2) {
28004         GemmMicrokernelTester()
28005           .mr(3)
28006           .nr(8)
28007           .kr(1)
28008           .sr(1)
28009           .m(3)
28010           .n(n)
28011           .k(k)
28012           .a_stride(7)
28013           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
28014       }
28015     }
28016   }
28017 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_subtile)28018   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_subtile) {
28019     for (uint32_t n = 16; n <= 24; n += 8) {
28020       for (size_t k = 1; k <= 5; k += 2) {
28021         for (uint32_t m = 1; m <= 3; m++) {
28022           GemmMicrokernelTester()
28023             .mr(3)
28024             .nr(8)
28025             .kr(1)
28026             .sr(1)
28027             .m(m)
28028             .n(n)
28029             .k(k)
28030             .iterations(1)
28031             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
28032         }
28033       }
28034     }
28035   }
28036 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,strided_cm_subtile)28037   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, strided_cm_subtile) {
28038     for (size_t k = 1; k <= 5; k += 2) {
28039       for (uint32_t n = 1; n <= 8; n++) {
28040         for (uint32_t m = 1; m <= 3; m++) {
28041           GemmMicrokernelTester()
28042             .mr(3)
28043             .nr(8)
28044             .kr(1)
28045             .sr(1)
28046             .m(m)
28047             .n(n)
28048             .k(k)
28049             .cm_stride(11)
28050             .iterations(1)
28051             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
28052         }
28053       }
28054     }
28055   }
28056 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,qmin)28057   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, qmin) {
28058     GemmMicrokernelTester()
28059       .mr(3)
28060       .nr(8)
28061       .kr(1)
28062       .sr(1)
28063       .m(3)
28064       .n(8)
28065       .k(1)
28066       .qmin(128)
28067       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
28068   }
28069 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,qmax)28070   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, qmax) {
28071     GemmMicrokernelTester()
28072       .mr(3)
28073       .nr(8)
28074       .kr(1)
28075       .sr(1)
28076       .m(3)
28077       .n(8)
28078       .k(1)
28079       .qmax(128)
28080       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
28081   }
28082 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT,strided_cm)28083   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_LOADSPLAT, strided_cm) {
28084     GemmMicrokernelTester()
28085       .mr(3)
28086       .nr(8)
28087       .kr(1)
28088       .sr(1)
28089       .m(3)
28090       .n(8)
28091       .k(1)
28092       .cm_stride(11)
28093       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
28094   }
28095 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
28096 
28097 
28098 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_eq_4)28099   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_eq_4) {
28100     GemmMicrokernelTester()
28101       .mr(3)
28102       .nr(8)
28103       .kr(1)
28104       .sr(1)
28105       .m(3)
28106       .n(8)
28107       .k(4)
28108       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28109   }
28110 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,strided_cn)28111   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, strided_cn) {
28112     GemmMicrokernelTester()
28113       .mr(3)
28114       .nr(8)
28115       .kr(1)
28116       .sr(1)
28117       .m(3)
28118       .n(8)
28119       .k(4)
28120       .cn_stride(11)
28121       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28122   }
28123 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_eq_4_strided_a)28124   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_eq_4_strided_a) {
28125     GemmMicrokernelTester()
28126       .mr(3)
28127       .nr(8)
28128       .kr(1)
28129       .sr(1)
28130       .m(3)
28131       .n(8)
28132       .k(4)
28133       .a_stride(7)
28134       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28135   }
28136 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_eq_4_subtile)28137   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_eq_4_subtile) {
28138     for (uint32_t n = 1; n <= 8; n++) {
28139       for (uint32_t m = 1; m <= 3; m++) {
28140         GemmMicrokernelTester()
28141           .mr(3)
28142           .nr(8)
28143           .kr(1)
28144           .sr(1)
28145           .m(m)
28146           .n(n)
28147           .k(4)
28148           .iterations(1)
28149           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28150       }
28151     }
28152   }
28153 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_eq_4_subtile_m)28154   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_eq_4_subtile_m) {
28155     for (uint32_t m = 1; m <= 3; m++) {
28156       GemmMicrokernelTester()
28157         .mr(3)
28158         .nr(8)
28159         .kr(1)
28160         .sr(1)
28161         .m(m)
28162         .n(8)
28163         .k(4)
28164         .iterations(1)
28165         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28166     }
28167   }
28168 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_eq_4_subtile_n)28169   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_eq_4_subtile_n) {
28170     for (uint32_t n = 1; n <= 8; n++) {
28171       GemmMicrokernelTester()
28172         .mr(3)
28173         .nr(8)
28174         .kr(1)
28175         .sr(1)
28176         .m(3)
28177         .n(n)
28178         .k(4)
28179         .iterations(1)
28180         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28181     }
28182   }
28183 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_lt_4)28184   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_lt_4) {
28185     for (size_t k = 1; k < 4; k++) {
28186       GemmMicrokernelTester()
28187         .mr(3)
28188         .nr(8)
28189         .kr(1)
28190         .sr(1)
28191         .m(3)
28192         .n(8)
28193         .k(k)
28194         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28195     }
28196   }
28197 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_lt_4_strided_a)28198   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_lt_4_strided_a) {
28199     for (size_t k = 1; k < 4; k++) {
28200       GemmMicrokernelTester()
28201         .mr(3)
28202         .nr(8)
28203         .kr(1)
28204         .sr(1)
28205         .m(3)
28206         .n(8)
28207         .k(k)
28208         .a_stride(7)
28209         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28210     }
28211   }
28212 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_lt_4_subtile)28213   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_lt_4_subtile) {
28214     for (size_t k = 1; k < 4; k++) {
28215       for (uint32_t n = 1; n <= 8; n++) {
28216         for (uint32_t m = 1; m <= 3; m++) {
28217           GemmMicrokernelTester()
28218             .mr(3)
28219             .nr(8)
28220             .kr(1)
28221             .sr(1)
28222             .m(m)
28223             .n(n)
28224             .k(k)
28225             .iterations(1)
28226             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28227         }
28228       }
28229     }
28230   }
28231 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_gt_4)28232   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_gt_4) {
28233     for (size_t k = 5; k < 8; k++) {
28234       GemmMicrokernelTester()
28235         .mr(3)
28236         .nr(8)
28237         .kr(1)
28238         .sr(1)
28239         .m(3)
28240         .n(8)
28241         .k(k)
28242         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28243     }
28244   }
28245 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_gt_4_strided_a)28246   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_gt_4_strided_a) {
28247     for (size_t k = 5; k < 8; k++) {
28248       GemmMicrokernelTester()
28249         .mr(3)
28250         .nr(8)
28251         .kr(1)
28252         .sr(1)
28253         .m(3)
28254         .n(8)
28255         .k(k)
28256         .a_stride(11)
28257         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28258     }
28259   }
28260 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_gt_4_subtile)28261   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_gt_4_subtile) {
28262     for (size_t k = 5; k < 8; k++) {
28263       for (uint32_t n = 1; n <= 8; n++) {
28264         for (uint32_t m = 1; m <= 3; m++) {
28265           GemmMicrokernelTester()
28266             .mr(3)
28267             .nr(8)
28268             .kr(1)
28269             .sr(1)
28270             .m(m)
28271             .n(n)
28272             .k(k)
28273             .iterations(1)
28274             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28275         }
28276       }
28277     }
28278   }
28279 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_div_4)28280   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_div_4) {
28281     for (size_t k = 8; k <= 40; k += 4) {
28282       GemmMicrokernelTester()
28283         .mr(3)
28284         .nr(8)
28285         .kr(1)
28286         .sr(1)
28287         .m(3)
28288         .n(8)
28289         .k(k)
28290         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28291     }
28292   }
28293 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_div_4_strided_a)28294   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_div_4_strided_a) {
28295     for (size_t k = 8; k <= 40; k += 4) {
28296       GemmMicrokernelTester()
28297         .mr(3)
28298         .nr(8)
28299         .kr(1)
28300         .sr(1)
28301         .m(3)
28302         .n(8)
28303         .k(k)
28304         .a_stride(43)
28305         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28306     }
28307   }
28308 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,k_div_4_subtile)28309   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, k_div_4_subtile) {
28310     for (size_t k = 8; k <= 40; k += 4) {
28311       for (uint32_t n = 1; n <= 8; n++) {
28312         for (uint32_t m = 1; m <= 3; m++) {
28313           GemmMicrokernelTester()
28314             .mr(3)
28315             .nr(8)
28316             .kr(1)
28317             .sr(1)
28318             .m(m)
28319             .n(n)
28320             .k(k)
28321             .iterations(1)
28322             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28323         }
28324       }
28325     }
28326   }
28327 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,n_gt_8)28328   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, n_gt_8) {
28329     for (uint32_t n = 9; n < 16; n++) {
28330       for (size_t k = 1; k <= 20; k += 5) {
28331         GemmMicrokernelTester()
28332           .mr(3)
28333           .nr(8)
28334           .kr(1)
28335           .sr(1)
28336           .m(3)
28337           .n(n)
28338           .k(k)
28339           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28340       }
28341     }
28342   }
28343 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,n_gt_8_strided_cn)28344   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, n_gt_8_strided_cn) {
28345     for (uint32_t n = 9; n < 16; n++) {
28346       for (size_t k = 1; k <= 20; k += 5) {
28347         GemmMicrokernelTester()
28348           .mr(3)
28349           .nr(8)
28350           .kr(1)
28351           .sr(1)
28352           .m(3)
28353           .n(n)
28354           .k(k)
28355           .cn_stride(11)
28356           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28357       }
28358     }
28359   }
28360 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,n_gt_8_strided_a)28361   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, n_gt_8_strided_a) {
28362     for (uint32_t n = 9; n < 16; n++) {
28363       for (size_t k = 1; k <= 20; k += 5) {
28364         GemmMicrokernelTester()
28365           .mr(3)
28366           .nr(8)
28367           .kr(1)
28368           .sr(1)
28369           .m(3)
28370           .n(n)
28371           .k(k)
28372           .a_stride(23)
28373           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28374       }
28375     }
28376   }
28377 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,n_gt_8_subtile)28378   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, n_gt_8_subtile) {
28379     for (uint32_t n = 9; n < 16; n++) {
28380       for (size_t k = 1; k <= 20; k += 5) {
28381         for (uint32_t m = 1; m <= 3; m++) {
28382           GemmMicrokernelTester()
28383             .mr(3)
28384             .nr(8)
28385             .kr(1)
28386             .sr(1)
28387             .m(m)
28388             .n(n)
28389             .k(k)
28390             .iterations(1)
28391             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28392         }
28393       }
28394     }
28395   }
28396 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,n_div_8)28397   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, n_div_8) {
28398     for (uint32_t n = 16; n <= 24; n += 8) {
28399       for (size_t k = 1; k <= 20; k += 5) {
28400         GemmMicrokernelTester()
28401           .mr(3)
28402           .nr(8)
28403           .kr(1)
28404           .sr(1)
28405           .m(3)
28406           .n(n)
28407           .k(k)
28408           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28409       }
28410     }
28411   }
28412 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,n_div_8_strided_cn)28413   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, n_div_8_strided_cn) {
28414     for (uint32_t n = 16; n <= 24; n += 8) {
28415       for (size_t k = 1; k <= 20; k += 5) {
28416         GemmMicrokernelTester()
28417           .mr(3)
28418           .nr(8)
28419           .kr(1)
28420           .sr(1)
28421           .m(3)
28422           .n(n)
28423           .k(k)
28424           .cn_stride(11)
28425           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28426       }
28427     }
28428   }
28429 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,n_div_8_strided_a)28430   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, n_div_8_strided_a) {
28431     for (uint32_t n = 16; n <= 24; n += 8) {
28432       for (size_t k = 1; k <= 20; k += 5) {
28433         GemmMicrokernelTester()
28434           .mr(3)
28435           .nr(8)
28436           .kr(1)
28437           .sr(1)
28438           .m(3)
28439           .n(n)
28440           .k(k)
28441           .a_stride(23)
28442           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28443       }
28444     }
28445   }
28446 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,n_div_8_subtile)28447   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, n_div_8_subtile) {
28448     for (uint32_t n = 16; n <= 24; n += 8) {
28449       for (size_t k = 1; k <= 20; k += 5) {
28450         for (uint32_t m = 1; m <= 3; m++) {
28451           GemmMicrokernelTester()
28452             .mr(3)
28453             .nr(8)
28454             .kr(1)
28455             .sr(1)
28456             .m(m)
28457             .n(n)
28458             .k(k)
28459             .iterations(1)
28460             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28461         }
28462       }
28463     }
28464   }
28465 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,strided_cm_subtile)28466   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, strided_cm_subtile) {
28467     for (size_t k = 1; k <= 20; k += 5) {
28468       for (uint32_t n = 1; n <= 8; n++) {
28469         for (uint32_t m = 1; m <= 3; m++) {
28470           GemmMicrokernelTester()
28471             .mr(3)
28472             .nr(8)
28473             .kr(1)
28474             .sr(1)
28475             .m(m)
28476             .n(n)
28477             .k(k)
28478             .cm_stride(11)
28479             .iterations(1)
28480             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28481         }
28482       }
28483     }
28484   }
28485 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,qmin)28486   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, qmin) {
28487     GemmMicrokernelTester()
28488       .mr(3)
28489       .nr(8)
28490       .kr(1)
28491       .sr(1)
28492       .m(3)
28493       .n(8)
28494       .k(4)
28495       .qmin(128)
28496       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28497   }
28498 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,qmax)28499   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, qmax) {
28500     GemmMicrokernelTester()
28501       .mr(3)
28502       .nr(8)
28503       .kr(1)
28504       .sr(1)
28505       .m(3)
28506       .n(8)
28507       .k(4)
28508       .qmax(128)
28509       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28510   }
28511 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT,strided_cm)28512   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_ARM_SPLAT, strided_cm) {
28513     GemmMicrokernelTester()
28514       .mr(3)
28515       .nr(8)
28516       .kr(1)
28517       .sr(1)
28518       .m(3)
28519       .n(8)
28520       .k(4)
28521       .cm_stride(11)
28522       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
28523   }
28524 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
28525 
28526 
28527 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_eq_4)28528   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_eq_4) {
28529     GemmMicrokernelTester()
28530       .mr(3)
28531       .nr(8)
28532       .kr(1)
28533       .sr(1)
28534       .m(3)
28535       .n(8)
28536       .k(4)
28537       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28538   }
28539 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,strided_cn)28540   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, strided_cn) {
28541     GemmMicrokernelTester()
28542       .mr(3)
28543       .nr(8)
28544       .kr(1)
28545       .sr(1)
28546       .m(3)
28547       .n(8)
28548       .k(4)
28549       .cn_stride(11)
28550       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28551   }
28552 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_eq_4_strided_a)28553   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_eq_4_strided_a) {
28554     GemmMicrokernelTester()
28555       .mr(3)
28556       .nr(8)
28557       .kr(1)
28558       .sr(1)
28559       .m(3)
28560       .n(8)
28561       .k(4)
28562       .a_stride(7)
28563       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28564   }
28565 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_eq_4_subtile)28566   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_eq_4_subtile) {
28567     for (uint32_t n = 1; n <= 8; n++) {
28568       for (uint32_t m = 1; m <= 3; m++) {
28569         GemmMicrokernelTester()
28570           .mr(3)
28571           .nr(8)
28572           .kr(1)
28573           .sr(1)
28574           .m(m)
28575           .n(n)
28576           .k(4)
28577           .iterations(1)
28578           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28579       }
28580     }
28581   }
28582 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_eq_4_subtile_m)28583   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_eq_4_subtile_m) {
28584     for (uint32_t m = 1; m <= 3; m++) {
28585       GemmMicrokernelTester()
28586         .mr(3)
28587         .nr(8)
28588         .kr(1)
28589         .sr(1)
28590         .m(m)
28591         .n(8)
28592         .k(4)
28593         .iterations(1)
28594         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28595     }
28596   }
28597 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_eq_4_subtile_n)28598   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_eq_4_subtile_n) {
28599     for (uint32_t n = 1; n <= 8; n++) {
28600       GemmMicrokernelTester()
28601         .mr(3)
28602         .nr(8)
28603         .kr(1)
28604         .sr(1)
28605         .m(3)
28606         .n(n)
28607         .k(4)
28608         .iterations(1)
28609         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28610     }
28611   }
28612 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_lt_4)28613   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_lt_4) {
28614     for (size_t k = 1; k < 4; k++) {
28615       GemmMicrokernelTester()
28616         .mr(3)
28617         .nr(8)
28618         .kr(1)
28619         .sr(1)
28620         .m(3)
28621         .n(8)
28622         .k(k)
28623         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28624     }
28625   }
28626 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_lt_4_strided_a)28627   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_lt_4_strided_a) {
28628     for (size_t k = 1; k < 4; k++) {
28629       GemmMicrokernelTester()
28630         .mr(3)
28631         .nr(8)
28632         .kr(1)
28633         .sr(1)
28634         .m(3)
28635         .n(8)
28636         .k(k)
28637         .a_stride(7)
28638         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28639     }
28640   }
28641 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_lt_4_subtile)28642   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_lt_4_subtile) {
28643     for (size_t k = 1; k < 4; k++) {
28644       for (uint32_t n = 1; n <= 8; n++) {
28645         for (uint32_t m = 1; m <= 3; m++) {
28646           GemmMicrokernelTester()
28647             .mr(3)
28648             .nr(8)
28649             .kr(1)
28650             .sr(1)
28651             .m(m)
28652             .n(n)
28653             .k(k)
28654             .iterations(1)
28655             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28656         }
28657       }
28658     }
28659   }
28660 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_gt_4)28661   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_gt_4) {
28662     for (size_t k = 5; k < 8; k++) {
28663       GemmMicrokernelTester()
28664         .mr(3)
28665         .nr(8)
28666         .kr(1)
28667         .sr(1)
28668         .m(3)
28669         .n(8)
28670         .k(k)
28671         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28672     }
28673   }
28674 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_gt_4_strided_a)28675   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_gt_4_strided_a) {
28676     for (size_t k = 5; k < 8; k++) {
28677       GemmMicrokernelTester()
28678         .mr(3)
28679         .nr(8)
28680         .kr(1)
28681         .sr(1)
28682         .m(3)
28683         .n(8)
28684         .k(k)
28685         .a_stride(11)
28686         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28687     }
28688   }
28689 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_gt_4_subtile)28690   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_gt_4_subtile) {
28691     for (size_t k = 5; k < 8; k++) {
28692       for (uint32_t n = 1; n <= 8; n++) {
28693         for (uint32_t m = 1; m <= 3; m++) {
28694           GemmMicrokernelTester()
28695             .mr(3)
28696             .nr(8)
28697             .kr(1)
28698             .sr(1)
28699             .m(m)
28700             .n(n)
28701             .k(k)
28702             .iterations(1)
28703             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28704         }
28705       }
28706     }
28707   }
28708 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_div_4)28709   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_div_4) {
28710     for (size_t k = 8; k <= 40; k += 4) {
28711       GemmMicrokernelTester()
28712         .mr(3)
28713         .nr(8)
28714         .kr(1)
28715         .sr(1)
28716         .m(3)
28717         .n(8)
28718         .k(k)
28719         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28720     }
28721   }
28722 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_div_4_strided_a)28723   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_div_4_strided_a) {
28724     for (size_t k = 8; k <= 40; k += 4) {
28725       GemmMicrokernelTester()
28726         .mr(3)
28727         .nr(8)
28728         .kr(1)
28729         .sr(1)
28730         .m(3)
28731         .n(8)
28732         .k(k)
28733         .a_stride(43)
28734         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28735     }
28736   }
28737 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,k_div_4_subtile)28738   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, k_div_4_subtile) {
28739     for (size_t k = 8; k <= 40; k += 4) {
28740       for (uint32_t n = 1; n <= 8; n++) {
28741         for (uint32_t m = 1; m <= 3; m++) {
28742           GemmMicrokernelTester()
28743             .mr(3)
28744             .nr(8)
28745             .kr(1)
28746             .sr(1)
28747             .m(m)
28748             .n(n)
28749             .k(k)
28750             .iterations(1)
28751             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28752         }
28753       }
28754     }
28755   }
28756 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,n_gt_8)28757   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, n_gt_8) {
28758     for (uint32_t n = 9; n < 16; n++) {
28759       for (size_t k = 1; k <= 20; k += 5) {
28760         GemmMicrokernelTester()
28761           .mr(3)
28762           .nr(8)
28763           .kr(1)
28764           .sr(1)
28765           .m(3)
28766           .n(n)
28767           .k(k)
28768           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28769       }
28770     }
28771   }
28772 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,n_gt_8_strided_cn)28773   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, n_gt_8_strided_cn) {
28774     for (uint32_t n = 9; n < 16; n++) {
28775       for (size_t k = 1; k <= 20; k += 5) {
28776         GemmMicrokernelTester()
28777           .mr(3)
28778           .nr(8)
28779           .kr(1)
28780           .sr(1)
28781           .m(3)
28782           .n(n)
28783           .k(k)
28784           .cn_stride(11)
28785           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28786       }
28787     }
28788   }
28789 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,n_gt_8_strided_a)28790   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, n_gt_8_strided_a) {
28791     for (uint32_t n = 9; n < 16; n++) {
28792       for (size_t k = 1; k <= 20; k += 5) {
28793         GemmMicrokernelTester()
28794           .mr(3)
28795           .nr(8)
28796           .kr(1)
28797           .sr(1)
28798           .m(3)
28799           .n(n)
28800           .k(k)
28801           .a_stride(23)
28802           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28803       }
28804     }
28805   }
28806 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,n_gt_8_subtile)28807   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, n_gt_8_subtile) {
28808     for (uint32_t n = 9; n < 16; n++) {
28809       for (size_t k = 1; k <= 20; k += 5) {
28810         for (uint32_t m = 1; m <= 3; m++) {
28811           GemmMicrokernelTester()
28812             .mr(3)
28813             .nr(8)
28814             .kr(1)
28815             .sr(1)
28816             .m(m)
28817             .n(n)
28818             .k(k)
28819             .iterations(1)
28820             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28821         }
28822       }
28823     }
28824   }
28825 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,n_div_8)28826   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, n_div_8) {
28827     for (uint32_t n = 16; n <= 24; n += 8) {
28828       for (size_t k = 1; k <= 20; k += 5) {
28829         GemmMicrokernelTester()
28830           .mr(3)
28831           .nr(8)
28832           .kr(1)
28833           .sr(1)
28834           .m(3)
28835           .n(n)
28836           .k(k)
28837           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28838       }
28839     }
28840   }
28841 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,n_div_8_strided_cn)28842   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, n_div_8_strided_cn) {
28843     for (uint32_t n = 16; n <= 24; n += 8) {
28844       for (size_t k = 1; k <= 20; k += 5) {
28845         GemmMicrokernelTester()
28846           .mr(3)
28847           .nr(8)
28848           .kr(1)
28849           .sr(1)
28850           .m(3)
28851           .n(n)
28852           .k(k)
28853           .cn_stride(11)
28854           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28855       }
28856     }
28857   }
28858 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,n_div_8_strided_a)28859   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, n_div_8_strided_a) {
28860     for (uint32_t n = 16; n <= 24; n += 8) {
28861       for (size_t k = 1; k <= 20; k += 5) {
28862         GemmMicrokernelTester()
28863           .mr(3)
28864           .nr(8)
28865           .kr(1)
28866           .sr(1)
28867           .m(3)
28868           .n(n)
28869           .k(k)
28870           .a_stride(23)
28871           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28872       }
28873     }
28874   }
28875 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,n_div_8_subtile)28876   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, n_div_8_subtile) {
28877     for (uint32_t n = 16; n <= 24; n += 8) {
28878       for (size_t k = 1; k <= 20; k += 5) {
28879         for (uint32_t m = 1; m <= 3; m++) {
28880           GemmMicrokernelTester()
28881             .mr(3)
28882             .nr(8)
28883             .kr(1)
28884             .sr(1)
28885             .m(m)
28886             .n(n)
28887             .k(k)
28888             .iterations(1)
28889             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28890         }
28891       }
28892     }
28893   }
28894 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,strided_cm_subtile)28895   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, strided_cm_subtile) {
28896     for (size_t k = 1; k <= 20; k += 5) {
28897       for (uint32_t n = 1; n <= 8; n++) {
28898         for (uint32_t m = 1; m <= 3; m++) {
28899           GemmMicrokernelTester()
28900             .mr(3)
28901             .nr(8)
28902             .kr(1)
28903             .sr(1)
28904             .m(m)
28905             .n(n)
28906             .k(k)
28907             .cm_stride(11)
28908             .iterations(1)
28909             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28910         }
28911       }
28912     }
28913   }
28914 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,qmin)28915   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, qmin) {
28916     GemmMicrokernelTester()
28917       .mr(3)
28918       .nr(8)
28919       .kr(1)
28920       .sr(1)
28921       .m(3)
28922       .n(8)
28923       .k(4)
28924       .qmin(128)
28925       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28926   }
28927 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,qmax)28928   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, qmax) {
28929     GemmMicrokernelTester()
28930       .mr(3)
28931       .nr(8)
28932       .kr(1)
28933       .sr(1)
28934       .m(3)
28935       .n(8)
28936       .k(4)
28937       .qmax(128)
28938       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28939   }
28940 
TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT,strided_cm)28941   TEST(F32_GEMM_MINMAX_3X8__WASMSIMD_X86_SPLAT, strided_cm) {
28942     GemmMicrokernelTester()
28943       .mr(3)
28944       .nr(8)
28945       .kr(1)
28946       .sr(1)
28947       .m(3)
28948       .n(8)
28949       .k(4)
28950       .cm_stride(11)
28951       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
28952   }
28953 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
28954 
28955 
28956 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1)28957   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1) {
28958     GemmMicrokernelTester()
28959       .mr(4)
28960       .nr(8)
28961       .kr(1)
28962       .sr(1)
28963       .m(4)
28964       .n(8)
28965       .k(1)
28966       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
28967   }
28968 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,strided_cn)28969   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, strided_cn) {
28970     GemmMicrokernelTester()
28971       .mr(4)
28972       .nr(8)
28973       .kr(1)
28974       .sr(1)
28975       .m(4)
28976       .n(8)
28977       .k(1)
28978       .cn_stride(11)
28979       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
28980   }
28981 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_strided_a)28982   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_strided_a) {
28983     GemmMicrokernelTester()
28984       .mr(4)
28985       .nr(8)
28986       .kr(1)
28987       .sr(1)
28988       .m(4)
28989       .n(8)
28990       .k(1)
28991       .a_stride(3)
28992       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
28993   }
28994 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile)28995   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile) {
28996     for (uint32_t n = 1; n <= 8; n++) {
28997       for (uint32_t m = 1; m <= 4; m++) {
28998         GemmMicrokernelTester()
28999           .mr(4)
29000           .nr(8)
29001           .kr(1)
29002           .sr(1)
29003           .m(m)
29004           .n(n)
29005           .k(1)
29006           .iterations(1)
29007           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29008       }
29009     }
29010   }
29011 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile_m)29012   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile_m) {
29013     for (uint32_t m = 1; m <= 4; m++) {
29014       GemmMicrokernelTester()
29015         .mr(4)
29016         .nr(8)
29017         .kr(1)
29018         .sr(1)
29019         .m(m)
29020         .n(8)
29021         .k(1)
29022         .iterations(1)
29023         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29024     }
29025   }
29026 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile_n)29027   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile_n) {
29028     for (uint32_t n = 1; n <= 8; n++) {
29029       GemmMicrokernelTester()
29030         .mr(4)
29031         .nr(8)
29032         .kr(1)
29033         .sr(1)
29034         .m(4)
29035         .n(n)
29036         .k(1)
29037         .iterations(1)
29038         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29039     }
29040   }
29041 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1)29042   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1) {
29043     for (size_t k = 2; k < 10; k++) {
29044       GemmMicrokernelTester()
29045         .mr(4)
29046         .nr(8)
29047         .kr(1)
29048         .sr(1)
29049         .m(4)
29050         .n(8)
29051         .k(k)
29052         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29053     }
29054   }
29055 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1_strided_a)29056   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1_strided_a) {
29057     for (size_t k = 2; k < 10; k++) {
29058       GemmMicrokernelTester()
29059         .mr(4)
29060         .nr(8)
29061         .kr(1)
29062         .sr(1)
29063         .m(4)
29064         .n(8)
29065         .k(k)
29066         .a_stride(11)
29067         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29068     }
29069   }
29070 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1_subtile)29071   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1_subtile) {
29072     for (size_t k = 2; k < 10; k++) {
29073       for (uint32_t n = 1; n <= 8; n++) {
29074         for (uint32_t m = 1; m <= 4; m++) {
29075           GemmMicrokernelTester()
29076             .mr(4)
29077             .nr(8)
29078             .kr(1)
29079             .sr(1)
29080             .m(m)
29081             .n(n)
29082             .k(k)
29083             .iterations(1)
29084             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29085         }
29086       }
29087     }
29088   }
29089 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8)29090   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8) {
29091     for (uint32_t n = 9; n < 16; n++) {
29092       for (size_t k = 1; k <= 5; k += 2) {
29093         GemmMicrokernelTester()
29094           .mr(4)
29095           .nr(8)
29096           .kr(1)
29097           .sr(1)
29098           .m(4)
29099           .n(n)
29100           .k(k)
29101           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29102       }
29103     }
29104   }
29105 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_strided_cn)29106   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_strided_cn) {
29107     for (uint32_t n = 9; n < 16; n++) {
29108       for (size_t k = 1; k <= 5; k += 2) {
29109         GemmMicrokernelTester()
29110           .mr(4)
29111           .nr(8)
29112           .kr(1)
29113           .sr(1)
29114           .m(4)
29115           .n(n)
29116           .k(k)
29117           .cn_stride(11)
29118           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29119       }
29120     }
29121   }
29122 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_strided_a)29123   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_strided_a) {
29124     for (uint32_t n = 9; n < 16; n++) {
29125       for (size_t k = 1; k <= 5; k += 2) {
29126         GemmMicrokernelTester()
29127           .mr(4)
29128           .nr(8)
29129           .kr(1)
29130           .sr(1)
29131           .m(4)
29132           .n(n)
29133           .k(k)
29134           .a_stride(7)
29135           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29136       }
29137     }
29138   }
29139 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_subtile)29140   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_subtile) {
29141     for (uint32_t n = 9; n < 16; n++) {
29142       for (size_t k = 1; k <= 5; k += 2) {
29143         for (uint32_t m = 1; m <= 4; m++) {
29144           GemmMicrokernelTester()
29145             .mr(4)
29146             .nr(8)
29147             .kr(1)
29148             .sr(1)
29149             .m(m)
29150             .n(n)
29151             .k(k)
29152             .iterations(1)
29153             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29154         }
29155       }
29156     }
29157   }
29158 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,n_div_8)29159   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, n_div_8) {
29160     for (uint32_t n = 16; n <= 24; n += 8) {
29161       for (size_t k = 1; k <= 5; k += 2) {
29162         GemmMicrokernelTester()
29163           .mr(4)
29164           .nr(8)
29165           .kr(1)
29166           .sr(1)
29167           .m(4)
29168           .n(n)
29169           .k(k)
29170           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29171       }
29172     }
29173   }
29174 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_strided_cn)29175   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_strided_cn) {
29176     for (uint32_t n = 16; n <= 24; n += 8) {
29177       for (size_t k = 1; k <= 5; k += 2) {
29178         GemmMicrokernelTester()
29179           .mr(4)
29180           .nr(8)
29181           .kr(1)
29182           .sr(1)
29183           .m(4)
29184           .n(n)
29185           .k(k)
29186           .cn_stride(11)
29187           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29188       }
29189     }
29190   }
29191 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_strided_a)29192   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_strided_a) {
29193     for (uint32_t n = 16; n <= 24; n += 8) {
29194       for (size_t k = 1; k <= 5; k += 2) {
29195         GemmMicrokernelTester()
29196           .mr(4)
29197           .nr(8)
29198           .kr(1)
29199           .sr(1)
29200           .m(4)
29201           .n(n)
29202           .k(k)
29203           .a_stride(7)
29204           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29205       }
29206     }
29207   }
29208 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_subtile)29209   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_subtile) {
29210     for (uint32_t n = 16; n <= 24; n += 8) {
29211       for (size_t k = 1; k <= 5; k += 2) {
29212         for (uint32_t m = 1; m <= 4; m++) {
29213           GemmMicrokernelTester()
29214             .mr(4)
29215             .nr(8)
29216             .kr(1)
29217             .sr(1)
29218             .m(m)
29219             .n(n)
29220             .k(k)
29221             .iterations(1)
29222             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29223         }
29224       }
29225     }
29226   }
29227 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,strided_cm_subtile)29228   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, strided_cm_subtile) {
29229     for (size_t k = 1; k <= 5; k += 2) {
29230       for (uint32_t n = 1; n <= 8; n++) {
29231         for (uint32_t m = 1; m <= 4; m++) {
29232           GemmMicrokernelTester()
29233             .mr(4)
29234             .nr(8)
29235             .kr(1)
29236             .sr(1)
29237             .m(m)
29238             .n(n)
29239             .k(k)
29240             .cm_stride(11)
29241             .iterations(1)
29242             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29243         }
29244       }
29245     }
29246   }
29247 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,qmin)29248   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, qmin) {
29249     GemmMicrokernelTester()
29250       .mr(4)
29251       .nr(8)
29252       .kr(1)
29253       .sr(1)
29254       .m(4)
29255       .n(8)
29256       .k(1)
29257       .qmin(128)
29258       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29259   }
29260 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,qmax)29261   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, qmax) {
29262     GemmMicrokernelTester()
29263       .mr(4)
29264       .nr(8)
29265       .kr(1)
29266       .sr(1)
29267       .m(4)
29268       .n(8)
29269       .k(1)
29270       .qmax(128)
29271       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29272   }
29273 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT,strided_cm)29274   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_LOADSPLAT, strided_cm) {
29275     GemmMicrokernelTester()
29276       .mr(4)
29277       .nr(8)
29278       .kr(1)
29279       .sr(1)
29280       .m(4)
29281       .n(8)
29282       .k(1)
29283       .cm_stride(11)
29284       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
29285   }
29286 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
29287 
29288 
29289 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_eq_4)29290   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_eq_4) {
29291     GemmMicrokernelTester()
29292       .mr(4)
29293       .nr(8)
29294       .kr(1)
29295       .sr(1)
29296       .m(4)
29297       .n(8)
29298       .k(4)
29299       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29300   }
29301 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,strided_cn)29302   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, strided_cn) {
29303     GemmMicrokernelTester()
29304       .mr(4)
29305       .nr(8)
29306       .kr(1)
29307       .sr(1)
29308       .m(4)
29309       .n(8)
29310       .k(4)
29311       .cn_stride(11)
29312       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29313   }
29314 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_eq_4_strided_a)29315   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_eq_4_strided_a) {
29316     GemmMicrokernelTester()
29317       .mr(4)
29318       .nr(8)
29319       .kr(1)
29320       .sr(1)
29321       .m(4)
29322       .n(8)
29323       .k(4)
29324       .a_stride(7)
29325       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29326   }
29327 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_eq_4_subtile)29328   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_eq_4_subtile) {
29329     for (uint32_t n = 1; n <= 8; n++) {
29330       for (uint32_t m = 1; m <= 4; m++) {
29331         GemmMicrokernelTester()
29332           .mr(4)
29333           .nr(8)
29334           .kr(1)
29335           .sr(1)
29336           .m(m)
29337           .n(n)
29338           .k(4)
29339           .iterations(1)
29340           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29341       }
29342     }
29343   }
29344 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_eq_4_subtile_m)29345   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_eq_4_subtile_m) {
29346     for (uint32_t m = 1; m <= 4; m++) {
29347       GemmMicrokernelTester()
29348         .mr(4)
29349         .nr(8)
29350         .kr(1)
29351         .sr(1)
29352         .m(m)
29353         .n(8)
29354         .k(4)
29355         .iterations(1)
29356         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29357     }
29358   }
29359 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_eq_4_subtile_n)29360   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_eq_4_subtile_n) {
29361     for (uint32_t n = 1; n <= 8; n++) {
29362       GemmMicrokernelTester()
29363         .mr(4)
29364         .nr(8)
29365         .kr(1)
29366         .sr(1)
29367         .m(4)
29368         .n(n)
29369         .k(4)
29370         .iterations(1)
29371         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29372     }
29373   }
29374 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_lt_4)29375   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_lt_4) {
29376     for (size_t k = 1; k < 4; k++) {
29377       GemmMicrokernelTester()
29378         .mr(4)
29379         .nr(8)
29380         .kr(1)
29381         .sr(1)
29382         .m(4)
29383         .n(8)
29384         .k(k)
29385         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29386     }
29387   }
29388 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_lt_4_strided_a)29389   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_lt_4_strided_a) {
29390     for (size_t k = 1; k < 4; k++) {
29391       GemmMicrokernelTester()
29392         .mr(4)
29393         .nr(8)
29394         .kr(1)
29395         .sr(1)
29396         .m(4)
29397         .n(8)
29398         .k(k)
29399         .a_stride(7)
29400         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29401     }
29402   }
29403 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_lt_4_subtile)29404   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_lt_4_subtile) {
29405     for (size_t k = 1; k < 4; k++) {
29406       for (uint32_t n = 1; n <= 8; n++) {
29407         for (uint32_t m = 1; m <= 4; m++) {
29408           GemmMicrokernelTester()
29409             .mr(4)
29410             .nr(8)
29411             .kr(1)
29412             .sr(1)
29413             .m(m)
29414             .n(n)
29415             .k(k)
29416             .iterations(1)
29417             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29418         }
29419       }
29420     }
29421   }
29422 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_gt_4)29423   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_gt_4) {
29424     for (size_t k = 5; k < 8; k++) {
29425       GemmMicrokernelTester()
29426         .mr(4)
29427         .nr(8)
29428         .kr(1)
29429         .sr(1)
29430         .m(4)
29431         .n(8)
29432         .k(k)
29433         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29434     }
29435   }
29436 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_gt_4_strided_a)29437   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_gt_4_strided_a) {
29438     for (size_t k = 5; k < 8; k++) {
29439       GemmMicrokernelTester()
29440         .mr(4)
29441         .nr(8)
29442         .kr(1)
29443         .sr(1)
29444         .m(4)
29445         .n(8)
29446         .k(k)
29447         .a_stride(11)
29448         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29449     }
29450   }
29451 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_gt_4_subtile)29452   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_gt_4_subtile) {
29453     for (size_t k = 5; k < 8; k++) {
29454       for (uint32_t n = 1; n <= 8; n++) {
29455         for (uint32_t m = 1; m <= 4; m++) {
29456           GemmMicrokernelTester()
29457             .mr(4)
29458             .nr(8)
29459             .kr(1)
29460             .sr(1)
29461             .m(m)
29462             .n(n)
29463             .k(k)
29464             .iterations(1)
29465             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29466         }
29467       }
29468     }
29469   }
29470 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_div_4)29471   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_div_4) {
29472     for (size_t k = 8; k <= 40; k += 4) {
29473       GemmMicrokernelTester()
29474         .mr(4)
29475         .nr(8)
29476         .kr(1)
29477         .sr(1)
29478         .m(4)
29479         .n(8)
29480         .k(k)
29481         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29482     }
29483   }
29484 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_div_4_strided_a)29485   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_div_4_strided_a) {
29486     for (size_t k = 8; k <= 40; k += 4) {
29487       GemmMicrokernelTester()
29488         .mr(4)
29489         .nr(8)
29490         .kr(1)
29491         .sr(1)
29492         .m(4)
29493         .n(8)
29494         .k(k)
29495         .a_stride(43)
29496         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29497     }
29498   }
29499 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,k_div_4_subtile)29500   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, k_div_4_subtile) {
29501     for (size_t k = 8; k <= 40; k += 4) {
29502       for (uint32_t n = 1; n <= 8; n++) {
29503         for (uint32_t m = 1; m <= 4; m++) {
29504           GemmMicrokernelTester()
29505             .mr(4)
29506             .nr(8)
29507             .kr(1)
29508             .sr(1)
29509             .m(m)
29510             .n(n)
29511             .k(k)
29512             .iterations(1)
29513             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29514         }
29515       }
29516     }
29517   }
29518 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,n_gt_8)29519   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, n_gt_8) {
29520     for (uint32_t n = 9; n < 16; n++) {
29521       for (size_t k = 1; k <= 20; k += 5) {
29522         GemmMicrokernelTester()
29523           .mr(4)
29524           .nr(8)
29525           .kr(1)
29526           .sr(1)
29527           .m(4)
29528           .n(n)
29529           .k(k)
29530           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29531       }
29532     }
29533   }
29534 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,n_gt_8_strided_cn)29535   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, n_gt_8_strided_cn) {
29536     for (uint32_t n = 9; n < 16; n++) {
29537       for (size_t k = 1; k <= 20; k += 5) {
29538         GemmMicrokernelTester()
29539           .mr(4)
29540           .nr(8)
29541           .kr(1)
29542           .sr(1)
29543           .m(4)
29544           .n(n)
29545           .k(k)
29546           .cn_stride(11)
29547           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29548       }
29549     }
29550   }
29551 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,n_gt_8_strided_a)29552   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, n_gt_8_strided_a) {
29553     for (uint32_t n = 9; n < 16; n++) {
29554       for (size_t k = 1; k <= 20; k += 5) {
29555         GemmMicrokernelTester()
29556           .mr(4)
29557           .nr(8)
29558           .kr(1)
29559           .sr(1)
29560           .m(4)
29561           .n(n)
29562           .k(k)
29563           .a_stride(23)
29564           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29565       }
29566     }
29567   }
29568 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,n_gt_8_subtile)29569   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, n_gt_8_subtile) {
29570     for (uint32_t n = 9; n < 16; n++) {
29571       for (size_t k = 1; k <= 20; k += 5) {
29572         for (uint32_t m = 1; m <= 4; m++) {
29573           GemmMicrokernelTester()
29574             .mr(4)
29575             .nr(8)
29576             .kr(1)
29577             .sr(1)
29578             .m(m)
29579             .n(n)
29580             .k(k)
29581             .iterations(1)
29582             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29583         }
29584       }
29585     }
29586   }
29587 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,n_div_8)29588   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, n_div_8) {
29589     for (uint32_t n = 16; n <= 24; n += 8) {
29590       for (size_t k = 1; k <= 20; k += 5) {
29591         GemmMicrokernelTester()
29592           .mr(4)
29593           .nr(8)
29594           .kr(1)
29595           .sr(1)
29596           .m(4)
29597           .n(n)
29598           .k(k)
29599           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29600       }
29601     }
29602   }
29603 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,n_div_8_strided_cn)29604   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, n_div_8_strided_cn) {
29605     for (uint32_t n = 16; n <= 24; n += 8) {
29606       for (size_t k = 1; k <= 20; k += 5) {
29607         GemmMicrokernelTester()
29608           .mr(4)
29609           .nr(8)
29610           .kr(1)
29611           .sr(1)
29612           .m(4)
29613           .n(n)
29614           .k(k)
29615           .cn_stride(11)
29616           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29617       }
29618     }
29619   }
29620 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,n_div_8_strided_a)29621   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, n_div_8_strided_a) {
29622     for (uint32_t n = 16; n <= 24; n += 8) {
29623       for (size_t k = 1; k <= 20; k += 5) {
29624         GemmMicrokernelTester()
29625           .mr(4)
29626           .nr(8)
29627           .kr(1)
29628           .sr(1)
29629           .m(4)
29630           .n(n)
29631           .k(k)
29632           .a_stride(23)
29633           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29634       }
29635     }
29636   }
29637 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,n_div_8_subtile)29638   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, n_div_8_subtile) {
29639     for (uint32_t n = 16; n <= 24; n += 8) {
29640       for (size_t k = 1; k <= 20; k += 5) {
29641         for (uint32_t m = 1; m <= 4; m++) {
29642           GemmMicrokernelTester()
29643             .mr(4)
29644             .nr(8)
29645             .kr(1)
29646             .sr(1)
29647             .m(m)
29648             .n(n)
29649             .k(k)
29650             .iterations(1)
29651             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29652         }
29653       }
29654     }
29655   }
29656 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,strided_cm_subtile)29657   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, strided_cm_subtile) {
29658     for (size_t k = 1; k <= 20; k += 5) {
29659       for (uint32_t n = 1; n <= 8; n++) {
29660         for (uint32_t m = 1; m <= 4; m++) {
29661           GemmMicrokernelTester()
29662             .mr(4)
29663             .nr(8)
29664             .kr(1)
29665             .sr(1)
29666             .m(m)
29667             .n(n)
29668             .k(k)
29669             .cm_stride(11)
29670             .iterations(1)
29671             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29672         }
29673       }
29674     }
29675   }
29676 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,qmin)29677   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, qmin) {
29678     GemmMicrokernelTester()
29679       .mr(4)
29680       .nr(8)
29681       .kr(1)
29682       .sr(1)
29683       .m(4)
29684       .n(8)
29685       .k(4)
29686       .qmin(128)
29687       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29688   }
29689 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,qmax)29690   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, qmax) {
29691     GemmMicrokernelTester()
29692       .mr(4)
29693       .nr(8)
29694       .kr(1)
29695       .sr(1)
29696       .m(4)
29697       .n(8)
29698       .k(4)
29699       .qmax(128)
29700       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29701   }
29702 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT,strided_cm)29703   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_ARM_SPLAT, strided_cm) {
29704     GemmMicrokernelTester()
29705       .mr(4)
29706       .nr(8)
29707       .kr(1)
29708       .sr(1)
29709       .m(4)
29710       .n(8)
29711       .k(4)
29712       .cm_stride(11)
29713       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
29714   }
29715 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
29716 
29717 
29718 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_eq_4)29719   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_eq_4) {
29720     GemmMicrokernelTester()
29721       .mr(4)
29722       .nr(8)
29723       .kr(1)
29724       .sr(1)
29725       .m(4)
29726       .n(8)
29727       .k(4)
29728       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29729   }
29730 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,strided_cn)29731   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, strided_cn) {
29732     GemmMicrokernelTester()
29733       .mr(4)
29734       .nr(8)
29735       .kr(1)
29736       .sr(1)
29737       .m(4)
29738       .n(8)
29739       .k(4)
29740       .cn_stride(11)
29741       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29742   }
29743 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_eq_4_strided_a)29744   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_eq_4_strided_a) {
29745     GemmMicrokernelTester()
29746       .mr(4)
29747       .nr(8)
29748       .kr(1)
29749       .sr(1)
29750       .m(4)
29751       .n(8)
29752       .k(4)
29753       .a_stride(7)
29754       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29755   }
29756 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_eq_4_subtile)29757   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_eq_4_subtile) {
29758     for (uint32_t n = 1; n <= 8; n++) {
29759       for (uint32_t m = 1; m <= 4; m++) {
29760         GemmMicrokernelTester()
29761           .mr(4)
29762           .nr(8)
29763           .kr(1)
29764           .sr(1)
29765           .m(m)
29766           .n(n)
29767           .k(4)
29768           .iterations(1)
29769           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29770       }
29771     }
29772   }
29773 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_eq_4_subtile_m)29774   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_eq_4_subtile_m) {
29775     for (uint32_t m = 1; m <= 4; m++) {
29776       GemmMicrokernelTester()
29777         .mr(4)
29778         .nr(8)
29779         .kr(1)
29780         .sr(1)
29781         .m(m)
29782         .n(8)
29783         .k(4)
29784         .iterations(1)
29785         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29786     }
29787   }
29788 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_eq_4_subtile_n)29789   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_eq_4_subtile_n) {
29790     for (uint32_t n = 1; n <= 8; n++) {
29791       GemmMicrokernelTester()
29792         .mr(4)
29793         .nr(8)
29794         .kr(1)
29795         .sr(1)
29796         .m(4)
29797         .n(n)
29798         .k(4)
29799         .iterations(1)
29800         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29801     }
29802   }
29803 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_lt_4)29804   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_lt_4) {
29805     for (size_t k = 1; k < 4; k++) {
29806       GemmMicrokernelTester()
29807         .mr(4)
29808         .nr(8)
29809         .kr(1)
29810         .sr(1)
29811         .m(4)
29812         .n(8)
29813         .k(k)
29814         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29815     }
29816   }
29817 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_lt_4_strided_a)29818   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_lt_4_strided_a) {
29819     for (size_t k = 1; k < 4; k++) {
29820       GemmMicrokernelTester()
29821         .mr(4)
29822         .nr(8)
29823         .kr(1)
29824         .sr(1)
29825         .m(4)
29826         .n(8)
29827         .k(k)
29828         .a_stride(7)
29829         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29830     }
29831   }
29832 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_lt_4_subtile)29833   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_lt_4_subtile) {
29834     for (size_t k = 1; k < 4; k++) {
29835       for (uint32_t n = 1; n <= 8; n++) {
29836         for (uint32_t m = 1; m <= 4; m++) {
29837           GemmMicrokernelTester()
29838             .mr(4)
29839             .nr(8)
29840             .kr(1)
29841             .sr(1)
29842             .m(m)
29843             .n(n)
29844             .k(k)
29845             .iterations(1)
29846             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29847         }
29848       }
29849     }
29850   }
29851 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_gt_4)29852   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_gt_4) {
29853     for (size_t k = 5; k < 8; k++) {
29854       GemmMicrokernelTester()
29855         .mr(4)
29856         .nr(8)
29857         .kr(1)
29858         .sr(1)
29859         .m(4)
29860         .n(8)
29861         .k(k)
29862         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29863     }
29864   }
29865 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_gt_4_strided_a)29866   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_gt_4_strided_a) {
29867     for (size_t k = 5; k < 8; k++) {
29868       GemmMicrokernelTester()
29869         .mr(4)
29870         .nr(8)
29871         .kr(1)
29872         .sr(1)
29873         .m(4)
29874         .n(8)
29875         .k(k)
29876         .a_stride(11)
29877         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29878     }
29879   }
29880 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_gt_4_subtile)29881   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_gt_4_subtile) {
29882     for (size_t k = 5; k < 8; k++) {
29883       for (uint32_t n = 1; n <= 8; n++) {
29884         for (uint32_t m = 1; m <= 4; m++) {
29885           GemmMicrokernelTester()
29886             .mr(4)
29887             .nr(8)
29888             .kr(1)
29889             .sr(1)
29890             .m(m)
29891             .n(n)
29892             .k(k)
29893             .iterations(1)
29894             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29895         }
29896       }
29897     }
29898   }
29899 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_div_4)29900   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_div_4) {
29901     for (size_t k = 8; k <= 40; k += 4) {
29902       GemmMicrokernelTester()
29903         .mr(4)
29904         .nr(8)
29905         .kr(1)
29906         .sr(1)
29907         .m(4)
29908         .n(8)
29909         .k(k)
29910         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29911     }
29912   }
29913 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_div_4_strided_a)29914   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_div_4_strided_a) {
29915     for (size_t k = 8; k <= 40; k += 4) {
29916       GemmMicrokernelTester()
29917         .mr(4)
29918         .nr(8)
29919         .kr(1)
29920         .sr(1)
29921         .m(4)
29922         .n(8)
29923         .k(k)
29924         .a_stride(43)
29925         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29926     }
29927   }
29928 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,k_div_4_subtile)29929   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, k_div_4_subtile) {
29930     for (size_t k = 8; k <= 40; k += 4) {
29931       for (uint32_t n = 1; n <= 8; n++) {
29932         for (uint32_t m = 1; m <= 4; m++) {
29933           GemmMicrokernelTester()
29934             .mr(4)
29935             .nr(8)
29936             .kr(1)
29937             .sr(1)
29938             .m(m)
29939             .n(n)
29940             .k(k)
29941             .iterations(1)
29942             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29943         }
29944       }
29945     }
29946   }
29947 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,n_gt_8)29948   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, n_gt_8) {
29949     for (uint32_t n = 9; n < 16; n++) {
29950       for (size_t k = 1; k <= 20; k += 5) {
29951         GemmMicrokernelTester()
29952           .mr(4)
29953           .nr(8)
29954           .kr(1)
29955           .sr(1)
29956           .m(4)
29957           .n(n)
29958           .k(k)
29959           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29960       }
29961     }
29962   }
29963 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,n_gt_8_strided_cn)29964   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, n_gt_8_strided_cn) {
29965     for (uint32_t n = 9; n < 16; n++) {
29966       for (size_t k = 1; k <= 20; k += 5) {
29967         GemmMicrokernelTester()
29968           .mr(4)
29969           .nr(8)
29970           .kr(1)
29971           .sr(1)
29972           .m(4)
29973           .n(n)
29974           .k(k)
29975           .cn_stride(11)
29976           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29977       }
29978     }
29979   }
29980 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,n_gt_8_strided_a)29981   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, n_gt_8_strided_a) {
29982     for (uint32_t n = 9; n < 16; n++) {
29983       for (size_t k = 1; k <= 20; k += 5) {
29984         GemmMicrokernelTester()
29985           .mr(4)
29986           .nr(8)
29987           .kr(1)
29988           .sr(1)
29989           .m(4)
29990           .n(n)
29991           .k(k)
29992           .a_stride(23)
29993           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
29994       }
29995     }
29996   }
29997 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,n_gt_8_subtile)29998   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, n_gt_8_subtile) {
29999     for (uint32_t n = 9; n < 16; n++) {
30000       for (size_t k = 1; k <= 20; k += 5) {
30001         for (uint32_t m = 1; m <= 4; m++) {
30002           GemmMicrokernelTester()
30003             .mr(4)
30004             .nr(8)
30005             .kr(1)
30006             .sr(1)
30007             .m(m)
30008             .n(n)
30009             .k(k)
30010             .iterations(1)
30011             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
30012         }
30013       }
30014     }
30015   }
30016 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,n_div_8)30017   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, n_div_8) {
30018     for (uint32_t n = 16; n <= 24; n += 8) {
30019       for (size_t k = 1; k <= 20; k += 5) {
30020         GemmMicrokernelTester()
30021           .mr(4)
30022           .nr(8)
30023           .kr(1)
30024           .sr(1)
30025           .m(4)
30026           .n(n)
30027           .k(k)
30028           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
30029       }
30030     }
30031   }
30032 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,n_div_8_strided_cn)30033   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, n_div_8_strided_cn) {
30034     for (uint32_t n = 16; n <= 24; n += 8) {
30035       for (size_t k = 1; k <= 20; k += 5) {
30036         GemmMicrokernelTester()
30037           .mr(4)
30038           .nr(8)
30039           .kr(1)
30040           .sr(1)
30041           .m(4)
30042           .n(n)
30043           .k(k)
30044           .cn_stride(11)
30045           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
30046       }
30047     }
30048   }
30049 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,n_div_8_strided_a)30050   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, n_div_8_strided_a) {
30051     for (uint32_t n = 16; n <= 24; n += 8) {
30052       for (size_t k = 1; k <= 20; k += 5) {
30053         GemmMicrokernelTester()
30054           .mr(4)
30055           .nr(8)
30056           .kr(1)
30057           .sr(1)
30058           .m(4)
30059           .n(n)
30060           .k(k)
30061           .a_stride(23)
30062           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
30063       }
30064     }
30065   }
30066 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,n_div_8_subtile)30067   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, n_div_8_subtile) {
30068     for (uint32_t n = 16; n <= 24; n += 8) {
30069       for (size_t k = 1; k <= 20; k += 5) {
30070         for (uint32_t m = 1; m <= 4; m++) {
30071           GemmMicrokernelTester()
30072             .mr(4)
30073             .nr(8)
30074             .kr(1)
30075             .sr(1)
30076             .m(m)
30077             .n(n)
30078             .k(k)
30079             .iterations(1)
30080             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
30081         }
30082       }
30083     }
30084   }
30085 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,strided_cm_subtile)30086   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, strided_cm_subtile) {
30087     for (size_t k = 1; k <= 20; k += 5) {
30088       for (uint32_t n = 1; n <= 8; n++) {
30089         for (uint32_t m = 1; m <= 4; m++) {
30090           GemmMicrokernelTester()
30091             .mr(4)
30092             .nr(8)
30093             .kr(1)
30094             .sr(1)
30095             .m(m)
30096             .n(n)
30097             .k(k)
30098             .cm_stride(11)
30099             .iterations(1)
30100             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
30101         }
30102       }
30103     }
30104   }
30105 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,qmin)30106   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, qmin) {
30107     GemmMicrokernelTester()
30108       .mr(4)
30109       .nr(8)
30110       .kr(1)
30111       .sr(1)
30112       .m(4)
30113       .n(8)
30114       .k(4)
30115       .qmin(128)
30116       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
30117   }
30118 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,qmax)30119   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, qmax) {
30120     GemmMicrokernelTester()
30121       .mr(4)
30122       .nr(8)
30123       .kr(1)
30124       .sr(1)
30125       .m(4)
30126       .n(8)
30127       .k(4)
30128       .qmax(128)
30129       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
30130   }
30131 
TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT,strided_cm)30132   TEST(F32_GEMM_MINMAX_4X8__WASMSIMD_X86_SPLAT, strided_cm) {
30133     GemmMicrokernelTester()
30134       .mr(4)
30135       .nr(8)
30136       .kr(1)
30137       .sr(1)
30138       .m(4)
30139       .n(8)
30140       .k(4)
30141       .cm_stride(11)
30142       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
30143   }
30144 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
30145 
30146 
30147 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_eq_4)30148   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_eq_4) {
30149     GemmMicrokernelTester()
30150       .mr(4)
30151       .nr(8)
30152       .kr(1)
30153       .sr(4)
30154       .m(4)
30155       .n(8)
30156       .k(4)
30157       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30158   }
30159 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,strided_cn)30160   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, strided_cn) {
30161     GemmMicrokernelTester()
30162       .mr(4)
30163       .nr(8)
30164       .kr(1)
30165       .sr(4)
30166       .m(4)
30167       .n(8)
30168       .k(4)
30169       .cn_stride(11)
30170       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30171   }
30172 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_eq_4_strided_a)30173   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_eq_4_strided_a) {
30174     GemmMicrokernelTester()
30175       .mr(4)
30176       .nr(8)
30177       .kr(1)
30178       .sr(4)
30179       .m(4)
30180       .n(8)
30181       .k(4)
30182       .a_stride(7)
30183       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30184   }
30185 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_eq_4_subtile)30186   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_eq_4_subtile) {
30187     for (uint32_t n = 1; n <= 8; n++) {
30188       for (uint32_t m = 1; m <= 4; m++) {
30189         GemmMicrokernelTester()
30190           .mr(4)
30191           .nr(8)
30192           .kr(1)
30193           .sr(4)
30194           .m(m)
30195           .n(n)
30196           .k(4)
30197           .iterations(1)
30198           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30199       }
30200     }
30201   }
30202 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_eq_4_subtile_m)30203   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_eq_4_subtile_m) {
30204     for (uint32_t m = 1; m <= 4; m++) {
30205       GemmMicrokernelTester()
30206         .mr(4)
30207         .nr(8)
30208         .kr(1)
30209         .sr(4)
30210         .m(m)
30211         .n(8)
30212         .k(4)
30213         .iterations(1)
30214         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30215     }
30216   }
30217 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_eq_4_subtile_n)30218   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_eq_4_subtile_n) {
30219     for (uint32_t n = 1; n <= 8; n++) {
30220       GemmMicrokernelTester()
30221         .mr(4)
30222         .nr(8)
30223         .kr(1)
30224         .sr(4)
30225         .m(4)
30226         .n(n)
30227         .k(4)
30228         .iterations(1)
30229         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30230     }
30231   }
30232 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_lt_4)30233   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_lt_4) {
30234     for (size_t k = 1; k < 4; k++) {
30235       GemmMicrokernelTester()
30236         .mr(4)
30237         .nr(8)
30238         .kr(1)
30239         .sr(4)
30240         .m(4)
30241         .n(8)
30242         .k(k)
30243         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30244     }
30245   }
30246 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_lt_4_strided_a)30247   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_lt_4_strided_a) {
30248     for (size_t k = 1; k < 4; k++) {
30249       GemmMicrokernelTester()
30250         .mr(4)
30251         .nr(8)
30252         .kr(1)
30253         .sr(4)
30254         .m(4)
30255         .n(8)
30256         .k(k)
30257         .a_stride(7)
30258         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30259     }
30260   }
30261 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_lt_4_subtile)30262   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_lt_4_subtile) {
30263     for (size_t k = 1; k < 4; k++) {
30264       for (uint32_t n = 1; n <= 8; n++) {
30265         for (uint32_t m = 1; m <= 4; m++) {
30266           GemmMicrokernelTester()
30267             .mr(4)
30268             .nr(8)
30269             .kr(1)
30270             .sr(4)
30271             .m(m)
30272             .n(n)
30273             .k(k)
30274             .iterations(1)
30275             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30276         }
30277       }
30278     }
30279   }
30280 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_gt_4)30281   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_gt_4) {
30282     for (size_t k = 5; k < 8; k++) {
30283       GemmMicrokernelTester()
30284         .mr(4)
30285         .nr(8)
30286         .kr(1)
30287         .sr(4)
30288         .m(4)
30289         .n(8)
30290         .k(k)
30291         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30292     }
30293   }
30294 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_gt_4_strided_a)30295   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_gt_4_strided_a) {
30296     for (size_t k = 5; k < 8; k++) {
30297       GemmMicrokernelTester()
30298         .mr(4)
30299         .nr(8)
30300         .kr(1)
30301         .sr(4)
30302         .m(4)
30303         .n(8)
30304         .k(k)
30305         .a_stride(11)
30306         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30307     }
30308   }
30309 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_gt_4_subtile)30310   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_gt_4_subtile) {
30311     for (size_t k = 5; k < 8; k++) {
30312       for (uint32_t n = 1; n <= 8; n++) {
30313         for (uint32_t m = 1; m <= 4; m++) {
30314           GemmMicrokernelTester()
30315             .mr(4)
30316             .nr(8)
30317             .kr(1)
30318             .sr(4)
30319             .m(m)
30320             .n(n)
30321             .k(k)
30322             .iterations(1)
30323             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30324         }
30325       }
30326     }
30327   }
30328 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_div_4)30329   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_div_4) {
30330     for (size_t k = 8; k <= 40; k += 4) {
30331       GemmMicrokernelTester()
30332         .mr(4)
30333         .nr(8)
30334         .kr(1)
30335         .sr(4)
30336         .m(4)
30337         .n(8)
30338         .k(k)
30339         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30340     }
30341   }
30342 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_div_4_strided_a)30343   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_div_4_strided_a) {
30344     for (size_t k = 8; k <= 40; k += 4) {
30345       GemmMicrokernelTester()
30346         .mr(4)
30347         .nr(8)
30348         .kr(1)
30349         .sr(4)
30350         .m(4)
30351         .n(8)
30352         .k(k)
30353         .a_stride(43)
30354         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30355     }
30356   }
30357 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,k_div_4_subtile)30358   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, k_div_4_subtile) {
30359     for (size_t k = 8; k <= 40; k += 4) {
30360       for (uint32_t n = 1; n <= 8; n++) {
30361         for (uint32_t m = 1; m <= 4; m++) {
30362           GemmMicrokernelTester()
30363             .mr(4)
30364             .nr(8)
30365             .kr(1)
30366             .sr(4)
30367             .m(m)
30368             .n(n)
30369             .k(k)
30370             .iterations(1)
30371             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30372         }
30373       }
30374     }
30375   }
30376 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,n_gt_8)30377   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, n_gt_8) {
30378     for (uint32_t n = 9; n < 16; n++) {
30379       for (size_t k = 1; k <= 20; k += 5) {
30380         GemmMicrokernelTester()
30381           .mr(4)
30382           .nr(8)
30383           .kr(1)
30384           .sr(4)
30385           .m(4)
30386           .n(n)
30387           .k(k)
30388           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30389       }
30390     }
30391   }
30392 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,n_gt_8_strided_cn)30393   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, n_gt_8_strided_cn) {
30394     for (uint32_t n = 9; n < 16; n++) {
30395       for (size_t k = 1; k <= 20; k += 5) {
30396         GemmMicrokernelTester()
30397           .mr(4)
30398           .nr(8)
30399           .kr(1)
30400           .sr(4)
30401           .m(4)
30402           .n(n)
30403           .k(k)
30404           .cn_stride(11)
30405           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30406       }
30407     }
30408   }
30409 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,n_gt_8_strided_a)30410   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, n_gt_8_strided_a) {
30411     for (uint32_t n = 9; n < 16; n++) {
30412       for (size_t k = 1; k <= 20; k += 5) {
30413         GemmMicrokernelTester()
30414           .mr(4)
30415           .nr(8)
30416           .kr(1)
30417           .sr(4)
30418           .m(4)
30419           .n(n)
30420           .k(k)
30421           .a_stride(23)
30422           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30423       }
30424     }
30425   }
30426 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,n_gt_8_subtile)30427   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, n_gt_8_subtile) {
30428     for (uint32_t n = 9; n < 16; n++) {
30429       for (size_t k = 1; k <= 20; k += 5) {
30430         for (uint32_t m = 1; m <= 4; m++) {
30431           GemmMicrokernelTester()
30432             .mr(4)
30433             .nr(8)
30434             .kr(1)
30435             .sr(4)
30436             .m(m)
30437             .n(n)
30438             .k(k)
30439             .iterations(1)
30440             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30441         }
30442       }
30443     }
30444   }
30445 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,n_div_8)30446   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, n_div_8) {
30447     for (uint32_t n = 16; n <= 24; n += 8) {
30448       for (size_t k = 1; k <= 20; k += 5) {
30449         GemmMicrokernelTester()
30450           .mr(4)
30451           .nr(8)
30452           .kr(1)
30453           .sr(4)
30454           .m(4)
30455           .n(n)
30456           .k(k)
30457           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30458       }
30459     }
30460   }
30461 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,n_div_8_strided_cn)30462   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, n_div_8_strided_cn) {
30463     for (uint32_t n = 16; n <= 24; n += 8) {
30464       for (size_t k = 1; k <= 20; k += 5) {
30465         GemmMicrokernelTester()
30466           .mr(4)
30467           .nr(8)
30468           .kr(1)
30469           .sr(4)
30470           .m(4)
30471           .n(n)
30472           .k(k)
30473           .cn_stride(11)
30474           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30475       }
30476     }
30477   }
30478 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,n_div_8_strided_a)30479   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, n_div_8_strided_a) {
30480     for (uint32_t n = 16; n <= 24; n += 8) {
30481       for (size_t k = 1; k <= 20; k += 5) {
30482         GemmMicrokernelTester()
30483           .mr(4)
30484           .nr(8)
30485           .kr(1)
30486           .sr(4)
30487           .m(4)
30488           .n(n)
30489           .k(k)
30490           .a_stride(23)
30491           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30492       }
30493     }
30494   }
30495 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,n_div_8_subtile)30496   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, n_div_8_subtile) {
30497     for (uint32_t n = 16; n <= 24; n += 8) {
30498       for (size_t k = 1; k <= 20; k += 5) {
30499         for (uint32_t m = 1; m <= 4; m++) {
30500           GemmMicrokernelTester()
30501             .mr(4)
30502             .nr(8)
30503             .kr(1)
30504             .sr(4)
30505             .m(m)
30506             .n(n)
30507             .k(k)
30508             .iterations(1)
30509             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30510         }
30511       }
30512     }
30513   }
30514 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,strided_cm_subtile)30515   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, strided_cm_subtile) {
30516     for (size_t k = 1; k <= 20; k += 5) {
30517       for (uint32_t n = 1; n <= 8; n++) {
30518         for (uint32_t m = 1; m <= 4; m++) {
30519           GemmMicrokernelTester()
30520             .mr(4)
30521             .nr(8)
30522             .kr(1)
30523             .sr(4)
30524             .m(m)
30525             .n(n)
30526             .k(k)
30527             .cm_stride(11)
30528             .iterations(1)
30529             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30530         }
30531       }
30532     }
30533   }
30534 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,qmin)30535   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, qmin) {
30536     GemmMicrokernelTester()
30537       .mr(4)
30538       .nr(8)
30539       .kr(1)
30540       .sr(4)
30541       .m(4)
30542       .n(8)
30543       .k(4)
30544       .qmin(128)
30545       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30546   }
30547 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,qmax)30548   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, qmax) {
30549     GemmMicrokernelTester()
30550       .mr(4)
30551       .nr(8)
30552       .kr(1)
30553       .sr(4)
30554       .m(4)
30555       .n(8)
30556       .k(4)
30557       .qmax(128)
30558       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30559   }
30560 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM,strided_cm)30561   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_ARM, strided_cm) {
30562     GemmMicrokernelTester()
30563       .mr(4)
30564       .nr(8)
30565       .kr(1)
30566       .sr(4)
30567       .m(4)
30568       .n(8)
30569       .k(4)
30570       .cm_stride(11)
30571       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
30572   }
30573 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
30574 
30575 
30576 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_eq_4)30577   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_eq_4) {
30578     GemmMicrokernelTester()
30579       .mr(4)
30580       .nr(8)
30581       .kr(1)
30582       .sr(4)
30583       .m(4)
30584       .n(8)
30585       .k(4)
30586       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30587   }
30588 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,strided_cn)30589   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, strided_cn) {
30590     GemmMicrokernelTester()
30591       .mr(4)
30592       .nr(8)
30593       .kr(1)
30594       .sr(4)
30595       .m(4)
30596       .n(8)
30597       .k(4)
30598       .cn_stride(11)
30599       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30600   }
30601 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_eq_4_strided_a)30602   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_eq_4_strided_a) {
30603     GemmMicrokernelTester()
30604       .mr(4)
30605       .nr(8)
30606       .kr(1)
30607       .sr(4)
30608       .m(4)
30609       .n(8)
30610       .k(4)
30611       .a_stride(7)
30612       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30613   }
30614 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_eq_4_subtile)30615   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_eq_4_subtile) {
30616     for (uint32_t n = 1; n <= 8; n++) {
30617       for (uint32_t m = 1; m <= 4; m++) {
30618         GemmMicrokernelTester()
30619           .mr(4)
30620           .nr(8)
30621           .kr(1)
30622           .sr(4)
30623           .m(m)
30624           .n(n)
30625           .k(4)
30626           .iterations(1)
30627           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30628       }
30629     }
30630   }
30631 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_eq_4_subtile_m)30632   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_eq_4_subtile_m) {
30633     for (uint32_t m = 1; m <= 4; m++) {
30634       GemmMicrokernelTester()
30635         .mr(4)
30636         .nr(8)
30637         .kr(1)
30638         .sr(4)
30639         .m(m)
30640         .n(8)
30641         .k(4)
30642         .iterations(1)
30643         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30644     }
30645   }
30646 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_eq_4_subtile_n)30647   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_eq_4_subtile_n) {
30648     for (uint32_t n = 1; n <= 8; n++) {
30649       GemmMicrokernelTester()
30650         .mr(4)
30651         .nr(8)
30652         .kr(1)
30653         .sr(4)
30654         .m(4)
30655         .n(n)
30656         .k(4)
30657         .iterations(1)
30658         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30659     }
30660   }
30661 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_lt_4)30662   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_lt_4) {
30663     for (size_t k = 1; k < 4; k++) {
30664       GemmMicrokernelTester()
30665         .mr(4)
30666         .nr(8)
30667         .kr(1)
30668         .sr(4)
30669         .m(4)
30670         .n(8)
30671         .k(k)
30672         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30673     }
30674   }
30675 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_lt_4_strided_a)30676   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_lt_4_strided_a) {
30677     for (size_t k = 1; k < 4; k++) {
30678       GemmMicrokernelTester()
30679         .mr(4)
30680         .nr(8)
30681         .kr(1)
30682         .sr(4)
30683         .m(4)
30684         .n(8)
30685         .k(k)
30686         .a_stride(7)
30687         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30688     }
30689   }
30690 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_lt_4_subtile)30691   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_lt_4_subtile) {
30692     for (size_t k = 1; k < 4; k++) {
30693       for (uint32_t n = 1; n <= 8; n++) {
30694         for (uint32_t m = 1; m <= 4; m++) {
30695           GemmMicrokernelTester()
30696             .mr(4)
30697             .nr(8)
30698             .kr(1)
30699             .sr(4)
30700             .m(m)
30701             .n(n)
30702             .k(k)
30703             .iterations(1)
30704             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30705         }
30706       }
30707     }
30708   }
30709 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_gt_4)30710   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_gt_4) {
30711     for (size_t k = 5; k < 8; k++) {
30712       GemmMicrokernelTester()
30713         .mr(4)
30714         .nr(8)
30715         .kr(1)
30716         .sr(4)
30717         .m(4)
30718         .n(8)
30719         .k(k)
30720         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30721     }
30722   }
30723 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_gt_4_strided_a)30724   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_gt_4_strided_a) {
30725     for (size_t k = 5; k < 8; k++) {
30726       GemmMicrokernelTester()
30727         .mr(4)
30728         .nr(8)
30729         .kr(1)
30730         .sr(4)
30731         .m(4)
30732         .n(8)
30733         .k(k)
30734         .a_stride(11)
30735         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30736     }
30737   }
30738 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_gt_4_subtile)30739   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_gt_4_subtile) {
30740     for (size_t k = 5; k < 8; k++) {
30741       for (uint32_t n = 1; n <= 8; n++) {
30742         for (uint32_t m = 1; m <= 4; m++) {
30743           GemmMicrokernelTester()
30744             .mr(4)
30745             .nr(8)
30746             .kr(1)
30747             .sr(4)
30748             .m(m)
30749             .n(n)
30750             .k(k)
30751             .iterations(1)
30752             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30753         }
30754       }
30755     }
30756   }
30757 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_div_4)30758   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_div_4) {
30759     for (size_t k = 8; k <= 40; k += 4) {
30760       GemmMicrokernelTester()
30761         .mr(4)
30762         .nr(8)
30763         .kr(1)
30764         .sr(4)
30765         .m(4)
30766         .n(8)
30767         .k(k)
30768         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30769     }
30770   }
30771 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_div_4_strided_a)30772   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_div_4_strided_a) {
30773     for (size_t k = 8; k <= 40; k += 4) {
30774       GemmMicrokernelTester()
30775         .mr(4)
30776         .nr(8)
30777         .kr(1)
30778         .sr(4)
30779         .m(4)
30780         .n(8)
30781         .k(k)
30782         .a_stride(43)
30783         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30784     }
30785   }
30786 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,k_div_4_subtile)30787   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, k_div_4_subtile) {
30788     for (size_t k = 8; k <= 40; k += 4) {
30789       for (uint32_t n = 1; n <= 8; n++) {
30790         for (uint32_t m = 1; m <= 4; m++) {
30791           GemmMicrokernelTester()
30792             .mr(4)
30793             .nr(8)
30794             .kr(1)
30795             .sr(4)
30796             .m(m)
30797             .n(n)
30798             .k(k)
30799             .iterations(1)
30800             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30801         }
30802       }
30803     }
30804   }
30805 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,n_gt_8)30806   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, n_gt_8) {
30807     for (uint32_t n = 9; n < 16; n++) {
30808       for (size_t k = 1; k <= 20; k += 5) {
30809         GemmMicrokernelTester()
30810           .mr(4)
30811           .nr(8)
30812           .kr(1)
30813           .sr(4)
30814           .m(4)
30815           .n(n)
30816           .k(k)
30817           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30818       }
30819     }
30820   }
30821 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,n_gt_8_strided_cn)30822   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, n_gt_8_strided_cn) {
30823     for (uint32_t n = 9; n < 16; n++) {
30824       for (size_t k = 1; k <= 20; k += 5) {
30825         GemmMicrokernelTester()
30826           .mr(4)
30827           .nr(8)
30828           .kr(1)
30829           .sr(4)
30830           .m(4)
30831           .n(n)
30832           .k(k)
30833           .cn_stride(11)
30834           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30835       }
30836     }
30837   }
30838 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,n_gt_8_strided_a)30839   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, n_gt_8_strided_a) {
30840     for (uint32_t n = 9; n < 16; n++) {
30841       for (size_t k = 1; k <= 20; k += 5) {
30842         GemmMicrokernelTester()
30843           .mr(4)
30844           .nr(8)
30845           .kr(1)
30846           .sr(4)
30847           .m(4)
30848           .n(n)
30849           .k(k)
30850           .a_stride(23)
30851           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30852       }
30853     }
30854   }
30855 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,n_gt_8_subtile)30856   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, n_gt_8_subtile) {
30857     for (uint32_t n = 9; n < 16; n++) {
30858       for (size_t k = 1; k <= 20; k += 5) {
30859         for (uint32_t m = 1; m <= 4; m++) {
30860           GemmMicrokernelTester()
30861             .mr(4)
30862             .nr(8)
30863             .kr(1)
30864             .sr(4)
30865             .m(m)
30866             .n(n)
30867             .k(k)
30868             .iterations(1)
30869             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30870         }
30871       }
30872     }
30873   }
30874 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,n_div_8)30875   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, n_div_8) {
30876     for (uint32_t n = 16; n <= 24; n += 8) {
30877       for (size_t k = 1; k <= 20; k += 5) {
30878         GemmMicrokernelTester()
30879           .mr(4)
30880           .nr(8)
30881           .kr(1)
30882           .sr(4)
30883           .m(4)
30884           .n(n)
30885           .k(k)
30886           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30887       }
30888     }
30889   }
30890 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,n_div_8_strided_cn)30891   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, n_div_8_strided_cn) {
30892     for (uint32_t n = 16; n <= 24; n += 8) {
30893       for (size_t k = 1; k <= 20; k += 5) {
30894         GemmMicrokernelTester()
30895           .mr(4)
30896           .nr(8)
30897           .kr(1)
30898           .sr(4)
30899           .m(4)
30900           .n(n)
30901           .k(k)
30902           .cn_stride(11)
30903           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30904       }
30905     }
30906   }
30907 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,n_div_8_strided_a)30908   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, n_div_8_strided_a) {
30909     for (uint32_t n = 16; n <= 24; n += 8) {
30910       for (size_t k = 1; k <= 20; k += 5) {
30911         GemmMicrokernelTester()
30912           .mr(4)
30913           .nr(8)
30914           .kr(1)
30915           .sr(4)
30916           .m(4)
30917           .n(n)
30918           .k(k)
30919           .a_stride(23)
30920           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30921       }
30922     }
30923   }
30924 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,n_div_8_subtile)30925   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, n_div_8_subtile) {
30926     for (uint32_t n = 16; n <= 24; n += 8) {
30927       for (size_t k = 1; k <= 20; k += 5) {
30928         for (uint32_t m = 1; m <= 4; m++) {
30929           GemmMicrokernelTester()
30930             .mr(4)
30931             .nr(8)
30932             .kr(1)
30933             .sr(4)
30934             .m(m)
30935             .n(n)
30936             .k(k)
30937             .iterations(1)
30938             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30939         }
30940       }
30941     }
30942   }
30943 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,strided_cm_subtile)30944   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, strided_cm_subtile) {
30945     for (size_t k = 1; k <= 20; k += 5) {
30946       for (uint32_t n = 1; n <= 8; n++) {
30947         for (uint32_t m = 1; m <= 4; m++) {
30948           GemmMicrokernelTester()
30949             .mr(4)
30950             .nr(8)
30951             .kr(1)
30952             .sr(4)
30953             .m(m)
30954             .n(n)
30955             .k(k)
30956             .cm_stride(11)
30957             .iterations(1)
30958             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30959         }
30960       }
30961     }
30962   }
30963 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,qmin)30964   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, qmin) {
30965     GemmMicrokernelTester()
30966       .mr(4)
30967       .nr(8)
30968       .kr(1)
30969       .sr(4)
30970       .m(4)
30971       .n(8)
30972       .k(4)
30973       .qmin(128)
30974       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30975   }
30976 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,qmax)30977   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, qmax) {
30978     GemmMicrokernelTester()
30979       .mr(4)
30980       .nr(8)
30981       .kr(1)
30982       .sr(4)
30983       .m(4)
30984       .n(8)
30985       .k(4)
30986       .qmax(128)
30987       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
30988   }
30989 
TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86,strided_cm)30990   TEST(F32_GEMM_MINMAX_4X8S4__WASMSIMD_X86, strided_cm) {
30991     GemmMicrokernelTester()
30992       .mr(4)
30993       .nr(8)
30994       .kr(1)
30995       .sr(4)
30996       .m(4)
30997       .n(8)
30998       .k(4)
30999       .cm_stride(11)
31000       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
31001   }
31002 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
31003 
31004 
31005 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_eq_4)31006   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_eq_4) {
31007     GemmMicrokernelTester()
31008       .mr(5)
31009       .nr(8)
31010       .kr(1)
31011       .sr(1)
31012       .m(5)
31013       .n(8)
31014       .k(4)
31015       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31016   }
31017 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,strided_cn)31018   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, strided_cn) {
31019     GemmMicrokernelTester()
31020       .mr(5)
31021       .nr(8)
31022       .kr(1)
31023       .sr(1)
31024       .m(5)
31025       .n(8)
31026       .k(4)
31027       .cn_stride(11)
31028       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31029   }
31030 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_eq_4_strided_a)31031   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_eq_4_strided_a) {
31032     GemmMicrokernelTester()
31033       .mr(5)
31034       .nr(8)
31035       .kr(1)
31036       .sr(1)
31037       .m(5)
31038       .n(8)
31039       .k(4)
31040       .a_stride(7)
31041       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31042   }
31043 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_eq_4_subtile)31044   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_eq_4_subtile) {
31045     for (uint32_t n = 1; n <= 8; n++) {
31046       for (uint32_t m = 1; m <= 5; m++) {
31047         GemmMicrokernelTester()
31048           .mr(5)
31049           .nr(8)
31050           .kr(1)
31051           .sr(1)
31052           .m(m)
31053           .n(n)
31054           .k(4)
31055           .iterations(1)
31056           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31057       }
31058     }
31059   }
31060 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_eq_4_subtile_m)31061   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_eq_4_subtile_m) {
31062     for (uint32_t m = 1; m <= 5; m++) {
31063       GemmMicrokernelTester()
31064         .mr(5)
31065         .nr(8)
31066         .kr(1)
31067         .sr(1)
31068         .m(m)
31069         .n(8)
31070         .k(4)
31071         .iterations(1)
31072         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31073     }
31074   }
31075 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_eq_4_subtile_n)31076   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_eq_4_subtile_n) {
31077     for (uint32_t n = 1; n <= 8; n++) {
31078       GemmMicrokernelTester()
31079         .mr(5)
31080         .nr(8)
31081         .kr(1)
31082         .sr(1)
31083         .m(5)
31084         .n(n)
31085         .k(4)
31086         .iterations(1)
31087         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31088     }
31089   }
31090 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_lt_4)31091   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_lt_4) {
31092     for (size_t k = 1; k < 4; k++) {
31093       GemmMicrokernelTester()
31094         .mr(5)
31095         .nr(8)
31096         .kr(1)
31097         .sr(1)
31098         .m(5)
31099         .n(8)
31100         .k(k)
31101         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31102     }
31103   }
31104 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_lt_4_strided_a)31105   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_lt_4_strided_a) {
31106     for (size_t k = 1; k < 4; k++) {
31107       GemmMicrokernelTester()
31108         .mr(5)
31109         .nr(8)
31110         .kr(1)
31111         .sr(1)
31112         .m(5)
31113         .n(8)
31114         .k(k)
31115         .a_stride(7)
31116         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31117     }
31118   }
31119 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_lt_4_subtile)31120   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_lt_4_subtile) {
31121     for (size_t k = 1; k < 4; k++) {
31122       for (uint32_t n = 1; n <= 8; n++) {
31123         for (uint32_t m = 1; m <= 5; m++) {
31124           GemmMicrokernelTester()
31125             .mr(5)
31126             .nr(8)
31127             .kr(1)
31128             .sr(1)
31129             .m(m)
31130             .n(n)
31131             .k(k)
31132             .iterations(1)
31133             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31134         }
31135       }
31136     }
31137   }
31138 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_gt_4)31139   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_gt_4) {
31140     for (size_t k = 5; k < 8; k++) {
31141       GemmMicrokernelTester()
31142         .mr(5)
31143         .nr(8)
31144         .kr(1)
31145         .sr(1)
31146         .m(5)
31147         .n(8)
31148         .k(k)
31149         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31150     }
31151   }
31152 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_gt_4_strided_a)31153   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_gt_4_strided_a) {
31154     for (size_t k = 5; k < 8; k++) {
31155       GemmMicrokernelTester()
31156         .mr(5)
31157         .nr(8)
31158         .kr(1)
31159         .sr(1)
31160         .m(5)
31161         .n(8)
31162         .k(k)
31163         .a_stride(11)
31164         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31165     }
31166   }
31167 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_gt_4_subtile)31168   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_gt_4_subtile) {
31169     for (size_t k = 5; k < 8; k++) {
31170       for (uint32_t n = 1; n <= 8; n++) {
31171         for (uint32_t m = 1; m <= 5; m++) {
31172           GemmMicrokernelTester()
31173             .mr(5)
31174             .nr(8)
31175             .kr(1)
31176             .sr(1)
31177             .m(m)
31178             .n(n)
31179             .k(k)
31180             .iterations(1)
31181             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31182         }
31183       }
31184     }
31185   }
31186 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_div_4)31187   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_div_4) {
31188     for (size_t k = 8; k <= 40; k += 4) {
31189       GemmMicrokernelTester()
31190         .mr(5)
31191         .nr(8)
31192         .kr(1)
31193         .sr(1)
31194         .m(5)
31195         .n(8)
31196         .k(k)
31197         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31198     }
31199   }
31200 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_div_4_strided_a)31201   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_div_4_strided_a) {
31202     for (size_t k = 8; k <= 40; k += 4) {
31203       GemmMicrokernelTester()
31204         .mr(5)
31205         .nr(8)
31206         .kr(1)
31207         .sr(1)
31208         .m(5)
31209         .n(8)
31210         .k(k)
31211         .a_stride(43)
31212         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31213     }
31214   }
31215 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,k_div_4_subtile)31216   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, k_div_4_subtile) {
31217     for (size_t k = 8; k <= 40; k += 4) {
31218       for (uint32_t n = 1; n <= 8; n++) {
31219         for (uint32_t m = 1; m <= 5; m++) {
31220           GemmMicrokernelTester()
31221             .mr(5)
31222             .nr(8)
31223             .kr(1)
31224             .sr(1)
31225             .m(m)
31226             .n(n)
31227             .k(k)
31228             .iterations(1)
31229             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31230         }
31231       }
31232     }
31233   }
31234 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,n_gt_8)31235   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, n_gt_8) {
31236     for (uint32_t n = 9; n < 16; n++) {
31237       for (size_t k = 1; k <= 20; k += 5) {
31238         GemmMicrokernelTester()
31239           .mr(5)
31240           .nr(8)
31241           .kr(1)
31242           .sr(1)
31243           .m(5)
31244           .n(n)
31245           .k(k)
31246           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31247       }
31248     }
31249   }
31250 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,n_gt_8_strided_cn)31251   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, n_gt_8_strided_cn) {
31252     for (uint32_t n = 9; n < 16; n++) {
31253       for (size_t k = 1; k <= 20; k += 5) {
31254         GemmMicrokernelTester()
31255           .mr(5)
31256           .nr(8)
31257           .kr(1)
31258           .sr(1)
31259           .m(5)
31260           .n(n)
31261           .k(k)
31262           .cn_stride(11)
31263           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31264       }
31265     }
31266   }
31267 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,n_gt_8_strided_a)31268   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, n_gt_8_strided_a) {
31269     for (uint32_t n = 9; n < 16; n++) {
31270       for (size_t k = 1; k <= 20; k += 5) {
31271         GemmMicrokernelTester()
31272           .mr(5)
31273           .nr(8)
31274           .kr(1)
31275           .sr(1)
31276           .m(5)
31277           .n(n)
31278           .k(k)
31279           .a_stride(23)
31280           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31281       }
31282     }
31283   }
31284 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,n_gt_8_subtile)31285   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, n_gt_8_subtile) {
31286     for (uint32_t n = 9; n < 16; n++) {
31287       for (size_t k = 1; k <= 20; k += 5) {
31288         for (uint32_t m = 1; m <= 5; m++) {
31289           GemmMicrokernelTester()
31290             .mr(5)
31291             .nr(8)
31292             .kr(1)
31293             .sr(1)
31294             .m(m)
31295             .n(n)
31296             .k(k)
31297             .iterations(1)
31298             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31299         }
31300       }
31301     }
31302   }
31303 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,n_div_8)31304   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, n_div_8) {
31305     for (uint32_t n = 16; n <= 24; n += 8) {
31306       for (size_t k = 1; k <= 20; k += 5) {
31307         GemmMicrokernelTester()
31308           .mr(5)
31309           .nr(8)
31310           .kr(1)
31311           .sr(1)
31312           .m(5)
31313           .n(n)
31314           .k(k)
31315           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31316       }
31317     }
31318   }
31319 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,n_div_8_strided_cn)31320   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, n_div_8_strided_cn) {
31321     for (uint32_t n = 16; n <= 24; n += 8) {
31322       for (size_t k = 1; k <= 20; k += 5) {
31323         GemmMicrokernelTester()
31324           .mr(5)
31325           .nr(8)
31326           .kr(1)
31327           .sr(1)
31328           .m(5)
31329           .n(n)
31330           .k(k)
31331           .cn_stride(11)
31332           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31333       }
31334     }
31335   }
31336 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,n_div_8_strided_a)31337   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, n_div_8_strided_a) {
31338     for (uint32_t n = 16; n <= 24; n += 8) {
31339       for (size_t k = 1; k <= 20; k += 5) {
31340         GemmMicrokernelTester()
31341           .mr(5)
31342           .nr(8)
31343           .kr(1)
31344           .sr(1)
31345           .m(5)
31346           .n(n)
31347           .k(k)
31348           .a_stride(23)
31349           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31350       }
31351     }
31352   }
31353 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,n_div_8_subtile)31354   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, n_div_8_subtile) {
31355     for (uint32_t n = 16; n <= 24; n += 8) {
31356       for (size_t k = 1; k <= 20; k += 5) {
31357         for (uint32_t m = 1; m <= 5; m++) {
31358           GemmMicrokernelTester()
31359             .mr(5)
31360             .nr(8)
31361             .kr(1)
31362             .sr(1)
31363             .m(m)
31364             .n(n)
31365             .k(k)
31366             .iterations(1)
31367             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31368         }
31369       }
31370     }
31371   }
31372 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,strided_cm_subtile)31373   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, strided_cm_subtile) {
31374     for (size_t k = 1; k <= 20; k += 5) {
31375       for (uint32_t n = 1; n <= 8; n++) {
31376         for (uint32_t m = 1; m <= 5; m++) {
31377           GemmMicrokernelTester()
31378             .mr(5)
31379             .nr(8)
31380             .kr(1)
31381             .sr(1)
31382             .m(m)
31383             .n(n)
31384             .k(k)
31385             .cm_stride(11)
31386             .iterations(1)
31387             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31388         }
31389       }
31390     }
31391   }
31392 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,qmin)31393   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, qmin) {
31394     GemmMicrokernelTester()
31395       .mr(5)
31396       .nr(8)
31397       .kr(1)
31398       .sr(1)
31399       .m(5)
31400       .n(8)
31401       .k(4)
31402       .qmin(128)
31403       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31404   }
31405 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,qmax)31406   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, qmax) {
31407     GemmMicrokernelTester()
31408       .mr(5)
31409       .nr(8)
31410       .kr(1)
31411       .sr(1)
31412       .m(5)
31413       .n(8)
31414       .k(4)
31415       .qmax(128)
31416       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31417   }
31418 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT,strided_cm)31419   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_ARM_SPLAT, strided_cm) {
31420     GemmMicrokernelTester()
31421       .mr(5)
31422       .nr(8)
31423       .kr(1)
31424       .sr(1)
31425       .m(5)
31426       .n(8)
31427       .k(4)
31428       .cm_stride(11)
31429       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_arm_splat, xnn_init_f32_minmax_wasmsimd_params);
31430   }
31431 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
31432 
31433 
31434 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,k_eq_1)31435   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, k_eq_1) {
31436     GemmMicrokernelTester()
31437       .mr(5)
31438       .nr(8)
31439       .kr(1)
31440       .sr(1)
31441       .m(5)
31442       .n(8)
31443       .k(1)
31444       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31445   }
31446 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,strided_cn)31447   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, strided_cn) {
31448     GemmMicrokernelTester()
31449       .mr(5)
31450       .nr(8)
31451       .kr(1)
31452       .sr(1)
31453       .m(5)
31454       .n(8)
31455       .k(1)
31456       .cn_stride(11)
31457       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31458   }
31459 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,k_eq_1_strided_a)31460   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, k_eq_1_strided_a) {
31461     GemmMicrokernelTester()
31462       .mr(5)
31463       .nr(8)
31464       .kr(1)
31465       .sr(1)
31466       .m(5)
31467       .n(8)
31468       .k(1)
31469       .a_stride(3)
31470       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31471   }
31472 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,k_eq_1_subtile)31473   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, k_eq_1_subtile) {
31474     for (uint32_t n = 1; n <= 8; n++) {
31475       for (uint32_t m = 1; m <= 5; m++) {
31476         GemmMicrokernelTester()
31477           .mr(5)
31478           .nr(8)
31479           .kr(1)
31480           .sr(1)
31481           .m(m)
31482           .n(n)
31483           .k(1)
31484           .iterations(1)
31485           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31486       }
31487     }
31488   }
31489 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,k_eq_1_subtile_m)31490   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, k_eq_1_subtile_m) {
31491     for (uint32_t m = 1; m <= 5; m++) {
31492       GemmMicrokernelTester()
31493         .mr(5)
31494         .nr(8)
31495         .kr(1)
31496         .sr(1)
31497         .m(m)
31498         .n(8)
31499         .k(1)
31500         .iterations(1)
31501         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31502     }
31503   }
31504 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,k_eq_1_subtile_n)31505   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, k_eq_1_subtile_n) {
31506     for (uint32_t n = 1; n <= 8; n++) {
31507       GemmMicrokernelTester()
31508         .mr(5)
31509         .nr(8)
31510         .kr(1)
31511         .sr(1)
31512         .m(5)
31513         .n(n)
31514         .k(1)
31515         .iterations(1)
31516         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31517     }
31518   }
31519 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,k_gt_1)31520   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, k_gt_1) {
31521     for (size_t k = 2; k < 10; k++) {
31522       GemmMicrokernelTester()
31523         .mr(5)
31524         .nr(8)
31525         .kr(1)
31526         .sr(1)
31527         .m(5)
31528         .n(8)
31529         .k(k)
31530         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31531     }
31532   }
31533 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,k_gt_1_strided_a)31534   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, k_gt_1_strided_a) {
31535     for (size_t k = 2; k < 10; k++) {
31536       GemmMicrokernelTester()
31537         .mr(5)
31538         .nr(8)
31539         .kr(1)
31540         .sr(1)
31541         .m(5)
31542         .n(8)
31543         .k(k)
31544         .a_stride(11)
31545         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31546     }
31547   }
31548 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,k_gt_1_subtile)31549   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, k_gt_1_subtile) {
31550     for (size_t k = 2; k < 10; k++) {
31551       for (uint32_t n = 1; n <= 8; n++) {
31552         for (uint32_t m = 1; m <= 5; m++) {
31553           GemmMicrokernelTester()
31554             .mr(5)
31555             .nr(8)
31556             .kr(1)
31557             .sr(1)
31558             .m(m)
31559             .n(n)
31560             .k(k)
31561             .iterations(1)
31562             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31563         }
31564       }
31565     }
31566   }
31567 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,n_gt_8)31568   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, n_gt_8) {
31569     for (uint32_t n = 9; n < 16; n++) {
31570       for (size_t k = 1; k <= 5; k += 2) {
31571         GemmMicrokernelTester()
31572           .mr(5)
31573           .nr(8)
31574           .kr(1)
31575           .sr(1)
31576           .m(5)
31577           .n(n)
31578           .k(k)
31579           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31580       }
31581     }
31582   }
31583 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,n_gt_8_strided_cn)31584   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, n_gt_8_strided_cn) {
31585     for (uint32_t n = 9; n < 16; n++) {
31586       for (size_t k = 1; k <= 5; k += 2) {
31587         GemmMicrokernelTester()
31588           .mr(5)
31589           .nr(8)
31590           .kr(1)
31591           .sr(1)
31592           .m(5)
31593           .n(n)
31594           .k(k)
31595           .cn_stride(11)
31596           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31597       }
31598     }
31599   }
31600 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,n_gt_8_strided_a)31601   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, n_gt_8_strided_a) {
31602     for (uint32_t n = 9; n < 16; n++) {
31603       for (size_t k = 1; k <= 5; k += 2) {
31604         GemmMicrokernelTester()
31605           .mr(5)
31606           .nr(8)
31607           .kr(1)
31608           .sr(1)
31609           .m(5)
31610           .n(n)
31611           .k(k)
31612           .a_stride(7)
31613           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31614       }
31615     }
31616   }
31617 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,n_gt_8_subtile)31618   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, n_gt_8_subtile) {
31619     for (uint32_t n = 9; n < 16; n++) {
31620       for (size_t k = 1; k <= 5; k += 2) {
31621         for (uint32_t m = 1; m <= 5; m++) {
31622           GemmMicrokernelTester()
31623             .mr(5)
31624             .nr(8)
31625             .kr(1)
31626             .sr(1)
31627             .m(m)
31628             .n(n)
31629             .k(k)
31630             .iterations(1)
31631             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31632         }
31633       }
31634     }
31635   }
31636 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,n_div_8)31637   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, n_div_8) {
31638     for (uint32_t n = 16; n <= 24; n += 8) {
31639       for (size_t k = 1; k <= 5; k += 2) {
31640         GemmMicrokernelTester()
31641           .mr(5)
31642           .nr(8)
31643           .kr(1)
31644           .sr(1)
31645           .m(5)
31646           .n(n)
31647           .k(k)
31648           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31649       }
31650     }
31651   }
31652 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,n_div_8_strided_cn)31653   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, n_div_8_strided_cn) {
31654     for (uint32_t n = 16; n <= 24; n += 8) {
31655       for (size_t k = 1; k <= 5; k += 2) {
31656         GemmMicrokernelTester()
31657           .mr(5)
31658           .nr(8)
31659           .kr(1)
31660           .sr(1)
31661           .m(5)
31662           .n(n)
31663           .k(k)
31664           .cn_stride(11)
31665           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31666       }
31667     }
31668   }
31669 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,n_div_8_strided_a)31670   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, n_div_8_strided_a) {
31671     for (uint32_t n = 16; n <= 24; n += 8) {
31672       for (size_t k = 1; k <= 5; k += 2) {
31673         GemmMicrokernelTester()
31674           .mr(5)
31675           .nr(8)
31676           .kr(1)
31677           .sr(1)
31678           .m(5)
31679           .n(n)
31680           .k(k)
31681           .a_stride(7)
31682           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31683       }
31684     }
31685   }
31686 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,n_div_8_subtile)31687   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, n_div_8_subtile) {
31688     for (uint32_t n = 16; n <= 24; n += 8) {
31689       for (size_t k = 1; k <= 5; k += 2) {
31690         for (uint32_t m = 1; m <= 5; m++) {
31691           GemmMicrokernelTester()
31692             .mr(5)
31693             .nr(8)
31694             .kr(1)
31695             .sr(1)
31696             .m(m)
31697             .n(n)
31698             .k(k)
31699             .iterations(1)
31700             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31701         }
31702       }
31703     }
31704   }
31705 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,strided_cm_subtile)31706   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, strided_cm_subtile) {
31707     for (size_t k = 1; k <= 5; k += 2) {
31708       for (uint32_t n = 1; n <= 8; n++) {
31709         for (uint32_t m = 1; m <= 5; m++) {
31710           GemmMicrokernelTester()
31711             .mr(5)
31712             .nr(8)
31713             .kr(1)
31714             .sr(1)
31715             .m(m)
31716             .n(n)
31717             .k(k)
31718             .cm_stride(11)
31719             .iterations(1)
31720             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31721         }
31722       }
31723     }
31724   }
31725 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,qmin)31726   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, qmin) {
31727     GemmMicrokernelTester()
31728       .mr(5)
31729       .nr(8)
31730       .kr(1)
31731       .sr(1)
31732       .m(5)
31733       .n(8)
31734       .k(1)
31735       .qmin(128)
31736       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31737   }
31738 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,qmax)31739   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, qmax) {
31740     GemmMicrokernelTester()
31741       .mr(5)
31742       .nr(8)
31743       .kr(1)
31744       .sr(1)
31745       .m(5)
31746       .n(8)
31747       .k(1)
31748       .qmax(128)
31749       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31750   }
31751 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT,strided_cm)31752   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_LOADSPLAT, strided_cm) {
31753     GemmMicrokernelTester()
31754       .mr(5)
31755       .nr(8)
31756       .kr(1)
31757       .sr(1)
31758       .m(5)
31759       .n(8)
31760       .k(1)
31761       .cm_stride(11)
31762       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
31763   }
31764 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
31765 
31766 
31767 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_eq_4)31768   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_eq_4) {
31769     GemmMicrokernelTester()
31770       .mr(5)
31771       .nr(8)
31772       .kr(1)
31773       .sr(1)
31774       .m(5)
31775       .n(8)
31776       .k(4)
31777       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31778   }
31779 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,strided_cn)31780   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, strided_cn) {
31781     GemmMicrokernelTester()
31782       .mr(5)
31783       .nr(8)
31784       .kr(1)
31785       .sr(1)
31786       .m(5)
31787       .n(8)
31788       .k(4)
31789       .cn_stride(11)
31790       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31791   }
31792 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_eq_4_strided_a)31793   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_eq_4_strided_a) {
31794     GemmMicrokernelTester()
31795       .mr(5)
31796       .nr(8)
31797       .kr(1)
31798       .sr(1)
31799       .m(5)
31800       .n(8)
31801       .k(4)
31802       .a_stride(7)
31803       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31804   }
31805 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_eq_4_subtile)31806   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_eq_4_subtile) {
31807     for (uint32_t n = 1; n <= 8; n++) {
31808       for (uint32_t m = 1; m <= 5; m++) {
31809         GemmMicrokernelTester()
31810           .mr(5)
31811           .nr(8)
31812           .kr(1)
31813           .sr(1)
31814           .m(m)
31815           .n(n)
31816           .k(4)
31817           .iterations(1)
31818           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31819       }
31820     }
31821   }
31822 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_eq_4_subtile_m)31823   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_eq_4_subtile_m) {
31824     for (uint32_t m = 1; m <= 5; m++) {
31825       GemmMicrokernelTester()
31826         .mr(5)
31827         .nr(8)
31828         .kr(1)
31829         .sr(1)
31830         .m(m)
31831         .n(8)
31832         .k(4)
31833         .iterations(1)
31834         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31835     }
31836   }
31837 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_eq_4_subtile_n)31838   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_eq_4_subtile_n) {
31839     for (uint32_t n = 1; n <= 8; n++) {
31840       GemmMicrokernelTester()
31841         .mr(5)
31842         .nr(8)
31843         .kr(1)
31844         .sr(1)
31845         .m(5)
31846         .n(n)
31847         .k(4)
31848         .iterations(1)
31849         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31850     }
31851   }
31852 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_lt_4)31853   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_lt_4) {
31854     for (size_t k = 1; k < 4; k++) {
31855       GemmMicrokernelTester()
31856         .mr(5)
31857         .nr(8)
31858         .kr(1)
31859         .sr(1)
31860         .m(5)
31861         .n(8)
31862         .k(k)
31863         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31864     }
31865   }
31866 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_lt_4_strided_a)31867   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_lt_4_strided_a) {
31868     for (size_t k = 1; k < 4; k++) {
31869       GemmMicrokernelTester()
31870         .mr(5)
31871         .nr(8)
31872         .kr(1)
31873         .sr(1)
31874         .m(5)
31875         .n(8)
31876         .k(k)
31877         .a_stride(7)
31878         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31879     }
31880   }
31881 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_lt_4_subtile)31882   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_lt_4_subtile) {
31883     for (size_t k = 1; k < 4; k++) {
31884       for (uint32_t n = 1; n <= 8; n++) {
31885         for (uint32_t m = 1; m <= 5; m++) {
31886           GemmMicrokernelTester()
31887             .mr(5)
31888             .nr(8)
31889             .kr(1)
31890             .sr(1)
31891             .m(m)
31892             .n(n)
31893             .k(k)
31894             .iterations(1)
31895             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31896         }
31897       }
31898     }
31899   }
31900 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_gt_4)31901   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_gt_4) {
31902     for (size_t k = 5; k < 8; k++) {
31903       GemmMicrokernelTester()
31904         .mr(5)
31905         .nr(8)
31906         .kr(1)
31907         .sr(1)
31908         .m(5)
31909         .n(8)
31910         .k(k)
31911         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31912     }
31913   }
31914 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_gt_4_strided_a)31915   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_gt_4_strided_a) {
31916     for (size_t k = 5; k < 8; k++) {
31917       GemmMicrokernelTester()
31918         .mr(5)
31919         .nr(8)
31920         .kr(1)
31921         .sr(1)
31922         .m(5)
31923         .n(8)
31924         .k(k)
31925         .a_stride(11)
31926         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31927     }
31928   }
31929 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_gt_4_subtile)31930   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_gt_4_subtile) {
31931     for (size_t k = 5; k < 8; k++) {
31932       for (uint32_t n = 1; n <= 8; n++) {
31933         for (uint32_t m = 1; m <= 5; m++) {
31934           GemmMicrokernelTester()
31935             .mr(5)
31936             .nr(8)
31937             .kr(1)
31938             .sr(1)
31939             .m(m)
31940             .n(n)
31941             .k(k)
31942             .iterations(1)
31943             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31944         }
31945       }
31946     }
31947   }
31948 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_div_4)31949   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_div_4) {
31950     for (size_t k = 8; k <= 40; k += 4) {
31951       GemmMicrokernelTester()
31952         .mr(5)
31953         .nr(8)
31954         .kr(1)
31955         .sr(1)
31956         .m(5)
31957         .n(8)
31958         .k(k)
31959         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31960     }
31961   }
31962 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_div_4_strided_a)31963   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_div_4_strided_a) {
31964     for (size_t k = 8; k <= 40; k += 4) {
31965       GemmMicrokernelTester()
31966         .mr(5)
31967         .nr(8)
31968         .kr(1)
31969         .sr(1)
31970         .m(5)
31971         .n(8)
31972         .k(k)
31973         .a_stride(43)
31974         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31975     }
31976   }
31977 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,k_div_4_subtile)31978   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, k_div_4_subtile) {
31979     for (size_t k = 8; k <= 40; k += 4) {
31980       for (uint32_t n = 1; n <= 8; n++) {
31981         for (uint32_t m = 1; m <= 5; m++) {
31982           GemmMicrokernelTester()
31983             .mr(5)
31984             .nr(8)
31985             .kr(1)
31986             .sr(1)
31987             .m(m)
31988             .n(n)
31989             .k(k)
31990             .iterations(1)
31991             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
31992         }
31993       }
31994     }
31995   }
31996 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,n_gt_8)31997   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, n_gt_8) {
31998     for (uint32_t n = 9; n < 16; n++) {
31999       for (size_t k = 1; k <= 20; k += 5) {
32000         GemmMicrokernelTester()
32001           .mr(5)
32002           .nr(8)
32003           .kr(1)
32004           .sr(1)
32005           .m(5)
32006           .n(n)
32007           .k(k)
32008           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32009       }
32010     }
32011   }
32012 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,n_gt_8_strided_cn)32013   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, n_gt_8_strided_cn) {
32014     for (uint32_t n = 9; n < 16; n++) {
32015       for (size_t k = 1; k <= 20; k += 5) {
32016         GemmMicrokernelTester()
32017           .mr(5)
32018           .nr(8)
32019           .kr(1)
32020           .sr(1)
32021           .m(5)
32022           .n(n)
32023           .k(k)
32024           .cn_stride(11)
32025           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32026       }
32027     }
32028   }
32029 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,n_gt_8_strided_a)32030   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, n_gt_8_strided_a) {
32031     for (uint32_t n = 9; n < 16; n++) {
32032       for (size_t k = 1; k <= 20; k += 5) {
32033         GemmMicrokernelTester()
32034           .mr(5)
32035           .nr(8)
32036           .kr(1)
32037           .sr(1)
32038           .m(5)
32039           .n(n)
32040           .k(k)
32041           .a_stride(23)
32042           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32043       }
32044     }
32045   }
32046 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,n_gt_8_subtile)32047   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, n_gt_8_subtile) {
32048     for (uint32_t n = 9; n < 16; n++) {
32049       for (size_t k = 1; k <= 20; k += 5) {
32050         for (uint32_t m = 1; m <= 5; m++) {
32051           GemmMicrokernelTester()
32052             .mr(5)
32053             .nr(8)
32054             .kr(1)
32055             .sr(1)
32056             .m(m)
32057             .n(n)
32058             .k(k)
32059             .iterations(1)
32060             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32061         }
32062       }
32063     }
32064   }
32065 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,n_div_8)32066   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, n_div_8) {
32067     for (uint32_t n = 16; n <= 24; n += 8) {
32068       for (size_t k = 1; k <= 20; k += 5) {
32069         GemmMicrokernelTester()
32070           .mr(5)
32071           .nr(8)
32072           .kr(1)
32073           .sr(1)
32074           .m(5)
32075           .n(n)
32076           .k(k)
32077           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32078       }
32079     }
32080   }
32081 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,n_div_8_strided_cn)32082   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, n_div_8_strided_cn) {
32083     for (uint32_t n = 16; n <= 24; n += 8) {
32084       for (size_t k = 1; k <= 20; k += 5) {
32085         GemmMicrokernelTester()
32086           .mr(5)
32087           .nr(8)
32088           .kr(1)
32089           .sr(1)
32090           .m(5)
32091           .n(n)
32092           .k(k)
32093           .cn_stride(11)
32094           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32095       }
32096     }
32097   }
32098 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,n_div_8_strided_a)32099   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, n_div_8_strided_a) {
32100     for (uint32_t n = 16; n <= 24; n += 8) {
32101       for (size_t k = 1; k <= 20; k += 5) {
32102         GemmMicrokernelTester()
32103           .mr(5)
32104           .nr(8)
32105           .kr(1)
32106           .sr(1)
32107           .m(5)
32108           .n(n)
32109           .k(k)
32110           .a_stride(23)
32111           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32112       }
32113     }
32114   }
32115 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,n_div_8_subtile)32116   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, n_div_8_subtile) {
32117     for (uint32_t n = 16; n <= 24; n += 8) {
32118       for (size_t k = 1; k <= 20; k += 5) {
32119         for (uint32_t m = 1; m <= 5; m++) {
32120           GemmMicrokernelTester()
32121             .mr(5)
32122             .nr(8)
32123             .kr(1)
32124             .sr(1)
32125             .m(m)
32126             .n(n)
32127             .k(k)
32128             .iterations(1)
32129             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32130         }
32131       }
32132     }
32133   }
32134 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,strided_cm_subtile)32135   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, strided_cm_subtile) {
32136     for (size_t k = 1; k <= 20; k += 5) {
32137       for (uint32_t n = 1; n <= 8; n++) {
32138         for (uint32_t m = 1; m <= 5; m++) {
32139           GemmMicrokernelTester()
32140             .mr(5)
32141             .nr(8)
32142             .kr(1)
32143             .sr(1)
32144             .m(m)
32145             .n(n)
32146             .k(k)
32147             .cm_stride(11)
32148             .iterations(1)
32149             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32150         }
32151       }
32152     }
32153   }
32154 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,qmin)32155   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, qmin) {
32156     GemmMicrokernelTester()
32157       .mr(5)
32158       .nr(8)
32159       .kr(1)
32160       .sr(1)
32161       .m(5)
32162       .n(8)
32163       .k(4)
32164       .qmin(128)
32165       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32166   }
32167 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,qmax)32168   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, qmax) {
32169     GemmMicrokernelTester()
32170       .mr(5)
32171       .nr(8)
32172       .kr(1)
32173       .sr(1)
32174       .m(5)
32175       .n(8)
32176       .k(4)
32177       .qmax(128)
32178       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32179   }
32180 
TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT,strided_cm)32181   TEST(F32_GEMM_MINMAX_5X8__WASMSIMD_X86_SPLAT, strided_cm) {
32182     GemmMicrokernelTester()
32183       .mr(5)
32184       .nr(8)
32185       .kr(1)
32186       .sr(1)
32187       .m(5)
32188       .n(8)
32189       .k(4)
32190       .cm_stride(11)
32191       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmsimd_x86_splat, xnn_init_f32_minmax_wasmsimd_params);
32192   }
32193 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
32194 
32195 
32196 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_eq_4)32197   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_eq_4) {
32198     GemmMicrokernelTester()
32199       .mr(5)
32200       .nr(8)
32201       .kr(1)
32202       .sr(4)
32203       .m(5)
32204       .n(8)
32205       .k(4)
32206       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32207   }
32208 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,strided_cn)32209   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, strided_cn) {
32210     GemmMicrokernelTester()
32211       .mr(5)
32212       .nr(8)
32213       .kr(1)
32214       .sr(4)
32215       .m(5)
32216       .n(8)
32217       .k(4)
32218       .cn_stride(11)
32219       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32220   }
32221 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_eq_4_strided_a)32222   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_eq_4_strided_a) {
32223     GemmMicrokernelTester()
32224       .mr(5)
32225       .nr(8)
32226       .kr(1)
32227       .sr(4)
32228       .m(5)
32229       .n(8)
32230       .k(4)
32231       .a_stride(7)
32232       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32233   }
32234 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_eq_4_subtile)32235   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_eq_4_subtile) {
32236     for (uint32_t n = 1; n <= 8; n++) {
32237       for (uint32_t m = 1; m <= 5; m++) {
32238         GemmMicrokernelTester()
32239           .mr(5)
32240           .nr(8)
32241           .kr(1)
32242           .sr(4)
32243           .m(m)
32244           .n(n)
32245           .k(4)
32246           .iterations(1)
32247           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32248       }
32249     }
32250   }
32251 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_eq_4_subtile_m)32252   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_eq_4_subtile_m) {
32253     for (uint32_t m = 1; m <= 5; m++) {
32254       GemmMicrokernelTester()
32255         .mr(5)
32256         .nr(8)
32257         .kr(1)
32258         .sr(4)
32259         .m(m)
32260         .n(8)
32261         .k(4)
32262         .iterations(1)
32263         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32264     }
32265   }
32266 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_eq_4_subtile_n)32267   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_eq_4_subtile_n) {
32268     for (uint32_t n = 1; n <= 8; n++) {
32269       GemmMicrokernelTester()
32270         .mr(5)
32271         .nr(8)
32272         .kr(1)
32273         .sr(4)
32274         .m(5)
32275         .n(n)
32276         .k(4)
32277         .iterations(1)
32278         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32279     }
32280   }
32281 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_lt_4)32282   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_lt_4) {
32283     for (size_t k = 1; k < 4; k++) {
32284       GemmMicrokernelTester()
32285         .mr(5)
32286         .nr(8)
32287         .kr(1)
32288         .sr(4)
32289         .m(5)
32290         .n(8)
32291         .k(k)
32292         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32293     }
32294   }
32295 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_lt_4_strided_a)32296   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_lt_4_strided_a) {
32297     for (size_t k = 1; k < 4; k++) {
32298       GemmMicrokernelTester()
32299         .mr(5)
32300         .nr(8)
32301         .kr(1)
32302         .sr(4)
32303         .m(5)
32304         .n(8)
32305         .k(k)
32306         .a_stride(7)
32307         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32308     }
32309   }
32310 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_lt_4_subtile)32311   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_lt_4_subtile) {
32312     for (size_t k = 1; k < 4; k++) {
32313       for (uint32_t n = 1; n <= 8; n++) {
32314         for (uint32_t m = 1; m <= 5; m++) {
32315           GemmMicrokernelTester()
32316             .mr(5)
32317             .nr(8)
32318             .kr(1)
32319             .sr(4)
32320             .m(m)
32321             .n(n)
32322             .k(k)
32323             .iterations(1)
32324             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32325         }
32326       }
32327     }
32328   }
32329 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_gt_4)32330   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_gt_4) {
32331     for (size_t k = 5; k < 8; k++) {
32332       GemmMicrokernelTester()
32333         .mr(5)
32334         .nr(8)
32335         .kr(1)
32336         .sr(4)
32337         .m(5)
32338         .n(8)
32339         .k(k)
32340         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32341     }
32342   }
32343 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_gt_4_strided_a)32344   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_gt_4_strided_a) {
32345     for (size_t k = 5; k < 8; k++) {
32346       GemmMicrokernelTester()
32347         .mr(5)
32348         .nr(8)
32349         .kr(1)
32350         .sr(4)
32351         .m(5)
32352         .n(8)
32353         .k(k)
32354         .a_stride(11)
32355         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32356     }
32357   }
32358 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_gt_4_subtile)32359   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_gt_4_subtile) {
32360     for (size_t k = 5; k < 8; k++) {
32361       for (uint32_t n = 1; n <= 8; n++) {
32362         for (uint32_t m = 1; m <= 5; m++) {
32363           GemmMicrokernelTester()
32364             .mr(5)
32365             .nr(8)
32366             .kr(1)
32367             .sr(4)
32368             .m(m)
32369             .n(n)
32370             .k(k)
32371             .iterations(1)
32372             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32373         }
32374       }
32375     }
32376   }
32377 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_div_4)32378   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_div_4) {
32379     for (size_t k = 8; k <= 40; k += 4) {
32380       GemmMicrokernelTester()
32381         .mr(5)
32382         .nr(8)
32383         .kr(1)
32384         .sr(4)
32385         .m(5)
32386         .n(8)
32387         .k(k)
32388         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32389     }
32390   }
32391 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_div_4_strided_a)32392   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_div_4_strided_a) {
32393     for (size_t k = 8; k <= 40; k += 4) {
32394       GemmMicrokernelTester()
32395         .mr(5)
32396         .nr(8)
32397         .kr(1)
32398         .sr(4)
32399         .m(5)
32400         .n(8)
32401         .k(k)
32402         .a_stride(43)
32403         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32404     }
32405   }
32406 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,k_div_4_subtile)32407   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, k_div_4_subtile) {
32408     for (size_t k = 8; k <= 40; k += 4) {
32409       for (uint32_t n = 1; n <= 8; n++) {
32410         for (uint32_t m = 1; m <= 5; m++) {
32411           GemmMicrokernelTester()
32412             .mr(5)
32413             .nr(8)
32414             .kr(1)
32415             .sr(4)
32416             .m(m)
32417             .n(n)
32418             .k(k)
32419             .iterations(1)
32420             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32421         }
32422       }
32423     }
32424   }
32425 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,n_gt_8)32426   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, n_gt_8) {
32427     for (uint32_t n = 9; n < 16; n++) {
32428       for (size_t k = 1; k <= 20; k += 5) {
32429         GemmMicrokernelTester()
32430           .mr(5)
32431           .nr(8)
32432           .kr(1)
32433           .sr(4)
32434           .m(5)
32435           .n(n)
32436           .k(k)
32437           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32438       }
32439     }
32440   }
32441 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,n_gt_8_strided_cn)32442   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, n_gt_8_strided_cn) {
32443     for (uint32_t n = 9; n < 16; n++) {
32444       for (size_t k = 1; k <= 20; k += 5) {
32445         GemmMicrokernelTester()
32446           .mr(5)
32447           .nr(8)
32448           .kr(1)
32449           .sr(4)
32450           .m(5)
32451           .n(n)
32452           .k(k)
32453           .cn_stride(11)
32454           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32455       }
32456     }
32457   }
32458 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,n_gt_8_strided_a)32459   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, n_gt_8_strided_a) {
32460     for (uint32_t n = 9; n < 16; n++) {
32461       for (size_t k = 1; k <= 20; k += 5) {
32462         GemmMicrokernelTester()
32463           .mr(5)
32464           .nr(8)
32465           .kr(1)
32466           .sr(4)
32467           .m(5)
32468           .n(n)
32469           .k(k)
32470           .a_stride(23)
32471           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32472       }
32473     }
32474   }
32475 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,n_gt_8_subtile)32476   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, n_gt_8_subtile) {
32477     for (uint32_t n = 9; n < 16; n++) {
32478       for (size_t k = 1; k <= 20; k += 5) {
32479         for (uint32_t m = 1; m <= 5; m++) {
32480           GemmMicrokernelTester()
32481             .mr(5)
32482             .nr(8)
32483             .kr(1)
32484             .sr(4)
32485             .m(m)
32486             .n(n)
32487             .k(k)
32488             .iterations(1)
32489             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32490         }
32491       }
32492     }
32493   }
32494 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,n_div_8)32495   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, n_div_8) {
32496     for (uint32_t n = 16; n <= 24; n += 8) {
32497       for (size_t k = 1; k <= 20; k += 5) {
32498         GemmMicrokernelTester()
32499           .mr(5)
32500           .nr(8)
32501           .kr(1)
32502           .sr(4)
32503           .m(5)
32504           .n(n)
32505           .k(k)
32506           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32507       }
32508     }
32509   }
32510 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,n_div_8_strided_cn)32511   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, n_div_8_strided_cn) {
32512     for (uint32_t n = 16; n <= 24; n += 8) {
32513       for (size_t k = 1; k <= 20; k += 5) {
32514         GemmMicrokernelTester()
32515           .mr(5)
32516           .nr(8)
32517           .kr(1)
32518           .sr(4)
32519           .m(5)
32520           .n(n)
32521           .k(k)
32522           .cn_stride(11)
32523           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32524       }
32525     }
32526   }
32527 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,n_div_8_strided_a)32528   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, n_div_8_strided_a) {
32529     for (uint32_t n = 16; n <= 24; n += 8) {
32530       for (size_t k = 1; k <= 20; k += 5) {
32531         GemmMicrokernelTester()
32532           .mr(5)
32533           .nr(8)
32534           .kr(1)
32535           .sr(4)
32536           .m(5)
32537           .n(n)
32538           .k(k)
32539           .a_stride(23)
32540           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32541       }
32542     }
32543   }
32544 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,n_div_8_subtile)32545   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, n_div_8_subtile) {
32546     for (uint32_t n = 16; n <= 24; n += 8) {
32547       for (size_t k = 1; k <= 20; k += 5) {
32548         for (uint32_t m = 1; m <= 5; m++) {
32549           GemmMicrokernelTester()
32550             .mr(5)
32551             .nr(8)
32552             .kr(1)
32553             .sr(4)
32554             .m(m)
32555             .n(n)
32556             .k(k)
32557             .iterations(1)
32558             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32559         }
32560       }
32561     }
32562   }
32563 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,strided_cm_subtile)32564   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, strided_cm_subtile) {
32565     for (size_t k = 1; k <= 20; k += 5) {
32566       for (uint32_t n = 1; n <= 8; n++) {
32567         for (uint32_t m = 1; m <= 5; m++) {
32568           GemmMicrokernelTester()
32569             .mr(5)
32570             .nr(8)
32571             .kr(1)
32572             .sr(4)
32573             .m(m)
32574             .n(n)
32575             .k(k)
32576             .cm_stride(11)
32577             .iterations(1)
32578             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32579         }
32580       }
32581     }
32582   }
32583 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,qmin)32584   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, qmin) {
32585     GemmMicrokernelTester()
32586       .mr(5)
32587       .nr(8)
32588       .kr(1)
32589       .sr(4)
32590       .m(5)
32591       .n(8)
32592       .k(4)
32593       .qmin(128)
32594       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32595   }
32596 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,qmax)32597   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, qmax) {
32598     GemmMicrokernelTester()
32599       .mr(5)
32600       .nr(8)
32601       .kr(1)
32602       .sr(4)
32603       .m(5)
32604       .n(8)
32605       .k(4)
32606       .qmax(128)
32607       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32608   }
32609 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM,strided_cm)32610   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_ARM, strided_cm) {
32611     GemmMicrokernelTester()
32612       .mr(5)
32613       .nr(8)
32614       .kr(1)
32615       .sr(4)
32616       .m(5)
32617       .n(8)
32618       .k(4)
32619       .cm_stride(11)
32620       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_arm, xnn_init_f32_minmax_wasmsimd_params);
32621   }
32622 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
32623 
32624 
32625 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_eq_4)32626   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_eq_4) {
32627     GemmMicrokernelTester()
32628       .mr(5)
32629       .nr(8)
32630       .kr(1)
32631       .sr(4)
32632       .m(5)
32633       .n(8)
32634       .k(4)
32635       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32636   }
32637 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,strided_cn)32638   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, strided_cn) {
32639     GemmMicrokernelTester()
32640       .mr(5)
32641       .nr(8)
32642       .kr(1)
32643       .sr(4)
32644       .m(5)
32645       .n(8)
32646       .k(4)
32647       .cn_stride(11)
32648       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32649   }
32650 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_eq_4_strided_a)32651   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_eq_4_strided_a) {
32652     GemmMicrokernelTester()
32653       .mr(5)
32654       .nr(8)
32655       .kr(1)
32656       .sr(4)
32657       .m(5)
32658       .n(8)
32659       .k(4)
32660       .a_stride(7)
32661       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32662   }
32663 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_eq_4_subtile)32664   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_eq_4_subtile) {
32665     for (uint32_t n = 1; n <= 8; n++) {
32666       for (uint32_t m = 1; m <= 5; m++) {
32667         GemmMicrokernelTester()
32668           .mr(5)
32669           .nr(8)
32670           .kr(1)
32671           .sr(4)
32672           .m(m)
32673           .n(n)
32674           .k(4)
32675           .iterations(1)
32676           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32677       }
32678     }
32679   }
32680 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_eq_4_subtile_m)32681   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_eq_4_subtile_m) {
32682     for (uint32_t m = 1; m <= 5; m++) {
32683       GemmMicrokernelTester()
32684         .mr(5)
32685         .nr(8)
32686         .kr(1)
32687         .sr(4)
32688         .m(m)
32689         .n(8)
32690         .k(4)
32691         .iterations(1)
32692         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32693     }
32694   }
32695 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_eq_4_subtile_n)32696   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_eq_4_subtile_n) {
32697     for (uint32_t n = 1; n <= 8; n++) {
32698       GemmMicrokernelTester()
32699         .mr(5)
32700         .nr(8)
32701         .kr(1)
32702         .sr(4)
32703         .m(5)
32704         .n(n)
32705         .k(4)
32706         .iterations(1)
32707         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32708     }
32709   }
32710 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_lt_4)32711   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_lt_4) {
32712     for (size_t k = 1; k < 4; k++) {
32713       GemmMicrokernelTester()
32714         .mr(5)
32715         .nr(8)
32716         .kr(1)
32717         .sr(4)
32718         .m(5)
32719         .n(8)
32720         .k(k)
32721         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32722     }
32723   }
32724 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_lt_4_strided_a)32725   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_lt_4_strided_a) {
32726     for (size_t k = 1; k < 4; k++) {
32727       GemmMicrokernelTester()
32728         .mr(5)
32729         .nr(8)
32730         .kr(1)
32731         .sr(4)
32732         .m(5)
32733         .n(8)
32734         .k(k)
32735         .a_stride(7)
32736         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32737     }
32738   }
32739 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_lt_4_subtile)32740   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_lt_4_subtile) {
32741     for (size_t k = 1; k < 4; k++) {
32742       for (uint32_t n = 1; n <= 8; n++) {
32743         for (uint32_t m = 1; m <= 5; m++) {
32744           GemmMicrokernelTester()
32745             .mr(5)
32746             .nr(8)
32747             .kr(1)
32748             .sr(4)
32749             .m(m)
32750             .n(n)
32751             .k(k)
32752             .iterations(1)
32753             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32754         }
32755       }
32756     }
32757   }
32758 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_gt_4)32759   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_gt_4) {
32760     for (size_t k = 5; k < 8; k++) {
32761       GemmMicrokernelTester()
32762         .mr(5)
32763         .nr(8)
32764         .kr(1)
32765         .sr(4)
32766         .m(5)
32767         .n(8)
32768         .k(k)
32769         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32770     }
32771   }
32772 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_gt_4_strided_a)32773   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_gt_4_strided_a) {
32774     for (size_t k = 5; k < 8; k++) {
32775       GemmMicrokernelTester()
32776         .mr(5)
32777         .nr(8)
32778         .kr(1)
32779         .sr(4)
32780         .m(5)
32781         .n(8)
32782         .k(k)
32783         .a_stride(11)
32784         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32785     }
32786   }
32787 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_gt_4_subtile)32788   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_gt_4_subtile) {
32789     for (size_t k = 5; k < 8; k++) {
32790       for (uint32_t n = 1; n <= 8; n++) {
32791         for (uint32_t m = 1; m <= 5; m++) {
32792           GemmMicrokernelTester()
32793             .mr(5)
32794             .nr(8)
32795             .kr(1)
32796             .sr(4)
32797             .m(m)
32798             .n(n)
32799             .k(k)
32800             .iterations(1)
32801             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32802         }
32803       }
32804     }
32805   }
32806 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_div_4)32807   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_div_4) {
32808     for (size_t k = 8; k <= 40; k += 4) {
32809       GemmMicrokernelTester()
32810         .mr(5)
32811         .nr(8)
32812         .kr(1)
32813         .sr(4)
32814         .m(5)
32815         .n(8)
32816         .k(k)
32817         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32818     }
32819   }
32820 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_div_4_strided_a)32821   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_div_4_strided_a) {
32822     for (size_t k = 8; k <= 40; k += 4) {
32823       GemmMicrokernelTester()
32824         .mr(5)
32825         .nr(8)
32826         .kr(1)
32827         .sr(4)
32828         .m(5)
32829         .n(8)
32830         .k(k)
32831         .a_stride(43)
32832         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32833     }
32834   }
32835 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,k_div_4_subtile)32836   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, k_div_4_subtile) {
32837     for (size_t k = 8; k <= 40; k += 4) {
32838       for (uint32_t n = 1; n <= 8; n++) {
32839         for (uint32_t m = 1; m <= 5; m++) {
32840           GemmMicrokernelTester()
32841             .mr(5)
32842             .nr(8)
32843             .kr(1)
32844             .sr(4)
32845             .m(m)
32846             .n(n)
32847             .k(k)
32848             .iterations(1)
32849             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32850         }
32851       }
32852     }
32853   }
32854 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,n_gt_8)32855   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, n_gt_8) {
32856     for (uint32_t n = 9; n < 16; n++) {
32857       for (size_t k = 1; k <= 20; k += 5) {
32858         GemmMicrokernelTester()
32859           .mr(5)
32860           .nr(8)
32861           .kr(1)
32862           .sr(4)
32863           .m(5)
32864           .n(n)
32865           .k(k)
32866           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32867       }
32868     }
32869   }
32870 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,n_gt_8_strided_cn)32871   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, n_gt_8_strided_cn) {
32872     for (uint32_t n = 9; n < 16; n++) {
32873       for (size_t k = 1; k <= 20; k += 5) {
32874         GemmMicrokernelTester()
32875           .mr(5)
32876           .nr(8)
32877           .kr(1)
32878           .sr(4)
32879           .m(5)
32880           .n(n)
32881           .k(k)
32882           .cn_stride(11)
32883           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32884       }
32885     }
32886   }
32887 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,n_gt_8_strided_a)32888   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, n_gt_8_strided_a) {
32889     for (uint32_t n = 9; n < 16; n++) {
32890       for (size_t k = 1; k <= 20; k += 5) {
32891         GemmMicrokernelTester()
32892           .mr(5)
32893           .nr(8)
32894           .kr(1)
32895           .sr(4)
32896           .m(5)
32897           .n(n)
32898           .k(k)
32899           .a_stride(23)
32900           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32901       }
32902     }
32903   }
32904 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,n_gt_8_subtile)32905   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, n_gt_8_subtile) {
32906     for (uint32_t n = 9; n < 16; n++) {
32907       for (size_t k = 1; k <= 20; k += 5) {
32908         for (uint32_t m = 1; m <= 5; m++) {
32909           GemmMicrokernelTester()
32910             .mr(5)
32911             .nr(8)
32912             .kr(1)
32913             .sr(4)
32914             .m(m)
32915             .n(n)
32916             .k(k)
32917             .iterations(1)
32918             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32919         }
32920       }
32921     }
32922   }
32923 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,n_div_8)32924   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, n_div_8) {
32925     for (uint32_t n = 16; n <= 24; n += 8) {
32926       for (size_t k = 1; k <= 20; k += 5) {
32927         GemmMicrokernelTester()
32928           .mr(5)
32929           .nr(8)
32930           .kr(1)
32931           .sr(4)
32932           .m(5)
32933           .n(n)
32934           .k(k)
32935           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32936       }
32937     }
32938   }
32939 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,n_div_8_strided_cn)32940   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, n_div_8_strided_cn) {
32941     for (uint32_t n = 16; n <= 24; n += 8) {
32942       for (size_t k = 1; k <= 20; k += 5) {
32943         GemmMicrokernelTester()
32944           .mr(5)
32945           .nr(8)
32946           .kr(1)
32947           .sr(4)
32948           .m(5)
32949           .n(n)
32950           .k(k)
32951           .cn_stride(11)
32952           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32953       }
32954     }
32955   }
32956 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,n_div_8_strided_a)32957   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, n_div_8_strided_a) {
32958     for (uint32_t n = 16; n <= 24; n += 8) {
32959       for (size_t k = 1; k <= 20; k += 5) {
32960         GemmMicrokernelTester()
32961           .mr(5)
32962           .nr(8)
32963           .kr(1)
32964           .sr(4)
32965           .m(5)
32966           .n(n)
32967           .k(k)
32968           .a_stride(23)
32969           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32970       }
32971     }
32972   }
32973 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,n_div_8_subtile)32974   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, n_div_8_subtile) {
32975     for (uint32_t n = 16; n <= 24; n += 8) {
32976       for (size_t k = 1; k <= 20; k += 5) {
32977         for (uint32_t m = 1; m <= 5; m++) {
32978           GemmMicrokernelTester()
32979             .mr(5)
32980             .nr(8)
32981             .kr(1)
32982             .sr(4)
32983             .m(m)
32984             .n(n)
32985             .k(k)
32986             .iterations(1)
32987             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
32988         }
32989       }
32990     }
32991   }
32992 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,strided_cm_subtile)32993   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, strided_cm_subtile) {
32994     for (size_t k = 1; k <= 20; k += 5) {
32995       for (uint32_t n = 1; n <= 8; n++) {
32996         for (uint32_t m = 1; m <= 5; m++) {
32997           GemmMicrokernelTester()
32998             .mr(5)
32999             .nr(8)
33000             .kr(1)
33001             .sr(4)
33002             .m(m)
33003             .n(n)
33004             .k(k)
33005             .cm_stride(11)
33006             .iterations(1)
33007             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
33008         }
33009       }
33010     }
33011   }
33012 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,qmin)33013   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, qmin) {
33014     GemmMicrokernelTester()
33015       .mr(5)
33016       .nr(8)
33017       .kr(1)
33018       .sr(4)
33019       .m(5)
33020       .n(8)
33021       .k(4)
33022       .qmin(128)
33023       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
33024   }
33025 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,qmax)33026   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, qmax) {
33027     GemmMicrokernelTester()
33028       .mr(5)
33029       .nr(8)
33030       .kr(1)
33031       .sr(4)
33032       .m(5)
33033       .n(8)
33034       .k(4)
33035       .qmax(128)
33036       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
33037   }
33038 
TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86,strided_cm)33039   TEST(F32_GEMM_MINMAX_5X8S4__WASMSIMD_X86, strided_cm) {
33040     GemmMicrokernelTester()
33041       .mr(5)
33042       .nr(8)
33043       .kr(1)
33044       .sr(4)
33045       .m(5)
33046       .n(8)
33047       .k(4)
33048       .cm_stride(11)
33049       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmsimd_x86, xnn_init_f32_minmax_wasmsimd_params);
33050   }
33051 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
33052 
33053 
33054 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1)33055   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1) {
33056     GemmMicrokernelTester()
33057       .mr(6)
33058       .nr(8)
33059       .kr(1)
33060       .sr(1)
33061       .m(6)
33062       .n(8)
33063       .k(1)
33064       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33065   }
33066 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,strided_cn)33067   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, strided_cn) {
33068     GemmMicrokernelTester()
33069       .mr(6)
33070       .nr(8)
33071       .kr(1)
33072       .sr(1)
33073       .m(6)
33074       .n(8)
33075       .k(1)
33076       .cn_stride(11)
33077       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33078   }
33079 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_strided_a)33080   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_strided_a) {
33081     GemmMicrokernelTester()
33082       .mr(6)
33083       .nr(8)
33084       .kr(1)
33085       .sr(1)
33086       .m(6)
33087       .n(8)
33088       .k(1)
33089       .a_stride(3)
33090       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33091   }
33092 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile)33093   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile) {
33094     for (uint32_t n = 1; n <= 8; n++) {
33095       for (uint32_t m = 1; m <= 6; m++) {
33096         GemmMicrokernelTester()
33097           .mr(6)
33098           .nr(8)
33099           .kr(1)
33100           .sr(1)
33101           .m(m)
33102           .n(n)
33103           .k(1)
33104           .iterations(1)
33105           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33106       }
33107     }
33108   }
33109 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile_m)33110   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile_m) {
33111     for (uint32_t m = 1; m <= 6; m++) {
33112       GemmMicrokernelTester()
33113         .mr(6)
33114         .nr(8)
33115         .kr(1)
33116         .sr(1)
33117         .m(m)
33118         .n(8)
33119         .k(1)
33120         .iterations(1)
33121         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33122     }
33123   }
33124 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,k_eq_1_subtile_n)33125   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, k_eq_1_subtile_n) {
33126     for (uint32_t n = 1; n <= 8; n++) {
33127       GemmMicrokernelTester()
33128         .mr(6)
33129         .nr(8)
33130         .kr(1)
33131         .sr(1)
33132         .m(6)
33133         .n(n)
33134         .k(1)
33135         .iterations(1)
33136         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33137     }
33138   }
33139 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1)33140   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1) {
33141     for (size_t k = 2; k < 10; k++) {
33142       GemmMicrokernelTester()
33143         .mr(6)
33144         .nr(8)
33145         .kr(1)
33146         .sr(1)
33147         .m(6)
33148         .n(8)
33149         .k(k)
33150         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33151     }
33152   }
33153 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1_strided_a)33154   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1_strided_a) {
33155     for (size_t k = 2; k < 10; k++) {
33156       GemmMicrokernelTester()
33157         .mr(6)
33158         .nr(8)
33159         .kr(1)
33160         .sr(1)
33161         .m(6)
33162         .n(8)
33163         .k(k)
33164         .a_stride(11)
33165         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33166     }
33167   }
33168 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,k_gt_1_subtile)33169   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, k_gt_1_subtile) {
33170     for (size_t k = 2; k < 10; k++) {
33171       for (uint32_t n = 1; n <= 8; n++) {
33172         for (uint32_t m = 1; m <= 6; m++) {
33173           GemmMicrokernelTester()
33174             .mr(6)
33175             .nr(8)
33176             .kr(1)
33177             .sr(1)
33178             .m(m)
33179             .n(n)
33180             .k(k)
33181             .iterations(1)
33182             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33183         }
33184       }
33185     }
33186   }
33187 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8)33188   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8) {
33189     for (uint32_t n = 9; n < 16; n++) {
33190       for (size_t k = 1; k <= 5; k += 2) {
33191         GemmMicrokernelTester()
33192           .mr(6)
33193           .nr(8)
33194           .kr(1)
33195           .sr(1)
33196           .m(6)
33197           .n(n)
33198           .k(k)
33199           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33200       }
33201     }
33202   }
33203 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_strided_cn)33204   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_strided_cn) {
33205     for (uint32_t n = 9; n < 16; n++) {
33206       for (size_t k = 1; k <= 5; k += 2) {
33207         GemmMicrokernelTester()
33208           .mr(6)
33209           .nr(8)
33210           .kr(1)
33211           .sr(1)
33212           .m(6)
33213           .n(n)
33214           .k(k)
33215           .cn_stride(11)
33216           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33217       }
33218     }
33219   }
33220 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_strided_a)33221   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_strided_a) {
33222     for (uint32_t n = 9; n < 16; n++) {
33223       for (size_t k = 1; k <= 5; k += 2) {
33224         GemmMicrokernelTester()
33225           .mr(6)
33226           .nr(8)
33227           .kr(1)
33228           .sr(1)
33229           .m(6)
33230           .n(n)
33231           .k(k)
33232           .a_stride(7)
33233           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33234       }
33235     }
33236   }
33237 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,n_gt_8_subtile)33238   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, n_gt_8_subtile) {
33239     for (uint32_t n = 9; n < 16; n++) {
33240       for (size_t k = 1; k <= 5; k += 2) {
33241         for (uint32_t m = 1; m <= 6; m++) {
33242           GemmMicrokernelTester()
33243             .mr(6)
33244             .nr(8)
33245             .kr(1)
33246             .sr(1)
33247             .m(m)
33248             .n(n)
33249             .k(k)
33250             .iterations(1)
33251             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33252         }
33253       }
33254     }
33255   }
33256 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,n_div_8)33257   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, n_div_8) {
33258     for (uint32_t n = 16; n <= 24; n += 8) {
33259       for (size_t k = 1; k <= 5; k += 2) {
33260         GemmMicrokernelTester()
33261           .mr(6)
33262           .nr(8)
33263           .kr(1)
33264           .sr(1)
33265           .m(6)
33266           .n(n)
33267           .k(k)
33268           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33269       }
33270     }
33271   }
33272 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_strided_cn)33273   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_strided_cn) {
33274     for (uint32_t n = 16; n <= 24; n += 8) {
33275       for (size_t k = 1; k <= 5; k += 2) {
33276         GemmMicrokernelTester()
33277           .mr(6)
33278           .nr(8)
33279           .kr(1)
33280           .sr(1)
33281           .m(6)
33282           .n(n)
33283           .k(k)
33284           .cn_stride(11)
33285           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33286       }
33287     }
33288   }
33289 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_strided_a)33290   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_strided_a) {
33291     for (uint32_t n = 16; n <= 24; n += 8) {
33292       for (size_t k = 1; k <= 5; k += 2) {
33293         GemmMicrokernelTester()
33294           .mr(6)
33295           .nr(8)
33296           .kr(1)
33297           .sr(1)
33298           .m(6)
33299           .n(n)
33300           .k(k)
33301           .a_stride(7)
33302           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33303       }
33304     }
33305   }
33306 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,n_div_8_subtile)33307   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, n_div_8_subtile) {
33308     for (uint32_t n = 16; n <= 24; n += 8) {
33309       for (size_t k = 1; k <= 5; k += 2) {
33310         for (uint32_t m = 1; m <= 6; m++) {
33311           GemmMicrokernelTester()
33312             .mr(6)
33313             .nr(8)
33314             .kr(1)
33315             .sr(1)
33316             .m(m)
33317             .n(n)
33318             .k(k)
33319             .iterations(1)
33320             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33321         }
33322       }
33323     }
33324   }
33325 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,strided_cm_subtile)33326   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, strided_cm_subtile) {
33327     for (size_t k = 1; k <= 5; k += 2) {
33328       for (uint32_t n = 1; n <= 8; n++) {
33329         for (uint32_t m = 1; m <= 6; m++) {
33330           GemmMicrokernelTester()
33331             .mr(6)
33332             .nr(8)
33333             .kr(1)
33334             .sr(1)
33335             .m(m)
33336             .n(n)
33337             .k(k)
33338             .cm_stride(11)
33339             .iterations(1)
33340             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33341         }
33342       }
33343     }
33344   }
33345 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,qmin)33346   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, qmin) {
33347     GemmMicrokernelTester()
33348       .mr(6)
33349       .nr(8)
33350       .kr(1)
33351       .sr(1)
33352       .m(6)
33353       .n(8)
33354       .k(1)
33355       .qmin(128)
33356       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33357   }
33358 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,qmax)33359   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, qmax) {
33360     GemmMicrokernelTester()
33361       .mr(6)
33362       .nr(8)
33363       .kr(1)
33364       .sr(1)
33365       .m(6)
33366       .n(8)
33367       .k(1)
33368       .qmax(128)
33369       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33370   }
33371 
TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT,strided_cm)33372   TEST(F32_GEMM_MINMAX_6X8__WASMSIMD_ARM_LOADSPLAT, strided_cm) {
33373     GemmMicrokernelTester()
33374       .mr(6)
33375       .nr(8)
33376       .kr(1)
33377       .sr(1)
33378       .m(6)
33379       .n(8)
33380       .k(1)
33381       .cm_stride(11)
33382       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmsimd_arm_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33383   }
33384 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
33385 
33386 
33387 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1)33388   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1) {
33389     GemmMicrokernelTester()
33390       .mr(1)
33391       .nr(8)
33392       .kr(1)
33393       .sr(1)
33394       .m(1)
33395       .n(8)
33396       .k(1)
33397       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33398   }
33399 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cn)33400   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cn) {
33401     GemmMicrokernelTester()
33402       .mr(1)
33403       .nr(8)
33404       .kr(1)
33405       .sr(1)
33406       .m(1)
33407       .n(8)
33408       .k(1)
33409       .cn_stride(11)
33410       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33411   }
33412 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_strided_a)33413   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_strided_a) {
33414     GemmMicrokernelTester()
33415       .mr(1)
33416       .nr(8)
33417       .kr(1)
33418       .sr(1)
33419       .m(1)
33420       .n(8)
33421       .k(1)
33422       .a_stride(3)
33423       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33424   }
33425 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile)33426   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile) {
33427     for (uint32_t n = 1; n <= 8; n++) {
33428       for (uint32_t m = 1; m <= 1; m++) {
33429         GemmMicrokernelTester()
33430           .mr(1)
33431           .nr(8)
33432           .kr(1)
33433           .sr(1)
33434           .m(m)
33435           .n(n)
33436           .k(1)
33437           .iterations(1)
33438           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33439       }
33440     }
33441   }
33442 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile_m)33443   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile_m) {
33444     for (uint32_t m = 1; m <= 1; m++) {
33445       GemmMicrokernelTester()
33446         .mr(1)
33447         .nr(8)
33448         .kr(1)
33449         .sr(1)
33450         .m(m)
33451         .n(8)
33452         .k(1)
33453         .iterations(1)
33454         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33455     }
33456   }
33457 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile_n)33458   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile_n) {
33459     for (uint32_t n = 1; n <= 8; n++) {
33460       GemmMicrokernelTester()
33461         .mr(1)
33462         .nr(8)
33463         .kr(1)
33464         .sr(1)
33465         .m(1)
33466         .n(n)
33467         .k(1)
33468         .iterations(1)
33469         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33470     }
33471   }
33472 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1)33473   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1) {
33474     for (size_t k = 2; k < 10; k++) {
33475       GemmMicrokernelTester()
33476         .mr(1)
33477         .nr(8)
33478         .kr(1)
33479         .sr(1)
33480         .m(1)
33481         .n(8)
33482         .k(k)
33483         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33484     }
33485   }
33486 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1_strided_a)33487   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1_strided_a) {
33488     for (size_t k = 2; k < 10; k++) {
33489       GemmMicrokernelTester()
33490         .mr(1)
33491         .nr(8)
33492         .kr(1)
33493         .sr(1)
33494         .m(1)
33495         .n(8)
33496         .k(k)
33497         .a_stride(11)
33498         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33499     }
33500   }
33501 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1_subtile)33502   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1_subtile) {
33503     for (size_t k = 2; k < 10; k++) {
33504       for (uint32_t n = 1; n <= 8; n++) {
33505         for (uint32_t m = 1; m <= 1; m++) {
33506           GemmMicrokernelTester()
33507             .mr(1)
33508             .nr(8)
33509             .kr(1)
33510             .sr(1)
33511             .m(m)
33512             .n(n)
33513             .k(k)
33514             .iterations(1)
33515             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33516         }
33517       }
33518     }
33519   }
33520 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8)33521   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8) {
33522     for (uint32_t n = 9; n < 16; n++) {
33523       for (size_t k = 1; k <= 5; k += 2) {
33524         GemmMicrokernelTester()
33525           .mr(1)
33526           .nr(8)
33527           .kr(1)
33528           .sr(1)
33529           .m(1)
33530           .n(n)
33531           .k(k)
33532           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33533       }
33534     }
33535   }
33536 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_strided_cn)33537   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_strided_cn) {
33538     for (uint32_t n = 9; n < 16; n++) {
33539       for (size_t k = 1; k <= 5; k += 2) {
33540         GemmMicrokernelTester()
33541           .mr(1)
33542           .nr(8)
33543           .kr(1)
33544           .sr(1)
33545           .m(1)
33546           .n(n)
33547           .k(k)
33548           .cn_stride(11)
33549           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33550       }
33551     }
33552   }
33553 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_strided_a)33554   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_strided_a) {
33555     for (uint32_t n = 9; n < 16; n++) {
33556       for (size_t k = 1; k <= 5; k += 2) {
33557         GemmMicrokernelTester()
33558           .mr(1)
33559           .nr(8)
33560           .kr(1)
33561           .sr(1)
33562           .m(1)
33563           .n(n)
33564           .k(k)
33565           .a_stride(7)
33566           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33567       }
33568     }
33569   }
33570 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_subtile)33571   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_subtile) {
33572     for (uint32_t n = 9; n < 16; n++) {
33573       for (size_t k = 1; k <= 5; k += 2) {
33574         for (uint32_t m = 1; m <= 1; m++) {
33575           GemmMicrokernelTester()
33576             .mr(1)
33577             .nr(8)
33578             .kr(1)
33579             .sr(1)
33580             .m(m)
33581             .n(n)
33582             .k(k)
33583             .iterations(1)
33584             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33585         }
33586       }
33587     }
33588   }
33589 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8)33590   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8) {
33591     for (uint32_t n = 16; n <= 24; n += 8) {
33592       for (size_t k = 1; k <= 5; k += 2) {
33593         GemmMicrokernelTester()
33594           .mr(1)
33595           .nr(8)
33596           .kr(1)
33597           .sr(1)
33598           .m(1)
33599           .n(n)
33600           .k(k)
33601           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33602       }
33603     }
33604   }
33605 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_strided_cn)33606   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_strided_cn) {
33607     for (uint32_t n = 16; n <= 24; n += 8) {
33608       for (size_t k = 1; k <= 5; k += 2) {
33609         GemmMicrokernelTester()
33610           .mr(1)
33611           .nr(8)
33612           .kr(1)
33613           .sr(1)
33614           .m(1)
33615           .n(n)
33616           .k(k)
33617           .cn_stride(11)
33618           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33619       }
33620     }
33621   }
33622 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_strided_a)33623   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_strided_a) {
33624     for (uint32_t n = 16; n <= 24; n += 8) {
33625       for (size_t k = 1; k <= 5; k += 2) {
33626         GemmMicrokernelTester()
33627           .mr(1)
33628           .nr(8)
33629           .kr(1)
33630           .sr(1)
33631           .m(1)
33632           .n(n)
33633           .k(k)
33634           .a_stride(7)
33635           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33636       }
33637     }
33638   }
33639 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_subtile)33640   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_subtile) {
33641     for (uint32_t n = 16; n <= 24; n += 8) {
33642       for (size_t k = 1; k <= 5; k += 2) {
33643         for (uint32_t m = 1; m <= 1; m++) {
33644           GemmMicrokernelTester()
33645             .mr(1)
33646             .nr(8)
33647             .kr(1)
33648             .sr(1)
33649             .m(m)
33650             .n(n)
33651             .k(k)
33652             .iterations(1)
33653             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33654         }
33655       }
33656     }
33657   }
33658 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cm_subtile)33659   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cm_subtile) {
33660     for (size_t k = 1; k <= 5; k += 2) {
33661       for (uint32_t n = 1; n <= 8; n++) {
33662         for (uint32_t m = 1; m <= 1; m++) {
33663           GemmMicrokernelTester()
33664             .mr(1)
33665             .nr(8)
33666             .kr(1)
33667             .sr(1)
33668             .m(m)
33669             .n(n)
33670             .k(k)
33671             .cm_stride(11)
33672             .iterations(1)
33673             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33674         }
33675       }
33676     }
33677   }
33678 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,qmin)33679   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, qmin) {
33680     GemmMicrokernelTester()
33681       .mr(1)
33682       .nr(8)
33683       .kr(1)
33684       .sr(1)
33685       .m(1)
33686       .n(8)
33687       .k(1)
33688       .qmin(128)
33689       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33690   }
33691 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,qmax)33692   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, qmax) {
33693     GemmMicrokernelTester()
33694       .mr(1)
33695       .nr(8)
33696       .kr(1)
33697       .sr(1)
33698       .m(1)
33699       .n(8)
33700       .k(1)
33701       .qmax(128)
33702       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33703   }
33704 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cm)33705   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cm) {
33706     GemmMicrokernelTester()
33707       .mr(1)
33708       .nr(8)
33709       .kr(1)
33710       .sr(1)
33711       .m(1)
33712       .n(8)
33713       .k(1)
33714       .cm_stride(11)
33715       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
33716   }
33717 #endif  // XNN_ARCH_WASMRELAXEDSIMD
33718 
33719 
33720 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4)33721   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4) {
33722     GemmMicrokernelTester()
33723       .mr(1)
33724       .nr(8)
33725       .kr(1)
33726       .sr(1)
33727       .m(1)
33728       .n(8)
33729       .k(4)
33730       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33731   }
33732 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cn)33733   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cn) {
33734     GemmMicrokernelTester()
33735       .mr(1)
33736       .nr(8)
33737       .kr(1)
33738       .sr(1)
33739       .m(1)
33740       .n(8)
33741       .k(4)
33742       .cn_stride(11)
33743       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33744   }
33745 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_strided_a)33746   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_strided_a) {
33747     GemmMicrokernelTester()
33748       .mr(1)
33749       .nr(8)
33750       .kr(1)
33751       .sr(1)
33752       .m(1)
33753       .n(8)
33754       .k(4)
33755       .a_stride(7)
33756       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33757   }
33758 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile)33759   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile) {
33760     for (uint32_t n = 1; n <= 8; n++) {
33761       for (uint32_t m = 1; m <= 1; m++) {
33762         GemmMicrokernelTester()
33763           .mr(1)
33764           .nr(8)
33765           .kr(1)
33766           .sr(1)
33767           .m(m)
33768           .n(n)
33769           .k(4)
33770           .iterations(1)
33771           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33772       }
33773     }
33774   }
33775 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile_m)33776   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile_m) {
33777     for (uint32_t m = 1; m <= 1; m++) {
33778       GemmMicrokernelTester()
33779         .mr(1)
33780         .nr(8)
33781         .kr(1)
33782         .sr(1)
33783         .m(m)
33784         .n(8)
33785         .k(4)
33786         .iterations(1)
33787         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33788     }
33789   }
33790 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile_n)33791   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile_n) {
33792     for (uint32_t n = 1; n <= 8; n++) {
33793       GemmMicrokernelTester()
33794         .mr(1)
33795         .nr(8)
33796         .kr(1)
33797         .sr(1)
33798         .m(1)
33799         .n(n)
33800         .k(4)
33801         .iterations(1)
33802         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33803     }
33804   }
33805 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4)33806   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4) {
33807     for (size_t k = 1; k < 4; k++) {
33808       GemmMicrokernelTester()
33809         .mr(1)
33810         .nr(8)
33811         .kr(1)
33812         .sr(1)
33813         .m(1)
33814         .n(8)
33815         .k(k)
33816         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33817     }
33818   }
33819 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4_strided_a)33820   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4_strided_a) {
33821     for (size_t k = 1; k < 4; k++) {
33822       GemmMicrokernelTester()
33823         .mr(1)
33824         .nr(8)
33825         .kr(1)
33826         .sr(1)
33827         .m(1)
33828         .n(8)
33829         .k(k)
33830         .a_stride(7)
33831         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33832     }
33833   }
33834 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4_subtile)33835   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4_subtile) {
33836     for (size_t k = 1; k < 4; k++) {
33837       for (uint32_t n = 1; n <= 8; n++) {
33838         for (uint32_t m = 1; m <= 1; m++) {
33839           GemmMicrokernelTester()
33840             .mr(1)
33841             .nr(8)
33842             .kr(1)
33843             .sr(1)
33844             .m(m)
33845             .n(n)
33846             .k(k)
33847             .iterations(1)
33848             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33849         }
33850       }
33851     }
33852   }
33853 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4)33854   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4) {
33855     for (size_t k = 5; k < 8; k++) {
33856       GemmMicrokernelTester()
33857         .mr(1)
33858         .nr(8)
33859         .kr(1)
33860         .sr(1)
33861         .m(1)
33862         .n(8)
33863         .k(k)
33864         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33865     }
33866   }
33867 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4_strided_a)33868   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4_strided_a) {
33869     for (size_t k = 5; k < 8; k++) {
33870       GemmMicrokernelTester()
33871         .mr(1)
33872         .nr(8)
33873         .kr(1)
33874         .sr(1)
33875         .m(1)
33876         .n(8)
33877         .k(k)
33878         .a_stride(11)
33879         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33880     }
33881   }
33882 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4_subtile)33883   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4_subtile) {
33884     for (size_t k = 5; k < 8; k++) {
33885       for (uint32_t n = 1; n <= 8; n++) {
33886         for (uint32_t m = 1; m <= 1; m++) {
33887           GemmMicrokernelTester()
33888             .mr(1)
33889             .nr(8)
33890             .kr(1)
33891             .sr(1)
33892             .m(m)
33893             .n(n)
33894             .k(k)
33895             .iterations(1)
33896             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33897         }
33898       }
33899     }
33900   }
33901 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4)33902   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4) {
33903     for (size_t k = 8; k <= 40; k += 4) {
33904       GemmMicrokernelTester()
33905         .mr(1)
33906         .nr(8)
33907         .kr(1)
33908         .sr(1)
33909         .m(1)
33910         .n(8)
33911         .k(k)
33912         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33913     }
33914   }
33915 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4_strided_a)33916   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4_strided_a) {
33917     for (size_t k = 8; k <= 40; k += 4) {
33918       GemmMicrokernelTester()
33919         .mr(1)
33920         .nr(8)
33921         .kr(1)
33922         .sr(1)
33923         .m(1)
33924         .n(8)
33925         .k(k)
33926         .a_stride(43)
33927         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33928     }
33929   }
33930 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4_subtile)33931   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4_subtile) {
33932     for (size_t k = 8; k <= 40; k += 4) {
33933       for (uint32_t n = 1; n <= 8; n++) {
33934         for (uint32_t m = 1; m <= 1; m++) {
33935           GemmMicrokernelTester()
33936             .mr(1)
33937             .nr(8)
33938             .kr(1)
33939             .sr(1)
33940             .m(m)
33941             .n(n)
33942             .k(k)
33943             .iterations(1)
33944             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33945         }
33946       }
33947     }
33948   }
33949 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8)33950   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8) {
33951     for (uint32_t n = 9; n < 16; n++) {
33952       for (size_t k = 1; k <= 20; k += 5) {
33953         GemmMicrokernelTester()
33954           .mr(1)
33955           .nr(8)
33956           .kr(1)
33957           .sr(1)
33958           .m(1)
33959           .n(n)
33960           .k(k)
33961           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33962       }
33963     }
33964   }
33965 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_strided_cn)33966   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_strided_cn) {
33967     for (uint32_t n = 9; n < 16; n++) {
33968       for (size_t k = 1; k <= 20; k += 5) {
33969         GemmMicrokernelTester()
33970           .mr(1)
33971           .nr(8)
33972           .kr(1)
33973           .sr(1)
33974           .m(1)
33975           .n(n)
33976           .k(k)
33977           .cn_stride(11)
33978           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33979       }
33980     }
33981   }
33982 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_strided_a)33983   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_strided_a) {
33984     for (uint32_t n = 9; n < 16; n++) {
33985       for (size_t k = 1; k <= 20; k += 5) {
33986         GemmMicrokernelTester()
33987           .mr(1)
33988           .nr(8)
33989           .kr(1)
33990           .sr(1)
33991           .m(1)
33992           .n(n)
33993           .k(k)
33994           .a_stride(23)
33995           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
33996       }
33997     }
33998   }
33999 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_subtile)34000   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_subtile) {
34001     for (uint32_t n = 9; n < 16; n++) {
34002       for (size_t k = 1; k <= 20; k += 5) {
34003         for (uint32_t m = 1; m <= 1; m++) {
34004           GemmMicrokernelTester()
34005             .mr(1)
34006             .nr(8)
34007             .kr(1)
34008             .sr(1)
34009             .m(m)
34010             .n(n)
34011             .k(k)
34012             .iterations(1)
34013             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
34014         }
34015       }
34016     }
34017   }
34018 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8)34019   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8) {
34020     for (uint32_t n = 16; n <= 24; n += 8) {
34021       for (size_t k = 1; k <= 20; k += 5) {
34022         GemmMicrokernelTester()
34023           .mr(1)
34024           .nr(8)
34025           .kr(1)
34026           .sr(1)
34027           .m(1)
34028           .n(n)
34029           .k(k)
34030           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
34031       }
34032     }
34033   }
34034 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_strided_cn)34035   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_strided_cn) {
34036     for (uint32_t n = 16; n <= 24; n += 8) {
34037       for (size_t k = 1; k <= 20; k += 5) {
34038         GemmMicrokernelTester()
34039           .mr(1)
34040           .nr(8)
34041           .kr(1)
34042           .sr(1)
34043           .m(1)
34044           .n(n)
34045           .k(k)
34046           .cn_stride(11)
34047           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
34048       }
34049     }
34050   }
34051 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_strided_a)34052   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_strided_a) {
34053     for (uint32_t n = 16; n <= 24; n += 8) {
34054       for (size_t k = 1; k <= 20; k += 5) {
34055         GemmMicrokernelTester()
34056           .mr(1)
34057           .nr(8)
34058           .kr(1)
34059           .sr(1)
34060           .m(1)
34061           .n(n)
34062           .k(k)
34063           .a_stride(23)
34064           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
34065       }
34066     }
34067   }
34068 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_subtile)34069   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_subtile) {
34070     for (uint32_t n = 16; n <= 24; n += 8) {
34071       for (size_t k = 1; k <= 20; k += 5) {
34072         for (uint32_t m = 1; m <= 1; m++) {
34073           GemmMicrokernelTester()
34074             .mr(1)
34075             .nr(8)
34076             .kr(1)
34077             .sr(1)
34078             .m(m)
34079             .n(n)
34080             .k(k)
34081             .iterations(1)
34082             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
34083         }
34084       }
34085     }
34086   }
34087 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cm_subtile)34088   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cm_subtile) {
34089     for (size_t k = 1; k <= 20; k += 5) {
34090       for (uint32_t n = 1; n <= 8; n++) {
34091         for (uint32_t m = 1; m <= 1; m++) {
34092           GemmMicrokernelTester()
34093             .mr(1)
34094             .nr(8)
34095             .kr(1)
34096             .sr(1)
34097             .m(m)
34098             .n(n)
34099             .k(k)
34100             .cm_stride(11)
34101             .iterations(1)
34102             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
34103         }
34104       }
34105     }
34106   }
34107 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,qmin)34108   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, qmin) {
34109     GemmMicrokernelTester()
34110       .mr(1)
34111       .nr(8)
34112       .kr(1)
34113       .sr(1)
34114       .m(1)
34115       .n(8)
34116       .k(4)
34117       .qmin(128)
34118       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
34119   }
34120 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,qmax)34121   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, qmax) {
34122     GemmMicrokernelTester()
34123       .mr(1)
34124       .nr(8)
34125       .kr(1)
34126       .sr(1)
34127       .m(1)
34128       .n(8)
34129       .k(4)
34130       .qmax(128)
34131       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
34132   }
34133 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cm)34134   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cm) {
34135     GemmMicrokernelTester()
34136       .mr(1)
34137       .nr(8)
34138       .kr(1)
34139       .sr(1)
34140       .m(1)
34141       .n(8)
34142       .k(4)
34143       .cm_stride(11)
34144       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
34145   }
34146 #endif  // XNN_ARCH_WASMRELAXEDSIMD
34147 
34148 
34149 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_eq_4)34150   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_eq_4) {
34151     GemmMicrokernelTester()
34152       .mr(1)
34153       .nr(8)
34154       .kr(1)
34155       .sr(1)
34156       .m(1)
34157       .n(8)
34158       .k(4)
34159       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34160   }
34161 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,strided_cn)34162   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, strided_cn) {
34163     GemmMicrokernelTester()
34164       .mr(1)
34165       .nr(8)
34166       .kr(1)
34167       .sr(1)
34168       .m(1)
34169       .n(8)
34170       .k(4)
34171       .cn_stride(11)
34172       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34173   }
34174 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_strided_a)34175   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_strided_a) {
34176     GemmMicrokernelTester()
34177       .mr(1)
34178       .nr(8)
34179       .kr(1)
34180       .sr(1)
34181       .m(1)
34182       .n(8)
34183       .k(4)
34184       .a_stride(7)
34185       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34186   }
34187 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_subtile)34188   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_subtile) {
34189     for (uint32_t n = 1; n <= 8; n++) {
34190       for (uint32_t m = 1; m <= 1; m++) {
34191         GemmMicrokernelTester()
34192           .mr(1)
34193           .nr(8)
34194           .kr(1)
34195           .sr(1)
34196           .m(m)
34197           .n(n)
34198           .k(4)
34199           .iterations(1)
34200           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34201       }
34202     }
34203   }
34204 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_subtile_m)34205   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_subtile_m) {
34206     for (uint32_t m = 1; m <= 1; m++) {
34207       GemmMicrokernelTester()
34208         .mr(1)
34209         .nr(8)
34210         .kr(1)
34211         .sr(1)
34212         .m(m)
34213         .n(8)
34214         .k(4)
34215         .iterations(1)
34216         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34217     }
34218   }
34219 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_subtile_n)34220   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_subtile_n) {
34221     for (uint32_t n = 1; n <= 8; n++) {
34222       GemmMicrokernelTester()
34223         .mr(1)
34224         .nr(8)
34225         .kr(1)
34226         .sr(1)
34227         .m(1)
34228         .n(n)
34229         .k(4)
34230         .iterations(1)
34231         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34232     }
34233   }
34234 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_lt_4)34235   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_lt_4) {
34236     for (size_t k = 1; k < 4; k++) {
34237       GemmMicrokernelTester()
34238         .mr(1)
34239         .nr(8)
34240         .kr(1)
34241         .sr(1)
34242         .m(1)
34243         .n(8)
34244         .k(k)
34245         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34246     }
34247   }
34248 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_lt_4_strided_a)34249   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_lt_4_strided_a) {
34250     for (size_t k = 1; k < 4; k++) {
34251       GemmMicrokernelTester()
34252         .mr(1)
34253         .nr(8)
34254         .kr(1)
34255         .sr(1)
34256         .m(1)
34257         .n(8)
34258         .k(k)
34259         .a_stride(7)
34260         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34261     }
34262   }
34263 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_lt_4_subtile)34264   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_lt_4_subtile) {
34265     for (size_t k = 1; k < 4; k++) {
34266       for (uint32_t n = 1; n <= 8; n++) {
34267         for (uint32_t m = 1; m <= 1; m++) {
34268           GemmMicrokernelTester()
34269             .mr(1)
34270             .nr(8)
34271             .kr(1)
34272             .sr(1)
34273             .m(m)
34274             .n(n)
34275             .k(k)
34276             .iterations(1)
34277             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34278         }
34279       }
34280     }
34281   }
34282 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_gt_4)34283   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_gt_4) {
34284     for (size_t k = 5; k < 8; k++) {
34285       GemmMicrokernelTester()
34286         .mr(1)
34287         .nr(8)
34288         .kr(1)
34289         .sr(1)
34290         .m(1)
34291         .n(8)
34292         .k(k)
34293         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34294     }
34295   }
34296 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_gt_4_strided_a)34297   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_gt_4_strided_a) {
34298     for (size_t k = 5; k < 8; k++) {
34299       GemmMicrokernelTester()
34300         .mr(1)
34301         .nr(8)
34302         .kr(1)
34303         .sr(1)
34304         .m(1)
34305         .n(8)
34306         .k(k)
34307         .a_stride(11)
34308         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34309     }
34310   }
34311 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_gt_4_subtile)34312   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_gt_4_subtile) {
34313     for (size_t k = 5; k < 8; k++) {
34314       for (uint32_t n = 1; n <= 8; n++) {
34315         for (uint32_t m = 1; m <= 1; m++) {
34316           GemmMicrokernelTester()
34317             .mr(1)
34318             .nr(8)
34319             .kr(1)
34320             .sr(1)
34321             .m(m)
34322             .n(n)
34323             .k(k)
34324             .iterations(1)
34325             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34326         }
34327       }
34328     }
34329   }
34330 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_div_4)34331   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_div_4) {
34332     for (size_t k = 8; k <= 40; k += 4) {
34333       GemmMicrokernelTester()
34334         .mr(1)
34335         .nr(8)
34336         .kr(1)
34337         .sr(1)
34338         .m(1)
34339         .n(8)
34340         .k(k)
34341         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34342     }
34343   }
34344 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_div_4_strided_a)34345   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_div_4_strided_a) {
34346     for (size_t k = 8; k <= 40; k += 4) {
34347       GemmMicrokernelTester()
34348         .mr(1)
34349         .nr(8)
34350         .kr(1)
34351         .sr(1)
34352         .m(1)
34353         .n(8)
34354         .k(k)
34355         .a_stride(43)
34356         .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34357     }
34358   }
34359 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,k_div_4_subtile)34360   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, k_div_4_subtile) {
34361     for (size_t k = 8; k <= 40; k += 4) {
34362       for (uint32_t n = 1; n <= 8; n++) {
34363         for (uint32_t m = 1; m <= 1; m++) {
34364           GemmMicrokernelTester()
34365             .mr(1)
34366             .nr(8)
34367             .kr(1)
34368             .sr(1)
34369             .m(m)
34370             .n(n)
34371             .k(k)
34372             .iterations(1)
34373             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34374         }
34375       }
34376     }
34377   }
34378 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,n_gt_8)34379   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, n_gt_8) {
34380     for (uint32_t n = 9; n < 16; n++) {
34381       for (size_t k = 1; k <= 20; k += 5) {
34382         GemmMicrokernelTester()
34383           .mr(1)
34384           .nr(8)
34385           .kr(1)
34386           .sr(1)
34387           .m(1)
34388           .n(n)
34389           .k(k)
34390           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34391       }
34392     }
34393   }
34394 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,n_gt_8_strided_cn)34395   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, n_gt_8_strided_cn) {
34396     for (uint32_t n = 9; n < 16; n++) {
34397       for (size_t k = 1; k <= 20; k += 5) {
34398         GemmMicrokernelTester()
34399           .mr(1)
34400           .nr(8)
34401           .kr(1)
34402           .sr(1)
34403           .m(1)
34404           .n(n)
34405           .k(k)
34406           .cn_stride(11)
34407           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34408       }
34409     }
34410   }
34411 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,n_gt_8_strided_a)34412   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, n_gt_8_strided_a) {
34413     for (uint32_t n = 9; n < 16; n++) {
34414       for (size_t k = 1; k <= 20; k += 5) {
34415         GemmMicrokernelTester()
34416           .mr(1)
34417           .nr(8)
34418           .kr(1)
34419           .sr(1)
34420           .m(1)
34421           .n(n)
34422           .k(k)
34423           .a_stride(23)
34424           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34425       }
34426     }
34427   }
34428 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,n_gt_8_subtile)34429   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, n_gt_8_subtile) {
34430     for (uint32_t n = 9; n < 16; n++) {
34431       for (size_t k = 1; k <= 20; k += 5) {
34432         for (uint32_t m = 1; m <= 1; m++) {
34433           GemmMicrokernelTester()
34434             .mr(1)
34435             .nr(8)
34436             .kr(1)
34437             .sr(1)
34438             .m(m)
34439             .n(n)
34440             .k(k)
34441             .iterations(1)
34442             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34443         }
34444       }
34445     }
34446   }
34447 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,n_div_8)34448   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, n_div_8) {
34449     for (uint32_t n = 16; n <= 24; n += 8) {
34450       for (size_t k = 1; k <= 20; k += 5) {
34451         GemmMicrokernelTester()
34452           .mr(1)
34453           .nr(8)
34454           .kr(1)
34455           .sr(1)
34456           .m(1)
34457           .n(n)
34458           .k(k)
34459           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34460       }
34461     }
34462   }
34463 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,n_div_8_strided_cn)34464   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, n_div_8_strided_cn) {
34465     for (uint32_t n = 16; n <= 24; n += 8) {
34466       for (size_t k = 1; k <= 20; k += 5) {
34467         GemmMicrokernelTester()
34468           .mr(1)
34469           .nr(8)
34470           .kr(1)
34471           .sr(1)
34472           .m(1)
34473           .n(n)
34474           .k(k)
34475           .cn_stride(11)
34476           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34477       }
34478     }
34479   }
34480 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,n_div_8_strided_a)34481   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, n_div_8_strided_a) {
34482     for (uint32_t n = 16; n <= 24; n += 8) {
34483       for (size_t k = 1; k <= 20; k += 5) {
34484         GemmMicrokernelTester()
34485           .mr(1)
34486           .nr(8)
34487           .kr(1)
34488           .sr(1)
34489           .m(1)
34490           .n(n)
34491           .k(k)
34492           .a_stride(23)
34493           .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34494       }
34495     }
34496   }
34497 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,n_div_8_subtile)34498   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, n_div_8_subtile) {
34499     for (uint32_t n = 16; n <= 24; n += 8) {
34500       for (size_t k = 1; k <= 20; k += 5) {
34501         for (uint32_t m = 1; m <= 1; m++) {
34502           GemmMicrokernelTester()
34503             .mr(1)
34504             .nr(8)
34505             .kr(1)
34506             .sr(1)
34507             .m(m)
34508             .n(n)
34509             .k(k)
34510             .iterations(1)
34511             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34512         }
34513       }
34514     }
34515   }
34516 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,strided_cm_subtile)34517   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, strided_cm_subtile) {
34518     for (size_t k = 1; k <= 20; k += 5) {
34519       for (uint32_t n = 1; n <= 8; n++) {
34520         for (uint32_t m = 1; m <= 1; m++) {
34521           GemmMicrokernelTester()
34522             .mr(1)
34523             .nr(8)
34524             .kr(1)
34525             .sr(1)
34526             .m(m)
34527             .n(n)
34528             .k(k)
34529             .cm_stride(11)
34530             .iterations(1)
34531             .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34532         }
34533       }
34534     }
34535   }
34536 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,qmin)34537   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, qmin) {
34538     GemmMicrokernelTester()
34539       .mr(1)
34540       .nr(8)
34541       .kr(1)
34542       .sr(1)
34543       .m(1)
34544       .n(8)
34545       .k(4)
34546       .qmin(128)
34547       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34548   }
34549 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,qmax)34550   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, qmax) {
34551     GemmMicrokernelTester()
34552       .mr(1)
34553       .nr(8)
34554       .kr(1)
34555       .sr(1)
34556       .m(1)
34557       .n(8)
34558       .k(4)
34559       .qmax(128)
34560       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34561   }
34562 
TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT,strided_cm)34563   TEST(F32_GEMM_MINMAX_1X8__WASMRELAXEDSIMD_SPLAT, strided_cm) {
34564     GemmMicrokernelTester()
34565       .mr(1)
34566       .nr(8)
34567       .kr(1)
34568       .sr(1)
34569       .m(1)
34570       .n(8)
34571       .k(4)
34572       .cm_stride(11)
34573       .Test(xnn_f32_gemm_minmax_ukernel_1x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
34574   }
34575 #endif  // XNN_ARCH_WASMRELAXEDSIMD
34576 
34577 
34578 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_eq_4)34579   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_eq_4) {
34580     GemmMicrokernelTester()
34581       .mr(1)
34582       .nr(8)
34583       .kr(1)
34584       .sr(4)
34585       .m(1)
34586       .n(8)
34587       .k(4)
34588       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34589   }
34590 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,strided_cn)34591   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, strided_cn) {
34592     GemmMicrokernelTester()
34593       .mr(1)
34594       .nr(8)
34595       .kr(1)
34596       .sr(4)
34597       .m(1)
34598       .n(8)
34599       .k(4)
34600       .cn_stride(11)
34601       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34602   }
34603 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_eq_4_strided_a)34604   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_eq_4_strided_a) {
34605     GemmMicrokernelTester()
34606       .mr(1)
34607       .nr(8)
34608       .kr(1)
34609       .sr(4)
34610       .m(1)
34611       .n(8)
34612       .k(4)
34613       .a_stride(7)
34614       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34615   }
34616 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_eq_4_subtile)34617   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_eq_4_subtile) {
34618     for (uint32_t n = 1; n <= 8; n++) {
34619       for (uint32_t m = 1; m <= 1; m++) {
34620         GemmMicrokernelTester()
34621           .mr(1)
34622           .nr(8)
34623           .kr(1)
34624           .sr(4)
34625           .m(m)
34626           .n(n)
34627           .k(4)
34628           .iterations(1)
34629           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34630       }
34631     }
34632   }
34633 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_eq_4_subtile_m)34634   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_eq_4_subtile_m) {
34635     for (uint32_t m = 1; m <= 1; m++) {
34636       GemmMicrokernelTester()
34637         .mr(1)
34638         .nr(8)
34639         .kr(1)
34640         .sr(4)
34641         .m(m)
34642         .n(8)
34643         .k(4)
34644         .iterations(1)
34645         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34646     }
34647   }
34648 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_eq_4_subtile_n)34649   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_eq_4_subtile_n) {
34650     for (uint32_t n = 1; n <= 8; n++) {
34651       GemmMicrokernelTester()
34652         .mr(1)
34653         .nr(8)
34654         .kr(1)
34655         .sr(4)
34656         .m(1)
34657         .n(n)
34658         .k(4)
34659         .iterations(1)
34660         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34661     }
34662   }
34663 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_lt_4)34664   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_lt_4) {
34665     for (size_t k = 1; k < 4; k++) {
34666       GemmMicrokernelTester()
34667         .mr(1)
34668         .nr(8)
34669         .kr(1)
34670         .sr(4)
34671         .m(1)
34672         .n(8)
34673         .k(k)
34674         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34675     }
34676   }
34677 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_lt_4_strided_a)34678   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_lt_4_strided_a) {
34679     for (size_t k = 1; k < 4; k++) {
34680       GemmMicrokernelTester()
34681         .mr(1)
34682         .nr(8)
34683         .kr(1)
34684         .sr(4)
34685         .m(1)
34686         .n(8)
34687         .k(k)
34688         .a_stride(7)
34689         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34690     }
34691   }
34692 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_lt_4_subtile)34693   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_lt_4_subtile) {
34694     for (size_t k = 1; k < 4; k++) {
34695       for (uint32_t n = 1; n <= 8; n++) {
34696         for (uint32_t m = 1; m <= 1; m++) {
34697           GemmMicrokernelTester()
34698             .mr(1)
34699             .nr(8)
34700             .kr(1)
34701             .sr(4)
34702             .m(m)
34703             .n(n)
34704             .k(k)
34705             .iterations(1)
34706             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34707         }
34708       }
34709     }
34710   }
34711 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_gt_4)34712   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_gt_4) {
34713     for (size_t k = 5; k < 8; k++) {
34714       GemmMicrokernelTester()
34715         .mr(1)
34716         .nr(8)
34717         .kr(1)
34718         .sr(4)
34719         .m(1)
34720         .n(8)
34721         .k(k)
34722         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34723     }
34724   }
34725 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_gt_4_strided_a)34726   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_gt_4_strided_a) {
34727     for (size_t k = 5; k < 8; k++) {
34728       GemmMicrokernelTester()
34729         .mr(1)
34730         .nr(8)
34731         .kr(1)
34732         .sr(4)
34733         .m(1)
34734         .n(8)
34735         .k(k)
34736         .a_stride(11)
34737         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34738     }
34739   }
34740 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_gt_4_subtile)34741   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_gt_4_subtile) {
34742     for (size_t k = 5; k < 8; k++) {
34743       for (uint32_t n = 1; n <= 8; n++) {
34744         for (uint32_t m = 1; m <= 1; m++) {
34745           GemmMicrokernelTester()
34746             .mr(1)
34747             .nr(8)
34748             .kr(1)
34749             .sr(4)
34750             .m(m)
34751             .n(n)
34752             .k(k)
34753             .iterations(1)
34754             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34755         }
34756       }
34757     }
34758   }
34759 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_div_4)34760   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_div_4) {
34761     for (size_t k = 8; k <= 40; k += 4) {
34762       GemmMicrokernelTester()
34763         .mr(1)
34764         .nr(8)
34765         .kr(1)
34766         .sr(4)
34767         .m(1)
34768         .n(8)
34769         .k(k)
34770         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34771     }
34772   }
34773 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_div_4_strided_a)34774   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_div_4_strided_a) {
34775     for (size_t k = 8; k <= 40; k += 4) {
34776       GemmMicrokernelTester()
34777         .mr(1)
34778         .nr(8)
34779         .kr(1)
34780         .sr(4)
34781         .m(1)
34782         .n(8)
34783         .k(k)
34784         .a_stride(43)
34785         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34786     }
34787   }
34788 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,k_div_4_subtile)34789   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, k_div_4_subtile) {
34790     for (size_t k = 8; k <= 40; k += 4) {
34791       for (uint32_t n = 1; n <= 8; n++) {
34792         for (uint32_t m = 1; m <= 1; m++) {
34793           GemmMicrokernelTester()
34794             .mr(1)
34795             .nr(8)
34796             .kr(1)
34797             .sr(4)
34798             .m(m)
34799             .n(n)
34800             .k(k)
34801             .iterations(1)
34802             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34803         }
34804       }
34805     }
34806   }
34807 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,n_gt_8)34808   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, n_gt_8) {
34809     for (uint32_t n = 9; n < 16; n++) {
34810       for (size_t k = 1; k <= 20; k += 5) {
34811         GemmMicrokernelTester()
34812           .mr(1)
34813           .nr(8)
34814           .kr(1)
34815           .sr(4)
34816           .m(1)
34817           .n(n)
34818           .k(k)
34819           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34820       }
34821     }
34822   }
34823 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,n_gt_8_strided_cn)34824   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, n_gt_8_strided_cn) {
34825     for (uint32_t n = 9; n < 16; n++) {
34826       for (size_t k = 1; k <= 20; k += 5) {
34827         GemmMicrokernelTester()
34828           .mr(1)
34829           .nr(8)
34830           .kr(1)
34831           .sr(4)
34832           .m(1)
34833           .n(n)
34834           .k(k)
34835           .cn_stride(11)
34836           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34837       }
34838     }
34839   }
34840 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,n_gt_8_strided_a)34841   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, n_gt_8_strided_a) {
34842     for (uint32_t n = 9; n < 16; n++) {
34843       for (size_t k = 1; k <= 20; k += 5) {
34844         GemmMicrokernelTester()
34845           .mr(1)
34846           .nr(8)
34847           .kr(1)
34848           .sr(4)
34849           .m(1)
34850           .n(n)
34851           .k(k)
34852           .a_stride(23)
34853           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34854       }
34855     }
34856   }
34857 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,n_gt_8_subtile)34858   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, n_gt_8_subtile) {
34859     for (uint32_t n = 9; n < 16; n++) {
34860       for (size_t k = 1; k <= 20; k += 5) {
34861         for (uint32_t m = 1; m <= 1; m++) {
34862           GemmMicrokernelTester()
34863             .mr(1)
34864             .nr(8)
34865             .kr(1)
34866             .sr(4)
34867             .m(m)
34868             .n(n)
34869             .k(k)
34870             .iterations(1)
34871             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34872         }
34873       }
34874     }
34875   }
34876 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,n_div_8)34877   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, n_div_8) {
34878     for (uint32_t n = 16; n <= 24; n += 8) {
34879       for (size_t k = 1; k <= 20; k += 5) {
34880         GemmMicrokernelTester()
34881           .mr(1)
34882           .nr(8)
34883           .kr(1)
34884           .sr(4)
34885           .m(1)
34886           .n(n)
34887           .k(k)
34888           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34889       }
34890     }
34891   }
34892 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,n_div_8_strided_cn)34893   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, n_div_8_strided_cn) {
34894     for (uint32_t n = 16; n <= 24; n += 8) {
34895       for (size_t k = 1; k <= 20; k += 5) {
34896         GemmMicrokernelTester()
34897           .mr(1)
34898           .nr(8)
34899           .kr(1)
34900           .sr(4)
34901           .m(1)
34902           .n(n)
34903           .k(k)
34904           .cn_stride(11)
34905           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34906       }
34907     }
34908   }
34909 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,n_div_8_strided_a)34910   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, n_div_8_strided_a) {
34911     for (uint32_t n = 16; n <= 24; n += 8) {
34912       for (size_t k = 1; k <= 20; k += 5) {
34913         GemmMicrokernelTester()
34914           .mr(1)
34915           .nr(8)
34916           .kr(1)
34917           .sr(4)
34918           .m(1)
34919           .n(n)
34920           .k(k)
34921           .a_stride(23)
34922           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34923       }
34924     }
34925   }
34926 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,n_div_8_subtile)34927   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, n_div_8_subtile) {
34928     for (uint32_t n = 16; n <= 24; n += 8) {
34929       for (size_t k = 1; k <= 20; k += 5) {
34930         for (uint32_t m = 1; m <= 1; m++) {
34931           GemmMicrokernelTester()
34932             .mr(1)
34933             .nr(8)
34934             .kr(1)
34935             .sr(4)
34936             .m(m)
34937             .n(n)
34938             .k(k)
34939             .iterations(1)
34940             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34941         }
34942       }
34943     }
34944   }
34945 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,strided_cm_subtile)34946   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, strided_cm_subtile) {
34947     for (size_t k = 1; k <= 20; k += 5) {
34948       for (uint32_t n = 1; n <= 8; n++) {
34949         for (uint32_t m = 1; m <= 1; m++) {
34950           GemmMicrokernelTester()
34951             .mr(1)
34952             .nr(8)
34953             .kr(1)
34954             .sr(4)
34955             .m(m)
34956             .n(n)
34957             .k(k)
34958             .cm_stride(11)
34959             .iterations(1)
34960             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34961         }
34962       }
34963     }
34964   }
34965 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,qmin)34966   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, qmin) {
34967     GemmMicrokernelTester()
34968       .mr(1)
34969       .nr(8)
34970       .kr(1)
34971       .sr(4)
34972       .m(1)
34973       .n(8)
34974       .k(4)
34975       .qmin(128)
34976       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34977   }
34978 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,qmax)34979   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, qmax) {
34980     GemmMicrokernelTester()
34981       .mr(1)
34982       .nr(8)
34983       .kr(1)
34984       .sr(4)
34985       .m(1)
34986       .n(8)
34987       .k(4)
34988       .qmax(128)
34989       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
34990   }
34991 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD,strided_cm)34992   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD, strided_cm) {
34993     GemmMicrokernelTester()
34994       .mr(1)
34995       .nr(8)
34996       .kr(1)
34997       .sr(4)
34998       .m(1)
34999       .n(8)
35000       .k(4)
35001       .cm_stride(11)
35002       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
35003   }
35004 #endif  // XNN_ARCH_WASMRELAXEDSIMD
35005 
35006 
35007 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_eq_4)35008   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_eq_4) {
35009     GemmMicrokernelTester()
35010       .mr(1)
35011       .nr(8)
35012       .kr(1)
35013       .sr(4)
35014       .m(1)
35015       .n(8)
35016       .k(4)
35017       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35018   }
35019 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,strided_cn)35020   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, strided_cn) {
35021     GemmMicrokernelTester()
35022       .mr(1)
35023       .nr(8)
35024       .kr(1)
35025       .sr(4)
35026       .m(1)
35027       .n(8)
35028       .k(4)
35029       .cn_stride(11)
35030       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35031   }
35032 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_strided_a)35033   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_strided_a) {
35034     GemmMicrokernelTester()
35035       .mr(1)
35036       .nr(8)
35037       .kr(1)
35038       .sr(4)
35039       .m(1)
35040       .n(8)
35041       .k(4)
35042       .a_stride(7)
35043       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35044   }
35045 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile)35046   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile) {
35047     for (uint32_t n = 1; n <= 8; n++) {
35048       for (uint32_t m = 1; m <= 1; m++) {
35049         GemmMicrokernelTester()
35050           .mr(1)
35051           .nr(8)
35052           .kr(1)
35053           .sr(4)
35054           .m(m)
35055           .n(n)
35056           .k(4)
35057           .iterations(1)
35058           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35059       }
35060     }
35061   }
35062 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile_m)35063   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile_m) {
35064     for (uint32_t m = 1; m <= 1; m++) {
35065       GemmMicrokernelTester()
35066         .mr(1)
35067         .nr(8)
35068         .kr(1)
35069         .sr(4)
35070         .m(m)
35071         .n(8)
35072         .k(4)
35073         .iterations(1)
35074         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35075     }
35076   }
35077 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile_n)35078   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile_n) {
35079     for (uint32_t n = 1; n <= 8; n++) {
35080       GemmMicrokernelTester()
35081         .mr(1)
35082         .nr(8)
35083         .kr(1)
35084         .sr(4)
35085         .m(1)
35086         .n(n)
35087         .k(4)
35088         .iterations(1)
35089         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35090     }
35091   }
35092 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_lt_4)35093   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_lt_4) {
35094     for (size_t k = 1; k < 4; k++) {
35095       GemmMicrokernelTester()
35096         .mr(1)
35097         .nr(8)
35098         .kr(1)
35099         .sr(4)
35100         .m(1)
35101         .n(8)
35102         .k(k)
35103         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35104     }
35105   }
35106 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_lt_4_strided_a)35107   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_lt_4_strided_a) {
35108     for (size_t k = 1; k < 4; k++) {
35109       GemmMicrokernelTester()
35110         .mr(1)
35111         .nr(8)
35112         .kr(1)
35113         .sr(4)
35114         .m(1)
35115         .n(8)
35116         .k(k)
35117         .a_stride(7)
35118         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35119     }
35120   }
35121 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_lt_4_subtile)35122   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_lt_4_subtile) {
35123     for (size_t k = 1; k < 4; k++) {
35124       for (uint32_t n = 1; n <= 8; n++) {
35125         for (uint32_t m = 1; m <= 1; m++) {
35126           GemmMicrokernelTester()
35127             .mr(1)
35128             .nr(8)
35129             .kr(1)
35130             .sr(4)
35131             .m(m)
35132             .n(n)
35133             .k(k)
35134             .iterations(1)
35135             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35136         }
35137       }
35138     }
35139   }
35140 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_gt_4)35141   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_gt_4) {
35142     for (size_t k = 5; k < 8; k++) {
35143       GemmMicrokernelTester()
35144         .mr(1)
35145         .nr(8)
35146         .kr(1)
35147         .sr(4)
35148         .m(1)
35149         .n(8)
35150         .k(k)
35151         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35152     }
35153   }
35154 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_gt_4_strided_a)35155   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_gt_4_strided_a) {
35156     for (size_t k = 5; k < 8; k++) {
35157       GemmMicrokernelTester()
35158         .mr(1)
35159         .nr(8)
35160         .kr(1)
35161         .sr(4)
35162         .m(1)
35163         .n(8)
35164         .k(k)
35165         .a_stride(11)
35166         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35167     }
35168   }
35169 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_gt_4_subtile)35170   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_gt_4_subtile) {
35171     for (size_t k = 5; k < 8; k++) {
35172       for (uint32_t n = 1; n <= 8; n++) {
35173         for (uint32_t m = 1; m <= 1; m++) {
35174           GemmMicrokernelTester()
35175             .mr(1)
35176             .nr(8)
35177             .kr(1)
35178             .sr(4)
35179             .m(m)
35180             .n(n)
35181             .k(k)
35182             .iterations(1)
35183             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35184         }
35185       }
35186     }
35187   }
35188 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_div_4)35189   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_div_4) {
35190     for (size_t k = 8; k <= 40; k += 4) {
35191       GemmMicrokernelTester()
35192         .mr(1)
35193         .nr(8)
35194         .kr(1)
35195         .sr(4)
35196         .m(1)
35197         .n(8)
35198         .k(k)
35199         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35200     }
35201   }
35202 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_div_4_strided_a)35203   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_div_4_strided_a) {
35204     for (size_t k = 8; k <= 40; k += 4) {
35205       GemmMicrokernelTester()
35206         .mr(1)
35207         .nr(8)
35208         .kr(1)
35209         .sr(4)
35210         .m(1)
35211         .n(8)
35212         .k(k)
35213         .a_stride(43)
35214         .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35215     }
35216   }
35217 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,k_div_4_subtile)35218   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, k_div_4_subtile) {
35219     for (size_t k = 8; k <= 40; k += 4) {
35220       for (uint32_t n = 1; n <= 8; n++) {
35221         for (uint32_t m = 1; m <= 1; m++) {
35222           GemmMicrokernelTester()
35223             .mr(1)
35224             .nr(8)
35225             .kr(1)
35226             .sr(4)
35227             .m(m)
35228             .n(n)
35229             .k(k)
35230             .iterations(1)
35231             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35232         }
35233       }
35234     }
35235   }
35236 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,n_gt_8)35237   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, n_gt_8) {
35238     for (uint32_t n = 9; n < 16; n++) {
35239       for (size_t k = 1; k <= 20; k += 5) {
35240         GemmMicrokernelTester()
35241           .mr(1)
35242           .nr(8)
35243           .kr(1)
35244           .sr(4)
35245           .m(1)
35246           .n(n)
35247           .k(k)
35248           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35249       }
35250     }
35251   }
35252 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,n_gt_8_strided_cn)35253   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, n_gt_8_strided_cn) {
35254     for (uint32_t n = 9; n < 16; n++) {
35255       for (size_t k = 1; k <= 20; k += 5) {
35256         GemmMicrokernelTester()
35257           .mr(1)
35258           .nr(8)
35259           .kr(1)
35260           .sr(4)
35261           .m(1)
35262           .n(n)
35263           .k(k)
35264           .cn_stride(11)
35265           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35266       }
35267     }
35268   }
35269 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,n_gt_8_strided_a)35270   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, n_gt_8_strided_a) {
35271     for (uint32_t n = 9; n < 16; n++) {
35272       for (size_t k = 1; k <= 20; k += 5) {
35273         GemmMicrokernelTester()
35274           .mr(1)
35275           .nr(8)
35276           .kr(1)
35277           .sr(4)
35278           .m(1)
35279           .n(n)
35280           .k(k)
35281           .a_stride(23)
35282           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35283       }
35284     }
35285   }
35286 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,n_gt_8_subtile)35287   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, n_gt_8_subtile) {
35288     for (uint32_t n = 9; n < 16; n++) {
35289       for (size_t k = 1; k <= 20; k += 5) {
35290         for (uint32_t m = 1; m <= 1; m++) {
35291           GemmMicrokernelTester()
35292             .mr(1)
35293             .nr(8)
35294             .kr(1)
35295             .sr(4)
35296             .m(m)
35297             .n(n)
35298             .k(k)
35299             .iterations(1)
35300             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35301         }
35302       }
35303     }
35304   }
35305 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,n_div_8)35306   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, n_div_8) {
35307     for (uint32_t n = 16; n <= 24; n += 8) {
35308       for (size_t k = 1; k <= 20; k += 5) {
35309         GemmMicrokernelTester()
35310           .mr(1)
35311           .nr(8)
35312           .kr(1)
35313           .sr(4)
35314           .m(1)
35315           .n(n)
35316           .k(k)
35317           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35318       }
35319     }
35320   }
35321 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,n_div_8_strided_cn)35322   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, n_div_8_strided_cn) {
35323     for (uint32_t n = 16; n <= 24; n += 8) {
35324       for (size_t k = 1; k <= 20; k += 5) {
35325         GemmMicrokernelTester()
35326           .mr(1)
35327           .nr(8)
35328           .kr(1)
35329           .sr(4)
35330           .m(1)
35331           .n(n)
35332           .k(k)
35333           .cn_stride(11)
35334           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35335       }
35336     }
35337   }
35338 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,n_div_8_strided_a)35339   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, n_div_8_strided_a) {
35340     for (uint32_t n = 16; n <= 24; n += 8) {
35341       for (size_t k = 1; k <= 20; k += 5) {
35342         GemmMicrokernelTester()
35343           .mr(1)
35344           .nr(8)
35345           .kr(1)
35346           .sr(4)
35347           .m(1)
35348           .n(n)
35349           .k(k)
35350           .a_stride(23)
35351           .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35352       }
35353     }
35354   }
35355 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,n_div_8_subtile)35356   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, n_div_8_subtile) {
35357     for (uint32_t n = 16; n <= 24; n += 8) {
35358       for (size_t k = 1; k <= 20; k += 5) {
35359         for (uint32_t m = 1; m <= 1; m++) {
35360           GemmMicrokernelTester()
35361             .mr(1)
35362             .nr(8)
35363             .kr(1)
35364             .sr(4)
35365             .m(m)
35366             .n(n)
35367             .k(k)
35368             .iterations(1)
35369             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35370         }
35371       }
35372     }
35373   }
35374 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,strided_cm_subtile)35375   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, strided_cm_subtile) {
35376     for (size_t k = 1; k <= 20; k += 5) {
35377       for (uint32_t n = 1; n <= 8; n++) {
35378         for (uint32_t m = 1; m <= 1; m++) {
35379           GemmMicrokernelTester()
35380             .mr(1)
35381             .nr(8)
35382             .kr(1)
35383             .sr(4)
35384             .m(m)
35385             .n(n)
35386             .k(k)
35387             .cm_stride(11)
35388             .iterations(1)
35389             .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35390         }
35391       }
35392     }
35393   }
35394 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,qmin)35395   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, qmin) {
35396     GemmMicrokernelTester()
35397       .mr(1)
35398       .nr(8)
35399       .kr(1)
35400       .sr(4)
35401       .m(1)
35402       .n(8)
35403       .k(4)
35404       .qmin(128)
35405       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35406   }
35407 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,qmax)35408   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, qmax) {
35409     GemmMicrokernelTester()
35410       .mr(1)
35411       .nr(8)
35412       .kr(1)
35413       .sr(4)
35414       .m(1)
35415       .n(8)
35416       .k(4)
35417       .qmax(128)
35418       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35419   }
35420 
TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA,strided_cm)35421   TEST(F32_GEMM_MINMAX_1X8S4__WASMRELAXEDSIMD_FMA, strided_cm) {
35422     GemmMicrokernelTester()
35423       .mr(1)
35424       .nr(8)
35425       .kr(1)
35426       .sr(4)
35427       .m(1)
35428       .n(8)
35429       .k(4)
35430       .cm_stride(11)
35431       .Test(xnn_f32_gemm_minmax_ukernel_1x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
35432   }
35433 #endif  // XNN_ARCH_WASMRELAXEDSIMD
35434 
35435 
35436 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1)35437   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1) {
35438     GemmMicrokernelTester()
35439       .mr(3)
35440       .nr(8)
35441       .kr(1)
35442       .sr(1)
35443       .m(3)
35444       .n(8)
35445       .k(1)
35446       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35447   }
35448 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cn)35449   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cn) {
35450     GemmMicrokernelTester()
35451       .mr(3)
35452       .nr(8)
35453       .kr(1)
35454       .sr(1)
35455       .m(3)
35456       .n(8)
35457       .k(1)
35458       .cn_stride(11)
35459       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35460   }
35461 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_strided_a)35462   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_strided_a) {
35463     GemmMicrokernelTester()
35464       .mr(3)
35465       .nr(8)
35466       .kr(1)
35467       .sr(1)
35468       .m(3)
35469       .n(8)
35470       .k(1)
35471       .a_stride(3)
35472       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35473   }
35474 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile)35475   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile) {
35476     for (uint32_t n = 1; n <= 8; n++) {
35477       for (uint32_t m = 1; m <= 3; m++) {
35478         GemmMicrokernelTester()
35479           .mr(3)
35480           .nr(8)
35481           .kr(1)
35482           .sr(1)
35483           .m(m)
35484           .n(n)
35485           .k(1)
35486           .iterations(1)
35487           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35488       }
35489     }
35490   }
35491 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile_m)35492   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile_m) {
35493     for (uint32_t m = 1; m <= 3; m++) {
35494       GemmMicrokernelTester()
35495         .mr(3)
35496         .nr(8)
35497         .kr(1)
35498         .sr(1)
35499         .m(m)
35500         .n(8)
35501         .k(1)
35502         .iterations(1)
35503         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35504     }
35505   }
35506 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile_n)35507   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile_n) {
35508     for (uint32_t n = 1; n <= 8; n++) {
35509       GemmMicrokernelTester()
35510         .mr(3)
35511         .nr(8)
35512         .kr(1)
35513         .sr(1)
35514         .m(3)
35515         .n(n)
35516         .k(1)
35517         .iterations(1)
35518         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35519     }
35520   }
35521 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1)35522   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1) {
35523     for (size_t k = 2; k < 10; k++) {
35524       GemmMicrokernelTester()
35525         .mr(3)
35526         .nr(8)
35527         .kr(1)
35528         .sr(1)
35529         .m(3)
35530         .n(8)
35531         .k(k)
35532         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35533     }
35534   }
35535 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1_strided_a)35536   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1_strided_a) {
35537     for (size_t k = 2; k < 10; k++) {
35538       GemmMicrokernelTester()
35539         .mr(3)
35540         .nr(8)
35541         .kr(1)
35542         .sr(1)
35543         .m(3)
35544         .n(8)
35545         .k(k)
35546         .a_stride(11)
35547         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35548     }
35549   }
35550 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1_subtile)35551   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1_subtile) {
35552     for (size_t k = 2; k < 10; k++) {
35553       for (uint32_t n = 1; n <= 8; n++) {
35554         for (uint32_t m = 1; m <= 3; m++) {
35555           GemmMicrokernelTester()
35556             .mr(3)
35557             .nr(8)
35558             .kr(1)
35559             .sr(1)
35560             .m(m)
35561             .n(n)
35562             .k(k)
35563             .iterations(1)
35564             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35565         }
35566       }
35567     }
35568   }
35569 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8)35570   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8) {
35571     for (uint32_t n = 9; n < 16; n++) {
35572       for (size_t k = 1; k <= 5; k += 2) {
35573         GemmMicrokernelTester()
35574           .mr(3)
35575           .nr(8)
35576           .kr(1)
35577           .sr(1)
35578           .m(3)
35579           .n(n)
35580           .k(k)
35581           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35582       }
35583     }
35584   }
35585 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_strided_cn)35586   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_strided_cn) {
35587     for (uint32_t n = 9; n < 16; n++) {
35588       for (size_t k = 1; k <= 5; k += 2) {
35589         GemmMicrokernelTester()
35590           .mr(3)
35591           .nr(8)
35592           .kr(1)
35593           .sr(1)
35594           .m(3)
35595           .n(n)
35596           .k(k)
35597           .cn_stride(11)
35598           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35599       }
35600     }
35601   }
35602 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_strided_a)35603   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_strided_a) {
35604     for (uint32_t n = 9; n < 16; n++) {
35605       for (size_t k = 1; k <= 5; k += 2) {
35606         GemmMicrokernelTester()
35607           .mr(3)
35608           .nr(8)
35609           .kr(1)
35610           .sr(1)
35611           .m(3)
35612           .n(n)
35613           .k(k)
35614           .a_stride(7)
35615           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35616       }
35617     }
35618   }
35619 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_subtile)35620   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_subtile) {
35621     for (uint32_t n = 9; n < 16; n++) {
35622       for (size_t k = 1; k <= 5; k += 2) {
35623         for (uint32_t m = 1; m <= 3; m++) {
35624           GemmMicrokernelTester()
35625             .mr(3)
35626             .nr(8)
35627             .kr(1)
35628             .sr(1)
35629             .m(m)
35630             .n(n)
35631             .k(k)
35632             .iterations(1)
35633             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35634         }
35635       }
35636     }
35637   }
35638 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8)35639   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8) {
35640     for (uint32_t n = 16; n <= 24; n += 8) {
35641       for (size_t k = 1; k <= 5; k += 2) {
35642         GemmMicrokernelTester()
35643           .mr(3)
35644           .nr(8)
35645           .kr(1)
35646           .sr(1)
35647           .m(3)
35648           .n(n)
35649           .k(k)
35650           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35651       }
35652     }
35653   }
35654 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_strided_cn)35655   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_strided_cn) {
35656     for (uint32_t n = 16; n <= 24; n += 8) {
35657       for (size_t k = 1; k <= 5; k += 2) {
35658         GemmMicrokernelTester()
35659           .mr(3)
35660           .nr(8)
35661           .kr(1)
35662           .sr(1)
35663           .m(3)
35664           .n(n)
35665           .k(k)
35666           .cn_stride(11)
35667           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35668       }
35669     }
35670   }
35671 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_strided_a)35672   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_strided_a) {
35673     for (uint32_t n = 16; n <= 24; n += 8) {
35674       for (size_t k = 1; k <= 5; k += 2) {
35675         GemmMicrokernelTester()
35676           .mr(3)
35677           .nr(8)
35678           .kr(1)
35679           .sr(1)
35680           .m(3)
35681           .n(n)
35682           .k(k)
35683           .a_stride(7)
35684           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35685       }
35686     }
35687   }
35688 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_subtile)35689   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_subtile) {
35690     for (uint32_t n = 16; n <= 24; n += 8) {
35691       for (size_t k = 1; k <= 5; k += 2) {
35692         for (uint32_t m = 1; m <= 3; m++) {
35693           GemmMicrokernelTester()
35694             .mr(3)
35695             .nr(8)
35696             .kr(1)
35697             .sr(1)
35698             .m(m)
35699             .n(n)
35700             .k(k)
35701             .iterations(1)
35702             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35703         }
35704       }
35705     }
35706   }
35707 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cm_subtile)35708   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cm_subtile) {
35709     for (size_t k = 1; k <= 5; k += 2) {
35710       for (uint32_t n = 1; n <= 8; n++) {
35711         for (uint32_t m = 1; m <= 3; m++) {
35712           GemmMicrokernelTester()
35713             .mr(3)
35714             .nr(8)
35715             .kr(1)
35716             .sr(1)
35717             .m(m)
35718             .n(n)
35719             .k(k)
35720             .cm_stride(11)
35721             .iterations(1)
35722             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35723         }
35724       }
35725     }
35726   }
35727 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,qmin)35728   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, qmin) {
35729     GemmMicrokernelTester()
35730       .mr(3)
35731       .nr(8)
35732       .kr(1)
35733       .sr(1)
35734       .m(3)
35735       .n(8)
35736       .k(1)
35737       .qmin(128)
35738       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35739   }
35740 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,qmax)35741   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, qmax) {
35742     GemmMicrokernelTester()
35743       .mr(3)
35744       .nr(8)
35745       .kr(1)
35746       .sr(1)
35747       .m(3)
35748       .n(8)
35749       .k(1)
35750       .qmax(128)
35751       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35752   }
35753 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cm)35754   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cm) {
35755     GemmMicrokernelTester()
35756       .mr(3)
35757       .nr(8)
35758       .kr(1)
35759       .sr(1)
35760       .m(3)
35761       .n(8)
35762       .k(1)
35763       .cm_stride(11)
35764       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
35765   }
35766 #endif  // XNN_ARCH_WASMRELAXEDSIMD
35767 
35768 
35769 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4)35770   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4) {
35771     GemmMicrokernelTester()
35772       .mr(3)
35773       .nr(8)
35774       .kr(1)
35775       .sr(1)
35776       .m(3)
35777       .n(8)
35778       .k(4)
35779       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35780   }
35781 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cn)35782   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cn) {
35783     GemmMicrokernelTester()
35784       .mr(3)
35785       .nr(8)
35786       .kr(1)
35787       .sr(1)
35788       .m(3)
35789       .n(8)
35790       .k(4)
35791       .cn_stride(11)
35792       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35793   }
35794 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_strided_a)35795   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_strided_a) {
35796     GemmMicrokernelTester()
35797       .mr(3)
35798       .nr(8)
35799       .kr(1)
35800       .sr(1)
35801       .m(3)
35802       .n(8)
35803       .k(4)
35804       .a_stride(7)
35805       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35806   }
35807 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile)35808   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile) {
35809     for (uint32_t n = 1; n <= 8; n++) {
35810       for (uint32_t m = 1; m <= 3; m++) {
35811         GemmMicrokernelTester()
35812           .mr(3)
35813           .nr(8)
35814           .kr(1)
35815           .sr(1)
35816           .m(m)
35817           .n(n)
35818           .k(4)
35819           .iterations(1)
35820           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35821       }
35822     }
35823   }
35824 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile_m)35825   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile_m) {
35826     for (uint32_t m = 1; m <= 3; m++) {
35827       GemmMicrokernelTester()
35828         .mr(3)
35829         .nr(8)
35830         .kr(1)
35831         .sr(1)
35832         .m(m)
35833         .n(8)
35834         .k(4)
35835         .iterations(1)
35836         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35837     }
35838   }
35839 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile_n)35840   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile_n) {
35841     for (uint32_t n = 1; n <= 8; n++) {
35842       GemmMicrokernelTester()
35843         .mr(3)
35844         .nr(8)
35845         .kr(1)
35846         .sr(1)
35847         .m(3)
35848         .n(n)
35849         .k(4)
35850         .iterations(1)
35851         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35852     }
35853   }
35854 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4)35855   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4) {
35856     for (size_t k = 1; k < 4; k++) {
35857       GemmMicrokernelTester()
35858         .mr(3)
35859         .nr(8)
35860         .kr(1)
35861         .sr(1)
35862         .m(3)
35863         .n(8)
35864         .k(k)
35865         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35866     }
35867   }
35868 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4_strided_a)35869   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4_strided_a) {
35870     for (size_t k = 1; k < 4; k++) {
35871       GemmMicrokernelTester()
35872         .mr(3)
35873         .nr(8)
35874         .kr(1)
35875         .sr(1)
35876         .m(3)
35877         .n(8)
35878         .k(k)
35879         .a_stride(7)
35880         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35881     }
35882   }
35883 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4_subtile)35884   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4_subtile) {
35885     for (size_t k = 1; k < 4; k++) {
35886       for (uint32_t n = 1; n <= 8; n++) {
35887         for (uint32_t m = 1; m <= 3; m++) {
35888           GemmMicrokernelTester()
35889             .mr(3)
35890             .nr(8)
35891             .kr(1)
35892             .sr(1)
35893             .m(m)
35894             .n(n)
35895             .k(k)
35896             .iterations(1)
35897             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35898         }
35899       }
35900     }
35901   }
35902 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4)35903   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4) {
35904     for (size_t k = 5; k < 8; k++) {
35905       GemmMicrokernelTester()
35906         .mr(3)
35907         .nr(8)
35908         .kr(1)
35909         .sr(1)
35910         .m(3)
35911         .n(8)
35912         .k(k)
35913         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35914     }
35915   }
35916 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4_strided_a)35917   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4_strided_a) {
35918     for (size_t k = 5; k < 8; k++) {
35919       GemmMicrokernelTester()
35920         .mr(3)
35921         .nr(8)
35922         .kr(1)
35923         .sr(1)
35924         .m(3)
35925         .n(8)
35926         .k(k)
35927         .a_stride(11)
35928         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35929     }
35930   }
35931 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4_subtile)35932   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4_subtile) {
35933     for (size_t k = 5; k < 8; k++) {
35934       for (uint32_t n = 1; n <= 8; n++) {
35935         for (uint32_t m = 1; m <= 3; m++) {
35936           GemmMicrokernelTester()
35937             .mr(3)
35938             .nr(8)
35939             .kr(1)
35940             .sr(1)
35941             .m(m)
35942             .n(n)
35943             .k(k)
35944             .iterations(1)
35945             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35946         }
35947       }
35948     }
35949   }
35950 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4)35951   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4) {
35952     for (size_t k = 8; k <= 40; k += 4) {
35953       GemmMicrokernelTester()
35954         .mr(3)
35955         .nr(8)
35956         .kr(1)
35957         .sr(1)
35958         .m(3)
35959         .n(8)
35960         .k(k)
35961         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35962     }
35963   }
35964 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4_strided_a)35965   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4_strided_a) {
35966     for (size_t k = 8; k <= 40; k += 4) {
35967       GemmMicrokernelTester()
35968         .mr(3)
35969         .nr(8)
35970         .kr(1)
35971         .sr(1)
35972         .m(3)
35973         .n(8)
35974         .k(k)
35975         .a_stride(43)
35976         .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35977     }
35978   }
35979 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4_subtile)35980   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4_subtile) {
35981     for (size_t k = 8; k <= 40; k += 4) {
35982       for (uint32_t n = 1; n <= 8; n++) {
35983         for (uint32_t m = 1; m <= 3; m++) {
35984           GemmMicrokernelTester()
35985             .mr(3)
35986             .nr(8)
35987             .kr(1)
35988             .sr(1)
35989             .m(m)
35990             .n(n)
35991             .k(k)
35992             .iterations(1)
35993             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
35994         }
35995       }
35996     }
35997   }
35998 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8)35999   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8) {
36000     for (uint32_t n = 9; n < 16; n++) {
36001       for (size_t k = 1; k <= 20; k += 5) {
36002         GemmMicrokernelTester()
36003           .mr(3)
36004           .nr(8)
36005           .kr(1)
36006           .sr(1)
36007           .m(3)
36008           .n(n)
36009           .k(k)
36010           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36011       }
36012     }
36013   }
36014 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_strided_cn)36015   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_strided_cn) {
36016     for (uint32_t n = 9; n < 16; n++) {
36017       for (size_t k = 1; k <= 20; k += 5) {
36018         GemmMicrokernelTester()
36019           .mr(3)
36020           .nr(8)
36021           .kr(1)
36022           .sr(1)
36023           .m(3)
36024           .n(n)
36025           .k(k)
36026           .cn_stride(11)
36027           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36028       }
36029     }
36030   }
36031 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_strided_a)36032   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_strided_a) {
36033     for (uint32_t n = 9; n < 16; n++) {
36034       for (size_t k = 1; k <= 20; k += 5) {
36035         GemmMicrokernelTester()
36036           .mr(3)
36037           .nr(8)
36038           .kr(1)
36039           .sr(1)
36040           .m(3)
36041           .n(n)
36042           .k(k)
36043           .a_stride(23)
36044           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36045       }
36046     }
36047   }
36048 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_subtile)36049   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_subtile) {
36050     for (uint32_t n = 9; n < 16; n++) {
36051       for (size_t k = 1; k <= 20; k += 5) {
36052         for (uint32_t m = 1; m <= 3; m++) {
36053           GemmMicrokernelTester()
36054             .mr(3)
36055             .nr(8)
36056             .kr(1)
36057             .sr(1)
36058             .m(m)
36059             .n(n)
36060             .k(k)
36061             .iterations(1)
36062             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36063         }
36064       }
36065     }
36066   }
36067 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8)36068   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8) {
36069     for (uint32_t n = 16; n <= 24; n += 8) {
36070       for (size_t k = 1; k <= 20; k += 5) {
36071         GemmMicrokernelTester()
36072           .mr(3)
36073           .nr(8)
36074           .kr(1)
36075           .sr(1)
36076           .m(3)
36077           .n(n)
36078           .k(k)
36079           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36080       }
36081     }
36082   }
36083 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_strided_cn)36084   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_strided_cn) {
36085     for (uint32_t n = 16; n <= 24; n += 8) {
36086       for (size_t k = 1; k <= 20; k += 5) {
36087         GemmMicrokernelTester()
36088           .mr(3)
36089           .nr(8)
36090           .kr(1)
36091           .sr(1)
36092           .m(3)
36093           .n(n)
36094           .k(k)
36095           .cn_stride(11)
36096           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36097       }
36098     }
36099   }
36100 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_strided_a)36101   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_strided_a) {
36102     for (uint32_t n = 16; n <= 24; n += 8) {
36103       for (size_t k = 1; k <= 20; k += 5) {
36104         GemmMicrokernelTester()
36105           .mr(3)
36106           .nr(8)
36107           .kr(1)
36108           .sr(1)
36109           .m(3)
36110           .n(n)
36111           .k(k)
36112           .a_stride(23)
36113           .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36114       }
36115     }
36116   }
36117 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_subtile)36118   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_subtile) {
36119     for (uint32_t n = 16; n <= 24; n += 8) {
36120       for (size_t k = 1; k <= 20; k += 5) {
36121         for (uint32_t m = 1; m <= 3; m++) {
36122           GemmMicrokernelTester()
36123             .mr(3)
36124             .nr(8)
36125             .kr(1)
36126             .sr(1)
36127             .m(m)
36128             .n(n)
36129             .k(k)
36130             .iterations(1)
36131             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36132         }
36133       }
36134     }
36135   }
36136 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cm_subtile)36137   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cm_subtile) {
36138     for (size_t k = 1; k <= 20; k += 5) {
36139       for (uint32_t n = 1; n <= 8; n++) {
36140         for (uint32_t m = 1; m <= 3; m++) {
36141           GemmMicrokernelTester()
36142             .mr(3)
36143             .nr(8)
36144             .kr(1)
36145             .sr(1)
36146             .m(m)
36147             .n(n)
36148             .k(k)
36149             .cm_stride(11)
36150             .iterations(1)
36151             .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36152         }
36153       }
36154     }
36155   }
36156 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,qmin)36157   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, qmin) {
36158     GemmMicrokernelTester()
36159       .mr(3)
36160       .nr(8)
36161       .kr(1)
36162       .sr(1)
36163       .m(3)
36164       .n(8)
36165       .k(4)
36166       .qmin(128)
36167       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36168   }
36169 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,qmax)36170   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, qmax) {
36171     GemmMicrokernelTester()
36172       .mr(3)
36173       .nr(8)
36174       .kr(1)
36175       .sr(1)
36176       .m(3)
36177       .n(8)
36178       .k(4)
36179       .qmax(128)
36180       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36181   }
36182 
TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cm)36183   TEST(F32_GEMM_MINMAX_3X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cm) {
36184     GemmMicrokernelTester()
36185       .mr(3)
36186       .nr(8)
36187       .kr(1)
36188       .sr(1)
36189       .m(3)
36190       .n(8)
36191       .k(4)
36192       .cm_stride(11)
36193       .Test(xnn_f32_gemm_minmax_ukernel_3x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
36194   }
36195 #endif  // XNN_ARCH_WASMRELAXEDSIMD
36196 
36197 
36198 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_eq_4)36199   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_eq_4) {
36200     GemmMicrokernelTester()
36201       .mr(3)
36202       .nr(8)
36203       .kr(1)
36204       .sr(4)
36205       .m(3)
36206       .n(8)
36207       .k(4)
36208       .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36209   }
36210 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,strided_cn)36211   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, strided_cn) {
36212     GemmMicrokernelTester()
36213       .mr(3)
36214       .nr(8)
36215       .kr(1)
36216       .sr(4)
36217       .m(3)
36218       .n(8)
36219       .k(4)
36220       .cn_stride(11)
36221       .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36222   }
36223 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_eq_4_strided_a)36224   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_eq_4_strided_a) {
36225     GemmMicrokernelTester()
36226       .mr(3)
36227       .nr(8)
36228       .kr(1)
36229       .sr(4)
36230       .m(3)
36231       .n(8)
36232       .k(4)
36233       .a_stride(7)
36234       .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36235   }
36236 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_eq_4_subtile)36237   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_eq_4_subtile) {
36238     for (uint32_t n = 1; n <= 8; n++) {
36239       for (uint32_t m = 1; m <= 3; m++) {
36240         GemmMicrokernelTester()
36241           .mr(3)
36242           .nr(8)
36243           .kr(1)
36244           .sr(4)
36245           .m(m)
36246           .n(n)
36247           .k(4)
36248           .iterations(1)
36249           .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36250       }
36251     }
36252   }
36253 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_eq_4_subtile_m)36254   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_eq_4_subtile_m) {
36255     for (uint32_t m = 1; m <= 3; m++) {
36256       GemmMicrokernelTester()
36257         .mr(3)
36258         .nr(8)
36259         .kr(1)
36260         .sr(4)
36261         .m(m)
36262         .n(8)
36263         .k(4)
36264         .iterations(1)
36265         .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36266     }
36267   }
36268 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_eq_4_subtile_n)36269   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_eq_4_subtile_n) {
36270     for (uint32_t n = 1; n <= 8; n++) {
36271       GemmMicrokernelTester()
36272         .mr(3)
36273         .nr(8)
36274         .kr(1)
36275         .sr(4)
36276         .m(3)
36277         .n(n)
36278         .k(4)
36279         .iterations(1)
36280         .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36281     }
36282   }
36283 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_lt_4)36284   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_lt_4) {
36285     for (size_t k = 1; k < 4; k++) {
36286       GemmMicrokernelTester()
36287         .mr(3)
36288         .nr(8)
36289         .kr(1)
36290         .sr(4)
36291         .m(3)
36292         .n(8)
36293         .k(k)
36294         .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36295     }
36296   }
36297 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_lt_4_strided_a)36298   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_lt_4_strided_a) {
36299     for (size_t k = 1; k < 4; k++) {
36300       GemmMicrokernelTester()
36301         .mr(3)
36302         .nr(8)
36303         .kr(1)
36304         .sr(4)
36305         .m(3)
36306         .n(8)
36307         .k(k)
36308         .a_stride(7)
36309         .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36310     }
36311   }
36312 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_lt_4_subtile)36313   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_lt_4_subtile) {
36314     for (size_t k = 1; k < 4; k++) {
36315       for (uint32_t n = 1; n <= 8; n++) {
36316         for (uint32_t m = 1; m <= 3; m++) {
36317           GemmMicrokernelTester()
36318             .mr(3)
36319             .nr(8)
36320             .kr(1)
36321             .sr(4)
36322             .m(m)
36323             .n(n)
36324             .k(k)
36325             .iterations(1)
36326             .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36327         }
36328       }
36329     }
36330   }
36331 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_gt_4)36332   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_gt_4) {
36333     for (size_t k = 5; k < 8; k++) {
36334       GemmMicrokernelTester()
36335         .mr(3)
36336         .nr(8)
36337         .kr(1)
36338         .sr(4)
36339         .m(3)
36340         .n(8)
36341         .k(k)
36342         .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36343     }
36344   }
36345 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_gt_4_strided_a)36346   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_gt_4_strided_a) {
36347     for (size_t k = 5; k < 8; k++) {
36348       GemmMicrokernelTester()
36349         .mr(3)
36350         .nr(8)
36351         .kr(1)
36352         .sr(4)
36353         .m(3)
36354         .n(8)
36355         .k(k)
36356         .a_stride(11)
36357         .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36358     }
36359   }
36360 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_gt_4_subtile)36361   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_gt_4_subtile) {
36362     for (size_t k = 5; k < 8; k++) {
36363       for (uint32_t n = 1; n <= 8; n++) {
36364         for (uint32_t m = 1; m <= 3; m++) {
36365           GemmMicrokernelTester()
36366             .mr(3)
36367             .nr(8)
36368             .kr(1)
36369             .sr(4)
36370             .m(m)
36371             .n(n)
36372             .k(k)
36373             .iterations(1)
36374             .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36375         }
36376       }
36377     }
36378   }
36379 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_div_4)36380   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_div_4) {
36381     for (size_t k = 8; k <= 40; k += 4) {
36382       GemmMicrokernelTester()
36383         .mr(3)
36384         .nr(8)
36385         .kr(1)
36386         .sr(4)
36387         .m(3)
36388         .n(8)
36389         .k(k)
36390         .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36391     }
36392   }
36393 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_div_4_strided_a)36394   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_div_4_strided_a) {
36395     for (size_t k = 8; k <= 40; k += 4) {
36396       GemmMicrokernelTester()
36397         .mr(3)
36398         .nr(8)
36399         .kr(1)
36400         .sr(4)
36401         .m(3)
36402         .n(8)
36403         .k(k)
36404         .a_stride(43)
36405         .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36406     }
36407   }
36408 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,k_div_4_subtile)36409   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, k_div_4_subtile) {
36410     for (size_t k = 8; k <= 40; k += 4) {
36411       for (uint32_t n = 1; n <= 8; n++) {
36412         for (uint32_t m = 1; m <= 3; m++) {
36413           GemmMicrokernelTester()
36414             .mr(3)
36415             .nr(8)
36416             .kr(1)
36417             .sr(4)
36418             .m(m)
36419             .n(n)
36420             .k(k)
36421             .iterations(1)
36422             .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36423         }
36424       }
36425     }
36426   }
36427 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,n_gt_8)36428   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, n_gt_8) {
36429     for (uint32_t n = 9; n < 16; n++) {
36430       for (size_t k = 1; k <= 20; k += 5) {
36431         GemmMicrokernelTester()
36432           .mr(3)
36433           .nr(8)
36434           .kr(1)
36435           .sr(4)
36436           .m(3)
36437           .n(n)
36438           .k(k)
36439           .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36440       }
36441     }
36442   }
36443 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,n_gt_8_strided_cn)36444   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, n_gt_8_strided_cn) {
36445     for (uint32_t n = 9; n < 16; n++) {
36446       for (size_t k = 1; k <= 20; k += 5) {
36447         GemmMicrokernelTester()
36448           .mr(3)
36449           .nr(8)
36450           .kr(1)
36451           .sr(4)
36452           .m(3)
36453           .n(n)
36454           .k(k)
36455           .cn_stride(11)
36456           .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36457       }
36458     }
36459   }
36460 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,n_gt_8_strided_a)36461   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, n_gt_8_strided_a) {
36462     for (uint32_t n = 9; n < 16; n++) {
36463       for (size_t k = 1; k <= 20; k += 5) {
36464         GemmMicrokernelTester()
36465           .mr(3)
36466           .nr(8)
36467           .kr(1)
36468           .sr(4)
36469           .m(3)
36470           .n(n)
36471           .k(k)
36472           .a_stride(23)
36473           .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36474       }
36475     }
36476   }
36477 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,n_gt_8_subtile)36478   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, n_gt_8_subtile) {
36479     for (uint32_t n = 9; n < 16; n++) {
36480       for (size_t k = 1; k <= 20; k += 5) {
36481         for (uint32_t m = 1; m <= 3; m++) {
36482           GemmMicrokernelTester()
36483             .mr(3)
36484             .nr(8)
36485             .kr(1)
36486             .sr(4)
36487             .m(m)
36488             .n(n)
36489             .k(k)
36490             .iterations(1)
36491             .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36492         }
36493       }
36494     }
36495   }
36496 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,n_div_8)36497   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, n_div_8) {
36498     for (uint32_t n = 16; n <= 24; n += 8) {
36499       for (size_t k = 1; k <= 20; k += 5) {
36500         GemmMicrokernelTester()
36501           .mr(3)
36502           .nr(8)
36503           .kr(1)
36504           .sr(4)
36505           .m(3)
36506           .n(n)
36507           .k(k)
36508           .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36509       }
36510     }
36511   }
36512 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,n_div_8_strided_cn)36513   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, n_div_8_strided_cn) {
36514     for (uint32_t n = 16; n <= 24; n += 8) {
36515       for (size_t k = 1; k <= 20; k += 5) {
36516         GemmMicrokernelTester()
36517           .mr(3)
36518           .nr(8)
36519           .kr(1)
36520           .sr(4)
36521           .m(3)
36522           .n(n)
36523           .k(k)
36524           .cn_stride(11)
36525           .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36526       }
36527     }
36528   }
36529 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,n_div_8_strided_a)36530   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, n_div_8_strided_a) {
36531     for (uint32_t n = 16; n <= 24; n += 8) {
36532       for (size_t k = 1; k <= 20; k += 5) {
36533         GemmMicrokernelTester()
36534           .mr(3)
36535           .nr(8)
36536           .kr(1)
36537           .sr(4)
36538           .m(3)
36539           .n(n)
36540           .k(k)
36541           .a_stride(23)
36542           .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36543       }
36544     }
36545   }
36546 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,n_div_8_subtile)36547   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, n_div_8_subtile) {
36548     for (uint32_t n = 16; n <= 24; n += 8) {
36549       for (size_t k = 1; k <= 20; k += 5) {
36550         for (uint32_t m = 1; m <= 3; m++) {
36551           GemmMicrokernelTester()
36552             .mr(3)
36553             .nr(8)
36554             .kr(1)
36555             .sr(4)
36556             .m(m)
36557             .n(n)
36558             .k(k)
36559             .iterations(1)
36560             .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36561         }
36562       }
36563     }
36564   }
36565 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,strided_cm_subtile)36566   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, strided_cm_subtile) {
36567     for (size_t k = 1; k <= 20; k += 5) {
36568       for (uint32_t n = 1; n <= 8; n++) {
36569         for (uint32_t m = 1; m <= 3; m++) {
36570           GemmMicrokernelTester()
36571             .mr(3)
36572             .nr(8)
36573             .kr(1)
36574             .sr(4)
36575             .m(m)
36576             .n(n)
36577             .k(k)
36578             .cm_stride(11)
36579             .iterations(1)
36580             .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36581         }
36582       }
36583     }
36584   }
36585 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,qmin)36586   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, qmin) {
36587     GemmMicrokernelTester()
36588       .mr(3)
36589       .nr(8)
36590       .kr(1)
36591       .sr(4)
36592       .m(3)
36593       .n(8)
36594       .k(4)
36595       .qmin(128)
36596       .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36597   }
36598 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,qmax)36599   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, qmax) {
36600     GemmMicrokernelTester()
36601       .mr(3)
36602       .nr(8)
36603       .kr(1)
36604       .sr(4)
36605       .m(3)
36606       .n(8)
36607       .k(4)
36608       .qmax(128)
36609       .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36610   }
36611 
TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD,strided_cm)36612   TEST(F32_GEMM_MINMAX_3X8S4__WASMRELAXEDSIMD, strided_cm) {
36613     GemmMicrokernelTester()
36614       .mr(3)
36615       .nr(8)
36616       .kr(1)
36617       .sr(4)
36618       .m(3)
36619       .n(8)
36620       .k(4)
36621       .cm_stride(11)
36622       .Test(xnn_f32_gemm_minmax_ukernel_3x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36623   }
36624 #endif  // XNN_ARCH_WASMRELAXEDSIMD
36625 
36626 
36627 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_eq_4)36628   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_eq_4) {
36629     GemmMicrokernelTester()
36630       .mr(4)
36631       .nr(2)
36632       .kr(4)
36633       .sr(1)
36634       .m(4)
36635       .n(2)
36636       .k(4)
36637       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36638   }
36639 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,strided_cn)36640   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, strided_cn) {
36641     GemmMicrokernelTester()
36642       .mr(4)
36643       .nr(2)
36644       .kr(4)
36645       .sr(1)
36646       .m(4)
36647       .n(2)
36648       .k(4)
36649       .cn_stride(5)
36650       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36651   }
36652 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_eq_4_strided_a)36653   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_eq_4_strided_a) {
36654     GemmMicrokernelTester()
36655       .mr(4)
36656       .nr(2)
36657       .kr(4)
36658       .sr(1)
36659       .m(4)
36660       .n(2)
36661       .k(4)
36662       .a_stride(7)
36663       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36664   }
36665 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_eq_4_subtile)36666   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_eq_4_subtile) {
36667     for (uint32_t n = 1; n <= 2; n++) {
36668       for (uint32_t m = 1; m <= 4; m++) {
36669         GemmMicrokernelTester()
36670           .mr(4)
36671           .nr(2)
36672           .kr(4)
36673           .sr(1)
36674           .m(m)
36675           .n(n)
36676           .k(4)
36677           .iterations(1)
36678           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36679       }
36680     }
36681   }
36682 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_eq_4_subtile_m)36683   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_eq_4_subtile_m) {
36684     for (uint32_t m = 1; m <= 4; m++) {
36685       GemmMicrokernelTester()
36686         .mr(4)
36687         .nr(2)
36688         .kr(4)
36689         .sr(1)
36690         .m(m)
36691         .n(2)
36692         .k(4)
36693         .iterations(1)
36694         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36695     }
36696   }
36697 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_eq_4_subtile_n)36698   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_eq_4_subtile_n) {
36699     for (uint32_t n = 1; n <= 2; n++) {
36700       GemmMicrokernelTester()
36701         .mr(4)
36702         .nr(2)
36703         .kr(4)
36704         .sr(1)
36705         .m(4)
36706         .n(n)
36707         .k(4)
36708         .iterations(1)
36709         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36710     }
36711   }
36712 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_lt_4)36713   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_lt_4) {
36714     for (size_t k = 1; k < 4; k++) {
36715       GemmMicrokernelTester()
36716         .mr(4)
36717         .nr(2)
36718         .kr(4)
36719         .sr(1)
36720         .m(4)
36721         .n(2)
36722         .k(k)
36723         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36724     }
36725   }
36726 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_lt_4_strided_a)36727   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_lt_4_strided_a) {
36728     for (size_t k = 1; k < 4; k++) {
36729       GemmMicrokernelTester()
36730         .mr(4)
36731         .nr(2)
36732         .kr(4)
36733         .sr(1)
36734         .m(4)
36735         .n(2)
36736         .k(k)
36737         .a_stride(7)
36738         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36739     }
36740   }
36741 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_lt_4_subtile)36742   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_lt_4_subtile) {
36743     for (size_t k = 1; k < 4; k++) {
36744       for (uint32_t n = 1; n <= 2; n++) {
36745         for (uint32_t m = 1; m <= 4; m++) {
36746           GemmMicrokernelTester()
36747             .mr(4)
36748             .nr(2)
36749             .kr(4)
36750             .sr(1)
36751             .m(m)
36752             .n(n)
36753             .k(k)
36754             .iterations(1)
36755             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36756         }
36757       }
36758     }
36759   }
36760 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_gt_4)36761   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_gt_4) {
36762     for (size_t k = 5; k < 8; k++) {
36763       GemmMicrokernelTester()
36764         .mr(4)
36765         .nr(2)
36766         .kr(4)
36767         .sr(1)
36768         .m(4)
36769         .n(2)
36770         .k(k)
36771         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36772     }
36773   }
36774 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_gt_4_strided_a)36775   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_gt_4_strided_a) {
36776     for (size_t k = 5; k < 8; k++) {
36777       GemmMicrokernelTester()
36778         .mr(4)
36779         .nr(2)
36780         .kr(4)
36781         .sr(1)
36782         .m(4)
36783         .n(2)
36784         .k(k)
36785         .a_stride(11)
36786         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36787     }
36788   }
36789 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_gt_4_subtile)36790   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_gt_4_subtile) {
36791     for (size_t k = 5; k < 8; k++) {
36792       for (uint32_t n = 1; n <= 2; n++) {
36793         for (uint32_t m = 1; m <= 4; m++) {
36794           GemmMicrokernelTester()
36795             .mr(4)
36796             .nr(2)
36797             .kr(4)
36798             .sr(1)
36799             .m(m)
36800             .n(n)
36801             .k(k)
36802             .iterations(1)
36803             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36804         }
36805       }
36806     }
36807   }
36808 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_div_4)36809   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_div_4) {
36810     for (size_t k = 8; k <= 40; k += 4) {
36811       GemmMicrokernelTester()
36812         .mr(4)
36813         .nr(2)
36814         .kr(4)
36815         .sr(1)
36816         .m(4)
36817         .n(2)
36818         .k(k)
36819         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36820     }
36821   }
36822 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_div_4_strided_a)36823   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_div_4_strided_a) {
36824     for (size_t k = 8; k <= 40; k += 4) {
36825       GemmMicrokernelTester()
36826         .mr(4)
36827         .nr(2)
36828         .kr(4)
36829         .sr(1)
36830         .m(4)
36831         .n(2)
36832         .k(k)
36833         .a_stride(43)
36834         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36835     }
36836   }
36837 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,k_div_4_subtile)36838   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, k_div_4_subtile) {
36839     for (size_t k = 8; k <= 40; k += 4) {
36840       for (uint32_t n = 1; n <= 2; n++) {
36841         for (uint32_t m = 1; m <= 4; m++) {
36842           GemmMicrokernelTester()
36843             .mr(4)
36844             .nr(2)
36845             .kr(4)
36846             .sr(1)
36847             .m(m)
36848             .n(n)
36849             .k(k)
36850             .iterations(1)
36851             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36852         }
36853       }
36854     }
36855   }
36856 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,n_gt_2)36857   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, n_gt_2) {
36858     for (uint32_t n = 3; n < 4; n++) {
36859       for (size_t k = 1; k <= 20; k += 5) {
36860         GemmMicrokernelTester()
36861           .mr(4)
36862           .nr(2)
36863           .kr(4)
36864           .sr(1)
36865           .m(4)
36866           .n(n)
36867           .k(k)
36868           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36869       }
36870     }
36871   }
36872 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,n_gt_2_strided_cn)36873   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, n_gt_2_strided_cn) {
36874     for (uint32_t n = 3; n < 4; n++) {
36875       for (size_t k = 1; k <= 20; k += 5) {
36876         GemmMicrokernelTester()
36877           .mr(4)
36878           .nr(2)
36879           .kr(4)
36880           .sr(1)
36881           .m(4)
36882           .n(n)
36883           .k(k)
36884           .cn_stride(5)
36885           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36886       }
36887     }
36888   }
36889 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,n_gt_2_strided_a)36890   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, n_gt_2_strided_a) {
36891     for (uint32_t n = 3; n < 4; n++) {
36892       for (size_t k = 1; k <= 20; k += 5) {
36893         GemmMicrokernelTester()
36894           .mr(4)
36895           .nr(2)
36896           .kr(4)
36897           .sr(1)
36898           .m(4)
36899           .n(n)
36900           .k(k)
36901           .a_stride(23)
36902           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36903       }
36904     }
36905   }
36906 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,n_gt_2_subtile)36907   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, n_gt_2_subtile) {
36908     for (uint32_t n = 3; n < 4; n++) {
36909       for (size_t k = 1; k <= 20; k += 5) {
36910         for (uint32_t m = 1; m <= 4; m++) {
36911           GemmMicrokernelTester()
36912             .mr(4)
36913             .nr(2)
36914             .kr(4)
36915             .sr(1)
36916             .m(m)
36917             .n(n)
36918             .k(k)
36919             .iterations(1)
36920             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36921         }
36922       }
36923     }
36924   }
36925 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,n_div_2)36926   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, n_div_2) {
36927     for (uint32_t n = 4; n <= 6; n += 2) {
36928       for (size_t k = 1; k <= 20; k += 5) {
36929         GemmMicrokernelTester()
36930           .mr(4)
36931           .nr(2)
36932           .kr(4)
36933           .sr(1)
36934           .m(4)
36935           .n(n)
36936           .k(k)
36937           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36938       }
36939     }
36940   }
36941 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,n_div_2_strided_cn)36942   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, n_div_2_strided_cn) {
36943     for (uint32_t n = 4; n <= 6; n += 2) {
36944       for (size_t k = 1; k <= 20; k += 5) {
36945         GemmMicrokernelTester()
36946           .mr(4)
36947           .nr(2)
36948           .kr(4)
36949           .sr(1)
36950           .m(4)
36951           .n(n)
36952           .k(k)
36953           .cn_stride(5)
36954           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36955       }
36956     }
36957   }
36958 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,n_div_2_strided_a)36959   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, n_div_2_strided_a) {
36960     for (uint32_t n = 4; n <= 6; n += 2) {
36961       for (size_t k = 1; k <= 20; k += 5) {
36962         GemmMicrokernelTester()
36963           .mr(4)
36964           .nr(2)
36965           .kr(4)
36966           .sr(1)
36967           .m(4)
36968           .n(n)
36969           .k(k)
36970           .a_stride(23)
36971           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36972       }
36973     }
36974   }
36975 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,n_div_2_subtile)36976   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, n_div_2_subtile) {
36977     for (uint32_t n = 4; n <= 6; n += 2) {
36978       for (size_t k = 1; k <= 20; k += 5) {
36979         for (uint32_t m = 1; m <= 4; m++) {
36980           GemmMicrokernelTester()
36981             .mr(4)
36982             .nr(2)
36983             .kr(4)
36984             .sr(1)
36985             .m(m)
36986             .n(n)
36987             .k(k)
36988             .iterations(1)
36989             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
36990         }
36991       }
36992     }
36993   }
36994 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,strided_cm_subtile)36995   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, strided_cm_subtile) {
36996     for (size_t k = 1; k <= 20; k += 5) {
36997       for (uint32_t n = 1; n <= 2; n++) {
36998         for (uint32_t m = 1; m <= 4; m++) {
36999           GemmMicrokernelTester()
37000             .mr(4)
37001             .nr(2)
37002             .kr(4)
37003             .sr(1)
37004             .m(m)
37005             .n(n)
37006             .k(k)
37007             .cm_stride(5)
37008             .iterations(1)
37009             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
37010         }
37011       }
37012     }
37013   }
37014 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,qmin)37015   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, qmin) {
37016     GemmMicrokernelTester()
37017       .mr(4)
37018       .nr(2)
37019       .kr(4)
37020       .sr(1)
37021       .m(4)
37022       .n(2)
37023       .k(4)
37024       .qmin(128)
37025       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
37026   }
37027 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,qmax)37028   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, qmax) {
37029     GemmMicrokernelTester()
37030       .mr(4)
37031       .nr(2)
37032       .kr(4)
37033       .sr(1)
37034       .m(4)
37035       .n(2)
37036       .k(4)
37037       .qmax(128)
37038       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
37039   }
37040 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD,strided_cm)37041   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD, strided_cm) {
37042     GemmMicrokernelTester()
37043       .mr(4)
37044       .nr(2)
37045       .kr(4)
37046       .sr(1)
37047       .m(4)
37048       .n(2)
37049       .k(4)
37050       .cm_stride(5)
37051       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
37052   }
37053 #endif  // XNN_ARCH_WASMRELAXEDSIMD
37054 
37055 
37056 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_eq_4)37057   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_eq_4) {
37058     GemmMicrokernelTester()
37059       .mr(4)
37060       .nr(2)
37061       .kr(4)
37062       .sr(1)
37063       .m(4)
37064       .n(2)
37065       .k(4)
37066       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37067   }
37068 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,strided_cn)37069   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, strided_cn) {
37070     GemmMicrokernelTester()
37071       .mr(4)
37072       .nr(2)
37073       .kr(4)
37074       .sr(1)
37075       .m(4)
37076       .n(2)
37077       .k(4)
37078       .cn_stride(5)
37079       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37080   }
37081 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_eq_4_strided_a)37082   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_eq_4_strided_a) {
37083     GemmMicrokernelTester()
37084       .mr(4)
37085       .nr(2)
37086       .kr(4)
37087       .sr(1)
37088       .m(4)
37089       .n(2)
37090       .k(4)
37091       .a_stride(7)
37092       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37093   }
37094 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile)37095   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile) {
37096     for (uint32_t n = 1; n <= 2; n++) {
37097       for (uint32_t m = 1; m <= 4; m++) {
37098         GemmMicrokernelTester()
37099           .mr(4)
37100           .nr(2)
37101           .kr(4)
37102           .sr(1)
37103           .m(m)
37104           .n(n)
37105           .k(4)
37106           .iterations(1)
37107           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37108       }
37109     }
37110   }
37111 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile_m)37112   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile_m) {
37113     for (uint32_t m = 1; m <= 4; m++) {
37114       GemmMicrokernelTester()
37115         .mr(4)
37116         .nr(2)
37117         .kr(4)
37118         .sr(1)
37119         .m(m)
37120         .n(2)
37121         .k(4)
37122         .iterations(1)
37123         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37124     }
37125   }
37126 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile_n)37127   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile_n) {
37128     for (uint32_t n = 1; n <= 2; n++) {
37129       GemmMicrokernelTester()
37130         .mr(4)
37131         .nr(2)
37132         .kr(4)
37133         .sr(1)
37134         .m(4)
37135         .n(n)
37136         .k(4)
37137         .iterations(1)
37138         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37139     }
37140   }
37141 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_lt_4)37142   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_lt_4) {
37143     for (size_t k = 1; k < 4; k++) {
37144       GemmMicrokernelTester()
37145         .mr(4)
37146         .nr(2)
37147         .kr(4)
37148         .sr(1)
37149         .m(4)
37150         .n(2)
37151         .k(k)
37152         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37153     }
37154   }
37155 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_lt_4_strided_a)37156   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_lt_4_strided_a) {
37157     for (size_t k = 1; k < 4; k++) {
37158       GemmMicrokernelTester()
37159         .mr(4)
37160         .nr(2)
37161         .kr(4)
37162         .sr(1)
37163         .m(4)
37164         .n(2)
37165         .k(k)
37166         .a_stride(7)
37167         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37168     }
37169   }
37170 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_lt_4_subtile)37171   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_lt_4_subtile) {
37172     for (size_t k = 1; k < 4; k++) {
37173       for (uint32_t n = 1; n <= 2; n++) {
37174         for (uint32_t m = 1; m <= 4; m++) {
37175           GemmMicrokernelTester()
37176             .mr(4)
37177             .nr(2)
37178             .kr(4)
37179             .sr(1)
37180             .m(m)
37181             .n(n)
37182             .k(k)
37183             .iterations(1)
37184             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37185         }
37186       }
37187     }
37188   }
37189 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_gt_4)37190   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_gt_4) {
37191     for (size_t k = 5; k < 8; k++) {
37192       GemmMicrokernelTester()
37193         .mr(4)
37194         .nr(2)
37195         .kr(4)
37196         .sr(1)
37197         .m(4)
37198         .n(2)
37199         .k(k)
37200         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37201     }
37202   }
37203 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_gt_4_strided_a)37204   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_gt_4_strided_a) {
37205     for (size_t k = 5; k < 8; k++) {
37206       GemmMicrokernelTester()
37207         .mr(4)
37208         .nr(2)
37209         .kr(4)
37210         .sr(1)
37211         .m(4)
37212         .n(2)
37213         .k(k)
37214         .a_stride(11)
37215         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37216     }
37217   }
37218 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_gt_4_subtile)37219   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_gt_4_subtile) {
37220     for (size_t k = 5; k < 8; k++) {
37221       for (uint32_t n = 1; n <= 2; n++) {
37222         for (uint32_t m = 1; m <= 4; m++) {
37223           GemmMicrokernelTester()
37224             .mr(4)
37225             .nr(2)
37226             .kr(4)
37227             .sr(1)
37228             .m(m)
37229             .n(n)
37230             .k(k)
37231             .iterations(1)
37232             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37233         }
37234       }
37235     }
37236   }
37237 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_div_4)37238   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_div_4) {
37239     for (size_t k = 8; k <= 40; k += 4) {
37240       GemmMicrokernelTester()
37241         .mr(4)
37242         .nr(2)
37243         .kr(4)
37244         .sr(1)
37245         .m(4)
37246         .n(2)
37247         .k(k)
37248         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37249     }
37250   }
37251 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_div_4_strided_a)37252   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_div_4_strided_a) {
37253     for (size_t k = 8; k <= 40; k += 4) {
37254       GemmMicrokernelTester()
37255         .mr(4)
37256         .nr(2)
37257         .kr(4)
37258         .sr(1)
37259         .m(4)
37260         .n(2)
37261         .k(k)
37262         .a_stride(43)
37263         .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37264     }
37265   }
37266 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,k_div_4_subtile)37267   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, k_div_4_subtile) {
37268     for (size_t k = 8; k <= 40; k += 4) {
37269       for (uint32_t n = 1; n <= 2; n++) {
37270         for (uint32_t m = 1; m <= 4; m++) {
37271           GemmMicrokernelTester()
37272             .mr(4)
37273             .nr(2)
37274             .kr(4)
37275             .sr(1)
37276             .m(m)
37277             .n(n)
37278             .k(k)
37279             .iterations(1)
37280             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37281         }
37282       }
37283     }
37284   }
37285 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,n_gt_2)37286   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, n_gt_2) {
37287     for (uint32_t n = 3; n < 4; n++) {
37288       for (size_t k = 1; k <= 20; k += 5) {
37289         GemmMicrokernelTester()
37290           .mr(4)
37291           .nr(2)
37292           .kr(4)
37293           .sr(1)
37294           .m(4)
37295           .n(n)
37296           .k(k)
37297           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37298       }
37299     }
37300   }
37301 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,n_gt_2_strided_cn)37302   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, n_gt_2_strided_cn) {
37303     for (uint32_t n = 3; n < 4; n++) {
37304       for (size_t k = 1; k <= 20; k += 5) {
37305         GemmMicrokernelTester()
37306           .mr(4)
37307           .nr(2)
37308           .kr(4)
37309           .sr(1)
37310           .m(4)
37311           .n(n)
37312           .k(k)
37313           .cn_stride(5)
37314           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37315       }
37316     }
37317   }
37318 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,n_gt_2_strided_a)37319   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, n_gt_2_strided_a) {
37320     for (uint32_t n = 3; n < 4; n++) {
37321       for (size_t k = 1; k <= 20; k += 5) {
37322         GemmMicrokernelTester()
37323           .mr(4)
37324           .nr(2)
37325           .kr(4)
37326           .sr(1)
37327           .m(4)
37328           .n(n)
37329           .k(k)
37330           .a_stride(23)
37331           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37332       }
37333     }
37334   }
37335 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,n_gt_2_subtile)37336   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, n_gt_2_subtile) {
37337     for (uint32_t n = 3; n < 4; n++) {
37338       for (size_t k = 1; k <= 20; k += 5) {
37339         for (uint32_t m = 1; m <= 4; m++) {
37340           GemmMicrokernelTester()
37341             .mr(4)
37342             .nr(2)
37343             .kr(4)
37344             .sr(1)
37345             .m(m)
37346             .n(n)
37347             .k(k)
37348             .iterations(1)
37349             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37350         }
37351       }
37352     }
37353   }
37354 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,n_div_2)37355   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, n_div_2) {
37356     for (uint32_t n = 4; n <= 6; n += 2) {
37357       for (size_t k = 1; k <= 20; k += 5) {
37358         GemmMicrokernelTester()
37359           .mr(4)
37360           .nr(2)
37361           .kr(4)
37362           .sr(1)
37363           .m(4)
37364           .n(n)
37365           .k(k)
37366           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37367       }
37368     }
37369   }
37370 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,n_div_2_strided_cn)37371   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, n_div_2_strided_cn) {
37372     for (uint32_t n = 4; n <= 6; n += 2) {
37373       for (size_t k = 1; k <= 20; k += 5) {
37374         GemmMicrokernelTester()
37375           .mr(4)
37376           .nr(2)
37377           .kr(4)
37378           .sr(1)
37379           .m(4)
37380           .n(n)
37381           .k(k)
37382           .cn_stride(5)
37383           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37384       }
37385     }
37386   }
37387 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,n_div_2_strided_a)37388   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, n_div_2_strided_a) {
37389     for (uint32_t n = 4; n <= 6; n += 2) {
37390       for (size_t k = 1; k <= 20; k += 5) {
37391         GemmMicrokernelTester()
37392           .mr(4)
37393           .nr(2)
37394           .kr(4)
37395           .sr(1)
37396           .m(4)
37397           .n(n)
37398           .k(k)
37399           .a_stride(23)
37400           .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37401       }
37402     }
37403   }
37404 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,n_div_2_subtile)37405   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, n_div_2_subtile) {
37406     for (uint32_t n = 4; n <= 6; n += 2) {
37407       for (size_t k = 1; k <= 20; k += 5) {
37408         for (uint32_t m = 1; m <= 4; m++) {
37409           GemmMicrokernelTester()
37410             .mr(4)
37411             .nr(2)
37412             .kr(4)
37413             .sr(1)
37414             .m(m)
37415             .n(n)
37416             .k(k)
37417             .iterations(1)
37418             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37419         }
37420       }
37421     }
37422   }
37423 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,strided_cm_subtile)37424   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, strided_cm_subtile) {
37425     for (size_t k = 1; k <= 20; k += 5) {
37426       for (uint32_t n = 1; n <= 2; n++) {
37427         for (uint32_t m = 1; m <= 4; m++) {
37428           GemmMicrokernelTester()
37429             .mr(4)
37430             .nr(2)
37431             .kr(4)
37432             .sr(1)
37433             .m(m)
37434             .n(n)
37435             .k(k)
37436             .cm_stride(5)
37437             .iterations(1)
37438             .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37439         }
37440       }
37441     }
37442   }
37443 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,qmin)37444   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, qmin) {
37445     GemmMicrokernelTester()
37446       .mr(4)
37447       .nr(2)
37448       .kr(4)
37449       .sr(1)
37450       .m(4)
37451       .n(2)
37452       .k(4)
37453       .qmin(128)
37454       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37455   }
37456 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,qmax)37457   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, qmax) {
37458     GemmMicrokernelTester()
37459       .mr(4)
37460       .nr(2)
37461       .kr(4)
37462       .sr(1)
37463       .m(4)
37464       .n(2)
37465       .k(4)
37466       .qmax(128)
37467       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37468   }
37469 
TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA,strided_cm)37470   TEST(F32_GEMM_MINMAX_4X2C4__WASMRELAXEDSIMD_FMA, strided_cm) {
37471     GemmMicrokernelTester()
37472       .mr(4)
37473       .nr(2)
37474       .kr(4)
37475       .sr(1)
37476       .m(4)
37477       .n(2)
37478       .k(4)
37479       .cm_stride(5)
37480       .Test(xnn_f32_gemm_minmax_ukernel_4x2c4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
37481   }
37482 #endif  // XNN_ARCH_WASMRELAXEDSIMD
37483 
37484 
37485 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1)37486   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1) {
37487     GemmMicrokernelTester()
37488       .mr(4)
37489       .nr(8)
37490       .kr(1)
37491       .sr(1)
37492       .m(4)
37493       .n(8)
37494       .k(1)
37495       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37496   }
37497 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cn)37498   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cn) {
37499     GemmMicrokernelTester()
37500       .mr(4)
37501       .nr(8)
37502       .kr(1)
37503       .sr(1)
37504       .m(4)
37505       .n(8)
37506       .k(1)
37507       .cn_stride(11)
37508       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37509   }
37510 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_strided_a)37511   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_strided_a) {
37512     GemmMicrokernelTester()
37513       .mr(4)
37514       .nr(8)
37515       .kr(1)
37516       .sr(1)
37517       .m(4)
37518       .n(8)
37519       .k(1)
37520       .a_stride(3)
37521       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37522   }
37523 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile)37524   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile) {
37525     for (uint32_t n = 1; n <= 8; n++) {
37526       for (uint32_t m = 1; m <= 4; m++) {
37527         GemmMicrokernelTester()
37528           .mr(4)
37529           .nr(8)
37530           .kr(1)
37531           .sr(1)
37532           .m(m)
37533           .n(n)
37534           .k(1)
37535           .iterations(1)
37536           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37537       }
37538     }
37539   }
37540 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile_m)37541   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile_m) {
37542     for (uint32_t m = 1; m <= 4; m++) {
37543       GemmMicrokernelTester()
37544         .mr(4)
37545         .nr(8)
37546         .kr(1)
37547         .sr(1)
37548         .m(m)
37549         .n(8)
37550         .k(1)
37551         .iterations(1)
37552         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37553     }
37554   }
37555 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile_n)37556   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile_n) {
37557     for (uint32_t n = 1; n <= 8; n++) {
37558       GemmMicrokernelTester()
37559         .mr(4)
37560         .nr(8)
37561         .kr(1)
37562         .sr(1)
37563         .m(4)
37564         .n(n)
37565         .k(1)
37566         .iterations(1)
37567         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37568     }
37569   }
37570 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1)37571   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1) {
37572     for (size_t k = 2; k < 10; k++) {
37573       GemmMicrokernelTester()
37574         .mr(4)
37575         .nr(8)
37576         .kr(1)
37577         .sr(1)
37578         .m(4)
37579         .n(8)
37580         .k(k)
37581         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37582     }
37583   }
37584 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1_strided_a)37585   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1_strided_a) {
37586     for (size_t k = 2; k < 10; k++) {
37587       GemmMicrokernelTester()
37588         .mr(4)
37589         .nr(8)
37590         .kr(1)
37591         .sr(1)
37592         .m(4)
37593         .n(8)
37594         .k(k)
37595         .a_stride(11)
37596         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37597     }
37598   }
37599 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1_subtile)37600   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1_subtile) {
37601     for (size_t k = 2; k < 10; k++) {
37602       for (uint32_t n = 1; n <= 8; n++) {
37603         for (uint32_t m = 1; m <= 4; m++) {
37604           GemmMicrokernelTester()
37605             .mr(4)
37606             .nr(8)
37607             .kr(1)
37608             .sr(1)
37609             .m(m)
37610             .n(n)
37611             .k(k)
37612             .iterations(1)
37613             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37614         }
37615       }
37616     }
37617   }
37618 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8)37619   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8) {
37620     for (uint32_t n = 9; n < 16; n++) {
37621       for (size_t k = 1; k <= 5; k += 2) {
37622         GemmMicrokernelTester()
37623           .mr(4)
37624           .nr(8)
37625           .kr(1)
37626           .sr(1)
37627           .m(4)
37628           .n(n)
37629           .k(k)
37630           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37631       }
37632     }
37633   }
37634 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_strided_cn)37635   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_strided_cn) {
37636     for (uint32_t n = 9; n < 16; n++) {
37637       for (size_t k = 1; k <= 5; k += 2) {
37638         GemmMicrokernelTester()
37639           .mr(4)
37640           .nr(8)
37641           .kr(1)
37642           .sr(1)
37643           .m(4)
37644           .n(n)
37645           .k(k)
37646           .cn_stride(11)
37647           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37648       }
37649     }
37650   }
37651 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_strided_a)37652   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_strided_a) {
37653     for (uint32_t n = 9; n < 16; n++) {
37654       for (size_t k = 1; k <= 5; k += 2) {
37655         GemmMicrokernelTester()
37656           .mr(4)
37657           .nr(8)
37658           .kr(1)
37659           .sr(1)
37660           .m(4)
37661           .n(n)
37662           .k(k)
37663           .a_stride(7)
37664           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37665       }
37666     }
37667   }
37668 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_subtile)37669   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_subtile) {
37670     for (uint32_t n = 9; n < 16; n++) {
37671       for (size_t k = 1; k <= 5; k += 2) {
37672         for (uint32_t m = 1; m <= 4; m++) {
37673           GemmMicrokernelTester()
37674             .mr(4)
37675             .nr(8)
37676             .kr(1)
37677             .sr(1)
37678             .m(m)
37679             .n(n)
37680             .k(k)
37681             .iterations(1)
37682             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37683         }
37684       }
37685     }
37686   }
37687 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8)37688   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8) {
37689     for (uint32_t n = 16; n <= 24; n += 8) {
37690       for (size_t k = 1; k <= 5; k += 2) {
37691         GemmMicrokernelTester()
37692           .mr(4)
37693           .nr(8)
37694           .kr(1)
37695           .sr(1)
37696           .m(4)
37697           .n(n)
37698           .k(k)
37699           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37700       }
37701     }
37702   }
37703 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_strided_cn)37704   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_strided_cn) {
37705     for (uint32_t n = 16; n <= 24; n += 8) {
37706       for (size_t k = 1; k <= 5; k += 2) {
37707         GemmMicrokernelTester()
37708           .mr(4)
37709           .nr(8)
37710           .kr(1)
37711           .sr(1)
37712           .m(4)
37713           .n(n)
37714           .k(k)
37715           .cn_stride(11)
37716           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37717       }
37718     }
37719   }
37720 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_strided_a)37721   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_strided_a) {
37722     for (uint32_t n = 16; n <= 24; n += 8) {
37723       for (size_t k = 1; k <= 5; k += 2) {
37724         GemmMicrokernelTester()
37725           .mr(4)
37726           .nr(8)
37727           .kr(1)
37728           .sr(1)
37729           .m(4)
37730           .n(n)
37731           .k(k)
37732           .a_stride(7)
37733           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37734       }
37735     }
37736   }
37737 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_subtile)37738   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_subtile) {
37739     for (uint32_t n = 16; n <= 24; n += 8) {
37740       for (size_t k = 1; k <= 5; k += 2) {
37741         for (uint32_t m = 1; m <= 4; m++) {
37742           GemmMicrokernelTester()
37743             .mr(4)
37744             .nr(8)
37745             .kr(1)
37746             .sr(1)
37747             .m(m)
37748             .n(n)
37749             .k(k)
37750             .iterations(1)
37751             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37752         }
37753       }
37754     }
37755   }
37756 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cm_subtile)37757   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cm_subtile) {
37758     for (size_t k = 1; k <= 5; k += 2) {
37759       for (uint32_t n = 1; n <= 8; n++) {
37760         for (uint32_t m = 1; m <= 4; m++) {
37761           GemmMicrokernelTester()
37762             .mr(4)
37763             .nr(8)
37764             .kr(1)
37765             .sr(1)
37766             .m(m)
37767             .n(n)
37768             .k(k)
37769             .cm_stride(11)
37770             .iterations(1)
37771             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37772         }
37773       }
37774     }
37775   }
37776 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,qmin)37777   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, qmin) {
37778     GemmMicrokernelTester()
37779       .mr(4)
37780       .nr(8)
37781       .kr(1)
37782       .sr(1)
37783       .m(4)
37784       .n(8)
37785       .k(1)
37786       .qmin(128)
37787       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37788   }
37789 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,qmax)37790   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, qmax) {
37791     GemmMicrokernelTester()
37792       .mr(4)
37793       .nr(8)
37794       .kr(1)
37795       .sr(1)
37796       .m(4)
37797       .n(8)
37798       .k(1)
37799       .qmax(128)
37800       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37801   }
37802 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cm)37803   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cm) {
37804     GemmMicrokernelTester()
37805       .mr(4)
37806       .nr(8)
37807       .kr(1)
37808       .sr(1)
37809       .m(4)
37810       .n(8)
37811       .k(1)
37812       .cm_stride(11)
37813       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
37814   }
37815 #endif  // XNN_ARCH_WASMRELAXEDSIMD
37816 
37817 
37818 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4)37819   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4) {
37820     GemmMicrokernelTester()
37821       .mr(4)
37822       .nr(8)
37823       .kr(1)
37824       .sr(1)
37825       .m(4)
37826       .n(8)
37827       .k(4)
37828       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37829   }
37830 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cn)37831   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cn) {
37832     GemmMicrokernelTester()
37833       .mr(4)
37834       .nr(8)
37835       .kr(1)
37836       .sr(1)
37837       .m(4)
37838       .n(8)
37839       .k(4)
37840       .cn_stride(11)
37841       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37842   }
37843 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_strided_a)37844   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_strided_a) {
37845     GemmMicrokernelTester()
37846       .mr(4)
37847       .nr(8)
37848       .kr(1)
37849       .sr(1)
37850       .m(4)
37851       .n(8)
37852       .k(4)
37853       .a_stride(7)
37854       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37855   }
37856 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile)37857   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile) {
37858     for (uint32_t n = 1; n <= 8; n++) {
37859       for (uint32_t m = 1; m <= 4; m++) {
37860         GemmMicrokernelTester()
37861           .mr(4)
37862           .nr(8)
37863           .kr(1)
37864           .sr(1)
37865           .m(m)
37866           .n(n)
37867           .k(4)
37868           .iterations(1)
37869           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37870       }
37871     }
37872   }
37873 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile_m)37874   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile_m) {
37875     for (uint32_t m = 1; m <= 4; m++) {
37876       GemmMicrokernelTester()
37877         .mr(4)
37878         .nr(8)
37879         .kr(1)
37880         .sr(1)
37881         .m(m)
37882         .n(8)
37883         .k(4)
37884         .iterations(1)
37885         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37886     }
37887   }
37888 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile_n)37889   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile_n) {
37890     for (uint32_t n = 1; n <= 8; n++) {
37891       GemmMicrokernelTester()
37892         .mr(4)
37893         .nr(8)
37894         .kr(1)
37895         .sr(1)
37896         .m(4)
37897         .n(n)
37898         .k(4)
37899         .iterations(1)
37900         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37901     }
37902   }
37903 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4)37904   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4) {
37905     for (size_t k = 1; k < 4; k++) {
37906       GemmMicrokernelTester()
37907         .mr(4)
37908         .nr(8)
37909         .kr(1)
37910         .sr(1)
37911         .m(4)
37912         .n(8)
37913         .k(k)
37914         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37915     }
37916   }
37917 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4_strided_a)37918   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4_strided_a) {
37919     for (size_t k = 1; k < 4; k++) {
37920       GemmMicrokernelTester()
37921         .mr(4)
37922         .nr(8)
37923         .kr(1)
37924         .sr(1)
37925         .m(4)
37926         .n(8)
37927         .k(k)
37928         .a_stride(7)
37929         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37930     }
37931   }
37932 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4_subtile)37933   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4_subtile) {
37934     for (size_t k = 1; k < 4; k++) {
37935       for (uint32_t n = 1; n <= 8; n++) {
37936         for (uint32_t m = 1; m <= 4; m++) {
37937           GemmMicrokernelTester()
37938             .mr(4)
37939             .nr(8)
37940             .kr(1)
37941             .sr(1)
37942             .m(m)
37943             .n(n)
37944             .k(k)
37945             .iterations(1)
37946             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37947         }
37948       }
37949     }
37950   }
37951 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4)37952   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4) {
37953     for (size_t k = 5; k < 8; k++) {
37954       GemmMicrokernelTester()
37955         .mr(4)
37956         .nr(8)
37957         .kr(1)
37958         .sr(1)
37959         .m(4)
37960         .n(8)
37961         .k(k)
37962         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37963     }
37964   }
37965 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4_strided_a)37966   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4_strided_a) {
37967     for (size_t k = 5; k < 8; k++) {
37968       GemmMicrokernelTester()
37969         .mr(4)
37970         .nr(8)
37971         .kr(1)
37972         .sr(1)
37973         .m(4)
37974         .n(8)
37975         .k(k)
37976         .a_stride(11)
37977         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37978     }
37979   }
37980 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4_subtile)37981   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4_subtile) {
37982     for (size_t k = 5; k < 8; k++) {
37983       for (uint32_t n = 1; n <= 8; n++) {
37984         for (uint32_t m = 1; m <= 4; m++) {
37985           GemmMicrokernelTester()
37986             .mr(4)
37987             .nr(8)
37988             .kr(1)
37989             .sr(1)
37990             .m(m)
37991             .n(n)
37992             .k(k)
37993             .iterations(1)
37994             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
37995         }
37996       }
37997     }
37998   }
37999 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4)38000   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4) {
38001     for (size_t k = 8; k <= 40; k += 4) {
38002       GemmMicrokernelTester()
38003         .mr(4)
38004         .nr(8)
38005         .kr(1)
38006         .sr(1)
38007         .m(4)
38008         .n(8)
38009         .k(k)
38010         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38011     }
38012   }
38013 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4_strided_a)38014   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4_strided_a) {
38015     for (size_t k = 8; k <= 40; k += 4) {
38016       GemmMicrokernelTester()
38017         .mr(4)
38018         .nr(8)
38019         .kr(1)
38020         .sr(1)
38021         .m(4)
38022         .n(8)
38023         .k(k)
38024         .a_stride(43)
38025         .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38026     }
38027   }
38028 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4_subtile)38029   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4_subtile) {
38030     for (size_t k = 8; k <= 40; k += 4) {
38031       for (uint32_t n = 1; n <= 8; n++) {
38032         for (uint32_t m = 1; m <= 4; m++) {
38033           GemmMicrokernelTester()
38034             .mr(4)
38035             .nr(8)
38036             .kr(1)
38037             .sr(1)
38038             .m(m)
38039             .n(n)
38040             .k(k)
38041             .iterations(1)
38042             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38043         }
38044       }
38045     }
38046   }
38047 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8)38048   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8) {
38049     for (uint32_t n = 9; n < 16; n++) {
38050       for (size_t k = 1; k <= 20; k += 5) {
38051         GemmMicrokernelTester()
38052           .mr(4)
38053           .nr(8)
38054           .kr(1)
38055           .sr(1)
38056           .m(4)
38057           .n(n)
38058           .k(k)
38059           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38060       }
38061     }
38062   }
38063 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_strided_cn)38064   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_strided_cn) {
38065     for (uint32_t n = 9; n < 16; n++) {
38066       for (size_t k = 1; k <= 20; k += 5) {
38067         GemmMicrokernelTester()
38068           .mr(4)
38069           .nr(8)
38070           .kr(1)
38071           .sr(1)
38072           .m(4)
38073           .n(n)
38074           .k(k)
38075           .cn_stride(11)
38076           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38077       }
38078     }
38079   }
38080 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_strided_a)38081   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_strided_a) {
38082     for (uint32_t n = 9; n < 16; n++) {
38083       for (size_t k = 1; k <= 20; k += 5) {
38084         GemmMicrokernelTester()
38085           .mr(4)
38086           .nr(8)
38087           .kr(1)
38088           .sr(1)
38089           .m(4)
38090           .n(n)
38091           .k(k)
38092           .a_stride(23)
38093           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38094       }
38095     }
38096   }
38097 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_subtile)38098   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_subtile) {
38099     for (uint32_t n = 9; n < 16; n++) {
38100       for (size_t k = 1; k <= 20; k += 5) {
38101         for (uint32_t m = 1; m <= 4; m++) {
38102           GemmMicrokernelTester()
38103             .mr(4)
38104             .nr(8)
38105             .kr(1)
38106             .sr(1)
38107             .m(m)
38108             .n(n)
38109             .k(k)
38110             .iterations(1)
38111             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38112         }
38113       }
38114     }
38115   }
38116 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8)38117   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8) {
38118     for (uint32_t n = 16; n <= 24; n += 8) {
38119       for (size_t k = 1; k <= 20; k += 5) {
38120         GemmMicrokernelTester()
38121           .mr(4)
38122           .nr(8)
38123           .kr(1)
38124           .sr(1)
38125           .m(4)
38126           .n(n)
38127           .k(k)
38128           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38129       }
38130     }
38131   }
38132 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_strided_cn)38133   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_strided_cn) {
38134     for (uint32_t n = 16; n <= 24; n += 8) {
38135       for (size_t k = 1; k <= 20; k += 5) {
38136         GemmMicrokernelTester()
38137           .mr(4)
38138           .nr(8)
38139           .kr(1)
38140           .sr(1)
38141           .m(4)
38142           .n(n)
38143           .k(k)
38144           .cn_stride(11)
38145           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38146       }
38147     }
38148   }
38149 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_strided_a)38150   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_strided_a) {
38151     for (uint32_t n = 16; n <= 24; n += 8) {
38152       for (size_t k = 1; k <= 20; k += 5) {
38153         GemmMicrokernelTester()
38154           .mr(4)
38155           .nr(8)
38156           .kr(1)
38157           .sr(1)
38158           .m(4)
38159           .n(n)
38160           .k(k)
38161           .a_stride(23)
38162           .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38163       }
38164     }
38165   }
38166 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_subtile)38167   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_subtile) {
38168     for (uint32_t n = 16; n <= 24; n += 8) {
38169       for (size_t k = 1; k <= 20; k += 5) {
38170         for (uint32_t m = 1; m <= 4; m++) {
38171           GemmMicrokernelTester()
38172             .mr(4)
38173             .nr(8)
38174             .kr(1)
38175             .sr(1)
38176             .m(m)
38177             .n(n)
38178             .k(k)
38179             .iterations(1)
38180             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38181         }
38182       }
38183     }
38184   }
38185 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cm_subtile)38186   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cm_subtile) {
38187     for (size_t k = 1; k <= 20; k += 5) {
38188       for (uint32_t n = 1; n <= 8; n++) {
38189         for (uint32_t m = 1; m <= 4; m++) {
38190           GemmMicrokernelTester()
38191             .mr(4)
38192             .nr(8)
38193             .kr(1)
38194             .sr(1)
38195             .m(m)
38196             .n(n)
38197             .k(k)
38198             .cm_stride(11)
38199             .iterations(1)
38200             .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38201         }
38202       }
38203     }
38204   }
38205 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,qmin)38206   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, qmin) {
38207     GemmMicrokernelTester()
38208       .mr(4)
38209       .nr(8)
38210       .kr(1)
38211       .sr(1)
38212       .m(4)
38213       .n(8)
38214       .k(4)
38215       .qmin(128)
38216       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38217   }
38218 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,qmax)38219   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, qmax) {
38220     GemmMicrokernelTester()
38221       .mr(4)
38222       .nr(8)
38223       .kr(1)
38224       .sr(1)
38225       .m(4)
38226       .n(8)
38227       .k(4)
38228       .qmax(128)
38229       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38230   }
38231 
TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cm)38232   TEST(F32_GEMM_MINMAX_4X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cm) {
38233     GemmMicrokernelTester()
38234       .mr(4)
38235       .nr(8)
38236       .kr(1)
38237       .sr(1)
38238       .m(4)
38239       .n(8)
38240       .k(4)
38241       .cm_stride(11)
38242       .Test(xnn_f32_gemm_minmax_ukernel_4x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
38243   }
38244 #endif  // XNN_ARCH_WASMRELAXEDSIMD
38245 
38246 
38247 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_eq_4)38248   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_eq_4) {
38249     GemmMicrokernelTester()
38250       .mr(4)
38251       .nr(8)
38252       .kr(1)
38253       .sr(4)
38254       .m(4)
38255       .n(8)
38256       .k(4)
38257       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38258   }
38259 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,strided_cn)38260   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, strided_cn) {
38261     GemmMicrokernelTester()
38262       .mr(4)
38263       .nr(8)
38264       .kr(1)
38265       .sr(4)
38266       .m(4)
38267       .n(8)
38268       .k(4)
38269       .cn_stride(11)
38270       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38271   }
38272 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_eq_4_strided_a)38273   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_eq_4_strided_a) {
38274     GemmMicrokernelTester()
38275       .mr(4)
38276       .nr(8)
38277       .kr(1)
38278       .sr(4)
38279       .m(4)
38280       .n(8)
38281       .k(4)
38282       .a_stride(7)
38283       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38284   }
38285 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_eq_4_subtile)38286   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_eq_4_subtile) {
38287     for (uint32_t n = 1; n <= 8; n++) {
38288       for (uint32_t m = 1; m <= 4; m++) {
38289         GemmMicrokernelTester()
38290           .mr(4)
38291           .nr(8)
38292           .kr(1)
38293           .sr(4)
38294           .m(m)
38295           .n(n)
38296           .k(4)
38297           .iterations(1)
38298           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38299       }
38300     }
38301   }
38302 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_eq_4_subtile_m)38303   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_eq_4_subtile_m) {
38304     for (uint32_t m = 1; m <= 4; m++) {
38305       GemmMicrokernelTester()
38306         .mr(4)
38307         .nr(8)
38308         .kr(1)
38309         .sr(4)
38310         .m(m)
38311         .n(8)
38312         .k(4)
38313         .iterations(1)
38314         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38315     }
38316   }
38317 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_eq_4_subtile_n)38318   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_eq_4_subtile_n) {
38319     for (uint32_t n = 1; n <= 8; n++) {
38320       GemmMicrokernelTester()
38321         .mr(4)
38322         .nr(8)
38323         .kr(1)
38324         .sr(4)
38325         .m(4)
38326         .n(n)
38327         .k(4)
38328         .iterations(1)
38329         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38330     }
38331   }
38332 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_lt_4)38333   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_lt_4) {
38334     for (size_t k = 1; k < 4; k++) {
38335       GemmMicrokernelTester()
38336         .mr(4)
38337         .nr(8)
38338         .kr(1)
38339         .sr(4)
38340         .m(4)
38341         .n(8)
38342         .k(k)
38343         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38344     }
38345   }
38346 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_lt_4_strided_a)38347   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_lt_4_strided_a) {
38348     for (size_t k = 1; k < 4; k++) {
38349       GemmMicrokernelTester()
38350         .mr(4)
38351         .nr(8)
38352         .kr(1)
38353         .sr(4)
38354         .m(4)
38355         .n(8)
38356         .k(k)
38357         .a_stride(7)
38358         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38359     }
38360   }
38361 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_lt_4_subtile)38362   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_lt_4_subtile) {
38363     for (size_t k = 1; k < 4; k++) {
38364       for (uint32_t n = 1; n <= 8; n++) {
38365         for (uint32_t m = 1; m <= 4; m++) {
38366           GemmMicrokernelTester()
38367             .mr(4)
38368             .nr(8)
38369             .kr(1)
38370             .sr(4)
38371             .m(m)
38372             .n(n)
38373             .k(k)
38374             .iterations(1)
38375             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38376         }
38377       }
38378     }
38379   }
38380 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_gt_4)38381   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_gt_4) {
38382     for (size_t k = 5; k < 8; k++) {
38383       GemmMicrokernelTester()
38384         .mr(4)
38385         .nr(8)
38386         .kr(1)
38387         .sr(4)
38388         .m(4)
38389         .n(8)
38390         .k(k)
38391         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38392     }
38393   }
38394 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_gt_4_strided_a)38395   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_gt_4_strided_a) {
38396     for (size_t k = 5; k < 8; k++) {
38397       GemmMicrokernelTester()
38398         .mr(4)
38399         .nr(8)
38400         .kr(1)
38401         .sr(4)
38402         .m(4)
38403         .n(8)
38404         .k(k)
38405         .a_stride(11)
38406         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38407     }
38408   }
38409 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_gt_4_subtile)38410   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_gt_4_subtile) {
38411     for (size_t k = 5; k < 8; k++) {
38412       for (uint32_t n = 1; n <= 8; n++) {
38413         for (uint32_t m = 1; m <= 4; m++) {
38414           GemmMicrokernelTester()
38415             .mr(4)
38416             .nr(8)
38417             .kr(1)
38418             .sr(4)
38419             .m(m)
38420             .n(n)
38421             .k(k)
38422             .iterations(1)
38423             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38424         }
38425       }
38426     }
38427   }
38428 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_div_4)38429   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_div_4) {
38430     for (size_t k = 8; k <= 40; k += 4) {
38431       GemmMicrokernelTester()
38432         .mr(4)
38433         .nr(8)
38434         .kr(1)
38435         .sr(4)
38436         .m(4)
38437         .n(8)
38438         .k(k)
38439         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38440     }
38441   }
38442 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_div_4_strided_a)38443   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_div_4_strided_a) {
38444     for (size_t k = 8; k <= 40; k += 4) {
38445       GemmMicrokernelTester()
38446         .mr(4)
38447         .nr(8)
38448         .kr(1)
38449         .sr(4)
38450         .m(4)
38451         .n(8)
38452         .k(k)
38453         .a_stride(43)
38454         .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38455     }
38456   }
38457 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,k_div_4_subtile)38458   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, k_div_4_subtile) {
38459     for (size_t k = 8; k <= 40; k += 4) {
38460       for (uint32_t n = 1; n <= 8; n++) {
38461         for (uint32_t m = 1; m <= 4; m++) {
38462           GemmMicrokernelTester()
38463             .mr(4)
38464             .nr(8)
38465             .kr(1)
38466             .sr(4)
38467             .m(m)
38468             .n(n)
38469             .k(k)
38470             .iterations(1)
38471             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38472         }
38473       }
38474     }
38475   }
38476 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,n_gt_8)38477   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, n_gt_8) {
38478     for (uint32_t n = 9; n < 16; n++) {
38479       for (size_t k = 1; k <= 20; k += 5) {
38480         GemmMicrokernelTester()
38481           .mr(4)
38482           .nr(8)
38483           .kr(1)
38484           .sr(4)
38485           .m(4)
38486           .n(n)
38487           .k(k)
38488           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38489       }
38490     }
38491   }
38492 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,n_gt_8_strided_cn)38493   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, n_gt_8_strided_cn) {
38494     for (uint32_t n = 9; n < 16; n++) {
38495       for (size_t k = 1; k <= 20; k += 5) {
38496         GemmMicrokernelTester()
38497           .mr(4)
38498           .nr(8)
38499           .kr(1)
38500           .sr(4)
38501           .m(4)
38502           .n(n)
38503           .k(k)
38504           .cn_stride(11)
38505           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38506       }
38507     }
38508   }
38509 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,n_gt_8_strided_a)38510   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, n_gt_8_strided_a) {
38511     for (uint32_t n = 9; n < 16; n++) {
38512       for (size_t k = 1; k <= 20; k += 5) {
38513         GemmMicrokernelTester()
38514           .mr(4)
38515           .nr(8)
38516           .kr(1)
38517           .sr(4)
38518           .m(4)
38519           .n(n)
38520           .k(k)
38521           .a_stride(23)
38522           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38523       }
38524     }
38525   }
38526 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,n_gt_8_subtile)38527   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, n_gt_8_subtile) {
38528     for (uint32_t n = 9; n < 16; n++) {
38529       for (size_t k = 1; k <= 20; k += 5) {
38530         for (uint32_t m = 1; m <= 4; m++) {
38531           GemmMicrokernelTester()
38532             .mr(4)
38533             .nr(8)
38534             .kr(1)
38535             .sr(4)
38536             .m(m)
38537             .n(n)
38538             .k(k)
38539             .iterations(1)
38540             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38541         }
38542       }
38543     }
38544   }
38545 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,n_div_8)38546   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, n_div_8) {
38547     for (uint32_t n = 16; n <= 24; n += 8) {
38548       for (size_t k = 1; k <= 20; k += 5) {
38549         GemmMicrokernelTester()
38550           .mr(4)
38551           .nr(8)
38552           .kr(1)
38553           .sr(4)
38554           .m(4)
38555           .n(n)
38556           .k(k)
38557           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38558       }
38559     }
38560   }
38561 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,n_div_8_strided_cn)38562   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, n_div_8_strided_cn) {
38563     for (uint32_t n = 16; n <= 24; n += 8) {
38564       for (size_t k = 1; k <= 20; k += 5) {
38565         GemmMicrokernelTester()
38566           .mr(4)
38567           .nr(8)
38568           .kr(1)
38569           .sr(4)
38570           .m(4)
38571           .n(n)
38572           .k(k)
38573           .cn_stride(11)
38574           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38575       }
38576     }
38577   }
38578 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,n_div_8_strided_a)38579   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, n_div_8_strided_a) {
38580     for (uint32_t n = 16; n <= 24; n += 8) {
38581       for (size_t k = 1; k <= 20; k += 5) {
38582         GemmMicrokernelTester()
38583           .mr(4)
38584           .nr(8)
38585           .kr(1)
38586           .sr(4)
38587           .m(4)
38588           .n(n)
38589           .k(k)
38590           .a_stride(23)
38591           .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38592       }
38593     }
38594   }
38595 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,n_div_8_subtile)38596   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, n_div_8_subtile) {
38597     for (uint32_t n = 16; n <= 24; n += 8) {
38598       for (size_t k = 1; k <= 20; k += 5) {
38599         for (uint32_t m = 1; m <= 4; m++) {
38600           GemmMicrokernelTester()
38601             .mr(4)
38602             .nr(8)
38603             .kr(1)
38604             .sr(4)
38605             .m(m)
38606             .n(n)
38607             .k(k)
38608             .iterations(1)
38609             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38610         }
38611       }
38612     }
38613   }
38614 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,strided_cm_subtile)38615   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, strided_cm_subtile) {
38616     for (size_t k = 1; k <= 20; k += 5) {
38617       for (uint32_t n = 1; n <= 8; n++) {
38618         for (uint32_t m = 1; m <= 4; m++) {
38619           GemmMicrokernelTester()
38620             .mr(4)
38621             .nr(8)
38622             .kr(1)
38623             .sr(4)
38624             .m(m)
38625             .n(n)
38626             .k(k)
38627             .cm_stride(11)
38628             .iterations(1)
38629             .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38630         }
38631       }
38632     }
38633   }
38634 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,qmin)38635   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, qmin) {
38636     GemmMicrokernelTester()
38637       .mr(4)
38638       .nr(8)
38639       .kr(1)
38640       .sr(4)
38641       .m(4)
38642       .n(8)
38643       .k(4)
38644       .qmin(128)
38645       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38646   }
38647 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,qmax)38648   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, qmax) {
38649     GemmMicrokernelTester()
38650       .mr(4)
38651       .nr(8)
38652       .kr(1)
38653       .sr(4)
38654       .m(4)
38655       .n(8)
38656       .k(4)
38657       .qmax(128)
38658       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38659   }
38660 
TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD,strided_cm)38661   TEST(F32_GEMM_MINMAX_4X8S4__WASMRELAXEDSIMD, strided_cm) {
38662     GemmMicrokernelTester()
38663       .mr(4)
38664       .nr(8)
38665       .kr(1)
38666       .sr(4)
38667       .m(4)
38668       .n(8)
38669       .k(4)
38670       .cm_stride(11)
38671       .Test(xnn_f32_gemm_minmax_ukernel_4x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
38672   }
38673 #endif  // XNN_ARCH_WASMRELAXEDSIMD
38674 
38675 
38676 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1)38677   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1) {
38678     GemmMicrokernelTester()
38679       .mr(5)
38680       .nr(8)
38681       .kr(1)
38682       .sr(1)
38683       .m(5)
38684       .n(8)
38685       .k(1)
38686       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38687   }
38688 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cn)38689   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cn) {
38690     GemmMicrokernelTester()
38691       .mr(5)
38692       .nr(8)
38693       .kr(1)
38694       .sr(1)
38695       .m(5)
38696       .n(8)
38697       .k(1)
38698       .cn_stride(11)
38699       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38700   }
38701 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_strided_a)38702   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_strided_a) {
38703     GemmMicrokernelTester()
38704       .mr(5)
38705       .nr(8)
38706       .kr(1)
38707       .sr(1)
38708       .m(5)
38709       .n(8)
38710       .k(1)
38711       .a_stride(3)
38712       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38713   }
38714 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile)38715   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile) {
38716     for (uint32_t n = 1; n <= 8; n++) {
38717       for (uint32_t m = 1; m <= 5; m++) {
38718         GemmMicrokernelTester()
38719           .mr(5)
38720           .nr(8)
38721           .kr(1)
38722           .sr(1)
38723           .m(m)
38724           .n(n)
38725           .k(1)
38726           .iterations(1)
38727           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38728       }
38729     }
38730   }
38731 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile_m)38732   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile_m) {
38733     for (uint32_t m = 1; m <= 5; m++) {
38734       GemmMicrokernelTester()
38735         .mr(5)
38736         .nr(8)
38737         .kr(1)
38738         .sr(1)
38739         .m(m)
38740         .n(8)
38741         .k(1)
38742         .iterations(1)
38743         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38744     }
38745   }
38746 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile_n)38747   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile_n) {
38748     for (uint32_t n = 1; n <= 8; n++) {
38749       GemmMicrokernelTester()
38750         .mr(5)
38751         .nr(8)
38752         .kr(1)
38753         .sr(1)
38754         .m(5)
38755         .n(n)
38756         .k(1)
38757         .iterations(1)
38758         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38759     }
38760   }
38761 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1)38762   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1) {
38763     for (size_t k = 2; k < 10; k++) {
38764       GemmMicrokernelTester()
38765         .mr(5)
38766         .nr(8)
38767         .kr(1)
38768         .sr(1)
38769         .m(5)
38770         .n(8)
38771         .k(k)
38772         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38773     }
38774   }
38775 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1_strided_a)38776   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1_strided_a) {
38777     for (size_t k = 2; k < 10; k++) {
38778       GemmMicrokernelTester()
38779         .mr(5)
38780         .nr(8)
38781         .kr(1)
38782         .sr(1)
38783         .m(5)
38784         .n(8)
38785         .k(k)
38786         .a_stride(11)
38787         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38788     }
38789   }
38790 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1_subtile)38791   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1_subtile) {
38792     for (size_t k = 2; k < 10; k++) {
38793       for (uint32_t n = 1; n <= 8; n++) {
38794         for (uint32_t m = 1; m <= 5; m++) {
38795           GemmMicrokernelTester()
38796             .mr(5)
38797             .nr(8)
38798             .kr(1)
38799             .sr(1)
38800             .m(m)
38801             .n(n)
38802             .k(k)
38803             .iterations(1)
38804             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38805         }
38806       }
38807     }
38808   }
38809 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8)38810   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8) {
38811     for (uint32_t n = 9; n < 16; n++) {
38812       for (size_t k = 1; k <= 5; k += 2) {
38813         GemmMicrokernelTester()
38814           .mr(5)
38815           .nr(8)
38816           .kr(1)
38817           .sr(1)
38818           .m(5)
38819           .n(n)
38820           .k(k)
38821           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38822       }
38823     }
38824   }
38825 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_strided_cn)38826   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_strided_cn) {
38827     for (uint32_t n = 9; n < 16; n++) {
38828       for (size_t k = 1; k <= 5; k += 2) {
38829         GemmMicrokernelTester()
38830           .mr(5)
38831           .nr(8)
38832           .kr(1)
38833           .sr(1)
38834           .m(5)
38835           .n(n)
38836           .k(k)
38837           .cn_stride(11)
38838           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38839       }
38840     }
38841   }
38842 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_strided_a)38843   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_strided_a) {
38844     for (uint32_t n = 9; n < 16; n++) {
38845       for (size_t k = 1; k <= 5; k += 2) {
38846         GemmMicrokernelTester()
38847           .mr(5)
38848           .nr(8)
38849           .kr(1)
38850           .sr(1)
38851           .m(5)
38852           .n(n)
38853           .k(k)
38854           .a_stride(7)
38855           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38856       }
38857     }
38858   }
38859 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_subtile)38860   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_subtile) {
38861     for (uint32_t n = 9; n < 16; n++) {
38862       for (size_t k = 1; k <= 5; k += 2) {
38863         for (uint32_t m = 1; m <= 5; m++) {
38864           GemmMicrokernelTester()
38865             .mr(5)
38866             .nr(8)
38867             .kr(1)
38868             .sr(1)
38869             .m(m)
38870             .n(n)
38871             .k(k)
38872             .iterations(1)
38873             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38874         }
38875       }
38876     }
38877   }
38878 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8)38879   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8) {
38880     for (uint32_t n = 16; n <= 24; n += 8) {
38881       for (size_t k = 1; k <= 5; k += 2) {
38882         GemmMicrokernelTester()
38883           .mr(5)
38884           .nr(8)
38885           .kr(1)
38886           .sr(1)
38887           .m(5)
38888           .n(n)
38889           .k(k)
38890           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38891       }
38892     }
38893   }
38894 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_strided_cn)38895   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_strided_cn) {
38896     for (uint32_t n = 16; n <= 24; n += 8) {
38897       for (size_t k = 1; k <= 5; k += 2) {
38898         GemmMicrokernelTester()
38899           .mr(5)
38900           .nr(8)
38901           .kr(1)
38902           .sr(1)
38903           .m(5)
38904           .n(n)
38905           .k(k)
38906           .cn_stride(11)
38907           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38908       }
38909     }
38910   }
38911 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_strided_a)38912   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_strided_a) {
38913     for (uint32_t n = 16; n <= 24; n += 8) {
38914       for (size_t k = 1; k <= 5; k += 2) {
38915         GemmMicrokernelTester()
38916           .mr(5)
38917           .nr(8)
38918           .kr(1)
38919           .sr(1)
38920           .m(5)
38921           .n(n)
38922           .k(k)
38923           .a_stride(7)
38924           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38925       }
38926     }
38927   }
38928 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_subtile)38929   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_subtile) {
38930     for (uint32_t n = 16; n <= 24; n += 8) {
38931       for (size_t k = 1; k <= 5; k += 2) {
38932         for (uint32_t m = 1; m <= 5; m++) {
38933           GemmMicrokernelTester()
38934             .mr(5)
38935             .nr(8)
38936             .kr(1)
38937             .sr(1)
38938             .m(m)
38939             .n(n)
38940             .k(k)
38941             .iterations(1)
38942             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38943         }
38944       }
38945     }
38946   }
38947 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cm_subtile)38948   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cm_subtile) {
38949     for (size_t k = 1; k <= 5; k += 2) {
38950       for (uint32_t n = 1; n <= 8; n++) {
38951         for (uint32_t m = 1; m <= 5; m++) {
38952           GemmMicrokernelTester()
38953             .mr(5)
38954             .nr(8)
38955             .kr(1)
38956             .sr(1)
38957             .m(m)
38958             .n(n)
38959             .k(k)
38960             .cm_stride(11)
38961             .iterations(1)
38962             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38963         }
38964       }
38965     }
38966   }
38967 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,qmin)38968   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, qmin) {
38969     GemmMicrokernelTester()
38970       .mr(5)
38971       .nr(8)
38972       .kr(1)
38973       .sr(1)
38974       .m(5)
38975       .n(8)
38976       .k(1)
38977       .qmin(128)
38978       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38979   }
38980 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,qmax)38981   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, qmax) {
38982     GemmMicrokernelTester()
38983       .mr(5)
38984       .nr(8)
38985       .kr(1)
38986       .sr(1)
38987       .m(5)
38988       .n(8)
38989       .k(1)
38990       .qmax(128)
38991       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
38992   }
38993 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cm)38994   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cm) {
38995     GemmMicrokernelTester()
38996       .mr(5)
38997       .nr(8)
38998       .kr(1)
38999       .sr(1)
39000       .m(5)
39001       .n(8)
39002       .k(1)
39003       .cm_stride(11)
39004       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
39005   }
39006 #endif  // XNN_ARCH_WASMRELAXEDSIMD
39007 
39008 
39009 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4)39010   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4) {
39011     GemmMicrokernelTester()
39012       .mr(5)
39013       .nr(8)
39014       .kr(1)
39015       .sr(1)
39016       .m(5)
39017       .n(8)
39018       .k(4)
39019       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39020   }
39021 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cn)39022   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cn) {
39023     GemmMicrokernelTester()
39024       .mr(5)
39025       .nr(8)
39026       .kr(1)
39027       .sr(1)
39028       .m(5)
39029       .n(8)
39030       .k(4)
39031       .cn_stride(11)
39032       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39033   }
39034 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_strided_a)39035   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_strided_a) {
39036     GemmMicrokernelTester()
39037       .mr(5)
39038       .nr(8)
39039       .kr(1)
39040       .sr(1)
39041       .m(5)
39042       .n(8)
39043       .k(4)
39044       .a_stride(7)
39045       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39046   }
39047 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile)39048   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile) {
39049     for (uint32_t n = 1; n <= 8; n++) {
39050       for (uint32_t m = 1; m <= 5; m++) {
39051         GemmMicrokernelTester()
39052           .mr(5)
39053           .nr(8)
39054           .kr(1)
39055           .sr(1)
39056           .m(m)
39057           .n(n)
39058           .k(4)
39059           .iterations(1)
39060           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39061       }
39062     }
39063   }
39064 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile_m)39065   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile_m) {
39066     for (uint32_t m = 1; m <= 5; m++) {
39067       GemmMicrokernelTester()
39068         .mr(5)
39069         .nr(8)
39070         .kr(1)
39071         .sr(1)
39072         .m(m)
39073         .n(8)
39074         .k(4)
39075         .iterations(1)
39076         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39077     }
39078   }
39079 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile_n)39080   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile_n) {
39081     for (uint32_t n = 1; n <= 8; n++) {
39082       GemmMicrokernelTester()
39083         .mr(5)
39084         .nr(8)
39085         .kr(1)
39086         .sr(1)
39087         .m(5)
39088         .n(n)
39089         .k(4)
39090         .iterations(1)
39091         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39092     }
39093   }
39094 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4)39095   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4) {
39096     for (size_t k = 1; k < 4; k++) {
39097       GemmMicrokernelTester()
39098         .mr(5)
39099         .nr(8)
39100         .kr(1)
39101         .sr(1)
39102         .m(5)
39103         .n(8)
39104         .k(k)
39105         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39106     }
39107   }
39108 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4_strided_a)39109   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4_strided_a) {
39110     for (size_t k = 1; k < 4; k++) {
39111       GemmMicrokernelTester()
39112         .mr(5)
39113         .nr(8)
39114         .kr(1)
39115         .sr(1)
39116         .m(5)
39117         .n(8)
39118         .k(k)
39119         .a_stride(7)
39120         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39121     }
39122   }
39123 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4_subtile)39124   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4_subtile) {
39125     for (size_t k = 1; k < 4; k++) {
39126       for (uint32_t n = 1; n <= 8; n++) {
39127         for (uint32_t m = 1; m <= 5; m++) {
39128           GemmMicrokernelTester()
39129             .mr(5)
39130             .nr(8)
39131             .kr(1)
39132             .sr(1)
39133             .m(m)
39134             .n(n)
39135             .k(k)
39136             .iterations(1)
39137             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39138         }
39139       }
39140     }
39141   }
39142 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4)39143   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4) {
39144     for (size_t k = 5; k < 8; k++) {
39145       GemmMicrokernelTester()
39146         .mr(5)
39147         .nr(8)
39148         .kr(1)
39149         .sr(1)
39150         .m(5)
39151         .n(8)
39152         .k(k)
39153         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39154     }
39155   }
39156 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4_strided_a)39157   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4_strided_a) {
39158     for (size_t k = 5; k < 8; k++) {
39159       GemmMicrokernelTester()
39160         .mr(5)
39161         .nr(8)
39162         .kr(1)
39163         .sr(1)
39164         .m(5)
39165         .n(8)
39166         .k(k)
39167         .a_stride(11)
39168         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39169     }
39170   }
39171 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4_subtile)39172   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4_subtile) {
39173     for (size_t k = 5; k < 8; k++) {
39174       for (uint32_t n = 1; n <= 8; n++) {
39175         for (uint32_t m = 1; m <= 5; m++) {
39176           GemmMicrokernelTester()
39177             .mr(5)
39178             .nr(8)
39179             .kr(1)
39180             .sr(1)
39181             .m(m)
39182             .n(n)
39183             .k(k)
39184             .iterations(1)
39185             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39186         }
39187       }
39188     }
39189   }
39190 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4)39191   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4) {
39192     for (size_t k = 8; k <= 40; k += 4) {
39193       GemmMicrokernelTester()
39194         .mr(5)
39195         .nr(8)
39196         .kr(1)
39197         .sr(1)
39198         .m(5)
39199         .n(8)
39200         .k(k)
39201         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39202     }
39203   }
39204 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4_strided_a)39205   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4_strided_a) {
39206     for (size_t k = 8; k <= 40; k += 4) {
39207       GemmMicrokernelTester()
39208         .mr(5)
39209         .nr(8)
39210         .kr(1)
39211         .sr(1)
39212         .m(5)
39213         .n(8)
39214         .k(k)
39215         .a_stride(43)
39216         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39217     }
39218   }
39219 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4_subtile)39220   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4_subtile) {
39221     for (size_t k = 8; k <= 40; k += 4) {
39222       for (uint32_t n = 1; n <= 8; n++) {
39223         for (uint32_t m = 1; m <= 5; m++) {
39224           GemmMicrokernelTester()
39225             .mr(5)
39226             .nr(8)
39227             .kr(1)
39228             .sr(1)
39229             .m(m)
39230             .n(n)
39231             .k(k)
39232             .iterations(1)
39233             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39234         }
39235       }
39236     }
39237   }
39238 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8)39239   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8) {
39240     for (uint32_t n = 9; n < 16; n++) {
39241       for (size_t k = 1; k <= 20; k += 5) {
39242         GemmMicrokernelTester()
39243           .mr(5)
39244           .nr(8)
39245           .kr(1)
39246           .sr(1)
39247           .m(5)
39248           .n(n)
39249           .k(k)
39250           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39251       }
39252     }
39253   }
39254 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_strided_cn)39255   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_strided_cn) {
39256     for (uint32_t n = 9; n < 16; n++) {
39257       for (size_t k = 1; k <= 20; k += 5) {
39258         GemmMicrokernelTester()
39259           .mr(5)
39260           .nr(8)
39261           .kr(1)
39262           .sr(1)
39263           .m(5)
39264           .n(n)
39265           .k(k)
39266           .cn_stride(11)
39267           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39268       }
39269     }
39270   }
39271 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_strided_a)39272   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_strided_a) {
39273     for (uint32_t n = 9; n < 16; n++) {
39274       for (size_t k = 1; k <= 20; k += 5) {
39275         GemmMicrokernelTester()
39276           .mr(5)
39277           .nr(8)
39278           .kr(1)
39279           .sr(1)
39280           .m(5)
39281           .n(n)
39282           .k(k)
39283           .a_stride(23)
39284           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39285       }
39286     }
39287   }
39288 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_subtile)39289   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_subtile) {
39290     for (uint32_t n = 9; n < 16; n++) {
39291       for (size_t k = 1; k <= 20; k += 5) {
39292         for (uint32_t m = 1; m <= 5; m++) {
39293           GemmMicrokernelTester()
39294             .mr(5)
39295             .nr(8)
39296             .kr(1)
39297             .sr(1)
39298             .m(m)
39299             .n(n)
39300             .k(k)
39301             .iterations(1)
39302             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39303         }
39304       }
39305     }
39306   }
39307 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8)39308   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8) {
39309     for (uint32_t n = 16; n <= 24; n += 8) {
39310       for (size_t k = 1; k <= 20; k += 5) {
39311         GemmMicrokernelTester()
39312           .mr(5)
39313           .nr(8)
39314           .kr(1)
39315           .sr(1)
39316           .m(5)
39317           .n(n)
39318           .k(k)
39319           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39320       }
39321     }
39322   }
39323 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_strided_cn)39324   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_strided_cn) {
39325     for (uint32_t n = 16; n <= 24; n += 8) {
39326       for (size_t k = 1; k <= 20; k += 5) {
39327         GemmMicrokernelTester()
39328           .mr(5)
39329           .nr(8)
39330           .kr(1)
39331           .sr(1)
39332           .m(5)
39333           .n(n)
39334           .k(k)
39335           .cn_stride(11)
39336           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39337       }
39338     }
39339   }
39340 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_strided_a)39341   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_strided_a) {
39342     for (uint32_t n = 16; n <= 24; n += 8) {
39343       for (size_t k = 1; k <= 20; k += 5) {
39344         GemmMicrokernelTester()
39345           .mr(5)
39346           .nr(8)
39347           .kr(1)
39348           .sr(1)
39349           .m(5)
39350           .n(n)
39351           .k(k)
39352           .a_stride(23)
39353           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39354       }
39355     }
39356   }
39357 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_subtile)39358   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_subtile) {
39359     for (uint32_t n = 16; n <= 24; n += 8) {
39360       for (size_t k = 1; k <= 20; k += 5) {
39361         for (uint32_t m = 1; m <= 5; m++) {
39362           GemmMicrokernelTester()
39363             .mr(5)
39364             .nr(8)
39365             .kr(1)
39366             .sr(1)
39367             .m(m)
39368             .n(n)
39369             .k(k)
39370             .iterations(1)
39371             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39372         }
39373       }
39374     }
39375   }
39376 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cm_subtile)39377   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cm_subtile) {
39378     for (size_t k = 1; k <= 20; k += 5) {
39379       for (uint32_t n = 1; n <= 8; n++) {
39380         for (uint32_t m = 1; m <= 5; m++) {
39381           GemmMicrokernelTester()
39382             .mr(5)
39383             .nr(8)
39384             .kr(1)
39385             .sr(1)
39386             .m(m)
39387             .n(n)
39388             .k(k)
39389             .cm_stride(11)
39390             .iterations(1)
39391             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39392         }
39393       }
39394     }
39395   }
39396 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,qmin)39397   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, qmin) {
39398     GemmMicrokernelTester()
39399       .mr(5)
39400       .nr(8)
39401       .kr(1)
39402       .sr(1)
39403       .m(5)
39404       .n(8)
39405       .k(4)
39406       .qmin(128)
39407       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39408   }
39409 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,qmax)39410   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, qmax) {
39411     GemmMicrokernelTester()
39412       .mr(5)
39413       .nr(8)
39414       .kr(1)
39415       .sr(1)
39416       .m(5)
39417       .n(8)
39418       .k(4)
39419       .qmax(128)
39420       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39421   }
39422 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cm)39423   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cm) {
39424     GemmMicrokernelTester()
39425       .mr(5)
39426       .nr(8)
39427       .kr(1)
39428       .sr(1)
39429       .m(5)
39430       .n(8)
39431       .k(4)
39432       .cm_stride(11)
39433       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
39434   }
39435 #endif  // XNN_ARCH_WASMRELAXEDSIMD
39436 
39437 
39438 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_eq_4)39439   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_eq_4) {
39440     GemmMicrokernelTester()
39441       .mr(5)
39442       .nr(8)
39443       .kr(1)
39444       .sr(1)
39445       .m(5)
39446       .n(8)
39447       .k(4)
39448       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39449   }
39450 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,strided_cn)39451   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, strided_cn) {
39452     GemmMicrokernelTester()
39453       .mr(5)
39454       .nr(8)
39455       .kr(1)
39456       .sr(1)
39457       .m(5)
39458       .n(8)
39459       .k(4)
39460       .cn_stride(11)
39461       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39462   }
39463 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_strided_a)39464   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_strided_a) {
39465     GemmMicrokernelTester()
39466       .mr(5)
39467       .nr(8)
39468       .kr(1)
39469       .sr(1)
39470       .m(5)
39471       .n(8)
39472       .k(4)
39473       .a_stride(7)
39474       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39475   }
39476 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_subtile)39477   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_subtile) {
39478     for (uint32_t n = 1; n <= 8; n++) {
39479       for (uint32_t m = 1; m <= 5; m++) {
39480         GemmMicrokernelTester()
39481           .mr(5)
39482           .nr(8)
39483           .kr(1)
39484           .sr(1)
39485           .m(m)
39486           .n(n)
39487           .k(4)
39488           .iterations(1)
39489           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39490       }
39491     }
39492   }
39493 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_subtile_m)39494   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_subtile_m) {
39495     for (uint32_t m = 1; m <= 5; m++) {
39496       GemmMicrokernelTester()
39497         .mr(5)
39498         .nr(8)
39499         .kr(1)
39500         .sr(1)
39501         .m(m)
39502         .n(8)
39503         .k(4)
39504         .iterations(1)
39505         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39506     }
39507   }
39508 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_subtile_n)39509   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_subtile_n) {
39510     for (uint32_t n = 1; n <= 8; n++) {
39511       GemmMicrokernelTester()
39512         .mr(5)
39513         .nr(8)
39514         .kr(1)
39515         .sr(1)
39516         .m(5)
39517         .n(n)
39518         .k(4)
39519         .iterations(1)
39520         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39521     }
39522   }
39523 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_lt_4)39524   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_lt_4) {
39525     for (size_t k = 1; k < 4; k++) {
39526       GemmMicrokernelTester()
39527         .mr(5)
39528         .nr(8)
39529         .kr(1)
39530         .sr(1)
39531         .m(5)
39532         .n(8)
39533         .k(k)
39534         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39535     }
39536   }
39537 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_lt_4_strided_a)39538   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_lt_4_strided_a) {
39539     for (size_t k = 1; k < 4; k++) {
39540       GemmMicrokernelTester()
39541         .mr(5)
39542         .nr(8)
39543         .kr(1)
39544         .sr(1)
39545         .m(5)
39546         .n(8)
39547         .k(k)
39548         .a_stride(7)
39549         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39550     }
39551   }
39552 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_lt_4_subtile)39553   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_lt_4_subtile) {
39554     for (size_t k = 1; k < 4; k++) {
39555       for (uint32_t n = 1; n <= 8; n++) {
39556         for (uint32_t m = 1; m <= 5; m++) {
39557           GemmMicrokernelTester()
39558             .mr(5)
39559             .nr(8)
39560             .kr(1)
39561             .sr(1)
39562             .m(m)
39563             .n(n)
39564             .k(k)
39565             .iterations(1)
39566             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39567         }
39568       }
39569     }
39570   }
39571 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_gt_4)39572   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_gt_4) {
39573     for (size_t k = 5; k < 8; k++) {
39574       GemmMicrokernelTester()
39575         .mr(5)
39576         .nr(8)
39577         .kr(1)
39578         .sr(1)
39579         .m(5)
39580         .n(8)
39581         .k(k)
39582         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39583     }
39584   }
39585 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_gt_4_strided_a)39586   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_gt_4_strided_a) {
39587     for (size_t k = 5; k < 8; k++) {
39588       GemmMicrokernelTester()
39589         .mr(5)
39590         .nr(8)
39591         .kr(1)
39592         .sr(1)
39593         .m(5)
39594         .n(8)
39595         .k(k)
39596         .a_stride(11)
39597         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39598     }
39599   }
39600 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_gt_4_subtile)39601   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_gt_4_subtile) {
39602     for (size_t k = 5; k < 8; k++) {
39603       for (uint32_t n = 1; n <= 8; n++) {
39604         for (uint32_t m = 1; m <= 5; m++) {
39605           GemmMicrokernelTester()
39606             .mr(5)
39607             .nr(8)
39608             .kr(1)
39609             .sr(1)
39610             .m(m)
39611             .n(n)
39612             .k(k)
39613             .iterations(1)
39614             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39615         }
39616       }
39617     }
39618   }
39619 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_div_4)39620   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_div_4) {
39621     for (size_t k = 8; k <= 40; k += 4) {
39622       GemmMicrokernelTester()
39623         .mr(5)
39624         .nr(8)
39625         .kr(1)
39626         .sr(1)
39627         .m(5)
39628         .n(8)
39629         .k(k)
39630         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39631     }
39632   }
39633 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_div_4_strided_a)39634   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_div_4_strided_a) {
39635     for (size_t k = 8; k <= 40; k += 4) {
39636       GemmMicrokernelTester()
39637         .mr(5)
39638         .nr(8)
39639         .kr(1)
39640         .sr(1)
39641         .m(5)
39642         .n(8)
39643         .k(k)
39644         .a_stride(43)
39645         .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39646     }
39647   }
39648 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,k_div_4_subtile)39649   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, k_div_4_subtile) {
39650     for (size_t k = 8; k <= 40; k += 4) {
39651       for (uint32_t n = 1; n <= 8; n++) {
39652         for (uint32_t m = 1; m <= 5; m++) {
39653           GemmMicrokernelTester()
39654             .mr(5)
39655             .nr(8)
39656             .kr(1)
39657             .sr(1)
39658             .m(m)
39659             .n(n)
39660             .k(k)
39661             .iterations(1)
39662             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39663         }
39664       }
39665     }
39666   }
39667 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,n_gt_8)39668   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, n_gt_8) {
39669     for (uint32_t n = 9; n < 16; n++) {
39670       for (size_t k = 1; k <= 20; k += 5) {
39671         GemmMicrokernelTester()
39672           .mr(5)
39673           .nr(8)
39674           .kr(1)
39675           .sr(1)
39676           .m(5)
39677           .n(n)
39678           .k(k)
39679           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39680       }
39681     }
39682   }
39683 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,n_gt_8_strided_cn)39684   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, n_gt_8_strided_cn) {
39685     for (uint32_t n = 9; n < 16; n++) {
39686       for (size_t k = 1; k <= 20; k += 5) {
39687         GemmMicrokernelTester()
39688           .mr(5)
39689           .nr(8)
39690           .kr(1)
39691           .sr(1)
39692           .m(5)
39693           .n(n)
39694           .k(k)
39695           .cn_stride(11)
39696           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39697       }
39698     }
39699   }
39700 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,n_gt_8_strided_a)39701   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, n_gt_8_strided_a) {
39702     for (uint32_t n = 9; n < 16; n++) {
39703       for (size_t k = 1; k <= 20; k += 5) {
39704         GemmMicrokernelTester()
39705           .mr(5)
39706           .nr(8)
39707           .kr(1)
39708           .sr(1)
39709           .m(5)
39710           .n(n)
39711           .k(k)
39712           .a_stride(23)
39713           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39714       }
39715     }
39716   }
39717 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,n_gt_8_subtile)39718   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, n_gt_8_subtile) {
39719     for (uint32_t n = 9; n < 16; n++) {
39720       for (size_t k = 1; k <= 20; k += 5) {
39721         for (uint32_t m = 1; m <= 5; m++) {
39722           GemmMicrokernelTester()
39723             .mr(5)
39724             .nr(8)
39725             .kr(1)
39726             .sr(1)
39727             .m(m)
39728             .n(n)
39729             .k(k)
39730             .iterations(1)
39731             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39732         }
39733       }
39734     }
39735   }
39736 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,n_div_8)39737   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, n_div_8) {
39738     for (uint32_t n = 16; n <= 24; n += 8) {
39739       for (size_t k = 1; k <= 20; k += 5) {
39740         GemmMicrokernelTester()
39741           .mr(5)
39742           .nr(8)
39743           .kr(1)
39744           .sr(1)
39745           .m(5)
39746           .n(n)
39747           .k(k)
39748           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39749       }
39750     }
39751   }
39752 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,n_div_8_strided_cn)39753   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, n_div_8_strided_cn) {
39754     for (uint32_t n = 16; n <= 24; n += 8) {
39755       for (size_t k = 1; k <= 20; k += 5) {
39756         GemmMicrokernelTester()
39757           .mr(5)
39758           .nr(8)
39759           .kr(1)
39760           .sr(1)
39761           .m(5)
39762           .n(n)
39763           .k(k)
39764           .cn_stride(11)
39765           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39766       }
39767     }
39768   }
39769 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,n_div_8_strided_a)39770   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, n_div_8_strided_a) {
39771     for (uint32_t n = 16; n <= 24; n += 8) {
39772       for (size_t k = 1; k <= 20; k += 5) {
39773         GemmMicrokernelTester()
39774           .mr(5)
39775           .nr(8)
39776           .kr(1)
39777           .sr(1)
39778           .m(5)
39779           .n(n)
39780           .k(k)
39781           .a_stride(23)
39782           .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39783       }
39784     }
39785   }
39786 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,n_div_8_subtile)39787   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, n_div_8_subtile) {
39788     for (uint32_t n = 16; n <= 24; n += 8) {
39789       for (size_t k = 1; k <= 20; k += 5) {
39790         for (uint32_t m = 1; m <= 5; m++) {
39791           GemmMicrokernelTester()
39792             .mr(5)
39793             .nr(8)
39794             .kr(1)
39795             .sr(1)
39796             .m(m)
39797             .n(n)
39798             .k(k)
39799             .iterations(1)
39800             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39801         }
39802       }
39803     }
39804   }
39805 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,strided_cm_subtile)39806   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, strided_cm_subtile) {
39807     for (size_t k = 1; k <= 20; k += 5) {
39808       for (uint32_t n = 1; n <= 8; n++) {
39809         for (uint32_t m = 1; m <= 5; m++) {
39810           GemmMicrokernelTester()
39811             .mr(5)
39812             .nr(8)
39813             .kr(1)
39814             .sr(1)
39815             .m(m)
39816             .n(n)
39817             .k(k)
39818             .cm_stride(11)
39819             .iterations(1)
39820             .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39821         }
39822       }
39823     }
39824   }
39825 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,qmin)39826   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, qmin) {
39827     GemmMicrokernelTester()
39828       .mr(5)
39829       .nr(8)
39830       .kr(1)
39831       .sr(1)
39832       .m(5)
39833       .n(8)
39834       .k(4)
39835       .qmin(128)
39836       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39837   }
39838 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,qmax)39839   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, qmax) {
39840     GemmMicrokernelTester()
39841       .mr(5)
39842       .nr(8)
39843       .kr(1)
39844       .sr(1)
39845       .m(5)
39846       .n(8)
39847       .k(4)
39848       .qmax(128)
39849       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39850   }
39851 
TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT,strided_cm)39852   TEST(F32_GEMM_MINMAX_5X8__WASMRELAXEDSIMD_SPLAT, strided_cm) {
39853     GemmMicrokernelTester()
39854       .mr(5)
39855       .nr(8)
39856       .kr(1)
39857       .sr(1)
39858       .m(5)
39859       .n(8)
39860       .k(4)
39861       .cm_stride(11)
39862       .Test(xnn_f32_gemm_minmax_ukernel_5x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
39863   }
39864 #endif  // XNN_ARCH_WASMRELAXEDSIMD
39865 
39866 
39867 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_eq_4)39868   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_eq_4) {
39869     GemmMicrokernelTester()
39870       .mr(5)
39871       .nr(8)
39872       .kr(1)
39873       .sr(4)
39874       .m(5)
39875       .n(8)
39876       .k(4)
39877       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
39878   }
39879 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,strided_cn)39880   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, strided_cn) {
39881     GemmMicrokernelTester()
39882       .mr(5)
39883       .nr(8)
39884       .kr(1)
39885       .sr(4)
39886       .m(5)
39887       .n(8)
39888       .k(4)
39889       .cn_stride(11)
39890       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
39891   }
39892 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_eq_4_strided_a)39893   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_eq_4_strided_a) {
39894     GemmMicrokernelTester()
39895       .mr(5)
39896       .nr(8)
39897       .kr(1)
39898       .sr(4)
39899       .m(5)
39900       .n(8)
39901       .k(4)
39902       .a_stride(7)
39903       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
39904   }
39905 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_eq_4_subtile)39906   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_eq_4_subtile) {
39907     for (uint32_t n = 1; n <= 8; n++) {
39908       for (uint32_t m = 1; m <= 5; m++) {
39909         GemmMicrokernelTester()
39910           .mr(5)
39911           .nr(8)
39912           .kr(1)
39913           .sr(4)
39914           .m(m)
39915           .n(n)
39916           .k(4)
39917           .iterations(1)
39918           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
39919       }
39920     }
39921   }
39922 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_eq_4_subtile_m)39923   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_eq_4_subtile_m) {
39924     for (uint32_t m = 1; m <= 5; m++) {
39925       GemmMicrokernelTester()
39926         .mr(5)
39927         .nr(8)
39928         .kr(1)
39929         .sr(4)
39930         .m(m)
39931         .n(8)
39932         .k(4)
39933         .iterations(1)
39934         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
39935     }
39936   }
39937 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_eq_4_subtile_n)39938   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_eq_4_subtile_n) {
39939     for (uint32_t n = 1; n <= 8; n++) {
39940       GemmMicrokernelTester()
39941         .mr(5)
39942         .nr(8)
39943         .kr(1)
39944         .sr(4)
39945         .m(5)
39946         .n(n)
39947         .k(4)
39948         .iterations(1)
39949         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
39950     }
39951   }
39952 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_lt_4)39953   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_lt_4) {
39954     for (size_t k = 1; k < 4; k++) {
39955       GemmMicrokernelTester()
39956         .mr(5)
39957         .nr(8)
39958         .kr(1)
39959         .sr(4)
39960         .m(5)
39961         .n(8)
39962         .k(k)
39963         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
39964     }
39965   }
39966 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_lt_4_strided_a)39967   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_lt_4_strided_a) {
39968     for (size_t k = 1; k < 4; k++) {
39969       GemmMicrokernelTester()
39970         .mr(5)
39971         .nr(8)
39972         .kr(1)
39973         .sr(4)
39974         .m(5)
39975         .n(8)
39976         .k(k)
39977         .a_stride(7)
39978         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
39979     }
39980   }
39981 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_lt_4_subtile)39982   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_lt_4_subtile) {
39983     for (size_t k = 1; k < 4; k++) {
39984       for (uint32_t n = 1; n <= 8; n++) {
39985         for (uint32_t m = 1; m <= 5; m++) {
39986           GemmMicrokernelTester()
39987             .mr(5)
39988             .nr(8)
39989             .kr(1)
39990             .sr(4)
39991             .m(m)
39992             .n(n)
39993             .k(k)
39994             .iterations(1)
39995             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
39996         }
39997       }
39998     }
39999   }
40000 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_gt_4)40001   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_gt_4) {
40002     for (size_t k = 5; k < 8; k++) {
40003       GemmMicrokernelTester()
40004         .mr(5)
40005         .nr(8)
40006         .kr(1)
40007         .sr(4)
40008         .m(5)
40009         .n(8)
40010         .k(k)
40011         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40012     }
40013   }
40014 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_gt_4_strided_a)40015   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_gt_4_strided_a) {
40016     for (size_t k = 5; k < 8; k++) {
40017       GemmMicrokernelTester()
40018         .mr(5)
40019         .nr(8)
40020         .kr(1)
40021         .sr(4)
40022         .m(5)
40023         .n(8)
40024         .k(k)
40025         .a_stride(11)
40026         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40027     }
40028   }
40029 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_gt_4_subtile)40030   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_gt_4_subtile) {
40031     for (size_t k = 5; k < 8; k++) {
40032       for (uint32_t n = 1; n <= 8; n++) {
40033         for (uint32_t m = 1; m <= 5; m++) {
40034           GemmMicrokernelTester()
40035             .mr(5)
40036             .nr(8)
40037             .kr(1)
40038             .sr(4)
40039             .m(m)
40040             .n(n)
40041             .k(k)
40042             .iterations(1)
40043             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40044         }
40045       }
40046     }
40047   }
40048 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_div_4)40049   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_div_4) {
40050     for (size_t k = 8; k <= 40; k += 4) {
40051       GemmMicrokernelTester()
40052         .mr(5)
40053         .nr(8)
40054         .kr(1)
40055         .sr(4)
40056         .m(5)
40057         .n(8)
40058         .k(k)
40059         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40060     }
40061   }
40062 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_div_4_strided_a)40063   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_div_4_strided_a) {
40064     for (size_t k = 8; k <= 40; k += 4) {
40065       GemmMicrokernelTester()
40066         .mr(5)
40067         .nr(8)
40068         .kr(1)
40069         .sr(4)
40070         .m(5)
40071         .n(8)
40072         .k(k)
40073         .a_stride(43)
40074         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40075     }
40076   }
40077 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,k_div_4_subtile)40078   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, k_div_4_subtile) {
40079     for (size_t k = 8; k <= 40; k += 4) {
40080       for (uint32_t n = 1; n <= 8; n++) {
40081         for (uint32_t m = 1; m <= 5; m++) {
40082           GemmMicrokernelTester()
40083             .mr(5)
40084             .nr(8)
40085             .kr(1)
40086             .sr(4)
40087             .m(m)
40088             .n(n)
40089             .k(k)
40090             .iterations(1)
40091             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40092         }
40093       }
40094     }
40095   }
40096 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,n_gt_8)40097   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, n_gt_8) {
40098     for (uint32_t n = 9; n < 16; n++) {
40099       for (size_t k = 1; k <= 20; k += 5) {
40100         GemmMicrokernelTester()
40101           .mr(5)
40102           .nr(8)
40103           .kr(1)
40104           .sr(4)
40105           .m(5)
40106           .n(n)
40107           .k(k)
40108           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40109       }
40110     }
40111   }
40112 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,n_gt_8_strided_cn)40113   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, n_gt_8_strided_cn) {
40114     for (uint32_t n = 9; n < 16; n++) {
40115       for (size_t k = 1; k <= 20; k += 5) {
40116         GemmMicrokernelTester()
40117           .mr(5)
40118           .nr(8)
40119           .kr(1)
40120           .sr(4)
40121           .m(5)
40122           .n(n)
40123           .k(k)
40124           .cn_stride(11)
40125           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40126       }
40127     }
40128   }
40129 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,n_gt_8_strided_a)40130   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, n_gt_8_strided_a) {
40131     for (uint32_t n = 9; n < 16; n++) {
40132       for (size_t k = 1; k <= 20; k += 5) {
40133         GemmMicrokernelTester()
40134           .mr(5)
40135           .nr(8)
40136           .kr(1)
40137           .sr(4)
40138           .m(5)
40139           .n(n)
40140           .k(k)
40141           .a_stride(23)
40142           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40143       }
40144     }
40145   }
40146 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,n_gt_8_subtile)40147   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, n_gt_8_subtile) {
40148     for (uint32_t n = 9; n < 16; n++) {
40149       for (size_t k = 1; k <= 20; k += 5) {
40150         for (uint32_t m = 1; m <= 5; m++) {
40151           GemmMicrokernelTester()
40152             .mr(5)
40153             .nr(8)
40154             .kr(1)
40155             .sr(4)
40156             .m(m)
40157             .n(n)
40158             .k(k)
40159             .iterations(1)
40160             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40161         }
40162       }
40163     }
40164   }
40165 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,n_div_8)40166   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, n_div_8) {
40167     for (uint32_t n = 16; n <= 24; n += 8) {
40168       for (size_t k = 1; k <= 20; k += 5) {
40169         GemmMicrokernelTester()
40170           .mr(5)
40171           .nr(8)
40172           .kr(1)
40173           .sr(4)
40174           .m(5)
40175           .n(n)
40176           .k(k)
40177           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40178       }
40179     }
40180   }
40181 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,n_div_8_strided_cn)40182   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, n_div_8_strided_cn) {
40183     for (uint32_t n = 16; n <= 24; n += 8) {
40184       for (size_t k = 1; k <= 20; k += 5) {
40185         GemmMicrokernelTester()
40186           .mr(5)
40187           .nr(8)
40188           .kr(1)
40189           .sr(4)
40190           .m(5)
40191           .n(n)
40192           .k(k)
40193           .cn_stride(11)
40194           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40195       }
40196     }
40197   }
40198 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,n_div_8_strided_a)40199   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, n_div_8_strided_a) {
40200     for (uint32_t n = 16; n <= 24; n += 8) {
40201       for (size_t k = 1; k <= 20; k += 5) {
40202         GemmMicrokernelTester()
40203           .mr(5)
40204           .nr(8)
40205           .kr(1)
40206           .sr(4)
40207           .m(5)
40208           .n(n)
40209           .k(k)
40210           .a_stride(23)
40211           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40212       }
40213     }
40214   }
40215 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,n_div_8_subtile)40216   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, n_div_8_subtile) {
40217     for (uint32_t n = 16; n <= 24; n += 8) {
40218       for (size_t k = 1; k <= 20; k += 5) {
40219         for (uint32_t m = 1; m <= 5; m++) {
40220           GemmMicrokernelTester()
40221             .mr(5)
40222             .nr(8)
40223             .kr(1)
40224             .sr(4)
40225             .m(m)
40226             .n(n)
40227             .k(k)
40228             .iterations(1)
40229             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40230         }
40231       }
40232     }
40233   }
40234 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,strided_cm_subtile)40235   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, strided_cm_subtile) {
40236     for (size_t k = 1; k <= 20; k += 5) {
40237       for (uint32_t n = 1; n <= 8; n++) {
40238         for (uint32_t m = 1; m <= 5; m++) {
40239           GemmMicrokernelTester()
40240             .mr(5)
40241             .nr(8)
40242             .kr(1)
40243             .sr(4)
40244             .m(m)
40245             .n(n)
40246             .k(k)
40247             .cm_stride(11)
40248             .iterations(1)
40249             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40250         }
40251       }
40252     }
40253   }
40254 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,qmin)40255   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, qmin) {
40256     GemmMicrokernelTester()
40257       .mr(5)
40258       .nr(8)
40259       .kr(1)
40260       .sr(4)
40261       .m(5)
40262       .n(8)
40263       .k(4)
40264       .qmin(128)
40265       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40266   }
40267 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,qmax)40268   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, qmax) {
40269     GemmMicrokernelTester()
40270       .mr(5)
40271       .nr(8)
40272       .kr(1)
40273       .sr(4)
40274       .m(5)
40275       .n(8)
40276       .k(4)
40277       .qmax(128)
40278       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40279   }
40280 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD,strided_cm)40281   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD, strided_cm) {
40282     GemmMicrokernelTester()
40283       .mr(5)
40284       .nr(8)
40285       .kr(1)
40286       .sr(4)
40287       .m(5)
40288       .n(8)
40289       .k(4)
40290       .cm_stride(11)
40291       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
40292   }
40293 #endif  // XNN_ARCH_WASMRELAXEDSIMD
40294 
40295 
40296 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_eq_4)40297   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_eq_4) {
40298     GemmMicrokernelTester()
40299       .mr(5)
40300       .nr(8)
40301       .kr(1)
40302       .sr(4)
40303       .m(5)
40304       .n(8)
40305       .k(4)
40306       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40307   }
40308 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,strided_cn)40309   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, strided_cn) {
40310     GemmMicrokernelTester()
40311       .mr(5)
40312       .nr(8)
40313       .kr(1)
40314       .sr(4)
40315       .m(5)
40316       .n(8)
40317       .k(4)
40318       .cn_stride(11)
40319       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40320   }
40321 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_strided_a)40322   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_strided_a) {
40323     GemmMicrokernelTester()
40324       .mr(5)
40325       .nr(8)
40326       .kr(1)
40327       .sr(4)
40328       .m(5)
40329       .n(8)
40330       .k(4)
40331       .a_stride(7)
40332       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40333   }
40334 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile)40335   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile) {
40336     for (uint32_t n = 1; n <= 8; n++) {
40337       for (uint32_t m = 1; m <= 5; m++) {
40338         GemmMicrokernelTester()
40339           .mr(5)
40340           .nr(8)
40341           .kr(1)
40342           .sr(4)
40343           .m(m)
40344           .n(n)
40345           .k(4)
40346           .iterations(1)
40347           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40348       }
40349     }
40350   }
40351 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile_m)40352   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile_m) {
40353     for (uint32_t m = 1; m <= 5; m++) {
40354       GemmMicrokernelTester()
40355         .mr(5)
40356         .nr(8)
40357         .kr(1)
40358         .sr(4)
40359         .m(m)
40360         .n(8)
40361         .k(4)
40362         .iterations(1)
40363         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40364     }
40365   }
40366 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile_n)40367   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile_n) {
40368     for (uint32_t n = 1; n <= 8; n++) {
40369       GemmMicrokernelTester()
40370         .mr(5)
40371         .nr(8)
40372         .kr(1)
40373         .sr(4)
40374         .m(5)
40375         .n(n)
40376         .k(4)
40377         .iterations(1)
40378         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40379     }
40380   }
40381 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_lt_4)40382   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_lt_4) {
40383     for (size_t k = 1; k < 4; k++) {
40384       GemmMicrokernelTester()
40385         .mr(5)
40386         .nr(8)
40387         .kr(1)
40388         .sr(4)
40389         .m(5)
40390         .n(8)
40391         .k(k)
40392         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40393     }
40394   }
40395 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_lt_4_strided_a)40396   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_lt_4_strided_a) {
40397     for (size_t k = 1; k < 4; k++) {
40398       GemmMicrokernelTester()
40399         .mr(5)
40400         .nr(8)
40401         .kr(1)
40402         .sr(4)
40403         .m(5)
40404         .n(8)
40405         .k(k)
40406         .a_stride(7)
40407         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40408     }
40409   }
40410 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_lt_4_subtile)40411   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_lt_4_subtile) {
40412     for (size_t k = 1; k < 4; k++) {
40413       for (uint32_t n = 1; n <= 8; n++) {
40414         for (uint32_t m = 1; m <= 5; m++) {
40415           GemmMicrokernelTester()
40416             .mr(5)
40417             .nr(8)
40418             .kr(1)
40419             .sr(4)
40420             .m(m)
40421             .n(n)
40422             .k(k)
40423             .iterations(1)
40424             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40425         }
40426       }
40427     }
40428   }
40429 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_gt_4)40430   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_gt_4) {
40431     for (size_t k = 5; k < 8; k++) {
40432       GemmMicrokernelTester()
40433         .mr(5)
40434         .nr(8)
40435         .kr(1)
40436         .sr(4)
40437         .m(5)
40438         .n(8)
40439         .k(k)
40440         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40441     }
40442   }
40443 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_gt_4_strided_a)40444   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_gt_4_strided_a) {
40445     for (size_t k = 5; k < 8; k++) {
40446       GemmMicrokernelTester()
40447         .mr(5)
40448         .nr(8)
40449         .kr(1)
40450         .sr(4)
40451         .m(5)
40452         .n(8)
40453         .k(k)
40454         .a_stride(11)
40455         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40456     }
40457   }
40458 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_gt_4_subtile)40459   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_gt_4_subtile) {
40460     for (size_t k = 5; k < 8; k++) {
40461       for (uint32_t n = 1; n <= 8; n++) {
40462         for (uint32_t m = 1; m <= 5; m++) {
40463           GemmMicrokernelTester()
40464             .mr(5)
40465             .nr(8)
40466             .kr(1)
40467             .sr(4)
40468             .m(m)
40469             .n(n)
40470             .k(k)
40471             .iterations(1)
40472             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40473         }
40474       }
40475     }
40476   }
40477 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_div_4)40478   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_div_4) {
40479     for (size_t k = 8; k <= 40; k += 4) {
40480       GemmMicrokernelTester()
40481         .mr(5)
40482         .nr(8)
40483         .kr(1)
40484         .sr(4)
40485         .m(5)
40486         .n(8)
40487         .k(k)
40488         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40489     }
40490   }
40491 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_div_4_strided_a)40492   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_div_4_strided_a) {
40493     for (size_t k = 8; k <= 40; k += 4) {
40494       GemmMicrokernelTester()
40495         .mr(5)
40496         .nr(8)
40497         .kr(1)
40498         .sr(4)
40499         .m(5)
40500         .n(8)
40501         .k(k)
40502         .a_stride(43)
40503         .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40504     }
40505   }
40506 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,k_div_4_subtile)40507   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, k_div_4_subtile) {
40508     for (size_t k = 8; k <= 40; k += 4) {
40509       for (uint32_t n = 1; n <= 8; n++) {
40510         for (uint32_t m = 1; m <= 5; m++) {
40511           GemmMicrokernelTester()
40512             .mr(5)
40513             .nr(8)
40514             .kr(1)
40515             .sr(4)
40516             .m(m)
40517             .n(n)
40518             .k(k)
40519             .iterations(1)
40520             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40521         }
40522       }
40523     }
40524   }
40525 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,n_gt_8)40526   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, n_gt_8) {
40527     for (uint32_t n = 9; n < 16; n++) {
40528       for (size_t k = 1; k <= 20; k += 5) {
40529         GemmMicrokernelTester()
40530           .mr(5)
40531           .nr(8)
40532           .kr(1)
40533           .sr(4)
40534           .m(5)
40535           .n(n)
40536           .k(k)
40537           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40538       }
40539     }
40540   }
40541 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,n_gt_8_strided_cn)40542   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, n_gt_8_strided_cn) {
40543     for (uint32_t n = 9; n < 16; n++) {
40544       for (size_t k = 1; k <= 20; k += 5) {
40545         GemmMicrokernelTester()
40546           .mr(5)
40547           .nr(8)
40548           .kr(1)
40549           .sr(4)
40550           .m(5)
40551           .n(n)
40552           .k(k)
40553           .cn_stride(11)
40554           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40555       }
40556     }
40557   }
40558 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,n_gt_8_strided_a)40559   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, n_gt_8_strided_a) {
40560     for (uint32_t n = 9; n < 16; n++) {
40561       for (size_t k = 1; k <= 20; k += 5) {
40562         GemmMicrokernelTester()
40563           .mr(5)
40564           .nr(8)
40565           .kr(1)
40566           .sr(4)
40567           .m(5)
40568           .n(n)
40569           .k(k)
40570           .a_stride(23)
40571           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40572       }
40573     }
40574   }
40575 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,n_gt_8_subtile)40576   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, n_gt_8_subtile) {
40577     for (uint32_t n = 9; n < 16; n++) {
40578       for (size_t k = 1; k <= 20; k += 5) {
40579         for (uint32_t m = 1; m <= 5; m++) {
40580           GemmMicrokernelTester()
40581             .mr(5)
40582             .nr(8)
40583             .kr(1)
40584             .sr(4)
40585             .m(m)
40586             .n(n)
40587             .k(k)
40588             .iterations(1)
40589             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40590         }
40591       }
40592     }
40593   }
40594 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,n_div_8)40595   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, n_div_8) {
40596     for (uint32_t n = 16; n <= 24; n += 8) {
40597       for (size_t k = 1; k <= 20; k += 5) {
40598         GemmMicrokernelTester()
40599           .mr(5)
40600           .nr(8)
40601           .kr(1)
40602           .sr(4)
40603           .m(5)
40604           .n(n)
40605           .k(k)
40606           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40607       }
40608     }
40609   }
40610 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,n_div_8_strided_cn)40611   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, n_div_8_strided_cn) {
40612     for (uint32_t n = 16; n <= 24; n += 8) {
40613       for (size_t k = 1; k <= 20; k += 5) {
40614         GemmMicrokernelTester()
40615           .mr(5)
40616           .nr(8)
40617           .kr(1)
40618           .sr(4)
40619           .m(5)
40620           .n(n)
40621           .k(k)
40622           .cn_stride(11)
40623           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40624       }
40625     }
40626   }
40627 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,n_div_8_strided_a)40628   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, n_div_8_strided_a) {
40629     for (uint32_t n = 16; n <= 24; n += 8) {
40630       for (size_t k = 1; k <= 20; k += 5) {
40631         GemmMicrokernelTester()
40632           .mr(5)
40633           .nr(8)
40634           .kr(1)
40635           .sr(4)
40636           .m(5)
40637           .n(n)
40638           .k(k)
40639           .a_stride(23)
40640           .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40641       }
40642     }
40643   }
40644 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,n_div_8_subtile)40645   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, n_div_8_subtile) {
40646     for (uint32_t n = 16; n <= 24; n += 8) {
40647       for (size_t k = 1; k <= 20; k += 5) {
40648         for (uint32_t m = 1; m <= 5; m++) {
40649           GemmMicrokernelTester()
40650             .mr(5)
40651             .nr(8)
40652             .kr(1)
40653             .sr(4)
40654             .m(m)
40655             .n(n)
40656             .k(k)
40657             .iterations(1)
40658             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40659         }
40660       }
40661     }
40662   }
40663 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,strided_cm_subtile)40664   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, strided_cm_subtile) {
40665     for (size_t k = 1; k <= 20; k += 5) {
40666       for (uint32_t n = 1; n <= 8; n++) {
40667         for (uint32_t m = 1; m <= 5; m++) {
40668           GemmMicrokernelTester()
40669             .mr(5)
40670             .nr(8)
40671             .kr(1)
40672             .sr(4)
40673             .m(m)
40674             .n(n)
40675             .k(k)
40676             .cm_stride(11)
40677             .iterations(1)
40678             .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40679         }
40680       }
40681     }
40682   }
40683 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,qmin)40684   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, qmin) {
40685     GemmMicrokernelTester()
40686       .mr(5)
40687       .nr(8)
40688       .kr(1)
40689       .sr(4)
40690       .m(5)
40691       .n(8)
40692       .k(4)
40693       .qmin(128)
40694       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40695   }
40696 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,qmax)40697   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, qmax) {
40698     GemmMicrokernelTester()
40699       .mr(5)
40700       .nr(8)
40701       .kr(1)
40702       .sr(4)
40703       .m(5)
40704       .n(8)
40705       .k(4)
40706       .qmax(128)
40707       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40708   }
40709 
TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA,strided_cm)40710   TEST(F32_GEMM_MINMAX_5X8S4__WASMRELAXEDSIMD_FMA, strided_cm) {
40711     GemmMicrokernelTester()
40712       .mr(5)
40713       .nr(8)
40714       .kr(1)
40715       .sr(4)
40716       .m(5)
40717       .n(8)
40718       .k(4)
40719       .cm_stride(11)
40720       .Test(xnn_f32_gemm_minmax_ukernel_5x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
40721   }
40722 #endif  // XNN_ARCH_WASMRELAXEDSIMD
40723 
40724 
40725 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1)40726   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1) {
40727     GemmMicrokernelTester()
40728       .mr(6)
40729       .nr(8)
40730       .kr(1)
40731       .sr(1)
40732       .m(6)
40733       .n(8)
40734       .k(1)
40735       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40736   }
40737 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cn)40738   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cn) {
40739     GemmMicrokernelTester()
40740       .mr(6)
40741       .nr(8)
40742       .kr(1)
40743       .sr(1)
40744       .m(6)
40745       .n(8)
40746       .k(1)
40747       .cn_stride(11)
40748       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40749   }
40750 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_strided_a)40751   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_strided_a) {
40752     GemmMicrokernelTester()
40753       .mr(6)
40754       .nr(8)
40755       .kr(1)
40756       .sr(1)
40757       .m(6)
40758       .n(8)
40759       .k(1)
40760       .a_stride(3)
40761       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40762   }
40763 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile)40764   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile) {
40765     for (uint32_t n = 1; n <= 8; n++) {
40766       for (uint32_t m = 1; m <= 6; m++) {
40767         GemmMicrokernelTester()
40768           .mr(6)
40769           .nr(8)
40770           .kr(1)
40771           .sr(1)
40772           .m(m)
40773           .n(n)
40774           .k(1)
40775           .iterations(1)
40776           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40777       }
40778     }
40779   }
40780 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile_m)40781   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile_m) {
40782     for (uint32_t m = 1; m <= 6; m++) {
40783       GemmMicrokernelTester()
40784         .mr(6)
40785         .nr(8)
40786         .kr(1)
40787         .sr(1)
40788         .m(m)
40789         .n(8)
40790         .k(1)
40791         .iterations(1)
40792         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40793     }
40794   }
40795 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_eq_1_subtile_n)40796   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_eq_1_subtile_n) {
40797     for (uint32_t n = 1; n <= 8; n++) {
40798       GemmMicrokernelTester()
40799         .mr(6)
40800         .nr(8)
40801         .kr(1)
40802         .sr(1)
40803         .m(6)
40804         .n(n)
40805         .k(1)
40806         .iterations(1)
40807         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40808     }
40809   }
40810 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1)40811   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1) {
40812     for (size_t k = 2; k < 10; k++) {
40813       GemmMicrokernelTester()
40814         .mr(6)
40815         .nr(8)
40816         .kr(1)
40817         .sr(1)
40818         .m(6)
40819         .n(8)
40820         .k(k)
40821         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40822     }
40823   }
40824 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1_strided_a)40825   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1_strided_a) {
40826     for (size_t k = 2; k < 10; k++) {
40827       GemmMicrokernelTester()
40828         .mr(6)
40829         .nr(8)
40830         .kr(1)
40831         .sr(1)
40832         .m(6)
40833         .n(8)
40834         .k(k)
40835         .a_stride(11)
40836         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40837     }
40838   }
40839 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,k_gt_1_subtile)40840   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, k_gt_1_subtile) {
40841     for (size_t k = 2; k < 10; k++) {
40842       for (uint32_t n = 1; n <= 8; n++) {
40843         for (uint32_t m = 1; m <= 6; m++) {
40844           GemmMicrokernelTester()
40845             .mr(6)
40846             .nr(8)
40847             .kr(1)
40848             .sr(1)
40849             .m(m)
40850             .n(n)
40851             .k(k)
40852             .iterations(1)
40853             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40854         }
40855       }
40856     }
40857   }
40858 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8)40859   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8) {
40860     for (uint32_t n = 9; n < 16; n++) {
40861       for (size_t k = 1; k <= 5; k += 2) {
40862         GemmMicrokernelTester()
40863           .mr(6)
40864           .nr(8)
40865           .kr(1)
40866           .sr(1)
40867           .m(6)
40868           .n(n)
40869           .k(k)
40870           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40871       }
40872     }
40873   }
40874 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_strided_cn)40875   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_strided_cn) {
40876     for (uint32_t n = 9; n < 16; n++) {
40877       for (size_t k = 1; k <= 5; k += 2) {
40878         GemmMicrokernelTester()
40879           .mr(6)
40880           .nr(8)
40881           .kr(1)
40882           .sr(1)
40883           .m(6)
40884           .n(n)
40885           .k(k)
40886           .cn_stride(11)
40887           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40888       }
40889     }
40890   }
40891 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_strided_a)40892   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_strided_a) {
40893     for (uint32_t n = 9; n < 16; n++) {
40894       for (size_t k = 1; k <= 5; k += 2) {
40895         GemmMicrokernelTester()
40896           .mr(6)
40897           .nr(8)
40898           .kr(1)
40899           .sr(1)
40900           .m(6)
40901           .n(n)
40902           .k(k)
40903           .a_stride(7)
40904           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40905       }
40906     }
40907   }
40908 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_gt_8_subtile)40909   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_gt_8_subtile) {
40910     for (uint32_t n = 9; n < 16; n++) {
40911       for (size_t k = 1; k <= 5; k += 2) {
40912         for (uint32_t m = 1; m <= 6; m++) {
40913           GemmMicrokernelTester()
40914             .mr(6)
40915             .nr(8)
40916             .kr(1)
40917             .sr(1)
40918             .m(m)
40919             .n(n)
40920             .k(k)
40921             .iterations(1)
40922             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40923         }
40924       }
40925     }
40926   }
40927 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8)40928   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8) {
40929     for (uint32_t n = 16; n <= 24; n += 8) {
40930       for (size_t k = 1; k <= 5; k += 2) {
40931         GemmMicrokernelTester()
40932           .mr(6)
40933           .nr(8)
40934           .kr(1)
40935           .sr(1)
40936           .m(6)
40937           .n(n)
40938           .k(k)
40939           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40940       }
40941     }
40942   }
40943 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_strided_cn)40944   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_strided_cn) {
40945     for (uint32_t n = 16; n <= 24; n += 8) {
40946       for (size_t k = 1; k <= 5; k += 2) {
40947         GemmMicrokernelTester()
40948           .mr(6)
40949           .nr(8)
40950           .kr(1)
40951           .sr(1)
40952           .m(6)
40953           .n(n)
40954           .k(k)
40955           .cn_stride(11)
40956           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40957       }
40958     }
40959   }
40960 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_strided_a)40961   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_strided_a) {
40962     for (uint32_t n = 16; n <= 24; n += 8) {
40963       for (size_t k = 1; k <= 5; k += 2) {
40964         GemmMicrokernelTester()
40965           .mr(6)
40966           .nr(8)
40967           .kr(1)
40968           .sr(1)
40969           .m(6)
40970           .n(n)
40971           .k(k)
40972           .a_stride(7)
40973           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40974       }
40975     }
40976   }
40977 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,n_div_8_subtile)40978   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, n_div_8_subtile) {
40979     for (uint32_t n = 16; n <= 24; n += 8) {
40980       for (size_t k = 1; k <= 5; k += 2) {
40981         for (uint32_t m = 1; m <= 6; m++) {
40982           GemmMicrokernelTester()
40983             .mr(6)
40984             .nr(8)
40985             .kr(1)
40986             .sr(1)
40987             .m(m)
40988             .n(n)
40989             .k(k)
40990             .iterations(1)
40991             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
40992         }
40993       }
40994     }
40995   }
40996 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cm_subtile)40997   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cm_subtile) {
40998     for (size_t k = 1; k <= 5; k += 2) {
40999       for (uint32_t n = 1; n <= 8; n++) {
41000         for (uint32_t m = 1; m <= 6; m++) {
41001           GemmMicrokernelTester()
41002             .mr(6)
41003             .nr(8)
41004             .kr(1)
41005             .sr(1)
41006             .m(m)
41007             .n(n)
41008             .k(k)
41009             .cm_stride(11)
41010             .iterations(1)
41011             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
41012         }
41013       }
41014     }
41015   }
41016 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,qmin)41017   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, qmin) {
41018     GemmMicrokernelTester()
41019       .mr(6)
41020       .nr(8)
41021       .kr(1)
41022       .sr(1)
41023       .m(6)
41024       .n(8)
41025       .k(1)
41026       .qmin(128)
41027       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
41028   }
41029 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,qmax)41030   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, qmax) {
41031     GemmMicrokernelTester()
41032       .mr(6)
41033       .nr(8)
41034       .kr(1)
41035       .sr(1)
41036       .m(6)
41037       .n(8)
41038       .k(1)
41039       .qmax(128)
41040       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
41041   }
41042 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT,strided_cm)41043   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_LOADSPLAT, strided_cm) {
41044     GemmMicrokernelTester()
41045       .mr(6)
41046       .nr(8)
41047       .kr(1)
41048       .sr(1)
41049       .m(6)
41050       .n(8)
41051       .k(1)
41052       .cm_stride(11)
41053       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_loadsplat, xnn_init_f32_minmax_wasmsimd_params);
41054   }
41055 #endif  // XNN_ARCH_WASMRELAXEDSIMD
41056 
41057 
41058 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4)41059   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4) {
41060     GemmMicrokernelTester()
41061       .mr(6)
41062       .nr(8)
41063       .kr(1)
41064       .sr(1)
41065       .m(6)
41066       .n(8)
41067       .k(4)
41068       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41069   }
41070 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cn)41071   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cn) {
41072     GemmMicrokernelTester()
41073       .mr(6)
41074       .nr(8)
41075       .kr(1)
41076       .sr(1)
41077       .m(6)
41078       .n(8)
41079       .k(4)
41080       .cn_stride(11)
41081       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41082   }
41083 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_strided_a)41084   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_strided_a) {
41085     GemmMicrokernelTester()
41086       .mr(6)
41087       .nr(8)
41088       .kr(1)
41089       .sr(1)
41090       .m(6)
41091       .n(8)
41092       .k(4)
41093       .a_stride(7)
41094       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41095   }
41096 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile)41097   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile) {
41098     for (uint32_t n = 1; n <= 8; n++) {
41099       for (uint32_t m = 1; m <= 6; m++) {
41100         GemmMicrokernelTester()
41101           .mr(6)
41102           .nr(8)
41103           .kr(1)
41104           .sr(1)
41105           .m(m)
41106           .n(n)
41107           .k(4)
41108           .iterations(1)
41109           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41110       }
41111     }
41112   }
41113 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile_m)41114   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile_m) {
41115     for (uint32_t m = 1; m <= 6; m++) {
41116       GemmMicrokernelTester()
41117         .mr(6)
41118         .nr(8)
41119         .kr(1)
41120         .sr(1)
41121         .m(m)
41122         .n(8)
41123         .k(4)
41124         .iterations(1)
41125         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41126     }
41127   }
41128 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_eq_4_subtile_n)41129   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_eq_4_subtile_n) {
41130     for (uint32_t n = 1; n <= 8; n++) {
41131       GemmMicrokernelTester()
41132         .mr(6)
41133         .nr(8)
41134         .kr(1)
41135         .sr(1)
41136         .m(6)
41137         .n(n)
41138         .k(4)
41139         .iterations(1)
41140         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41141     }
41142   }
41143 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4)41144   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4) {
41145     for (size_t k = 1; k < 4; k++) {
41146       GemmMicrokernelTester()
41147         .mr(6)
41148         .nr(8)
41149         .kr(1)
41150         .sr(1)
41151         .m(6)
41152         .n(8)
41153         .k(k)
41154         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41155     }
41156   }
41157 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4_strided_a)41158   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4_strided_a) {
41159     for (size_t k = 1; k < 4; k++) {
41160       GemmMicrokernelTester()
41161         .mr(6)
41162         .nr(8)
41163         .kr(1)
41164         .sr(1)
41165         .m(6)
41166         .n(8)
41167         .k(k)
41168         .a_stride(7)
41169         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41170     }
41171   }
41172 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_lt_4_subtile)41173   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_lt_4_subtile) {
41174     for (size_t k = 1; k < 4; k++) {
41175       for (uint32_t n = 1; n <= 8; n++) {
41176         for (uint32_t m = 1; m <= 6; m++) {
41177           GemmMicrokernelTester()
41178             .mr(6)
41179             .nr(8)
41180             .kr(1)
41181             .sr(1)
41182             .m(m)
41183             .n(n)
41184             .k(k)
41185             .iterations(1)
41186             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41187         }
41188       }
41189     }
41190   }
41191 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4)41192   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4) {
41193     for (size_t k = 5; k < 8; k++) {
41194       GemmMicrokernelTester()
41195         .mr(6)
41196         .nr(8)
41197         .kr(1)
41198         .sr(1)
41199         .m(6)
41200         .n(8)
41201         .k(k)
41202         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41203     }
41204   }
41205 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4_strided_a)41206   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4_strided_a) {
41207     for (size_t k = 5; k < 8; k++) {
41208       GemmMicrokernelTester()
41209         .mr(6)
41210         .nr(8)
41211         .kr(1)
41212         .sr(1)
41213         .m(6)
41214         .n(8)
41215         .k(k)
41216         .a_stride(11)
41217         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41218     }
41219   }
41220 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_gt_4_subtile)41221   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_gt_4_subtile) {
41222     for (size_t k = 5; k < 8; k++) {
41223       for (uint32_t n = 1; n <= 8; n++) {
41224         for (uint32_t m = 1; m <= 6; m++) {
41225           GemmMicrokernelTester()
41226             .mr(6)
41227             .nr(8)
41228             .kr(1)
41229             .sr(1)
41230             .m(m)
41231             .n(n)
41232             .k(k)
41233             .iterations(1)
41234             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41235         }
41236       }
41237     }
41238   }
41239 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4)41240   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4) {
41241     for (size_t k = 8; k <= 40; k += 4) {
41242       GemmMicrokernelTester()
41243         .mr(6)
41244         .nr(8)
41245         .kr(1)
41246         .sr(1)
41247         .m(6)
41248         .n(8)
41249         .k(k)
41250         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41251     }
41252   }
41253 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4_strided_a)41254   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4_strided_a) {
41255     for (size_t k = 8; k <= 40; k += 4) {
41256       GemmMicrokernelTester()
41257         .mr(6)
41258         .nr(8)
41259         .kr(1)
41260         .sr(1)
41261         .m(6)
41262         .n(8)
41263         .k(k)
41264         .a_stride(43)
41265         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41266     }
41267   }
41268 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,k_div_4_subtile)41269   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, k_div_4_subtile) {
41270     for (size_t k = 8; k <= 40; k += 4) {
41271       for (uint32_t n = 1; n <= 8; n++) {
41272         for (uint32_t m = 1; m <= 6; m++) {
41273           GemmMicrokernelTester()
41274             .mr(6)
41275             .nr(8)
41276             .kr(1)
41277             .sr(1)
41278             .m(m)
41279             .n(n)
41280             .k(k)
41281             .iterations(1)
41282             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41283         }
41284       }
41285     }
41286   }
41287 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8)41288   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8) {
41289     for (uint32_t n = 9; n < 16; n++) {
41290       for (size_t k = 1; k <= 20; k += 5) {
41291         GemmMicrokernelTester()
41292           .mr(6)
41293           .nr(8)
41294           .kr(1)
41295           .sr(1)
41296           .m(6)
41297           .n(n)
41298           .k(k)
41299           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41300       }
41301     }
41302   }
41303 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_strided_cn)41304   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_strided_cn) {
41305     for (uint32_t n = 9; n < 16; n++) {
41306       for (size_t k = 1; k <= 20; k += 5) {
41307         GemmMicrokernelTester()
41308           .mr(6)
41309           .nr(8)
41310           .kr(1)
41311           .sr(1)
41312           .m(6)
41313           .n(n)
41314           .k(k)
41315           .cn_stride(11)
41316           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41317       }
41318     }
41319   }
41320 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_strided_a)41321   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_strided_a) {
41322     for (uint32_t n = 9; n < 16; n++) {
41323       for (size_t k = 1; k <= 20; k += 5) {
41324         GemmMicrokernelTester()
41325           .mr(6)
41326           .nr(8)
41327           .kr(1)
41328           .sr(1)
41329           .m(6)
41330           .n(n)
41331           .k(k)
41332           .a_stride(23)
41333           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41334       }
41335     }
41336   }
41337 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,n_gt_8_subtile)41338   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, n_gt_8_subtile) {
41339     for (uint32_t n = 9; n < 16; n++) {
41340       for (size_t k = 1; k <= 20; k += 5) {
41341         for (uint32_t m = 1; m <= 6; m++) {
41342           GemmMicrokernelTester()
41343             .mr(6)
41344             .nr(8)
41345             .kr(1)
41346             .sr(1)
41347             .m(m)
41348             .n(n)
41349             .k(k)
41350             .iterations(1)
41351             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41352         }
41353       }
41354     }
41355   }
41356 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8)41357   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8) {
41358     for (uint32_t n = 16; n <= 24; n += 8) {
41359       for (size_t k = 1; k <= 20; k += 5) {
41360         GemmMicrokernelTester()
41361           .mr(6)
41362           .nr(8)
41363           .kr(1)
41364           .sr(1)
41365           .m(6)
41366           .n(n)
41367           .k(k)
41368           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41369       }
41370     }
41371   }
41372 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_strided_cn)41373   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_strided_cn) {
41374     for (uint32_t n = 16; n <= 24; n += 8) {
41375       for (size_t k = 1; k <= 20; k += 5) {
41376         GemmMicrokernelTester()
41377           .mr(6)
41378           .nr(8)
41379           .kr(1)
41380           .sr(1)
41381           .m(6)
41382           .n(n)
41383           .k(k)
41384           .cn_stride(11)
41385           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41386       }
41387     }
41388   }
41389 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_strided_a)41390   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_strided_a) {
41391     for (uint32_t n = 16; n <= 24; n += 8) {
41392       for (size_t k = 1; k <= 20; k += 5) {
41393         GemmMicrokernelTester()
41394           .mr(6)
41395           .nr(8)
41396           .kr(1)
41397           .sr(1)
41398           .m(6)
41399           .n(n)
41400           .k(k)
41401           .a_stride(23)
41402           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41403       }
41404     }
41405   }
41406 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,n_div_8_subtile)41407   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, n_div_8_subtile) {
41408     for (uint32_t n = 16; n <= 24; n += 8) {
41409       for (size_t k = 1; k <= 20; k += 5) {
41410         for (uint32_t m = 1; m <= 6; m++) {
41411           GemmMicrokernelTester()
41412             .mr(6)
41413             .nr(8)
41414             .kr(1)
41415             .sr(1)
41416             .m(m)
41417             .n(n)
41418             .k(k)
41419             .iterations(1)
41420             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41421         }
41422       }
41423     }
41424   }
41425 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cm_subtile)41426   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cm_subtile) {
41427     for (size_t k = 1; k <= 20; k += 5) {
41428       for (uint32_t n = 1; n <= 8; n++) {
41429         for (uint32_t m = 1; m <= 6; m++) {
41430           GemmMicrokernelTester()
41431             .mr(6)
41432             .nr(8)
41433             .kr(1)
41434             .sr(1)
41435             .m(m)
41436             .n(n)
41437             .k(k)
41438             .cm_stride(11)
41439             .iterations(1)
41440             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41441         }
41442       }
41443     }
41444   }
41445 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,qmin)41446   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, qmin) {
41447     GemmMicrokernelTester()
41448       .mr(6)
41449       .nr(8)
41450       .kr(1)
41451       .sr(1)
41452       .m(6)
41453       .n(8)
41454       .k(4)
41455       .qmin(128)
41456       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41457   }
41458 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,qmax)41459   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, qmax) {
41460     GemmMicrokernelTester()
41461       .mr(6)
41462       .nr(8)
41463       .kr(1)
41464       .sr(1)
41465       .m(6)
41466       .n(8)
41467       .k(4)
41468       .qmax(128)
41469       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41470   }
41471 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT,strided_cm)41472   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_FMA_SPLAT, strided_cm) {
41473     GemmMicrokernelTester()
41474       .mr(6)
41475       .nr(8)
41476       .kr(1)
41477       .sr(1)
41478       .m(6)
41479       .n(8)
41480       .k(4)
41481       .cm_stride(11)
41482       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_fma_splat, xnn_init_f32_minmax_wasmsimd_params);
41483   }
41484 #endif  // XNN_ARCH_WASMRELAXEDSIMD
41485 
41486 
41487 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_eq_4)41488   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_eq_4) {
41489     GemmMicrokernelTester()
41490       .mr(6)
41491       .nr(8)
41492       .kr(1)
41493       .sr(1)
41494       .m(6)
41495       .n(8)
41496       .k(4)
41497       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41498   }
41499 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,strided_cn)41500   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, strided_cn) {
41501     GemmMicrokernelTester()
41502       .mr(6)
41503       .nr(8)
41504       .kr(1)
41505       .sr(1)
41506       .m(6)
41507       .n(8)
41508       .k(4)
41509       .cn_stride(11)
41510       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41511   }
41512 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_strided_a)41513   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_strided_a) {
41514     GemmMicrokernelTester()
41515       .mr(6)
41516       .nr(8)
41517       .kr(1)
41518       .sr(1)
41519       .m(6)
41520       .n(8)
41521       .k(4)
41522       .a_stride(7)
41523       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41524   }
41525 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_subtile)41526   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_subtile) {
41527     for (uint32_t n = 1; n <= 8; n++) {
41528       for (uint32_t m = 1; m <= 6; m++) {
41529         GemmMicrokernelTester()
41530           .mr(6)
41531           .nr(8)
41532           .kr(1)
41533           .sr(1)
41534           .m(m)
41535           .n(n)
41536           .k(4)
41537           .iterations(1)
41538           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41539       }
41540     }
41541   }
41542 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_subtile_m)41543   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_subtile_m) {
41544     for (uint32_t m = 1; m <= 6; m++) {
41545       GemmMicrokernelTester()
41546         .mr(6)
41547         .nr(8)
41548         .kr(1)
41549         .sr(1)
41550         .m(m)
41551         .n(8)
41552         .k(4)
41553         .iterations(1)
41554         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41555     }
41556   }
41557 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_eq_4_subtile_n)41558   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_eq_4_subtile_n) {
41559     for (uint32_t n = 1; n <= 8; n++) {
41560       GemmMicrokernelTester()
41561         .mr(6)
41562         .nr(8)
41563         .kr(1)
41564         .sr(1)
41565         .m(6)
41566         .n(n)
41567         .k(4)
41568         .iterations(1)
41569         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41570     }
41571   }
41572 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_lt_4)41573   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_lt_4) {
41574     for (size_t k = 1; k < 4; k++) {
41575       GemmMicrokernelTester()
41576         .mr(6)
41577         .nr(8)
41578         .kr(1)
41579         .sr(1)
41580         .m(6)
41581         .n(8)
41582         .k(k)
41583         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41584     }
41585   }
41586 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_lt_4_strided_a)41587   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_lt_4_strided_a) {
41588     for (size_t k = 1; k < 4; k++) {
41589       GemmMicrokernelTester()
41590         .mr(6)
41591         .nr(8)
41592         .kr(1)
41593         .sr(1)
41594         .m(6)
41595         .n(8)
41596         .k(k)
41597         .a_stride(7)
41598         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41599     }
41600   }
41601 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_lt_4_subtile)41602   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_lt_4_subtile) {
41603     for (size_t k = 1; k < 4; k++) {
41604       for (uint32_t n = 1; n <= 8; n++) {
41605         for (uint32_t m = 1; m <= 6; m++) {
41606           GemmMicrokernelTester()
41607             .mr(6)
41608             .nr(8)
41609             .kr(1)
41610             .sr(1)
41611             .m(m)
41612             .n(n)
41613             .k(k)
41614             .iterations(1)
41615             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41616         }
41617       }
41618     }
41619   }
41620 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_gt_4)41621   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_gt_4) {
41622     for (size_t k = 5; k < 8; k++) {
41623       GemmMicrokernelTester()
41624         .mr(6)
41625         .nr(8)
41626         .kr(1)
41627         .sr(1)
41628         .m(6)
41629         .n(8)
41630         .k(k)
41631         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41632     }
41633   }
41634 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_gt_4_strided_a)41635   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_gt_4_strided_a) {
41636     for (size_t k = 5; k < 8; k++) {
41637       GemmMicrokernelTester()
41638         .mr(6)
41639         .nr(8)
41640         .kr(1)
41641         .sr(1)
41642         .m(6)
41643         .n(8)
41644         .k(k)
41645         .a_stride(11)
41646         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41647     }
41648   }
41649 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_gt_4_subtile)41650   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_gt_4_subtile) {
41651     for (size_t k = 5; k < 8; k++) {
41652       for (uint32_t n = 1; n <= 8; n++) {
41653         for (uint32_t m = 1; m <= 6; m++) {
41654           GemmMicrokernelTester()
41655             .mr(6)
41656             .nr(8)
41657             .kr(1)
41658             .sr(1)
41659             .m(m)
41660             .n(n)
41661             .k(k)
41662             .iterations(1)
41663             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41664         }
41665       }
41666     }
41667   }
41668 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_div_4)41669   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_div_4) {
41670     for (size_t k = 8; k <= 40; k += 4) {
41671       GemmMicrokernelTester()
41672         .mr(6)
41673         .nr(8)
41674         .kr(1)
41675         .sr(1)
41676         .m(6)
41677         .n(8)
41678         .k(k)
41679         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41680     }
41681   }
41682 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_div_4_strided_a)41683   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_div_4_strided_a) {
41684     for (size_t k = 8; k <= 40; k += 4) {
41685       GemmMicrokernelTester()
41686         .mr(6)
41687         .nr(8)
41688         .kr(1)
41689         .sr(1)
41690         .m(6)
41691         .n(8)
41692         .k(k)
41693         .a_stride(43)
41694         .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41695     }
41696   }
41697 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,k_div_4_subtile)41698   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, k_div_4_subtile) {
41699     for (size_t k = 8; k <= 40; k += 4) {
41700       for (uint32_t n = 1; n <= 8; n++) {
41701         for (uint32_t m = 1; m <= 6; m++) {
41702           GemmMicrokernelTester()
41703             .mr(6)
41704             .nr(8)
41705             .kr(1)
41706             .sr(1)
41707             .m(m)
41708             .n(n)
41709             .k(k)
41710             .iterations(1)
41711             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41712         }
41713       }
41714     }
41715   }
41716 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,n_gt_8)41717   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, n_gt_8) {
41718     for (uint32_t n = 9; n < 16; n++) {
41719       for (size_t k = 1; k <= 20; k += 5) {
41720         GemmMicrokernelTester()
41721           .mr(6)
41722           .nr(8)
41723           .kr(1)
41724           .sr(1)
41725           .m(6)
41726           .n(n)
41727           .k(k)
41728           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41729       }
41730     }
41731   }
41732 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,n_gt_8_strided_cn)41733   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, n_gt_8_strided_cn) {
41734     for (uint32_t n = 9; n < 16; n++) {
41735       for (size_t k = 1; k <= 20; k += 5) {
41736         GemmMicrokernelTester()
41737           .mr(6)
41738           .nr(8)
41739           .kr(1)
41740           .sr(1)
41741           .m(6)
41742           .n(n)
41743           .k(k)
41744           .cn_stride(11)
41745           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41746       }
41747     }
41748   }
41749 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,n_gt_8_strided_a)41750   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, n_gt_8_strided_a) {
41751     for (uint32_t n = 9; n < 16; n++) {
41752       for (size_t k = 1; k <= 20; k += 5) {
41753         GemmMicrokernelTester()
41754           .mr(6)
41755           .nr(8)
41756           .kr(1)
41757           .sr(1)
41758           .m(6)
41759           .n(n)
41760           .k(k)
41761           .a_stride(23)
41762           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41763       }
41764     }
41765   }
41766 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,n_gt_8_subtile)41767   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, n_gt_8_subtile) {
41768     for (uint32_t n = 9; n < 16; n++) {
41769       for (size_t k = 1; k <= 20; k += 5) {
41770         for (uint32_t m = 1; m <= 6; m++) {
41771           GemmMicrokernelTester()
41772             .mr(6)
41773             .nr(8)
41774             .kr(1)
41775             .sr(1)
41776             .m(m)
41777             .n(n)
41778             .k(k)
41779             .iterations(1)
41780             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41781         }
41782       }
41783     }
41784   }
41785 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,n_div_8)41786   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, n_div_8) {
41787     for (uint32_t n = 16; n <= 24; n += 8) {
41788       for (size_t k = 1; k <= 20; k += 5) {
41789         GemmMicrokernelTester()
41790           .mr(6)
41791           .nr(8)
41792           .kr(1)
41793           .sr(1)
41794           .m(6)
41795           .n(n)
41796           .k(k)
41797           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41798       }
41799     }
41800   }
41801 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,n_div_8_strided_cn)41802   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, n_div_8_strided_cn) {
41803     for (uint32_t n = 16; n <= 24; n += 8) {
41804       for (size_t k = 1; k <= 20; k += 5) {
41805         GemmMicrokernelTester()
41806           .mr(6)
41807           .nr(8)
41808           .kr(1)
41809           .sr(1)
41810           .m(6)
41811           .n(n)
41812           .k(k)
41813           .cn_stride(11)
41814           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41815       }
41816     }
41817   }
41818 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,n_div_8_strided_a)41819   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, n_div_8_strided_a) {
41820     for (uint32_t n = 16; n <= 24; n += 8) {
41821       for (size_t k = 1; k <= 20; k += 5) {
41822         GemmMicrokernelTester()
41823           .mr(6)
41824           .nr(8)
41825           .kr(1)
41826           .sr(1)
41827           .m(6)
41828           .n(n)
41829           .k(k)
41830           .a_stride(23)
41831           .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41832       }
41833     }
41834   }
41835 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,n_div_8_subtile)41836   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, n_div_8_subtile) {
41837     for (uint32_t n = 16; n <= 24; n += 8) {
41838       for (size_t k = 1; k <= 20; k += 5) {
41839         for (uint32_t m = 1; m <= 6; m++) {
41840           GemmMicrokernelTester()
41841             .mr(6)
41842             .nr(8)
41843             .kr(1)
41844             .sr(1)
41845             .m(m)
41846             .n(n)
41847             .k(k)
41848             .iterations(1)
41849             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41850         }
41851       }
41852     }
41853   }
41854 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,strided_cm_subtile)41855   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, strided_cm_subtile) {
41856     for (size_t k = 1; k <= 20; k += 5) {
41857       for (uint32_t n = 1; n <= 8; n++) {
41858         for (uint32_t m = 1; m <= 6; m++) {
41859           GemmMicrokernelTester()
41860             .mr(6)
41861             .nr(8)
41862             .kr(1)
41863             .sr(1)
41864             .m(m)
41865             .n(n)
41866             .k(k)
41867             .cm_stride(11)
41868             .iterations(1)
41869             .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41870         }
41871       }
41872     }
41873   }
41874 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,qmin)41875   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, qmin) {
41876     GemmMicrokernelTester()
41877       .mr(6)
41878       .nr(8)
41879       .kr(1)
41880       .sr(1)
41881       .m(6)
41882       .n(8)
41883       .k(4)
41884       .qmin(128)
41885       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41886   }
41887 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,qmax)41888   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, qmax) {
41889     GemmMicrokernelTester()
41890       .mr(6)
41891       .nr(8)
41892       .kr(1)
41893       .sr(1)
41894       .m(6)
41895       .n(8)
41896       .k(4)
41897       .qmax(128)
41898       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41899   }
41900 
TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT,strided_cm)41901   TEST(F32_GEMM_MINMAX_6X8__WASMRELAXEDSIMD_SPLAT, strided_cm) {
41902     GemmMicrokernelTester()
41903       .mr(6)
41904       .nr(8)
41905       .kr(1)
41906       .sr(1)
41907       .m(6)
41908       .n(8)
41909       .k(4)
41910       .cm_stride(11)
41911       .Test(xnn_f32_gemm_minmax_ukernel_6x8__wasmrelaxedsimd_splat, xnn_init_f32_minmax_wasmsimd_params);
41912   }
41913 #endif  // XNN_ARCH_WASMRELAXEDSIMD
41914 
41915 
41916 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_eq_4)41917   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_eq_4) {
41918     GemmMicrokernelTester()
41919       .mr(6)
41920       .nr(8)
41921       .kr(1)
41922       .sr(4)
41923       .m(6)
41924       .n(8)
41925       .k(4)
41926       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
41927   }
41928 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,strided_cn)41929   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, strided_cn) {
41930     GemmMicrokernelTester()
41931       .mr(6)
41932       .nr(8)
41933       .kr(1)
41934       .sr(4)
41935       .m(6)
41936       .n(8)
41937       .k(4)
41938       .cn_stride(11)
41939       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
41940   }
41941 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_eq_4_strided_a)41942   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_eq_4_strided_a) {
41943     GemmMicrokernelTester()
41944       .mr(6)
41945       .nr(8)
41946       .kr(1)
41947       .sr(4)
41948       .m(6)
41949       .n(8)
41950       .k(4)
41951       .a_stride(7)
41952       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
41953   }
41954 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_eq_4_subtile)41955   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_eq_4_subtile) {
41956     for (uint32_t n = 1; n <= 8; n++) {
41957       for (uint32_t m = 1; m <= 6; m++) {
41958         GemmMicrokernelTester()
41959           .mr(6)
41960           .nr(8)
41961           .kr(1)
41962           .sr(4)
41963           .m(m)
41964           .n(n)
41965           .k(4)
41966           .iterations(1)
41967           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
41968       }
41969     }
41970   }
41971 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_eq_4_subtile_m)41972   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_eq_4_subtile_m) {
41973     for (uint32_t m = 1; m <= 6; m++) {
41974       GemmMicrokernelTester()
41975         .mr(6)
41976         .nr(8)
41977         .kr(1)
41978         .sr(4)
41979         .m(m)
41980         .n(8)
41981         .k(4)
41982         .iterations(1)
41983         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
41984     }
41985   }
41986 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_eq_4_subtile_n)41987   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_eq_4_subtile_n) {
41988     for (uint32_t n = 1; n <= 8; n++) {
41989       GemmMicrokernelTester()
41990         .mr(6)
41991         .nr(8)
41992         .kr(1)
41993         .sr(4)
41994         .m(6)
41995         .n(n)
41996         .k(4)
41997         .iterations(1)
41998         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
41999     }
42000   }
42001 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_lt_4)42002   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_lt_4) {
42003     for (size_t k = 1; k < 4; k++) {
42004       GemmMicrokernelTester()
42005         .mr(6)
42006         .nr(8)
42007         .kr(1)
42008         .sr(4)
42009         .m(6)
42010         .n(8)
42011         .k(k)
42012         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42013     }
42014   }
42015 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_lt_4_strided_a)42016   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_lt_4_strided_a) {
42017     for (size_t k = 1; k < 4; k++) {
42018       GemmMicrokernelTester()
42019         .mr(6)
42020         .nr(8)
42021         .kr(1)
42022         .sr(4)
42023         .m(6)
42024         .n(8)
42025         .k(k)
42026         .a_stride(7)
42027         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42028     }
42029   }
42030 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_lt_4_subtile)42031   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_lt_4_subtile) {
42032     for (size_t k = 1; k < 4; k++) {
42033       for (uint32_t n = 1; n <= 8; n++) {
42034         for (uint32_t m = 1; m <= 6; m++) {
42035           GemmMicrokernelTester()
42036             .mr(6)
42037             .nr(8)
42038             .kr(1)
42039             .sr(4)
42040             .m(m)
42041             .n(n)
42042             .k(k)
42043             .iterations(1)
42044             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42045         }
42046       }
42047     }
42048   }
42049 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_gt_4)42050   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_gt_4) {
42051     for (size_t k = 5; k < 8; k++) {
42052       GemmMicrokernelTester()
42053         .mr(6)
42054         .nr(8)
42055         .kr(1)
42056         .sr(4)
42057         .m(6)
42058         .n(8)
42059         .k(k)
42060         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42061     }
42062   }
42063 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_gt_4_strided_a)42064   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_gt_4_strided_a) {
42065     for (size_t k = 5; k < 8; k++) {
42066       GemmMicrokernelTester()
42067         .mr(6)
42068         .nr(8)
42069         .kr(1)
42070         .sr(4)
42071         .m(6)
42072         .n(8)
42073         .k(k)
42074         .a_stride(11)
42075         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42076     }
42077   }
42078 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_gt_4_subtile)42079   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_gt_4_subtile) {
42080     for (size_t k = 5; k < 8; k++) {
42081       for (uint32_t n = 1; n <= 8; n++) {
42082         for (uint32_t m = 1; m <= 6; m++) {
42083           GemmMicrokernelTester()
42084             .mr(6)
42085             .nr(8)
42086             .kr(1)
42087             .sr(4)
42088             .m(m)
42089             .n(n)
42090             .k(k)
42091             .iterations(1)
42092             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42093         }
42094       }
42095     }
42096   }
42097 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_div_4)42098   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_div_4) {
42099     for (size_t k = 8; k <= 40; k += 4) {
42100       GemmMicrokernelTester()
42101         .mr(6)
42102         .nr(8)
42103         .kr(1)
42104         .sr(4)
42105         .m(6)
42106         .n(8)
42107         .k(k)
42108         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42109     }
42110   }
42111 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_div_4_strided_a)42112   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_div_4_strided_a) {
42113     for (size_t k = 8; k <= 40; k += 4) {
42114       GemmMicrokernelTester()
42115         .mr(6)
42116         .nr(8)
42117         .kr(1)
42118         .sr(4)
42119         .m(6)
42120         .n(8)
42121         .k(k)
42122         .a_stride(43)
42123         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42124     }
42125   }
42126 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,k_div_4_subtile)42127   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, k_div_4_subtile) {
42128     for (size_t k = 8; k <= 40; k += 4) {
42129       for (uint32_t n = 1; n <= 8; n++) {
42130         for (uint32_t m = 1; m <= 6; m++) {
42131           GemmMicrokernelTester()
42132             .mr(6)
42133             .nr(8)
42134             .kr(1)
42135             .sr(4)
42136             .m(m)
42137             .n(n)
42138             .k(k)
42139             .iterations(1)
42140             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42141         }
42142       }
42143     }
42144   }
42145 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,n_gt_8)42146   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, n_gt_8) {
42147     for (uint32_t n = 9; n < 16; n++) {
42148       for (size_t k = 1; k <= 20; k += 5) {
42149         GemmMicrokernelTester()
42150           .mr(6)
42151           .nr(8)
42152           .kr(1)
42153           .sr(4)
42154           .m(6)
42155           .n(n)
42156           .k(k)
42157           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42158       }
42159     }
42160   }
42161 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,n_gt_8_strided_cn)42162   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, n_gt_8_strided_cn) {
42163     for (uint32_t n = 9; n < 16; n++) {
42164       for (size_t k = 1; k <= 20; k += 5) {
42165         GemmMicrokernelTester()
42166           .mr(6)
42167           .nr(8)
42168           .kr(1)
42169           .sr(4)
42170           .m(6)
42171           .n(n)
42172           .k(k)
42173           .cn_stride(11)
42174           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42175       }
42176     }
42177   }
42178 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,n_gt_8_strided_a)42179   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, n_gt_8_strided_a) {
42180     for (uint32_t n = 9; n < 16; n++) {
42181       for (size_t k = 1; k <= 20; k += 5) {
42182         GemmMicrokernelTester()
42183           .mr(6)
42184           .nr(8)
42185           .kr(1)
42186           .sr(4)
42187           .m(6)
42188           .n(n)
42189           .k(k)
42190           .a_stride(23)
42191           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42192       }
42193     }
42194   }
42195 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,n_gt_8_subtile)42196   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, n_gt_8_subtile) {
42197     for (uint32_t n = 9; n < 16; n++) {
42198       for (size_t k = 1; k <= 20; k += 5) {
42199         for (uint32_t m = 1; m <= 6; m++) {
42200           GemmMicrokernelTester()
42201             .mr(6)
42202             .nr(8)
42203             .kr(1)
42204             .sr(4)
42205             .m(m)
42206             .n(n)
42207             .k(k)
42208             .iterations(1)
42209             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42210         }
42211       }
42212     }
42213   }
42214 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,n_div_8)42215   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, n_div_8) {
42216     for (uint32_t n = 16; n <= 24; n += 8) {
42217       for (size_t k = 1; k <= 20; k += 5) {
42218         GemmMicrokernelTester()
42219           .mr(6)
42220           .nr(8)
42221           .kr(1)
42222           .sr(4)
42223           .m(6)
42224           .n(n)
42225           .k(k)
42226           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42227       }
42228     }
42229   }
42230 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,n_div_8_strided_cn)42231   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, n_div_8_strided_cn) {
42232     for (uint32_t n = 16; n <= 24; n += 8) {
42233       for (size_t k = 1; k <= 20; k += 5) {
42234         GemmMicrokernelTester()
42235           .mr(6)
42236           .nr(8)
42237           .kr(1)
42238           .sr(4)
42239           .m(6)
42240           .n(n)
42241           .k(k)
42242           .cn_stride(11)
42243           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42244       }
42245     }
42246   }
42247 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,n_div_8_strided_a)42248   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, n_div_8_strided_a) {
42249     for (uint32_t n = 16; n <= 24; n += 8) {
42250       for (size_t k = 1; k <= 20; k += 5) {
42251         GemmMicrokernelTester()
42252           .mr(6)
42253           .nr(8)
42254           .kr(1)
42255           .sr(4)
42256           .m(6)
42257           .n(n)
42258           .k(k)
42259           .a_stride(23)
42260           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42261       }
42262     }
42263   }
42264 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,n_div_8_subtile)42265   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, n_div_8_subtile) {
42266     for (uint32_t n = 16; n <= 24; n += 8) {
42267       for (size_t k = 1; k <= 20; k += 5) {
42268         for (uint32_t m = 1; m <= 6; m++) {
42269           GemmMicrokernelTester()
42270             .mr(6)
42271             .nr(8)
42272             .kr(1)
42273             .sr(4)
42274             .m(m)
42275             .n(n)
42276             .k(k)
42277             .iterations(1)
42278             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42279         }
42280       }
42281     }
42282   }
42283 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,strided_cm_subtile)42284   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, strided_cm_subtile) {
42285     for (size_t k = 1; k <= 20; k += 5) {
42286       for (uint32_t n = 1; n <= 8; n++) {
42287         for (uint32_t m = 1; m <= 6; m++) {
42288           GemmMicrokernelTester()
42289             .mr(6)
42290             .nr(8)
42291             .kr(1)
42292             .sr(4)
42293             .m(m)
42294             .n(n)
42295             .k(k)
42296             .cm_stride(11)
42297             .iterations(1)
42298             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42299         }
42300       }
42301     }
42302   }
42303 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,qmin)42304   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, qmin) {
42305     GemmMicrokernelTester()
42306       .mr(6)
42307       .nr(8)
42308       .kr(1)
42309       .sr(4)
42310       .m(6)
42311       .n(8)
42312       .k(4)
42313       .qmin(128)
42314       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42315   }
42316 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,qmax)42317   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, qmax) {
42318     GemmMicrokernelTester()
42319       .mr(6)
42320       .nr(8)
42321       .kr(1)
42322       .sr(4)
42323       .m(6)
42324       .n(8)
42325       .k(4)
42326       .qmax(128)
42327       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42328   }
42329 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD,strided_cm)42330   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD, strided_cm) {
42331     GemmMicrokernelTester()
42332       .mr(6)
42333       .nr(8)
42334       .kr(1)
42335       .sr(4)
42336       .m(6)
42337       .n(8)
42338       .k(4)
42339       .cm_stride(11)
42340       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd, xnn_init_f32_minmax_wasmsimd_params);
42341   }
42342 #endif  // XNN_ARCH_WASMRELAXEDSIMD
42343 
42344 
42345 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_eq_4)42346   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_eq_4) {
42347     GemmMicrokernelTester()
42348       .mr(6)
42349       .nr(8)
42350       .kr(1)
42351       .sr(4)
42352       .m(6)
42353       .n(8)
42354       .k(4)
42355       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42356   }
42357 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,strided_cn)42358   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, strided_cn) {
42359     GemmMicrokernelTester()
42360       .mr(6)
42361       .nr(8)
42362       .kr(1)
42363       .sr(4)
42364       .m(6)
42365       .n(8)
42366       .k(4)
42367       .cn_stride(11)
42368       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42369   }
42370 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_strided_a)42371   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_strided_a) {
42372     GemmMicrokernelTester()
42373       .mr(6)
42374       .nr(8)
42375       .kr(1)
42376       .sr(4)
42377       .m(6)
42378       .n(8)
42379       .k(4)
42380       .a_stride(7)
42381       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42382   }
42383 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile)42384   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile) {
42385     for (uint32_t n = 1; n <= 8; n++) {
42386       for (uint32_t m = 1; m <= 6; m++) {
42387         GemmMicrokernelTester()
42388           .mr(6)
42389           .nr(8)
42390           .kr(1)
42391           .sr(4)
42392           .m(m)
42393           .n(n)
42394           .k(4)
42395           .iterations(1)
42396           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42397       }
42398     }
42399   }
42400 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile_m)42401   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile_m) {
42402     for (uint32_t m = 1; m <= 6; m++) {
42403       GemmMicrokernelTester()
42404         .mr(6)
42405         .nr(8)
42406         .kr(1)
42407         .sr(4)
42408         .m(m)
42409         .n(8)
42410         .k(4)
42411         .iterations(1)
42412         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42413     }
42414   }
42415 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_eq_4_subtile_n)42416   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_eq_4_subtile_n) {
42417     for (uint32_t n = 1; n <= 8; n++) {
42418       GemmMicrokernelTester()
42419         .mr(6)
42420         .nr(8)
42421         .kr(1)
42422         .sr(4)
42423         .m(6)
42424         .n(n)
42425         .k(4)
42426         .iterations(1)
42427         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42428     }
42429   }
42430 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_lt_4)42431   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_lt_4) {
42432     for (size_t k = 1; k < 4; k++) {
42433       GemmMicrokernelTester()
42434         .mr(6)
42435         .nr(8)
42436         .kr(1)
42437         .sr(4)
42438         .m(6)
42439         .n(8)
42440         .k(k)
42441         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42442     }
42443   }
42444 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_lt_4_strided_a)42445   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_lt_4_strided_a) {
42446     for (size_t k = 1; k < 4; k++) {
42447       GemmMicrokernelTester()
42448         .mr(6)
42449         .nr(8)
42450         .kr(1)
42451         .sr(4)
42452         .m(6)
42453         .n(8)
42454         .k(k)
42455         .a_stride(7)
42456         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42457     }
42458   }
42459 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_lt_4_subtile)42460   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_lt_4_subtile) {
42461     for (size_t k = 1; k < 4; k++) {
42462       for (uint32_t n = 1; n <= 8; n++) {
42463         for (uint32_t m = 1; m <= 6; m++) {
42464           GemmMicrokernelTester()
42465             .mr(6)
42466             .nr(8)
42467             .kr(1)
42468             .sr(4)
42469             .m(m)
42470             .n(n)
42471             .k(k)
42472             .iterations(1)
42473             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42474         }
42475       }
42476     }
42477   }
42478 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_gt_4)42479   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_gt_4) {
42480     for (size_t k = 5; k < 8; k++) {
42481       GemmMicrokernelTester()
42482         .mr(6)
42483         .nr(8)
42484         .kr(1)
42485         .sr(4)
42486         .m(6)
42487         .n(8)
42488         .k(k)
42489         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42490     }
42491   }
42492 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_gt_4_strided_a)42493   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_gt_4_strided_a) {
42494     for (size_t k = 5; k < 8; k++) {
42495       GemmMicrokernelTester()
42496         .mr(6)
42497         .nr(8)
42498         .kr(1)
42499         .sr(4)
42500         .m(6)
42501         .n(8)
42502         .k(k)
42503         .a_stride(11)
42504         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42505     }
42506   }
42507 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_gt_4_subtile)42508   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_gt_4_subtile) {
42509     for (size_t k = 5; k < 8; k++) {
42510       for (uint32_t n = 1; n <= 8; n++) {
42511         for (uint32_t m = 1; m <= 6; m++) {
42512           GemmMicrokernelTester()
42513             .mr(6)
42514             .nr(8)
42515             .kr(1)
42516             .sr(4)
42517             .m(m)
42518             .n(n)
42519             .k(k)
42520             .iterations(1)
42521             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42522         }
42523       }
42524     }
42525   }
42526 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_div_4)42527   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_div_4) {
42528     for (size_t k = 8; k <= 40; k += 4) {
42529       GemmMicrokernelTester()
42530         .mr(6)
42531         .nr(8)
42532         .kr(1)
42533         .sr(4)
42534         .m(6)
42535         .n(8)
42536         .k(k)
42537         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42538     }
42539   }
42540 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_div_4_strided_a)42541   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_div_4_strided_a) {
42542     for (size_t k = 8; k <= 40; k += 4) {
42543       GemmMicrokernelTester()
42544         .mr(6)
42545         .nr(8)
42546         .kr(1)
42547         .sr(4)
42548         .m(6)
42549         .n(8)
42550         .k(k)
42551         .a_stride(43)
42552         .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42553     }
42554   }
42555 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,k_div_4_subtile)42556   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, k_div_4_subtile) {
42557     for (size_t k = 8; k <= 40; k += 4) {
42558       for (uint32_t n = 1; n <= 8; n++) {
42559         for (uint32_t m = 1; m <= 6; m++) {
42560           GemmMicrokernelTester()
42561             .mr(6)
42562             .nr(8)
42563             .kr(1)
42564             .sr(4)
42565             .m(m)
42566             .n(n)
42567             .k(k)
42568             .iterations(1)
42569             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42570         }
42571       }
42572     }
42573   }
42574 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,n_gt_8)42575   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, n_gt_8) {
42576     for (uint32_t n = 9; n < 16; n++) {
42577       for (size_t k = 1; k <= 20; k += 5) {
42578         GemmMicrokernelTester()
42579           .mr(6)
42580           .nr(8)
42581           .kr(1)
42582           .sr(4)
42583           .m(6)
42584           .n(n)
42585           .k(k)
42586           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42587       }
42588     }
42589   }
42590 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,n_gt_8_strided_cn)42591   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, n_gt_8_strided_cn) {
42592     for (uint32_t n = 9; n < 16; n++) {
42593       for (size_t k = 1; k <= 20; k += 5) {
42594         GemmMicrokernelTester()
42595           .mr(6)
42596           .nr(8)
42597           .kr(1)
42598           .sr(4)
42599           .m(6)
42600           .n(n)
42601           .k(k)
42602           .cn_stride(11)
42603           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42604       }
42605     }
42606   }
42607 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,n_gt_8_strided_a)42608   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, n_gt_8_strided_a) {
42609     for (uint32_t n = 9; n < 16; n++) {
42610       for (size_t k = 1; k <= 20; k += 5) {
42611         GemmMicrokernelTester()
42612           .mr(6)
42613           .nr(8)
42614           .kr(1)
42615           .sr(4)
42616           .m(6)
42617           .n(n)
42618           .k(k)
42619           .a_stride(23)
42620           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42621       }
42622     }
42623   }
42624 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,n_gt_8_subtile)42625   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, n_gt_8_subtile) {
42626     for (uint32_t n = 9; n < 16; n++) {
42627       for (size_t k = 1; k <= 20; k += 5) {
42628         for (uint32_t m = 1; m <= 6; m++) {
42629           GemmMicrokernelTester()
42630             .mr(6)
42631             .nr(8)
42632             .kr(1)
42633             .sr(4)
42634             .m(m)
42635             .n(n)
42636             .k(k)
42637             .iterations(1)
42638             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42639         }
42640       }
42641     }
42642   }
42643 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,n_div_8)42644   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, n_div_8) {
42645     for (uint32_t n = 16; n <= 24; n += 8) {
42646       for (size_t k = 1; k <= 20; k += 5) {
42647         GemmMicrokernelTester()
42648           .mr(6)
42649           .nr(8)
42650           .kr(1)
42651           .sr(4)
42652           .m(6)
42653           .n(n)
42654           .k(k)
42655           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42656       }
42657     }
42658   }
42659 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,n_div_8_strided_cn)42660   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, n_div_8_strided_cn) {
42661     for (uint32_t n = 16; n <= 24; n += 8) {
42662       for (size_t k = 1; k <= 20; k += 5) {
42663         GemmMicrokernelTester()
42664           .mr(6)
42665           .nr(8)
42666           .kr(1)
42667           .sr(4)
42668           .m(6)
42669           .n(n)
42670           .k(k)
42671           .cn_stride(11)
42672           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42673       }
42674     }
42675   }
42676 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,n_div_8_strided_a)42677   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, n_div_8_strided_a) {
42678     for (uint32_t n = 16; n <= 24; n += 8) {
42679       for (size_t k = 1; k <= 20; k += 5) {
42680         GemmMicrokernelTester()
42681           .mr(6)
42682           .nr(8)
42683           .kr(1)
42684           .sr(4)
42685           .m(6)
42686           .n(n)
42687           .k(k)
42688           .a_stride(23)
42689           .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42690       }
42691     }
42692   }
42693 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,n_div_8_subtile)42694   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, n_div_8_subtile) {
42695     for (uint32_t n = 16; n <= 24; n += 8) {
42696       for (size_t k = 1; k <= 20; k += 5) {
42697         for (uint32_t m = 1; m <= 6; m++) {
42698           GemmMicrokernelTester()
42699             .mr(6)
42700             .nr(8)
42701             .kr(1)
42702             .sr(4)
42703             .m(m)
42704             .n(n)
42705             .k(k)
42706             .iterations(1)
42707             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42708         }
42709       }
42710     }
42711   }
42712 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,strided_cm_subtile)42713   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, strided_cm_subtile) {
42714     for (size_t k = 1; k <= 20; k += 5) {
42715       for (uint32_t n = 1; n <= 8; n++) {
42716         for (uint32_t m = 1; m <= 6; m++) {
42717           GemmMicrokernelTester()
42718             .mr(6)
42719             .nr(8)
42720             .kr(1)
42721             .sr(4)
42722             .m(m)
42723             .n(n)
42724             .k(k)
42725             .cm_stride(11)
42726             .iterations(1)
42727             .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42728         }
42729       }
42730     }
42731   }
42732 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,qmin)42733   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, qmin) {
42734     GemmMicrokernelTester()
42735       .mr(6)
42736       .nr(8)
42737       .kr(1)
42738       .sr(4)
42739       .m(6)
42740       .n(8)
42741       .k(4)
42742       .qmin(128)
42743       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42744   }
42745 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,qmax)42746   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, qmax) {
42747     GemmMicrokernelTester()
42748       .mr(6)
42749       .nr(8)
42750       .kr(1)
42751       .sr(4)
42752       .m(6)
42753       .n(8)
42754       .k(4)
42755       .qmax(128)
42756       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42757   }
42758 
TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA,strided_cm)42759   TEST(F32_GEMM_MINMAX_6X8S4__WASMRELAXEDSIMD_FMA, strided_cm) {
42760     GemmMicrokernelTester()
42761       .mr(6)
42762       .nr(8)
42763       .kr(1)
42764       .sr(4)
42765       .m(6)
42766       .n(8)
42767       .k(4)
42768       .cm_stride(11)
42769       .Test(xnn_f32_gemm_minmax_ukernel_6x8s4__wasmrelaxedsimd_fma, xnn_init_f32_minmax_wasmsimd_params);
42770   }
42771 #endif  // XNN_ARCH_WASMRELAXEDSIMD
42772 
42773 
42774 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_GEMM_MINMAX_1X4__WASM,k_eq_1)42775   TEST(F32_GEMM_MINMAX_1X4__WASM, k_eq_1) {
42776     GemmMicrokernelTester()
42777       .mr(1)
42778       .nr(4)
42779       .kr(1)
42780       .sr(1)
42781       .m(1)
42782       .n(4)
42783       .k(1)
42784       .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42785   }
42786 
TEST(F32_GEMM_MINMAX_1X4__WASM,strided_cn)42787   TEST(F32_GEMM_MINMAX_1X4__WASM, strided_cn) {
42788     GemmMicrokernelTester()
42789       .mr(1)
42790       .nr(4)
42791       .kr(1)
42792       .sr(1)
42793       .m(1)
42794       .n(4)
42795       .k(1)
42796       .cn_stride(7)
42797       .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42798   }
42799 
TEST(F32_GEMM_MINMAX_1X4__WASM,k_eq_1_strided_a)42800   TEST(F32_GEMM_MINMAX_1X4__WASM, k_eq_1_strided_a) {
42801     GemmMicrokernelTester()
42802       .mr(1)
42803       .nr(4)
42804       .kr(1)
42805       .sr(1)
42806       .m(1)
42807       .n(4)
42808       .k(1)
42809       .a_stride(3)
42810       .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42811   }
42812 
TEST(F32_GEMM_MINMAX_1X4__WASM,k_eq_1_subtile)42813   TEST(F32_GEMM_MINMAX_1X4__WASM, k_eq_1_subtile) {
42814     for (uint32_t n = 1; n <= 4; n++) {
42815       for (uint32_t m = 1; m <= 1; m++) {
42816         GemmMicrokernelTester()
42817           .mr(1)
42818           .nr(4)
42819           .kr(1)
42820           .sr(1)
42821           .m(m)
42822           .n(n)
42823           .k(1)
42824           .iterations(1)
42825           .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42826       }
42827     }
42828   }
42829 
TEST(F32_GEMM_MINMAX_1X4__WASM,k_eq_1_subtile_m)42830   TEST(F32_GEMM_MINMAX_1X4__WASM, k_eq_1_subtile_m) {
42831     for (uint32_t m = 1; m <= 1; m++) {
42832       GemmMicrokernelTester()
42833         .mr(1)
42834         .nr(4)
42835         .kr(1)
42836         .sr(1)
42837         .m(m)
42838         .n(4)
42839         .k(1)
42840         .iterations(1)
42841         .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42842     }
42843   }
42844 
TEST(F32_GEMM_MINMAX_1X4__WASM,k_eq_1_subtile_n)42845   TEST(F32_GEMM_MINMAX_1X4__WASM, k_eq_1_subtile_n) {
42846     for (uint32_t n = 1; n <= 4; n++) {
42847       GemmMicrokernelTester()
42848         .mr(1)
42849         .nr(4)
42850         .kr(1)
42851         .sr(1)
42852         .m(1)
42853         .n(n)
42854         .k(1)
42855         .iterations(1)
42856         .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42857     }
42858   }
42859 
TEST(F32_GEMM_MINMAX_1X4__WASM,k_gt_1)42860   TEST(F32_GEMM_MINMAX_1X4__WASM, k_gt_1) {
42861     for (size_t k = 2; k < 10; k++) {
42862       GemmMicrokernelTester()
42863         .mr(1)
42864         .nr(4)
42865         .kr(1)
42866         .sr(1)
42867         .m(1)
42868         .n(4)
42869         .k(k)
42870         .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42871     }
42872   }
42873 
TEST(F32_GEMM_MINMAX_1X4__WASM,k_gt_1_strided_a)42874   TEST(F32_GEMM_MINMAX_1X4__WASM, k_gt_1_strided_a) {
42875     for (size_t k = 2; k < 10; k++) {
42876       GemmMicrokernelTester()
42877         .mr(1)
42878         .nr(4)
42879         .kr(1)
42880         .sr(1)
42881         .m(1)
42882         .n(4)
42883         .k(k)
42884         .a_stride(11)
42885         .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42886     }
42887   }
42888 
TEST(F32_GEMM_MINMAX_1X4__WASM,k_gt_1_subtile)42889   TEST(F32_GEMM_MINMAX_1X4__WASM, k_gt_1_subtile) {
42890     for (size_t k = 2; k < 10; k++) {
42891       for (uint32_t n = 1; n <= 4; n++) {
42892         for (uint32_t m = 1; m <= 1; m++) {
42893           GemmMicrokernelTester()
42894             .mr(1)
42895             .nr(4)
42896             .kr(1)
42897             .sr(1)
42898             .m(m)
42899             .n(n)
42900             .k(k)
42901             .iterations(1)
42902             .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42903         }
42904       }
42905     }
42906   }
42907 
TEST(F32_GEMM_MINMAX_1X4__WASM,n_gt_4)42908   TEST(F32_GEMM_MINMAX_1X4__WASM, n_gt_4) {
42909     for (uint32_t n = 5; n < 8; n++) {
42910       for (size_t k = 1; k <= 5; k += 2) {
42911         GemmMicrokernelTester()
42912           .mr(1)
42913           .nr(4)
42914           .kr(1)
42915           .sr(1)
42916           .m(1)
42917           .n(n)
42918           .k(k)
42919           .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42920       }
42921     }
42922   }
42923 
TEST(F32_GEMM_MINMAX_1X4__WASM,n_gt_4_strided_cn)42924   TEST(F32_GEMM_MINMAX_1X4__WASM, n_gt_4_strided_cn) {
42925     for (uint32_t n = 5; n < 8; n++) {
42926       for (size_t k = 1; k <= 5; k += 2) {
42927         GemmMicrokernelTester()
42928           .mr(1)
42929           .nr(4)
42930           .kr(1)
42931           .sr(1)
42932           .m(1)
42933           .n(n)
42934           .k(k)
42935           .cn_stride(7)
42936           .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42937       }
42938     }
42939   }
42940 
TEST(F32_GEMM_MINMAX_1X4__WASM,n_gt_4_strided_a)42941   TEST(F32_GEMM_MINMAX_1X4__WASM, n_gt_4_strided_a) {
42942     for (uint32_t n = 5; n < 8; n++) {
42943       for (size_t k = 1; k <= 5; k += 2) {
42944         GemmMicrokernelTester()
42945           .mr(1)
42946           .nr(4)
42947           .kr(1)
42948           .sr(1)
42949           .m(1)
42950           .n(n)
42951           .k(k)
42952           .a_stride(7)
42953           .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42954       }
42955     }
42956   }
42957 
TEST(F32_GEMM_MINMAX_1X4__WASM,n_gt_4_subtile)42958   TEST(F32_GEMM_MINMAX_1X4__WASM, n_gt_4_subtile) {
42959     for (uint32_t n = 5; n < 8; n++) {
42960       for (size_t k = 1; k <= 5; k += 2) {
42961         for (uint32_t m = 1; m <= 1; m++) {
42962           GemmMicrokernelTester()
42963             .mr(1)
42964             .nr(4)
42965             .kr(1)
42966             .sr(1)
42967             .m(m)
42968             .n(n)
42969             .k(k)
42970             .iterations(1)
42971             .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42972         }
42973       }
42974     }
42975   }
42976 
TEST(F32_GEMM_MINMAX_1X4__WASM,n_div_4)42977   TEST(F32_GEMM_MINMAX_1X4__WASM, n_div_4) {
42978     for (uint32_t n = 8; n <= 12; n += 4) {
42979       for (size_t k = 1; k <= 5; k += 2) {
42980         GemmMicrokernelTester()
42981           .mr(1)
42982           .nr(4)
42983           .kr(1)
42984           .sr(1)
42985           .m(1)
42986           .n(n)
42987           .k(k)
42988           .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
42989       }
42990     }
42991   }
42992 
TEST(F32_GEMM_MINMAX_1X4__WASM,n_div_4_strided_cn)42993   TEST(F32_GEMM_MINMAX_1X4__WASM, n_div_4_strided_cn) {
42994     for (uint32_t n = 8; n <= 12; n += 4) {
42995       for (size_t k = 1; k <= 5; k += 2) {
42996         GemmMicrokernelTester()
42997           .mr(1)
42998           .nr(4)
42999           .kr(1)
43000           .sr(1)
43001           .m(1)
43002           .n(n)
43003           .k(k)
43004           .cn_stride(7)
43005           .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
43006       }
43007     }
43008   }
43009 
TEST(F32_GEMM_MINMAX_1X4__WASM,n_div_4_strided_a)43010   TEST(F32_GEMM_MINMAX_1X4__WASM, n_div_4_strided_a) {
43011     for (uint32_t n = 8; n <= 12; n += 4) {
43012       for (size_t k = 1; k <= 5; k += 2) {
43013         GemmMicrokernelTester()
43014           .mr(1)
43015           .nr(4)
43016           .kr(1)
43017           .sr(1)
43018           .m(1)
43019           .n(n)
43020           .k(k)
43021           .a_stride(7)
43022           .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
43023       }
43024     }
43025   }
43026 
TEST(F32_GEMM_MINMAX_1X4__WASM,n_div_4_subtile)43027   TEST(F32_GEMM_MINMAX_1X4__WASM, n_div_4_subtile) {
43028     for (uint32_t n = 8; n <= 12; n += 4) {
43029       for (size_t k = 1; k <= 5; k += 2) {
43030         for (uint32_t m = 1; m <= 1; m++) {
43031           GemmMicrokernelTester()
43032             .mr(1)
43033             .nr(4)
43034             .kr(1)
43035             .sr(1)
43036             .m(m)
43037             .n(n)
43038             .k(k)
43039             .iterations(1)
43040             .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
43041         }
43042       }
43043     }
43044   }
43045 
TEST(F32_GEMM_MINMAX_1X4__WASM,strided_cm_subtile)43046   TEST(F32_GEMM_MINMAX_1X4__WASM, strided_cm_subtile) {
43047     for (size_t k = 1; k <= 5; k += 2) {
43048       for (uint32_t n = 1; n <= 4; n++) {
43049         for (uint32_t m = 1; m <= 1; m++) {
43050           GemmMicrokernelTester()
43051             .mr(1)
43052             .nr(4)
43053             .kr(1)
43054             .sr(1)
43055             .m(m)
43056             .n(n)
43057             .k(k)
43058             .cm_stride(7)
43059             .iterations(1)
43060             .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
43061         }
43062       }
43063     }
43064   }
43065 
TEST(F32_GEMM_MINMAX_1X4__WASM,qmin)43066   TEST(F32_GEMM_MINMAX_1X4__WASM, qmin) {
43067     GemmMicrokernelTester()
43068       .mr(1)
43069       .nr(4)
43070       .kr(1)
43071       .sr(1)
43072       .m(1)
43073       .n(4)
43074       .k(1)
43075       .qmin(128)
43076       .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
43077   }
43078 
TEST(F32_GEMM_MINMAX_1X4__WASM,qmax)43079   TEST(F32_GEMM_MINMAX_1X4__WASM, qmax) {
43080     GemmMicrokernelTester()
43081       .mr(1)
43082       .nr(4)
43083       .kr(1)
43084       .sr(1)
43085       .m(1)
43086       .n(4)
43087       .k(1)
43088       .qmax(128)
43089       .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
43090   }
43091 
TEST(F32_GEMM_MINMAX_1X4__WASM,strided_cm)43092   TEST(F32_GEMM_MINMAX_1X4__WASM, strided_cm) {
43093     GemmMicrokernelTester()
43094       .mr(1)
43095       .nr(4)
43096       .kr(1)
43097       .sr(1)
43098       .m(1)
43099       .n(4)
43100       .k(1)
43101       .cm_stride(7)
43102       .Test(xnn_f32_gemm_minmax_ukernel_1x4__wasm, xnn_init_f32_minmax_scalar_params);
43103   }
43104 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
43105 
43106 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,k_eq_1)43107 TEST(F32_GEMM_MINMAX_2X4__SCALAR, k_eq_1) {
43108   GemmMicrokernelTester()
43109     .mr(2)
43110     .nr(4)
43111     .kr(1)
43112     .sr(1)
43113     .m(2)
43114     .n(4)
43115     .k(1)
43116     .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43117 }
43118 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,strided_cn)43119 TEST(F32_GEMM_MINMAX_2X4__SCALAR, strided_cn) {
43120   GemmMicrokernelTester()
43121     .mr(2)
43122     .nr(4)
43123     .kr(1)
43124     .sr(1)
43125     .m(2)
43126     .n(4)
43127     .k(1)
43128     .cn_stride(7)
43129     .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43130 }
43131 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,k_eq_1_strided_a)43132 TEST(F32_GEMM_MINMAX_2X4__SCALAR, k_eq_1_strided_a) {
43133   GemmMicrokernelTester()
43134     .mr(2)
43135     .nr(4)
43136     .kr(1)
43137     .sr(1)
43138     .m(2)
43139     .n(4)
43140     .k(1)
43141     .a_stride(3)
43142     .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43143 }
43144 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,k_eq_1_subtile)43145 TEST(F32_GEMM_MINMAX_2X4__SCALAR, k_eq_1_subtile) {
43146   for (uint32_t n = 1; n <= 4; n++) {
43147     for (uint32_t m = 1; m <= 2; m++) {
43148       GemmMicrokernelTester()
43149         .mr(2)
43150         .nr(4)
43151         .kr(1)
43152         .sr(1)
43153         .m(m)
43154         .n(n)
43155         .k(1)
43156         .iterations(1)
43157         .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43158     }
43159   }
43160 }
43161 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,k_eq_1_subtile_m)43162 TEST(F32_GEMM_MINMAX_2X4__SCALAR, k_eq_1_subtile_m) {
43163   for (uint32_t m = 1; m <= 2; m++) {
43164     GemmMicrokernelTester()
43165       .mr(2)
43166       .nr(4)
43167       .kr(1)
43168       .sr(1)
43169       .m(m)
43170       .n(4)
43171       .k(1)
43172       .iterations(1)
43173       .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43174   }
43175 }
43176 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,k_eq_1_subtile_n)43177 TEST(F32_GEMM_MINMAX_2X4__SCALAR, k_eq_1_subtile_n) {
43178   for (uint32_t n = 1; n <= 4; n++) {
43179     GemmMicrokernelTester()
43180       .mr(2)
43181       .nr(4)
43182       .kr(1)
43183       .sr(1)
43184       .m(2)
43185       .n(n)
43186       .k(1)
43187       .iterations(1)
43188       .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43189   }
43190 }
43191 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,k_gt_1)43192 TEST(F32_GEMM_MINMAX_2X4__SCALAR, k_gt_1) {
43193   for (size_t k = 2; k < 10; k++) {
43194     GemmMicrokernelTester()
43195       .mr(2)
43196       .nr(4)
43197       .kr(1)
43198       .sr(1)
43199       .m(2)
43200       .n(4)
43201       .k(k)
43202       .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43203   }
43204 }
43205 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,k_gt_1_strided_a)43206 TEST(F32_GEMM_MINMAX_2X4__SCALAR, k_gt_1_strided_a) {
43207   for (size_t k = 2; k < 10; k++) {
43208     GemmMicrokernelTester()
43209       .mr(2)
43210       .nr(4)
43211       .kr(1)
43212       .sr(1)
43213       .m(2)
43214       .n(4)
43215       .k(k)
43216       .a_stride(11)
43217       .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43218   }
43219 }
43220 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,k_gt_1_subtile)43221 TEST(F32_GEMM_MINMAX_2X4__SCALAR, k_gt_1_subtile) {
43222   for (size_t k = 2; k < 10; k++) {
43223     for (uint32_t n = 1; n <= 4; n++) {
43224       for (uint32_t m = 1; m <= 2; m++) {
43225         GemmMicrokernelTester()
43226           .mr(2)
43227           .nr(4)
43228           .kr(1)
43229           .sr(1)
43230           .m(m)
43231           .n(n)
43232           .k(k)
43233           .iterations(1)
43234           .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43235       }
43236     }
43237   }
43238 }
43239 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,n_gt_4)43240 TEST(F32_GEMM_MINMAX_2X4__SCALAR, n_gt_4) {
43241   for (uint32_t n = 5; n < 8; n++) {
43242     for (size_t k = 1; k <= 5; k += 2) {
43243       GemmMicrokernelTester()
43244         .mr(2)
43245         .nr(4)
43246         .kr(1)
43247         .sr(1)
43248         .m(2)
43249         .n(n)
43250         .k(k)
43251         .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43252     }
43253   }
43254 }
43255 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,n_gt_4_strided_cn)43256 TEST(F32_GEMM_MINMAX_2X4__SCALAR, n_gt_4_strided_cn) {
43257   for (uint32_t n = 5; n < 8; n++) {
43258     for (size_t k = 1; k <= 5; k += 2) {
43259       GemmMicrokernelTester()
43260         .mr(2)
43261         .nr(4)
43262         .kr(1)
43263         .sr(1)
43264         .m(2)
43265         .n(n)
43266         .k(k)
43267         .cn_stride(7)
43268         .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43269     }
43270   }
43271 }
43272 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,n_gt_4_strided_a)43273 TEST(F32_GEMM_MINMAX_2X4__SCALAR, n_gt_4_strided_a) {
43274   for (uint32_t n = 5; n < 8; n++) {
43275     for (size_t k = 1; k <= 5; k += 2) {
43276       GemmMicrokernelTester()
43277         .mr(2)
43278         .nr(4)
43279         .kr(1)
43280         .sr(1)
43281         .m(2)
43282         .n(n)
43283         .k(k)
43284         .a_stride(7)
43285         .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43286     }
43287   }
43288 }
43289 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,n_gt_4_subtile)43290 TEST(F32_GEMM_MINMAX_2X4__SCALAR, n_gt_4_subtile) {
43291   for (uint32_t n = 5; n < 8; n++) {
43292     for (size_t k = 1; k <= 5; k += 2) {
43293       for (uint32_t m = 1; m <= 2; m++) {
43294         GemmMicrokernelTester()
43295           .mr(2)
43296           .nr(4)
43297           .kr(1)
43298           .sr(1)
43299           .m(m)
43300           .n(n)
43301           .k(k)
43302           .iterations(1)
43303           .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43304       }
43305     }
43306   }
43307 }
43308 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,n_div_4)43309 TEST(F32_GEMM_MINMAX_2X4__SCALAR, n_div_4) {
43310   for (uint32_t n = 8; n <= 12; n += 4) {
43311     for (size_t k = 1; k <= 5; k += 2) {
43312       GemmMicrokernelTester()
43313         .mr(2)
43314         .nr(4)
43315         .kr(1)
43316         .sr(1)
43317         .m(2)
43318         .n(n)
43319         .k(k)
43320         .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43321     }
43322   }
43323 }
43324 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,n_div_4_strided_cn)43325 TEST(F32_GEMM_MINMAX_2X4__SCALAR, n_div_4_strided_cn) {
43326   for (uint32_t n = 8; n <= 12; n += 4) {
43327     for (size_t k = 1; k <= 5; k += 2) {
43328       GemmMicrokernelTester()
43329         .mr(2)
43330         .nr(4)
43331         .kr(1)
43332         .sr(1)
43333         .m(2)
43334         .n(n)
43335         .k(k)
43336         .cn_stride(7)
43337         .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43338     }
43339   }
43340 }
43341 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,n_div_4_strided_a)43342 TEST(F32_GEMM_MINMAX_2X4__SCALAR, n_div_4_strided_a) {
43343   for (uint32_t n = 8; n <= 12; n += 4) {
43344     for (size_t k = 1; k <= 5; k += 2) {
43345       GemmMicrokernelTester()
43346         .mr(2)
43347         .nr(4)
43348         .kr(1)
43349         .sr(1)
43350         .m(2)
43351         .n(n)
43352         .k(k)
43353         .a_stride(7)
43354         .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43355     }
43356   }
43357 }
43358 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,n_div_4_subtile)43359 TEST(F32_GEMM_MINMAX_2X4__SCALAR, n_div_4_subtile) {
43360   for (uint32_t n = 8; n <= 12; n += 4) {
43361     for (size_t k = 1; k <= 5; k += 2) {
43362       for (uint32_t m = 1; m <= 2; m++) {
43363         GemmMicrokernelTester()
43364           .mr(2)
43365           .nr(4)
43366           .kr(1)
43367           .sr(1)
43368           .m(m)
43369           .n(n)
43370           .k(k)
43371           .iterations(1)
43372           .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43373       }
43374     }
43375   }
43376 }
43377 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,strided_cm_subtile)43378 TEST(F32_GEMM_MINMAX_2X4__SCALAR, strided_cm_subtile) {
43379   for (size_t k = 1; k <= 5; k += 2) {
43380     for (uint32_t n = 1; n <= 4; n++) {
43381       for (uint32_t m = 1; m <= 2; m++) {
43382         GemmMicrokernelTester()
43383           .mr(2)
43384           .nr(4)
43385           .kr(1)
43386           .sr(1)
43387           .m(m)
43388           .n(n)
43389           .k(k)
43390           .cm_stride(7)
43391           .iterations(1)
43392           .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43393       }
43394     }
43395   }
43396 }
43397 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,qmin)43398 TEST(F32_GEMM_MINMAX_2X4__SCALAR, qmin) {
43399   GemmMicrokernelTester()
43400     .mr(2)
43401     .nr(4)
43402     .kr(1)
43403     .sr(1)
43404     .m(2)
43405     .n(4)
43406     .k(1)
43407     .qmin(128)
43408     .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43409 }
43410 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,qmax)43411 TEST(F32_GEMM_MINMAX_2X4__SCALAR, qmax) {
43412   GemmMicrokernelTester()
43413     .mr(2)
43414     .nr(4)
43415     .kr(1)
43416     .sr(1)
43417     .m(2)
43418     .n(4)
43419     .k(1)
43420     .qmax(128)
43421     .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43422 }
43423 
TEST(F32_GEMM_MINMAX_2X4__SCALAR,strided_cm)43424 TEST(F32_GEMM_MINMAX_2X4__SCALAR, strided_cm) {
43425   GemmMicrokernelTester()
43426     .mr(2)
43427     .nr(4)
43428     .kr(1)
43429     .sr(1)
43430     .m(2)
43431     .n(4)
43432     .k(1)
43433     .cm_stride(7)
43434     .Test(xnn_f32_gemm_minmax_ukernel_2x4__scalar, xnn_init_f32_minmax_scalar_params);
43435 }
43436 
43437 
43438 #if XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY && XNN_PLATFORM_JIT
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_eq_4)43439   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_eq_4) {
43440     TEST_REQUIRES_ARM_NEON;
43441     GemmMicrokernelTester()
43442       .mr(4)
43443       .nr(8)
43444       .kr(1)
43445       .sr(1)
43446       .m(4)
43447       .n(8)
43448       .k(4)
43449       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43450   }
43451 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,strided_cn)43452   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, strided_cn) {
43453     TEST_REQUIRES_ARM_NEON;
43454     GemmMicrokernelTester()
43455       .mr(4)
43456       .nr(8)
43457       .kr(1)
43458       .sr(1)
43459       .m(4)
43460       .n(8)
43461       .k(4)
43462       .cn_stride(11)
43463       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43464   }
43465 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_eq_4_strided_a)43466   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_eq_4_strided_a) {
43467     TEST_REQUIRES_ARM_NEON;
43468     GemmMicrokernelTester()
43469       .mr(4)
43470       .nr(8)
43471       .kr(1)
43472       .sr(1)
43473       .m(4)
43474       .n(8)
43475       .k(4)
43476       .a_stride(7)
43477       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43478   }
43479 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_eq_4_subtile)43480   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_eq_4_subtile) {
43481     TEST_REQUIRES_ARM_NEON;
43482     for (uint32_t n = 1; n <= 8; n++) {
43483       for (uint32_t m = 1; m <= 4; m++) {
43484         GemmMicrokernelTester()
43485           .mr(4)
43486           .nr(8)
43487           .kr(1)
43488           .sr(1)
43489           .m(m)
43490           .n(n)
43491           .k(4)
43492           .iterations(1)
43493           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43494       }
43495     }
43496   }
43497 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_eq_4_subtile_m)43498   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_eq_4_subtile_m) {
43499     TEST_REQUIRES_ARM_NEON;
43500     for (uint32_t m = 1; m <= 4; m++) {
43501       GemmMicrokernelTester()
43502         .mr(4)
43503         .nr(8)
43504         .kr(1)
43505         .sr(1)
43506         .m(m)
43507         .n(8)
43508         .k(4)
43509         .iterations(1)
43510         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43511     }
43512   }
43513 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_eq_4_subtile_n)43514   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_eq_4_subtile_n) {
43515     TEST_REQUIRES_ARM_NEON;
43516     for (uint32_t n = 1; n <= 8; n++) {
43517       GemmMicrokernelTester()
43518         .mr(4)
43519         .nr(8)
43520         .kr(1)
43521         .sr(1)
43522         .m(4)
43523         .n(n)
43524         .k(4)
43525         .iterations(1)
43526         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43527     }
43528   }
43529 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_eq_8)43530   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_eq_8) {
43531     TEST_REQUIRES_ARM_NEON;
43532     GemmMicrokernelTester()
43533       .mr(4)
43534       .nr(8)
43535       .kr(1)
43536       .sr(1)
43537       .m(4)
43538       .n(8)
43539       .k(8)
43540       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43541   }
43542 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_eq_8_strided_a)43543   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_eq_8_strided_a) {
43544     TEST_REQUIRES_ARM_NEON;
43545     GemmMicrokernelTester()
43546       .mr(4)
43547       .nr(8)
43548       .kr(1)
43549       .sr(1)
43550       .m(4)
43551       .n(8)
43552       .k(8)
43553       .a_stride(11)
43554       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43555   }
43556 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_eq_8_subtile)43557   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_eq_8_subtile) {
43558     TEST_REQUIRES_ARM_NEON;
43559     for (uint32_t n = 1; n <= 8; n++) {
43560       for (uint32_t m = 1; m <= 4; m++) {
43561         GemmMicrokernelTester()
43562           .mr(4)
43563           .nr(8)
43564           .kr(1)
43565           .sr(1)
43566           .m(m)
43567           .n(n)
43568           .k(8)
43569           .iterations(1)
43570           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43571       }
43572     }
43573   }
43574 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_lt_8)43575   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_lt_8) {
43576     TEST_REQUIRES_ARM_NEON;
43577     for (size_t k = 1; k < 8; k++) {
43578       GemmMicrokernelTester()
43579         .mr(4)
43580         .nr(8)
43581         .kr(1)
43582         .sr(1)
43583         .m(4)
43584         .n(8)
43585         .k(k)
43586         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43587     }
43588   }
43589 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_lt_8_strided_a)43590   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_lt_8_strided_a) {
43591     TEST_REQUIRES_ARM_NEON;
43592     for (size_t k = 1; k < 8; k++) {
43593       GemmMicrokernelTester()
43594         .mr(4)
43595         .nr(8)
43596         .kr(1)
43597         .sr(1)
43598         .m(4)
43599         .n(8)
43600         .k(k)
43601         .a_stride(11)
43602         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43603     }
43604   }
43605 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_lt_8_subtile)43606   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_lt_8_subtile) {
43607     TEST_REQUIRES_ARM_NEON;
43608     for (size_t k = 1; k < 8; k++) {
43609       for (uint32_t n = 1; n <= 8; n++) {
43610         for (uint32_t m = 1; m <= 4; m++) {
43611           GemmMicrokernelTester()
43612             .mr(4)
43613             .nr(8)
43614             .kr(1)
43615             .sr(1)
43616             .m(m)
43617             .n(n)
43618             .k(k)
43619             .iterations(1)
43620             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43621         }
43622       }
43623     }
43624   }
43625 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_gt_8)43626   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_gt_8) {
43627     TEST_REQUIRES_ARM_NEON;
43628     for (size_t k = 9; k < 16; k++) {
43629       GemmMicrokernelTester()
43630         .mr(4)
43631         .nr(8)
43632         .kr(1)
43633         .sr(1)
43634         .m(4)
43635         .n(8)
43636         .k(k)
43637         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43638     }
43639   }
43640 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_gt_8_strided_a)43641   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_gt_8_strided_a) {
43642     TEST_REQUIRES_ARM_NEON;
43643     for (size_t k = 9; k < 16; k++) {
43644       GemmMicrokernelTester()
43645         .mr(4)
43646         .nr(8)
43647         .kr(1)
43648         .sr(1)
43649         .m(4)
43650         .n(8)
43651         .k(k)
43652         .a_stride(19)
43653         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43654     }
43655   }
43656 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_gt_8_subtile)43657   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_gt_8_subtile) {
43658     TEST_REQUIRES_ARM_NEON;
43659     for (size_t k = 9; k < 16; k++) {
43660       for (uint32_t n = 1; n <= 8; n++) {
43661         for (uint32_t m = 1; m <= 4; m++) {
43662           GemmMicrokernelTester()
43663             .mr(4)
43664             .nr(8)
43665             .kr(1)
43666             .sr(1)
43667             .m(m)
43668             .n(n)
43669             .k(k)
43670             .iterations(1)
43671             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43672         }
43673       }
43674     }
43675   }
43676 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_div_4)43677   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_div_4) {
43678     TEST_REQUIRES_ARM_NEON;
43679     for (size_t k = 12; k <= 40; k += 4) {
43680       GemmMicrokernelTester()
43681         .mr(4)
43682         .nr(8)
43683         .kr(1)
43684         .sr(1)
43685         .m(4)
43686         .n(8)
43687         .k(k)
43688         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43689     }
43690   }
43691 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_div_4_strided_a)43692   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_div_4_strided_a) {
43693     TEST_REQUIRES_ARM_NEON;
43694     for (size_t k = 12; k <= 40; k += 4) {
43695       GemmMicrokernelTester()
43696         .mr(4)
43697         .nr(8)
43698         .kr(1)
43699         .sr(1)
43700         .m(4)
43701         .n(8)
43702         .k(k)
43703         .a_stride(43)
43704         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43705     }
43706   }
43707 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,k_div_4_subtile)43708   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, k_div_4_subtile) {
43709     TEST_REQUIRES_ARM_NEON;
43710     for (size_t k = 12; k <= 40; k += 4) {
43711       for (uint32_t n = 1; n <= 8; n++) {
43712         for (uint32_t m = 1; m <= 4; m++) {
43713           GemmMicrokernelTester()
43714             .mr(4)
43715             .nr(8)
43716             .kr(1)
43717             .sr(1)
43718             .m(m)
43719             .n(n)
43720             .k(k)
43721             .iterations(1)
43722             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43723         }
43724       }
43725     }
43726   }
43727 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,n_gt_8)43728   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, n_gt_8) {
43729     TEST_REQUIRES_ARM_NEON;
43730     for (uint32_t n = 9; n < 16; n++) {
43731       for (size_t k = 1; k <= 20; k += 5) {
43732         GemmMicrokernelTester()
43733           .mr(4)
43734           .nr(8)
43735           .kr(1)
43736           .sr(1)
43737           .m(4)
43738           .n(n)
43739           .k(k)
43740           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43741       }
43742     }
43743   }
43744 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,n_gt_8_strided_cn)43745   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, n_gt_8_strided_cn) {
43746     TEST_REQUIRES_ARM_NEON;
43747     for (uint32_t n = 9; n < 16; n++) {
43748       for (size_t k = 1; k <= 20; k += 5) {
43749         GemmMicrokernelTester()
43750           .mr(4)
43751           .nr(8)
43752           .kr(1)
43753           .sr(1)
43754           .m(4)
43755           .n(n)
43756           .k(k)
43757           .cn_stride(11)
43758           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43759       }
43760     }
43761   }
43762 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,n_gt_8_strided_a)43763   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, n_gt_8_strided_a) {
43764     TEST_REQUIRES_ARM_NEON;
43765     for (uint32_t n = 9; n < 16; n++) {
43766       for (size_t k = 1; k <= 20; k += 5) {
43767         GemmMicrokernelTester()
43768           .mr(4)
43769           .nr(8)
43770           .kr(1)
43771           .sr(1)
43772           .m(4)
43773           .n(n)
43774           .k(k)
43775           .a_stride(23)
43776           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43777       }
43778     }
43779   }
43780 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,n_gt_8_subtile)43781   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, n_gt_8_subtile) {
43782     TEST_REQUIRES_ARM_NEON;
43783     for (uint32_t n = 9; n < 16; n++) {
43784       for (size_t k = 1; k <= 20; k += 5) {
43785         for (uint32_t m = 1; m <= 4; m++) {
43786           GemmMicrokernelTester()
43787             .mr(4)
43788             .nr(8)
43789             .kr(1)
43790             .sr(1)
43791             .m(m)
43792             .n(n)
43793             .k(k)
43794             .iterations(1)
43795             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43796         }
43797       }
43798     }
43799   }
43800 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,n_div_8)43801   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, n_div_8) {
43802     TEST_REQUIRES_ARM_NEON;
43803     for (uint32_t n = 16; n <= 24; n += 8) {
43804       for (size_t k = 1; k <= 20; k += 5) {
43805         GemmMicrokernelTester()
43806           .mr(4)
43807           .nr(8)
43808           .kr(1)
43809           .sr(1)
43810           .m(4)
43811           .n(n)
43812           .k(k)
43813           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43814       }
43815     }
43816   }
43817 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,n_div_8_strided_cn)43818   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, n_div_8_strided_cn) {
43819     TEST_REQUIRES_ARM_NEON;
43820     for (uint32_t n = 16; n <= 24; n += 8) {
43821       for (size_t k = 1; k <= 20; k += 5) {
43822         GemmMicrokernelTester()
43823           .mr(4)
43824           .nr(8)
43825           .kr(1)
43826           .sr(1)
43827           .m(4)
43828           .n(n)
43829           .k(k)
43830           .cn_stride(11)
43831           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43832       }
43833     }
43834   }
43835 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,n_div_8_strided_a)43836   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, n_div_8_strided_a) {
43837     TEST_REQUIRES_ARM_NEON;
43838     for (uint32_t n = 16; n <= 24; n += 8) {
43839       for (size_t k = 1; k <= 20; k += 5) {
43840         GemmMicrokernelTester()
43841           .mr(4)
43842           .nr(8)
43843           .kr(1)
43844           .sr(1)
43845           .m(4)
43846           .n(n)
43847           .k(k)
43848           .a_stride(23)
43849           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43850       }
43851     }
43852   }
43853 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,n_div_8_subtile)43854   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, n_div_8_subtile) {
43855     TEST_REQUIRES_ARM_NEON;
43856     for (uint32_t n = 16; n <= 24; n += 8) {
43857       for (size_t k = 1; k <= 20; k += 5) {
43858         for (uint32_t m = 1; m <= 4; m++) {
43859           GemmMicrokernelTester()
43860             .mr(4)
43861             .nr(8)
43862             .kr(1)
43863             .sr(1)
43864             .m(m)
43865             .n(n)
43866             .k(k)
43867             .iterations(1)
43868             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43869         }
43870       }
43871     }
43872   }
43873 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,strided_cm_subtile)43874   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, strided_cm_subtile) {
43875     TEST_REQUIRES_ARM_NEON;
43876     for (size_t k = 1; k <= 20; k += 5) {
43877       for (uint32_t n = 1; n <= 8; n++) {
43878         for (uint32_t m = 1; m <= 4; m++) {
43879           GemmMicrokernelTester()
43880             .mr(4)
43881             .nr(8)
43882             .kr(1)
43883             .sr(1)
43884             .m(m)
43885             .n(n)
43886             .k(k)
43887             .cm_stride(11)
43888             .iterations(1)
43889             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43890         }
43891       }
43892     }
43893   }
43894 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,qmin)43895   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, qmin) {
43896     TEST_REQUIRES_ARM_NEON;
43897     GemmMicrokernelTester()
43898       .mr(4)
43899       .nr(8)
43900       .kr(1)
43901       .sr(1)
43902       .m(4)
43903       .n(8)
43904       .k(4)
43905       .qmin(128)
43906       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43907   }
43908 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,qmax)43909   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, qmax) {
43910     TEST_REQUIRES_ARM_NEON;
43911     GemmMicrokernelTester()
43912       .mr(4)
43913       .nr(8)
43914       .kr(1)
43915       .sr(1)
43916       .m(4)
43917       .n(8)
43918       .k(4)
43919       .qmax(128)
43920       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43921   }
43922 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53,strided_cm)43923   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_CORTEX_A53, strided_cm) {
43924     TEST_REQUIRES_ARM_NEON;
43925     GemmMicrokernelTester()
43926       .mr(4)
43927       .nr(8)
43928       .kr(1)
43929       .sr(1)
43930       .m(4)
43931       .n(8)
43932       .k(4)
43933       .cm_stride(11)
43934       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_cortex_a53, xnn_init_f32_minmax_scalar_params);
43935   }
43936 #endif  // XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY && XNN_PLATFORM_JIT
43937 
43938 
43939 #if XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY && XNN_PLATFORM_JIT
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_eq_2)43940   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_eq_2) {
43941     TEST_REQUIRES_ARM_NEON;
43942     GemmMicrokernelTester()
43943       .mr(4)
43944       .nr(8)
43945       .kr(1)
43946       .sr(1)
43947       .m(4)
43948       .n(8)
43949       .k(2)
43950       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
43951   }
43952 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,strided_cn)43953   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, strided_cn) {
43954     TEST_REQUIRES_ARM_NEON;
43955     GemmMicrokernelTester()
43956       .mr(4)
43957       .nr(8)
43958       .kr(1)
43959       .sr(1)
43960       .m(4)
43961       .n(8)
43962       .k(2)
43963       .cn_stride(11)
43964       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
43965   }
43966 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_eq_2_strided_a)43967   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_eq_2_strided_a) {
43968     TEST_REQUIRES_ARM_NEON;
43969     GemmMicrokernelTester()
43970       .mr(4)
43971       .nr(8)
43972       .kr(1)
43973       .sr(1)
43974       .m(4)
43975       .n(8)
43976       .k(2)
43977       .a_stride(5)
43978       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
43979   }
43980 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_eq_2_subtile)43981   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_eq_2_subtile) {
43982     TEST_REQUIRES_ARM_NEON;
43983     for (uint32_t n = 1; n <= 8; n++) {
43984       for (uint32_t m = 1; m <= 4; m++) {
43985         GemmMicrokernelTester()
43986           .mr(4)
43987           .nr(8)
43988           .kr(1)
43989           .sr(1)
43990           .m(m)
43991           .n(n)
43992           .k(2)
43993           .iterations(1)
43994           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
43995       }
43996     }
43997   }
43998 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_eq_2_subtile_m)43999   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_eq_2_subtile_m) {
44000     TEST_REQUIRES_ARM_NEON;
44001     for (uint32_t m = 1; m <= 4; m++) {
44002       GemmMicrokernelTester()
44003         .mr(4)
44004         .nr(8)
44005         .kr(1)
44006         .sr(1)
44007         .m(m)
44008         .n(8)
44009         .k(2)
44010         .iterations(1)
44011         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44012     }
44013   }
44014 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_eq_2_subtile_n)44015   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_eq_2_subtile_n) {
44016     TEST_REQUIRES_ARM_NEON;
44017     for (uint32_t n = 1; n <= 8; n++) {
44018       GemmMicrokernelTester()
44019         .mr(4)
44020         .nr(8)
44021         .kr(1)
44022         .sr(1)
44023         .m(4)
44024         .n(n)
44025         .k(2)
44026         .iterations(1)
44027         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44028     }
44029   }
44030 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_lt_2)44031   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_lt_2) {
44032     TEST_REQUIRES_ARM_NEON;
44033     for (size_t k = 1; k < 2; k++) {
44034       GemmMicrokernelTester()
44035         .mr(4)
44036         .nr(8)
44037         .kr(1)
44038         .sr(1)
44039         .m(4)
44040         .n(8)
44041         .k(k)
44042         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44043     }
44044   }
44045 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_lt_2_strided_a)44046   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_lt_2_strided_a) {
44047     TEST_REQUIRES_ARM_NEON;
44048     for (size_t k = 1; k < 2; k++) {
44049       GemmMicrokernelTester()
44050         .mr(4)
44051         .nr(8)
44052         .kr(1)
44053         .sr(1)
44054         .m(4)
44055         .n(8)
44056         .k(k)
44057         .a_stride(5)
44058         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44059     }
44060   }
44061 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_lt_2_subtile)44062   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_lt_2_subtile) {
44063     TEST_REQUIRES_ARM_NEON;
44064     for (size_t k = 1; k < 2; k++) {
44065       for (uint32_t n = 1; n <= 8; n++) {
44066         for (uint32_t m = 1; m <= 4; m++) {
44067           GemmMicrokernelTester()
44068             .mr(4)
44069             .nr(8)
44070             .kr(1)
44071             .sr(1)
44072             .m(m)
44073             .n(n)
44074             .k(k)
44075             .iterations(1)
44076             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44077         }
44078       }
44079     }
44080   }
44081 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_gt_2)44082   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_gt_2) {
44083     TEST_REQUIRES_ARM_NEON;
44084     for (size_t k = 3; k < 4; k++) {
44085       GemmMicrokernelTester()
44086         .mr(4)
44087         .nr(8)
44088         .kr(1)
44089         .sr(1)
44090         .m(4)
44091         .n(8)
44092         .k(k)
44093         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44094     }
44095   }
44096 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_gt_2_strided_a)44097   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_gt_2_strided_a) {
44098     TEST_REQUIRES_ARM_NEON;
44099     for (size_t k = 3; k < 4; k++) {
44100       GemmMicrokernelTester()
44101         .mr(4)
44102         .nr(8)
44103         .kr(1)
44104         .sr(1)
44105         .m(4)
44106         .n(8)
44107         .k(k)
44108         .a_stride(7)
44109         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44110     }
44111   }
44112 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_gt_2_subtile)44113   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_gt_2_subtile) {
44114     TEST_REQUIRES_ARM_NEON;
44115     for (size_t k = 3; k < 4; k++) {
44116       for (uint32_t n = 1; n <= 8; n++) {
44117         for (uint32_t m = 1; m <= 4; m++) {
44118           GemmMicrokernelTester()
44119             .mr(4)
44120             .nr(8)
44121             .kr(1)
44122             .sr(1)
44123             .m(m)
44124             .n(n)
44125             .k(k)
44126             .iterations(1)
44127             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44128         }
44129       }
44130     }
44131   }
44132 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_div_2)44133   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_div_2) {
44134     TEST_REQUIRES_ARM_NEON;
44135     for (size_t k = 4; k <= 20; k += 2) {
44136       GemmMicrokernelTester()
44137         .mr(4)
44138         .nr(8)
44139         .kr(1)
44140         .sr(1)
44141         .m(4)
44142         .n(8)
44143         .k(k)
44144         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44145     }
44146   }
44147 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_div_2_strided_a)44148   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_div_2_strided_a) {
44149     TEST_REQUIRES_ARM_NEON;
44150     for (size_t k = 4; k <= 20; k += 2) {
44151       GemmMicrokernelTester()
44152         .mr(4)
44153         .nr(8)
44154         .kr(1)
44155         .sr(1)
44156         .m(4)
44157         .n(8)
44158         .k(k)
44159         .a_stride(23)
44160         .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44161     }
44162   }
44163 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,k_div_2_subtile)44164   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, k_div_2_subtile) {
44165     TEST_REQUIRES_ARM_NEON;
44166     for (size_t k = 4; k <= 20; k += 2) {
44167       for (uint32_t n = 1; n <= 8; n++) {
44168         for (uint32_t m = 1; m <= 4; m++) {
44169           GemmMicrokernelTester()
44170             .mr(4)
44171             .nr(8)
44172             .kr(1)
44173             .sr(1)
44174             .m(m)
44175             .n(n)
44176             .k(k)
44177             .iterations(1)
44178             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44179         }
44180       }
44181     }
44182   }
44183 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,n_gt_8)44184   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, n_gt_8) {
44185     TEST_REQUIRES_ARM_NEON;
44186     for (uint32_t n = 9; n < 16; n++) {
44187       for (size_t k = 1; k <= 10; k += 3) {
44188         GemmMicrokernelTester()
44189           .mr(4)
44190           .nr(8)
44191           .kr(1)
44192           .sr(1)
44193           .m(4)
44194           .n(n)
44195           .k(k)
44196           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44197       }
44198     }
44199   }
44200 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,n_gt_8_strided_cn)44201   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, n_gt_8_strided_cn) {
44202     TEST_REQUIRES_ARM_NEON;
44203     for (uint32_t n = 9; n < 16; n++) {
44204       for (size_t k = 1; k <= 10; k += 3) {
44205         GemmMicrokernelTester()
44206           .mr(4)
44207           .nr(8)
44208           .kr(1)
44209           .sr(1)
44210           .m(4)
44211           .n(n)
44212           .k(k)
44213           .cn_stride(11)
44214           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44215       }
44216     }
44217   }
44218 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,n_gt_8_strided_a)44219   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, n_gt_8_strided_a) {
44220     TEST_REQUIRES_ARM_NEON;
44221     for (uint32_t n = 9; n < 16; n++) {
44222       for (size_t k = 1; k <= 10; k += 3) {
44223         GemmMicrokernelTester()
44224           .mr(4)
44225           .nr(8)
44226           .kr(1)
44227           .sr(1)
44228           .m(4)
44229           .n(n)
44230           .k(k)
44231           .a_stride(13)
44232           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44233       }
44234     }
44235   }
44236 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,n_gt_8_subtile)44237   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, n_gt_8_subtile) {
44238     TEST_REQUIRES_ARM_NEON;
44239     for (uint32_t n = 9; n < 16; n++) {
44240       for (size_t k = 1; k <= 10; k += 3) {
44241         for (uint32_t m = 1; m <= 4; m++) {
44242           GemmMicrokernelTester()
44243             .mr(4)
44244             .nr(8)
44245             .kr(1)
44246             .sr(1)
44247             .m(m)
44248             .n(n)
44249             .k(k)
44250             .iterations(1)
44251             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44252         }
44253       }
44254     }
44255   }
44256 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,n_div_8)44257   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, n_div_8) {
44258     TEST_REQUIRES_ARM_NEON;
44259     for (uint32_t n = 16; n <= 24; n += 8) {
44260       for (size_t k = 1; k <= 10; k += 3) {
44261         GemmMicrokernelTester()
44262           .mr(4)
44263           .nr(8)
44264           .kr(1)
44265           .sr(1)
44266           .m(4)
44267           .n(n)
44268           .k(k)
44269           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44270       }
44271     }
44272   }
44273 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,n_div_8_strided_cn)44274   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, n_div_8_strided_cn) {
44275     TEST_REQUIRES_ARM_NEON;
44276     for (uint32_t n = 16; n <= 24; n += 8) {
44277       for (size_t k = 1; k <= 10; k += 3) {
44278         GemmMicrokernelTester()
44279           .mr(4)
44280           .nr(8)
44281           .kr(1)
44282           .sr(1)
44283           .m(4)
44284           .n(n)
44285           .k(k)
44286           .cn_stride(11)
44287           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44288       }
44289     }
44290   }
44291 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,n_div_8_strided_a)44292   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, n_div_8_strided_a) {
44293     TEST_REQUIRES_ARM_NEON;
44294     for (uint32_t n = 16; n <= 24; n += 8) {
44295       for (size_t k = 1; k <= 10; k += 3) {
44296         GemmMicrokernelTester()
44297           .mr(4)
44298           .nr(8)
44299           .kr(1)
44300           .sr(1)
44301           .m(4)
44302           .n(n)
44303           .k(k)
44304           .a_stride(13)
44305           .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44306       }
44307     }
44308   }
44309 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,n_div_8_subtile)44310   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, n_div_8_subtile) {
44311     TEST_REQUIRES_ARM_NEON;
44312     for (uint32_t n = 16; n <= 24; n += 8) {
44313       for (size_t k = 1; k <= 10; k += 3) {
44314         for (uint32_t m = 1; m <= 4; m++) {
44315           GemmMicrokernelTester()
44316             .mr(4)
44317             .nr(8)
44318             .kr(1)
44319             .sr(1)
44320             .m(m)
44321             .n(n)
44322             .k(k)
44323             .iterations(1)
44324             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44325         }
44326       }
44327     }
44328   }
44329 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,strided_cm_subtile)44330   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, strided_cm_subtile) {
44331     TEST_REQUIRES_ARM_NEON;
44332     for (size_t k = 1; k <= 10; k += 3) {
44333       for (uint32_t n = 1; n <= 8; n++) {
44334         for (uint32_t m = 1; m <= 4; m++) {
44335           GemmMicrokernelTester()
44336             .mr(4)
44337             .nr(8)
44338             .kr(1)
44339             .sr(1)
44340             .m(m)
44341             .n(n)
44342             .k(k)
44343             .cm_stride(11)
44344             .iterations(1)
44345             .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44346         }
44347       }
44348     }
44349   }
44350 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,qmin)44351   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, qmin) {
44352     TEST_REQUIRES_ARM_NEON;
44353     GemmMicrokernelTester()
44354       .mr(4)
44355       .nr(8)
44356       .kr(1)
44357       .sr(1)
44358       .m(4)
44359       .n(8)
44360       .k(2)
44361       .qmin(128)
44362       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44363   }
44364 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,qmax)44365   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, qmax) {
44366     TEST_REQUIRES_ARM_NEON;
44367     GemmMicrokernelTester()
44368       .mr(4)
44369       .nr(8)
44370       .kr(1)
44371       .sr(1)
44372       .m(4)
44373       .n(8)
44374       .k(2)
44375       .qmax(128)
44376       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44377   }
44378 
TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64,strided_cm)44379   TEST(GENERATE_F32_GEMM_4X8__AARCH32_NEON_LD64, strided_cm) {
44380     TEST_REQUIRES_ARM_NEON;
44381     GemmMicrokernelTester()
44382       .mr(4)
44383       .nr(8)
44384       .kr(1)
44385       .sr(1)
44386       .m(4)
44387       .n(8)
44388       .k(2)
44389       .cm_stride(11)
44390       .Test(xnn_generate_f32_gemm_ukernel_4x8__aarch32_neon_ld64, xnn_init_f32_minmax_scalar_params);
44391   }
44392 #endif  // XNN_ARCH_ARM && XNN_ENABLE_ASSEMBLY && XNN_PLATFORM_JIT
44393 
44394 
44395 #if XNN_ARCH_ARM64 && XNN_PLATFORM_JIT
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8)44396   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8) {
44397     TEST_REQUIRES_ARM_NEON_FMA;
44398     GemmMicrokernelTester()
44399       .mr(6)
44400       .nr(8)
44401       .kr(1)
44402       .sr(1)
44403       .m(6)
44404       .n(8)
44405       .k(8)
44406       .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44407   }
44408 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,strided_cn)44409   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, strided_cn) {
44410     TEST_REQUIRES_ARM_NEON_FMA;
44411     GemmMicrokernelTester()
44412       .mr(6)
44413       .nr(8)
44414       .kr(1)
44415       .sr(1)
44416       .m(6)
44417       .n(8)
44418       .k(8)
44419       .cn_stride(11)
44420       .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44421   }
44422 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_strided_a)44423   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_strided_a) {
44424     TEST_REQUIRES_ARM_NEON_FMA;
44425     GemmMicrokernelTester()
44426       .mr(6)
44427       .nr(8)
44428       .kr(1)
44429       .sr(1)
44430       .m(6)
44431       .n(8)
44432       .k(8)
44433       .a_stride(11)
44434       .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44435   }
44436 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile)44437   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile) {
44438     TEST_REQUIRES_ARM_NEON_FMA;
44439     for (uint32_t n = 1; n <= 8; n++) {
44440       for (uint32_t m = 1; m <= 6; m++) {
44441         GemmMicrokernelTester()
44442           .mr(6)
44443           .nr(8)
44444           .kr(1)
44445           .sr(1)
44446           .m(m)
44447           .n(n)
44448           .k(8)
44449           .iterations(1)
44450           .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44451       }
44452     }
44453   }
44454 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile_m)44455   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile_m) {
44456     TEST_REQUIRES_ARM_NEON_FMA;
44457     for (uint32_t m = 1; m <= 6; m++) {
44458       GemmMicrokernelTester()
44459         .mr(6)
44460         .nr(8)
44461         .kr(1)
44462         .sr(1)
44463         .m(m)
44464         .n(8)
44465         .k(8)
44466         .iterations(1)
44467         .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44468     }
44469   }
44470 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile_n)44471   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile_n) {
44472     TEST_REQUIRES_ARM_NEON_FMA;
44473     for (uint32_t n = 1; n <= 8; n++) {
44474       GemmMicrokernelTester()
44475         .mr(6)
44476         .nr(8)
44477         .kr(1)
44478         .sr(1)
44479         .m(6)
44480         .n(n)
44481         .k(8)
44482         .iterations(1)
44483         .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44484     }
44485   }
44486 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16)44487   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16) {
44488     TEST_REQUIRES_ARM_NEON_FMA;
44489     GemmMicrokernelTester()
44490       .mr(6)
44491       .nr(8)
44492       .kr(1)
44493       .sr(1)
44494       .m(6)
44495       .n(8)
44496       .k(16)
44497       .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44498   }
44499 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16_strided_a)44500   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16_strided_a) {
44501     TEST_REQUIRES_ARM_NEON_FMA;
44502     GemmMicrokernelTester()
44503       .mr(6)
44504       .nr(8)
44505       .kr(1)
44506       .sr(1)
44507       .m(6)
44508       .n(8)
44509       .k(16)
44510       .a_stride(19)
44511       .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44512   }
44513 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16_subtile)44514   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16_subtile) {
44515     TEST_REQUIRES_ARM_NEON_FMA;
44516     for (uint32_t n = 1; n <= 8; n++) {
44517       for (uint32_t m = 1; m <= 6; m++) {
44518         GemmMicrokernelTester()
44519           .mr(6)
44520           .nr(8)
44521           .kr(1)
44522           .sr(1)
44523           .m(m)
44524           .n(n)
44525           .k(16)
44526           .iterations(1)
44527           .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44528       }
44529     }
44530   }
44531 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16)44532   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16) {
44533     TEST_REQUIRES_ARM_NEON_FMA;
44534     for (size_t k = 1; k < 16; k++) {
44535       GemmMicrokernelTester()
44536         .mr(6)
44537         .nr(8)
44538         .kr(1)
44539         .sr(1)
44540         .m(6)
44541         .n(8)
44542         .k(k)
44543         .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44544     }
44545   }
44546 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16_strided_a)44547   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16_strided_a) {
44548     TEST_REQUIRES_ARM_NEON_FMA;
44549     for (size_t k = 1; k < 16; k++) {
44550       GemmMicrokernelTester()
44551         .mr(6)
44552         .nr(8)
44553         .kr(1)
44554         .sr(1)
44555         .m(6)
44556         .n(8)
44557         .k(k)
44558         .a_stride(19)
44559         .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44560     }
44561   }
44562 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16_subtile)44563   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16_subtile) {
44564     TEST_REQUIRES_ARM_NEON_FMA;
44565     for (size_t k = 1; k < 16; k++) {
44566       for (uint32_t n = 1; n <= 8; n++) {
44567         for (uint32_t m = 1; m <= 6; m++) {
44568           GemmMicrokernelTester()
44569             .mr(6)
44570             .nr(8)
44571             .kr(1)
44572             .sr(1)
44573             .m(m)
44574             .n(n)
44575             .k(k)
44576             .iterations(1)
44577             .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44578         }
44579       }
44580     }
44581   }
44582 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16)44583   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16) {
44584     TEST_REQUIRES_ARM_NEON_FMA;
44585     for (size_t k = 17; k < 32; k++) {
44586       GemmMicrokernelTester()
44587         .mr(6)
44588         .nr(8)
44589         .kr(1)
44590         .sr(1)
44591         .m(6)
44592         .n(8)
44593         .k(k)
44594         .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44595     }
44596   }
44597 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16_strided_a)44598   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16_strided_a) {
44599     TEST_REQUIRES_ARM_NEON_FMA;
44600     for (size_t k = 17; k < 32; k++) {
44601       GemmMicrokernelTester()
44602         .mr(6)
44603         .nr(8)
44604         .kr(1)
44605         .sr(1)
44606         .m(6)
44607         .n(8)
44608         .k(k)
44609         .a_stride(37)
44610         .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44611     }
44612   }
44613 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16_subtile)44614   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16_subtile) {
44615     TEST_REQUIRES_ARM_NEON_FMA;
44616     for (size_t k = 17; k < 32; k++) {
44617       for (uint32_t n = 1; n <= 8; n++) {
44618         for (uint32_t m = 1; m <= 6; m++) {
44619           GemmMicrokernelTester()
44620             .mr(6)
44621             .nr(8)
44622             .kr(1)
44623             .sr(1)
44624             .m(m)
44625             .n(n)
44626             .k(k)
44627             .iterations(1)
44628             .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44629         }
44630       }
44631     }
44632   }
44633 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8)44634   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8) {
44635     TEST_REQUIRES_ARM_NEON_FMA;
44636     for (size_t k = 24; k <= 80; k += 8) {
44637       GemmMicrokernelTester()
44638         .mr(6)
44639         .nr(8)
44640         .kr(1)
44641         .sr(1)
44642         .m(6)
44643         .n(8)
44644         .k(k)
44645         .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44646     }
44647   }
44648 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8_strided_a)44649   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8_strided_a) {
44650     TEST_REQUIRES_ARM_NEON_FMA;
44651     for (size_t k = 24; k <= 80; k += 8) {
44652       GemmMicrokernelTester()
44653         .mr(6)
44654         .nr(8)
44655         .kr(1)
44656         .sr(1)
44657         .m(6)
44658         .n(8)
44659         .k(k)
44660         .a_stride(83)
44661         .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44662     }
44663   }
44664 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8_subtile)44665   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8_subtile) {
44666     TEST_REQUIRES_ARM_NEON_FMA;
44667     for (size_t k = 24; k <= 80; k += 8) {
44668       for (uint32_t n = 1; n <= 8; n++) {
44669         for (uint32_t m = 1; m <= 6; m++) {
44670           GemmMicrokernelTester()
44671             .mr(6)
44672             .nr(8)
44673             .kr(1)
44674             .sr(1)
44675             .m(m)
44676             .n(n)
44677             .k(k)
44678             .iterations(1)
44679             .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44680         }
44681       }
44682     }
44683   }
44684 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8)44685   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8) {
44686     TEST_REQUIRES_ARM_NEON_FMA;
44687     for (uint32_t n = 9; n < 16; n++) {
44688       for (size_t k = 1; k <= 40; k += 9) {
44689         GemmMicrokernelTester()
44690           .mr(6)
44691           .nr(8)
44692           .kr(1)
44693           .sr(1)
44694           .m(6)
44695           .n(n)
44696           .k(k)
44697           .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44698       }
44699     }
44700   }
44701 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_strided_cn)44702   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_strided_cn) {
44703     TEST_REQUIRES_ARM_NEON_FMA;
44704     for (uint32_t n = 9; n < 16; n++) {
44705       for (size_t k = 1; k <= 40; k += 9) {
44706         GemmMicrokernelTester()
44707           .mr(6)
44708           .nr(8)
44709           .kr(1)
44710           .sr(1)
44711           .m(6)
44712           .n(n)
44713           .k(k)
44714           .cn_stride(11)
44715           .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44716       }
44717     }
44718   }
44719 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_strided_a)44720   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_strided_a) {
44721     TEST_REQUIRES_ARM_NEON_FMA;
44722     for (uint32_t n = 9; n < 16; n++) {
44723       for (size_t k = 1; k <= 40; k += 9) {
44724         GemmMicrokernelTester()
44725           .mr(6)
44726           .nr(8)
44727           .kr(1)
44728           .sr(1)
44729           .m(6)
44730           .n(n)
44731           .k(k)
44732           .a_stride(43)
44733           .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44734       }
44735     }
44736   }
44737 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_subtile)44738   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_subtile) {
44739     TEST_REQUIRES_ARM_NEON_FMA;
44740     for (uint32_t n = 9; n < 16; n++) {
44741       for (size_t k = 1; k <= 40; k += 9) {
44742         for (uint32_t m = 1; m <= 6; m++) {
44743           GemmMicrokernelTester()
44744             .mr(6)
44745             .nr(8)
44746             .kr(1)
44747             .sr(1)
44748             .m(m)
44749             .n(n)
44750             .k(k)
44751             .iterations(1)
44752             .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44753         }
44754       }
44755     }
44756   }
44757 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8)44758   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8) {
44759     TEST_REQUIRES_ARM_NEON_FMA;
44760     for (uint32_t n = 16; n <= 24; n += 8) {
44761       for (size_t k = 1; k <= 40; k += 9) {
44762         GemmMicrokernelTester()
44763           .mr(6)
44764           .nr(8)
44765           .kr(1)
44766           .sr(1)
44767           .m(6)
44768           .n(n)
44769           .k(k)
44770           .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44771       }
44772     }
44773   }
44774 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_strided_cn)44775   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_strided_cn) {
44776     TEST_REQUIRES_ARM_NEON_FMA;
44777     for (uint32_t n = 16; n <= 24; n += 8) {
44778       for (size_t k = 1; k <= 40; k += 9) {
44779         GemmMicrokernelTester()
44780           .mr(6)
44781           .nr(8)
44782           .kr(1)
44783           .sr(1)
44784           .m(6)
44785           .n(n)
44786           .k(k)
44787           .cn_stride(11)
44788           .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44789       }
44790     }
44791   }
44792 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_strided_a)44793   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_strided_a) {
44794     TEST_REQUIRES_ARM_NEON_FMA;
44795     for (uint32_t n = 16; n <= 24; n += 8) {
44796       for (size_t k = 1; k <= 40; k += 9) {
44797         GemmMicrokernelTester()
44798           .mr(6)
44799           .nr(8)
44800           .kr(1)
44801           .sr(1)
44802           .m(6)
44803           .n(n)
44804           .k(k)
44805           .a_stride(43)
44806           .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44807       }
44808     }
44809   }
44810 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_subtile)44811   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_subtile) {
44812     TEST_REQUIRES_ARM_NEON_FMA;
44813     for (uint32_t n = 16; n <= 24; n += 8) {
44814       for (size_t k = 1; k <= 40; k += 9) {
44815         for (uint32_t m = 1; m <= 6; m++) {
44816           GemmMicrokernelTester()
44817             .mr(6)
44818             .nr(8)
44819             .kr(1)
44820             .sr(1)
44821             .m(m)
44822             .n(n)
44823             .k(k)
44824             .iterations(1)
44825             .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44826         }
44827       }
44828     }
44829   }
44830 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,strided_cm_subtile)44831   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, strided_cm_subtile) {
44832     TEST_REQUIRES_ARM_NEON_FMA;
44833     for (size_t k = 1; k <= 40; k += 9) {
44834       for (uint32_t n = 1; n <= 8; n++) {
44835         for (uint32_t m = 1; m <= 6; m++) {
44836           GemmMicrokernelTester()
44837             .mr(6)
44838             .nr(8)
44839             .kr(1)
44840             .sr(1)
44841             .m(m)
44842             .n(n)
44843             .k(k)
44844             .cm_stride(11)
44845             .iterations(1)
44846             .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44847         }
44848       }
44849     }
44850   }
44851 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,qmin)44852   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, qmin) {
44853     TEST_REQUIRES_ARM_NEON_FMA;
44854     GemmMicrokernelTester()
44855       .mr(6)
44856       .nr(8)
44857       .kr(1)
44858       .sr(1)
44859       .m(6)
44860       .n(8)
44861       .k(8)
44862       .qmin(128)
44863       .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44864   }
44865 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,qmax)44866   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, qmax) {
44867     TEST_REQUIRES_ARM_NEON_FMA;
44868     GemmMicrokernelTester()
44869       .mr(6)
44870       .nr(8)
44871       .kr(1)
44872       .sr(1)
44873       .m(6)
44874       .n(8)
44875       .k(8)
44876       .qmax(128)
44877       .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44878   }
44879 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,strided_cm)44880   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, strided_cm) {
44881     TEST_REQUIRES_ARM_NEON_FMA;
44882     GemmMicrokernelTester()
44883       .mr(6)
44884       .nr(8)
44885       .kr(1)
44886       .sr(1)
44887       .m(6)
44888       .n(8)
44889       .k(8)
44890       .cm_stride(11)
44891       .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44892   }
44893 
TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile_m_upto_mr)44894   TEST(GENERATE_F32_GEMM_UPTO6X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile_m_upto_mr) {
44895     TEST_REQUIRES_ARM_NEON_FMA;
44896     for (uint32_t max_mr = 1; max_mr <= 6; max_mr++) {
44897       for (uint32_t m = 1; m <= max_mr; m++) {
44898         GemmMicrokernelTester()
44899           .mr(max_mr)
44900           .nr(8)
44901           .kr(1)
44902           .sr(1)
44903           .m(m)
44904           .n(8)
44905           .k(8)
44906           .iterations(1)
44907           .Test(xnn_generate_f32_gemm_ukernel_upto6x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44908       }
44909     }
44910   }
44911 #endif  // XNN_ARCH_ARM64 && XNN_PLATFORM_JIT
44912 
44913 
44914 #if XNN_ARCH_ARM64 && XNN_PLATFORM_JIT
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8)44915   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8) {
44916     TEST_REQUIRES_ARM_NEON_FMA;
44917     GemmMicrokernelTester()
44918       .mr(1)
44919       .nr(8)
44920       .kr(1)
44921       .sr(1)
44922       .m(1)
44923       .n(8)
44924       .k(8)
44925       .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44926   }
44927 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,strided_cn)44928   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, strided_cn) {
44929     TEST_REQUIRES_ARM_NEON_FMA;
44930     GemmMicrokernelTester()
44931       .mr(1)
44932       .nr(8)
44933       .kr(1)
44934       .sr(1)
44935       .m(1)
44936       .n(8)
44937       .k(8)
44938       .cn_stride(11)
44939       .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44940   }
44941 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_strided_a)44942   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_strided_a) {
44943     TEST_REQUIRES_ARM_NEON_FMA;
44944     GemmMicrokernelTester()
44945       .mr(1)
44946       .nr(8)
44947       .kr(1)
44948       .sr(1)
44949       .m(1)
44950       .n(8)
44951       .k(8)
44952       .a_stride(11)
44953       .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44954   }
44955 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile)44956   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile) {
44957     TEST_REQUIRES_ARM_NEON_FMA;
44958     for (uint32_t n = 1; n <= 8; n++) {
44959       for (uint32_t m = 1; m <= 1; m++) {
44960         GemmMicrokernelTester()
44961           .mr(1)
44962           .nr(8)
44963           .kr(1)
44964           .sr(1)
44965           .m(m)
44966           .n(n)
44967           .k(8)
44968           .iterations(1)
44969           .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44970       }
44971     }
44972   }
44973 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile_m)44974   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile_m) {
44975     TEST_REQUIRES_ARM_NEON_FMA;
44976     for (uint32_t m = 1; m <= 1; m++) {
44977       GemmMicrokernelTester()
44978         .mr(1)
44979         .nr(8)
44980         .kr(1)
44981         .sr(1)
44982         .m(m)
44983         .n(8)
44984         .k(8)
44985         .iterations(1)
44986         .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
44987     }
44988   }
44989 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_8_subtile_n)44990   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_8_subtile_n) {
44991     TEST_REQUIRES_ARM_NEON_FMA;
44992     for (uint32_t n = 1; n <= 8; n++) {
44993       GemmMicrokernelTester()
44994         .mr(1)
44995         .nr(8)
44996         .kr(1)
44997         .sr(1)
44998         .m(1)
44999         .n(n)
45000         .k(8)
45001         .iterations(1)
45002         .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45003     }
45004   }
45005 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16)45006   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16) {
45007     TEST_REQUIRES_ARM_NEON_FMA;
45008     GemmMicrokernelTester()
45009       .mr(1)
45010       .nr(8)
45011       .kr(1)
45012       .sr(1)
45013       .m(1)
45014       .n(8)
45015       .k(16)
45016       .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45017   }
45018 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16_strided_a)45019   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16_strided_a) {
45020     TEST_REQUIRES_ARM_NEON_FMA;
45021     GemmMicrokernelTester()
45022       .mr(1)
45023       .nr(8)
45024       .kr(1)
45025       .sr(1)
45026       .m(1)
45027       .n(8)
45028       .k(16)
45029       .a_stride(19)
45030       .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45031   }
45032 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_eq_16_subtile)45033   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_eq_16_subtile) {
45034     TEST_REQUIRES_ARM_NEON_FMA;
45035     for (uint32_t n = 1; n <= 8; n++) {
45036       for (uint32_t m = 1; m <= 1; m++) {
45037         GemmMicrokernelTester()
45038           .mr(1)
45039           .nr(8)
45040           .kr(1)
45041           .sr(1)
45042           .m(m)
45043           .n(n)
45044           .k(16)
45045           .iterations(1)
45046           .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45047       }
45048     }
45049   }
45050 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16)45051   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16) {
45052     TEST_REQUIRES_ARM_NEON_FMA;
45053     for (size_t k = 1; k < 16; k++) {
45054       GemmMicrokernelTester()
45055         .mr(1)
45056         .nr(8)
45057         .kr(1)
45058         .sr(1)
45059         .m(1)
45060         .n(8)
45061         .k(k)
45062         .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45063     }
45064   }
45065 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16_strided_a)45066   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16_strided_a) {
45067     TEST_REQUIRES_ARM_NEON_FMA;
45068     for (size_t k = 1; k < 16; k++) {
45069       GemmMicrokernelTester()
45070         .mr(1)
45071         .nr(8)
45072         .kr(1)
45073         .sr(1)
45074         .m(1)
45075         .n(8)
45076         .k(k)
45077         .a_stride(19)
45078         .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45079     }
45080   }
45081 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_lt_16_subtile)45082   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_lt_16_subtile) {
45083     TEST_REQUIRES_ARM_NEON_FMA;
45084     for (size_t k = 1; k < 16; k++) {
45085       for (uint32_t n = 1; n <= 8; n++) {
45086         for (uint32_t m = 1; m <= 1; m++) {
45087           GemmMicrokernelTester()
45088             .mr(1)
45089             .nr(8)
45090             .kr(1)
45091             .sr(1)
45092             .m(m)
45093             .n(n)
45094             .k(k)
45095             .iterations(1)
45096             .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45097         }
45098       }
45099     }
45100   }
45101 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16)45102   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16) {
45103     TEST_REQUIRES_ARM_NEON_FMA;
45104     for (size_t k = 17; k < 32; k++) {
45105       GemmMicrokernelTester()
45106         .mr(1)
45107         .nr(8)
45108         .kr(1)
45109         .sr(1)
45110         .m(1)
45111         .n(8)
45112         .k(k)
45113         .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45114     }
45115   }
45116 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16_strided_a)45117   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16_strided_a) {
45118     TEST_REQUIRES_ARM_NEON_FMA;
45119     for (size_t k = 17; k < 32; k++) {
45120       GemmMicrokernelTester()
45121         .mr(1)
45122         .nr(8)
45123         .kr(1)
45124         .sr(1)
45125         .m(1)
45126         .n(8)
45127         .k(k)
45128         .a_stride(37)
45129         .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45130     }
45131   }
45132 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_gt_16_subtile)45133   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_gt_16_subtile) {
45134     TEST_REQUIRES_ARM_NEON_FMA;
45135     for (size_t k = 17; k < 32; k++) {
45136       for (uint32_t n = 1; n <= 8; n++) {
45137         for (uint32_t m = 1; m <= 1; m++) {
45138           GemmMicrokernelTester()
45139             .mr(1)
45140             .nr(8)
45141             .kr(1)
45142             .sr(1)
45143             .m(m)
45144             .n(n)
45145             .k(k)
45146             .iterations(1)
45147             .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45148         }
45149       }
45150     }
45151   }
45152 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8)45153   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8) {
45154     TEST_REQUIRES_ARM_NEON_FMA;
45155     for (size_t k = 24; k <= 80; k += 8) {
45156       GemmMicrokernelTester()
45157         .mr(1)
45158         .nr(8)
45159         .kr(1)
45160         .sr(1)
45161         .m(1)
45162         .n(8)
45163         .k(k)
45164         .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45165     }
45166   }
45167 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8_strided_a)45168   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8_strided_a) {
45169     TEST_REQUIRES_ARM_NEON_FMA;
45170     for (size_t k = 24; k <= 80; k += 8) {
45171       GemmMicrokernelTester()
45172         .mr(1)
45173         .nr(8)
45174         .kr(1)
45175         .sr(1)
45176         .m(1)
45177         .n(8)
45178         .k(k)
45179         .a_stride(83)
45180         .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45181     }
45182   }
45183 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,k_div_8_subtile)45184   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, k_div_8_subtile) {
45185     TEST_REQUIRES_ARM_NEON_FMA;
45186     for (size_t k = 24; k <= 80; k += 8) {
45187       for (uint32_t n = 1; n <= 8; n++) {
45188         for (uint32_t m = 1; m <= 1; m++) {
45189           GemmMicrokernelTester()
45190             .mr(1)
45191             .nr(8)
45192             .kr(1)
45193             .sr(1)
45194             .m(m)
45195             .n(n)
45196             .k(k)
45197             .iterations(1)
45198             .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45199         }
45200       }
45201     }
45202   }
45203 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8)45204   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8) {
45205     TEST_REQUIRES_ARM_NEON_FMA;
45206     for (uint32_t n = 9; n < 16; n++) {
45207       for (size_t k = 1; k <= 40; k += 9) {
45208         GemmMicrokernelTester()
45209           .mr(1)
45210           .nr(8)
45211           .kr(1)
45212           .sr(1)
45213           .m(1)
45214           .n(n)
45215           .k(k)
45216           .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45217       }
45218     }
45219   }
45220 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_strided_cn)45221   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_strided_cn) {
45222     TEST_REQUIRES_ARM_NEON_FMA;
45223     for (uint32_t n = 9; n < 16; n++) {
45224       for (size_t k = 1; k <= 40; k += 9) {
45225         GemmMicrokernelTester()
45226           .mr(1)
45227           .nr(8)
45228           .kr(1)
45229           .sr(1)
45230           .m(1)
45231           .n(n)
45232           .k(k)
45233           .cn_stride(11)
45234           .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45235       }
45236     }
45237   }
45238 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_strided_a)45239   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_strided_a) {
45240     TEST_REQUIRES_ARM_NEON_FMA;
45241     for (uint32_t n = 9; n < 16; n++) {
45242       for (size_t k = 1; k <= 40; k += 9) {
45243         GemmMicrokernelTester()
45244           .mr(1)
45245           .nr(8)
45246           .kr(1)
45247           .sr(1)
45248           .m(1)
45249           .n(n)
45250           .k(k)
45251           .a_stride(43)
45252           .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45253       }
45254     }
45255   }
45256 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,n_gt_8_subtile)45257   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, n_gt_8_subtile) {
45258     TEST_REQUIRES_ARM_NEON_FMA;
45259     for (uint32_t n = 9; n < 16; n++) {
45260       for (size_t k = 1; k <= 40; k += 9) {
45261         for (uint32_t m = 1; m <= 1; m++) {
45262           GemmMicrokernelTester()
45263             .mr(1)
45264             .nr(8)
45265             .kr(1)
45266             .sr(1)
45267             .m(m)
45268             .n(n)
45269             .k(k)
45270             .iterations(1)
45271             .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45272         }
45273       }
45274     }
45275   }
45276 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8)45277   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8) {
45278     TEST_REQUIRES_ARM_NEON_FMA;
45279     for (uint32_t n = 16; n <= 24; n += 8) {
45280       for (size_t k = 1; k <= 40; k += 9) {
45281         GemmMicrokernelTester()
45282           .mr(1)
45283           .nr(8)
45284           .kr(1)
45285           .sr(1)
45286           .m(1)
45287           .n(n)
45288           .k(k)
45289           .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45290       }
45291     }
45292   }
45293 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_strided_cn)45294   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_strided_cn) {
45295     TEST_REQUIRES_ARM_NEON_FMA;
45296     for (uint32_t n = 16; n <= 24; n += 8) {
45297       for (size_t k = 1; k <= 40; k += 9) {
45298         GemmMicrokernelTester()
45299           .mr(1)
45300           .nr(8)
45301           .kr(1)
45302           .sr(1)
45303           .m(1)
45304           .n(n)
45305           .k(k)
45306           .cn_stride(11)
45307           .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45308       }
45309     }
45310   }
45311 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_strided_a)45312   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_strided_a) {
45313     TEST_REQUIRES_ARM_NEON_FMA;
45314     for (uint32_t n = 16; n <= 24; n += 8) {
45315       for (size_t k = 1; k <= 40; k += 9) {
45316         GemmMicrokernelTester()
45317           .mr(1)
45318           .nr(8)
45319           .kr(1)
45320           .sr(1)
45321           .m(1)
45322           .n(n)
45323           .k(k)
45324           .a_stride(43)
45325           .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45326       }
45327     }
45328   }
45329 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,n_div_8_subtile)45330   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, n_div_8_subtile) {
45331     TEST_REQUIRES_ARM_NEON_FMA;
45332     for (uint32_t n = 16; n <= 24; n += 8) {
45333       for (size_t k = 1; k <= 40; k += 9) {
45334         for (uint32_t m = 1; m <= 1; m++) {
45335           GemmMicrokernelTester()
45336             .mr(1)
45337             .nr(8)
45338             .kr(1)
45339             .sr(1)
45340             .m(m)
45341             .n(n)
45342             .k(k)
45343             .iterations(1)
45344             .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45345         }
45346       }
45347     }
45348   }
45349 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,strided_cm_subtile)45350   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, strided_cm_subtile) {
45351     TEST_REQUIRES_ARM_NEON_FMA;
45352     for (size_t k = 1; k <= 40; k += 9) {
45353       for (uint32_t n = 1; n <= 8; n++) {
45354         for (uint32_t m = 1; m <= 1; m++) {
45355           GemmMicrokernelTester()
45356             .mr(1)
45357             .nr(8)
45358             .kr(1)
45359             .sr(1)
45360             .m(m)
45361             .n(n)
45362             .k(k)
45363             .cm_stride(11)
45364             .iterations(1)
45365             .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45366         }
45367       }
45368     }
45369   }
45370 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,qmin)45371   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, qmin) {
45372     TEST_REQUIRES_ARM_NEON_FMA;
45373     GemmMicrokernelTester()
45374       .mr(1)
45375       .nr(8)
45376       .kr(1)
45377       .sr(1)
45378       .m(1)
45379       .n(8)
45380       .k(8)
45381       .qmin(128)
45382       .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45383   }
45384 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,qmax)45385   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, qmax) {
45386     TEST_REQUIRES_ARM_NEON_FMA;
45387     GemmMicrokernelTester()
45388       .mr(1)
45389       .nr(8)
45390       .kr(1)
45391       .sr(1)
45392       .m(1)
45393       .n(8)
45394       .k(8)
45395       .qmax(128)
45396       .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45397   }
45398 
TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75,strided_cm)45399   TEST(GENERATE_F32_GEMM_1X8__AARCH64_NEONFMA_CORTEX_A75, strided_cm) {
45400     TEST_REQUIRES_ARM_NEON_FMA;
45401     GemmMicrokernelTester()
45402       .mr(1)
45403       .nr(8)
45404       .kr(1)
45405       .sr(1)
45406       .m(1)
45407       .n(8)
45408       .k(8)
45409       .cm_stride(11)
45410       .Test(xnn_generate_f32_gemm_ukernel_1x8__aarch64_neonfma_cortex_a75, xnn_init_f32_minmax_scalar_params);
45411   }
45412 #endif  // XNN_ARCH_ARM64 && XNN_PLATFORM_JIT
45413